From ac23b8e624f1423f45806990da237ab0e4a82cea Mon Sep 17 00:00:00 2001 From: cymruu Date: Mon, 15 Sep 2014 19:43:05 +0200 Subject: [PATCH 01/43] made a tool which generates empty locales template --- tools/gen_lang_template.sh | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 tools/gen_lang_template.sh diff --git a/tools/gen_lang_template.sh b/tools/gen_lang_template.sh new file mode 100644 index 00000000..83332a64 --- /dev/null +++ b/tools/gen_lang_template.sh @@ -0,0 +1,15 @@ +#!/bin/bash +#best use ./gen_lang_template >> ../data/locales/XX.lua +#it wont run if you type "sh gen_lang_template", type "./gen_lang_template.sh" instead +#based on gen_needed_translations.sh +echo '-- generated by ./tools/gen_lang_template.sh' +echo 'locale ={' +echo ' name="",' +echo ' languageName="",' +echo ' translation = {' +cat <(find -L ../ \( -name "*.lua" -o -name "*.otui" \) -exec grep -oE "tr\\('(\\\\'|[^'])*'" {} \;) \ + <(find -L ../ \( -name "*.lua" -o -name "*.otui" \) -exec grep -oE "tr\\(\"(\\\\\"|[^\"])*\"" {} \;) \ + | sort | uniq | sed "s/^tr(.\(.*\).$/ [\"\1\"] = \"\",/" +echo ' }' +echo '}' +echo 'modules.client_locales.installLocale(locale)' From 1eb2bbd389beb531a79fc47835008a9d903adfb2 Mon Sep 17 00:00:00 2001 From: Gabriel Pedro Date: Thu, 25 Dec 2014 11:10:03 -0300 Subject: [PATCH 02/43] Add OSX Wiki --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c193dca4..8fb26cef 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ A package with all required libraries for compiling OTClient on Windows can be f In short, if you need to compile OTClient, follow these tutorials: * [Compiling on Windows](https://github.com/edubart/otclient/wiki/Compiling-on-Windows) * [Compiling on Linux](https://github.com/edubart/otclient/wiki/Compiling-on-Linux) +* [Compiling on OS X](https://github.com/edubart/otclient/wiki/Compiling-on-Mac-OS-X) From 7f3f18f9910463aff8e7d99da78f0bef8f174213 Mon Sep 17 00:00:00 2001 From: TheSumm Date: Mon, 29 Dec 2014 18:08:13 +0100 Subject: [PATCH 03/43] Support for Protocols up to 10.71, Adventurer Blessing --- modules/client_entergame/characterlist.otui | 6 +- modules/client_entergame/entergame.lua | 8 +- modules/game_inventory/inventory.lua | 33 +++++++- modules/gamelib/const.lua | 25 ++++++- modules/gamelib/game.lua | 35 ++++----- modules/gamelib/protocollogin.lua | 35 ++++++--- src/client/const.h | 20 ++++- src/client/game.cpp | 25 ++++++- src/client/localplayer.cpp | 11 +++ src/client/localplayer.h | 3 + src/client/luafunctions.cpp | 2 + src/client/protocolcodes.cpp | 47 +++++++++++- src/client/protocolcodes.h | 4 + src/client/protocolgame.cpp | 2 +- src/client/protocolgame.h | 4 + src/client/protocolgameparse.cpp | 55 +++++++++++++- src/client/protocolgamesend.cpp | 21 +++--- src/client/thingtype.cpp | 83 ++++++++++++--------- src/client/thingtype.h | 6 ++ src/client/thingtypemanager.cpp | 3 + src/client/thingtypemanager.h | 2 + 21 files changed, 342 insertions(+), 88 deletions(-) diff --git a/modules/client_entergame/characterlist.otui b/modules/client_entergame/characterlist.otui index 745e819b..e93cb385 100644 --- a/modules/client_entergame/characterlist.otui +++ b/modules/client_entergame/characterlist.otui @@ -45,13 +45,17 @@ CharacterWidget < UIWidget MainWindow id: charactersWindow !text: tr('Character List') - size: 250 248 visible: false @onEnter: CharacterList.doLogin() @onEscape: CharacterList.hide(true) @onSetup: | g_keyboard.bindKeyPress('Up', function() self:getChildById('characters'):focusPreviousChild(KeyboardFocusReason) end, self) g_keyboard.bindKeyPress('Down', function() self:getChildById('characters'):focusNextChild(KeyboardFocusReason) end, self) + if g_game.getFeature(GamePreviewState) then + self:setSize({width = 350, height = 400}) + else + self:setSize({width = 250, height = 248}) + end TextList id: characters diff --git a/modules/client_entergame/entergame.lua b/modules/client_entergame/entergame.lua index 9b64ddfe..f2ea913e 100644 --- a/modules/client_entergame/entergame.lua +++ b/modules/client_entergame/entergame.lua @@ -59,6 +59,12 @@ local function onCharacterList(protocol, characters, account, otui) loadBox:destroy() loadBox = nil + for _, characterInfo in pairs(characters) do + if characterInfo.previewState and characterInfo.previewState ~= PreviewState.Default then + characterInfo.worldName = characterInfo.worldName .. ', Preview' + end + end + CharacterList.create(characters, account, otui) CharacterList.show() @@ -105,7 +111,7 @@ function EnterGame.init() local port = g_settings.get('port') local autologin = g_settings.getBoolean('autologin') local clientVersion = g_settings.getInteger('client-version') - if clientVersion == 0 then clientVersion = 860 end + if clientVersion == 0 then clientVersion = 1071 end if port == nil or port == 0 then port = 7171 end diff --git a/modules/game_inventory/inventory.lua b/modules/game_inventory/inventory.lua index 89e8f4f9..9cafb6c1 100644 --- a/modules/game_inventory/inventory.lua +++ b/modules/game_inventory/inventory.lua @@ -17,7 +17,10 @@ inventoryButton = nil purseButton = nil function init() - connect(LocalPlayer, { onInventoryChange = onInventoryChange }) + connect(LocalPlayer, { + onInventoryChange = onInventoryChange, + onBlessingsChange = onBlessingsChange + }) connect(g_game, { onGameStart = refresh }) g_keyboard.bindKeyDown('Ctrl+I', toggle) @@ -43,7 +46,10 @@ function init() end function terminate() - disconnect(LocalPlayer, { onInventoryChange = onInventoryChange }) + disconnect(LocalPlayer, { + onInventoryChange = onInventoryChange, + onBlessingsChange = onBlessingsChange + }) disconnect(g_game, { onGameStart = refresh }) g_keyboard.unbindKeyDown('Ctrl+I') @@ -52,6 +58,21 @@ function terminate() inventoryButton:destroy() end +function toggleAdventurerStyle(hasBlessing) + for slot = InventorySlotFirst, InventorySlotLast do + local itemWidget = inventoryPanel:getChildById('slot' .. slot) + if itemWidget then + if hasBlessing then + itemWidget:setBorderWidth(1) + itemWidget:setBorderColor('#F7C80C') + else + itemWidget:setBorderWidth(0) + itemWidget:setBorderColor('white') + end + end + end +end + function refresh() local player = g_game.getLocalPlayer() for i = InventorySlotFirst, InventorySlotPurse do @@ -60,6 +81,7 @@ function refresh() else onInventoryChange(player, i, nil) end + toggleAdventurerStyle(Bit.hasBit(player:getBlessings(), Blessings.Adventurer)) end purseButton:setVisible(g_game.getFeature(GamePurseSlot)) @@ -99,3 +121,10 @@ function onInventoryChange(player, slot, item, oldItem) itemWidget:setItem(nil) end end + +function onBlessingsChange(player, blessings, oldBlessings) + local hasAdventurerBlessing = Bit.hasBit(blessings, Blessings.Adventurer) + if hasAdventurerBlessing ~= Bit.hasBit(oldBlessings, Blessings.Adventurer) then + toggleAdventurerStyle(hasAdventurerBlessing) + end +end \ No newline at end of file diff --git a/modules/gamelib/const.lua b/modules/gamelib/const.lua index 15f940fb..16f1cfaf 100644 --- a/modules/gamelib/const.lua +++ b/modules/gamelib/const.lua @@ -120,6 +120,13 @@ GameSpritesAlphaChannel = 56 GamePremiumExpiration = 57 GameBrowseField = 58 GameEnhancedAnimations = 59 +GameOGLInformation = 60 +GameMessageSizeCheck = 61 +GamePreviewState = 62 +GameLoginPacketEncryption = 63 +GameClientVersion = 64 +GameContentRevision = 65 +GameExperienceBonus = 66 TextColors = { red = '#f55e5e', --'#c83200' @@ -201,7 +208,7 @@ CIPSOFT_RSA = "1321277432058722840622950990822933849527763264961655079678763618" "88792221429527047321331896351555606801473202394175817" -- set to the latest Tibia.pic signature to make otclient compatible with official tibia -PIC_SIGNATURE = 0x53208400 +PIC_SIGNATURE = 0x542100C1 OsTypes = { Linux = 1, @@ -244,4 +251,20 @@ ExtendedIds = { NeedsUpdate = 7 } +PreviewState = { + Default = 0, + Inactive = 1, + Active = 2 +} + +Blessings = { + None = 0, + Adventurer = 1, + SpiritualShielding = 2, + EmbraceOfTibia = 4, + FireOfSuns = 8, + WisdomOfSolitude = 16, + SparkOfPhoenix = 32 +} + -- @} diff --git a/modules/gamelib/game.lua b/modules/gamelib/game.lua index 28a7bf24..cc283d38 100644 --- a/modules/gamelib/game.lua +++ b/modules/gamelib/game.lua @@ -53,38 +53,39 @@ end function g_game.getSupportedClients() return { - 740, 741, 750, 760, 770, 772, + 740, 741, 750, 760, 770, 772, 780, 781, 782, 790, 792, - 800, 810, 811, 820, 821, 822, - 830, 831, 840, 842, 850, 853, - 854, 855, 857, 860, 861, 862, + 800, 810, 811, 820, 821, 822, + 830, 831, 840, 842, 850, 853, + 854, 855, 857, 860, 861, 862, 870, 871, - 900, 910, 920, 931, 940, 943, - 944, 951, 952, 953, 954, 960, - 961, 963, 970, 971, 972, 973, - 980, 981, 982, 983, 984, 985, + 900, 910, 920, 931, 940, 943, + 944, 951, 952, 953, 954, 960, + 961, 963, 970, 971, 972, 973, + 980, 981, 982, 983, 984, 985, 986, - 1000, 1001, 1002, 1010, 1011, - 1012, 1013, 1020, 1021, 1022, - 1030, 1031, 1032, 1033, 1034, - 1035, 1036, 1037, 1038, 1039, + 1000, 1001, 1002, 1010, 1011, + 1012, 1013, 1020, 1021, 1022, + 1030, 1031, 1032, 1033, 1034, + 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, - 1058, 1059, 1060, 1061 + 1058, 1059, 1060, 1061, 1062, + 1063, 1064, 1070, 1071 } end -- The client version and protocol version where --- unsynchronized for some releases, not sure if this +-- unsynchronized for some releases, not sure if this -- will be the normal standard. --- Client Version: Publicly given version when +-- Client Version: Publicly given version when -- downloading Cipsoft client. --- Protocol Version: Previously was the same as +-- Protocol Version: Previously was the same as -- the client version, but was unsychronized in some -- releases, now it needs to be verified and added here -- if it does not match the client version. @@ -92,7 +93,7 @@ end -- Reason for defining both: The server now requires a -- Client version and Protocol version from the client. --- Important: Use getClientVersion for specific protocol +-- Important: Use getClientVersion for specific protocol -- features to ensure we are using the proper version. function g_game.getClientProtocolVersion(client) diff --git a/modules/gamelib/protocollogin.lua b/modules/gamelib/protocollogin.lua index 1aa6665d..e3d20630 100644 --- a/modules/gamelib/protocollogin.lua +++ b/modules/gamelib/protocollogin.lua @@ -32,23 +32,28 @@ function ProtocolLogin:sendLoginPacket() msg:addU16(g_game.getProtocolVersion()) - if g_game.getClientVersion() >= 980 then + if g_game.getFeature(GameClientVersion) then msg:addU32(g_game.getClientVersion()) end - msg:addU32(g_things.getDatSignature()) + if g_game.getFeature(GameContentRevision) then + msg:addU16(g_things.getContentRevision()) + msg:addU16(0) + else + msg:addU32(g_things.getDatSignature()) + end msg:addU32(g_sprites.getSprSignature()) msg:addU32(PIC_SIGNATURE) - if g_game.getClientVersion() >= 980 then - msg:addU8(0) -- clientType + if g_game.getFeature(GamePreviewState) then + msg:addU8(0) end local offset = msg:getMessageSize() - - if g_game.getClientVersion() >= 770 then + if g_game.getFeature(GameLoginPacketEncryption) then -- first RSA byte must be 0 msg:addU8(0) + -- xtea key self:generateXteaKey() local xteaKey = self:getXteaKey() @@ -74,16 +79,23 @@ function ProtocolLogin:sendLoginPacket() local paddingBytes = g_crypt.rsaGetSize() - (msg:getMessageSize() - offset) assert(paddingBytes >= 0) msg:addPaddingBytes(paddingBytes, 0) - if g_game.getClientVersion() >= 770 then + if g_game.getFeature(GameLoginPacketEncryption) then msg:encryptRsa() end + if g_game.getFeature(GameOGLInformation) then + msg:addU8(1) --unknown + msg:addU8(1) --unknown + msg:addString(g_graphics.getRenderer()) + msg:addString(g_graphics.getVersion()) + end + if g_game.getFeature(GameProtocolChecksum) then self:enableChecksum() end self:send(msg) - if g_game.getClientVersion() >= 770 then + if g_game.getFeature(GameLoginPacketEncryption) then self:enableXteaEncryption() end self:recv() @@ -141,7 +153,7 @@ function ProtocolLogin:parseCharacterList(msg) world.worldName = msg:getString() world.worldIp = msg:getString() world.worldPort = msg:getU16() - msg:getU8() -- unknow byte? + world.previewState = msg:getU8() worlds[worldId] = world end @@ -153,6 +165,7 @@ function ProtocolLogin:parseCharacterList(msg) character.worldName = worlds[worldId].worldName character.worldIp = worlds[worldId].worldIp character.worldPort = worlds[worldId].worldPort + character.previewState = worlds[worldId].previewState characters[i] = character end @@ -165,8 +178,8 @@ function ProtocolLogin:parseCharacterList(msg) character.worldIp = iptostring(msg:getU32()) character.worldPort = msg:getU16() - if g_game.getClientVersion() >= 980 then - character.unknown = msg:getU8() + if g_game.getFeature(GamePreviewState) then + character.previewState = msg:getU8() end characters[i] = character diff --git a/src/client/const.h b/src/client/const.h index b147f66b..dd36caf9 100644 --- a/src/client/const.h +++ b/src/client/const.h @@ -328,7 +328,8 @@ namespace Otc MessageRVRChannel = 46, MessageRVRAnswer = 47, MessageRVRContinue = 48, - LastMessage = 49, + MessageGameHighlight = 49, + LastMessage = 50, MessageInvalid = 255 }; @@ -390,6 +391,13 @@ namespace Otc GamePremiumExpiration = 57, GameBrowseField = 58, GameEnhancedAnimations = 59, + GameOGLInformation = 60, + GameMessageSizeCheck = 61, + GamePreviewState = 62, + GameLoginPacketEncryption = 63, + GameClientVersion = 64, + GameContentRevision = 65, + GameExperienceBonus = 66, LastGameFeature = 101 }; @@ -450,6 +458,16 @@ namespace Otc PhaseRandom = 254, PhaseAsync = 255 }; + + enum Blessings { + BlessingNone = 0, + BlessingAdventurer = 1, + BlessingSpiritualShielding = 1 << 1, + BlessingEmbraceOfTibia = 1 << 2, + BlessingFireOfSuns = 1 << 3, + BlessingWisdomOfSolitude = 1 << 4, + BlessingSparkOfPhoenix = 1 << 5 + }; } #endif diff --git a/src/client/game.cpp b/src/client/game.cpp index 385fad41..dde46699 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -1425,7 +1425,7 @@ void Game::setProtocolVersion(int version) if(isOnline()) stdext::throw_exception("Unable to change protocol version while online"); - if(version != 0 && (version < 740 || version > 1051)) + if(version != 0 && (version < 740 || version > 1071)) stdext::throw_exception(stdext::format("Protocol version %d not supported", version)); m_protocolVersion = version; @@ -1443,7 +1443,7 @@ void Game::setClientVersion(int version) if(isOnline()) stdext::throw_exception("Unable to change client version while online"); - if(version != 0 && (version < 740 || version > 1051)) + if(version != 0 && (version < 740 || version > 1071)) stdext::throw_exception(stdext::format("Client version %d not supported", version)); m_features.reset(); @@ -1452,6 +1452,7 @@ void Game::setClientVersion(int version) if(version >= 770) { enableFeature(Otc::GameLooktypeU16); enableFeature(Otc::GameMessageStatements); + enableFeature(Otc::GameLoginPacketEncryption); } if(version >= 780) { @@ -1475,6 +1476,7 @@ void Game::setClientVersion(int version) if(version >= 841) { enableFeature(Otc::GameChallengeOnLogin); + enableFeature(Otc::GameMessageSizeCheck); } if(version >= 854) { @@ -1523,6 +1525,11 @@ void Game::setClientVersion(int version) enableFeature(Otc::GameAdditionalVipInfo); } + if(version >= 980) { + enableFeature(Otc::GamePreviewState); + enableFeature(Otc::GameClientVersion); + } + if(version >= 981) { enableFeature(Otc::GameLoginPending); enableFeature(Otc::GameNewSpeedLaw); @@ -1538,7 +1545,7 @@ void Game::setClientVersion(int version) enableFeature(Otc::GamePVPMode); } - if (version >= 1035) { + if(version >= 1035) { enableFeature(Otc::GameDoubleSkills); enableFeature(Otc::GameBaseSkillU16); } @@ -1556,6 +1563,18 @@ void Game::setClientVersion(int version) enableFeature(Otc::GameEnhancedAnimations); } + if(version >= 1054) { + enableFeature(Otc::GameExperienceBonus); + } + + if(version >= 1061) { + enableFeature(Otc::GameOGLInformation); + } + + if(version >= 1071) { + enableFeature(Otc::GameContentRevision); + } + m_clientVersion = version; g_lua.callGlobalField("g_game", "onClientVersionChange", version); diff --git a/src/client/localplayer.cpp b/src/client/localplayer.cpp index a09ceb15..d4cbc898 100644 --- a/src/client/localplayer.cpp +++ b/src/client/localplayer.cpp @@ -31,6 +31,7 @@ LocalPlayer::LocalPlayer() { m_states = 0; m_vocation = 0; + m_blessings = Otc::BlessingNone; m_walkLockExpiration = 0; m_skillsLevel.fill(-1); @@ -546,6 +547,16 @@ void LocalPlayer::setSpells(const std::vector& spells) } } +void LocalPlayer::setBlessings(int blessings) +{ + if(blessings != m_blessings) { + int oldBlessings = m_blessings; + m_blessings = blessings; + + callLuaField("onBlessingsChange", blessings, oldBlessings); + } +} + bool LocalPlayer::hasSight(const Position& pos) { return m_position.isInRange(pos, g_map.getAwareRange().left - 1, g_map.getAwareRange().top - 1); diff --git a/src/client/localplayer.h b/src/client/localplayer.h index cbc1832e..e839d819 100644 --- a/src/client/localplayer.h +++ b/src/client/localplayer.h @@ -63,6 +63,7 @@ public: void setRegenerationTime(double regenerationTime); void setOfflineTrainingTime(double offlineTrainingTime); void setSpells(const std::vector& spells); + void setBlessings(int blessings); int getStates() { return m_states; } int getSkillLevel(Otc::Skill skill) { return m_skillsLevel[skill]; } @@ -88,6 +89,7 @@ public: double getOfflineTrainingTime() { return m_offlineTrainingTime; } std::vector getSpells() { return m_spells; } ItemPtr getInventoryItem(Otc::InventorySlot inventory) { return m_inventoryItems[inventory]; } + int getBlessings() { return m_blessings; } bool hasSight(const Position& pos); bool isKnown() { return m_known; } @@ -144,6 +146,7 @@ private: int m_states; int m_vocation; + int m_blessings; double m_health; double m_maxHealth; diff --git a/src/client/luafunctions.cpp b/src/client/luafunctions.cpp index ebc29073..f8cdcccb 100644 --- a/src/client/luafunctions.cpp +++ b/src/client/luafunctions.cpp @@ -63,6 +63,7 @@ void Client::registerLuaFunctions() g_lua.bindSingletonFunction("g_things", "isDatLoaded", &ThingTypeManager::isDatLoaded, &g_things); g_lua.bindSingletonFunction("g_things", "isOtbLoaded", &ThingTypeManager::isOtbLoaded, &g_things); g_lua.bindSingletonFunction("g_things", "getDatSignature", &ThingTypeManager::getDatSignature, &g_things); + g_lua.bindSingletonFunction("g_things", "getContentRevision", &ThingTypeManager::getContentRevision, &g_things); g_lua.bindSingletonFunction("g_things", "getThingType", &ThingTypeManager::getThingType, &g_things); g_lua.bindSingletonFunction("g_things", "getItemType", &ThingTypeManager::getItemType, &g_things); g_lua.bindSingletonFunction("g_things", "getThingTypes", &ThingTypeManager::getThingTypes, &g_things); @@ -630,6 +631,7 @@ void Client::registerLuaFunctions() g_lua.bindClassMemberFunction("getTotalCapacity", &LocalPlayer::getTotalCapacity); g_lua.bindClassMemberFunction("getInventoryItem", &LocalPlayer::getInventoryItem); g_lua.bindClassMemberFunction("getVocation", &LocalPlayer::getVocation); + g_lua.bindClassMemberFunction("getBlessings", &LocalPlayer::getBlessings); g_lua.bindClassMemberFunction("isPremium", &LocalPlayer::isPremium); g_lua.bindClassMemberFunction("isKnown", &LocalPlayer::isKnown); g_lua.bindClassMemberFunction("isPreWalking", &LocalPlayer::isPreWalking); diff --git a/src/client/protocolcodes.cpp b/src/client/protocolcodes.cpp index 6990985e..134e24d2 100644 --- a/src/client/protocolcodes.cpp +++ b/src/client/protocolcodes.cpp @@ -28,7 +28,52 @@ std::map messageModesMap; void buildMessageModesMap(int version) { messageModesMap.clear(); - if(version >= 1036) { + + if(version >= 1055) { // might be 1054 + messageModesMap[Otc::MessageNone] = 0; + messageModesMap[Otc::MessageSay] = 1; + messageModesMap[Otc::MessageWhisper] = 2; + messageModesMap[Otc::MessageYell] = 3; + messageModesMap[Otc::MessagePrivateFrom] = 4; + messageModesMap[Otc::MessagePrivateTo] = 5; + messageModesMap[Otc::MessageChannelManagement] = 6; + messageModesMap[Otc::MessageChannel] = 7; + messageModesMap[Otc::MessageChannelHighlight] = 8; + messageModesMap[Otc::MessageSpell] = 9; + //NpcFromStartBlock = 10 + messageModesMap[Otc::MessageNpcFrom] = 11; + messageModesMap[Otc::MessageNpcTo] = 12; + messageModesMap[Otc::MessageGamemasterBroadcast] = 13; + messageModesMap[Otc::MessageGamemasterChannel] = 14; + messageModesMap[Otc::MessageGamemasterPrivateFrom] = 15; + messageModesMap[Otc::MessageGamemasterPrivateTo] = 16; + messageModesMap[Otc::MessageLogin] = 17; + messageModesMap[Otc::MessageWarning] = 18; // Admin + messageModesMap[Otc::MessageGame] = 19; + messageModesMap[Otc::MessageGameHighlight] = 20; + messageModesMap[Otc::MessageFailure] = 21; + messageModesMap[Otc::MessageLook] = 22; + messageModesMap[Otc::MessageDamageDealed] = 23; + messageModesMap[Otc::MessageDamageReceived] = 24; + messageModesMap[Otc::MessageHeal] = 25; + messageModesMap[Otc::MessageExp] = 26; + messageModesMap[Otc::MessageDamageOthers] = 27; + messageModesMap[Otc::MessageHealOthers] = 28; + messageModesMap[Otc::MessageExpOthers] = 29; + messageModesMap[Otc::MessageStatus] = 30; + messageModesMap[Otc::MessageLoot] = 31; + messageModesMap[Otc::MessageTradeNpc] = 32; + messageModesMap[Otc::MessageGuild] = 33; + messageModesMap[Otc::MessagePartyManagement] = 34; + messageModesMap[Otc::MessageParty] = 35; + messageModesMap[Otc::MessageBarkLow] = 36; + messageModesMap[Otc::MessageBarkLoud] = 37; + messageModesMap[Otc::MessageReport] = 38; + messageModesMap[Otc::MessageHotkeyUse] = 39; + messageModesMap[Otc::MessageTutorialHint] = 40; + messageModesMap[Otc::MessageThankyou] = 41; + messageModesMap[Otc::MessageMarket] = 42; + } else if(version >= 1036) { for(int i = Otc::MessageNone; i <= Otc::MessageBeyondLast; ++i) { if(i >= Otc::MessageNpcTo) messageModesMap[i] = i + 1; diff --git a/src/client/protocolcodes.h b/src/client/protocolcodes.h index b4c0482b..69780587 100644 --- a/src/client/protocolcodes.h +++ b/src/client/protocolcodes.h @@ -107,6 +107,8 @@ namespace Proto { GameServerCreatureType = 149, GameServerEditText = 150, GameServerEditList = 151, + GameServerBlessings = 156, + GameServerPreset = 157, GameServerPremiumTrigger = 158, // 1038 GameServerPlayerDataBasic = 159, // 950 GameServerPlayerData = 160, @@ -130,6 +132,8 @@ namespace Proto { GameServerTextMessage = 180, GameServerCancelWalk = 181, GameServerWalkWait = 182, + GameServerUnjustifiedStats = 183, + GameServerPvpSituations = 184, GameServerFloorChangeUp = 190, GameServerFloorChangeDown = 191, GameServerChooseOutfit = 200, diff --git a/src/client/protocolgame.cpp b/src/client/protocolgame.cpp index c9d194af..0d3ba266 100644 --- a/src/client/protocolgame.cpp +++ b/src/client/protocolgame.cpp @@ -56,7 +56,7 @@ void ProtocolGame::onRecv(const InputMessagePtr& inputMessage) if(m_firstRecv) { m_firstRecv = false; - if(g_game.getClientVersion() >= 841) { // not sure since which version this is, but it seems to be after 8.40 + if(g_game.getFeature(Otc::GameMessageSizeCheck)) { int size = inputMessage->getU16(); if(size != inputMessage->getUnreadSize()) { g_logger.traceError("invalid message size"); diff --git a/src/client/protocolgame.h b/src/client/protocolgame.h index 34f31620..7be5b44c 100644 --- a/src/client/protocolgame.h +++ b/src/client/protocolgame.h @@ -128,6 +128,10 @@ public: void addPosition(const OutputMessagePtr& msg, const Position& position); private: + void parseBlessings(const InputMessagePtr& msg); + void parseUnjustifiedStats(const InputMessagePtr& msg); + void parsePvpSituations(const InputMessagePtr& msg); + void parsePreset(const InputMessagePtr& msg); void parseCreatureType(const InputMessagePtr& msg); void parsePlayerHelpers(const InputMessagePtr& msg); void parseMessage(const InputMessagePtr& msg); diff --git a/src/client/protocolgameparse.cpp b/src/client/protocolgameparse.cpp index 4a64249d..a07c766b 100644 --- a/src/client/protocolgameparse.cpp +++ b/src/client/protocolgameparse.cpp @@ -340,6 +340,19 @@ void ProtocolGame::parseMessage(const InputMessagePtr& msg) case Proto::GameServerCreatureType: parseCreatureType(msg); break; + // PROTOCOL>=1055 + case Proto::GameServerBlessings: + parseBlessings(msg); + break; + case Proto::GameServerUnjustifiedStats: + parseUnjustifiedStats(msg); + break; + case Proto::GameServerPvpSituations: + parsePvpSituations(msg); + break; + case Proto::GameServerPreset: + parsePreset(msg); + break; // otclient ONLY case Proto::GameServerExtendedOpcode: parseExtendedOpcode(msg); @@ -372,6 +385,9 @@ void ProtocolGame::parseLogin(const InputMessagePtr& msg) } bool canReportBugs = msg->getU8(); + msg->getU8(); // can change pvp framing option + msg->getU8(); // expert mode enabled + m_localPlayer->setId(playerId); g_game.setServerBeat(serverBeat); g_game.setCanReportBugs(canReportBugs); @@ -396,6 +412,34 @@ void ProtocolGame::parseEnterGame(const InputMessagePtr& msg) } } +void ProtocolGame::parseBlessings(const InputMessagePtr& msg) +{ + uint16 blessings = msg->getU16(); + m_localPlayer->setBlessings(blessings); +} + +void ProtocolGame::parsePreset(const InputMessagePtr& msg) +{ + uint16 preset = msg->getU32(); +} + +void ProtocolGame::parseUnjustifiedStats(const InputMessagePtr& msg) +{ + // Unjustified Kills display since 10.55 + msg->getU8(); + msg->getU8(); + msg->getU8(); + msg->getU8(); + msg->getU8(); + msg->getU8(); + msg->getU8(); +} + +void ProtocolGame::parsePvpSituations(const InputMessagePtr& msg) +{ + msg->getU8(); // amount of open pvp situations +} + void ProtocolGame::parsePlayerHelpers(const InputMessagePtr& msg) { uint id = msg->getU32(); @@ -468,6 +512,7 @@ void ProtocolGame::parseChallenge(const InputMessagePtr& msg) { uint timestamp = msg->getU32(); uint8 random = msg->getU8(); + sendLoginPacket(timestamp, random); } @@ -1038,7 +1083,7 @@ void ProtocolGame::parsePlayerInfo(const InputMessagePtr& msg) bool premium = msg->getU8(); // premium int vocation = msg->getU8(); // vocation if(g_game.getFeature(Otc::GamePremiumExpiration)) - int premiumEx = msg->getU32(); // premium expiration + int premiumEx = msg->getU32(); // premium expiration used for premium advertisement int spellCount = msg->getU16(); std::vector spells; @@ -1081,6 +1126,10 @@ void ProtocolGame::parsePlayerStats(const InputMessagePtr& msg) double level = msg->getU16(); double levelPercent = msg->getU8(); + + if(g_game.getFeature(Otc::GameExperienceBonus)) + double experienceBonus = msg->getDouble(); + double mana; double maxMana; @@ -1145,7 +1194,7 @@ void ProtocolGame::parsePlayerSkills(const InputMessagePtr& msg) int baseLevel; if(g_game.getFeature(Otc::GameSkillsBase)) - if (g_game.getFeature(Otc::GameBaseSkillU16)) + if(g_game.getFeature(Otc::GameBaseSkillU16)) baseLevel = msg->getU16(); else baseLevel = msg->getU8(); @@ -1699,7 +1748,7 @@ void ProtocolGame::parseChangeMapAwareRange(const InputMessagePtr& msg) void ProtocolGame::parseCreaturesMark(const InputMessagePtr& msg) { int len; - if (g_game.getClientVersion() >= 1035) { + if(g_game.getClientVersion() >= 1035) { len = 1; } else { len = msg->getU8(); diff --git a/src/client/protocolgamesend.cpp b/src/client/protocolgamesend.cpp index 88906f1d..a32ee396 100644 --- a/src/client/protocolgamesend.cpp +++ b/src/client/protocolgamesend.cpp @@ -56,17 +56,20 @@ void ProtocolGame::sendLoginPacket(uint challengeTimestamp, uint8 challengeRando msg->addU16(g_game.getOs()); msg->addU16(g_game.getProtocolVersion()); - if(g_game.getClientVersion() >= 980) { + if(g_game.getFeature(Otc::GameClientVersion)) msg->addU32(g_game.getClientVersion()); - msg->addU8(0); // preview state - } + + if(g_game.getFeature(Otc::GameContentRevision)) + msg->addU16(g_things.getContentRevision()); + + if(g_game.getFeature(Otc::GamePreviewState)) + msg->addU8(0); int offset = msg->getMessageSize(); + // first RSA byte must be 0 + msg->addU8(0); - msg->addU8(0); // first RSA byte must be 0 - - if(g_game.getClientVersion() >= 770) - { + if(g_game.getFeature(Otc::GameLoginPacketEncryption)) { // xtea key generateXteaKey(); msg->addU32(m_xteaKey[0]); @@ -99,7 +102,7 @@ void ProtocolGame::sendLoginPacket(uint challengeTimestamp, uint8 challengeRando msg->addPaddingBytes(paddingBytes); // encrypt with RSA - if(g_game.getClientVersion() >= 770) + if(g_game.getFeature(Otc::GameLoginPacketEncryption)) msg->encryptRsa(); if(g_game.getFeature(Otc::GameProtocolChecksum)) @@ -107,7 +110,7 @@ void ProtocolGame::sendLoginPacket(uint challengeTimestamp, uint8 challengeRando send(msg); - if(g_game.getClientVersion() >= 770) + if(g_game.getFeature(Otc::GameLoginPacketEncryption)) enableXteaEncryption(); } diff --git a/src/client/thingtype.cpp b/src/client/thingtype.cpp index 7e5f5de3..b0524e74 100644 --- a/src/client/thingtype.cpp +++ b/src/client/thingtype.cpp @@ -274,51 +274,60 @@ void ThingType::unserialize(uint16 clientId, ThingCategory category, const FileS stdext::throw_exception(stdext::format("corrupt data (id: %d, category: %d, count: %d, lastAttr: %d)", m_id, m_category, count, attr)); - uint8 width = fin->getU8(); - uint8 height = fin->getU8(); - m_size = Size(width, height); - if(width > 1 || height > 1) { - m_realSize = fin->getU8(); - m_exactSize = std::min(m_realSize, std::max(width * 32, height * 32)); - } - else - m_exactSize = 32; + uint8 frames = 1; + if(category == ThingCategoryCreature && g_game.getClientVersion() >= 1057) + frames = fin->getU8(); - m_layers = fin->getU8(); - m_numPatternX = fin->getU8(); - m_numPatternY = fin->getU8(); - if(g_game.getClientVersion() >= 755) - m_numPatternZ = fin->getU8(); - else - m_numPatternZ = 1; - m_animationPhases = fin->getU8(); + for(int i = 0; i < frames; ++i) { + uint8 frameGroup = FrameGroupDefault; + if(category == ThingCategoryCreature && g_game.getClientVersion() >= 1057) { + frameGroup = fin->getU8(); + } - if(g_game.getFeature(Otc::GameEnhancedAnimations)) { - if(m_animationPhases > 1) { - m_animation.async = fin->getU8() == 0; - m_animation.loopCount = fin->get32(); - m_animation.startIndex = fin->getU8(); + uint8 width = fin->getU8(); + uint8 height = fin->getU8(); + m_size = Size(width, height); + if(width > 1 || height > 1) { + m_realSize = fin->getU8(); + m_exactSize = std::min(m_realSize, std::max(width * 32, height * 32)); + } + else + m_exactSize = 32; - for(int i = 0; i < m_animationPhases; i++) { - int minDuration = fin->getU32(); - int maxDuration = fin->getU32(); + m_layers = fin->getU8(); + m_numPatternX = fin->getU8(); + m_numPatternY = fin->getU8(); + if(g_game.getClientVersion() >= 755) + m_numPatternZ = fin->getU8(); + else + m_numPatternZ = 1; + m_animationPhases = fin->getU8(); - m_animation.frames.push_back(std::make_tuple(minDuration, maxDuration)); + if(g_game.getFeature(Otc::GameEnhancedAnimations)) { + if(m_animationPhases > 1) { + m_animation.async = fin->getU8() == 0; + m_animation.loopCount = fin->get32(); + m_animation.startIndex = fin->getU8(); + + for (int i = 0; i < m_animationPhases; i++) { + int minDuration = fin->getU32(); + int maxDuration = fin->getU32(); + + m_animation.frames.push_back(std::make_tuple(minDuration, maxDuration)); + } } } + + int totalSprites = m_size.area() * m_layers * m_numPatternX * m_numPatternY * m_numPatternZ * m_animationPhases; + + if(totalSprites > 4096) + stdext::throw_exception("a thing type has more than 4096 sprites"); + + m_spritesIndex.resize(totalSprites); + for(int i = 0; i < totalSprites; i++) + m_spritesIndex[i] = g_game.getFeature(Otc::GameSpritesU32) ? fin->getU32() : fin->getU16(); } - int totalSprites = m_size.area() * m_layers * m_numPatternX * m_numPatternY * m_numPatternZ * m_animationPhases; - - // if(totalSprites == 0) - // stdext::throw_exception("a thing type has no sprites"); - if(totalSprites > 4096) - stdext::throw_exception("a thing type has more than 4096 sprites"); - - m_spritesIndex.resize(totalSprites); - for(int i = 0; i < totalSprites; i++) - m_spritesIndex[i] = g_game.getFeature(Otc::GameSpritesU32) ? fin->getU32() : fin->getU16(); - m_textures.resize(m_animationPhases); m_texturesFramesRects.resize(m_animationPhases); m_texturesFramesOriginRects.resize(m_animationPhases); diff --git a/src/client/thingtype.h b/src/client/thingtype.h index 10363587..11a85f20 100644 --- a/src/client/thingtype.h +++ b/src/client/thingtype.h @@ -32,6 +32,12 @@ #include #include +enum FrameGroup : uint8 { + FrameGroupIdle = 0, + FrameGroupMoving, + FrameGroupDefault = FrameGroupIdle +}; + enum ThingCategory : uint8 { ThingCategoryItem = 0, ThingCategoryCreature, diff --git a/src/client/thingtypemanager.cpp b/src/client/thingtypemanager.cpp index eaec7e82..a1dc5805 100644 --- a/src/client/thingtypemanager.cpp +++ b/src/client/thingtypemanager.cpp @@ -42,6 +42,7 @@ void ThingTypeManager::init() m_nullThingType = ThingTypePtr(new ThingType); m_nullItemType = ItemTypePtr(new ItemType); m_datSignature = 0; + m_contentRevision = 0; m_otbMinorVersion = 0; m_otbMajorVersion = 0; m_datLoaded = false; @@ -100,12 +101,14 @@ bool ThingTypeManager::loadDat(std::string file) { m_datLoaded = false; m_datSignature = 0; + m_contentRevision = 0; try { file = g_resources.guessFilePath(file, "dat"); FileStreamPtr fin = g_resources.openFile(file); m_datSignature = fin->getU32(); + m_contentRevision = static_cast(m_datSignature); for(int category = 0; category < ThingLastCategory; ++category) { int count = fin->getU16() + 1; diff --git a/src/client/thingtypemanager.h b/src/client/thingtypemanager.h index 641f784f..a9b42894 100644 --- a/src/client/thingtypemanager.h +++ b/src/client/thingtypemanager.h @@ -66,6 +66,7 @@ public: uint32 getDatSignature() { return m_datSignature; } uint32 getOtbMajorVersion() { return m_otbMajorVersion; } uint32 getOtbMinorVersion() { return m_otbMinorVersion; } + uint16 getContentRevision() { return m_contentRevision; } bool isDatLoaded() { return m_datLoaded; } bool isXmlLoaded() { return m_xmlLoaded; } @@ -89,6 +90,7 @@ private: uint32 m_otbMinorVersion; uint32 m_otbMajorVersion; uint32 m_datSignature; + uint16 m_contentRevision; }; extern ThingTypeManager g_things; From 16f6a0019cde4407044622f4fc30a872cb816e51 Mon Sep 17 00:00:00 2001 From: BenDol Date: Tue, 30 Dec 2014 17:27:53 +1300 Subject: [PATCH 04/43] Fix dat loading issue with 10.00 & minor outfit window fix. --- .../game_combatcontrols/combatcontrols.lua | 3 ++- .../game_market/ui/general/marketbuttons.otui | 5 ----- modules/game_outfit/outfit.lua | 20 +++++++++---------- src/client/thingtype.cpp | 4 ++-- 4 files changed, 13 insertions(+), 19 deletions(-) diff --git a/modules/game_combatcontrols/combatcontrols.lua b/modules/game_combatcontrols/combatcontrols.lua index 85b4d02f..3e5b952c 100644 --- a/modules/game_combatcontrols/combatcontrols.lua +++ b/modules/game_combatcontrols/combatcontrols.lua @@ -15,7 +15,8 @@ fightModeRadioGroup = nil pvpModeRadioGroup = nil function init() - combatControlsButton = modules.client_topmenu.addRightGameToggleButton('combatControlsButton', tr('Combat Controls'), '/images/topbuttons/combatcontrols', toggle) + combatControlsButton = modules.client_topmenu.addRightGameToggleButton('combatControlsButton', + tr('Combat Controls'), '/images/topbuttons/combatcontrols', toggle) combatControlsButton:setOn(true) combatControlsWindow = g_ui.loadUI('combatcontrols', modules.game_interface.getRightPanel()) combatControlsWindow:disableResize() diff --git a/modules/game_market/ui/general/marketbuttons.otui b/modules/game_market/ui/general/marketbuttons.otui index 042269bc..ae61cadb 100644 --- a/modules/game_market/ui/general/marketbuttons.otui +++ b/modules/game_market/ui/general/marketbuttons.otui @@ -4,14 +4,9 @@ MarketButtonBox < ButtonBoxRounded size: 106 22 text-offset: 0 2 text-align: center - image-clip: 0 0 20 20 image-border: 2 - $hover !disabled: - image-clip: 0 20 20 20 - $checked: - image-clip: 0 40 20 20 color: white $disabled: diff --git a/modules/game_outfit/outfit.lua b/modules/game_outfit/outfit.lua index b9eab509..caaf642a 100644 --- a/modules/game_outfit/outfit.lua +++ b/modules/game_outfit/outfit.lua @@ -25,13 +25,17 @@ mountCreature = nil currentMount = 1 function init() - connect(g_game, { onOpenOutfitWindow = create, - onGameEnd = destroy }) + connect(g_game, { + onOpenOutfitWindow = create, + onGameEnd = destroy + }) end function terminate() - disconnect(g_game, { onOpenOutfitWindow = create, - onGameEnd = destroy }) + disconnect(g_game, { + onOpenOutfitWindow = create, + onGameEnd = destroy + }) destroy() end @@ -300,17 +304,11 @@ function updateOutfit() addon.widget:setChecked(false) addon.widget:setEnabled(false) end + outfit.addons = 0 if availableAddons > 0 then for _, i in pairs(ADDON_SETS[availableAddons]) do addons[i].widget:setEnabled(true) - end - end - - outfit.addons = 0 - for i = 1, #prevAddons do - local addon = prevAddons[i] - if addon and addons[i].widget:isEnabled() then addons[i].widget:setChecked(true) end end diff --git a/src/client/thingtype.cpp b/src/client/thingtype.cpp index b0524e74..b19e50d3 100644 --- a/src/client/thingtype.cpp +++ b/src/client/thingtype.cpp @@ -58,7 +58,7 @@ void ThingType::serialize(const FileStreamPtr& fin) attr = ThingAttrWritable; else if(attr >= ThingAttrWritable) attr += 1; - } else if(g_game.getClientVersion() >= 1010) { + } else if(g_game.getClientVersion() >= 1000) { if(attr == ThingAttrNoMoveAnimation) attr = 16; else if(attr >= ThingAttrPickupable) @@ -153,7 +153,7 @@ void ThingType::unserialize(uint16 clientId, ThingCategory category, const FileS break; } - if(g_game.getClientVersion() >= 1010) { + if(g_game.getClientVersion() >= 1000) { /* In 10.10+ all attributes from 16 and up were * incremented by 1 to make space for 16 as * "No Movement Animation" flag. From 50c36bb2ba39f6028d2f438db446c1a91ff9f21e Mon Sep 17 00:00:00 2001 From: TheSumm Date: Tue, 30 Dec 2014 16:40:03 +0100 Subject: [PATCH 05/43] Fix for adventurer blessing style --- modules/game_inventory/inventory.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/game_inventory/inventory.lua b/modules/game_inventory/inventory.lua index 9cafb6c1..1dcc7c05 100644 --- a/modules/game_inventory/inventory.lua +++ b/modules/game_inventory/inventory.lua @@ -81,7 +81,7 @@ function refresh() else onInventoryChange(player, i, nil) end - toggleAdventurerStyle(Bit.hasBit(player:getBlessings(), Blessings.Adventurer)) + toggleAdventurerStyle(player and Bit.hasBit(player:getBlessings(), Blessings.Adventurer) or false) end purseButton:setVisible(g_game.getFeature(GamePurseSlot)) From 4b7770361ddcf707665b48407a4bbf2ead3c7c69 Mon Sep 17 00:00:00 2001 From: TheSumm Date: Tue, 30 Dec 2014 19:25:20 +0100 Subject: [PATCH 06/43] Fix parseLogin packet --- src/client/const.h | 3 ++- src/client/protocolcodes.cpp | 2 +- src/client/protocolgameparse.cpp | 7 +++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/client/const.h b/src/client/const.h index dd36caf9..902cb7d5 100644 --- a/src/client/const.h +++ b/src/client/const.h @@ -329,7 +329,8 @@ namespace Otc MessageRVRAnswer = 47, MessageRVRContinue = 48, MessageGameHighlight = 49, - LastMessage = 50, + MessageNpcFromStartBlock = 50, + LastMessage = 51, MessageInvalid = 255 }; diff --git a/src/client/protocolcodes.cpp b/src/client/protocolcodes.cpp index 134e24d2..865f8864 100644 --- a/src/client/protocolcodes.cpp +++ b/src/client/protocolcodes.cpp @@ -40,7 +40,7 @@ void buildMessageModesMap(int version) { messageModesMap[Otc::MessageChannel] = 7; messageModesMap[Otc::MessageChannelHighlight] = 8; messageModesMap[Otc::MessageSpell] = 9; - //NpcFromStartBlock = 10 + messageModesMap[Otc::MessageNpcFromStartBlock] = 10; messageModesMap[Otc::MessageNpcFrom] = 11; messageModesMap[Otc::MessageNpcTo] = 12; messageModesMap[Otc::MessageGamemasterBroadcast] = 13; diff --git a/src/client/protocolgameparse.cpp b/src/client/protocolgameparse.cpp index a07c766b..0fd626cc 100644 --- a/src/client/protocolgameparse.cpp +++ b/src/client/protocolgameparse.cpp @@ -385,8 +385,11 @@ void ProtocolGame::parseLogin(const InputMessagePtr& msg) } bool canReportBugs = msg->getU8(); - msg->getU8(); // can change pvp framing option - msg->getU8(); // expert mode enabled + if(g_game.getClientVersion() >= 1053) + msg->getU8(); // can change pvp frame option + + if(g_game.getClientVersion() >= 1058) + msg->getU8(); // expert mode enabled m_localPlayer->setId(playerId); g_game.setServerBeat(serverBeat); From bf30fc0dc3fbc6d7806111c4a01b7141d22089ec Mon Sep 17 00:00:00 2001 From: Konrad Date: Tue, 6 Jan 2015 18:23:36 +0100 Subject: [PATCH 07/43] Add QEZC for diagonal walking as well as broadcast/red talk for gamemasters --- modules/game_console/console.lua | 33 +++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/modules/game_console/console.lua b/modules/game_console/console.lua index 63c3ab47..f19db151 100644 --- a/modules/game_console/console.lua +++ b/modules/game_console/console.lua @@ -3,7 +3,7 @@ SpeakTypesSettings = { say = { speakType = MessageModes.Say, color = '#FFFF00' }, whisper = { speakType = MessageModes.Whisper, color = '#FFFF00' }, yell = { speakType = MessageModes.Yell, color = '#FFFF00' }, - broadcast = { speakType = MessageModes.GamemasterPrivateFrom, color = '#F55E5E' }, + broadcast = { speakType = MessageModes.GamemasterBroadcast, color = '#F55E5E' }, private = { speakType = MessageModes.PrivateTo, color = '#5FF7F7', private = true }, privateRed = { speakType = MessageModes.GamemasterTo, color = '#F55E5E', private = true }, privatePlayerToPlayer = { speakType = MessageModes.PrivateTo, color = '#9F9DFD', private = true }, @@ -164,11 +164,17 @@ function enableChat() g_keyboard.unbindKeyUp("Space") g_keyboard.unbindKeyUp("Enter") + g_keyboard.unbindKeyUp("Escape") gameInterface.unbindWalkKey("W") gameInterface.unbindWalkKey("D") gameInterface.unbindWalkKey("S") gameInterface.unbindWalkKey("A") + + gameInterface.unbindWalkKey("E") + gameInterface.unbindWalkKey("Q") + gameInterface.unbindWalkKey("C") + gameInterface.unbindWalkKey("Z") consoleToggleChat:setTooltip(tr("Disable chat mode, allow to walk using ASDW")) end @@ -187,11 +193,17 @@ function disableChat() end g_keyboard.bindKeyUp("Space", quickFunc) g_keyboard.bindKeyUp("Enter", quickFunc) + g_keyboard.bindKeyUp("Escape", quickFunc) gameInterface.bindWalkKey("W", North) gameInterface.bindWalkKey("D", East) gameInterface.bindWalkKey("S", South) gameInterface.bindWalkKey("A", West) + + gameInterface.bindWalkKey("E", NorthEast) + gameInterface.bindWalkKey("Q", NorthWest) + gameInterface.bindWalkKey("C", SouthEast) + gameInterface.bindWalkKey("Z", SouthWest) consoleToggleChat:setTooltip(tr("Enable chat mode")) end @@ -687,7 +699,7 @@ function sendMessage(message, tab) end -- player used whisper - local chatCommandMessage = message:match("^%#[w|W] (.*)") + chatCommandMessage = message:match("^%#[w|W] (.*)") if chatCommandMessage ~= nil then chatCommandSayMode = 'whisper' message = chatCommandMessage @@ -695,12 +707,27 @@ function sendMessage(message, tab) end -- player say - local chatCommandMessage = message:match("^%#[s|S] (.*)") + chatCommandMessage = message:match("^%#[s|S] (.*)") if chatCommandMessage ~= nil then chatCommandSayMode = 'say' message = chatCommandMessage channel = 0 end + + -- player red talk on channel + chatCommandMessage = message:match("^%#[c|C] (.*)") + if chatCommandMessage ~= nil then + chatCommandSayMode = 'channelRed' + message = chatCommandMessage + end + + -- player broadcast + chatCommandMessage = message:match("^%#[b|B] (.*)") + if chatCommandMessage ~= nil then + chatCommandSayMode = 'broadcast' + message = chatCommandMessage + channel = 0 + end local findIni, findEnd, chatCommandInitial, chatCommandPrivate, chatCommandEnd, chatCommandMessage = message:find("([%*%@])(.+)([%*%@])(.*)") if findIni ~= nil and findIni == 1 then -- player used private chat command From 24b1526534abe99df25127e5e3f42c57d458b2c0 Mon Sep 17 00:00:00 2001 From: TheSumm Date: Sun, 11 Jan 2015 18:50:35 +0100 Subject: [PATCH 08/43] Fixed sending wrong OS --- modules/client_entergame/entergame.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/client_entergame/entergame.lua b/modules/client_entergame/entergame.lua index f2ea913e..d7a4119a 100644 --- a/modules/client_entergame/entergame.lua +++ b/modules/client_entergame/entergame.lua @@ -246,9 +246,9 @@ function EnterGame.doLogin() EnterGame.show() end }) - g_game.chooseRsa(G.host) g_game.setClientVersion(clientVersion) g_game.setProtocolVersion(g_game.getClientProtocolVersion(clientVersion)) + g_game.chooseRsa(G.host) if modules.game_things.isLoaded() then protocolLogin:login(G.host, G.port, G.account, G.password) From ddec9627b859431d48837b8535912992f791e1a1 Mon Sep 17 00:00:00 2001 From: TheSumm Date: Sun, 18 Jan 2015 15:14:07 +0100 Subject: [PATCH 09/43] Protocol 10.72 (Authenticator) Support, Unjustified Points diplay - Unjustified Points (Better topbar icon would be nice) ![Unjustified Points](http://i.gyazo.com/81286f46d9b4d56b3fe864140173cf34.png) - Authenticator token support - adjusted 'can change pvp frame' to 1054 - ... --- data/images/game/skull_socket.png | Bin 0 -> 338 bytes data/images/topbuttons/unjustifiedpoints.png | Bin 0 -> 421 bytes modules/client_entergame/characterlist.lua | 14 +- modules/client_entergame/characterlist.otui | 6 +- modules/client_entergame/entergame.lua | 60 +++++++- modules/client_entergame/entergame.otui | 22 ++- modules/game_interface/interface.otmod | 1 + .../unjustifiedpoints.lua | 135 ++++++++++++++++++ .../unjustifiedpoints.otmod | 8 ++ .../unjustifiedpoints.otui | 80 +++++++++++ modules/gamelib/const.lua | 2 + modules/gamelib/creature.lua | 7 + modules/gamelib/game.lua | 2 +- modules/gamelib/protocollogin.lua | 37 ++++- src/client/const.h | 2 + src/client/game.cpp | 47 +++++- src/client/game.h | 33 ++++- src/client/luafunctions.cpp | 4 + src/client/luavaluecasts.cpp | 42 ++++++ src/client/luavaluecasts.h | 4 + src/client/protocolcodes.h | 1 + src/client/protocolgame.cpp | 3 +- src/client/protocolgame.h | 4 +- src/client/protocolgameparse.cpp | 39 +++-- src/client/protocolgamesend.cpp | 3 + 25 files changed, 525 insertions(+), 31 deletions(-) create mode 100644 data/images/game/skull_socket.png create mode 100644 data/images/topbuttons/unjustifiedpoints.png create mode 100644 modules/game_unjustifiedpoints/unjustifiedpoints.lua create mode 100644 modules/game_unjustifiedpoints/unjustifiedpoints.otmod create mode 100644 modules/game_unjustifiedpoints/unjustifiedpoints.otui diff --git a/data/images/game/skull_socket.png b/data/images/game/skull_socket.png new file mode 100644 index 0000000000000000000000000000000000000000..a2d30e2d65d30ea88e973a0837277cfe8e924975 GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4uAB#T}@sR2@KN#5=*4A~&q>6~Z;6yYrJh%9Dc z;1&j9Muu5)B!GhKC7!;n?DrXk7!@S)pQYFWh3mq)y?*lf%aZ96R5(LJJDGl1$Sr;Ud$!Z8Wm8f$51jY? zeEg^H$!%{9`!CgPpMLbw%U9EE&Odcxx{-HZg`>$>u`ju6(S*(F|4l7V8zo1I^*s)_ d{?+xo_-RFBUk_s@8K74gJYD@<);T3K0RTv*gKz)< literal 0 HcmV?d00001 diff --git a/data/images/topbuttons/unjustifiedpoints.png b/data/images/topbuttons/unjustifiedpoints.png new file mode 100644 index 0000000000000000000000000000000000000000..67245fa61ef796623cc8a5c183db1eda644bce9d GIT binary patch literal 421 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhjKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=fm(z?n2}-D90{Nxdx@v7EBhTrHc?3p*6M_ZKvPsbT^vIsE|*?3 z^p0i}Ir{N_HH(U-M`2H}QCW7gz`=&e@(VPrI_4`a?RFO5@4TCB;jSGPEj^Jf&lB1l zthd@!II*=)aq5hHRGN__&-%XR-OlfS{3l&Cx-f71VdKeHH?e4GKfM0&#%i1A4;ydx zTP*l3qHs3w$^dy#z7WUKK3}zb4{TF-V#)D6nO6UD-fA^`qhM-^VICWB)|$3QLGuZ*65=JY|_kYyaJK{1q2p zUdZ`%<-NUXYe$&&KEaJUCG$HYqPu^7(sc= 1072) +end + function EnterGame.doLogin() G.account = enterGame:getChildById('accountNameTextEdit'):getText() G.password = enterGame:getChildById('accountPasswordTextEdit'):getText() + G.authenticatorToken = enterGame:getChildById('authenticatorTokenTextEdit'):getText() G.host = enterGame:getChildById('serverHostTextEdit'):getText() G.port = tonumber(enterGame:getChildById('serverPortTextEdit'):getText()) local clientVersion = tonumber(clientBox:getText()) @@ -251,7 +296,7 @@ function EnterGame.doLogin() g_game.chooseRsa(G.host) if modules.game_things.isLoaded() then - protocolLogin:login(G.host, G.port, G.account, G.password) + protocolLogin:login(G.host, G.port, G.account, G.password, G.authenticatorToken) else loadBox:destroy() loadBox = nil @@ -272,6 +317,7 @@ function EnterGame.setDefaultServer(host, port, protocol) local clientLabel = enterGame:getChildById('clientLabel') local accountTextEdit = enterGame:getChildById('accountNameTextEdit') local passwordTextEdit = enterGame:getChildById('accountPasswordTextEdit') + local authenticatorTokenTextEdit = enterGame:getChildById('authenticatorTokenTextEdit') if hostTextEdit:getText() ~= host then hostTextEdit:setText(host) @@ -279,6 +325,7 @@ function EnterGame.setDefaultServer(host, port, protocol) clientBox:setCurrentOption(protocol) accountTextEdit:setText('') passwordTextEdit:setText('') + authenticatorTokenTextEdit:setText('') end end @@ -291,6 +338,13 @@ function EnterGame.setUniqueServer(host, port, protocol, windowWidth, windowHeig portTextEdit:setText(port) portTextEdit:setVisible(false) portTextEdit:setHeight(0) + local authenticatorTokenTextEdit = enterGame:getChildById('authenticatorTokenTextEdit') + authenticatorTokenTextEdit:setText('') + authenticatorTokenTextEdit:setVisible(false) + authenticatorTokenTextEdit:setHeight(0) + local authenticatorTokenLabel = enterGame:getChildById('authenticatorTokenLabel') + authenticatorTokenLabel:setVisible(false) + authenticatorTokenLabel:setHeight(0) clientBox:setCurrentOption(protocol) clientBox:setVisible(false) @@ -312,7 +366,7 @@ function EnterGame.setUniqueServer(host, port, protocol, windowWidth, windowHeig serverListButton:setWidth(0) local rememberPasswordBox = enterGame:getChildById('rememberPasswordBox') - rememberPasswordBox:setMarginTop(-5) + rememberPasswordBox:setMarginTop(-14) if not windowWidth then windowWidth = 236 end enterGame:setWidth(windowWidth) diff --git a/modules/client_entergame/entergame.otui b/modules/client_entergame/entergame.otui index 52c60e01..debb0ea9 100644 --- a/modules/client_entergame/entergame.otui +++ b/modules/client_entergame/entergame.otui @@ -21,6 +21,8 @@ ServerListButton < UIButton EnterGameWindow id: enterGame + &authenticatorEnabled: false + &authenticatorHeight: 44 @onEnter: EnterGame.doLogin() MenuLabel @@ -50,12 +52,30 @@ EnterGameWindow anchors.top: prev.bottom margin-top: 2 + MenuLabel + id: authenticatorTokenLabel + !text: tr('Authenticator Token') + anchors.left: prev.left + anchors.top: prev.bottom + text-auto-resize: true + margin-top: 8 + visible: false + + TextEdit + id: authenticatorTokenTextEdit + anchors.left: parent.left + anchors.right: parent.right + anchors.top: prev.bottom + margin-top: 2 + visible: false + max-length: 8 + MenuLabel id: serverLabel !text: tr('Server') anchors.left: prev.left anchors.top: prev.bottom - margin-top: 8 + margin-top: -36 text-auto-resize: true ServerListButton diff --git a/modules/game_interface/interface.otmod b/modules/game_interface/interface.otmod index 91f0973c..bdb40fd4 100644 --- a/modules/game_interface/interface.otmod +++ b/modules/game_interface/interface.otmod @@ -30,5 +30,6 @@ Module - game_spelllist - game_cooldown - game_modaldialog + - game_unjustifiedpoints @onLoad: init() @onUnload: terminate() diff --git a/modules/game_unjustifiedpoints/unjustifiedpoints.lua b/modules/game_unjustifiedpoints/unjustifiedpoints.lua new file mode 100644 index 00000000..ad01e15d --- /dev/null +++ b/modules/game_unjustifiedpoints/unjustifiedpoints.lua @@ -0,0 +1,135 @@ +unjustifiedPointsWindow = nil +unjustifiedPointsButton = nil +contentsPanel = nil + +openPvpSituationsLabel = nil +currentSkullWidget = nil +skullTimeLabel = nil + +dayProgressBar = nil +weekProgressBar = nil +monthProgressBar = nil + +daySkullWidget = nil +weekSkullWidget = nil +monthSkullWidget = nil + +function init() + connect(g_game, { onGameStart = online, + onUnjustifiedPointsChange = onUnjustifiedPointsChange, + onOpenPvpSituationsChange = onOpenPvpSituationsChange }) + connect(LocalPlayer, { onSkullChange = onSkullChange } ) + + unjustifiedPointsButton = modules.client_topmenu.addRightGameToggleButton('unjustifiedPointsButton', + tr('Unjustified Points'), '/images/topbuttons/unjustifiedpoints', toggle) + unjustifiedPointsButton:setOn(true) + unjustifiedPointsButton:hide() + + unjustifiedPointsWindow = g_ui.loadUI('unjustifiedpoints', modules.game_interface.getRightPanel()) + unjustifiedPointsWindow:disableResize() + unjustifiedPointsWindow:setup() + + contentsPanel = unjustifiedPointsWindow:getChildById('contentsPanel') + + openPvpSituationsLabel = contentsPanel:getChildById('openPvpSituationsLabel') + currentSkullWidget = contentsPanel:getChildById('currentSkullWidget') + skullTimeLabel = contentsPanel:getChildById('skullTimeLabel') + + dayProgressBar = contentsPanel:getChildById('dayProgressBar') + weekProgressBar = contentsPanel:getChildById('weekProgressBar') + monthProgressBar = contentsPanel:getChildById('monthProgressBar') + daySkullWidget = contentsPanel:getChildById('daySkullWidget') + weekSkullWidget = contentsPanel:getChildById('weekSkullWidget') + monthSkullWidget = contentsPanel:getChildById('monthSkullWidget') + + if g_game.isOnline() then + online() + end +end + +function terminate() + disconnect(g_game, { onGameStart = online, + onUnjustifiedPointsChange = onUnjustifiedPointsChange, + onOpenPvpSituationsChange = onOpenPvpSituationsChange }) + disconnect(LocalPlayer, { onSkullChange = onSkullChange } ) + + unjustifiedPointsWindow:destroy() + unjustifiedPointsButton:destroy() +end + +function onMiniWindowClose() + unjustifiedPointsButton:setOn(false) +end + +function toggle() + if unjustifiedPointsButton:isOn() then + unjustifiedPointsWindow:close() + unjustifiedPointsButton:setOn(false) + else + unjustifiedPointsWindow:open() + unjustifiedPointsButton:setOn(true) + end +end + +function online() + if g_game.getFeature(GameUnjustifiedPoints) then + unjustifiedPointsButton:show() + else + unjustifiedPointsButton:hide() + unjustifiedPointsWindow:close() + end + + refresh() +end + +function refresh() + local localPlayer = g_game.getLocalPlayer() + + local unjustifiedPoints = g_game.getUnjustifiedPoints() + onUnjustifiedPointsChange(unjustifiedPoints) + + onSkullChange(localPlayer, localPlayer:getSkull()) + onOpenPvpSituationsChange(g_game.getOpenPvpSituations()) +end + +function onSkullChange(localPlayer, skull) + if not localPlayer:isLocalPlayer() then return end + + if skull == SkullRed or skull == SkullBlack then + currentSkullWidget:setIcon(getSkullImagePath(skull)) + currentSkullWidget:setTooltip('Remaining skull time') + else + currentSkullWidget:setIcon('') + currentSkullWidget:setTooltip('You have no skull') + end + + daySkullWidget:setIcon(getSkullImagePath(getNextSkullId(skull))) + weekSkullWidget:setIcon(getSkullImagePath(getNextSkullId(skull))) + monthSkullWidget:setIcon(getSkullImagePath(getNextSkullId(skull))) +end + +function onOpenPvpSituationsChange(amount) + openPvpSituationsLabel:setText(amount) +end + +function onUnjustifiedPointsChange(unjustifiedPoints) + if unjustifiedPoints.skullTime == 0 then + skullTimeLabel:setText('No skull') + skullTimeLabel:setTooltip('You have no skull') + else + skullTimeLabel:setText(unjustifiedPoints.skullTime .. ' days') + skullTimeLabel:setTooltip('Remaining skull time') + end + + dayProgressBar:setValue(unjustifiedPoints.killsDay, 0, 100) + dayProgressBar:setTooltip(string.format('Unjustified points gained during the last 24 hours.\n%i kills left.', unjustifiedPoints.killsDayRemaining)) + dayProgressBar:setText(unjustifiedPoints.killsDayRemaining .. ' kills left') + + weekProgressBar:setValue(unjustifiedPoints.killsWeek, 0, 100) + weekProgressBar:setTooltip(string.format('Unjustified points gained during the last 7 days.\n%i kills left.', unjustifiedPoints.killsWeekRemaining)) + weekProgressBar:setText(unjustifiedPoints.killsWeekRemaining .. ' kills left') + + monthProgressBar:setValue(unjustifiedPoints.killsMonth, 0, 100) + monthProgressBar:setTooltip(string.format('Unjustified points gained during the last 30 days.\n%i kills left.', unjustifiedPoints.killsMonthRemaining)) + monthProgressBar:setText(unjustifiedPoints.killsMonthRemaining .. ' kills left') +end diff --git a/modules/game_unjustifiedpoints/unjustifiedpoints.otmod b/modules/game_unjustifiedpoints/unjustifiedpoints.otmod new file mode 100644 index 00000000..178a414d --- /dev/null +++ b/modules/game_unjustifiedpoints/unjustifiedpoints.otmod @@ -0,0 +1,8 @@ +Module + name: game_unjustifiedpoints + description: View unjustified points + author: Summ + sandboxed: true + scripts: [ unjustifiedpoints ] + @onLoad: init() + @onUnload: terminate() diff --git a/modules/game_unjustifiedpoints/unjustifiedpoints.otui b/modules/game_unjustifiedpoints/unjustifiedpoints.otui new file mode 100644 index 00000000..dc052464 --- /dev/null +++ b/modules/game_unjustifiedpoints/unjustifiedpoints.otui @@ -0,0 +1,80 @@ +SkullProgressBar < ProgressBar + height: 13 + margin: 4 18 0 10 + anchors.top: prev.bottom + anchors.left: parent.left + anchors.right: parent.right + +SkullWidget < UIWidget + size: 13 13 + margin-right: 2 + anchors.right: parent.right + image-source: /images/game/skull_socket + +MiniWindow + id: unjustifiedPointsWindow + !text: tr('Unjustified Points') + height: 114 + icon: /images/topbuttons/unjustifiedpoints + @onClose: modules.game_unjustifiedpoints.onMiniWindowClose() + &save: true + + MiniWindowContents + Label + anchors.top: parent.top + anchors.left: parent.left + !text: tr('Open PvP') + !tooltip: tr('Open PvP Situations') + phantom: false + margin-top: 2 + margin-left: 10 + + Label + id: openPvpSituationsLabel + anchors.top: prev.bottom + anchors.left: parent.left + font: verdana-11px-rounded + margin-left: 12 + phantom: false + + Label + anchors.top: parent.top + anchors.right: parent.right + !text: tr('Skull Time') + margin-top: 2 + margin-right: 10 + + SkullWidget + id: currentSkullWidget + anchors.top: prev.bottom + margin-right: 10 + + Label + id: skullTimeLabel + anchors.top: prev.top + anchors.right: prev.left + font: verdana-11px-rounded + margin-right: 6 + phantom: false + + SkullProgressBar + id: dayProgressBar + margin-top: 10 + + SkullWidget + id: daySkullWidget + anchors.top: prev.top + + SkullProgressBar + id: weekProgressBar + + SkullWidget + id: weekSkullWidget + anchors.top: prev.top + + SkullProgressBar + id: monthProgressBar + + SkullWidget + id: monthSkullWidget + anchors.top: prev.top diff --git a/modules/gamelib/const.lua b/modules/gamelib/const.lua index 16f1cfaf..a27b1fa4 100644 --- a/modules/gamelib/const.lua +++ b/modules/gamelib/const.lua @@ -127,6 +127,8 @@ GameLoginPacketEncryption = 63 GameClientVersion = 64 GameContentRevision = 65 GameExperienceBonus = 66 +GameAuthenticator = 67 +GameUnjustifiedPoints = 68 TextColors = { red = '#f55e5e', --'#c83200' diff --git a/modules/gamelib/creature.lua b/modules/gamelib/creature.lua index 5a734008..382c468c 100644 --- a/modules/gamelib/creature.lua +++ b/modules/gamelib/creature.lua @@ -35,6 +35,13 @@ NpcIconTradeQuest = 4 -- @} +function getNextSkullId(skullId) + if skullId == SkullRed or skullId == SkullBlack then + return SkullBlack + end + return SkullRed +end + function getSkullImagePath(skullId) local path if skullId == SkullYellow then diff --git a/modules/gamelib/game.lua b/modules/gamelib/game.lua index cc283d38..cc273b54 100644 --- a/modules/gamelib/game.lua +++ b/modules/gamelib/game.lua @@ -74,7 +74,7 @@ function g_game.getSupportedClients() 1040, 1041, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, - 1063, 1064, 1070, 1071 + 1063, 1064, 1070, 1071, 1072 } end diff --git a/modules/gamelib/protocollogin.lua b/modules/gamelib/protocollogin.lua index e3d20630..5d107eca 100644 --- a/modules/gamelib/protocollogin.lua +++ b/modules/gamelib/protocollogin.lua @@ -2,13 +2,15 @@ ProtocolLogin = extends(Protocol, "ProtocolLogin") LoginServerError = 10 +LoginServerTokenSuccess = 12 +LoginServerTokenError = 13 LoginServerUpdate = 17 LoginServerMotd = 20 LoginServerUpdateNeeded = 30 LoginServerCharacterList = 100 LoginServerExtendedCharacterList = 101 -function ProtocolLogin:login(host, port, accountName, accountPassword) +function ProtocolLogin:login(host, port, accountName, accountPassword, authenticatorToken) if string.len(host) == 0 or port == nil or port == 0 then signalcall(self.onLoginError, self, tr("You must enter a valid server address and port.")) return @@ -16,6 +18,7 @@ function ProtocolLogin:login(host, port, accountName, accountPassword) self.accountName = accountName self.accountPassword = accountPassword + self.authenticatorToken = authenticatorToken self.connectCallback = self.sendLoginPacket self:connect(host, port) @@ -78,7 +81,10 @@ function ProtocolLogin:sendLoginPacket() local paddingBytes = g_crypt.rsaGetSize() - (msg:getMessageSize() - offset) assert(paddingBytes >= 0) - msg:addPaddingBytes(paddingBytes, 0) + for i = 1, paddingBytes do + msg:addU8(math.random(0, 0xff)) + end + if g_game.getFeature(GameLoginPacketEncryption) then msg:encryptRsa() end @@ -86,10 +92,32 @@ function ProtocolLogin:sendLoginPacket() if g_game.getFeature(GameOGLInformation) then msg:addU8(1) --unknown msg:addU8(1) --unknown - msg:addString(g_graphics.getRenderer()) + + if g_game.getClientVersion() >= 1072 then + msg:addString(string.format('%s %s', g_graphics.getVendor(), g_graphics.getRenderer())) + else + msg:addString(g_graphics.getRenderer()) + end msg:addString(g_graphics.getVersion()) end + -- add RSA encrypted auth token + if g_game.getFeature(GameAuthenticator) then + offset = msg:getMessageSize() + + -- first RSA byte must be 0 + msg:addU8(0) + msg:addString(self.authenticatorToken) + + paddingBytes = g_crypt.rsaGetSize() - (msg:getMessageSize() - offset) + assert(paddingBytes >= 0) + for i = 1, paddingBytes do + msg:addU8(math.random(0, 0xff)) + end + + msg:encryptRsa() + end + if g_game.getFeature(GameProtocolChecksum) then self:enableChecksum() end @@ -116,6 +144,9 @@ function ProtocolLogin:onRecv(msg) self:parseMotd(msg) elseif opcode == LoginServerUpdateNeeded then signalcall(self.onLoginError, self, tr("Client needs update.")) + elseif opcode == LoginServerTokenError then + -- TODO: prompt for token here + signalcall(self.onLoginError, self, tr("Invalid authentification token.")) elseif opcode == LoginServerCharacterList then self:parseCharacterList(msg) elseif opcode == LoginServerExtendedCharacterList then diff --git a/src/client/const.h b/src/client/const.h index 902cb7d5..18ffa33b 100644 --- a/src/client/const.h +++ b/src/client/const.h @@ -399,6 +399,8 @@ namespace Otc GameClientVersion = 64, GameContentRevision = 65, GameExperienceBonus = 66, + GameAuthenticator = 67, + GameUnjustifiedPoints = 68, LastGameFeature = 101 }; diff --git a/src/client/game.cpp b/src/client/game.cpp index dde46699..fe133e3f 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -84,6 +84,7 @@ void Game::resetGameStates() m_localPlayer = nullptr; m_pingSent = 0; m_pingReceived = 0; + m_unjustifiedPoints = UnjustifiedPoints(); for(auto& it : m_containers) { const ContainerPtr& container = it.second; @@ -155,6 +156,11 @@ void Game::processLoginWait(const std::string& message, int time) g_lua.callGlobalField("g_game", "onLoginWait", message, time); } +void Game::processLoginToken(bool unknown) +{ + g_lua.callGlobalField("g_game", "onLoginToken", unknown); +} + void Game::processLogin() { g_lua.callGlobalField("g_game", "onLogin"); @@ -528,7 +534,7 @@ void Game::processWalkCancel(Otc::Direction direction) m_localPlayer->cancelWalk(direction); } -void Game::loginWorld(const std::string& account, const std::string& password, const std::string& worldName, const std::string& worldHost, int worldPort, const std::string& characterName) +void Game::loginWorld(const std::string& account, const std::string& password, const std::string& worldName, const std::string& worldHost, int worldPort, const std::string& characterName, const std::string& authenticatorToken) { if(m_protocolGame || isOnline()) stdext::throw_exception("Unable to login into a world while already online or logging."); @@ -543,7 +549,7 @@ void Game::loginWorld(const std::string& account, const std::string& password, c m_localPlayer->setName(characterName); m_protocolGame = ProtocolGamePtr(new ProtocolGame); - m_protocolGame->login(account, password, worldHost, (uint16)worldPort, characterName); + m_protocolGame->login(account, password, worldHost, (uint16)worldPort, characterName, authenticatorToken); m_characterName = characterName; m_worldName = worldName; } @@ -1204,6 +1210,31 @@ void Game::setPVPMode(Otc::PVPModes pvpMode) g_lua.callGlobalField("g_game", "onPVPModeChange", pvpMode); } +void Game::setUnjustifiedPoints(UnjustifiedPoints unjustifiedPoints) +{ + if(!canPerformGameAction()) + return; + if(!getFeature(Otc::GameUnjustifiedPoints)) + return; + if(m_unjustifiedPoints == unjustifiedPoints) + return; + + m_unjustifiedPoints = unjustifiedPoints; + g_lua.callGlobalField("g_game", "onUnjustifiedPointsChange", unjustifiedPoints); +} + +void Game::setOpenPvpSituations(int openPvpSituations) +{ + if(!canPerformGameAction()) + return; + if(m_openPvpSituations == openPvpSituations) + return; + + m_openPvpSituations = openPvpSituations; + g_lua.callGlobalField("g_game", "onOpenPvpSituationsChange", openPvpSituations); +} + + void Game::inspectNpcTrade(const ItemPtr& item) { if(!canPerformGameAction() || !item) @@ -1425,7 +1456,7 @@ void Game::setProtocolVersion(int version) if(isOnline()) stdext::throw_exception("Unable to change protocol version while online"); - if(version != 0 && (version < 740 || version > 1071)) + if(version != 0 && (version < 740 || version > 1072)) stdext::throw_exception(stdext::format("Protocol version %d not supported", version)); m_protocolVersion = version; @@ -1443,7 +1474,7 @@ void Game::setClientVersion(int version) if(isOnline()) stdext::throw_exception("Unable to change client version while online"); - if(version != 0 && (version < 740 || version > 1071)) + if(version != 0 && (version < 740 || version > 1072)) stdext::throw_exception(stdext::format("Client version %d not supported", version)); m_features.reset(); @@ -1563,6 +1594,10 @@ void Game::setClientVersion(int version) enableFeature(Otc::GameEnhancedAnimations); } + if(version >= 1053) { + enableFeature(Otc::GameUnjustifiedPoints); + } + if(version >= 1054) { enableFeature(Otc::GameExperienceBonus); } @@ -1575,6 +1610,10 @@ void Game::setClientVersion(int version) enableFeature(Otc::GameContentRevision); } + if(version >= 1072) { + enableFeature(Otc::GameAuthenticator); + } + m_clientVersion = version; g_lua.callGlobalField("g_game", "onClientVersionChange", version); diff --git a/src/client/game.h b/src/client/game.h index 1bf3228f..8d3a6a9b 100644 --- a/src/client/game.h +++ b/src/client/game.h @@ -36,6 +36,25 @@ #include +struct UnjustifiedPoints { + bool operator==(const UnjustifiedPoints& other) { + return killsDay == other.killsDay && + killsDayRemaining == other.killsDayRemaining && + killsWeek == other.killsWeek && + killsWeekRemaining == other.killsWeekRemaining && + killsMonth == other.killsMonth && + killsMonthRemaining == other.killsMonthRemaining && + skullTime == other.skullTime; + } + uint8 killsDay; + uint8 killsDayRemaining; + uint8 killsWeek; + uint8 killsWeekRemaining; + uint8 killsMonth; + uint8 killsMonthRemaining; + uint8 skullTime; +}; + typedef std::tuple Vip; //@bindsingleton g_game @@ -60,6 +79,7 @@ protected: void processLoginError(const std::string& error); void processLoginAdvice(const std::string& message); void processLoginWait(const std::string& message, int time); + void processLoginToken(bool unknown); void processLogin(); void processPendingGame(); void processEnterGame(); @@ -139,7 +159,7 @@ protected: public: // login related - void loginWorld(const std::string& account, const std::string& password, const std::string& worldName, const std::string& worldHost, int worldPort, const std::string& characterName); + void loginWorld(const std::string& account, const std::string& password, const std::string& worldName, const std::string& worldHost, int worldPort, const std::string& characterName, const std::string& authenticatorToken); void cancelLogin(); void forceLogout(); void safeLogout(); @@ -218,6 +238,12 @@ public: bool isSafeFight() { return m_safeFight; } Otc::PVPModes getPVPMode() { return m_pvpMode; } + // pvp related + void setUnjustifiedPoints(UnjustifiedPoints unjustifiedPoints); + UnjustifiedPoints getUnjustifiedPoints() { return m_unjustifiedPoints; }; + void setOpenPvpSituations(int openPvpSitations); + int getOpenPvpSituations() { return m_openPvpSituations; } + // npc trade related void inspectNpcTrade(const ItemPtr& item); void buyItem(const ItemPtr& item, int amount, bool ignoreCapacity, bool buyWithBackpack); @@ -304,6 +330,8 @@ public: int getServerBeat() { return m_serverBeat; } void setCanReportBugs(bool enable) { m_canReportBugs = enable; } bool canReportBugs() { return m_canReportBugs; } + void setExpertPvpMode(bool enable) { m_expertPvpMode = enable; } + bool getExpertPvpMode() { return m_expertPvpMode; } LocalPlayerPtr getLocalPlayer() { return m_localPlayer; } ProtocolGamePtr getProtocolGame() { return m_protocolGame; } std::string getCharacterName() { return m_characterName; } @@ -333,6 +361,7 @@ private: bool m_online; bool m_denyBotCall; bool m_dead; + bool m_expertPvpMode; int m_serverBeat; ticks_t m_ping; uint m_pingSent; @@ -345,6 +374,8 @@ private: Otc::ChaseModes m_chaseMode; Otc::PVPModes m_pvpMode; Otc::Direction m_lastWalkDir; + UnjustifiedPoints m_unjustifiedPoints; + int m_openPvpSituations; bool m_safeFight; bool m_canReportBugs; std::vector m_gmActions; diff --git a/src/client/luafunctions.cpp b/src/client/luafunctions.cpp index f8cdcccb..e4f8b60f 100644 --- a/src/client/luafunctions.cpp +++ b/src/client/luafunctions.cpp @@ -238,6 +238,10 @@ void Client::registerLuaFunctions() g_lua.bindSingletonFunction("g_game", "getChaseMode", &Game::getChaseMode, &g_game); g_lua.bindSingletonFunction("g_game", "getFightMode", &Game::getFightMode, &g_game); g_lua.bindSingletonFunction("g_game", "getPVPMode", &Game::getPVPMode, &g_game); + g_lua.bindSingletonFunction("g_game", "setUnjustifiedPoints", &Game::setUnjustifiedPoints, &g_game); + g_lua.bindSingletonFunction("g_game", "getUnjustifiedPoints", &Game::getUnjustifiedPoints, &g_game); + g_lua.bindSingletonFunction("g_game", "setOpenPvpSituations", &Game::setOpenPvpSituations, &g_game); + g_lua.bindSingletonFunction("g_game", "getOpenPvpSituations", &Game::getOpenPvpSituations, &g_game); g_lua.bindSingletonFunction("g_game", "isSafeFight", &Game::isSafeFight, &g_game); g_lua.bindSingletonFunction("g_game", "inspectNpcTrade", &Game::inspectNpcTrade, &g_game); g_lua.bindSingletonFunction("g_game", "buyItem", &Game::buyItem, &g_game); diff --git a/src/client/luavaluecasts.cpp b/src/client/luavaluecasts.cpp index a4c4e524..c2041a9e 100644 --- a/src/client/luavaluecasts.cpp +++ b/src/client/luavaluecasts.cpp @@ -165,3 +165,45 @@ bool luavalue_cast(int index, Light& light) } return false; } + +int push_luavalue(const UnjustifiedPoints& unjustifiedPoints) +{ + g_lua.createTable(0, 7); + g_lua.pushInteger(unjustifiedPoints.killsDay); + g_lua.setField("killsDay"); + g_lua.pushInteger(unjustifiedPoints.killsDayRemaining); + g_lua.setField("killsDayRemaining"); + g_lua.pushInteger(unjustifiedPoints.killsWeek); + g_lua.setField("killsWeek"); + g_lua.pushInteger(unjustifiedPoints.killsWeekRemaining); + g_lua.setField("killsWeekRemaining"); + g_lua.pushInteger(unjustifiedPoints.killsMonth); + g_lua.setField("killsMonth"); + g_lua.pushInteger(unjustifiedPoints.killsMonthRemaining); + g_lua.setField("killsMonthRemaining"); + g_lua.pushInteger(unjustifiedPoints.skullTime); + g_lua.setField("skullTime"); + return 1; +} + +bool luavalue_cast(int index, UnjustifiedPoints& unjustifiedPoints) +{ + if(g_lua.isTable(index)) { + g_lua.getField("killsDay", index); + unjustifiedPoints.killsDay = g_lua.popInteger(); + g_lua.getField("killsDayRemaining", index); + unjustifiedPoints.killsDayRemaining = g_lua.popInteger(); + g_lua.getField("killsWeek", index); + unjustifiedPoints.killsWeek = g_lua.popInteger(); + g_lua.getField("killsWeekRemaining", index); + unjustifiedPoints.killsWeekRemaining = g_lua.popInteger(); + g_lua.getField("killsMonth", index); + unjustifiedPoints.killsMonth = g_lua.popInteger(); + g_lua.getField("killsMonthRemaining", index); + unjustifiedPoints.killsMonthRemaining = g_lua.popInteger(); + g_lua.getField("skullTime", index); + unjustifiedPoints.skullTime = g_lua.popInteger(); + return true; + } + return false; +} diff --git a/src/client/luavaluecasts.h b/src/client/luavaluecasts.h index 8d35b19b..d4548bfb 100644 --- a/src/client/luavaluecasts.h +++ b/src/client/luavaluecasts.h @@ -44,4 +44,8 @@ bool luavalue_cast(int index, MarketData& data); int push_luavalue(const Light& light); bool luavalue_cast(int index, Light& light); +// unjustified points +int push_luavalue(const UnjustifiedPoints& unjustifiedPoints); +bool luavalue_cast(int index, UnjustifiedPoints& unjustifiedPoints); + #endif diff --git a/src/client/protocolcodes.h b/src/client/protocolcodes.h index 69780587..26fda831 100644 --- a/src/client/protocolcodes.h +++ b/src/client/protocolcodes.h @@ -50,6 +50,7 @@ namespace Proto { GameServerLoginAdvice = 21, GameServerLoginWait = 22, GameServerLoginSuccess = 23, + GameServerLoginToken = 24, GameServerPingBack = 29, GameServerPing = 30, GameServerChallenge = 31, diff --git a/src/client/protocolgame.cpp b/src/client/protocolgame.cpp index 0d3ba266..bab30ef1 100644 --- a/src/client/protocolgame.cpp +++ b/src/client/protocolgame.cpp @@ -26,10 +26,11 @@ #include "item.h" #include "localplayer.h" -void ProtocolGame::login(const std::string& accountName, const std::string& accountPassword, const std::string& host, uint16 port, const std::string& characterName) +void ProtocolGame::login(const std::string& accountName, const std::string& accountPassword, const std::string& host, uint16 port, const std::string& characterName, const std::string& authenticatorToken) { m_accountName = accountName; m_accountPassword = accountPassword; + m_authenticatorToken = authenticatorToken; m_characterName = characterName; connect(host, port); diff --git a/src/client/protocolgame.h b/src/client/protocolgame.h index 7be5b44c..6d65e8f9 100644 --- a/src/client/protocolgame.h +++ b/src/client/protocolgame.h @@ -31,7 +31,7 @@ class ProtocolGame : public Protocol { public: - void login(const std::string& accountName, const std::string& accountPassword, const std::string& host, uint16 port, const std::string& characterName); + void login(const std::string& accountName, const std::string& accountPassword, const std::string& host, uint16 port, const std::string& characterName, const std::string& authenticatorToken); void send(const OutputMessagePtr& outputMessage); void sendExtendedOpcode(uint8 opcode, const std::string& buffer); @@ -143,6 +143,7 @@ private: void parseLoginError(const InputMessagePtr& msg); void parseLoginAdvice(const InputMessagePtr& msg); void parseLoginWait(const InputMessagePtr& msg); + void parseLoginToken(const InputMessagePtr& msg); void parsePing(const InputMessagePtr& msg); void parsePingBack(const InputMessagePtr& msg); void parseChallenge(const InputMessagePtr& msg); @@ -246,6 +247,7 @@ private: stdext::boolean m_firstRecv; std::string m_accountName; std::string m_accountPassword; + std::string m_authenticatorToken; std::string m_characterName; LocalPlayerPtr m_localPlayer; }; diff --git a/src/client/protocolgameparse.cpp b/src/client/protocolgameparse.cpp index 0fd626cc..8853c150 100644 --- a/src/client/protocolgameparse.cpp +++ b/src/client/protocolgameparse.cpp @@ -79,6 +79,9 @@ void ProtocolGame::parseMessage(const InputMessagePtr& msg) case Proto::GameServerLoginWait: parseLoginWait(msg); break; + case Proto::GameServerLoginToken: + parseLoginToken(msg); + break; case Proto::GameServerPing: case Proto::GameServerPingBack: if((opcode == Proto::GameServerPing && g_game.getFeature(Otc::GameClientPing)) || @@ -385,11 +388,13 @@ void ProtocolGame::parseLogin(const InputMessagePtr& msg) } bool canReportBugs = msg->getU8(); - if(g_game.getClientVersion() >= 1053) + if(g_game.getClientVersion() >= 1054) msg->getU8(); // can change pvp frame option - if(g_game.getClientVersion() >= 1058) - msg->getU8(); // expert mode enabled + if(g_game.getClientVersion() >= 1058) { + int expertModeEnabled = msg->getU8(); + g_game.setExpertPvpMode(expertModeEnabled); + } m_localPlayer->setId(playerId); g_game.setServerBeat(serverBeat); @@ -428,19 +433,23 @@ void ProtocolGame::parsePreset(const InputMessagePtr& msg) void ProtocolGame::parseUnjustifiedStats(const InputMessagePtr& msg) { - // Unjustified Kills display since 10.55 - msg->getU8(); - msg->getU8(); - msg->getU8(); - msg->getU8(); - msg->getU8(); - msg->getU8(); - msg->getU8(); + UnjustifiedPoints unjustifiedPoints; + unjustifiedPoints.killsDay = msg->getU8(); + unjustifiedPoints.killsDayRemaining = msg->getU8(); + unjustifiedPoints.killsWeek = msg->getU8(); + unjustifiedPoints.killsWeekRemaining = msg->getU8(); + unjustifiedPoints.killsMonth = msg->getU8(); + unjustifiedPoints.killsMonthRemaining = msg->getU8(); + unjustifiedPoints.skullTime = msg->getU8(); + + g_game.setUnjustifiedPoints(unjustifiedPoints); } void ProtocolGame::parsePvpSituations(const InputMessagePtr& msg) { - msg->getU8(); // amount of open pvp situations + uint8 openPvpSituations = msg->getU8(); + + g_game.setOpenPvpSituations(openPvpSituations); } void ProtocolGame::parsePlayerHelpers(const InputMessagePtr& msg) @@ -501,6 +510,12 @@ void ProtocolGame::parseLoginWait(const InputMessagePtr& msg) g_game.processLoginWait(message, time); } +void ProtocolGame::parseLoginToken(const InputMessagePtr& msg) +{ + bool unknown = (msg->getU8() == 0); + g_game.processLoginToken(unknown); +} + void ProtocolGame::parsePing(const InputMessagePtr& msg) { g_game.processPing(); diff --git a/src/client/protocolgamesend.cpp b/src/client/protocolgamesend.cpp index a32ee396..f0e2d167 100644 --- a/src/client/protocolgamesend.cpp +++ b/src/client/protocolgamesend.cpp @@ -87,6 +87,9 @@ void ProtocolGame::sendLoginPacket(uint challengeTimestamp, uint8 challengeRando msg->addString(m_characterName); msg->addString(m_accountPassword); + if(g_game.getFeature(Otc::GameAuthenticator)) + msg->addString(m_authenticatorToken); + if(g_game.getFeature(Otc::GameChallengeOnLogin)) { msg->addU32(challengeTimestamp); msg->addU8(challengeRandom); From a8f2bb19dbf5e0acf2923681542fd53cf65bbe0e Mon Sep 17 00:00:00 2001 From: TheSumm Date: Sun, 18 Jan 2015 23:56:44 +0100 Subject: [PATCH 10/43] Little polishing of Unjustified Points module --- .../unjustifiedpoints.lua | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/modules/game_unjustifiedpoints/unjustifiedpoints.lua b/modules/game_unjustifiedpoints/unjustifiedpoints.lua index ad01e15d..75386591 100644 --- a/modules/game_unjustifiedpoints/unjustifiedpoints.lua +++ b/modules/game_unjustifiedpoints/unjustifiedpoints.lua @@ -112,6 +112,16 @@ function onOpenPvpSituationsChange(amount) openPvpSituationsLabel:setText(amount) end +local function getColorByKills(kills) + if kills < 2 then + return 'red' + elseif kills < 3 then + return 'yellow' + end + + return 'green' +end + function onUnjustifiedPointsChange(unjustifiedPoints) if unjustifiedPoints.skullTime == 0 then skullTimeLabel:setText('No skull') @@ -122,14 +132,17 @@ function onUnjustifiedPointsChange(unjustifiedPoints) end dayProgressBar:setValue(unjustifiedPoints.killsDay, 0, 100) - dayProgressBar:setTooltip(string.format('Unjustified points gained during the last 24 hours.\n%i kills left.', unjustifiedPoints.killsDayRemaining)) - dayProgressBar:setText(unjustifiedPoints.killsDayRemaining .. ' kills left') + dayProgressBar:setBackgroundColor(getColorByKills(unjustifiedPoints.killsDayRemaining)) + dayProgressBar:setTooltip(string.format('Unjustified points gained during the last 24 hours.\n%i kill%s left.', unjustifiedPoints.killsDayRemaining, (unjustifiedPoints.killsDayRemaining == 1 and '' or 's'))) + dayProgressBar:setText(string.format('%i kill%s left', unjustifiedPoints.killsDayRemaining, (unjustifiedPoints.killsDayRemaining == 1 and '' or 's'))) weekProgressBar:setValue(unjustifiedPoints.killsWeek, 0, 100) - weekProgressBar:setTooltip(string.format('Unjustified points gained during the last 7 days.\n%i kills left.', unjustifiedPoints.killsWeekRemaining)) - weekProgressBar:setText(unjustifiedPoints.killsWeekRemaining .. ' kills left') + weekProgressBar:setBackgroundColor(getColorByKills(unjustifiedPoints.killsWeekRemaining)) + weekProgressBar:setTooltip(string.format('Unjustified points gained during the last 7 days.\n%i kill%s left.', unjustifiedPoints.killsWeekRemaining, (unjustifiedPoints.killsWeekRemaining == 1 and '' or 's'))) + weekProgressBar:setText(string.format('%i kill%s left', unjustifiedPoints.killsWeekRemaining, (unjustifiedPoints.killsWeekRemaining == 1 and '' or 's'))) monthProgressBar:setValue(unjustifiedPoints.killsMonth, 0, 100) - monthProgressBar:setTooltip(string.format('Unjustified points gained during the last 30 days.\n%i kills left.', unjustifiedPoints.killsMonthRemaining)) - monthProgressBar:setText(unjustifiedPoints.killsMonthRemaining .. ' kills left') + monthProgressBar:setBackgroundColor(getColorByKills(unjustifiedPoints.killsMonthRemaining)) + monthProgressBar:setTooltip(string.format('Unjustified points gained during the last 30 days.\n%i kill%s left.', unjustifiedPoints.killsMonthRemaining, (unjustifiedPoints.killsMonthRemaining == 1 and '' or 's'))) + monthProgressBar:setText(string.format('%i kill%s left', unjustifiedPoints.killsMonthRemaining, (unjustifiedPoints.killsMonthRemaining == 1 and '' or 's'))) end From 26fb35fd4da055fd2f9b7d65fe2ca44160c347fe Mon Sep 17 00:00:00 2001 From: TheSumm Date: Sun, 18 Jan 2015 23:57:19 +0100 Subject: [PATCH 11/43] Fixed major bug --- src/framework/util/color.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/framework/util/color.cpp b/src/framework/util/color.cpp index ea329d5d..c44b56c2 100644 --- a/src/framework/util/color.cpp +++ b/src/framework/util/color.cpp @@ -41,7 +41,7 @@ const Color Color::darkTeal = 0xff808000; const Color Color::gray = 0xffa0a0a0; const Color Color::darkGray = 0xff808080; const Color Color::lightGray = 0xffc0c0c0; -const Color Color::orange = 0xffff8c00; +const Color Color::orange = 0xff008cff; Color::Color(const std::string& coltext) { From 63f95317a2d3dd29a42ca13368339c088c972e13 Mon Sep 17 00:00:00 2001 From: TheSumm Date: Mon, 19 Jan 2015 01:08:18 +0100 Subject: [PATCH 12/43] Fixed baseSpeed not being parsed (10.59+) --- src/client/creature.cpp | 9 +++++++++ src/client/creature.h | 3 +++ src/client/localplayer.cpp | 10 ---------- src/client/localplayer.h | 3 --- src/client/luafunctions.cpp | 4 +--- src/client/protocolgameparse.cpp | 10 +++++++++- 6 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/client/creature.cpp b/src/client/creature.cpp index ac361692..1e646bc6 100644 --- a/src/client/creature.cpp +++ b/src/client/creature.cpp @@ -696,6 +696,15 @@ void Creature::setSpeed(uint16 speed) callLuaField("onSpeedChange", m_speed, oldSpeed); } +void Creature::setBaseSpeed(double baseSpeed) +{ + if(m_baseSpeed != baseSpeed) { + double oldBaseSpeed = m_baseSpeed; + m_baseSpeed = baseSpeed; + + callLuaField("onBaseSpeedChange", baseSpeed, oldBaseSpeed); + } +} void Creature::setSkull(uint8 skull) { m_skull = skull; diff --git a/src/client/creature.h b/src/client/creature.h index 72d35651..606d272e 100644 --- a/src/client/creature.h +++ b/src/client/creature.h @@ -58,6 +58,7 @@ public: void setOutfitColor(const Color& color, int duration); void setLight(const Light& light) { m_light = light; } void setSpeed(uint16 speed); + void setBaseSpeed(double baseSpeed); void setSkull(uint8 skull); void setShield(uint8 shield); void setEmblem(uint8 emblem); @@ -82,6 +83,7 @@ public: Outfit getOutfit() { return m_outfit; } Light getLight() { return m_light; } uint16 getSpeed() { return m_speed; } + double getBaseSpeed() { return m_baseSpeed; } uint8 getSkull() { return m_skull; } uint8 getShield() { return m_shield; } uint8 getEmblem() { return m_emblem; } @@ -147,6 +149,7 @@ protected: Outfit m_outfit; Light m_light; int m_speed; + double m_baseSpeed; uint8 m_skull; uint8 m_shield; uint8 m_emblem; diff --git a/src/client/localplayer.cpp b/src/client/localplayer.cpp index d4cbc898..e137d9dd 100644 --- a/src/client/localplayer.cpp +++ b/src/client/localplayer.cpp @@ -507,16 +507,6 @@ void LocalPlayer::setPremium(bool premium) } } -void LocalPlayer::setBaseSpeed(double baseSpeed) -{ - if(m_baseSpeed != baseSpeed) { - double oldBaseSpeed = m_baseSpeed; - m_baseSpeed = baseSpeed; - - callLuaField("onBaseSpeedChange", baseSpeed, oldBaseSpeed); - } -} - void LocalPlayer::setRegenerationTime(double regenerationTime) { if(m_regenerationTime != regenerationTime) { diff --git a/src/client/localplayer.h b/src/client/localplayer.h index e839d819..65556334 100644 --- a/src/client/localplayer.h +++ b/src/client/localplayer.h @@ -59,7 +59,6 @@ public: void setInventoryItem(Otc::InventorySlot inventory, const ItemPtr& item); void setVocation(int vocation); void setPremium(bool premium); - void setBaseSpeed(double baseSpeed); void setRegenerationTime(double regenerationTime); void setOfflineTrainingTime(double offlineTrainingTime); void setSpells(const std::vector& spells); @@ -84,7 +83,6 @@ public: double getBaseMagicLevel() { return m_baseMagicLevel; } double getSoul() { return m_soul; } double getStamina() { return m_stamina; } - double getBaseSpeed() { return m_baseSpeed; } double getRegenerationTime() { return m_regenerationTime; } double getOfflineTrainingTime() { return m_offlineTrainingTime; } std::vector getSpells() { return m_spells; } @@ -162,7 +160,6 @@ private: double m_baseMagicLevel; double m_soul; double m_stamina; - double m_baseSpeed; double m_regenerationTime; double m_offlineTrainingTime; }; diff --git a/src/client/luafunctions.cpp b/src/client/luafunctions.cpp index e4f8b60f..0fa6794f 100644 --- a/src/client/luafunctions.cpp +++ b/src/client/luafunctions.cpp @@ -238,9 +238,7 @@ void Client::registerLuaFunctions() g_lua.bindSingletonFunction("g_game", "getChaseMode", &Game::getChaseMode, &g_game); g_lua.bindSingletonFunction("g_game", "getFightMode", &Game::getFightMode, &g_game); g_lua.bindSingletonFunction("g_game", "getPVPMode", &Game::getPVPMode, &g_game); - g_lua.bindSingletonFunction("g_game", "setUnjustifiedPoints", &Game::setUnjustifiedPoints, &g_game); g_lua.bindSingletonFunction("g_game", "getUnjustifiedPoints", &Game::getUnjustifiedPoints, &g_game); - g_lua.bindSingletonFunction("g_game", "setOpenPvpSituations", &Game::setOpenPvpSituations, &g_game); g_lua.bindSingletonFunction("g_game", "getOpenPvpSituations", &Game::getOpenPvpSituations, &g_game); g_lua.bindSingletonFunction("g_game", "isSafeFight", &Game::isSafeFight, &g_game); g_lua.bindSingletonFunction("g_game", "inspectNpcTrade", &Game::inspectNpcTrade, &g_game); @@ -444,6 +442,7 @@ void Client::registerLuaFunctions() g_lua.bindClassMemberFunction("getName", &Creature::getName); g_lua.bindClassMemberFunction("getHealthPercent", &Creature::getHealthPercent); g_lua.bindClassMemberFunction("getSpeed", &Creature::getSpeed); + g_lua.bindClassMemberFunction("getBaseSpeed", &Creature::getBaseSpeed); g_lua.bindClassMemberFunction("getSkull", &Creature::getSkull); g_lua.bindClassMemberFunction("getShield", &Creature::getShield); g_lua.bindClassMemberFunction("getEmblem", &Creature::getEmblem); @@ -630,7 +629,6 @@ void Client::registerLuaFunctions() g_lua.bindClassMemberFunction("getStamina", &LocalPlayer::getStamina); g_lua.bindClassMemberFunction("getOfflineTrainingTime", &LocalPlayer::getOfflineTrainingTime); g_lua.bindClassMemberFunction("getRegenerationTime", &LocalPlayer::getRegenerationTime); - g_lua.bindClassMemberFunction("getBaseSpeed", &LocalPlayer::getBaseSpeed); g_lua.bindClassMemberFunction("getBaseMagicLevel", &LocalPlayer::getBaseMagicLevel); g_lua.bindClassMemberFunction("getTotalCapacity", &LocalPlayer::getTotalCapacity); g_lua.bindClassMemberFunction("getInventoryItem", &LocalPlayer::getInventoryItem); diff --git a/src/client/protocolgameparse.cpp b/src/client/protocolgameparse.cpp index 8853c150..7744a602 100644 --- a/src/client/protocolgameparse.cpp +++ b/src/client/protocolgameparse.cpp @@ -1004,11 +1004,19 @@ void ProtocolGame::parseCreatureOutfit(const InputMessagePtr& msg) void ProtocolGame::parseCreatureSpeed(const InputMessagePtr& msg) { uint id = msg->getU32(); + + int baseSpeed = -1; + if(g_game.getClientVersion() >= 1059) + baseSpeed = msg->getU16(); + int speed = msg->getU16(); CreaturePtr creature = g_map.getCreatureById(id); - if(creature) + if(creature) { creature->setSpeed(speed); + if(baseSpeed != -1) + creature->setBaseSpeed(baseSpeed); + } // some servers has a bug in get spectators and sends unknown creatures updates // so this code is disabled From fc76ca45232241a5a91e393dbb8f006578688669 Mon Sep 17 00:00:00 2001 From: TheSumm Date: Mon, 19 Jan 2015 01:52:49 +0100 Subject: [PATCH 13/43] Updated advernturer blessing inventory style to be more robust --- data/images/game/slots/ammo-blessed.png | Bin 0 -> 4141 bytes data/images/game/slots/back-blessed.png | Bin 0 -> 4995 bytes data/images/game/slots/body-blessed.png | Bin 0 -> 5022 bytes data/images/game/slots/feet-blessed.png | Bin 0 -> 4741 bytes data/images/game/slots/finger-blessed.png | Bin 0 -> 4169 bytes data/images/game/slots/head-blessed.png | Bin 0 -> 4490 bytes data/images/game/slots/left-hand-blessed.png | Bin 0 -> 4627 bytes data/images/game/slots/legs-blessed.png | Bin 0 -> 4707 bytes data/images/game/slots/neck-blessed.png | Bin 0 -> 4356 bytes data/images/game/slots/right-hand-blessed.png | Bin 0 -> 5070 bytes data/images/ui/item-blessed.png | Bin 0 -> 3137 bytes modules/game_inventory/inventory.lua | 10 ++------ modules/game_inventory/inventory.otui | 22 ++++++++++++++++++ src/client/creature.cpp | 1 + 14 files changed, 25 insertions(+), 8 deletions(-) create mode 100644 data/images/game/slots/ammo-blessed.png create mode 100644 data/images/game/slots/back-blessed.png create mode 100644 data/images/game/slots/body-blessed.png create mode 100644 data/images/game/slots/feet-blessed.png create mode 100644 data/images/game/slots/finger-blessed.png create mode 100644 data/images/game/slots/head-blessed.png create mode 100644 data/images/game/slots/left-hand-blessed.png create mode 100644 data/images/game/slots/legs-blessed.png create mode 100644 data/images/game/slots/neck-blessed.png create mode 100644 data/images/game/slots/right-hand-blessed.png create mode 100644 data/images/ui/item-blessed.png diff --git a/data/images/game/slots/ammo-blessed.png b/data/images/game/slots/ammo-blessed.png new file mode 100644 index 0000000000000000000000000000000000000000..bed31d7b1fca2ea29fad41274e49d803985b8878 GIT binary patch literal 4141 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 literal 0 HcmV?d00001 diff --git a/data/images/game/slots/back-blessed.png b/data/images/game/slots/back-blessed.png new file mode 100644 index 0000000000000000000000000000000000000000..b369e6eab184e97987d4e6d2dd380730a4d87ddb GIT binary patch literal 4995 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 N002ovPDHLkV1lfGqLTms literal 0 HcmV?d00001 diff --git a/data/images/game/slots/body-blessed.png b/data/images/game/slots/body-blessed.png new file mode 100644 index 0000000000000000000000000000000000000000..caa01ba9599b09f3f27ed61cc50cf92a11410cb4 GIT binary patch literal 5022 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 literal 0 HcmV?d00001 diff --git a/data/images/game/slots/feet-blessed.png b/data/images/game/slots/feet-blessed.png new file mode 100644 index 0000000000000000000000000000000000000000..29c011ff6bc785427a52bbe603770e17a195c236 GIT binary patch literal 4741 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 TC++JR00000NkvXXu0mjf9JL06 literal 0 HcmV?d00001 diff --git a/data/images/game/slots/head-blessed.png b/data/images/game/slots/head-blessed.png new file mode 100644 index 0000000000000000000000000000000000000000..418f4f65cd6448f03fd131011fa93fda97feb2f0 GIT binary patch literal 4490 zcmV;55q0i~P)uJ@VVD_UC<6{NG_fI~0ue<-1QkJoA_k0xBC#Thg@9ne9*`iQ#9$Or zQF$}6R&?d%y_c8YA7_1QpS|}zXYYO1x&V;8{kgn!SPFnNo`4_X6{c}T{8k*B#$jdxfFg<9uYy1K45IaYvHg`_dOZM)Sy63ve6hvv z1)yUy0P^?0*fb9UASvow`@mQCp^4`uNg&9uGcn1|&Nk+9SjOUl{-OWr@Hh0;_l(8q z{wNRKos+;6rV8ldy0Owz(}jF`W(JeRp&R{qi2rfmU!TJ;gp(Kmm5I1s5m_f-n#TRsj}B0%?E`vOzxB2#P=n*a3EfYETOrKoe*ICqM@{4K9Go;5xVgZi5G4 z1dM~{UdP6d+Yd3o?MrAqM0Kc|iV92owdyL5UC#5<>aVCa44|hpM4E zs0sQWIt5*Tu0n&*J!lk~f_{hI!w5`*sjxDv4V%CW*ah~3!{C*0BD@;TgA3v9a1~q+ zAA{TB3-ERLHar49hi4Ih5D^-ph8Q6X#0?2VqLBoIkE}zAkxHZUgRb+f=nat zP#6>iMMoK->`~sRLq)(kHo*Vn{;LcG6+edD1=7D>9j^O?D{Qg|tCDK{ym)H7&wDr6*;uGTJg8GHjVbnL{!cWyUB7MT6o-VNo_w8Yq`2<5Ub)hw4L3rj}5@qxMs0 zWMyP6Wy582WNT#4$d1qunl{acmP#w5ouJ*Jy_Zv#bCKi7ZIf$}8d zZdVy&)LYdbX%I9R8VMQ|8r>Q*nyQ)sn)#Z|n)kKvS`4iu ztvy=3T65Yu+7a4Yv^%sXb>ww?bn(=Yu(!=O6^iuTp>)p_Y^{w=i z^lS773}6Fm1Fpe-gF!>Ip{*g$u-szvGhed;vo5pW&GpS$<~8QGEXWp~7V9lKEnZq0SaK{6Sl+dwSOr*Z zvFf(^Xl-N7w{EeXveC4Ov)N}e%%C!Y7^RFWwrE>d+x51mZQt2h+X?JW*!^a2WS?Sx z)P8cQ&Qi|OhNWW;>JChYI)@QQx?`Nj^#uJBl~d&PK+RZLOLos~K(b5>qmrMN0})tOkySZ3_W zICNY@+|jrX%s^&6b2i>5eqa0y%Z;^%^_=a@u3%4b9605ii3Ep)@`TAmhs0fpQ%O!q zl}XcFH*PieWwLj2ZSq`7V9Mc?h17`D)-+sNT-qs~3@?S(ldh7UlRlVXkWrK|vf6I- z?$tAVKYn8-l({mqQ$Q8{O!WzMg`0(=S&msXS#Pt$vrpzo=kRj+a`kh!z=6$;c zwT88(J6|n-WB%w`m$h~4pmp)YIh_ z3ETV2tjiAU!0h1dxU-n=E9e!)6|Z;4?!H=SSy{V>ut&IOq{_dl zbFb#!9eY1iCsp6Bajj|Hr?hX|zPbJE{X++w546-O*Ot`2Kgd0Jx6Z4syT zu9enWavU5N9)I?I-1m1*_?_rJ$vD~agVqoG+9++s?NEDe`%Fht$4F;X=in*dQ{7$m zU2Q)a|9JSc+Uc4zvS-T963!N$T{xF_ZuWe}`RNOZ7sk3{yB}PPym+f8xTpV;-=!;; zJuhGEb?H5K#o@~7t9DmUU1MD9xNd#Dz0azz?I)|B+WM{g+Xrk0I&awC=o(x)cy`EX z=)z6+o0o6-+`4{y+3mqQ%kSJBju{@g%f35#FZJHb`&swrA8dGtepviS>QUumrN{L@ z>;2q1Vm)$Z)P1z?N$8UYW2~{~zhwUMVZ87u`Dx{Z>O|9|`Q+&->FRy-Sjp7DHs zy69KwU-!MxeeuI@&cF4|M9z%AfP?@5 z`Tzg`fam}Kbua(`>RI+y?e7jT@qQ9J+u00v@9M??VV0NVhU4p8e?00009a7bBm z000XU000XU0RWnu7ytkO2XskIMF-yj696k99c~CZ000J+Nkl#6S!tMkE50@a-RZA7cPC;}^gB z7YLyEZ$QNVP*ngT6QL-oT8;^VNDNXe^`0Jc2=c_9J_|qIbG*Fj;P!5U+ zMhuEJ784N!@ee8%4}dm7)US(?YFrg{ibO(WA|R=N;Ihg>6K*KHQ-Ih4WuydNKY}O1 z!|QXLI@E34AEkg|f=9xFMvQmkhP9hVuU#LN%Cklcs)|!rf-FNF3!vd!QaD?*PsRL;PnFk^+FG(7# zsax0pAuzqZqTO!u_U$`V9mBzZgO@LvOm4WixZvRMb?Jrryn49HP)7}qJo!lue6T2q zxkv3EbXXvp*W~?%jLdym?ESwipchwA*c*vn&=1thJ2CVLi?2LWSDnWlAel~y>%&)&RYe}5klVK$p_es<1uIw4J47-Lv2m!wHTtJPw1eSuSl zb=G?Z8hml;kZ8jrb>XUuSpar(dBKMdA85B)Byr5$-5vk={F&uy$!s>`>G6>yNpa4R zTgz}bsCcGYdLr<{X%M!$j%Wp>j9uVH!SZf*m%ZK|X{*KbcFJnC=I7sh!{g&4x3^Os z9v*nOe;|%yY@QRxF@yeq>Gc)E7Y7XxO~s9y9toKeJWvO7b9uqx;VX7_c9_rSh!~EJ zju60Fi*rh=)n+srAtGdX&T6%y)9DaJrXhevOw&`Qp{!3HlQ#1|9L5;pIOhKDp22WH zzt?B6Sn%o7CmtT|iQ|O9pij5EM-)fc^%`q)j4>D!c|KTINBSIF8xd>v8<`n9rX- z>J^wxju>fq7Hd`1#7L1jN|t%8`S_Xk8##Oc{7NfH-DEU@2!2vHQ#YNgyiJg{6W z$@08R+eY;W^PDzyL^W$AI#jd^Vo>LB&aqyt$gOQ~uK`kG%6ZA-v~t{YaedJZof#Mn%>F)sK0k)9taC-E($!%KP{48I6YA-rmve z4a#B`GG{)!XEM2AGMO-+&*}DurG9Moy+s?p4Wur=oBc^=ugBuyjvs#bFRIG!Uf=72 zb(LhJ>~wn^AAbdu-MzuqbB!3Bsp^gtEl3fXxKdH7QXM+AkZwEO-d4S6)Q#fzZm(Zy zQJojU);=gSWj=k2QoJee0bJN7KG*y<_A~X(lQw(bt*$|+m6<^ug<#S?Lpv(iTUSWUjqqZB9Pec z@XJ>SkCcGu^4^;Ih;dB<&ClBQG^z`q){O#>`Kjn)W cRsGxl0DVZ*rXuzG-v9sr07*qoM6N<$f@VjZ>;M1& literal 0 HcmV?d00001 diff --git a/data/images/game/slots/left-hand-blessed.png b/data/images/game/slots/left-hand-blessed.png new file mode 100644 index 0000000000000000000000000000000000000000..6140de88d8072b4d1d1ea3d1d1c85572d46bf557 GIT binary patch literal 4627 zcmV+u6721XP)uJ@VVD_UC<6{NG_fI~0ue<-1QkJoA_k0xBC#Thg@9ne9*`iQ#9$Or zQF$}6R&?d%y_c8YA7_1QpS|}zXYYO1x&V;8{kgn!SPFnNo`4_X6{c}T{8k*B#$jdxfFg<9uYy1K45IaYvHg`_dOZM)Sy63ve6hvv z1)yUy0P^?0*fb9UASvow`@mQCp^4`uNg&9uGcn1|&Nk+9SjOUl{-OWr@Hh0;_l(8q z{wNRKos+;6rV8ldy0Owz(}jF`W(JeRp&R{qi2rfmU!TJ;gp(Kmm5I1s5m_f-n#TRsj}B0%?E`vOzxB2#P=n*a3EfYETOrKoe*ICqM@{4K9Go;5xVgZi5G4 z1dM~{UdP6d+Yd3o?MrAqM0Kc|iV92owdyL5UC#5<>aVCa44|hpM4E zs0sQWIt5*Tu0n&*J!lk~f_{hI!w5`*sjxDv4V%CW*ah~3!{C*0BD@;TgA3v9a1~q+ zAA{TB3-ERLHar49hi4Ih5D^-ph8Q6X#0?2VqLBoIkE}zAkxHZUgRb+f=nat zP#6>iMMoK->`~sRLq)(kHo*Vn{;LcG6+edD1=7D>9j^O?D{Qg|tCDK{ym)H7&wDr6*;uGTJg8GHjVbnL{!cWyUB7MT6o-VNo_w8Yq`2<5Ub)hw4L3rj}5@qxMs0 zWMyP6Wy582WNT#4$d1qunl{acmP#w5ouJ*Jy_Zv#bCKi7ZIf$}8d zZdVy&)LYdbX%I9R8VMQ|8r>Q*nyQ)sn)#Z|n)kKvS`4iu ztvy=3T65Yu+7a4Yv^%sXb>ww?bn(=Yu(!=O6^iuTp>)p_Y^{w=i z^lS773}6Fm1Fpe-gF!>Ip{*g$u-szvGhed;vo5pW&GpS$<~8QGEXWp~7V9lKEnZq0SaK{6Sl+dwSOr*Z zvFf(^Xl-N7w{EeXveC4Ov)N}e%%C!Y7^RFWwrE>d+x51mZQt2h+X?JW*!^a2WS?Sx z)P8cQ&Qi|OhNWW;>JChYI)@QQx?`Nj^#uJBl~d&PK+RZLOLos~K(b5>qmrMN0})tOkySZ3_W zICNY@+|jrX%s^&6b2i>5eqa0y%Z;^%^_=a@u3%4b9605ii3Ep)@`TAmhs0fpQ%O!q zl}XcFH*PieWwLj2ZSq`7V9Mc?h17`D)-+sNT-qs~3@?S(ldh7UlRlVXkWrK|vf6I- z?$tAVKYn8-l({mqQ$Q8{O!WzMg`0(=S&msXS#Pt$vrpzo=kRj+a`kh!z=6$;c zwT88(J6|n-WB%w`m$h~4pmp)YIh_ z3ETV2tjiAU!0h1dxU-n=E9e!)6|Z;4?!H=SSy{V>ut&IOq{_dl zbFb#!9eY1iCsp6Bajj|Hr?hX|zPbJE{X++w546-O*Ot`2Kgd0Jx6Z4syT zu9enWavU5N9)I?I-1m1*_?_rJ$vD~agVqoG+9++s?NEDe`%Fht$4F;X=in*dQ{7$m zU2Q)a|9JSc+Uc4zvS-T963!N$T{xF_ZuWe}`RNOZ7sk3{yB}PPym+f8xTpV;-=!;; zJuhGEb?H5K#o@~7t9DmUU1MD9xNd#Dz0azz?I)|B+WM{g+Xrk0I&awC=o(x)cy`EX z=)z6+o0o6-+`4{y+3mqQ%kSJBju{@g%f35#FZJHb`&swrA8dGtepviS>QUumrN{L@ z>;2q1Vm)$Z)P1z?N$8UYW2~{~zhwUMVZ87u`Dx{Z>O|9|`Q+&->FRy-Sjp7DHs zy69KwU-!MxeeuI@&cF4|M9z%AfP?@5 z`Tzg`fam}Kbua(`>RI+y?e7jT@qQ9J+u00v@9M??VV0NVhU4p8e?00009a7bBm z000XU000XU0RWnu7ytkO2XskIMF-yj696kN`qm{q000LbNklFWC ztY?3tP+k&9f|o?81b8X#{O+CmNdRO_{j>kDzyAz?rP2xjN-1+$1b~E>KoCU4T~jEO zN`jg$r3FDyC}*)!3j0@U?d}&5{_*7i0MFb!W`F+~pMU;)YPA|Kk2;(lbx}&W!}C0I zR^IIJJiLU5^2{6r2O@fJ?79e|XNExvjE?|41_e7iJKX!_J?`AOL$ldnYpVr7VPzFT zViwxPt+(8@sp-m7@o}Zlq8$h~o=5{S^T<+hg+{Z=xSI-of{M0J6C(w{PE~R;zK+Ib_cC8BdgQ zV|HV^nIO&+A_8g#T#E*ko&iz%90Zn2S7I4h#Sr z^XbP^UW^Z3!kflF4t(k|$0b9Qm`6sAL;`F++GH>oknw$vx<~Z;eFNsk4UP|AxNvB# zT{sengyGE8avKJ%r@WAeCq2V05kXDK>NsLkY`JuW{b&1ZZvKr-CPS%IBn(5sc1W#O z2#WUy$&djj=H?+ z_gPID-X+vf`;=n}#N5HAXoJZ!_UszeC*=+FDSAV8lE>kL%7z_rC zMnl%t*7=}XrSl?;rKzVp6Qa4)wVOLImcSw?6#;^bV{y0Yw^X{q?(QxRAO3|PD3i_Q z5D|L4Q`XnksMTt855n2z(@ct{Z7i$cf*#rQOuYPHI6G$NbJ(r&j2f`C*i#m@E)#nr1u&Zip#F%UK~mgLNH#8aNR5FwTF z)XWNm(rUmzn@#?`vqL#3GailjNwvz^n=||cpGu`d_eI<2iy~Hm=Lu`aOk3bWGj^l_~*xOTvb-h39h0vP3p$T*hk z(cIUfojU4?ITu#0va`L-?$f8_vN^ilF0~J948I=|1Oe}DY;e>$Kty=i?H~xflOuX3 zN3q&tYE9~*N22-dP>V1*pD>wBnCRJ&FO+CB8hrEZH>A>Oy4?<+d~%o5(;nA0HmF>$ zaMF3f-Me==J?`?;k3Wt{zLWTlO>X z&v$!!^!t|>j)wG3dxX!Qvv_&gamRTi3PhIteUtdQAT3cHT1_QE71t)YdJ|-f{ib|VGI8{O0z{LJf<2xTZTfDNDmuWN_ zJl);J_kH~C0_}Fla5yyFo30-%hRA$qyyS(>+f0hYGa^LMx}i{Lt$E#h$-PfMWia?3 zVLK#jw>djIGoTh0cy)ThVt(mD1&)zbsgx^Fv5rbE=D!V>12ipki}@uUK72?}F7vA2 zXD}EbKx#N72+9lw1Hv%mom@V?ZnRajqB5T~QQky3;$p35oO*qFLcRVA^7%Z2!GOif z%VaMvI{+Z$^LgI%Pv;CyL_?FhK)|nqS z8J}*qYY1=4iy=(0(tzEAzNTBX(6BA?GYk0hhaowv|FAlat+hpczP7srX2{3gsn0CCwAQdxelN`K}VPaXUvPQC0Ui3&%PzlpwAI82lmhtL`-*>JUl%7`$wO>`q_{9qDDmi`hO5v;yNWW^Jf46002ov JPDHLkV1i@_%ANoK literal 0 HcmV?d00001 diff --git a/data/images/game/slots/legs-blessed.png b/data/images/game/slots/legs-blessed.png new file mode 100644 index 0000000000000000000000000000000000000000..759f13b4ea14f9b817fa369338222a6ee4b07168 GIT binary patch literal 4707 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 literal 0 HcmV?d00001 diff --git a/data/images/game/slots/neck-blessed.png b/data/images/game/slots/neck-blessed.png new file mode 100644 index 0000000000000000000000000000000000000000..e3b68757e5a8dd57110b19e834aed2f53625cfb9 GIT binary patch literal 4356 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 literal 0 HcmV?d00001 diff --git a/data/images/ui/item-blessed.png b/data/images/ui/item-blessed.png new file mode 100644 index 0000000000000000000000000000000000000000..41db9d91793b0d6b0be36254e79bcceab19c3e88 GIT binary patch literal 3137 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 literal 0 HcmV?d00001 diff --git a/modules/game_inventory/inventory.lua b/modules/game_inventory/inventory.lua index 1dcc7c05..e97e9301 100644 --- a/modules/game_inventory/inventory.lua +++ b/modules/game_inventory/inventory.lua @@ -62,13 +62,7 @@ function toggleAdventurerStyle(hasBlessing) for slot = InventorySlotFirst, InventorySlotLast do local itemWidget = inventoryPanel:getChildById('slot' .. slot) if itemWidget then - if hasBlessing then - itemWidget:setBorderWidth(1) - itemWidget:setBorderColor('#F7C80C') - else - itemWidget:setBorderWidth(0) - itemWidget:setBorderColor('white') - end + itemWidget:setOn(hasBlessing) end end end @@ -114,7 +108,7 @@ function onInventoryChange(player, slot, item, oldItem) local itemWidget = inventoryPanel:getChildById('slot' .. slot) if item then - itemWidget:setStyle('Item') + itemWidget:setStyle('InventoryItem') itemWidget:setItem(item) else itemWidget:setStyle(InventorySlotStyles[slot]) diff --git a/modules/game_inventory/inventory.otui b/modules/game_inventory/inventory.otui index 4089118e..55335d45 100644 --- a/modules/game_inventory/inventory.otui +++ b/modules/game_inventory/inventory.otui @@ -1,54 +1,76 @@ InventoryItem < Item + $on: + image-source: /images/ui/item-blessed HeadSlot < InventoryItem id: slot1 image-source: /images/game/slots/head &position: {x=65535, y=1, z=0} + $on: + image-source: /images/game/slots/head-blessed BodySlot < InventoryItem id: slot4 image-source: /images/game/slots/body &position: {x=65535, y=4, z=0} + $on: + image-source: /images/game/slots/body-blessed LegSlot < InventoryItem id: slot7 image-source: /images/game/slots/legs &position: {x=65535, y=7, z=0} + $on: + image-source: /images/game/slots/legs-blessed FeetSlot < InventoryItem id: slot8 image-source: /images/game/slots/feet &position: {x=65535, y=8, z=0} + $on: + image-source: /images/game/slots/feet-blessed NeckSlot < InventoryItem id: slot2 image-source: /images/game/slots/neck &position: {x=65535, y=2, z=0} + $on: + image-source: /images/game/slots/neck-blessed LeftSlot < InventoryItem id: slot6 image-source: /images/game/slots/left-hand &position: {x=65535, y=6, z=0} + $on: + image-source: /images/game/slots/left-hand-blessed FingerSlot < InventoryItem id: slot9 image-source: /images/game/slots/finger &position: {x=65535, y=9, z=0} + $on: + image-source: /images/game/slots/finger-blessed BackSlot < InventoryItem id: slot3 image-source: /images/game/slots/back &position: {x=65535, y=3, z=0} + $on: + image-source: /images/game/slots/back-blessed RightSlot < InventoryItem id: slot5 image-source: /images/game/slots/right-hand &position: {x=65535, y=5, z=0} + $on: + image-source: /images/game/slots/right-hand-blessed AmmoSlot < InventoryItem id: slot10 image-source: /images/game/slots/ammo &position: {x=65535, y=10, z=0} + $on: + image-source: /images/game/slots/ammo-blessed PurseButton < Button id: purseButton diff --git a/src/client/creature.cpp b/src/client/creature.cpp index 1e646bc6..9aa1c2df 100644 --- a/src/client/creature.cpp +++ b/src/client/creature.cpp @@ -705,6 +705,7 @@ void Creature::setBaseSpeed(double baseSpeed) callLuaField("onBaseSpeedChange", baseSpeed, oldBaseSpeed); } } + void Creature::setSkull(uint8 skull) { m_skull = skull; From 8542f8bfd451adf7fbca8cc63cdacf46d473c763 Mon Sep 17 00:00:00 2001 From: TheSumm Date: Tue, 20 Jan 2015 11:07:38 +0100 Subject: [PATCH 14/43] Protocol 10.73 support --- modules/gamelib/game.lua | 3 ++- src/client/game.cpp | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/gamelib/game.lua b/modules/gamelib/game.lua index cc273b54..07e985f1 100644 --- a/modules/gamelib/game.lua +++ b/modules/gamelib/game.lua @@ -74,7 +74,8 @@ function g_game.getSupportedClients() 1040, 1041, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, - 1063, 1064, 1070, 1071, 1072 + 1063, 1064, 1070, 1071, 1072, + 1073 } end diff --git a/src/client/game.cpp b/src/client/game.cpp index fe133e3f..688b0960 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -1456,7 +1456,7 @@ void Game::setProtocolVersion(int version) if(isOnline()) stdext::throw_exception("Unable to change protocol version while online"); - if(version != 0 && (version < 740 || version > 1072)) + if(version != 0 && (version < 740 || version > 1073)) stdext::throw_exception(stdext::format("Protocol version %d not supported", version)); m_protocolVersion = version; @@ -1474,7 +1474,7 @@ void Game::setClientVersion(int version) if(isOnline()) stdext::throw_exception("Unable to change client version while online"); - if(version != 0 && (version < 740 || version > 1072)) + if(version != 0 && (version < 740 || version > 1073)) stdext::throw_exception(stdext::format("Client version %d not supported", version)); m_features.reset(); From b5cea41f87eec7a0b6fd3aa2ebf7c7173c3a2116 Mon Sep 17 00:00:00 2001 From: TheSumm Date: Tue, 20 Jan 2015 14:34:45 +0100 Subject: [PATCH 15/43] Market fixes - Market now works after reloading - Fixed button / tab styles - MarketRightTabBarButton now inherits the base style - Fixed amountWindow buttons being hardly clickable - "All" search filter is now on by default --- data/styles/20-tabbars.otui | 17 ++++++--- modules/corelib/ui/uitabbar.lua | 1 + modules/game_market/market.lua | 34 +++++++++++++----- modules/game_market/market.otui | 3 +- .../game_market/ui/general/amountwindow.otui | 2 +- .../game_market/ui/general/marketbuttons.otui | 1 - .../game_market/ui/general/markettabs.otui | 36 +++++-------------- .../game_market/ui/marketoffers/browse.otui | 12 +++---- 8 files changed, 56 insertions(+), 50 deletions(-) diff --git a/data/styles/20-tabbars.otui b/data/styles/20-tabbars.otui index e90f6e6a..bb8c6821 100644 --- a/data/styles/20-tabbars.otui +++ b/data/styles/20-tabbars.otui @@ -36,10 +36,11 @@ TabBar < UITabBar anchors.fill: parent TabBarPanel < Panel TabBarButton < UIButton - size: 22 23 + size: 20 21 + image-source: /images/ui/tabbutton_square image-source: /images/ui/tabbutton_square image-color: #dfdfdf - image-clip: 0 0 22 23 + image-clip: 0 0 20 21 image-border: 3 image-border-bottom: 0 icon-color: #dfdfdf @@ -55,7 +56,7 @@ TabBarButton < UIButton margin-left: 5 $hover !checked: - image-clip: 0 23 22 23 + image-clip: 0 21 20 21 color: #dfdfdf $disabled: @@ -63,7 +64,7 @@ TabBarButton < UIButton icon-color: #dfdfdf $checked: - image-clip: 0 46 22 23 + image-clip: 0 42 20 21 color: #dfdfdf $on !checked: @@ -73,6 +74,14 @@ TabBarRounded < TabBar TabBarRoundedPanel < TabBarPanel TabBarRoundedButton < TabBarButton image-source: /images/ui/tabbutton_rounded + size: 22 23 + image-clip: 0 0 22 23 + + $hover !checked: + image-clip: 0 23 22 23 + + $checked: + image-clip: 0 46 22 23 TabBarVertical < UITabBar width: 96 diff --git a/modules/corelib/ui/uitabbar.lua b/modules/corelib/ui/uitabbar.lua index be43479d..951692f9 100644 --- a/modules/corelib/ui/uitabbar.lua +++ b/modules/corelib/ui/uitabbar.lua @@ -38,6 +38,7 @@ function UITabBar:addTab(text, panel, icon) end local tab = g_ui.createWidget(self:getStyleName() .. 'Button', self.buttonsPanel) + panel.isTab = true tab.tabPanel = panel tab.tabBar = self diff --git a/modules/game_market/market.lua b/modules/game_market/market.lua index abdeaa47..49d326e4 100644 --- a/modules/game_market/market.lua +++ b/modules/game_market/market.lua @@ -147,8 +147,8 @@ end local function clearFilters() for _, filter in pairs(filterButtons) do - if filter and filter:isChecked() then - filter:setChecked(false) + if filter and filter:isChecked() ~= filter.default then + filter:setChecked(filter.default) end end end @@ -400,6 +400,13 @@ local function updateFee(price, amount) feeLabel:resizeToText() end +local function destroyAmountWindow() + if amountWindow then + amountWindow:destroy() + amountWindow = nil + end +end + local function openAmountWindow(callback, type, actionText) local actionText = actionText or '' if not Market.isOfferSelected(type) then @@ -441,14 +448,12 @@ local function openAmountWindow(callback, type, actionText) local counter = selectedOffer[type]:getCounter() local timestamp = selectedOffer[type]:getTimeStamp() callback(scrollbar:getValue(), timestamp, counter) - okButton:getParent():destroy() - amountWindow = nil + destroyAmountWindow() end local cancelButton = amountWindow:getChildById('buttonCancel') local cancelFunc = function() - cancelButton:getParent():destroy() - amountWindow = nil + destroyAmountWindow() end amountWindow.onEnter = okFunc @@ -624,8 +629,10 @@ local function initInterface() browsePanel = g_ui.loadUI('ui/marketoffers/browse') selectionTabBar:addTab(tr('Browse'), browsePanel) - overviewPanel = g_ui.loadUI('ui/marketoffers/overview') - selectionTabBar:addTab(tr('Overview'), overviewPanel) + -- Currently not used + -- "Reserved for more functionality later" + --overviewPanel = g_ui.loadUI('ui/marketoffers/overview') + --selectionTabBar:addTab(tr('Overview'), overviewPanel) displaysTabBar = marketOffersPanel:getChildById('rightTabBar') displaysTabBar:setContentWidget(marketOffersPanel:getChildById('rightTabContent')) @@ -690,6 +697,14 @@ local function initInterface() filterButtons[MarketFilters.Depot] = browsePanel:getChildById('filterDepot') filterButtons[MarketFilters.SearchAll] = browsePanel:getChildById('filterSearchAll') + -- set filter default values + clearFilters() + + -- hook filters + for _, filter in pairs(filterButtons) do + filter.onCheckChange = Market.updateCurrentItems + end + searchEdit = browsePanel:getChildById('searchEdit') categoryList = browsePanel:getChildById('categoryComboBox') subCategoryList = browsePanel:getChildById('subCategoryComboBox') @@ -744,10 +759,13 @@ function init() end function terminate() + Market.close() + protocol.terminateProtocol() disconnect(g_game, { onGameEnd = Market.reset }) disconnect(g_game, { onGameEnd = Market.close }) + destroyAmountWindow() marketWindow:destroy() Market = nil diff --git a/modules/game_market/market.otui b/modules/game_market/market.otui index 89d9fde4..ae450441 100644 --- a/modules/game_market/market.otui +++ b/modules/game_market/market.otui @@ -3,7 +3,7 @@ MarketWindow < MainWindow !text: tr('Market') size: 700 530 - @onEscape: Market.close(true) + @onEscape: Market.close() // Main Panel Window @@ -54,6 +54,7 @@ MarketWindow < MainWindow Button id: resetButton !text: tr('Reset Market') + !tooltip: tr('Reset selection, filters & search') anchors.top: mainTabContent.bottom anchors.left: mainTabContent.left margin-top: 5 diff --git a/modules/game_market/ui/general/amountwindow.otui b/modules/game_market/ui/general/amountwindow.otui index 3dc99425..c4a2d252 100644 --- a/modules/game_market/ui/general/amountwindow.otui +++ b/modules/game_market/ui/general/amountwindow.otui @@ -1,7 +1,7 @@ AmountWindow < MainWindow id: amountWindow !text: tr('Amount') - size: 270 80 + size: 270 90 Item id: item diff --git a/modules/game_market/ui/general/marketbuttons.otui b/modules/game_market/ui/general/marketbuttons.otui index ae61cadb..45330706 100644 --- a/modules/game_market/ui/general/marketbuttons.otui +++ b/modules/game_market/ui/general/marketbuttons.otui @@ -4,7 +4,6 @@ MarketButtonBox < ButtonBoxRounded size: 106 22 text-offset: 0 2 text-align: center - image-border: 2 $checked: color: white diff --git a/modules/game_market/ui/general/markettabs.otui b/modules/game_market/ui/general/markettabs.otui index e62c7e47..dbc6ca15 100644 --- a/modules/game_market/ui/general/markettabs.otui +++ b/modules/game_market/ui/general/markettabs.otui @@ -10,15 +10,9 @@ MarketTabBarButton < TabBarButton margin-left: 0 $hover !checked: - image-clip: 0 20 20 20 - color: white - - $disabled: - image-color: #ffffff66 - icon-color: #888888 + color: #ffffff $checked: - image-clip: 0 20 20 20 color: #ffffff $on !checked: @@ -26,36 +20,24 @@ MarketTabBarButton < TabBarButton MarketRightTabBar < TabBar MarketRightTabBarPanel < TabBarPanel -// TODO: inherit style from TabBarButton and adjust it -// anchors.left: none did not seem to work for me -MarketRightTabBarButton < UIButton +MarketRightTabBarButton < TabBarButton size: 20 25 font: verdana-11px-rounded text-offset: 0 2 - image-source: /images/ui/tabbutton_square - image-color: white - image-clip: 0 0 20 20 - image-border: 3 - icon-color: white - color: #aaaaaa - anchors.top: parent.top - padding: 5 - - anchors.right: prev.left + color: #929292 $first: anchors.right: parent.right + anchors.left: none + + $!first: + anchors.right: prev.left + anchors.left: none $hover !checked: - image-clip: 0 20 20 20 - color: white - - $disabled: - image-color: #ffffff66 - icon-color: #888888 + color: #ffffff $checked: - image-clip: 0 20 20 20 color: #ffffff $on !checked: diff --git a/modules/game_market/ui/marketoffers/browse.otui b/modules/game_market/ui/marketoffers/browse.otui index 41565c2d..90716979 100644 --- a/modules/game_market/ui/marketoffers/browse.otui +++ b/modules/game_market/ui/marketoffers/browse.otui @@ -52,7 +52,7 @@ Panel MarketButtonBox id: filterLevel - checked: false + &default: false !text: tr('Level') !tooltip: tr('Filter list to match your level') anchors.top: prev.bottom @@ -62,11 +62,10 @@ Panel margin-left: 3 width: 40 height: 20 - @onCheckChange: Market.updateCurrentItems() MarketButtonBox id: filterVocation - checked: false + &default: false !text: tr('Voc.') !tooltip: tr('Filter list to match your vocation') anchors.top: prev.top @@ -75,7 +74,6 @@ Panel margin-left: 3 width: 34 height: 20 - @onCheckChange: Market.updateCurrentItems() MarketComboBox id: slotComboBox @@ -90,7 +88,7 @@ Panel MarketButtonBox id: filterDepot - checked: false + &default: false !text: tr('Show Depot Only') !tooltip: tr('Show your depot items only') anchors.top: prev.bottom @@ -99,7 +97,6 @@ Panel margin-top: 6 margin-right: 3 margin-left: 3 - @onCheckChange: Market.updateCurrentItems() Panel id: itemsContainer @@ -152,11 +149,10 @@ Panel MarketButtonBox id: filterSearchAll - checked: false + &default: true !text: tr('All') !tooltip: tr('Search all items') anchors.verticalCenter: prev.verticalCenter anchors.left: prev.right anchors.right: itemsContainer.right margin-left: 3 - @onCheckChange: Market.updateCurrentItems() From 596717bf3232f826024df5e7ee600adeb0bc9fb1 Mon Sep 17 00:00:00 2001 From: TheSumm Date: Tue, 20 Jan 2015 16:18:04 +0100 Subject: [PATCH 16/43] Added locale number formatting to locale files --- data/locales/de.lua | 4 ++++ data/locales/en.lua | 4 ++++ data/locales/es.lua | 4 ++++ data/locales/pl.lua | 4 ++++ data/locales/pt.lua | 4 ++++ data/locales/sv.lua | 4 ++++ modules/client_locales/locales.lua | 16 ++++++++++------ 7 files changed, 34 insertions(+), 6 deletions(-) diff --git a/data/locales/de.lua b/data/locales/de.lua index 5ce0f7f5..9637d661 100644 --- a/data/locales/de.lua +++ b/data/locales/de.lua @@ -4,6 +4,10 @@ locale = { charset = "cp1252", languageName = "Deutsch", + formatNumbers = true, + decimalSeperator = ',', + thousandsSeperator = ' ', + translation = { ["1a) Offensive Name"] = false, ["1b) Invalid Name Format"] = false, diff --git a/data/locales/en.lua b/data/locales/en.lua index 3bcf03a7..55081109 100644 --- a/data/locales/en.lua +++ b/data/locales/en.lua @@ -3,6 +3,10 @@ locale = { charset = "cp1252", languageName = "English", + formatNumbers = true, + decimalSeperator = '.', + thousandsSeperator = ',', + -- translations are not needed because everything is already in english translation = {} } diff --git a/data/locales/es.lua b/data/locales/es.lua index 917a1b4f..0e67deb1 100644 --- a/data/locales/es.lua +++ b/data/locales/es.lua @@ -7,6 +7,10 @@ locale = { charset = "cp1252", languageName = "Español", + formatNumbers = true, + decimalSeperator = ',', + thousandsSeperator = '.', + translation = { ["1a) Offensive Name"] = "1a) Nombre ofensivo", ["1b) Invalid Name Format"] = "1b) Formato invalido para nombre", diff --git a/data/locales/pl.lua b/data/locales/pl.lua index 3a74f0f7..a7c38131 100644 --- a/data/locales/pl.lua +++ b/data/locales/pl.lua @@ -2,6 +2,10 @@ locale = { name = "pl", languageName = "Polski", + formatNumbers = true, + decimalSeperator = '.', + thousandsSeperator = ' ', + translation = { ["1a) Offensive Name"] = "1a) Obrazliwe Imie", ["1b) Invalid Name Format"] = "1b) Niepoprawny Format Imienia", diff --git a/data/locales/pt.lua b/data/locales/pt.lua index 1cc91f03..e5dc3b0b 100644 --- a/data/locales/pt.lua +++ b/data/locales/pt.lua @@ -3,6 +3,10 @@ locale = { charset = "cp1252", languageName = "Português", + formatNumbers = true, + decimalSeperator = ',', + thousandsSeperator = '.', + -- As traduções devem vir sempre em ordem alfabética. translation = { ["%d of experience per hour"] = "%d de experiência por hora", diff --git a/data/locales/sv.lua b/data/locales/sv.lua index c060195a..d6263f49 100644 --- a/data/locales/sv.lua +++ b/data/locales/sv.lua @@ -5,6 +5,10 @@ locale = { charset = "cp1252", languageName = "Svenska", + formatNumbers = true, + decimalSeperator = ',', + thousandsSeperator = ' ', + translation = { ["1a) Offensive Name"] = "1a) Offensivt Namn", ["1b) Invalid Name Format"] = "1b) Ogiltigt Namnformat", diff --git a/modules/client_locales/locales.lua b/modules/client_locales/locales.lua index ecf69966..a3e3d82e 100644 --- a/modules/client_locales/locales.lua +++ b/modules/client_locales/locales.lua @@ -166,16 +166,20 @@ end -- global function used to translate texts function _G.tr(text, ...) if currentLocale then - if tonumber(text) then - -- todo: use locale information to calculate this. also detect floating numbers + if tonumber(text) and currentLocale.formatNumbers then + local number = tostring(text):split('.') local out = '' - local number = tostring(text):reverse() - for i=1,#number do - out = out .. number:sub(i, i) + local reverseNumber = number[1]:reverse() + for i=1,#reverseNumber do + out = out .. reverseNumber:sub(i, i) if i % 3 == 0 and i ~= #number then - out = out .. ',' + out = out .. currentLocale.thousandsSeperator end end + + if number[2] then + out = number[2] .. currentLocale.decimalSeperator .. out + end return out:reverse() elseif tostring(text) then local translation = currentLocale.translation[text] From 6edc73a8ba5b3a78f54350fb3bec0aa34f0328d5 Mon Sep 17 00:00:00 2001 From: TheSumm Date: Wed, 21 Jan 2015 18:58:30 +0100 Subject: [PATCH 17/43] Fix Enter Game window not being centered on startup --- modules/client_entergame/entergame.lua | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/modules/client_entergame/entergame.lua b/modules/client_entergame/entergame.lua index 312f0658..49db7853 100644 --- a/modules/client_entergame/entergame.lua +++ b/modules/client_entergame/entergame.lua @@ -124,13 +124,14 @@ function EnterGame.init() clientBox = enterGame:getChildById('clientComboBox') - connect(clientBox, { onOptionChange = EnterGame.onClientVersionChange }) - for _, proto in pairs(g_game.getSupportedClients()) do clientBox:addOption(proto) end clientBox:setCurrentOption(clientVersion) + EnterGame.toggleAuthenticatorToken(clientVersion, true) + connect(clientBox, { onOptionChange = EnterGame.onClientVersionChange }) + enterGame:hide() if g_app.isRunning() and not g_game.isOnline() then @@ -220,7 +221,8 @@ function EnterGame.clearAccountFields() g_settings.remove('password') end -function EnterGame.toggleAuthenticatorToken(enabled) +function EnterGame.toggleAuthenticatorToken(clientVersion, init) + local enabled = (clientVersion >= 1072) if enabled == enterGame.authenticatorEnabled then return end @@ -232,9 +234,11 @@ function EnterGame.toggleAuthenticatorToken(enabled) local serverLabel = enterGame:getChildById('serverLabel') serverLabel:setMarginTop(serverLabel:getMarginTop() + enterGame.authenticatorHeight) - enterGame:breakAnchors() - enterGame:setY(enterGame:getY() - enterGame.authenticatorHeight) - enterGame:bindRectToParent() + if not init then + enterGame:breakAnchors() + enterGame:setY(enterGame:getY() - enterGame.authenticatorHeight) + enterGame:bindRectToParent() + end enterGame:setHeight(enterGame:getHeight() + enterGame.authenticatorHeight) else @@ -244,9 +248,11 @@ function EnterGame.toggleAuthenticatorToken(enabled) local serverLabel = enterGame:getChildById('serverLabel') serverLabel:setMarginTop(serverLabel:getMarginTop() - enterGame.authenticatorHeight) - enterGame:breakAnchors() - enterGame:setY(enterGame:getY() + enterGame.authenticatorHeight) - enterGame:bindRectToParent() + if not init then + enterGame:breakAnchors() + enterGame:setY(enterGame:getY() + enterGame.authenticatorHeight) + enterGame:bindRectToParent() + end enterGame:setHeight(enterGame:getHeight() - enterGame.authenticatorHeight) end @@ -256,7 +262,7 @@ end function EnterGame.onClientVersionChange(comboBox, text, data) local clientVersion = tonumber(text) - EnterGame.toggleAuthenticatorToken(clientVersion >= 1072) + EnterGame.toggleAuthenticatorToken(clientVersion) end function EnterGame.doLogin() From 607dab01d67f27a9c56b74c707f075b56a4a6571 Mon Sep 17 00:00:00 2001 From: TheSumm Date: Wed, 21 Jan 2015 23:40:15 +0100 Subject: [PATCH 18/43] Added Market column sorting (fixes #429), updated UITable and fixed not working methods --- data/styles/20-tables.otui | 46 ++- modules/corelib/ui/uitable.lua | 319 ++++++++++++++---- modules/game_market/market.lua | 105 +++--- .../ui/marketoffers/itemdetails.otui | 3 +- .../ui/marketoffers/itemoffers.otui | 57 +++- .../ui/marketoffers/itemstats.otui | 3 +- 6 files changed, 395 insertions(+), 138 deletions(-) diff --git a/data/styles/20-tables.otui b/data/styles/20-tables.otui index a6d80cbb..51e53e5c 100644 --- a/data/styles/20-tables.otui +++ b/data/styles/20-tables.otui @@ -1,26 +1,62 @@ Table < UITable layout: verticalBox - header-column-style: HeaderTableColumn - header-row-style: HeaderTableRow + header-column-style: TableHeaderColumn + header-row-style: TableHeaderRow column-style: TableColumn row-style: TableRow TableData < UIScrollArea layout: verticalBox -TableRow < Label +TableRow < UITableRow layout: horizontalBox height: 10 text-wrap: true + focusable: true + even-background-color: alpha + odd-background-color: #00000022 + + $focus: + background-color: #294f6d + color: #ffffff TableColumn < Label width: 30 text-wrap: true + focusable: false TableHeaderRow < Label layout: horizontalBox + focusable: false height: 10 text-wrap: true -TableHeaderColumn < Button - width: 30 \ No newline at end of file +TableHeaderColumn < UITableHeaderColumn + font: verdana-11px-antialised + background-color: alpha + color: #dfdfdfff + height: 23 + focusable: true + text-offset: 0 0 + image-source: /images/ui/button + image-color: #dfdfdf + image-clip: 0 0 22 23 + image-border: 3 + padding: 5 10 5 10 + enabled: false + focusable: false + + $hover !disabled: + image-clip: 0 23 22 23 + + $pressed: + image-clip: 0 46 22 23 + text-offset: 1 1 + + $disabled: + color: #dfdfdf88 + opacity: 0.8 + +SortableTableHeaderColumn < TableHeaderColumn + enabled: true + focusable: true \ No newline at end of file diff --git a/modules/corelib/ui/uitable.lua b/modules/corelib/ui/uitable.lua index af70a01b..6529d8fc 100644 --- a/modules/corelib/ui/uitable.lua +++ b/modules/corelib/ui/uitable.lua @@ -3,33 +3,45 @@ TODO: * Make table headers more robust. * Get dynamic row heights working with text wrapping. - * Every second row different background color applied. ]] + +TABLE_SORTING_ASC = 0 +TABLE_SORTING_DESC = 1 + UITable = extends(UIWidget, "UITable") -local HEADER_ID = 'row0' - +-- Initialize default values function UITable.create() local table = UITable.internalCreate() table.headerRow = nil + table.headerColumns = {} table.dataSpace = nil table.rows = {} table.rowBaseStyle = nil table.columns = {} + table.columnWidth = {} table.columBaseStyle = nil table.headerRowBaseStyle = nil table.headerColumnBaseStyle = nil table.selectedRow = nil + table.defaultColumnWidth = 80 + table.sortColumn = -1 + table.sortType = TABLE_SORTING_ASC + table.autoSort = false + return table end +-- Clear table values function UITable:onDestroy() - for k,row in pairs(self.rows) do + for _,row in pairs(self.rows) do row.onClick = nil end self.rows = {} self.columns = {} - self.headerRow = {} + self.headerRow = nil + self.headerColumns = {} + self.columnWidth = {} self.selectedRow = nil if self.dataSpace then @@ -38,36 +50,58 @@ function UITable:onDestroy() end end +-- Detect if a header is already defined +function UITable:onSetup() + local header = self:getChildById('header') + if header then + self:setHeader(header) + end +end + +-- Parse table related styles function UITable:onStyleApply(styleName, styleNode) for name, value in pairs(styleNode) do - if name == 'table-data' then - addEvent(function() - self:setTableData(self:getParent():getChildById(value)) - end) - elseif name == 'column-style' then - addEvent(function() - self:setColumnStyle(value) - end) - elseif name == 'row-style' then - addEvent(function() - self:setRowStyle(value) - end) - elseif name == 'header-column-style' then - addEvent(function() - self:setHeaderColumnStyle(value) - end) - elseif name == 'header-row-style' then - addEvent(function() - self:setHeaderRowStyle(value) - end) + if value ~= false then + if name == 'table-data' then + addEvent(function() + self:setTableData(self:getParent():getChildById(value)) + end) + elseif name == 'column-style' then + addEvent(function() + self:setColumnStyle(value) + end) + elseif name == 'row-style' then + addEvent(function() + self:setRowStyle(value) + end) + elseif name == 'header-column-style' then + addEvent(function() + self:setHeaderColumnStyle(value) + end) + elseif name == 'header-row-style' then + addEvent(function() + self:setHeaderRowStyle(value) + end) + end end end end +function UITable:setColumnWidth(width) + if self:hasHeader() then return end + self.columnWidth = width +end + +function UITable:setDefaultColumnWidth(width) + self.defaultColumnWidth = width +end + +-- Check if the table has a header function UITable:hasHeader() return self.headerRow ~= nil end +-- Clear all rows function UITable:clearData() if not self.dataSpace then return @@ -78,23 +112,49 @@ function UITable:clearData() self.rows = {} end -function UITable:addHeaderRow(data) +-- Set existing child as header +function UITable:setHeader(headerWidget) + self:removeHeader() + + if self.dataSpace then + local newHeight = self.dataSpace:getHeight()-headerRow:getHeight()-self.dataSpace:getMarginTop() + self.dataSpace:applyStyle({ height = newHeight }) + end + + self.headerColumns = {} + self.columnWidth = {} + for colId, column in pairs(headerWidget:getChildren()) do + column.colId = colId + column.table = self + table.insert(self.columnWidth, column:getWidth()) + table.insert(self.headerColumns, column) + end + + self.headerRow = headerWidget +end + +-- Create and add header from table data +function UITable:addHeader(data) if not data or type(data) ~= 'table' then g_logger.error('UITable:addHeaderRow - table columns must be provided in a table') return end + self:removeHeader() + -- build header columns local columns = {} - for _, column in pairs(data) do + for colId, column in pairs(data) do local col = g_ui.createWidget(self.headerColumnBaseStyle) + col.colId = colId + col.table = self for type, value in pairs(column) do if type == 'width' then col:setWidth(value) elseif type == 'height' then col:setHeight(value) elseif type == 'text' then - col:setText(value) + col:setText(tr(value)) elseif type == 'onClick' then col.onClick = value end @@ -104,23 +164,34 @@ function UITable:addHeaderRow(data) -- create a new header local headerRow = g_ui.createWidget(self.headerRowBaseStyle, self) - local newHeight = (self.dataSpace:getHeight()-headerRow:getHeight())-self.dataSpace:getMarginTop() + local newHeight = self.dataSpace:getHeight()-headerRow:getHeight()-self.dataSpace:getMarginTop() self.dataSpace:applyStyle({ height = newHeight }) - headerRow:setId(HEADER_ID) + headerRow:setId('header') + self.headerColumns = {} + self.columnWidth = {} for _, column in pairs(columns) do headerRow:addChild(column) - self.columns[HEADER_ID] = column + table.insert(self.columnWidth, column:getWidth()) + table.insert(self.headerColumns, column) end - headerRow.onClick = function(headerRow) self:selectRow(headerRow) end self.headerRow = headerRow return headerRow end -function UITable:removeHeaderRow() - self.headerRow:destroy() - self.headerRow = nil +-- Remove header +function UITable:removeHeader() + if self:hasHeader() then + if self.dataSpace then + local newHeight = self.dataSpace:getHeight()+self.headerRow:getHeight()+self.dataSpace:getMarginTop() + self.dataSpace:applyStyle({ height = newHeight }) + end + self.headerColumns = {} + self.columnWidth = {} + self.headerRow:destroy() + self.headerRow = nil + end end function UITable:addRow(data, ref, height) @@ -134,41 +205,124 @@ function UITable:addRow(data, ref, height) end local row = g_ui.createWidget(self.rowBaseStyle) + row.table = self if ref then row.ref = ref end if height then row:setHeight(height) end - local rowId = #self.rows - row:setId('row'..(rowId < 1 and 1 or rowId)) + local rowId = #self.rows + 1 + row.rowId = rowId + row:setId('row'..rowId) + row:updateBackgroundColor() - for _, column in pairs(data) do + self.columns[rowId] = {} + for colId, column in pairs(data) do local col = g_ui.createWidget(self.columBaseStyle, row) - for type, value in pairs(column) do - if type == 'width' then - col:setWidth(value) - elseif type == 'height' then - col:setHeight(value) - elseif type == 'text' then - col:setText(value) - end + if column.width then + col:setWidth(column.width) + else + col:setWidth(self.columnWidth[colId] or self.defaultColumnWidth) end - self.columns[rowId] = col + if column.height then + col:setHeight(column.height) + end + if column.text then + col:setText(column.text) + end + if column.sortvalue then + col.sortvalue = column.sortvalue + else + col.sortvalue = column.text or 0 + end + table.insert(self.columns[rowId], col) end - row.onFocusChange = function(row, focused) - if focused then self:selectRow(row) end - end self.dataSpace:addChild(row) - table.insert(self.rows, row) + + if self.autoSort then + self:sort() + end + return row end +-- Update row indices and background color +function UITable:updateRows() + for rowId = 1, #self.rows do + local row = self.rows[rowId] + row.rowId = rowId + row:setId('row'..rowId) + row:updateBackgroundColor() + end +end + +-- Removes the given row widget from the table function UITable:removeRow(row) if self.selectedRow == row then self:selectRow(nil) end row.onClick = nil - table.removevalue(self.rows, row) + row.table = nil + table.remove(self.columns, row.rowId) + table.remove(self.rows, row.rowId) + self.dataSpace:removeChild(row) + self:updateRows() +end + +function UITable:toggleSorting(enabled) + self.autoSort = enabled +end + +function UITable:setSorting(colId, sortType) + self.headerColumns[colId]:focus() + + if sortType then + self.sortType = sortType + elseif self.sortColumn == colId then + if self.sortType == TABLE_SORTING_ASC then + self.sortType = TABLE_SORTING_DESC + else + self.sortType = TABLE_SORTING_ASC + end + else + self.sortType = TABLE_SORTING_ASC + end + self.sortColumn = colId +end + +function UITable:sort() + if self.sortColumn <= 0 then + return + end + + if self.sortType == TABLE_SORTING_ASC then + table.sort(self.rows, function(rowA, b) + return rowA:getChildByIndex(self.sortColumn).sortvalue < b:getChildByIndex(self.sortColumn).sortvalue + end) + else + table.sort(self.rows, function(rowA, b) + return rowA:getChildByIndex(self.sortColumn).sortvalue > b:getChildByIndex(self.sortColumn).sortvalue + end) + end + + if self.dataSpace then + for _, child in pairs(self.dataSpace:getChildren()) do + self.dataSpace:removeChild(child) + end + end + + self:updateRows() + self.columns = {} + for _, row in pairs(self.rows) do + if self.dataSpace then + self.dataSpace:addChild(row) + end + + self.columns[row.rowId] = {} + for _, column in pairs(row:getChildren()) do + table.insert(self.columns[row.rowId], column) + end + end end function UITable:selectRow(selectedRow) @@ -189,8 +343,13 @@ function UITable:selectRow(selectedRow) end function UITable:setTableData(tableData) + local headerHeight = 0 + if self.headerRow then + headerHeight = self.headerRow:getHeight() + end + self.dataSpace = tableData - self.dataSpace:applyStyle({ height = self:getHeight() }) + self.dataSpace:applyStyle({ height = self:getHeight()-headerHeight-self:getMarginTop() }) end function UITable:setRowStyle(style) @@ -202,8 +361,10 @@ end function UITable:setColumnStyle(style) self.columBaseStyle = style - for _, col in pairs(self.columns) do - col:setStyle(style) + for _, columns in pairs(self.columns) do + for _, col in pairs(columns) do + col:setStyle(style) + end end end @@ -216,7 +377,51 @@ end function UITable:setHeaderColumnStyle(style) self.headerColumnBaseStyle = style - if table.haskey(HEADER_ID) then - self.columns[HEADER_ID]:setStyle(style) + for _, col in pairs(self.headerColumns) do + col:setStyle(style) + end +end + + +UITableRow = extends(UIWidget, "UITableRow") + +function UITableRow:onFocusChange(focused) + if focused then + if self.table then self.table:selectRow(self) end + end +end + +function UITableRow:onStyleApply(styleName, styleNode) + for name,value in pairs(styleNode) do + if name == 'even-background-color' then + self.evenBackgroundColor = value + elseif name == 'odd-background-color' then + self.oddBackgroundColor = value + end + end +end + +function UITableRow:updateBackgroundColor() + self.backgroundColor = nil + + local isEven = (self.rowId % 2 == 0) + if isEven and self.evenBackgroundColor then + self.backgroundColor = self.evenBackgroundColor + elseif not isEven and self.oddBackgroundColor then + self.backgroundColor = self.oddBackgroundColor + end + + if self.backgroundColor then + self:mergeStyle({ ['background-color'] = self.backgroundColor }) + end +end + + +UITableHeaderColumn = extends(UIButton, "UITableHeaderColumn") + +function UITableHeaderColumn:onClick() + if self.table then + self.table:setSorting(self.colId) + self.table:sort() end end diff --git a/modules/game_market/market.lua b/modules/game_market/market.lua index 49d326e4..7cebeb24 100644 --- a/modules/game_market/market.lua +++ b/modules/game_market/market.lua @@ -13,9 +13,6 @@ * Clean up the interface building - Add a new market interface file to handle building? - * Add offer table column ordering. - - Player Name, Amount, Total Price, Peice Price and Ends At - * Extend information features - Hover over offers for purchase information (balance after transaction, etc) - Display out of trend market offers based on their previous statistics (like cipsoft does) @@ -78,14 +75,6 @@ fee = 0 loaded = false -local offerTableHeader = { - {['text'] = 'Player Name', ['width'] = 100}, - {['text'] = 'Amount', ['width'] = 60}, - {['text'] = 'Total Price', ['width'] = 90}, - {['text'] = 'Piece Price', ['width'] = 80}, - {['text'] = 'Ends at', ['width'] = 120} -} - local function isItemValid(item, category, searchFilter) if not item or not item.marketData then return false @@ -169,7 +158,7 @@ local function refreshTypeList() end end -local function addOffer(offer, type) +local function addOffer(offer, offerType) if not offer then return false end @@ -179,26 +168,35 @@ local function addOffer(offer, type) local price = offer:getPrice() local timestamp = offer:getTimeStamp() + buyOfferTable:toggleSorting(false) + sellOfferTable:toggleSorting(false) + if amount < 1 then return false end - if type == MarketAction.Buy then + if offerType == MarketAction.Buy then local data = { - {['text'] = player, ['width'] = 100}, - {['text'] = amount, ['width'] = 60}, - {['text'] = price*amount, ['width'] = 90}, - {['text'] = price, ['width'] = 80}, - {['text'] = string.gsub(os.date('%c', timestamp), " ", " "), ['width'] = 120} + {text = player}, + {text = amount}, + {text = price*amount}, + {text = price}, + {text = string.gsub(os.date('%c', timestamp), " ", " ")} } buyOfferTable:addRow(data, id) else local data = { - {['text'] = player, ['width'] = 100}, - {['text'] = amount, ['width'] = 60}, - {['text'] = price*amount, ['width'] = 90}, - {['text'] = price, ['width'] = 80}, - {['text'] = string.gsub(os.date('%c', timestamp), " ", " "), ['width'] = 120} + {text = player}, + {text = amount}, + {text = price*amount}, + {text = price}, + {text = string.gsub(os.date('%c', timestamp), " ", " "), sortvalue = timestamp} } sellOfferTable:addRow(data, id) end + + buyOfferTable:toggleSorting(false) + sellOfferTable:toggleSorting(false) + buyOfferTable:sort() + sellOfferTable:sort() + return true end @@ -207,11 +205,11 @@ local function mergeOffer(offer) return false end local id = offer:getId() - local type = offer:getType() + local offerType = offer:getType() local amount = offer:getAmount() local replaced = false - if type == MarketAction.Buy then + if offerType == MarketAction.Buy then for i = 1, #marketOffers[MarketAction.Buy] do local o = marketOffers[MarketAction.Buy][i] -- replace existing offer @@ -250,7 +248,9 @@ local function updateOffers(offers) -- clear existing offer data buyOfferTable:clearData() + buyOfferTable:setSorting(4, TABLE_SORTING_DESC) sellOfferTable:clearData() + sellOfferTable:setSorting(4, TABLE_SORTING_ASC) sellButton:setEnabled(false) buyButton:setEnabled(false) @@ -274,8 +274,8 @@ local function updateDetails(itemId, descriptions, purchaseStats, saleStats) detailsTable:clearData() for k, desc in pairs(descriptions) do local columns = { - {['text'] = getMarketDescriptionName(desc[1])..':'}, - {['text'] = desc[2], ['width'] = 330} + {text = getMarketDescriptionName(desc[1])..':'}, + {text = desc[2]} } detailsTable:addRow(columns) end @@ -283,7 +283,7 @@ local function updateDetails(itemId, descriptions, purchaseStats, saleStats) -- update sale item statistics sellStatsTable:clearData() if table.empty(saleStats) then - sellStatsTable:addRow({{['text'] = 'No information'}}) + sellStatsTable:addRow({{text = 'No information'}}) else local transactions, totalPrice, highestPrice, lowestPrice = 0, 0, 0, 0 for _, stat in pairs(saleStats) do @@ -301,28 +301,24 @@ local function updateDetails(itemId, descriptions, purchaseStats, saleStats) end end end - sellStatsTable:addRow({{['text'] = 'Total Transations:'}, - {['text'] = transactions, ['width'] = 270}}) - sellStatsTable:addRow({{['text'] = 'Highest Price:'}, - {['text'] = highestPrice, ['width'] = 270}}) + sellStatsTable:addRow({{text = 'Total Transations:'}, {text = transactions}}) + sellStatsTable:addRow({{text = 'Highest Price:'}, {text = highestPrice}}) if totalPrice > 0 and transactions > 0 then - sellStatsTable:addRow({{['text'] = 'Average Price:'}, - {['text'] = math.floor(totalPrice/transactions), ['width'] = 270}}) + sellStatsTable:addRow({{text = 'Average Price:'}, + {text = math.floor(totalPrice/transactions)}}) else - sellStatsTable:addRow({{['text'] = 'Average Price:'}, - {['text'] = 0, ['width'] = 270}}) + sellStatsTable:addRow({{text = 'Average Price:'}, {text = 0}}) end - sellStatsTable:addRow({{['text'] = 'Lowest Price:'}, - {['text'] = lowestPrice, ['width'] = 270}}) + sellStatsTable:addRow({{text = 'Lowest Price:'}, {text = lowestPrice}}) end -- update buy item statistics buyStatsTable:clearData() if table.empty(purchaseStats) then - buyStatsTable:addRow({{['text'] = 'No information'}}) + buyStatsTable:addRow({{text = 'No information'}}) else local transactions, totalPrice, highestPrice, lowestPrice = 0, 0, 0, 0 for _, stat in pairs(purchaseStats) do @@ -340,22 +336,18 @@ local function updateDetails(itemId, descriptions, purchaseStats, saleStats) end end end - buyStatsTable:addRow({{['text'] = 'Total Transations:'}, - {['text'] = transactions, ['width'] = 270}}) - buyStatsTable:addRow({{['text'] = 'Highest Price:'}, - {['text'] = highestPrice, ['width'] = 270}}) + buyStatsTable:addRow({{text = 'Total Transations:'},{text = transactions}}) + buyStatsTable:addRow({{text = 'Highest Price:'}, {text = highestPrice}}) if totalPrice > 0 and transactions > 0 then - buyStatsTable:addRow({{['text'] = 'Average Price:'}, - {['text'] = math.floor(totalPrice/transactions), ['width'] = 270}}) + buyStatsTable:addRow({{text = 'Average Price:'}, + {text = math.floor(totalPrice/transactions)}}) else - buyStatsTable:addRow({{['text'] = 'Average Price:'}, - {['text'] = 0, ['width'] = 270}}) + buyStatsTable:addRow({{text = 'Average Price:'}, {text = 0}}) end - buyStatsTable:addRow({{['text'] = 'Lowest Price:'}, - {['text'] = lowestPrice, ['width'] = 270}}) + buyStatsTable:addRow({{text = 'Lowest Price:'}, {text = lowestPrice}}) end end @@ -737,6 +729,13 @@ local function initInterface() sellStatsTable = itemStatsPanel:recursiveGetChildById('sellStatsTable') buyOfferTable.onSelectionChange = onSelectBuyOffer sellOfferTable.onSelectionChange = onSelectSellOffer + + buyStatsTable:setColumnWidth({120, 270}) + sellStatsTable:setColumnWidth({120, 270}) + detailsTable:setColumnWidth({80, 330}) + + buyOfferTable:setSorting(4, TABLE_SORTING_DESC) + sellOfferTable:setSorting(4, TABLE_SORTING_ASC) end function init() @@ -1125,14 +1124,6 @@ function Market.onMarketEnter(depotItems, offers, balance, vocation) Market.loadMarketItems(MarketCategory.First) end - -- build offer table header - if buyOfferTable and not buyOfferTable:hasHeader() then - buyOfferTable:addHeaderRow(offerTableHeader) - end - if sellOfferTable and not sellOfferTable:hasHeader() then - sellOfferTable:addHeaderRow(offerTableHeader) - end - if g_game.isOnline() then marketWindow:lock() marketWindow:show() diff --git a/modules/game_market/ui/marketoffers/itemdetails.otui b/modules/game_market/ui/marketoffers/itemdetails.otui index 4b2fc55f..310f858b 100644 --- a/modules/game_market/ui/marketoffers/itemdetails.otui +++ b/modules/game_market/ui/marketoffers/itemdetails.otui @@ -1,11 +1,12 @@ DetailsTableRow < TableRow font: verdana-11px-monochrome - background-color: alpha focusable: true color: #cccccc height: 45 focusable: false padding: 2 + even-background-color: alpha + odd-background-color: alpha DetailsTableColumn < TableColumn font: verdana-11px-monochrome diff --git a/modules/game_market/ui/marketoffers/itemoffers.otui b/modules/game_market/ui/marketoffers/itemoffers.otui index 275d1bb1..0556450b 100644 --- a/modules/game_market/ui/marketoffers/itemoffers.otui +++ b/modules/game_market/ui/marketoffers/itemoffers.otui @@ -1,35 +1,24 @@ OfferTableRow < TableRow font: verdana-11px-monochrome - background-color: alpha - focusable: true color: #cccccc height: 15 - $focus: - background-color: #294f6d - color: #ffffff - OfferTableColumn < TableColumn font: verdana-11px-monochrome background-color: alpha text-offset: 5 0 color: #cccccc width: 80 - focusable: false OfferTableHeaderRow < TableHeaderRow font: verdana-11px-monochrome - focusable: false color: #cccccc height: 20 -OfferTableHeaderColumn < TableHeaderColumn +OfferTableHeaderColumn < SortableTableHeaderColumn font: verdana-11px-monochrome - background-color: alpha text-offset: 2 0 color: #cccccc - width: 80 - focusable: true $focus: background-color: #294f6d @@ -74,8 +63,26 @@ Panel table-data: sellingTableData row-style: OfferTableRow column-style: OfferTableColumn - header-row-style: OfferTableHeaderRow - header-column-style: OfferTableHeaderColumn + header-column-style: false + header-row-style: false + + OfferTableHeaderRow + id: header + OfferTableHeaderColumn + !text: tr('Buyer Name') + width: 100 + OfferTableHeaderColumn + !text: tr('Amount') + width: 60 + OfferTableHeaderColumn + !text: tr('Total Price') + width: 90 + OfferTableHeaderColumn + !text: tr('Piece Price') + width: 80 + OfferTableHeaderColumn + !text: tr('Auction End') + width: 120 TableData id: sellingTableData @@ -129,8 +136,26 @@ Panel table-data: buyingTableData row-style: OfferTableRow column-style: OfferTableColumn - header-row-style: OfferTableHeaderRow - header-column-style: OfferTableHeaderColumn + header-column-style: false + header-row-style: false + + OfferTableHeaderRow + id: header + OfferTableHeaderColumn + !text: tr('Seller Name') + width: 100 + OfferTableHeaderColumn + !text: tr('Amount') + width: 60 + OfferTableHeaderColumn + !text: tr('Total Price') + width: 90 + OfferTableHeaderColumn + !text: tr('Piece Price') + width: 80 + OfferTableHeaderColumn + !text: tr('Auction End') + width: 120 TableData id: buyingTableData diff --git a/modules/game_market/ui/marketoffers/itemstats.otui b/modules/game_market/ui/marketoffers/itemstats.otui index 709831b4..61afa97b 100644 --- a/modules/game_market/ui/marketoffers/itemstats.otui +++ b/modules/game_market/ui/marketoffers/itemstats.otui @@ -1,6 +1,5 @@ StatsTableRow < TableRow font: verdana-11px-monochrome - background-color: alpha focusable: true color: #cccccc height: 20 @@ -9,7 +8,7 @@ StatsTableRow < TableRow StatsTableColumn < TableColumn font: verdana-11px-monochrome background-color: alpha - text-offset: 5 0 + text-offset: 5 3 color: #cccccc width: 110 focusable: false From 1d022905abb05c63bfc3efdbb84ac4c645f7780b Mon Sep 17 00:00:00 2001 From: TheSumm Date: Thu, 22 Jan 2015 11:49:04 +0100 Subject: [PATCH 19/43] Fix button style (closes #607) --- data/styles/10-buttons.otui | 1 + 1 file changed, 1 insertion(+) diff --git a/data/styles/10-buttons.otui b/data/styles/10-buttons.otui index 8967b2e2..9e0a5aca 100644 --- a/data/styles/10-buttons.otui +++ b/data/styles/10-buttons.otui @@ -8,6 +8,7 @@ Button < UIButton image-clip: 0 0 22 23 image-border: 3 padding: 5 10 5 10 + opacity: 1.0 $hover !disabled: image-clip: 0 23 22 23 From 92e2e8224f253619ad8f1a116a967cfc8c4f5c3d Mon Sep 17 00:00:00 2001 From: TheSumm Date: Thu, 22 Jan 2015 20:38:28 +0100 Subject: [PATCH 20/43] Added market message, reworked text messages a little --- modules/game_market/market.lua | 17 +++++++++++++- modules/game_textmessage/textmessage.lua | 13 ++++++---- modules/gamelib/gamelib.otmod | 1 + modules/gamelib/market.lua | 4 ++-- modules/gamelib/textmessages.lua | 30 ++++++++++++++++++++++++ 5 files changed, 57 insertions(+), 8 deletions(-) create mode 100644 modules/gamelib/textmessages.lua diff --git a/modules/game_market/market.lua b/modules/game_market/market.lua index 7cebeb24..eba20623 100644 --- a/modules/game_market/market.lua +++ b/modules/game_market/market.lua @@ -575,6 +575,10 @@ local function onAmountChange() end end +local function onMarketMessage(messageMode, message) + Market.displayMessage(message) +end + local function initMarketItems(category) for c = MarketCategory.First, MarketCategory.Last do marketItems[c] = {} @@ -748,6 +752,8 @@ function init() offerExhaust[MarketAction.Sell] = 10 offerExhaust[MarketAction.Buy] = 20 + registerMessageMode(MessageModes.Market, onMarketMessage) + protocol.initProtocol() connect(g_game, { onGameEnd = Market.reset }) connect(g_game, { onGameEnd = Market.close }) @@ -760,6 +766,8 @@ end function terminate() Market.close() + unregisterMessageMode(MessageModes.Market, onMarketMessage) + protocol.terminateProtocol() disconnect(g_game, { onGameEnd = Market.reset }) disconnect(g_game, { onGameEnd = Market.close }) @@ -780,6 +788,13 @@ function Market.reset() end end +function Market.displayMessage(message) + if marketWindow:isHidden() then return end + + local infoBox = displayInfoBox(tr('Market Error'), message) + infoBox:lock() +end + function Market.clearSelectedItem() if Market.isItemSelected() then Market.resetCreateOffer() @@ -1059,7 +1074,7 @@ function Market.createNewOffer() end if errorMsg ~= '' then - displayInfoBox('Error', errorMsg) + Market.displayMessage(errorMsg) return end diff --git a/modules/game_textmessage/textmessage.lua b/modules/game_textmessage/textmessage.lua index 43c9cb66..2bd80d12 100644 --- a/modules/game_textmessage/textmessage.lua +++ b/modules/game_textmessage/textmessage.lua @@ -44,7 +44,6 @@ MessageTypes = { [MessageModes.Party] = MessageSettings.centerGreen, [MessageModes.PartyManagement] = MessageSettings.centerWhite, [MessageModes.TutorialHint] = MessageSettings.centerWhite, - [MessageModes.Market] = MessageSettings.centerWhite, [MessageModes.BeyondLast] = MessageSettings.centerWhite, [MessageModes.Report] = MessageSettings.consoleRed, [MessageModes.HotkeyUse] = MessageSettings.centerGreen, @@ -55,13 +54,19 @@ MessageTypes = { messagesPanel = nil function init() - connect(g_game, 'onTextMessage', displayMessage) + for messageMode, _ in pairs(MessageTypes) do + registerMessageMode(messageMode, displayMessage) + end + connect(g_game, 'onGameEnd', clearMessages) messagesPanel = g_ui.loadUI('textmessage', modules.game_interface.getRootPanel()) end function terminate() - disconnect(g_game, 'onTextMessage', displayMessage) + for messageMode, _ in pairs(MessageTypes) do + unregisterMessageMode(messageMode, displayMessage) + end + disconnect(g_game, 'onGameEnd', clearMessages) clearMessages() messagesPanel:destroy() @@ -75,9 +80,7 @@ function displayMessage(mode, text) if not g_game.isOnline() then return end local msgtype = MessageTypes[mode] - if not msgtype then - perror('unhandled onTextMessage message mode ' .. mode .. ': ' .. text) return end diff --git a/modules/gamelib/gamelib.otmod b/modules/gamelib/gamelib.otmod index 07c4dc3a..b45f9426 100644 --- a/modules/gamelib/gamelib.otmod +++ b/modules/gamelib/gamelib.otmod @@ -19,6 +19,7 @@ Module dofile 'creature' dofile 'player' dofile 'market' + dofile 'textmessages' dofile 'thing' dofile 'spells' diff --git a/modules/gamelib/market.lua b/modules/gamelib/market.lua index e8e2ed94..96d6b7cc 100644 --- a/modules/gamelib/market.lua +++ b/modules/gamelib/market.lua @@ -160,8 +160,8 @@ MarketFilters = { SearchAll = 4 } -MarketFilters.First = MarketFilters.vocation -MarketFilters.Last = MarketFilters.depot +MarketFilters.First = MarketFilters.Vocation +MarketFilters.Last = MarketFilters.Depot function getMarketSlotFilterId(name) local id = table.find(MarketSlotFilters, name) diff --git a/modules/gamelib/textmessages.lua b/modules/gamelib/textmessages.lua new file mode 100644 index 00000000..43c0a6f8 --- /dev/null +++ b/modules/gamelib/textmessages.lua @@ -0,0 +1,30 @@ +local messageModeCallbacks = {} + +function g_game.onTextMessage(messageMode, message) + local callbacks = messageModeCallbacks[messageMode] + if not callbacks or #callbacks == 0 then + perror(string.format('Unhandled onTextMessage message mode %i: %s', messageMode, message)) + return + end + + for _, callback in pairs(callbacks) do + callback(messageMode, message) + end +end + +function registerMessageMode(messageMode, callback) + if not messageModeCallbacks[messageMode] then + messageModeCallbacks[messageMode] = {} + end + + table.insert(messageModeCallbacks[messageMode], callback) + return true +end + +function unregisterMessageMode(messageMode, callback) + if not messageModeCallbacks[messageMode] then + return false + end + + return table.removevalue(messageModeCallbacks[messageMode], callback) +end From 3157e7924f335b2b013c390e1163cb5794685f52 Mon Sep 17 00:00:00 2001 From: TheSumm Date: Fri, 23 Jan 2015 02:52:05 +0100 Subject: [PATCH 21/43] Market updates, now using showAs / tradeAs so every items works properly, some cleanup / bug fixing --- modules/game_market/market.lua | 143 ++++++++----------------- modules/game_market/marketprotocol.lua | 4 +- 2 files changed, 48 insertions(+), 99 deletions(-) diff --git a/modules/game_market/market.lua b/modules/game_market/market.lua index eba20623..1bc7a631 100644 --- a/modules/game_market/market.lua +++ b/modules/game_market/market.lua @@ -99,7 +99,7 @@ local function isItemValid(item, category, searchFilter) local filterDepot = filterButtons[MarketFilters.Depot]:isChecked() if slotFilter then - if slotFilter ~= 255 and item.ptr:getClothSlot() ~= slotFilter then + if slotFilter ~= 255 and item.thingType:getClothSlot() ~= slotFilter then return false end end @@ -113,7 +113,7 @@ local function isItemValid(item, category, searchFilter) return false end end - if filterDepot and Market.depotContains(item.ptr:getId()) <= 0 then + if filterDepot and Market.getDepotCount(item.marketData.tradeAs) <= 0 then return false end if searchFilter then @@ -152,7 +152,7 @@ local function refreshTypeList() offerTypeList:addOption('Buy') if Market.isItemSelected() then - if Market.depotContains(selectedItem.item.ptr:getId()) > 0 then + if Market.getDepotCount(selectedItem.item.marketData.tradeAs) > 0 then offerTypeList:addOption('Sell') end end @@ -357,12 +357,12 @@ local function updateSelectedItem(widget) Market.resetCreateOffer() if Market.isItemSelected() then - selectedItem:setItem(selectedItem.item.ptr) + selectedItem:setItem(selectedItem.item.displayItem) nameLabel:setText(selectedItem.item.marketData.name) clearOffers() Market.enableCreateOffer(true) -- update offer types - MarketProtocol.sendMarketBrowse(selectedItem.item.ptr:getId()) -- send browsed msg + MarketProtocol.sendMarketBrowse(selectedItem.item.marketData.tradeAs) -- send browsed msg else Market.clearSelectedItem() end @@ -410,7 +410,7 @@ local function openAmountWindow(callback, type, actionText) local max = selectedOffer[type]:getAmount(item:getId()) if type == MarketAction.Sell then - local depot = Market.depotContains(item:getId()) + local depot = Market.getDepotCount(item:getId()) if max > depot then max = depot end @@ -489,7 +489,7 @@ local function onSelectBuyOffer(table, selectedRow, previousSelectedRow) for _, offer in pairs(marketOffers[MarketAction.Buy]) do if offer:isEqual(selectedRow.ref) then selectedOffer[MarketAction.Sell] = offer - if Market.depotContains(offer:getItem():getId()) > 0 then + if Market.getDepotCount(offer:getItem():getId()) > 0 then sellButton:setEnabled(true) else sellButton:setEnabled(false) @@ -532,9 +532,9 @@ local function onChangeSlotFilter(combobox, option) end local function onChangeOfferType(combobox, option) - local id = selectedItem.item.ptr:getId() + local id = selectedItem.item.marketData.tradeAs if option == 'Sell' then - local max = Market.depotContains(id) + local max = Market.getDepotCount(id) amountEdit:setMaximum(max) else amountEdit:setMaximum(999999) @@ -579,31 +579,36 @@ local function onMarketMessage(messageMode, message) Market.displayMessage(message) end -local function initMarketItems(category) +local function initMarketItems() for c = MarketCategory.First, MarketCategory.Last do marketItems[c] = {} end + -- save a list of items which are already added + local itemSet = {} + -- populate all market items local types = g_things.findThingTypeByAttr(ThingAttrMarket, 0) for i = 1, #types do - local t = types[i] + local itemType = types[i] - local newItem = Item.create(t:getId()) - if newItem then - local marketData = t:getMarketData() - if not table.empty(marketData) then - if marketData.category == category or category == MarketCategory.All then + local item = Item.create(itemType:getId()) + if item then + local marketData = itemType:getMarketData() + if not table.empty(marketData) and not itemSet[marketData.tradeAs] then + -- Some items use a different sprite in Market + item:setId(marketData.showAs) - -- create new item block - local item = { - ptr = newItem, + -- create new marketItem block + local marketItem = { + displayItem = item, + thingType = itemType, marketData = marketData } -- add new market item - table.insert(marketItems[marketData.category], item) - end + table.insert(marketItems[marketData.category], marketItem) + itemSet[marketData.tradeAs] = true end end end @@ -668,7 +673,6 @@ local function initInterface() -- setup selected item nameLabel = marketOffersPanel:getChildById('nameLabel') selectedItem = marketOffersPanel:getChildById('selectedItem') - selectedItem.item = {} -- setup create new offer totalPriceEdit = marketOffersPanel:getChildById('totalPriceEdit') @@ -819,22 +823,15 @@ function Market.clearSelectedItem() end function Market.isItemSelected() - return selectedItem and not table.empty(selectedItem.item) and selectedItem.item.ptr + return selectedItem and selectedItem.item end function Market.isOfferSelected(type) return selectedOffer[type] and not selectedOffer[type]:isNull() end -function Market.depotContains(itemId) - local count = 0 - for i = 1, #information.depotItems do - local item = information.depotItems[i] - if item and item.ptr:getId() == itemId then - count = count + item.ptr:getCount() - end - end - return count +function Market.getDepotCount(itemId) + return information.depotItems[itemId] or 0 end function Market.enableCreateOffer(enable) @@ -857,6 +854,8 @@ function Market.close(notify) if not marketWindow:isHidden() then marketWindow:hide() marketWindow:unlock() + Market.clearSelectedItem( +) Market.reset() if notify then MarketProtocol.sendMarketLeave() end @@ -909,15 +908,15 @@ function Market.refreshItemsWidget(selectItem) itemBox.onCheckChange = Market.onItemBoxChecked itemBox.item = item - if selectItem > 0 and item.ptr:getId() == selectItem then + if selectItem > 0 and item.marketData.tradeAs == selectItem then select = itemBox + selectItem = 0 end local itemWidget = itemBox:getChildById('item') - item.ptr:setCount(1) -- reset item count for image - itemWidget:setItem(item.ptr) + itemWidget:setItem(item.displayItem) - local amount = Market.depotContains(item.ptr:getId()) + local amount = Market.getDepotCount(item.marketData.tradeAs) if amount > 0 then itemWidget:setText(amount) itemBox:setTooltip('You have '.. amount ..' in your depot.') @@ -925,8 +924,9 @@ function Market.refreshItemsWidget(selectItem) radioItemSet:addWidget(itemBox) end + if select then - select:setChecked(true) + radioItemSet:selectWidget(select, false) end layout:enableUpdates() @@ -957,6 +957,7 @@ function Market.loadMarketItems(category) for i = 1, #marketItems[category] do local item = marketItems[category][i] if isItemValid(item, category, searchFilter) then + table.insert(currentItems, item) end end @@ -974,56 +975,6 @@ function Market.loadMarketItems(category) Market.refreshItemsWidget() end -function Market.loadDepotItems(depotItems) - information.depotItems = {} - - local items = {} - for i = 1, #depotItems do - local data = depotItems[i] - local id, count = data[1], data[2] - - local tmpItem = Item.create(id) - if tmpItem:isStackable() then - if count > 100 then - local createCount = math.floor(count/100) - local remainder = count % 100 - if remainder > 0 then - createCount = createCount + 1 - end - for i = 1, createCount do - local newItem = Item.create(id) - if i == createCount and remainder > 0 then - newItem:setCount(remainder) - else - newItem:setCount(100) - end - table.insert(items, newItem) - end - else - local newItem = Item.create(id) - newItem:setCount(count) - table.insert(items, newItem) - end - else - for i = 1, count do - table.insert(items, Item.create(id)) - end - end - end - - for _, newItem in pairs(items) do - local marketData = newItem:getMarketData() - - if not table.empty(marketData) then - local item = { - ptr = newItem, - marketData = marketData - } - table.insert(information.depotItems, item) - end - end -end - function Market.createNewOffer() local type = offerTypeList:getCurrentOption().text if type == 'Sell' then @@ -1035,8 +986,8 @@ function Market.createNewOffer() if not Market.isItemSelected() then return end - local item = selectedItem.item - local spriteId = item.ptr:getId() + + local spriteId = selectedItem.item.marketData.tradeAs local piecePrice = piecePriceEdit:getValue() local totalPrice = totalPriceEdit:getValue() @@ -1051,7 +1002,7 @@ function Market.createNewOffer() errorMsg = errorMsg..'Not enough balance to create this offer.\n' end elseif type == MarketAction.Sell then - if Market.depotContains(spriteId) < amount then + if Market.getDepotCount(spriteId) < amount then errorMsg = errorMsg..'Not enough items in your depot to create this offer.\n' end end @@ -1092,9 +1043,6 @@ end function Market.onItemBoxChecked(widget) if widget:isChecked() then - if selectedItem.ref and widget ~= selectedItem.ref then - selectedItem.ref:setChecked(false) -- temporary fix? - end updateSelectedItem(widget) end end @@ -1103,11 +1051,10 @@ end function Market.onMarketEnter(depotItems, offers, balance, vocation) if not loaded then - initMarketItems(MarketCategory.All) + initMarketItems() loaded = true end - Market.clearSelectedItem() updateBalance(balance) information.totalOffers = offers @@ -1124,10 +1071,12 @@ function Market.onMarketEnter(depotItems, offers, balance, vocation) information.vocation = vocation end - Market.loadDepotItems(depotItems) + -- set list of depot items + information.depotItems = depotItems + -- update the items widget to match depot items if Market.isItemSelected() then - local spriteId = selectedItem.item.ptr:getId() + local spriteId = selectedItem.item.marketData.tradeAs MarketProtocol.silent(true) -- disable protocol messages Market.refreshItemsWidget(spriteId) MarketProtocol.silent(false) -- enable protocol messages diff --git a/modules/game_market/marketprotocol.lua b/modules/game_market/marketprotocol.lua index 5dd28129..cae13311 100644 --- a/modules/game_market/marketprotocol.lua +++ b/modules/game_market/marketprotocol.lua @@ -50,14 +50,14 @@ local function parseMarketEnter(protocol, msg) vocation = msg:getU8() -- get vocation id end local offers = msg:getU8() - local depotItems = {} + local depotItems = {} local depotCount = msg:getU16() for i = 1, depotCount do local itemId = msg:getU16() -- item id local itemCount = msg:getU16() -- item count - table.insert(depotItems, {itemId, itemCount}) + depotItems[itemId] = itemCount end signalcall(Market.onMarketEnter, depotItems, offers, balance, vocation) From eb3c244023e9bce520ecd4d6e8297eb65ff25948 Mon Sep 17 00:00:00 2001 From: TheSumm Date: Sun, 25 Jan 2015 02:28:53 +0100 Subject: [PATCH 22/43] More Market fixes * Fixed NextButton and PreviousButton style * Little update to SpinBox including dontSignal * Market cleanup and more check to be safe * Limit Market amountWindow by player balance * Set proper maximum amount when creating offers * Fixed fee label not calculating the correct fee sometimes --- data/styles/10-buttons.otui | 6 +- modules/corelib/ui/uispinbox.lua | 24 ++++-- modules/game_market/market.lua | 105 ++++++++++++++--------- modules/game_market/ui/marketoffers.otui | 11 +-- modules/gamelib/market.lua | 5 ++ 5 files changed, 96 insertions(+), 55 deletions(-) diff --git a/data/styles/10-buttons.otui b/data/styles/10-buttons.otui index 9e0a5aca..bf872dbc 100644 --- a/data/styles/10-buttons.otui +++ b/data/styles/10-buttons.otui @@ -46,6 +46,7 @@ NextButton < UIButton size: 12 21 image-source: /images/ui/arrow_horizontal image-clip: 12 0 12 21 + image-color: #ffffff $hover !disabled: image-clip: 12 21 12 21 @@ -54,12 +55,13 @@ NextButton < UIButton image-clip: 12 21 12 21 $disabled: - image-color: #dfdfdf55 + image-color: #dfdfdf88 PreviousButton < UIButton size: 12 21 image-source: /images/ui/arrow_horizontal image-clip: 0 0 12 21 + image-color: #ffffff $hover !disabled: image-clip: 0 21 12 21 @@ -68,7 +70,7 @@ PreviousButton < UIButton image-clip: 0 21 12 21 $disabled: - image-color: #dfdfdf55 + image-color: #dfdfdf88 AddButton < UIButton size: 20 20 diff --git a/modules/corelib/ui/uispinbox.lua b/modules/corelib/ui/uispinbox.lua index 484d363c..cafd55c5 100644 --- a/modules/corelib/ui/uispinbox.lua +++ b/modules/corelib/ui/uispinbox.lua @@ -12,7 +12,7 @@ function UISpinBox.create() spinbox.step = 1 spinbox.firstchange = true spinbox.mouseScroll = true - spinbox:setText("0") + spinbox:setText("1") spinbox:setValue(1) return spinbox end @@ -23,7 +23,7 @@ function UISpinBox:onSetup() end function UISpinBox:onMouseWheel(mousePos, direction) - if not self.mouseScroll then + if not self.mouseScroll then return false end if direction == MouseWheelUp then @@ -66,7 +66,15 @@ function UISpinBox:onTextChange(text, oldText) end function UISpinBox:onValueChange(value) - -- nothing todo + -- nothing to do +end + +function UISpinBox:onFocusChange(focused) + if not focused then + if self:getText():len() == 0 then + self:setText(self.minimum) + end + end end function UISpinBox:onStyleApply(styleName, styleNode) @@ -109,14 +117,16 @@ function UISpinBox:down() self:setValue(self.value - self.step) end -function UISpinBox:setValue(value) +function UISpinBox:setValue(value, dontSignal) value = value or 0 value = math.max(math.min(self.maximum, value), self.minimum) + if value == self.value then return end + + self.value = value if self:getText():len() > 0 then self:setText(value) end - self.value = value local upButton = self:getChildById('up') local downButton = self:getChildById('down') @@ -127,7 +137,9 @@ function UISpinBox:setValue(value) downButton:setEnabled(self.maximum ~= self.minimum and self.value ~= self.minimum) end - signalcall(self.onValueChange, self, value) + if not dontSignal then + signalcall(self.onValueChange, self, value) + end end function UISpinBox:getValue() diff --git a/modules/game_market/market.lua b/modules/game_market/market.lua index 1bc7a631..5269fa48 100644 --- a/modules/game_market/market.lua +++ b/modules/game_market/market.lua @@ -144,7 +144,7 @@ end local function clearFee() feeLabel:setText('') - fee = 0 + fee = 20 end local function refreshTypeList() @@ -399,46 +399,55 @@ local function destroyAmountWindow() end end -local function openAmountWindow(callback, type, actionText) - local actionText = actionText or '' - if not Market.isOfferSelected(type) then +local function openAmountWindow(callback, actionType, actionText) + if not Market.isOfferSelected(actionType) then return end + amountWindow = g_ui.createWidget('AmountWindow', rootWidget) amountWindow:lock() - local item = selectedOffer[type]:getItem() - local max = selectedOffer[type]:getAmount(item:getId()) - if type == MarketAction.Sell then + local offer = selectedOffer[actionType] + local item = offer:getItem() + + local maximum = offer:getAmount() + if actionType == MarketAction.Sell then local depot = Market.getDepotCount(item:getId()) - if max > depot then - max = depot + if maximum > depot then + maximum = depot end + else + maximum = math.min(maximum, math.floor(information.balance / offer:getPrice())) + end + + if item:isStackable() then + maximum = math.min(maximum, MarketMaxAmountStackable) + else + maximum = math.min(maximum, MarketMaxAmount) end local itembox = amountWindow:getChildById('item') itembox:setItemId(item:getId()) - itembox:setText(1) local scrollbar = amountWindow:getChildById('amountScrollBar') - scrollbar:setText(tostring(selectedOffer[type]:getPrice())..'gp') - scrollbar:setMaximum(max) - scrollbar:setMinimum(1) - scrollbar:setValue(1) + scrollbar:setText(offer:getPrice()..'gp') scrollbar.onValueChange = function(widget, value) - widget:setText(tostring(value*selectedOffer[type]:getPrice())..'gp') - itembox:setText(tostring(value)) + widget:setText((value*offer:getPrice())..'gp') + itembox:setText(value) end + scrollbar:setRange(1, maximum) + scrollbar:setValue(1) + local okButton = amountWindow:getChildById('buttonOk') - if actionText ~= '' then + if actionText then okButton:setText(actionText) end local okFunc = function() - local counter = selectedOffer[type]:getCounter() - local timestamp = selectedOffer[type]:getTimeStamp() + local counter = offer:getCounter() + local timestamp = offer:getTimeStamp() callback(scrollbar:getValue(), timestamp, counter) destroyAmountWindow() end @@ -532,46 +541,47 @@ local function onChangeSlotFilter(combobox, option) end local function onChangeOfferType(combobox, option) - local id = selectedItem.item.marketData.tradeAs + local item = selectedItem.item + local maximum = item.thingType:isStackable() and MarketMaxAmountStackable or MarketMaxAmount + if option == 'Sell' then - local max = Market.getDepotCount(id) - amountEdit:setMaximum(max) + maximum = math.min(maximum, Market.getDepotCount(item.marketData.tradeAs)) + amountEdit:setMaximum(maximum) else - amountEdit:setMaximum(999999) + amountEdit:setMaximum(maximum) end end local function onTotalPriceChange() - local totalPrice = totalPriceEdit:getValue() - local piecePrice = piecePriceEdit:getValue() local amount = amountEdit:getValue() + local totalPrice = totalPriceEdit:getValue() + local piecePrice = math.floor(totalPrice/amount) - piecePriceEdit:setValue(math.floor(totalPrice/amount)) + piecePriceEdit:setValue(piecePrice, true) if Market.isItemSelected() then - updateFee(totalPrice, amount) + updateFee(piecePrice, amount) end end local function onPiecePriceChange() + local amount = amountEdit:getValue() local totalPrice = totalPriceEdit:getValue() local piecePrice = piecePriceEdit:getValue() - local amount = amountEdit:getValue() - totalPriceEdit:setValue(piecePrice*amount) + totalPriceEdit:setValue(piecePrice*amount, true) if Market.isItemSelected() then - updateFee(totalPrice, amount) + updateFee(piecePrice, amount) end end local function onAmountChange() - local totalPrice = totalPriceEdit:getValue() - local piecePrice = piecePriceEdit:getValue() local amount = amountEdit:getValue() + local piecePrice = piecePriceEdit:getValue() + local totalPrice = piecePrice * amount - piecePriceEdit:setValue(math.floor(totalPrice/amount)) - totalPriceEdit:setValue(piecePrice*amount) + totalPriceEdit:setValue(piecePrice*amount, true) if Market.isItemSelected() then - updateFee(totalPrice, amount) + updateFee(piecePrice, amount) end end @@ -801,7 +811,7 @@ end function Market.clearSelectedItem() if Market.isItemSelected() then - Market.resetCreateOffer() + Market.resetCreateOffer(true) offerTypeList:clearOptions() offerTypeList:setText('Please Select') offerTypeList:setEnabled(false) @@ -878,12 +888,17 @@ function Market.updateCurrentItems() Market.loadMarketItems(id) end -function Market.resetCreateOffer() +function Market.resetCreateOffer(resetFee) piecePriceEdit:setValue(1) totalPriceEdit:setValue(1) amountEdit:setValue(1) refreshTypeList() - clearFee() + + if resetFee then + clearFee() + else + updateFee(0, 0) + end end function Market.refreshItemsWidget(selectItem) @@ -990,8 +1005,6 @@ function Market.createNewOffer() local spriteId = selectedItem.item.marketData.tradeAs local piecePrice = piecePriceEdit:getValue() - local totalPrice = totalPriceEdit:getValue() - local amount = amountEdit:getValue() local anonymous = anonymous:isChecked() and 1 or 0 @@ -1002,6 +1015,9 @@ function Market.createNewOffer() errorMsg = errorMsg..'Not enough balance to create this offer.\n' end elseif type == MarketAction.Sell then + if information.balance < fee then + errorMsg = errorMsg..'Not enough balance to create this offer.\n' + end if Market.getDepotCount(spriteId) < amount then errorMsg = errorMsg..'Not enough items in your depot to create this offer.\n' end @@ -1012,12 +1028,21 @@ function Market.createNewOffer() elseif piecePrice < piecePriceEdit.minimum then errorMsg = errorMsg..'Price is too low.\n' end + if amount > amountEdit.maximum then errorMsg = errorMsg..'Amount is too high.\n' elseif amount < amountEdit.minimum then errorMsg = errorMsg..'Amount is too low.\n' end + if amount * piecePrice > MarketMaxPrice then + errorMsg = errorMsg..'Total price is too high.\n' + end + + if information.totalOffers >= MarketMaxOffers then + errorMsg = errorMsg..'You cannot create more offers.\n' + end + local timeCheck = os.time() - lastCreatedOffer if timeCheck < offerExhaust[type] then local waitTime = math.ceil(offerExhaust[type] - timeCheck) diff --git a/modules/game_market/ui/marketoffers.otui b/modules/game_market/ui/marketoffers.otui index f4e10b4a..f8e04f82 100644 --- a/modules/game_market/ui/marketoffers.otui +++ b/modules/game_market/ui/marketoffers.otui @@ -135,8 +135,7 @@ Panel font: verdana-11px-rounded text-offset: 0 2 anchors.top: offerTypeLabel.top - anchors.left: prev.right - margin-left: 32 + anchors.left: amountEdit.left PreviousButton id: prevAmountButton @@ -147,7 +146,7 @@ Panel SpinBox id: amountEdit - anchors.verticalCenter: prev.verticalCenter + anchors.top: prev.top anchors.left: prev.right margin-left: 3 width: 55 @@ -184,8 +183,6 @@ Panel Label id: feeLabel font: verdana-11px-rounded - text-offset: 0 2 anchors.top: createOfferButton.bottom - anchors.right: parent.right - margin-right: 8 - margin-top: 3 \ No newline at end of file + anchors.left: createOfferButton.left + margin: 2 \ No newline at end of file diff --git a/modules/gamelib/market.lua b/modules/gamelib/market.lua index 96d6b7cc..428f454c 100644 --- a/modules/gamelib/market.lua +++ b/modules/gamelib/market.lua @@ -1,3 +1,8 @@ +MarketMaxAmount = 2000 +MarketMaxAmountStackable = 64000 +MarketMaxPrice = 999999999 +MarketMaxOffers = 100 + MarketAction = { Buy = 0, Sell = 1 From da2762dac33f2bcc3371e5ba6196f38619356b68 Mon Sep 17 00:00:00 2001 From: TheSumm Date: Sun, 25 Jan 2015 13:41:00 +0100 Subject: [PATCH 23/43] Market now highlights offers which differ from the average price --- modules/corelib/ui/uitable.lua | 23 ++++++---- modules/game_market/market.lua | 46 +++++++++++++++++-- .../ui/marketoffers/itemoffers.otui | 3 ++ 3 files changed, 60 insertions(+), 12 deletions(-) diff --git a/modules/corelib/ui/uitable.lua b/modules/corelib/ui/uitable.lua index 6529d8fc..6302d295 100644 --- a/modules/corelib/ui/uitable.lua +++ b/modules/corelib/ui/uitable.lua @@ -194,7 +194,7 @@ function UITable:removeHeader() end end -function UITable:addRow(data, ref, height) +function UITable:addRow(data, height) if not self.dataSpace then g_logger.error('UITable:addRow - table data space has not been set, cannot add rows.') return @@ -206,7 +206,6 @@ function UITable:addRow(data, ref, height) local row = g_ui.createWidget(self.rowBaseStyle) row.table = self - if ref then row.ref = ref end if height then row:setHeight(height) end local rowId = #self.rows + 1 @@ -352,18 +351,24 @@ function UITable:setTableData(tableData) self.dataSpace:applyStyle({ height = self:getHeight()-headerHeight-self:getMarginTop() }) end -function UITable:setRowStyle(style) +function UITable:setRowStyle(style, dontUpdate) self.rowBaseStyle = style - for _, row in pairs(self.rows) do - row:setStyle(style) + + if not dontUpdate then + for _, row in pairs(self.rows) do + row:setStyle(style) + end end end -function UITable:setColumnStyle(style) +function UITable:setColumnStyle(style, dontUpdate) self.columBaseStyle = style - for _, columns in pairs(self.columns) do - for _, col in pairs(columns) do - col:setStyle(style) + + if not dontUpdate then + for _, columns in pairs(self.columns) do + for _, col in pairs(columns) do + col:setStyle(style) + end end end end diff --git a/modules/game_market/market.lua b/modules/game_market/market.lua index 5269fa48..2011410d 100644 --- a/modules/game_market/market.lua +++ b/modules/game_market/market.lua @@ -15,7 +15,6 @@ * Extend information features - Hover over offers for purchase information (balance after transaction, etc) - - Display out of trend market offers based on their previous statistics (like cipsoft does) ]] Market = {} @@ -72,6 +71,7 @@ information = {} currentItems = {} lastCreatedOffer = 0 fee = 0 +averagePrice = 0 loaded = false @@ -180,7 +180,18 @@ local function addOffer(offer, offerType) {text = price}, {text = string.gsub(os.date('%c', timestamp), " ", " ")} } - buyOfferTable:addRow(data, id) + + if offer.warn then + buyOfferTable:setColumnStyle('OfferTableWarningColumn', true) + end + + local row = buyOfferTable:addRow(data) + row.ref = id + + if offer.warn then + row:setTooltip(tr('This offer is 25%% below the average market price')) + buyOfferTable:setColumnStyle('OfferTableColumn', true) + end else local data = { {text = player}, @@ -189,7 +200,18 @@ local function addOffer(offer, offerType) {text = price}, {text = string.gsub(os.date('%c', timestamp), " ", " "), sortvalue = timestamp} } - sellOfferTable:addRow(data, id) + + if offer.warn then + sellOfferTable:setColumnStyle('OfferTableWarningColumn', true) + end + + local row = sellOfferTable:addRow(data) + row.ref = id + + if offer.warn then + row:setTooltip(tr('This offer is 25%% above the average market price')) + sellOfferTable:setColumnStyle('OfferTableColumn', true) + end end buyOfferTable:toggleSorting(false) @@ -204,12 +226,17 @@ local function mergeOffer(offer) if not offer then return false end + local id = offer:getId() local offerType = offer:getType() local amount = offer:getAmount() local replaced = false if offerType == MarketAction.Buy then + if averagePrice > 0 then + offer.warn = offer:getPrice() <= averagePrice - math.floor(averagePrice / 4) + end + for i = 1, #marketOffers[MarketAction.Buy] do local o = marketOffers[MarketAction.Buy][i] -- replace existing offer @@ -222,6 +249,10 @@ local function mergeOffer(offer) table.insert(marketOffers[MarketAction.Buy], offer) end else + if averagePrice > 0 then + offer.warn = offer:getPrice() >= averagePrice + math.floor(averagePrice / 4) + end + for i = 1, #marketOffers[MarketAction.Sell] do local o = marketOffers[MarketAction.Sell][i] -- replace existing offer @@ -285,9 +316,11 @@ local function updateDetails(itemId, descriptions, purchaseStats, saleStats) if table.empty(saleStats) then sellStatsTable:addRow({{text = 'No information'}}) else + local offerAmount = 0 local transactions, totalPrice, highestPrice, lowestPrice = 0, 0, 0, 0 for _, stat in pairs(saleStats) do if not stat:isNull() then + offerAmount = offerAmount + 1 transactions = transactions + stat:getTransactions() totalPrice = totalPrice + stat:getTotalPrice() local newHigh = stat:getHighestPrice() @@ -302,6 +335,12 @@ local function updateDetails(itemId, descriptions, purchaseStats, saleStats) end end + if offerAmount >= 5 and transactions >= 10 then + averagePrice = math.round(totalPrice / transactions) + else + averagePrice = 0 + end + sellStatsTable:addRow({{text = 'Total Transations:'}, {text = transactions}}) sellStatsTable:addRow({{text = 'Highest Price:'}, {text = highestPrice}}) @@ -1081,6 +1120,7 @@ function Market.onMarketEnter(depotItems, offers, balance, vocation) end updateBalance(balance) + averagePrice = 0 information.totalOffers = offers local player = g_game.getLocalPlayer() diff --git a/modules/game_market/ui/marketoffers/itemoffers.otui b/modules/game_market/ui/marketoffers/itemoffers.otui index 0556450b..8f392602 100644 --- a/modules/game_market/ui/marketoffers/itemoffers.otui +++ b/modules/game_market/ui/marketoffers/itemoffers.otui @@ -10,6 +10,9 @@ OfferTableColumn < TableColumn color: #cccccc width: 80 +OfferTableWarningColumn < OfferTableColumn + color: #e03d3d + OfferTableHeaderRow < TableHeaderRow font: verdana-11px-monochrome color: #cccccc From 4e2ded571ec0ff9e4a11713ffb0bdedc426ded61 Mon Sep 17 00:00:00 2001 From: TheSumm Date: Sun, 25 Jan 2015 14:17:16 +0100 Subject: [PATCH 24/43] Fixed not being able to relog after reloading gamelib --- modules/gamelib/game.lua | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/gamelib/game.lua b/modules/gamelib/game.lua index 07e985f1..8cd02bdf 100644 --- a/modules/gamelib/game.lua +++ b/modules/gamelib/game.lua @@ -1,7 +1,5 @@ -local currentRsa - function g_game.getRsa() - return currentRsa + return G.currentRsa end function g_game.findPlayerItem(itemId, subType) @@ -19,7 +17,7 @@ function g_game.findPlayerItem(itemId, subType) end function g_game.chooseRsa(host) - if currentRsa ~= CIPSOFT_RSA and currentRsa ~= OTSERV_RSA then return end + if G.currentRsa ~= CIPSOFT_RSA and G.currentRsa ~= OTSERV_RSA then return end if host:ends('.tibia.com') or host:ends('.cipsoft.com') then g_game.setRsa(CIPSOFT_RSA) @@ -29,7 +27,7 @@ function g_game.chooseRsa(host) g_game.setCustomOs(OsTypes.Linux) end else - if currentRsa == CIPSOFT_RSA then + if G.currentRsa == CIPSOFT_RSA then g_game.setCustomOs(-1) end g_game.setRsa(OTSERV_RSA) @@ -44,11 +42,11 @@ end function g_game.setRsa(rsa, e) e = e or '65537' g_crypt.rsaSetPublicKey(rsa, e) - currentRsa = rsa + G.currentRsa = rsa end function g_game.isOfficialTibia() - return currentRsa == CIPSOFT_RSA + return G.currentRsa == CIPSOFT_RSA end function g_game.getSupportedClients() @@ -112,4 +110,6 @@ function g_game.getClientProtocolVersion(client) return clients[client] or client end -g_game.setRsa(OTSERV_RSA) +if not G.currentRsa then + g_game.setRsa(OTSERV_RSA) +end From cb7cea6809535bc261c90cc4a187d9632f29247b Mon Sep 17 00:00:00 2001 From: TheSumm Date: Sun, 25 Jan 2015 21:20:48 +0100 Subject: [PATCH 25/43] Tiny signalcall fix --- modules/corelib/util.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/corelib/util.lua b/modules/corelib/util.lua index a2ff02b1..0691fc88 100644 --- a/modules/corelib/util.lua +++ b/modules/corelib/util.lua @@ -313,7 +313,7 @@ function signalcall(param, ...) perror(ret) end end - elseif func ~= nil then + elseif param ~= nil then error('attempt to call a non function value') end return false From 900ebbd985200e2ab52c77d900d6174255f04023 Mon Sep 17 00:00:00 2001 From: BenDol Date: Tue, 27 Jan 2015 22:11:27 +1300 Subject: [PATCH 26/43] Fixes #181 and fixes #551 --- src/client/game.cpp | 2 +- src/client/tile.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/client/game.cpp b/src/client/game.cpp index 688b0960..1cb8d395 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -860,7 +860,7 @@ void Game::useWith(const ItemPtr& item, const ThingPtr& toThing) Position pos = item->getPosition(); if(!pos.isValid()) // virtual item - pos = Position(0xFFFF, 0, 0); // means that is a item in inventory + pos = Position(0xFFFF, 0, 0); // means that is an item in inventory m_protocolGame->sendUseItemWith(pos, item->getId(), item->getStackPos(), toThing->getPosition(), toThing->getId(), toThing->getStackPos()); } diff --git a/src/client/tile.cpp b/src/client/tile.cpp index 548a3335..c5e41c96 100644 --- a/src/client/tile.cpp +++ b/src/client/tile.cpp @@ -485,7 +485,7 @@ ThingPtr Tile::getTopMultiUseThing() for(uint i = 0; i < m_things.size(); ++i) { ThingPtr thing = m_things[i]; - if(!thing->isGround() && !thing->isGroundBorder() && !thing->isOnBottom() && !thing->isOnTop()) { + if(!thing->isGround() && !thing->isOnBottom() && !thing->isOnTop()) { if(i > 0 && thing->isSplash()) return m_things[i-1]; return thing; @@ -494,7 +494,7 @@ ThingPtr Tile::getTopMultiUseThing() for(uint i = 0; i < m_things.size(); ++i) { ThingPtr thing = m_things[i]; - if(!thing->isGround() && !thing->isGroundBorder() && !thing->isOnTop()) + if(!thing->isGround() && !thing->isOnTop()) return thing; } From 64e9406488504b84a511ec354e3bc0e8774ed21b Mon Sep 17 00:00:00 2001 From: TheSumm Date: Tue, 27 Jan 2015 21:14:07 +0100 Subject: [PATCH 27/43] Fixed 'widget destroyed but still have 1 reference left' related to console module --- modules/corelib/ui/uimovabletabbar.lua | 37 +++++++++++++++++--------- modules/game_console/console.lua | 13 +++++++-- 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/modules/corelib/ui/uimovabletabbar.lua b/modules/corelib/ui/uimovabletabbar.lua index 187a8c49..ad59df79 100644 --- a/modules/corelib/ui/uimovabletabbar.lua +++ b/modules/corelib/ui/uimovabletabbar.lua @@ -17,19 +17,19 @@ local function updateMargins(tabBar, ignored) end local function updateNavigation(tabBar) - if prevNavigation then + if tabBar.prevNavigation then if #tabBar.preTabs > 0 or table.find(tabBar.tabs, tabBar.currentTab) ~= 1 then - prevNavigation:enable() + tabBar.prevNavigation:enable() else - prevNavigation:disable() + tabBar.prevNavigation:disable() end end - if nextNavigation then + if tabBar.nextNavigation then if #tabBar.postTabs > 0 or table.find(tabBar.tabs, tabBar.currentTab) ~= #tabBar.tabs then - nextNavigation:enable() + tabBar.nextNavigation:enable() else - nextNavigation:disable() + tabBar.nextNavigation:disable() end end end @@ -218,6 +218,19 @@ function UIMoveableTabBar.create() return tabbar end +function UIMoveableTabBar:onDestroy() + if self.prevNavigation then + self.prevNavigation:disable() + end + + if self.nextNavigation then + self.nextNavigation:disable() + end + + self.nextNavigation = nil + self.prevNavigation = nil +end + function UIMoveableTabBar:setContentWidget(widget) self.contentWidget = widget if #self.tabs > 0 then @@ -467,14 +480,14 @@ function UIMoveableTabBar:getCurrentTab() end function UIMoveableTabBar:setNavigation(prevButton, nextButton) - prevNavigation = prevButton - nextNavigation = nextButton + self.prevNavigation = prevButton + self.nextNavigation = nextButton - if prevNavigation then - prevNavigation.onClick = function() self:selectPrevTab() end + if self.prevNavigation then + self.prevNavigation.onClick = function() self:selectPrevTab() end end - if nextNavigation then - nextNavigation.onClick = function() self:selectNextTab() end + if self.nextNavigation then + self.nextNavigation.onClick = function() self:selectNextTab() end end updateNavigation(self) end diff --git a/modules/game_console/console.lua b/modules/game_console/console.lua index f19db151..ce9fce28 100644 --- a/modules/game_console/console.lua +++ b/modules/game_console/console.lua @@ -170,7 +170,7 @@ function enableChat() gameInterface.unbindWalkKey("D") gameInterface.unbindWalkKey("S") gameInterface.unbindWalkKey("A") - + gameInterface.unbindWalkKey("E") gameInterface.unbindWalkKey("Q") gameInterface.unbindWalkKey("C") @@ -199,7 +199,7 @@ function disableChat() gameInterface.bindWalkKey("D", East) gameInterface.bindWalkKey("S", South) gameInterface.bindWalkKey("A", West) - + gameInterface.bindWalkKey("E", NorthEast) gameInterface.bindWalkKey("Q", NorthWest) gameInterface.bindWalkKey("C", SouthEast) @@ -245,7 +245,13 @@ function terminate() violationWindow:destroy() end + consoleTabBar = nil + consoleContentPanel = nil + consoleToggleChat = nil + consoleTextEdit = nil + consolePanel:destroy() + consolePanel = nil ownPrivateName = nil Console = nil @@ -300,11 +306,14 @@ function clear() channels = {} consoleTabBar:removeTab(defaultTab) + defaultTab = nil consoleTabBar:removeTab(serverTab) + serverTab = nil local npcTab = consoleTabBar:getTab('NPCs') if npcTab then consoleTabBar:removeTab(npcTab) + npcTab = nil end if violationReportTab then From 71931b961a86f06b4557388dbcf81c72dc9723d7 Mon Sep 17 00:00:00 2001 From: TheSumm Date: Tue, 27 Jan 2015 23:44:37 +0100 Subject: [PATCH 28/43] Full protocol 10.74 support (session key), entergame style fixes --- modules/client_entergame/characterlist.lua | 2 +- modules/client_entergame/entergame.lua | 103 ++++++++++++++------- modules/client_entergame/entergame.otui | 52 +++++++++-- modules/gamelib/const.lua | 1 + modules/gamelib/game.lua | 2 +- modules/gamelib/protocollogin.lua | 18 +++- src/client/const.h | 1 + src/client/game.cpp | 12 ++- src/client/game.h | 2 +- src/client/protocolgame.cpp | 3 +- src/client/protocolgame.h | 3 +- src/client/protocolgamesend.cpp | 21 +++-- 12 files changed, 160 insertions(+), 60 deletions(-) diff --git a/modules/client_entergame/characterlist.lua b/modules/client_entergame/characterlist.lua index eb639559..35e52ce6 100644 --- a/modules/client_entergame/characterlist.lua +++ b/modules/client_entergame/characterlist.lua @@ -27,7 +27,7 @@ local function tryLogin(charInfo, tries) CharacterList.hide() - g_game.loginWorld(G.account, G.password, charInfo.worldName, charInfo.worldHost, charInfo.worldPort, charInfo.characterName, G.authenticatorToken) + g_game.loginWorld(G.account, G.password, charInfo.worldName, charInfo.worldHost, charInfo.worldPort, charInfo.characterName, G.authenticatorToken, G.sessionKey) loadBox = displayCancelBox(tr('Please wait'), tr('Connecting to game server...')) connect(loadBox, { onCancel = function() diff --git a/modules/client_entergame/entergame.lua b/modules/client_entergame/entergame.lua index 49db7853..81ab23cf 100644 --- a/modules/client_entergame/entergame.lua +++ b/modules/client_entergame/entergame.lua @@ -33,10 +33,17 @@ local function onMotd(protocol, motd) end end +local function onSessionKey(protocol, sessionKey) + G.sessionKey = sessionKey +end + local function onCharacterList(protocol, characters, account, otui) -- Try add server to the server list ServerList.add(G.host, G.port, g_game.getClientVersion()) + -- Save 'Stay logged in' setting + g_settings.set('staylogged', enterGame:getChildById('stayLoggedBox'):isChecked()) + if enterGame:getChildById('rememberPasswordBox'):isChecked() then local account = g_crypt.encrypt(G.account) local password = g_crypt.encrypt(G.password) @@ -109,9 +116,10 @@ function EnterGame.init() local password = g_settings.get('password') local host = g_settings.get('host') local port = g_settings.get('port') + local stayLogged = g_settings.getBoolean('staylogged') local autologin = g_settings.getBoolean('autologin') local clientVersion = g_settings.getInteger('client-version') - if clientVersion == 0 then clientVersion = 1072 end + if clientVersion == 0 then clientVersion = 1074 end if port == nil or port == 0 then port = 7171 end @@ -121,7 +129,7 @@ function EnterGame.init() enterGame:getChildById('serverHostTextEdit'):setText(host) enterGame:getChildById('serverPortTextEdit'):setText(port) enterGame:getChildById('autoLoginBox'):setChecked(autologin) - + enterGame:getChildById('stayLoggedBox'):setChecked(stayLogged) clientBox = enterGame:getChildById('clientComboBox') for _, proto in pairs(g_game.getSupportedClients()) do @@ -130,6 +138,7 @@ function EnterGame.init() clientBox:setCurrentOption(clientVersion) EnterGame.toggleAuthenticatorToken(clientVersion, true) + EnterGame.toggleStayLoggedBox(clientVersion, true) connect(clientBox, { onOptionChange = EnterGame.onClientVersionChange }) enterGame:hide() @@ -227,48 +236,68 @@ function EnterGame.toggleAuthenticatorToken(clientVersion, init) return end + enterGame:getChildById('authenticatorTokenLabel'):setOn(enabled) + enterGame:getChildById('authenticatorTokenTextEdit'):setOn(enabled) + + local newHeight = enterGame:getHeight() + local newY = enterGame:getY() if enabled then - enterGame:getChildById('authenticatorTokenLabel'):setVisible(true) - enterGame:getChildById('authenticatorTokenTextEdit'):setVisible(true) - - local serverLabel = enterGame:getChildById('serverLabel') - serverLabel:setMarginTop(serverLabel:getMarginTop() + enterGame.authenticatorHeight) - - if not init then - enterGame:breakAnchors() - enterGame:setY(enterGame:getY() - enterGame.authenticatorHeight) - enterGame:bindRectToParent() - end - - enterGame:setHeight(enterGame:getHeight() + enterGame.authenticatorHeight) + newY = newY - enterGame.authenticatorHeight + newHeight = newHeight + enterGame.authenticatorHeight else - enterGame:getChildById('authenticatorTokenLabel'):setVisible(false) - enterGame:getChildById('authenticatorTokenTextEdit'):setVisible(false) - - local serverLabel = enterGame:getChildById('serverLabel') - serverLabel:setMarginTop(serverLabel:getMarginTop() - enterGame.authenticatorHeight) - - if not init then - enterGame:breakAnchors() - enterGame:setY(enterGame:getY() + enterGame.authenticatorHeight) - enterGame:bindRectToParent() - end - - enterGame:setHeight(enterGame:getHeight() - enterGame.authenticatorHeight) + newY = newY + enterGame.authenticatorHeight + newHeight = newHeight - enterGame.authenticatorHeight end + if not init then + enterGame:breakAnchors() + enterGame:setY(newY) + enterGame:bindRectToParent() + end + enterGame:setHeight(newHeight) + enterGame.authenticatorEnabled = enabled end +function EnterGame.toggleStayLoggedBox(clientVersion, init) + local enabled = (clientVersion >= 1074) + if enabled == enterGame.stayLoggedBoxEnabled then + return + end + + enterGame:getChildById('stayLoggedBox'):setOn(enabled) + + local newHeight = enterGame:getHeight() + local newY = enterGame:getY() + if enabled then + newY = newY - enterGame.stayLoggedBoxHeight + newHeight = newHeight + enterGame.stayLoggedBoxHeight + else + newY = newY + enterGame.stayLoggedBoxHeight + newHeight = newHeight - enterGame.stayLoggedBoxHeight + end + + if not init then + enterGame:breakAnchors() + enterGame:setY(newY) + enterGame:bindRectToParent() + end + enterGame:setHeight(newHeight) + + enterGame.stayLoggedBoxEnabled = enabled +end + function EnterGame.onClientVersionChange(comboBox, text, data) local clientVersion = tonumber(text) EnterGame.toggleAuthenticatorToken(clientVersion) + EnterGame.toggleStayLoggedBox(clientVersion) end function EnterGame.doLogin() G.account = enterGame:getChildById('accountNameTextEdit'):getText() G.password = enterGame:getChildById('accountPasswordTextEdit'):getText() G.authenticatorToken = enterGame:getChildById('authenticatorTokenTextEdit'):getText() + G.stayLogged = enterGame:getChildById('stayLoggedBox'):isChecked() G.host = enterGame:getChildById('serverHostTextEdit'):getText() G.port = tonumber(enterGame:getChildById('serverPortTextEdit'):getText()) local clientVersion = tonumber(clientBox:getText()) @@ -287,6 +316,7 @@ function EnterGame.doLogin() protocolLogin = ProtocolLogin.create() protocolLogin.onLoginError = onError protocolLogin.onMotd = onMotd + protocolLogin.onSessionKey = onSessionKey protocolLogin.onCharacterList = onCharacterList protocolLogin.onUpdateNeeded = onUpdateNeeded @@ -302,7 +332,7 @@ function EnterGame.doLogin() g_game.chooseRsa(G.host) if modules.game_things.isLoaded() then - protocolLogin:login(G.host, G.port, G.account, G.password, G.authenticatorToken) + protocolLogin:login(G.host, G.port, G.account, G.password, G.authenticatorToken, G.stayLogged) else loadBox:destroy() loadBox = nil @@ -344,13 +374,16 @@ function EnterGame.setUniqueServer(host, port, protocol, windowWidth, windowHeig portTextEdit:setText(port) portTextEdit:setVisible(false) portTextEdit:setHeight(0) + local authenticatorTokenTextEdit = enterGame:getChildById('authenticatorTokenTextEdit') authenticatorTokenTextEdit:setText('') - authenticatorTokenTextEdit:setVisible(false) - authenticatorTokenTextEdit:setHeight(0) + authenticatorTokenTextEdit:setOn(false) local authenticatorTokenLabel = enterGame:getChildById('authenticatorTokenLabel') - authenticatorTokenLabel:setVisible(false) - authenticatorTokenLabel:setHeight(0) + authenticatorTokenLabel:setOn(false) + + local stayLoggedBox = enterGame:getChildById('stayLoggedBox') + stayLoggedBox:setChecked(false) + stayLoggedBox:setOn(false) clientBox:setCurrentOption(protocol) clientBox:setVisible(false) @@ -372,11 +405,11 @@ function EnterGame.setUniqueServer(host, port, protocol, windowWidth, windowHeig serverListButton:setWidth(0) local rememberPasswordBox = enterGame:getChildById('rememberPasswordBox') - rememberPasswordBox:setMarginTop(-14) + rememberPasswordBox:setMarginTop(-8) if not windowWidth then windowWidth = 236 end enterGame:setWidth(windowWidth) - if not windowHeight then windowHeight = 200 end + if not windowHeight then windowHeight = 210 end enterGame:setHeight(windowHeight) end diff --git a/modules/client_entergame/entergame.otui b/modules/client_entergame/entergame.otui index debb0ea9..9b6dff1f 100644 --- a/modules/client_entergame/entergame.otui +++ b/modules/client_entergame/entergame.otui @@ -1,6 +1,6 @@ EnterGameWindow < MainWindow !text: tr('Enter Game') - size: 236 274 + size: 236 298 EnterGameButton < Button width: 64 @@ -23,6 +23,8 @@ EnterGameWindow id: enterGame &authenticatorEnabled: false &authenticatorHeight: 44 + &stayLoggedBoxEnabled: false + &stayLoggedBoxHeight: 24 @onEnter: EnterGame.doLogin() MenuLabel @@ -58,24 +60,52 @@ EnterGameWindow anchors.left: prev.left anchors.top: prev.bottom text-auto-resize: true - margin-top: 8 + margin-top: -12 visible: false + $on: + visible: true + margin-top: 8 + TextEdit id: authenticatorTokenTextEdit anchors.left: parent.left anchors.right: parent.right anchors.top: prev.bottom - margin-top: 2 + margin-top: -22 visible: false max-length: 8 + $on: + visible: true + margin-top: 2 + + CheckBox + id: stayLoggedBox + !text: tr('Stay logged during session') + anchors.left: parent.left + anchors.right: parent.right + anchors.top: prev.bottom + margin-top: 6 + margin-top: -16 + visible: false + + $on: + visible: true + margin-top: 8 + + HorizontalSeparator + anchors.left: parent.left + anchors.right: parent.right + anchors.top: prev.bottom + margin-top: 8 + MenuLabel id: serverLabel !text: tr('Server') anchors.left: prev.left anchors.top: prev.bottom - margin-top: -36 + margin-top: 8 text-auto-resize: true ServerListButton @@ -152,16 +182,24 @@ EnterGameWindow anchors.top: prev.bottom margin-top: 2 + HorizontalSeparator + anchors.left: parent.left + anchors.right: parent.right + anchors.top: prev.bottom + margin-top: 6 + EnterGameButton !text: tr('Ok') anchors.right: parent.right - anchors.bottom: parent.bottom + anchors.top: prev.bottom + margin-top: 4 @onClick: EnterGame.doLogin() Label id: serverInfoLabel font: verdana-11px-rounded - anchors.bottom: parent.bottom + anchors.top: prev.top anchors.left: parent.left + margin-top: 5 color: green - text-auto-resize: true + text-auto-resize: true \ No newline at end of file diff --git a/modules/gamelib/const.lua b/modules/gamelib/const.lua index a27b1fa4..4d64f686 100644 --- a/modules/gamelib/const.lua +++ b/modules/gamelib/const.lua @@ -129,6 +129,7 @@ GameContentRevision = 65 GameExperienceBonus = 66 GameAuthenticator = 67 GameUnjustifiedPoints = 68 +GameSessionKey = 69 TextColors = { red = '#f55e5e', --'#c83200' diff --git a/modules/gamelib/game.lua b/modules/gamelib/game.lua index 8cd02bdf..41f09f51 100644 --- a/modules/gamelib/game.lua +++ b/modules/gamelib/game.lua @@ -73,7 +73,7 @@ function g_game.getSupportedClients() 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1070, 1071, 1072, - 1073 + 1073, 1074 } end diff --git a/modules/gamelib/protocollogin.lua b/modules/gamelib/protocollogin.lua index 5d107eca..9b791b78 100644 --- a/modules/gamelib/protocollogin.lua +++ b/modules/gamelib/protocollogin.lua @@ -7,10 +7,11 @@ LoginServerTokenError = 13 LoginServerUpdate = 17 LoginServerMotd = 20 LoginServerUpdateNeeded = 30 +LoginServerSessionKey = 40 LoginServerCharacterList = 100 LoginServerExtendedCharacterList = 101 -function ProtocolLogin:login(host, port, accountName, accountPassword, authenticatorToken) +function ProtocolLogin:login(host, port, accountName, accountPassword, authenticatorToken, stayLogged) if string.len(host) == 0 or port == nil or port == 0 then signalcall(self.onLoginError, self, tr("You must enter a valid server address and port.")) return @@ -19,6 +20,7 @@ function ProtocolLogin:login(host, port, accountName, accountPassword, authentic self.accountName = accountName self.accountPassword = accountPassword self.authenticatorToken = authenticatorToken + self.stayLogged = stayLogged self.connectCallback = self.sendLoginPacket self:connect(host, port) @@ -109,6 +111,10 @@ function ProtocolLogin:sendLoginPacket() msg:addU8(0) msg:addString(self.authenticatorToken) + if g_game.getFeature(GameSessionKey) then + msg:addU8(booleantonumber(self.stayLogged)) + end + paddingBytes = g_crypt.rsaGetSize() - (msg:getMessageSize() - offset) assert(paddingBytes >= 0) for i = 1, paddingBytes do @@ -144,8 +150,11 @@ function ProtocolLogin:onRecv(msg) self:parseMotd(msg) elseif opcode == LoginServerUpdateNeeded then signalcall(self.onLoginError, self, tr("Client needs update.")) + elseif opcode == LoginServerTokenSuccess then + local unknown = msg:getU8() elseif opcode == LoginServerTokenError then -- TODO: prompt for token here + local unknown = msg:getU8() signalcall(self.onLoginError, self, tr("Invalid authentification token.")) elseif opcode == LoginServerCharacterList then self:parseCharacterList(msg) @@ -154,6 +163,8 @@ function ProtocolLogin:onRecv(msg) elseif opcode == LoginServerUpdate then local signature = msg:getString() signalcall(self.onUpdateNeeded, self, signature) + elseif opcode == LoginServerSessionKey then + self:parseSessionKey(msg) else self:parseOpcode(opcode, msg) end @@ -171,6 +182,11 @@ function ProtocolLogin:parseMotd(msg) signalcall(self.onMotd, self, motd) end +function ProtocolLogin:parseSessionKey(msg) + local sessionKey = msg:getString() + signalcall(self.onSessionKey, self, sessionKey) +end + function ProtocolLogin:parseCharacterList(msg) local characters = {} diff --git a/src/client/const.h b/src/client/const.h index 18ffa33b..9ce1dc37 100644 --- a/src/client/const.h +++ b/src/client/const.h @@ -401,6 +401,7 @@ namespace Otc GameExperienceBonus = 66, GameAuthenticator = 67, GameUnjustifiedPoints = 68, + GameSessionKey = 69, LastGameFeature = 101 }; diff --git a/src/client/game.cpp b/src/client/game.cpp index 1cb8d395..37c9dfdb 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -534,7 +534,7 @@ void Game::processWalkCancel(Otc::Direction direction) m_localPlayer->cancelWalk(direction); } -void Game::loginWorld(const std::string& account, const std::string& password, const std::string& worldName, const std::string& worldHost, int worldPort, const std::string& characterName, const std::string& authenticatorToken) +void Game::loginWorld(const std::string& account, const std::string& password, const std::string& worldName, const std::string& worldHost, int worldPort, const std::string& characterName, const std::string& authenticatorToken, const std::string& sessionKey) { if(m_protocolGame || isOnline()) stdext::throw_exception("Unable to login into a world while already online or logging."); @@ -549,7 +549,7 @@ void Game::loginWorld(const std::string& account, const std::string& password, c m_localPlayer->setName(characterName); m_protocolGame = ProtocolGamePtr(new ProtocolGame); - m_protocolGame->login(account, password, worldHost, (uint16)worldPort, characterName, authenticatorToken); + m_protocolGame->login(account, password, worldHost, (uint16)worldPort, characterName, authenticatorToken, sessionKey); m_characterName = characterName; m_worldName = worldName; } @@ -1456,7 +1456,7 @@ void Game::setProtocolVersion(int version) if(isOnline()) stdext::throw_exception("Unable to change protocol version while online"); - if(version != 0 && (version < 740 || version > 1073)) + if(version != 0 && (version < 740 || version > 1074)) stdext::throw_exception(stdext::format("Protocol version %d not supported", version)); m_protocolVersion = version; @@ -1474,7 +1474,7 @@ void Game::setClientVersion(int version) if(isOnline()) stdext::throw_exception("Unable to change client version while online"); - if(version != 0 && (version < 740 || version > 1073)) + if(version != 0 && (version < 740 || version > 1074)) stdext::throw_exception(stdext::format("Client version %d not supported", version)); m_features.reset(); @@ -1614,6 +1614,10 @@ void Game::setClientVersion(int version) enableFeature(Otc::GameAuthenticator); } + if(version >= 1074) { + enableFeature(Otc::GameSessionKey); + } + m_clientVersion = version; g_lua.callGlobalField("g_game", "onClientVersionChange", version); diff --git a/src/client/game.h b/src/client/game.h index 8d3a6a9b..b707ed53 100644 --- a/src/client/game.h +++ b/src/client/game.h @@ -159,7 +159,7 @@ protected: public: // login related - void loginWorld(const std::string& account, const std::string& password, const std::string& worldName, const std::string& worldHost, int worldPort, const std::string& characterName, const std::string& authenticatorToken); + void loginWorld(const std::string& account, const std::string& password, const std::string& worldName, const std::string& worldHost, int worldPort, const std::string& characterName, const std::string& authenticatorToken, const std::string& sessionKey); void cancelLogin(); void forceLogout(); void safeLogout(); diff --git a/src/client/protocolgame.cpp b/src/client/protocolgame.cpp index bab30ef1..107102b6 100644 --- a/src/client/protocolgame.cpp +++ b/src/client/protocolgame.cpp @@ -26,11 +26,12 @@ #include "item.h" #include "localplayer.h" -void ProtocolGame::login(const std::string& accountName, const std::string& accountPassword, const std::string& host, uint16 port, const std::string& characterName, const std::string& authenticatorToken) +void ProtocolGame::login(const std::string& accountName, const std::string& accountPassword, const std::string& host, uint16 port, const std::string& characterName, const std::string& authenticatorToken, const std::string& sessionKey) { m_accountName = accountName; m_accountPassword = accountPassword; m_authenticatorToken = authenticatorToken; + m_sessionKey = sessionKey; m_characterName = characterName; connect(host, port); diff --git a/src/client/protocolgame.h b/src/client/protocolgame.h index 6d65e8f9..68490b7c 100644 --- a/src/client/protocolgame.h +++ b/src/client/protocolgame.h @@ -31,7 +31,7 @@ class ProtocolGame : public Protocol { public: - void login(const std::string& accountName, const std::string& accountPassword, const std::string& host, uint16 port, const std::string& characterName, const std::string& authenticatorToken); + void login(const std::string& accountName, const std::string& accountPassword, const std::string& host, uint16 port, const std::string& characterName, const std::string& authenticatorToken, const std::string& sessionKey); void send(const OutputMessagePtr& outputMessage); void sendExtendedOpcode(uint8 opcode, const std::string& buffer); @@ -248,6 +248,7 @@ private: std::string m_accountName; std::string m_accountPassword; std::string m_authenticatorToken; + std::string m_sessionKey; std::string m_characterName; LocalPlayerPtr m_localPlayer; }; diff --git a/src/client/protocolgamesend.cpp b/src/client/protocolgamesend.cpp index f0e2d167..2f363eba 100644 --- a/src/client/protocolgamesend.cpp +++ b/src/client/protocolgamesend.cpp @@ -79,16 +79,21 @@ void ProtocolGame::sendLoginPacket(uint challengeTimestamp, uint8 challengeRando msg->addU8(0); // is gm set? } - if(g_game.getFeature(Otc::GameAccountNames)) - msg->addString(m_accountName); - else - msg->addU32(stdext::from_string(m_accountName)); + if(g_game.getFeature(Otc::GameSessionKey)) { + msg->addString(m_sessionKey); + msg->addString(m_characterName); + } else { + if(g_game.getFeature(Otc::GameAccountNames)) + msg->addString(m_accountName); + else + msg->addU32(stdext::from_string(m_accountName)); - msg->addString(m_characterName); - msg->addString(m_accountPassword); + msg->addString(m_characterName); + msg->addString(m_accountPassword); - if(g_game.getFeature(Otc::GameAuthenticator)) - msg->addString(m_authenticatorToken); + if(g_game.getFeature(Otc::GameAuthenticator)) + msg->addString(m_authenticatorToken); + } if(g_game.getFeature(Otc::GameChallengeOnLogin)) { msg->addU32(challengeTimestamp); From 1c3cfddab0c6ccacf2507b22e32789eb9f2f15aa Mon Sep 17 00:00:00 2001 From: TheSumm Date: Wed, 28 Jan 2015 00:01:53 +0100 Subject: [PATCH 29/43] Removed tr() from UIHeader --- modules/corelib/ui/uitable.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/corelib/ui/uitable.lua b/modules/corelib/ui/uitable.lua index 6302d295..fb644e70 100644 --- a/modules/corelib/ui/uitable.lua +++ b/modules/corelib/ui/uitable.lua @@ -154,7 +154,7 @@ function UITable:addHeader(data) elseif type == 'height' then col:setHeight(value) elseif type == 'text' then - col:setText(tr(value)) + col:setText(value) elseif type == 'onClick' then col.onClick = value end From 6961492e00b4356647aaf6153b1a72cbf365750f Mon Sep 17 00:00:00 2001 From: TheSumm Date: Fri, 30 Jan 2015 19:56:56 +0100 Subject: [PATCH 30/43] Fix console tabs not blinking, closes #627 --- data/styles/20-tabbars.otui | 2 +- modules/corelib/ui/uimovabletabbar.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/styles/20-tabbars.otui b/data/styles/20-tabbars.otui index bb8c6821..06f242dc 100644 --- a/data/styles/20-tabbars.otui +++ b/data/styles/20-tabbars.otui @@ -27,7 +27,7 @@ MoveableTabBarButton < UIButton color: #dfdfdf $on !checked: - color: #dfdfdf + color: #de6f6f TabBar < UITabBar size: 80 21 diff --git a/modules/corelib/ui/uimovabletabbar.lua b/modules/corelib/ui/uimovabletabbar.lua index ad59df79..71c75a60 100644 --- a/modules/corelib/ui/uimovabletabbar.lua +++ b/modules/corelib/ui/uimovabletabbar.lua @@ -187,7 +187,7 @@ local function onTabDragMove(tab, mousePos, mouseMoved) end local function tabBlink(tab, step) - step = step or 0 + local step = step or 0 tab:setOn(not tab:isOn()) removeEvent(tab.blinkEvent) From 4c4e0b9d073394058d293c0b8c132ac518eda547 Mon Sep 17 00:00:00 2001 From: TheSumm Date: Thu, 12 Feb 2015 14:48:56 +0100 Subject: [PATCH 31/43] Fix error showing after relogging with containers being open --- src/client/game.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/client/game.cpp b/src/client/game.cpp index 37c9dfdb..52d4477c 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -314,9 +314,6 @@ void Game::processCloseContainer(int containerId) { ContainerPtr container = getContainer(containerId); if(!container) { - /* happens if you close and restart client with container opened - * g_logger.traceError("container not found"); - */ return; } @@ -328,7 +325,6 @@ void Game::processContainerAddItem(int containerId, const ItemPtr& item, int slo { ContainerPtr container = getContainer(containerId); if(!container) { - g_logger.traceError("container not found"); return; } @@ -339,7 +335,6 @@ void Game::processContainerUpdateItem(int containerId, int slot, const ItemPtr& { ContainerPtr container = getContainer(containerId); if(!container) { - g_logger.traceError("container not found"); return; } @@ -350,7 +345,6 @@ void Game::processContainerRemoveItem(int containerId, int slot, const ItemPtr& { ContainerPtr container = getContainer(containerId); if(!container) { - g_logger.traceError("container not found"); return; } From 74af47f4d6fb03c51a02c68f9812b99f9961615f Mon Sep 17 00:00:00 2001 From: Nailson Date: Fri, 13 Feb 2015 08:19:45 -0300 Subject: [PATCH 32/43] Added support for enhanced animations for items. Thanks to @conde2, @BenDol --- src/client/CMakeLists.txt | 2 + src/client/animator.cpp | 199 ++++++++++++++++++++++++++++++++++ src/client/animator.h | 83 ++++++++++++++ src/client/const.h | 6 - src/client/declarations.h | 2 + src/client/item.cpp | 3 + src/client/thing.h | 2 +- src/client/thingtype.cpp | 34 ++---- src/client/thingtype.h | 20 +--- vc12/otclient.vcxproj | 2 + vc12/otclient.vcxproj.filters | 6 + 11 files changed, 310 insertions(+), 49 deletions(-) create mode 100644 src/client/animator.cpp create mode 100644 src/client/animator.h diff --git a/src/client/CMakeLists.txt b/src/client/CMakeLists.txt index 6e012ef2..d6fb4f6b 100644 --- a/src/client/CMakeLists.txt +++ b/src/client/CMakeLists.txt @@ -24,6 +24,8 @@ set(client_SOURCES ${client_SOURCES} # core ${CMAKE_CURRENT_LIST_DIR}/animatedtext.cpp ${CMAKE_CURRENT_LIST_DIR}/animatedtext.h + ${CMAKE_CURRENT_LIST_DIR}/animator.h + ${CMAKE_CURRENT_LIST_DIR}/animator.cpp ${CMAKE_CURRENT_LIST_DIR}/container.cpp ${CMAKE_CURRENT_LIST_DIR}/container.h ${CMAKE_CURRENT_LIST_DIR}/creature.cpp diff --git a/src/client/animator.cpp b/src/client/animator.cpp new file mode 100644 index 00000000..a285c072 --- /dev/null +++ b/src/client/animator.cpp @@ -0,0 +1,199 @@ +/* +* Copyright (c) 2010-2014 OTClient +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +* THE SOFTWARE. +*/ + +#include "declarations.h" +#include "animator.h" + +#include +#include + +Animator::Animator() +{ + m_animationPhases = 0; + m_startPhase = 0; + m_loopCount = 0; + m_async = false; + m_currentDuration = 0; + m_currentDirection = AnimDirForward; + m_currentLoop = 0; + m_lastPhaseTicks = 0; + m_isComplete = false; + m_phase = 0; +} + +void Animator::unserialize(int animationPhases, const FileStreamPtr& fin) +{ + m_animationPhases = animationPhases; + m_async = fin->getU8() == 0; + m_loopCount = fin->get32(); + m_startPhase = fin->get8(); + + for(int i = 0; i < m_animationPhases; ++i) { + int minimum = fin->getU32(); + int maximum = fin->getU32(); + m_phaseDurations.push_back(std::make_tuple(minimum, maximum)); + } + + m_phase = getStartPhase(); + + assert(m_animationPhases == m_phaseDurations.size()); + assert(m_startPhase >= -1 && m_startPhase < m_animationPhases); +} + +void Animator::serialize(const FileStreamPtr& fin) +{ + fin->addU8(m_async ? 0 : 1); + fin->add32(m_loopCount); + fin->add8(m_startPhase); + + for(std::tuple phase : m_phaseDurations) { + fin->addU32(std::get<0>(phase)); + fin->addU32(std::get<1>(phase)); + } +} + +void Animator::setPhase(int phase) +{ + if(m_phase == phase) return; + + if(m_async) { + if(phase == AnimPhaseAsync) + m_phase = 0; + else if(phase == AnimPhaseRandom) + m_phase = (int)stdext::random_range(0, (long)m_animationPhases); + else if(phase >= 0 && phase < m_animationPhases) + m_phase = phase; + else + m_phase = getStartPhase(); + + m_isComplete = false; + m_lastPhaseTicks = g_clock.millis(); + m_currentDuration = getPhaseDuration(phase); + m_currentLoop = 0; + } else + calculateSynchronous(); +} + +int Animator::getPhase() +{ + ticks_t ticks = g_clock.millis(); + if(ticks != m_lastPhaseTicks && !m_isComplete) { + int elapsedTicks = (int)(ticks - m_lastPhaseTicks); + if(elapsedTicks >= m_currentDuration) { + int phase = 0; + if(m_loopCount < 0) + phase = getPingPongPhase(); + else + phase = getLoopPhase(); + + if(m_phase != phase) { + int duration = getPhaseDuration(phase) - (elapsedTicks - m_currentDuration); + if(duration < 0 && !m_async) { + calculateSynchronous(); + } else { + m_phase = phase; + m_currentDuration = std::max(0, duration); + } + } else + m_isComplete = true; + } else + m_currentDuration -= elapsedTicks; + + m_lastPhaseTicks = ticks; + } + return m_phase; +} + +int Animator::getStartPhase() +{ + if(m_startPhase > -1) + return m_startPhase; + return (int)stdext::random_range(0, (long)m_animationPhases); +} + +void Animator::resetAnimation() +{ + m_isComplete = false; + m_currentDirection = AnimDirForward; + m_currentLoop = 0; + setPhase(AnimPhaseAutomatic); +} + +int Animator::getPingPongPhase() +{ + int count = m_currentDirection == AnimDirForward ? 1 : -1; + int nextPhase = m_phase + count; + if(nextPhase < 0 || nextPhase >= m_animationPhases) { + m_currentDirection = m_currentDirection == AnimDirForward ? AnimDirBackward : AnimDirForward; + count *= -1; + } + return m_phase + count; +} + +int Animator::getLoopPhase() +{ + int nextPhase = m_phase + 1; + if(nextPhase < m_animationPhases) + return nextPhase; + + if(m_loopCount == 0) + return 0; + + if(m_currentLoop < (m_loopCount - 1)) { + m_currentLoop++; + return 0; + } + + return m_phase; +} + +int Animator::getPhaseDuration(int phase) +{ + assert(phase < (int)m_phaseDurations.size()); + + std::tuple data = m_phaseDurations.at(phase); + int min = std::get<0>(data); + int max = std::get<1>(data); + if(min == max) return min; + return (int)stdext::random_range((long)min, (long)max); +} + +void Animator::calculateSynchronous() +{ + int totalDuration = 0; + for(int i = 0; i < m_animationPhases; i++) + totalDuration += getPhaseDuration(i); + + ticks_t ticks = g_clock.millis(); + int elapsedTicks = (int)(ticks % totalDuration); + int totalTime = 0; + for(int i = 0; i < m_animationPhases; i++) { + int duration = getPhaseDuration(i); + if(elapsedTicks >= totalTime && elapsedTicks < totalTime + duration) { + m_phase = i; + m_currentDuration = duration - (elapsedTicks - totalTime); + break; + } + totalTime += duration; + } + m_lastPhaseTicks = ticks; +} diff --git a/src/client/animator.h b/src/client/animator.h new file mode 100644 index 00000000..68ed60d5 --- /dev/null +++ b/src/client/animator.h @@ -0,0 +1,83 @@ +/* +* Copyright (c) 2010-2014 OTClient +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +* THE SOFTWARE. +*/ + +#ifndef ANIMATOR_H +#define ANIMATOR_H + +#include "declarations.h" + +#include + +enum AnimationPhase : int16 +{ + AnimPhaseAutomatic = -1, + AnimPhaseRandom = 254, + AnimPhaseAsync = 255, +}; + +enum AnimationDirection : uint8 +{ + AnimDirForward = 0, + AnimDirBackward = 1 +}; + +class Animator : public stdext::shared_object +{ +public: + Animator(); + + void unserialize(int animationPhases, const FileStreamPtr& fin); + void serialize(const FileStreamPtr& fin); + + void setPhase(int phase); + int getPhase(); + + int getStartPhase(); + int getAnimationPhases() { return m_animationPhases; } + bool isAsync() { return m_async; } + bool isComplete() { return m_isComplete; } + + void resetAnimation(); + +private: + int getPingPongPhase(); + int getLoopPhase(); + int getPhaseDuration(int phase); + void calculateSynchronous(); + + int m_animationPhases; + int m_startPhase; + int m_loopCount; + bool m_async; + std::vector< std::tuple > m_phaseDurations; + + int m_currentDuration; + AnimationDirection m_currentDirection; + int m_currentLoop; + + ticks_t m_lastPhaseTicks; + bool m_isComplete; + + int m_phase; +}; + +#endif diff --git a/src/client/const.h b/src/client/const.h index 9ce1dc37..e654e5c9 100644 --- a/src/client/const.h +++ b/src/client/const.h @@ -457,12 +457,6 @@ namespace Otc LastSpeedFormula }; - enum AnimationPhase { - PhaseAutomatic = 0, - PhaseRandom = 254, - PhaseAsync = 255 - }; - enum Blessings { BlessingNone = 0, BlessingAdventurer = 1, diff --git a/src/client/declarations.h b/src/client/declarations.h index 95c8a783..a6f4a612 100644 --- a/src/client/declarations.h +++ b/src/client/declarations.h @@ -45,6 +45,7 @@ class Effect; class Missile; class AnimatedText; class StaticText; +class Animator; class ThingType; class ItemType; class House; @@ -68,6 +69,7 @@ typedef stdext::shared_object_ptr EffectPtr; typedef stdext::shared_object_ptr MissilePtr; typedef stdext::shared_object_ptr AnimatedTextPtr; typedef stdext::shared_object_ptr StaticTextPtr; +typedef stdext::shared_object_ptr AnimatorPtr; typedef stdext::shared_object_ptr ThingTypePtr; typedef stdext::shared_object_ptr ItemTypePtr; typedef stdext::shared_object_ptr HousePtr; diff --git a/src/client/item.cpp b/src/client/item.cpp index 0e4695ed..90bd18a6 100644 --- a/src/client/item.cpp +++ b/src/client/item.cpp @@ -382,6 +382,9 @@ int Item::calculateAnimationPhase(bool animate) { if(getAnimationPhases() > 1) { if(animate) { + if(getAnimator() != nullptr) + return getAnimator()->getPhase(); + if(m_async) return (g_clock.millis() % (Otc::ITEM_TICKS_PER_FRAME * getAnimationPhases())) / Otc::ITEM_TICKS_PER_FRAME; else { diff --git a/src/client/thing.h b/src/client/thing.h index c8913bdb..9da464eb 100644 --- a/src/client/thing.h +++ b/src/client/thing.h @@ -74,7 +74,7 @@ public: int getNumPatternY() { return rawGetThingType()->getNumPatternY(); } int getNumPatternZ() { return rawGetThingType()->getNumPatternZ(); } int getAnimationPhases() { return rawGetThingType()->getAnimationPhases(); } - Animation getAnimation() { return rawGetThingType()->getAnimation(); } + AnimatorPtr getAnimator() { return rawGetThingType()->getAnimator(); } int getGroundSpeed() { return rawGetThingType()->getGroundSpeed(); } int getMaxTextLength() { return rawGetThingType()->getMaxTextLength(); } Light getLight() { return rawGetThingType()->getLight(); } diff --git a/src/client/thingtype.cpp b/src/client/thingtype.cpp index b19e50d3..1c9d20e1 100644 --- a/src/client/thingtype.cpp +++ b/src/client/thingtype.cpp @@ -39,6 +39,7 @@ ThingType::ThingType() m_null = true; m_exactSize = 0; m_realSize = 0; + m_animator = nullptr; m_numPatternX = m_numPatternY = m_numPatternZ = 0; m_animationPhases = 0; m_layers = 0; @@ -117,15 +118,8 @@ void ThingType::serialize(const FileStreamPtr& fin) fin->addU8(m_animationPhases); if(g_game.getFeature(Otc::GameEnhancedAnimations)) { - if(m_animationPhases > 1) { - fin->addU8(m_animation.async ? 0 : 1); - fin->add32(m_animation.loopCount); - fin->addU8(m_animation.startIndex); - - for(std::tuple frame : m_animation.frames) { - fin->addU32(std::get<0>(frame)); - fin->addU32(std::get<1>(frame)); - } + if(m_animationPhases > 1 && m_animator != nullptr) { + m_animator->serialize(fin); } } @@ -274,11 +268,11 @@ void ThingType::unserialize(uint16 clientId, ThingCategory category, const FileS stdext::throw_exception(stdext::format("corrupt data (id: %d, category: %d, count: %d, lastAttr: %d)", m_id, m_category, count, attr)); - uint8 frames = 1; + uint8 groupCount = 1; if(category == ThingCategoryCreature && g_game.getClientVersion() >= 1057) - frames = fin->getU8(); + groupCount = fin->getU8(); - for(int i = 0; i < frames; ++i) { + for(int i = 0; i < groupCount; ++i) { uint8 frameGroup = FrameGroupDefault; if(category == ThingCategoryCreature && g_game.getClientVersion() >= 1057) { frameGroup = fin->getU8(); @@ -303,19 +297,9 @@ void ThingType::unserialize(uint16 clientId, ThingCategory category, const FileS m_numPatternZ = 1; m_animationPhases = fin->getU8(); - if(g_game.getFeature(Otc::GameEnhancedAnimations)) { - if(m_animationPhases > 1) { - m_animation.async = fin->getU8() == 0; - m_animation.loopCount = fin->get32(); - m_animation.startIndex = fin->getU8(); - - for (int i = 0; i < m_animationPhases; i++) { - int minDuration = fin->getU32(); - int maxDuration = fin->getU32(); - - m_animation.frames.push_back(std::make_tuple(minDuration, maxDuration)); - } - } + if(m_animationPhases > 1 && g_game.getFeature(Otc::GameEnhancedAnimations)) { + m_animator = AnimatorPtr(new Animator); + m_animator->unserialize(m_animationPhases, fin); } int totalSprites = m_size.area() * m_layers * m_numPatternX * m_numPatternY * m_numPatternZ * m_animationPhases; diff --git a/src/client/thingtype.h b/src/client/thingtype.h index 11a85f20..bcc64d45 100644 --- a/src/client/thingtype.h +++ b/src/client/thingtype.h @@ -24,6 +24,7 @@ #define THINGTYPE_H #include "declarations.h" +#include "animator.h" #include #include @@ -116,21 +117,6 @@ struct Light { uint8 color; }; -struct Animation { - Animation() { startIndex = 0; loopCount = 0; async = false; } - - int startIndex; - int loopCount; - bool async; - std::vector > frames; - - float duration(uint8 frame) { - assert(frames.size() <= frame); - std::tuple data = frames.at(frame); - return stdext::random_range((long)std::get<0>(data), (long)std::get<1>(data)); - } -}; - class ThingType : public LuaObject { public: @@ -159,7 +145,7 @@ public: int getNumPatternY() { return m_numPatternY; } int getNumPatternZ() { return m_numPatternZ; } int getAnimationPhases() { return m_animationPhases; } - Animation getAnimation() { return m_animation; } + AnimatorPtr getAnimator() { return m_animator; } Point getDisplacement() { return m_displacement; } int getDisplacementX() { return getDisplacement().x; } int getDisplacementY() { return getDisplacement().y; } @@ -226,7 +212,7 @@ private: Size m_size; Point m_displacement; - Animation m_animation; + AnimatorPtr m_animator; int m_animationPhases; int m_exactSize; int m_realSize; diff --git a/vc12/otclient.vcxproj b/vc12/otclient.vcxproj index 88fee3ed..0cc33c3d 100644 --- a/vc12/otclient.vcxproj +++ b/vc12/otclient.vcxproj @@ -161,6 +161,7 @@ + @@ -315,6 +316,7 @@ + diff --git a/vc12/otclient.vcxproj.filters b/vc12/otclient.vcxproj.filters index 870bd4e5..7056e0b8 100644 --- a/vc12/otclient.vcxproj.filters +++ b/vc12/otclient.vcxproj.filters @@ -528,6 +528,9 @@ Source Files\framework\core + + Source Files\client + @@ -1049,6 +1052,9 @@ Header Files\framework\core + + Header Files\client + From cbf70c1d63c2bf0837d099309599a8d331550eb9 Mon Sep 17 00:00:00 2001 From: TheSumm Date: Sun, 15 Feb 2015 03:25:28 +0100 Subject: [PATCH 33/43] Enable protocol 10.75 --- modules/gamelib/game.lua | 2 +- src/client/game.cpp | 4 +-- src/client/thingtypeanimator.cpp | 40 +++++++++++++++++++++ src/client/thingtypeanimator.h | 60 ++++++++++++++++++++++++++++++++ 4 files changed, 103 insertions(+), 3 deletions(-) create mode 100644 src/client/thingtypeanimator.cpp create mode 100644 src/client/thingtypeanimator.h diff --git a/modules/gamelib/game.lua b/modules/gamelib/game.lua index 41f09f51..3189538c 100644 --- a/modules/gamelib/game.lua +++ b/modules/gamelib/game.lua @@ -73,7 +73,7 @@ function g_game.getSupportedClients() 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1070, 1071, 1072, - 1073, 1074 + 1073, 1074, 1075 } end diff --git a/src/client/game.cpp b/src/client/game.cpp index 52d4477c..2dffbd7d 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -1450,7 +1450,7 @@ void Game::setProtocolVersion(int version) if(isOnline()) stdext::throw_exception("Unable to change protocol version while online"); - if(version != 0 && (version < 740 || version > 1074)) + if(version != 0 && (version < 740 || version > 1075)) stdext::throw_exception(stdext::format("Protocol version %d not supported", version)); m_protocolVersion = version; @@ -1468,7 +1468,7 @@ void Game::setClientVersion(int version) if(isOnline()) stdext::throw_exception("Unable to change client version while online"); - if(version != 0 && (version < 740 || version > 1074)) + if(version != 0 && (version < 740 || version > 1075)) stdext::throw_exception(stdext::format("Client version %d not supported", version)); m_features.reset(); diff --git a/src/client/thingtypeanimator.cpp b/src/client/thingtypeanimator.cpp new file mode 100644 index 00000000..6211c2cf --- /dev/null +++ b/src/client/thingtypeanimator.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2010-2014 OTClient + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "thingtypeanimator.h" +#include "spritemanager.h" +#include "game.h" +#include "lightview.h" + +#include +#include +#include +#include +#include +#include + +ThingTypeAnimator::ThingTypeAnimator(int id, ThingCategory category) +{ + m_category = category; + m_id = id; + +} diff --git a/src/client/thingtypeanimator.h b/src/client/thingtypeanimator.h new file mode 100644 index 00000000..1653e543 --- /dev/null +++ b/src/client/thingtypeanimator.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2010-2014 OTClient + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef THINGTYPEANIMATOR_H +#define THINGTYPEANIMATOR_H + +#include "declarations.h" + +#include +#include +#include +#include +#include +#include + +enum FrameDurations { + FRAME_DURATION_ITEM = 500, + FRAME_DURATION_OUTFIT = 300, + FRAME_DURATION_EFFECT = 75 +}; + +class ThingTypeAnimator : public LuaObject +{ +public: + ThingTypeAnimator(int id, ThingCategory category); + +private: + int m_lastPhase; + int m_currentPhase; + int m_startingPhase; + int m_loopCount; + + int m_phases; + int m_timer; + + int m_id; + ThingCategory m_category; + +}; + +#endif From f51a160bdedf6286da4685247bf24b646bf37768 Mon Sep 17 00:00:00 2001 From: TheSumm Date: Sun, 15 Feb 2015 03:27:32 +0100 Subject: [PATCH 34/43] Remove unintentionally added files --- src/client/thingtypeanimator.cpp | 40 --------------------- src/client/thingtypeanimator.h | 60 -------------------------------- 2 files changed, 100 deletions(-) delete mode 100644 src/client/thingtypeanimator.cpp delete mode 100644 src/client/thingtypeanimator.h diff --git a/src/client/thingtypeanimator.cpp b/src/client/thingtypeanimator.cpp deleted file mode 100644 index 6211c2cf..00000000 --- a/src/client/thingtypeanimator.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2010-2014 OTClient - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include "thingtypeanimator.h" -#include "spritemanager.h" -#include "game.h" -#include "lightview.h" - -#include -#include -#include -#include -#include -#include - -ThingTypeAnimator::ThingTypeAnimator(int id, ThingCategory category) -{ - m_category = category; - m_id = id; - -} diff --git a/src/client/thingtypeanimator.h b/src/client/thingtypeanimator.h deleted file mode 100644 index 1653e543..00000000 --- a/src/client/thingtypeanimator.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2010-2014 OTClient - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#ifndef THINGTYPEANIMATOR_H -#define THINGTYPEANIMATOR_H - -#include "declarations.h" - -#include -#include -#include -#include -#include -#include - -enum FrameDurations { - FRAME_DURATION_ITEM = 500, - FRAME_DURATION_OUTFIT = 300, - FRAME_DURATION_EFFECT = 75 -}; - -class ThingTypeAnimator : public LuaObject -{ -public: - ThingTypeAnimator(int id, ThingCategory category); - -private: - int m_lastPhase; - int m_currentPhase; - int m_startingPhase; - int m_loopCount; - - int m_phases; - int m_timer; - - int m_id; - ThingCategory m_category; - -}; - -#endif From b5c7374890c63e931c3c98ae1e65d5d62ffd740b Mon Sep 17 00:00:00 2001 From: Suggest Name Date: Thu, 5 Feb 2015 20:28:21 -0200 Subject: [PATCH 35/43] Update textmessage.otui --- modules/game_textmessage/textmessage.otui | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/game_textmessage/textmessage.otui b/modules/game_textmessage/textmessage.otui index 7af5ed1f..32cd2b62 100644 --- a/modules/game_textmessage/textmessage.otui +++ b/modules/game_textmessage/textmessage.otui @@ -8,6 +8,7 @@ TextMessageLabel < UILabel Panel anchors.fill: gameMapPanel + anchors.bottom: gameBottomPanel.top focusable: false Panel From 04b516a1a0fe7a0d5410141f66e3f1e39a0b18ae Mon Sep 17 00:00:00 2001 From: Gabriel Pedro Date: Wed, 4 Mar 2015 10:36:51 -0400 Subject: [PATCH 36/43] Update copyright for 2015 --- LICENSE | 2 +- src/client/animatedtext.cpp | 2 +- src/client/animatedtext.h | 2 +- src/client/animator.cpp | 2 +- src/client/animator.h | 2 +- src/client/client.cpp | 2 +- src/client/client.h | 2 +- src/client/const.h | 2 +- src/client/container.cpp | 2 +- src/client/container.h | 2 +- src/client/creature.cpp | 2 +- src/client/creature.h | 2 +- src/client/creatures.cpp | 2 +- src/client/creatures.h | 2 +- src/client/declarations.h | 2 +- src/client/effect.cpp | 2 +- src/client/effect.h | 2 +- src/client/game.cpp | 2 +- src/client/game.h | 2 +- src/client/global.h | 2 +- src/client/houses.cpp | 2 +- src/client/houses.h | 2 +- src/client/item.cpp | 2 +- src/client/item.h | 2 +- src/client/itemtype.cpp | 2 +- src/client/itemtype.h | 2 +- src/client/lightview.cpp | 2 +- src/client/lightview.h | 2 +- src/client/localplayer.cpp | 2 +- src/client/localplayer.h | 2 +- src/client/luafunctions.cpp | 2 +- src/client/luavaluecasts.cpp | 2 +- src/client/luavaluecasts.h | 2 +- src/client/map.cpp | 2 +- src/client/map.h | 2 +- src/client/mapio.cpp | 2 +- src/client/mapview.cpp | 2 +- src/client/mapview.h | 2 +- src/client/minimap.cpp | 2 +- src/client/minimap.h | 2 +- src/client/missile.cpp | 2 +- src/client/missile.h | 2 +- src/client/outfit.cpp | 2 +- src/client/outfit.h | 2 +- src/client/player.cpp | 2 +- src/client/player.h | 2 +- src/client/position.h | 2 +- src/client/protocolcodes.cpp | 2 +- src/client/protocolcodes.h | 2 +- src/client/protocolgame.cpp | 2 +- src/client/protocolgame.h | 2 +- src/client/protocolgameparse.cpp | 2 +- src/client/protocolgamesend.cpp | 2 +- src/client/shadermanager.cpp | 2 +- src/client/shadermanager.h | 2 +- src/client/spritemanager.cpp | 2 +- src/client/spritemanager.h | 2 +- src/client/statictext.cpp | 2 +- src/client/statictext.h | 2 +- src/client/thing.cpp | 2 +- src/client/thing.h | 2 +- src/client/thingtype.cpp | 2 +- src/client/thingtype.h | 2 +- src/client/thingtypemanager.cpp | 2 +- src/client/thingtypemanager.h | 2 +- src/client/tile.cpp | 2 +- src/client/tile.h | 2 +- src/client/towns.cpp | 2 +- src/client/towns.h | 2 +- src/client/uicreature.cpp | 2 +- src/client/uicreature.h | 2 +- src/client/uiitem.cpp | 2 +- src/client/uiitem.h | 2 +- src/client/uimap.cpp | 2 +- src/client/uimap.h | 2 +- src/client/uimapanchorlayout.cpp | 2 +- src/client/uimapanchorlayout.h | 2 +- src/client/uiminimap.cpp | 2 +- src/client/uiminimap.h | 2 +- src/client/uiprogressrect.cpp | 2 +- src/client/uiprogressrect.h | 2 +- src/client/uisprite.cpp | 2 +- src/client/uisprite.h | 2 +- src/framework/const.h | 2 +- src/framework/core/adaptativeframecounter.cpp | 2 +- src/framework/core/adaptativeframecounter.h | 2 +- src/framework/core/application.cpp | 2 +- src/framework/core/application.h | 2 +- src/framework/core/asyncdispatcher.cpp | 2 +- src/framework/core/asyncdispatcher.h | 2 +- src/framework/core/binarytree.cpp | 2 +- src/framework/core/binarytree.h | 2 +- src/framework/core/clock.cpp | 2 +- src/framework/core/clock.h | 2 +- src/framework/core/config.cpp | 2 +- src/framework/core/config.h | 2 +- src/framework/core/configmanager.cpp | 2 +- src/framework/core/configmanager.h | 2 +- src/framework/core/declarations.h | 2 +- src/framework/core/event.cpp | 2 +- src/framework/core/event.h | 2 +- src/framework/core/eventdispatcher.cpp | 2 +- src/framework/core/eventdispatcher.h | 2 +- src/framework/core/filestream.cpp | 2 +- src/framework/core/filestream.h | 2 +- src/framework/core/graphicalapplication.cpp | 2 +- src/framework/core/graphicalapplication.h | 2 +- src/framework/core/inputevent.h | 2 +- src/framework/core/logger.cpp | 2 +- src/framework/core/logger.h | 2 +- src/framework/core/module.cpp | 2 +- src/framework/core/module.h | 2 +- src/framework/core/modulemanager.cpp | 2 +- src/framework/core/modulemanager.h | 2 +- src/framework/core/resourcemanager.cpp | 2 +- src/framework/core/resourcemanager.h | 2 +- src/framework/core/scheduledevent.cpp | 2 +- src/framework/core/scheduledevent.h | 2 +- src/framework/core/timer.cpp | 2 +- src/framework/core/timer.h | 2 +- src/framework/global.h | 2 +- src/framework/graphics/animatedtexture.cpp | 2 +- src/framework/graphics/animatedtexture.h | 2 +- src/framework/graphics/apngloader.h | 2 +- src/framework/graphics/bitmapfont.cpp | 2 +- src/framework/graphics/bitmapfont.h | 2 +- src/framework/graphics/cachedtext.cpp | 2 +- src/framework/graphics/cachedtext.h | 2 +- src/framework/graphics/coordsbuffer.cpp | 2 +- src/framework/graphics/coordsbuffer.h | 2 +- src/framework/graphics/declarations.h | 2 +- src/framework/graphics/fontmanager.cpp | 2 +- src/framework/graphics/fontmanager.h | 2 +- src/framework/graphics/framebuffer.cpp | 2 +- src/framework/graphics/framebuffer.h | 2 +- src/framework/graphics/framebuffermanager.cpp | 2 +- src/framework/graphics/framebuffermanager.h | 2 +- src/framework/graphics/glutil.h | 2 +- src/framework/graphics/graphics.cpp | 2 +- src/framework/graphics/graphics.h | 2 +- src/framework/graphics/hardwarebuffer.cpp | 2 +- src/framework/graphics/hardwarebuffer.h | 2 +- src/framework/graphics/image.cpp | 2 +- src/framework/graphics/image.h | 2 +- src/framework/graphics/ogl/painterogl.cpp | 2 +- src/framework/graphics/ogl/painterogl.h | 2 +- src/framework/graphics/ogl/painterogl1.cpp | 2 +- src/framework/graphics/ogl/painterogl1.h | 2 +- src/framework/graphics/ogl/painterogl2.cpp | 2 +- src/framework/graphics/ogl/painterogl2.h | 2 +- src/framework/graphics/ogl/painterogl2_shadersources.h | 2 +- src/framework/graphics/painter.cpp | 2 +- src/framework/graphics/painter.h | 2 +- src/framework/graphics/paintershaderprogram.cpp | 2 +- src/framework/graphics/paintershaderprogram.h | 2 +- src/framework/graphics/particle.cpp | 2 +- src/framework/graphics/particle.h | 2 +- src/framework/graphics/particleaffector.cpp | 2 +- src/framework/graphics/particleaffector.h | 2 +- src/framework/graphics/particleeffect.cpp | 2 +- src/framework/graphics/particleeffect.h | 2 +- src/framework/graphics/particleemitter.cpp | 2 +- src/framework/graphics/particleemitter.h | 2 +- src/framework/graphics/particlemanager.cpp | 2 +- src/framework/graphics/particlemanager.h | 2 +- src/framework/graphics/particlesystem.cpp | 2 +- src/framework/graphics/particlesystem.h | 2 +- src/framework/graphics/particletype.cpp | 2 +- src/framework/graphics/particletype.h | 2 +- src/framework/graphics/shader.cpp | 2 +- src/framework/graphics/shader.h | 2 +- src/framework/graphics/shaderprogram.cpp | 2 +- src/framework/graphics/shaderprogram.h | 2 +- src/framework/graphics/texture.cpp | 2 +- src/framework/graphics/texture.h | 2 +- src/framework/graphics/texturemanager.cpp | 2 +- src/framework/graphics/texturemanager.h | 2 +- src/framework/graphics/vertexarray.h | 2 +- src/framework/input/mouse.cpp | 2 +- src/framework/input/mouse.h | 2 +- src/framework/luaengine/declarations.h | 2 +- src/framework/luaengine/lbitlib.h | 2 +- src/framework/luaengine/luabinder.h | 2 +- src/framework/luaengine/luaexception.cpp | 2 +- src/framework/luaengine/luaexception.h | 2 +- src/framework/luaengine/luainterface.cpp | 2 +- src/framework/luaengine/luainterface.h | 2 +- src/framework/luaengine/luaobject.cpp | 2 +- src/framework/luaengine/luaobject.h | 2 +- src/framework/luaengine/luavaluecasts.cpp | 2 +- src/framework/luaengine/luavaluecasts.h | 2 +- src/framework/luafunctions.cpp | 2 +- src/framework/net/connection.cpp | 2 +- src/framework/net/connection.h | 2 +- src/framework/net/declarations.h | 2 +- src/framework/net/inputmessage.cpp | 2 +- src/framework/net/inputmessage.h | 2 +- src/framework/net/outputmessage.cpp | 2 +- src/framework/net/outputmessage.h | 2 +- src/framework/net/protocol.cpp | 2 +- src/framework/net/protocol.h | 2 +- src/framework/net/protocolhttp.cpp | 2 +- src/framework/net/protocolhttp.h | 2 +- src/framework/net/server.cpp | 2 +- src/framework/net/server.h | 2 +- src/framework/otml/declarations.h | 2 +- src/framework/otml/otml.h | 2 +- src/framework/otml/otmldocument.cpp | 2 +- src/framework/otml/otmldocument.h | 2 +- src/framework/otml/otmlemitter.cpp | 2 +- src/framework/otml/otmlemitter.h | 2 +- src/framework/otml/otmlexception.cpp | 2 +- src/framework/otml/otmlexception.h | 2 +- src/framework/otml/otmlnode.cpp | 2 +- src/framework/otml/otmlnode.h | 2 +- src/framework/otml/otmlparser.cpp | 2 +- src/framework/otml/otmlparser.h | 2 +- src/framework/pch.h | 2 +- src/framework/platform/crashhandler.h | 2 +- src/framework/platform/platform.cpp | 2 +- src/framework/platform/platform.h | 2 +- src/framework/platform/platformwindow.cpp | 2 +- src/framework/platform/platformwindow.h | 2 +- src/framework/platform/unixcrashhandler.cpp | 2 +- src/framework/platform/unixplatform.cpp | 2 +- src/framework/platform/win32crashhandler.cpp | 2 +- src/framework/platform/win32platform.cpp | 2 +- src/framework/platform/win32window.cpp | 2 +- src/framework/platform/win32window.h | 2 +- src/framework/platform/x11window.cpp | 2 +- src/framework/platform/x11window.h | 2 +- src/framework/sound/combinedsoundsource.cpp | 2 +- src/framework/sound/combinedsoundsource.h | 2 +- src/framework/sound/declarations.h | 2 +- src/framework/sound/oggsoundfile.cpp | 2 +- src/framework/sound/oggsoundfile.h | 2 +- src/framework/sound/soundbuffer.cpp | 2 +- src/framework/sound/soundbuffer.h | 2 +- src/framework/sound/soundchannel.cpp | 2 +- src/framework/sound/soundchannel.h | 2 +- src/framework/sound/soundfile.cpp | 2 +- src/framework/sound/soundfile.h | 2 +- src/framework/sound/soundmanager.cpp | 2 +- src/framework/sound/soundmanager.h | 2 +- src/framework/sound/soundsource.cpp | 2 +- src/framework/sound/soundsource.h | 2 +- src/framework/sound/streamsoundsource.cpp | 2 +- src/framework/sound/streamsoundsource.h | 2 +- src/framework/stdext/any.h | 2 +- src/framework/stdext/boolean.h | 2 +- src/framework/stdext/cast.h | 2 +- src/framework/stdext/compiler.h | 2 +- src/framework/stdext/demangle.cpp | 2 +- src/framework/stdext/demangle.h | 2 +- src/framework/stdext/dumper.h | 2 +- src/framework/stdext/dynamic_storage.h | 2 +- src/framework/stdext/exception.h | 2 +- src/framework/stdext/format.h | 2 +- src/framework/stdext/math.cpp | 2 +- src/framework/stdext/math.h | 2 +- src/framework/stdext/net.cpp | 2 +- src/framework/stdext/net.h | 2 +- src/framework/stdext/packed_any.h | 2 +- src/framework/stdext/packed_storage.h | 2 +- src/framework/stdext/packed_vector.h | 2 +- src/framework/stdext/shared_object.h | 2 +- src/framework/stdext/shared_ptr.h | 2 +- src/framework/stdext/stdext.h | 2 +- src/framework/stdext/string.cpp | 2 +- src/framework/stdext/string.h | 2 +- src/framework/stdext/time.cpp | 2 +- src/framework/stdext/time.h | 2 +- src/framework/stdext/traits.h | 2 +- src/framework/stdext/types.h | 2 +- src/framework/ui/declarations.h | 2 +- src/framework/ui/ui.h | 2 +- src/framework/ui/uianchorlayout.cpp | 2 +- src/framework/ui/uianchorlayout.h | 2 +- src/framework/ui/uiboxlayout.cpp | 2 +- src/framework/ui/uiboxlayout.h | 2 +- src/framework/ui/uigridlayout.cpp | 2 +- src/framework/ui/uigridlayout.h | 2 +- src/framework/ui/uihorizontallayout.cpp | 2 +- src/framework/ui/uihorizontallayout.h | 2 +- src/framework/ui/uilayout.cpp | 2 +- src/framework/ui/uilayout.h | 2 +- src/framework/ui/uimanager.cpp | 2 +- src/framework/ui/uimanager.h | 2 +- src/framework/ui/uiparticles.cpp | 2 +- src/framework/ui/uiparticles.h | 2 +- src/framework/ui/uitextedit.cpp | 2 +- src/framework/ui/uitextedit.h | 2 +- src/framework/ui/uitranslator.cpp | 2 +- src/framework/ui/uitranslator.h | 2 +- src/framework/ui/uiverticallayout.cpp | 2 +- src/framework/ui/uiverticallayout.h | 2 +- src/framework/ui/uiwidget.cpp | 2 +- src/framework/ui/uiwidget.h | 2 +- src/framework/ui/uiwidgetbasestyle.cpp | 2 +- src/framework/ui/uiwidgetimage.cpp | 2 +- src/framework/ui/uiwidgettext.cpp | 2 +- src/framework/util/color.cpp | 2 +- src/framework/util/color.h | 2 +- src/framework/util/crypt.cpp | 2 +- src/framework/util/crypt.h | 2 +- src/framework/util/databuffer.h | 2 +- src/framework/util/matrix.h | 2 +- src/framework/util/point.h | 2 +- src/framework/util/rect.h | 2 +- src/framework/util/size.h | 2 +- src/main.cpp | 2 +- 311 files changed, 311 insertions(+), 311 deletions(-) diff --git a/LICENSE b/LICENSE index 813a2a15..0a3df7fe 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ OTClient is made available under the MIT License -Copyright (c) 2010-2012 OTClient +Copyright (c) 2010-2015 OTClient Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/animatedtext.cpp b/src/client/animatedtext.cpp index 8faf09d6..abed2624 100644 --- a/src/client/animatedtext.cpp +++ b/src/client/animatedtext.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/animatedtext.h b/src/client/animatedtext.h index c2444a7d..eddc3c96 100644 --- a/src/client/animatedtext.h +++ b/src/client/animatedtext.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/animator.cpp b/src/client/animator.cpp index a285c072..e07bc6a2 100644 --- a/src/client/animator.cpp +++ b/src/client/animator.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2010-2014 OTClient +* Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/animator.h b/src/client/animator.h index 68ed60d5..c853c1f6 100644 --- a/src/client/animator.h +++ b/src/client/animator.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2010-2014 OTClient +* Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/client.cpp b/src/client/client.cpp index 2159dcda..9deecfdb 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/client.h b/src/client/client.h index 22fca2bd..25108bf3 100644 --- a/src/client/client.h +++ b/src/client/client.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/const.h b/src/client/const.h index e654e5c9..3e2db411 100644 --- a/src/client/const.h +++ b/src/client/const.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/container.cpp b/src/client/container.cpp index 4c83912e..fe8a38f5 100644 --- a/src/client/container.cpp +++ b/src/client/container.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/container.h b/src/client/container.h index c87e8bdd..98783f51 100644 --- a/src/client/container.h +++ b/src/client/container.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/creature.cpp b/src/client/creature.cpp index 9aa1c2df..6e6bb63c 100644 --- a/src/client/creature.cpp +++ b/src/client/creature.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/creature.h b/src/client/creature.h index 606d272e..57ccff35 100644 --- a/src/client/creature.h +++ b/src/client/creature.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/creatures.cpp b/src/client/creatures.cpp index 227a8176..d26e1101 100644 --- a/src/client/creatures.cpp +++ b/src/client/creatures.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/creatures.h b/src/client/creatures.h index 8117b696..e5e80c61 100644 --- a/src/client/creatures.h +++ b/src/client/creatures.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/declarations.h b/src/client/declarations.h index a6f4a612..3bdfe0b8 100644 --- a/src/client/declarations.h +++ b/src/client/declarations.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/effect.cpp b/src/client/effect.cpp index 082cd085..6cd37c46 100644 --- a/src/client/effect.cpp +++ b/src/client/effect.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/effect.h b/src/client/effect.h index ee50b3cd..e4aeeb5d 100644 --- a/src/client/effect.h +++ b/src/client/effect.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/game.cpp b/src/client/game.cpp index 2dffbd7d..448e0544 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/game.h b/src/client/game.h index b707ed53..afe80b42 100644 --- a/src/client/game.h +++ b/src/client/game.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/global.h b/src/client/global.h index 2986b72b..1e35b5b1 100644 --- a/src/client/global.h +++ b/src/client/global.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/houses.cpp b/src/client/houses.cpp index 0a476a0c..8b08604c 100644 --- a/src/client/houses.cpp +++ b/src/client/houses.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/houses.h b/src/client/houses.h index a556c340..f10f82ab 100644 --- a/src/client/houses.h +++ b/src/client/houses.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/item.cpp b/src/client/item.cpp index 90bd18a6..cf32ba1f 100644 --- a/src/client/item.cpp +++ b/src/client/item.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/item.h b/src/client/item.h index 6c8a3446..8984354f 100644 --- a/src/client/item.h +++ b/src/client/item.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/itemtype.cpp b/src/client/itemtype.cpp index 30cbe5da..5c049b57 100644 --- a/src/client/itemtype.cpp +++ b/src/client/itemtype.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/itemtype.h b/src/client/itemtype.h index 9790bba7..5fc7d22d 100644 --- a/src/client/itemtype.h +++ b/src/client/itemtype.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/lightview.cpp b/src/client/lightview.cpp index e88b5eaf..1cd45107 100644 --- a/src/client/lightview.cpp +++ b/src/client/lightview.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/lightview.h b/src/client/lightview.h index e7c82119..0682fa8f 100644 --- a/src/client/lightview.h +++ b/src/client/lightview.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/localplayer.cpp b/src/client/localplayer.cpp index e137d9dd..8dbf730f 100644 --- a/src/client/localplayer.cpp +++ b/src/client/localplayer.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/localplayer.h b/src/client/localplayer.h index 65556334..3447a006 100644 --- a/src/client/localplayer.h +++ b/src/client/localplayer.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/luafunctions.cpp b/src/client/luafunctions.cpp index 0fa6794f..ee60f178 100644 --- a/src/client/luafunctions.cpp +++ b/src/client/luafunctions.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/luavaluecasts.cpp b/src/client/luavaluecasts.cpp index c2041a9e..6f68a02d 100644 --- a/src/client/luavaluecasts.cpp +++ b/src/client/luavaluecasts.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/luavaluecasts.h b/src/client/luavaluecasts.h index d4548bfb..d4a9998f 100644 --- a/src/client/luavaluecasts.h +++ b/src/client/luavaluecasts.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/map.cpp b/src/client/map.cpp index 5133e7dc..dc061ee8 100644 --- a/src/client/map.cpp +++ b/src/client/map.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/map.h b/src/client/map.h index 6836a1ea..f25c9749 100644 --- a/src/client/map.h +++ b/src/client/map.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/mapio.cpp b/src/client/mapio.cpp index a1229679..80480f5c 100644 --- a/src/client/mapio.cpp +++ b/src/client/mapio.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/mapview.cpp b/src/client/mapview.cpp index bba7fbf2..3edb6af0 100644 --- a/src/client/mapview.cpp +++ b/src/client/mapview.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/mapview.h b/src/client/mapview.h index 958af889..c3a360b9 100644 --- a/src/client/mapview.h +++ b/src/client/mapview.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/minimap.cpp b/src/client/minimap.cpp index 9f23ef57..58004ad5 100644 --- a/src/client/minimap.cpp +++ b/src/client/minimap.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/minimap.h b/src/client/minimap.h index a89f7320..1e06004c 100644 --- a/src/client/minimap.h +++ b/src/client/minimap.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/missile.cpp b/src/client/missile.cpp index febbda56..dde565a5 100644 --- a/src/client/missile.cpp +++ b/src/client/missile.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/missile.h b/src/client/missile.h index 00e30836..d2cd2177 100644 --- a/src/client/missile.h +++ b/src/client/missile.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/outfit.cpp b/src/client/outfit.cpp index 1f89eb9b..f1e1e1db 100644 --- a/src/client/outfit.cpp +++ b/src/client/outfit.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/outfit.h b/src/client/outfit.h index e71f6ad6..aea526f2 100644 --- a/src/client/outfit.h +++ b/src/client/outfit.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/player.cpp b/src/client/player.cpp index 95e1510c..4ee842ee 100644 --- a/src/client/player.cpp +++ b/src/client/player.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/player.h b/src/client/player.h index d5025bbc..363a0e8c 100644 --- a/src/client/player.h +++ b/src/client/player.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/position.h b/src/client/position.h index 4585fd34..47c877b3 100644 --- a/src/client/position.h +++ b/src/client/position.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/protocolcodes.cpp b/src/client/protocolcodes.cpp index 865f8864..6e80b4e2 100644 --- a/src/client/protocolcodes.cpp +++ b/src/client/protocolcodes.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/protocolcodes.h b/src/client/protocolcodes.h index 26fda831..b0bb6d66 100644 --- a/src/client/protocolcodes.h +++ b/src/client/protocolcodes.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/protocolgame.cpp b/src/client/protocolgame.cpp index 107102b6..6f424449 100644 --- a/src/client/protocolgame.cpp +++ b/src/client/protocolgame.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/protocolgame.h b/src/client/protocolgame.h index 68490b7c..100c07ea 100644 --- a/src/client/protocolgame.h +++ b/src/client/protocolgame.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/protocolgameparse.cpp b/src/client/protocolgameparse.cpp index 7744a602..a687a03a 100644 --- a/src/client/protocolgameparse.cpp +++ b/src/client/protocolgameparse.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/protocolgamesend.cpp b/src/client/protocolgamesend.cpp index 2f363eba..c3bbed03 100644 --- a/src/client/protocolgamesend.cpp +++ b/src/client/protocolgamesend.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/shadermanager.cpp b/src/client/shadermanager.cpp index b414ab20..21fcc3df 100644 --- a/src/client/shadermanager.cpp +++ b/src/client/shadermanager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/shadermanager.h b/src/client/shadermanager.h index 6dc958c3..ecf32157 100644 --- a/src/client/shadermanager.h +++ b/src/client/shadermanager.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/spritemanager.cpp b/src/client/spritemanager.cpp index 85358d26..0886f3e0 100644 --- a/src/client/spritemanager.cpp +++ b/src/client/spritemanager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/spritemanager.h b/src/client/spritemanager.h index 4462ff6c..f9c5cfa4 100644 --- a/src/client/spritemanager.h +++ b/src/client/spritemanager.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/statictext.cpp b/src/client/statictext.cpp index 289415ce..be2de0fe 100644 --- a/src/client/statictext.cpp +++ b/src/client/statictext.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/statictext.h b/src/client/statictext.h index aa7d4e65..c1d3ba47 100644 --- a/src/client/statictext.h +++ b/src/client/statictext.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/thing.cpp b/src/client/thing.cpp index 6858df6d..450b6be2 100644 --- a/src/client/thing.cpp +++ b/src/client/thing.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/thing.h b/src/client/thing.h index 9da464eb..122e987c 100644 --- a/src/client/thing.h +++ b/src/client/thing.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/thingtype.cpp b/src/client/thingtype.cpp index 1c9d20e1..fad20257 100644 --- a/src/client/thingtype.cpp +++ b/src/client/thingtype.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/thingtype.h b/src/client/thingtype.h index bcc64d45..fba57e9b 100644 --- a/src/client/thingtype.h +++ b/src/client/thingtype.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/thingtypemanager.cpp b/src/client/thingtypemanager.cpp index a1dc5805..d128571c 100644 --- a/src/client/thingtypemanager.cpp +++ b/src/client/thingtypemanager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/thingtypemanager.h b/src/client/thingtypemanager.h index a9b42894..c852e9fd 100644 --- a/src/client/thingtypemanager.h +++ b/src/client/thingtypemanager.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/tile.cpp b/src/client/tile.cpp index c5e41c96..6143f7b0 100644 --- a/src/client/tile.cpp +++ b/src/client/tile.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/tile.h b/src/client/tile.h index c0432f69..6095e700 100644 --- a/src/client/tile.h +++ b/src/client/tile.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/towns.cpp b/src/client/towns.cpp index 1e8266e9..7c979849 100644 --- a/src/client/towns.cpp +++ b/src/client/towns.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/towns.h b/src/client/towns.h index 23fedb98..caedc94c 100644 --- a/src/client/towns.h +++ b/src/client/towns.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/uicreature.cpp b/src/client/uicreature.cpp index 46fe1c11..90a8d157 100644 --- a/src/client/uicreature.cpp +++ b/src/client/uicreature.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/uicreature.h b/src/client/uicreature.h index 109f597f..0958fa5c 100644 --- a/src/client/uicreature.h +++ b/src/client/uicreature.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/uiitem.cpp b/src/client/uiitem.cpp index d005aa78..8afdf6e3 100644 --- a/src/client/uiitem.cpp +++ b/src/client/uiitem.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/uiitem.h b/src/client/uiitem.h index aa6f69cc..4cb50278 100644 --- a/src/client/uiitem.h +++ b/src/client/uiitem.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/uimap.cpp b/src/client/uimap.cpp index 67150489..915fa90d 100644 --- a/src/client/uimap.cpp +++ b/src/client/uimap.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/uimap.h b/src/client/uimap.h index 759f6bbe..3dc5dae3 100644 --- a/src/client/uimap.h +++ b/src/client/uimap.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/uimapanchorlayout.cpp b/src/client/uimapanchorlayout.cpp index f7f85407..27778b39 100644 --- a/src/client/uimapanchorlayout.cpp +++ b/src/client/uimapanchorlayout.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/uimapanchorlayout.h b/src/client/uimapanchorlayout.h index a316bb85..0db7871c 100644 --- a/src/client/uimapanchorlayout.h +++ b/src/client/uimapanchorlayout.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/uiminimap.cpp b/src/client/uiminimap.cpp index b3f8a79c..6e854914 100644 --- a/src/client/uiminimap.cpp +++ b/src/client/uiminimap.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/uiminimap.h b/src/client/uiminimap.h index fc69261a..5b92b6dd 100644 --- a/src/client/uiminimap.h +++ b/src/client/uiminimap.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/uiprogressrect.cpp b/src/client/uiprogressrect.cpp index 80305589..ebd18bff 100644 --- a/src/client/uiprogressrect.cpp +++ b/src/client/uiprogressrect.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/uiprogressrect.h b/src/client/uiprogressrect.h index 018a33b8..5344d5b8 100644 --- a/src/client/uiprogressrect.h +++ b/src/client/uiprogressrect.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/uisprite.cpp b/src/client/uisprite.cpp index c6d616bd..edac186d 100644 --- a/src/client/uisprite.cpp +++ b/src/client/uisprite.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/client/uisprite.h b/src/client/uisprite.h index 8fe0a0e7..2784ba0f 100644 --- a/src/client/uisprite.h +++ b/src/client/uisprite.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/const.h b/src/framework/const.h index e9f85c6b..d3b51a5a 100644 --- a/src/framework/const.h +++ b/src/framework/const.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/adaptativeframecounter.cpp b/src/framework/core/adaptativeframecounter.cpp index 4453e63b..c7902218 100644 --- a/src/framework/core/adaptativeframecounter.cpp +++ b/src/framework/core/adaptativeframecounter.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/adaptativeframecounter.h b/src/framework/core/adaptativeframecounter.h index 37d554f6..fb1c4ec3 100644 --- a/src/framework/core/adaptativeframecounter.h +++ b/src/framework/core/adaptativeframecounter.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/application.cpp b/src/framework/core/application.cpp index ae07adbb..be6c7d7f 100644 --- a/src/framework/core/application.cpp +++ b/src/framework/core/application.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/application.h b/src/framework/core/application.h index 7bb5473b..c3a9507d 100644 --- a/src/framework/core/application.h +++ b/src/framework/core/application.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/asyncdispatcher.cpp b/src/framework/core/asyncdispatcher.cpp index ee3b7e65..d8f277e2 100644 --- a/src/framework/core/asyncdispatcher.cpp +++ b/src/framework/core/asyncdispatcher.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/asyncdispatcher.h b/src/framework/core/asyncdispatcher.h index e5233811..c871e1df 100644 --- a/src/framework/core/asyncdispatcher.h +++ b/src/framework/core/asyncdispatcher.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/binarytree.cpp b/src/framework/core/binarytree.cpp index 14f7a3f0..92561ae8 100644 --- a/src/framework/core/binarytree.cpp +++ b/src/framework/core/binarytree.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/binarytree.h b/src/framework/core/binarytree.h index 177e837f..95d3d728 100644 --- a/src/framework/core/binarytree.h +++ b/src/framework/core/binarytree.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/clock.cpp b/src/framework/core/clock.cpp index 4d9666d6..bcafb1d5 100644 --- a/src/framework/core/clock.cpp +++ b/src/framework/core/clock.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/clock.h b/src/framework/core/clock.h index 7fb2c9f0..2cf517a7 100644 --- a/src/framework/core/clock.h +++ b/src/framework/core/clock.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/config.cpp b/src/framework/core/config.cpp index 327079d8..82d25613 100644 --- a/src/framework/core/config.cpp +++ b/src/framework/core/config.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/config.h b/src/framework/core/config.h index 57c0d784..1215bd20 100644 --- a/src/framework/core/config.h +++ b/src/framework/core/config.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/configmanager.cpp b/src/framework/core/configmanager.cpp index f0a1e8d5..8f416033 100644 --- a/src/framework/core/configmanager.cpp +++ b/src/framework/core/configmanager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/configmanager.h b/src/framework/core/configmanager.h index 772983e8..16dd95bf 100644 --- a/src/framework/core/configmanager.h +++ b/src/framework/core/configmanager.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/declarations.h b/src/framework/core/declarations.h index e145f464..8ce961fa 100644 --- a/src/framework/core/declarations.h +++ b/src/framework/core/declarations.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/event.cpp b/src/framework/core/event.cpp index 0ce5cf26..5cb6beaf 100644 --- a/src/framework/core/event.cpp +++ b/src/framework/core/event.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/event.h b/src/framework/core/event.h index e3f68d35..d3a2dbc1 100644 --- a/src/framework/core/event.h +++ b/src/framework/core/event.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/eventdispatcher.cpp b/src/framework/core/eventdispatcher.cpp index 70c500cd..03fd22aa 100644 --- a/src/framework/core/eventdispatcher.cpp +++ b/src/framework/core/eventdispatcher.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/eventdispatcher.h b/src/framework/core/eventdispatcher.h index 6444d73d..a18e2475 100644 --- a/src/framework/core/eventdispatcher.h +++ b/src/framework/core/eventdispatcher.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/filestream.cpp b/src/framework/core/filestream.cpp index fc721e92..8ff1f450 100644 --- a/src/framework/core/filestream.cpp +++ b/src/framework/core/filestream.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/filestream.h b/src/framework/core/filestream.h index 1b6c04d5..43abcb9d 100644 --- a/src/framework/core/filestream.h +++ b/src/framework/core/filestream.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/graphicalapplication.cpp b/src/framework/core/graphicalapplication.cpp index f77469cc..1a2d0433 100644 --- a/src/framework/core/graphicalapplication.cpp +++ b/src/framework/core/graphicalapplication.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/graphicalapplication.h b/src/framework/core/graphicalapplication.h index 1e8ca88c..a4e999e7 100644 --- a/src/framework/core/graphicalapplication.h +++ b/src/framework/core/graphicalapplication.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/inputevent.h b/src/framework/core/inputevent.h index 1fc6a47d..fc94e116 100644 --- a/src/framework/core/inputevent.h +++ b/src/framework/core/inputevent.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/logger.cpp b/src/framework/core/logger.cpp index 22936d62..119002cb 100644 --- a/src/framework/core/logger.cpp +++ b/src/framework/core/logger.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/logger.h b/src/framework/core/logger.h index 5537938a..50c76330 100644 --- a/src/framework/core/logger.h +++ b/src/framework/core/logger.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/module.cpp b/src/framework/core/module.cpp index 9de4cc9f..0b0fdb99 100644 --- a/src/framework/core/module.cpp +++ b/src/framework/core/module.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/module.h b/src/framework/core/module.h index 2b273d05..4c8987ca 100644 --- a/src/framework/core/module.h +++ b/src/framework/core/module.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/modulemanager.cpp b/src/framework/core/modulemanager.cpp index ee2e48ea..a9279314 100644 --- a/src/framework/core/modulemanager.cpp +++ b/src/framework/core/modulemanager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/modulemanager.h b/src/framework/core/modulemanager.h index 0f52890f..cf49eb9d 100644 --- a/src/framework/core/modulemanager.h +++ b/src/framework/core/modulemanager.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/resourcemanager.cpp b/src/framework/core/resourcemanager.cpp index 9dbe18ac..20815d03 100644 --- a/src/framework/core/resourcemanager.cpp +++ b/src/framework/core/resourcemanager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/resourcemanager.h b/src/framework/core/resourcemanager.h index 5a6398d4..4f70ff55 100644 --- a/src/framework/core/resourcemanager.h +++ b/src/framework/core/resourcemanager.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/scheduledevent.cpp b/src/framework/core/scheduledevent.cpp index 7142af66..e2833fe4 100644 --- a/src/framework/core/scheduledevent.cpp +++ b/src/framework/core/scheduledevent.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/scheduledevent.h b/src/framework/core/scheduledevent.h index 516e61fa..6792df23 100644 --- a/src/framework/core/scheduledevent.h +++ b/src/framework/core/scheduledevent.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/timer.cpp b/src/framework/core/timer.cpp index c166d806..28792ac1 100644 --- a/src/framework/core/timer.cpp +++ b/src/framework/core/timer.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/core/timer.h b/src/framework/core/timer.h index 509de6d6..3ac92a9e 100644 --- a/src/framework/core/timer.h +++ b/src/framework/core/timer.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/global.h b/src/framework/global.h index 188e892d..46efb84f 100644 --- a/src/framework/global.h +++ b/src/framework/global.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/animatedtexture.cpp b/src/framework/graphics/animatedtexture.cpp index 299eef49..0f4ca68e 100644 --- a/src/framework/graphics/animatedtexture.cpp +++ b/src/framework/graphics/animatedtexture.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/animatedtexture.h b/src/framework/graphics/animatedtexture.h index 55b7b999..b0fa43e0 100644 --- a/src/framework/graphics/animatedtexture.h +++ b/src/framework/graphics/animatedtexture.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/apngloader.h b/src/framework/graphics/apngloader.h index 43425ec0..71727e31 100644 --- a/src/framework/graphics/apngloader.h +++ b/src/framework/graphics/apngloader.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/bitmapfont.cpp b/src/framework/graphics/bitmapfont.cpp index c343a76e..1e3fc131 100644 --- a/src/framework/graphics/bitmapfont.cpp +++ b/src/framework/graphics/bitmapfont.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/bitmapfont.h b/src/framework/graphics/bitmapfont.h index b9ae8c6c..18ef9565 100644 --- a/src/framework/graphics/bitmapfont.h +++ b/src/framework/graphics/bitmapfont.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/cachedtext.cpp b/src/framework/graphics/cachedtext.cpp index d686d631..b60d2f2e 100644 --- a/src/framework/graphics/cachedtext.cpp +++ b/src/framework/graphics/cachedtext.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/cachedtext.h b/src/framework/graphics/cachedtext.h index edb737cc..880a2d5d 100644 --- a/src/framework/graphics/cachedtext.h +++ b/src/framework/graphics/cachedtext.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/coordsbuffer.cpp b/src/framework/graphics/coordsbuffer.cpp index dba88805..69bc23d6 100644 --- a/src/framework/graphics/coordsbuffer.cpp +++ b/src/framework/graphics/coordsbuffer.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/coordsbuffer.h b/src/framework/graphics/coordsbuffer.h index 948c7f5e..6c699326 100644 --- a/src/framework/graphics/coordsbuffer.h +++ b/src/framework/graphics/coordsbuffer.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/declarations.h b/src/framework/graphics/declarations.h index 56c3e1bd..1ae5b890 100644 --- a/src/framework/graphics/declarations.h +++ b/src/framework/graphics/declarations.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/fontmanager.cpp b/src/framework/graphics/fontmanager.cpp index b5e56503..56e321c9 100644 --- a/src/framework/graphics/fontmanager.cpp +++ b/src/framework/graphics/fontmanager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/fontmanager.h b/src/framework/graphics/fontmanager.h index ce400f5d..e04074b3 100644 --- a/src/framework/graphics/fontmanager.h +++ b/src/framework/graphics/fontmanager.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/framebuffer.cpp b/src/framework/graphics/framebuffer.cpp index 4561e2d5..c28e140b 100644 --- a/src/framework/graphics/framebuffer.cpp +++ b/src/framework/graphics/framebuffer.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/framebuffer.h b/src/framework/graphics/framebuffer.h index d6255f81..41218f91 100644 --- a/src/framework/graphics/framebuffer.h +++ b/src/framework/graphics/framebuffer.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/framebuffermanager.cpp b/src/framework/graphics/framebuffermanager.cpp index 5fec791c..167ad719 100644 --- a/src/framework/graphics/framebuffermanager.cpp +++ b/src/framework/graphics/framebuffermanager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/framebuffermanager.h b/src/framework/graphics/framebuffermanager.h index 545e5f05..06eb1605 100644 --- a/src/framework/graphics/framebuffermanager.h +++ b/src/framework/graphics/framebuffermanager.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/glutil.h b/src/framework/graphics/glutil.h index 53bf84e4..97f2496b 100644 --- a/src/framework/graphics/glutil.h +++ b/src/framework/graphics/glutil.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/graphics.cpp b/src/framework/graphics/graphics.cpp index 993858fa..362557a4 100644 --- a/src/framework/graphics/graphics.cpp +++ b/src/framework/graphics/graphics.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/graphics.h b/src/framework/graphics/graphics.h index ed69b901..24c73475 100644 --- a/src/framework/graphics/graphics.h +++ b/src/framework/graphics/graphics.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/hardwarebuffer.cpp b/src/framework/graphics/hardwarebuffer.cpp index 37e72303..dbfd57e3 100644 --- a/src/framework/graphics/hardwarebuffer.cpp +++ b/src/framework/graphics/hardwarebuffer.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/hardwarebuffer.h b/src/framework/graphics/hardwarebuffer.h index 63034cf6..da22187c 100644 --- a/src/framework/graphics/hardwarebuffer.h +++ b/src/framework/graphics/hardwarebuffer.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/image.cpp b/src/framework/graphics/image.cpp index 8f3bfe00..b2b224fc 100644 --- a/src/framework/graphics/image.cpp +++ b/src/framework/graphics/image.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/image.h b/src/framework/graphics/image.h index e1749fab..8d8e8f1d 100644 --- a/src/framework/graphics/image.h +++ b/src/framework/graphics/image.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/ogl/painterogl.cpp b/src/framework/graphics/ogl/painterogl.cpp index d67f8d22..81e004dc 100644 --- a/src/framework/graphics/ogl/painterogl.cpp +++ b/src/framework/graphics/ogl/painterogl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/ogl/painterogl.h b/src/framework/graphics/ogl/painterogl.h index 5bc32bbd..3348c844 100644 --- a/src/framework/graphics/ogl/painterogl.h +++ b/src/framework/graphics/ogl/painterogl.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/ogl/painterogl1.cpp b/src/framework/graphics/ogl/painterogl1.cpp index 4e908b94..7223e4c9 100644 --- a/src/framework/graphics/ogl/painterogl1.cpp +++ b/src/framework/graphics/ogl/painterogl1.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/ogl/painterogl1.h b/src/framework/graphics/ogl/painterogl1.h index 43b5baff..8799fb51 100644 --- a/src/framework/graphics/ogl/painterogl1.h +++ b/src/framework/graphics/ogl/painterogl1.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/ogl/painterogl2.cpp b/src/framework/graphics/ogl/painterogl2.cpp index 77b11647..fa4caa51 100644 --- a/src/framework/graphics/ogl/painterogl2.cpp +++ b/src/framework/graphics/ogl/painterogl2.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/ogl/painterogl2.h b/src/framework/graphics/ogl/painterogl2.h index ffab9575..2b02474e 100644 --- a/src/framework/graphics/ogl/painterogl2.h +++ b/src/framework/graphics/ogl/painterogl2.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/ogl/painterogl2_shadersources.h b/src/framework/graphics/ogl/painterogl2_shadersources.h index c1db3c36..828a33bd 100644 --- a/src/framework/graphics/ogl/painterogl2_shadersources.h +++ b/src/framework/graphics/ogl/painterogl2_shadersources.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/painter.cpp b/src/framework/graphics/painter.cpp index 076308f2..1337caa9 100644 --- a/src/framework/graphics/painter.cpp +++ b/src/framework/graphics/painter.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/painter.h b/src/framework/graphics/painter.h index f4335a51..1c710cdf 100644 --- a/src/framework/graphics/painter.h +++ b/src/framework/graphics/painter.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/paintershaderprogram.cpp b/src/framework/graphics/paintershaderprogram.cpp index 70ba6e11..2894ecf5 100644 --- a/src/framework/graphics/paintershaderprogram.cpp +++ b/src/framework/graphics/paintershaderprogram.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/paintershaderprogram.h b/src/framework/graphics/paintershaderprogram.h index bfdc63de..d575b3a7 100644 --- a/src/framework/graphics/paintershaderprogram.h +++ b/src/framework/graphics/paintershaderprogram.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/particle.cpp b/src/framework/graphics/particle.cpp index 2c9642fa..bfd0388c 100644 --- a/src/framework/graphics/particle.cpp +++ b/src/framework/graphics/particle.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/particle.h b/src/framework/graphics/particle.h index c73cced9..9bb2f55f 100644 --- a/src/framework/graphics/particle.h +++ b/src/framework/graphics/particle.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/particleaffector.cpp b/src/framework/graphics/particleaffector.cpp index c3b8ca60..70bb6688 100644 --- a/src/framework/graphics/particleaffector.cpp +++ b/src/framework/graphics/particleaffector.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/particleaffector.h b/src/framework/graphics/particleaffector.h index 09d7cbc7..10cbcb99 100644 --- a/src/framework/graphics/particleaffector.h +++ b/src/framework/graphics/particleaffector.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/particleeffect.cpp b/src/framework/graphics/particleeffect.cpp index ce622b09..976de2ba 100644 --- a/src/framework/graphics/particleeffect.cpp +++ b/src/framework/graphics/particleeffect.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/particleeffect.h b/src/framework/graphics/particleeffect.h index 7c681824..05413d47 100644 --- a/src/framework/graphics/particleeffect.h +++ b/src/framework/graphics/particleeffect.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/particleemitter.cpp b/src/framework/graphics/particleemitter.cpp index c6fcf0a0..34fefdcf 100644 --- a/src/framework/graphics/particleemitter.cpp +++ b/src/framework/graphics/particleemitter.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/particleemitter.h b/src/framework/graphics/particleemitter.h index 44c6b19c..45459030 100644 --- a/src/framework/graphics/particleemitter.h +++ b/src/framework/graphics/particleemitter.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/particlemanager.cpp b/src/framework/graphics/particlemanager.cpp index ad0e086f..b9fbeb61 100644 --- a/src/framework/graphics/particlemanager.cpp +++ b/src/framework/graphics/particlemanager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/particlemanager.h b/src/framework/graphics/particlemanager.h index 5e456ee7..e06c84c2 100644 --- a/src/framework/graphics/particlemanager.h +++ b/src/framework/graphics/particlemanager.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/particlesystem.cpp b/src/framework/graphics/particlesystem.cpp index 4e8c1ffd..a7fdc481 100644 --- a/src/framework/graphics/particlesystem.cpp +++ b/src/framework/graphics/particlesystem.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/particlesystem.h b/src/framework/graphics/particlesystem.h index bb27e2b2..a39e574b 100644 --- a/src/framework/graphics/particlesystem.h +++ b/src/framework/graphics/particlesystem.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/particletype.cpp b/src/framework/graphics/particletype.cpp index f8192c9f..866f6658 100644 --- a/src/framework/graphics/particletype.cpp +++ b/src/framework/graphics/particletype.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/particletype.h b/src/framework/graphics/particletype.h index e044a05c..e1f27043 100644 --- a/src/framework/graphics/particletype.h +++ b/src/framework/graphics/particletype.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/shader.cpp b/src/framework/graphics/shader.cpp index 9ca7ba9d..89a4bcb5 100644 --- a/src/framework/graphics/shader.cpp +++ b/src/framework/graphics/shader.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/shader.h b/src/framework/graphics/shader.h index 1605df62..fd17e542 100644 --- a/src/framework/graphics/shader.h +++ b/src/framework/graphics/shader.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/shaderprogram.cpp b/src/framework/graphics/shaderprogram.cpp index 3e0569c3..9a3c051c 100644 --- a/src/framework/graphics/shaderprogram.cpp +++ b/src/framework/graphics/shaderprogram.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/shaderprogram.h b/src/framework/graphics/shaderprogram.h index e63e566f..2cb06569 100644 --- a/src/framework/graphics/shaderprogram.h +++ b/src/framework/graphics/shaderprogram.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/texture.cpp b/src/framework/graphics/texture.cpp index 38d51e3d..c33a9585 100644 --- a/src/framework/graphics/texture.cpp +++ b/src/framework/graphics/texture.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/texture.h b/src/framework/graphics/texture.h index 32c19144..5a0ec3d6 100644 --- a/src/framework/graphics/texture.h +++ b/src/framework/graphics/texture.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/texturemanager.cpp b/src/framework/graphics/texturemanager.cpp index 39200e4a..9133a366 100644 --- a/src/framework/graphics/texturemanager.cpp +++ b/src/framework/graphics/texturemanager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/texturemanager.h b/src/framework/graphics/texturemanager.h index 19470ba1..76f5ac64 100644 --- a/src/framework/graphics/texturemanager.h +++ b/src/framework/graphics/texturemanager.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/graphics/vertexarray.h b/src/framework/graphics/vertexarray.h index 2bab877e..44114c3c 100644 --- a/src/framework/graphics/vertexarray.h +++ b/src/framework/graphics/vertexarray.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/input/mouse.cpp b/src/framework/input/mouse.cpp index ed2e384e..e3e9aa0e 100644 --- a/src/framework/input/mouse.cpp +++ b/src/framework/input/mouse.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/input/mouse.h b/src/framework/input/mouse.h index 6f73171f..4c26cf73 100644 --- a/src/framework/input/mouse.h +++ b/src/framework/input/mouse.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/luaengine/declarations.h b/src/framework/luaengine/declarations.h index 8312b5f5..ffae784a 100644 --- a/src/framework/luaengine/declarations.h +++ b/src/framework/luaengine/declarations.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/luaengine/lbitlib.h b/src/framework/luaengine/lbitlib.h index fc174cf5..5acce4ba 100644 --- a/src/framework/luaengine/lbitlib.h +++ b/src/framework/luaengine/lbitlib.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/luaengine/luabinder.h b/src/framework/luaengine/luabinder.h index 04906ca2..fa99d0fc 100644 --- a/src/framework/luaengine/luabinder.h +++ b/src/framework/luaengine/luabinder.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/luaengine/luaexception.cpp b/src/framework/luaengine/luaexception.cpp index bd4b3b34..e5f43326 100644 --- a/src/framework/luaengine/luaexception.cpp +++ b/src/framework/luaengine/luaexception.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/luaengine/luaexception.h b/src/framework/luaengine/luaexception.h index 23e2ac60..df47ca80 100644 --- a/src/framework/luaengine/luaexception.h +++ b/src/framework/luaengine/luaexception.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/luaengine/luainterface.cpp b/src/framework/luaengine/luainterface.cpp index 7617a5cf..33c03826 100644 --- a/src/framework/luaengine/luainterface.cpp +++ b/src/framework/luaengine/luainterface.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/luaengine/luainterface.h b/src/framework/luaengine/luainterface.h index 259b2802..198604c8 100644 --- a/src/framework/luaengine/luainterface.h +++ b/src/framework/luaengine/luainterface.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/luaengine/luaobject.cpp b/src/framework/luaengine/luaobject.cpp index 97a0894e..4ef46501 100644 --- a/src/framework/luaengine/luaobject.cpp +++ b/src/framework/luaengine/luaobject.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/luaengine/luaobject.h b/src/framework/luaengine/luaobject.h index 3378e59c..c6ccc25b 100644 --- a/src/framework/luaengine/luaobject.h +++ b/src/framework/luaengine/luaobject.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/luaengine/luavaluecasts.cpp b/src/framework/luaengine/luavaluecasts.cpp index 28490994..46c5ed8b 100644 --- a/src/framework/luaengine/luavaluecasts.cpp +++ b/src/framework/luaengine/luavaluecasts.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/luaengine/luavaluecasts.h b/src/framework/luaengine/luavaluecasts.h index 983b5dae..54a31982 100644 --- a/src/framework/luaengine/luavaluecasts.h +++ b/src/framework/luaengine/luavaluecasts.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/luafunctions.cpp b/src/framework/luafunctions.cpp index d9defa02..707b8d8f 100644 --- a/src/framework/luafunctions.cpp +++ b/src/framework/luafunctions.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/net/connection.cpp b/src/framework/net/connection.cpp index 6dba9998..a7e7ac04 100644 --- a/src/framework/net/connection.cpp +++ b/src/framework/net/connection.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/net/connection.h b/src/framework/net/connection.h index ffdead0e..ae73c82b 100644 --- a/src/framework/net/connection.h +++ b/src/framework/net/connection.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/net/declarations.h b/src/framework/net/declarations.h index cc6a6100..22af5d33 100644 --- a/src/framework/net/declarations.h +++ b/src/framework/net/declarations.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/net/inputmessage.cpp b/src/framework/net/inputmessage.cpp index 9389eb87..b678cd28 100644 --- a/src/framework/net/inputmessage.cpp +++ b/src/framework/net/inputmessage.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/net/inputmessage.h b/src/framework/net/inputmessage.h index 3c681de2..8e97cb00 100644 --- a/src/framework/net/inputmessage.h +++ b/src/framework/net/inputmessage.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/net/outputmessage.cpp b/src/framework/net/outputmessage.cpp index dfcef8b9..a220dcc1 100644 --- a/src/framework/net/outputmessage.cpp +++ b/src/framework/net/outputmessage.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/net/outputmessage.h b/src/framework/net/outputmessage.h index 22979b3b..d905a8e8 100644 --- a/src/framework/net/outputmessage.h +++ b/src/framework/net/outputmessage.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/net/protocol.cpp b/src/framework/net/protocol.cpp index 514ccdbe..351441ad 100644 --- a/src/framework/net/protocol.cpp +++ b/src/framework/net/protocol.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/net/protocol.h b/src/framework/net/protocol.h index e770cb70..e844af71 100644 --- a/src/framework/net/protocol.h +++ b/src/framework/net/protocol.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/net/protocolhttp.cpp b/src/framework/net/protocolhttp.cpp index 9677de08..bc337634 100644 --- a/src/framework/net/protocolhttp.cpp +++ b/src/framework/net/protocolhttp.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/net/protocolhttp.h b/src/framework/net/protocolhttp.h index 7c15ed54..51a00b20 100644 --- a/src/framework/net/protocolhttp.h +++ b/src/framework/net/protocolhttp.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/net/server.cpp b/src/framework/net/server.cpp index 8e4f2637..d2b91d9e 100644 --- a/src/framework/net/server.cpp +++ b/src/framework/net/server.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/net/server.h b/src/framework/net/server.h index c8fe9d0e..f673f6da 100644 --- a/src/framework/net/server.h +++ b/src/framework/net/server.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/otml/declarations.h b/src/framework/otml/declarations.h index 79076d7f..51ca29f0 100644 --- a/src/framework/otml/declarations.h +++ b/src/framework/otml/declarations.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/otml/otml.h b/src/framework/otml/otml.h index 5efe59ca..bcfa32cd 100644 --- a/src/framework/otml/otml.h +++ b/src/framework/otml/otml.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/otml/otmldocument.cpp b/src/framework/otml/otmldocument.cpp index 3e42be08..674c5f39 100644 --- a/src/framework/otml/otmldocument.cpp +++ b/src/framework/otml/otmldocument.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/otml/otmldocument.h b/src/framework/otml/otmldocument.h index 06e32a29..a32c29ab 100644 --- a/src/framework/otml/otmldocument.h +++ b/src/framework/otml/otmldocument.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/otml/otmlemitter.cpp b/src/framework/otml/otmlemitter.cpp index 8c70fa43..2ea02c71 100644 --- a/src/framework/otml/otmlemitter.cpp +++ b/src/framework/otml/otmlemitter.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/otml/otmlemitter.h b/src/framework/otml/otmlemitter.h index c83cd631..52a0780d 100644 --- a/src/framework/otml/otmlemitter.h +++ b/src/framework/otml/otmlemitter.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/otml/otmlexception.cpp b/src/framework/otml/otmlexception.cpp index d9caa963..22137aeb 100644 --- a/src/framework/otml/otmlexception.cpp +++ b/src/framework/otml/otmlexception.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/otml/otmlexception.h b/src/framework/otml/otmlexception.h index 65f1420b..153d0726 100644 --- a/src/framework/otml/otmlexception.h +++ b/src/framework/otml/otmlexception.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/otml/otmlnode.cpp b/src/framework/otml/otmlnode.cpp index 5b37eaf9..03e48151 100644 --- a/src/framework/otml/otmlnode.cpp +++ b/src/framework/otml/otmlnode.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/otml/otmlnode.h b/src/framework/otml/otmlnode.h index 47b8cdf2..3af1ad8e 100644 --- a/src/framework/otml/otmlnode.h +++ b/src/framework/otml/otmlnode.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/otml/otmlparser.cpp b/src/framework/otml/otmlparser.cpp index dc502cb9..9c48b6fe 100644 --- a/src/framework/otml/otmlparser.cpp +++ b/src/framework/otml/otmlparser.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/otml/otmlparser.h b/src/framework/otml/otmlparser.h index 68e73d12..22c590c5 100644 --- a/src/framework/otml/otmlparser.h +++ b/src/framework/otml/otmlparser.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/pch.h b/src/framework/pch.h index 088014cf..511221c6 100644 --- a/src/framework/pch.h +++ b/src/framework/pch.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/platform/crashhandler.h b/src/framework/platform/crashhandler.h index f1f6ef64..6b08cec4 100644 --- a/src/framework/platform/crashhandler.h +++ b/src/framework/platform/crashhandler.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/platform/platform.cpp b/src/framework/platform/platform.cpp index c436880e..cb5438a6 100644 --- a/src/framework/platform/platform.cpp +++ b/src/framework/platform/platform.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/platform/platform.h b/src/framework/platform/platform.h index 78da83a2..362ff529 100644 --- a/src/framework/platform/platform.h +++ b/src/framework/platform/platform.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/platform/platformwindow.cpp b/src/framework/platform/platformwindow.cpp index b63e0774..dc593de8 100644 --- a/src/framework/platform/platformwindow.cpp +++ b/src/framework/platform/platformwindow.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/platform/platformwindow.h b/src/framework/platform/platformwindow.h index 081b1177..aee54c51 100644 --- a/src/framework/platform/platformwindow.h +++ b/src/framework/platform/platformwindow.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/platform/unixcrashhandler.cpp b/src/framework/platform/unixcrashhandler.cpp index baa5031c..27c8a895 100644 --- a/src/framework/platform/unixcrashhandler.cpp +++ b/src/framework/platform/unixcrashhandler.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/platform/unixplatform.cpp b/src/framework/platform/unixplatform.cpp index fcb8bd0b..0d2329db 100644 --- a/src/framework/platform/unixplatform.cpp +++ b/src/framework/platform/unixplatform.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/platform/win32crashhandler.cpp b/src/framework/platform/win32crashhandler.cpp index 28a17c73..d5e0f753 100644 --- a/src/framework/platform/win32crashhandler.cpp +++ b/src/framework/platform/win32crashhandler.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/platform/win32platform.cpp b/src/framework/platform/win32platform.cpp index 88ca5a8f..8c3f429c 100644 --- a/src/framework/platform/win32platform.cpp +++ b/src/framework/platform/win32platform.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/platform/win32window.cpp b/src/framework/platform/win32window.cpp index 5b73c589..156b081d 100644 --- a/src/framework/platform/win32window.cpp +++ b/src/framework/platform/win32window.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/platform/win32window.h b/src/framework/platform/win32window.h index d8cbce62..005bb473 100644 --- a/src/framework/platform/win32window.h +++ b/src/framework/platform/win32window.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/platform/x11window.cpp b/src/framework/platform/x11window.cpp index 743781e4..ff7dfeed 100644 --- a/src/framework/platform/x11window.cpp +++ b/src/framework/platform/x11window.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/platform/x11window.h b/src/framework/platform/x11window.h index 8b2d2306..46d49034 100644 --- a/src/framework/platform/x11window.h +++ b/src/framework/platform/x11window.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/sound/combinedsoundsource.cpp b/src/framework/sound/combinedsoundsource.cpp index 5a72cf3a..68c5f56e 100644 --- a/src/framework/sound/combinedsoundsource.cpp +++ b/src/framework/sound/combinedsoundsource.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/sound/combinedsoundsource.h b/src/framework/sound/combinedsoundsource.h index e6ab9fad..a437c10a 100644 --- a/src/framework/sound/combinedsoundsource.h +++ b/src/framework/sound/combinedsoundsource.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/sound/declarations.h b/src/framework/sound/declarations.h index 14919d1a..5b1edfd2 100644 --- a/src/framework/sound/declarations.h +++ b/src/framework/sound/declarations.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/sound/oggsoundfile.cpp b/src/framework/sound/oggsoundfile.cpp index 3e8c5216..b3f79044 100644 --- a/src/framework/sound/oggsoundfile.cpp +++ b/src/framework/sound/oggsoundfile.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/sound/oggsoundfile.h b/src/framework/sound/oggsoundfile.h index 7d76282c..687429f3 100644 --- a/src/framework/sound/oggsoundfile.h +++ b/src/framework/sound/oggsoundfile.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/sound/soundbuffer.cpp b/src/framework/sound/soundbuffer.cpp index 203c97ae..6980899f 100644 --- a/src/framework/sound/soundbuffer.cpp +++ b/src/framework/sound/soundbuffer.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/sound/soundbuffer.h b/src/framework/sound/soundbuffer.h index 79c34bae..26f99947 100644 --- a/src/framework/sound/soundbuffer.h +++ b/src/framework/sound/soundbuffer.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/sound/soundchannel.cpp b/src/framework/sound/soundchannel.cpp index d7e07286..9275185b 100644 --- a/src/framework/sound/soundchannel.cpp +++ b/src/framework/sound/soundchannel.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/sound/soundchannel.h b/src/framework/sound/soundchannel.h index cdb044c0..8f805f26 100644 --- a/src/framework/sound/soundchannel.h +++ b/src/framework/sound/soundchannel.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/sound/soundfile.cpp b/src/framework/sound/soundfile.cpp index 14e3b4dc..99c0a7be 100644 --- a/src/framework/sound/soundfile.cpp +++ b/src/framework/sound/soundfile.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/sound/soundfile.h b/src/framework/sound/soundfile.h index d1ba9f88..e6cd1d5a 100644 --- a/src/framework/sound/soundfile.h +++ b/src/framework/sound/soundfile.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/sound/soundmanager.cpp b/src/framework/sound/soundmanager.cpp index 9517ce8e..f5ae9efe 100644 --- a/src/framework/sound/soundmanager.cpp +++ b/src/framework/sound/soundmanager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/sound/soundmanager.h b/src/framework/sound/soundmanager.h index 4586e977..7a2baa14 100644 --- a/src/framework/sound/soundmanager.h +++ b/src/framework/sound/soundmanager.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/sound/soundsource.cpp b/src/framework/sound/soundsource.cpp index 285e208b..e917340c 100644 --- a/src/framework/sound/soundsource.cpp +++ b/src/framework/sound/soundsource.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/sound/soundsource.h b/src/framework/sound/soundsource.h index 28204e1e..4faf613c 100644 --- a/src/framework/sound/soundsource.h +++ b/src/framework/sound/soundsource.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/sound/streamsoundsource.cpp b/src/framework/sound/streamsoundsource.cpp index 39ce74d1..3e1b7a24 100644 --- a/src/framework/sound/streamsoundsource.cpp +++ b/src/framework/sound/streamsoundsource.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/sound/streamsoundsource.h b/src/framework/sound/streamsoundsource.h index 1a88bfac..91fa67cc 100644 --- a/src/framework/sound/streamsoundsource.h +++ b/src/framework/sound/streamsoundsource.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/stdext/any.h b/src/framework/stdext/any.h index bd118587..3f7e1e94 100644 --- a/src/framework/stdext/any.h +++ b/src/framework/stdext/any.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/stdext/boolean.h b/src/framework/stdext/boolean.h index b9181268..b1f84a37 100644 --- a/src/framework/stdext/boolean.h +++ b/src/framework/stdext/boolean.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/stdext/cast.h b/src/framework/stdext/cast.h index 7e8fa133..84fe1794 100644 --- a/src/framework/stdext/cast.h +++ b/src/framework/stdext/cast.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/stdext/compiler.h b/src/framework/stdext/compiler.h index 842cb3ac..c947dc00 100644 --- a/src/framework/stdext/compiler.h +++ b/src/framework/stdext/compiler.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/stdext/demangle.cpp b/src/framework/stdext/demangle.cpp index dc57eb8e..223f366c 100644 --- a/src/framework/stdext/demangle.cpp +++ b/src/framework/stdext/demangle.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/stdext/demangle.h b/src/framework/stdext/demangle.h index 330c7441..5f447a79 100644 --- a/src/framework/stdext/demangle.h +++ b/src/framework/stdext/demangle.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/stdext/dumper.h b/src/framework/stdext/dumper.h index ab2ef4db..1f6edb97 100644 --- a/src/framework/stdext/dumper.h +++ b/src/framework/stdext/dumper.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/stdext/dynamic_storage.h b/src/framework/stdext/dynamic_storage.h index a0d3529b..722a36b7 100644 --- a/src/framework/stdext/dynamic_storage.h +++ b/src/framework/stdext/dynamic_storage.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/stdext/exception.h b/src/framework/stdext/exception.h index 3c65d8a1..2a129b90 100644 --- a/src/framework/stdext/exception.h +++ b/src/framework/stdext/exception.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/stdext/format.h b/src/framework/stdext/format.h index 2b06632d..e5f1b1f9 100644 --- a/src/framework/stdext/format.h +++ b/src/framework/stdext/format.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/stdext/math.cpp b/src/framework/stdext/math.cpp index 5a875b7b..6397664c 100644 --- a/src/framework/stdext/math.cpp +++ b/src/framework/stdext/math.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/stdext/math.h b/src/framework/stdext/math.h index dbc14539..0713e671 100644 --- a/src/framework/stdext/math.h +++ b/src/framework/stdext/math.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/stdext/net.cpp b/src/framework/stdext/net.cpp index cabb02a5..7da85df9 100644 --- a/src/framework/stdext/net.cpp +++ b/src/framework/stdext/net.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/stdext/net.h b/src/framework/stdext/net.h index abdeef7a..9d1bb051 100644 --- a/src/framework/stdext/net.h +++ b/src/framework/stdext/net.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/stdext/packed_any.h b/src/framework/stdext/packed_any.h index aca3db11..b6a1aa32 100644 --- a/src/framework/stdext/packed_any.h +++ b/src/framework/stdext/packed_any.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/stdext/packed_storage.h b/src/framework/stdext/packed_storage.h index 49366bd8..6d12c16e 100644 --- a/src/framework/stdext/packed_storage.h +++ b/src/framework/stdext/packed_storage.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/stdext/packed_vector.h b/src/framework/stdext/packed_vector.h index a7f2b784..77951d6c 100644 --- a/src/framework/stdext/packed_vector.h +++ b/src/framework/stdext/packed_vector.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/stdext/shared_object.h b/src/framework/stdext/shared_object.h index 18349f11..d046da54 100644 --- a/src/framework/stdext/shared_object.h +++ b/src/framework/stdext/shared_object.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/stdext/shared_ptr.h b/src/framework/stdext/shared_ptr.h index 67c8ffba..b10078c9 100644 --- a/src/framework/stdext/shared_ptr.h +++ b/src/framework/stdext/shared_ptr.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/stdext/stdext.h b/src/framework/stdext/stdext.h index c404bd41..923991a9 100644 --- a/src/framework/stdext/stdext.h +++ b/src/framework/stdext/stdext.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/stdext/string.cpp b/src/framework/stdext/string.cpp index 64afed28..f464d958 100644 --- a/src/framework/stdext/string.cpp +++ b/src/framework/stdext/string.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/stdext/string.h b/src/framework/stdext/string.h index fef570be..efba62af 100644 --- a/src/framework/stdext/string.h +++ b/src/framework/stdext/string.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/stdext/time.cpp b/src/framework/stdext/time.cpp index d42f025e..c660b6f4 100644 --- a/src/framework/stdext/time.cpp +++ b/src/framework/stdext/time.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/stdext/time.h b/src/framework/stdext/time.h index fd8c73d0..39dc3d5f 100644 --- a/src/framework/stdext/time.h +++ b/src/framework/stdext/time.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/stdext/traits.h b/src/framework/stdext/traits.h index a9cbbb53..d9e2ded6 100644 --- a/src/framework/stdext/traits.h +++ b/src/framework/stdext/traits.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/stdext/types.h b/src/framework/stdext/types.h index 10504405..4f4dd57a 100644 --- a/src/framework/stdext/types.h +++ b/src/framework/stdext/types.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/ui/declarations.h b/src/framework/ui/declarations.h index 06135630..7fdeb682 100644 --- a/src/framework/ui/declarations.h +++ b/src/framework/ui/declarations.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/ui/ui.h b/src/framework/ui/ui.h index dd0e4055..6da82b9c 100644 --- a/src/framework/ui/ui.h +++ b/src/framework/ui/ui.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/ui/uianchorlayout.cpp b/src/framework/ui/uianchorlayout.cpp index 54026f96..fc3ac88f 100644 --- a/src/framework/ui/uianchorlayout.cpp +++ b/src/framework/ui/uianchorlayout.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/ui/uianchorlayout.h b/src/framework/ui/uianchorlayout.h index bfe2a336..fb9c4d65 100644 --- a/src/framework/ui/uianchorlayout.h +++ b/src/framework/ui/uianchorlayout.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/ui/uiboxlayout.cpp b/src/framework/ui/uiboxlayout.cpp index 500c6290..104d1f1e 100644 --- a/src/framework/ui/uiboxlayout.cpp +++ b/src/framework/ui/uiboxlayout.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/ui/uiboxlayout.h b/src/framework/ui/uiboxlayout.h index 5b349b24..af7d511c 100644 --- a/src/framework/ui/uiboxlayout.h +++ b/src/framework/ui/uiboxlayout.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/ui/uigridlayout.cpp b/src/framework/ui/uigridlayout.cpp index 1292139a..cb9b06e3 100644 --- a/src/framework/ui/uigridlayout.cpp +++ b/src/framework/ui/uigridlayout.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/ui/uigridlayout.h b/src/framework/ui/uigridlayout.h index f9591991..5a392769 100644 --- a/src/framework/ui/uigridlayout.h +++ b/src/framework/ui/uigridlayout.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/ui/uihorizontallayout.cpp b/src/framework/ui/uihorizontallayout.cpp index 8cdf3239..bf0e0731 100644 --- a/src/framework/ui/uihorizontallayout.cpp +++ b/src/framework/ui/uihorizontallayout.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/ui/uihorizontallayout.h b/src/framework/ui/uihorizontallayout.h index 6f159fe4..0f353b15 100644 --- a/src/framework/ui/uihorizontallayout.h +++ b/src/framework/ui/uihorizontallayout.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/ui/uilayout.cpp b/src/framework/ui/uilayout.cpp index 4ecd6f4c..8c93e0b1 100644 --- a/src/framework/ui/uilayout.cpp +++ b/src/framework/ui/uilayout.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/ui/uilayout.h b/src/framework/ui/uilayout.h index a3762a00..6db0914d 100644 --- a/src/framework/ui/uilayout.h +++ b/src/framework/ui/uilayout.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/ui/uimanager.cpp b/src/framework/ui/uimanager.cpp index 1a2e0ecf..14c770c5 100644 --- a/src/framework/ui/uimanager.cpp +++ b/src/framework/ui/uimanager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/ui/uimanager.h b/src/framework/ui/uimanager.h index 0c55ac33..be95ebe3 100644 --- a/src/framework/ui/uimanager.h +++ b/src/framework/ui/uimanager.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/ui/uiparticles.cpp b/src/framework/ui/uiparticles.cpp index 6e5261f6..75cca323 100644 --- a/src/framework/ui/uiparticles.cpp +++ b/src/framework/ui/uiparticles.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/ui/uiparticles.h b/src/framework/ui/uiparticles.h index 92c18de0..9f619fd3 100644 --- a/src/framework/ui/uiparticles.h +++ b/src/framework/ui/uiparticles.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/ui/uitextedit.cpp b/src/framework/ui/uitextedit.cpp index 1f99b435..2c5aceaa 100644 --- a/src/framework/ui/uitextedit.cpp +++ b/src/framework/ui/uitextedit.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/ui/uitextedit.h b/src/framework/ui/uitextedit.h index cb7ffef4..2b9bb93b 100644 --- a/src/framework/ui/uitextedit.h +++ b/src/framework/ui/uitextedit.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/ui/uitranslator.cpp b/src/framework/ui/uitranslator.cpp index 439acd9a..945f0948 100644 --- a/src/framework/ui/uitranslator.cpp +++ b/src/framework/ui/uitranslator.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/ui/uitranslator.h b/src/framework/ui/uitranslator.h index cf9b0556..14539468 100644 --- a/src/framework/ui/uitranslator.h +++ b/src/framework/ui/uitranslator.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/ui/uiverticallayout.cpp b/src/framework/ui/uiverticallayout.cpp index 18eef4ef..bb74a2f5 100644 --- a/src/framework/ui/uiverticallayout.cpp +++ b/src/framework/ui/uiverticallayout.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/ui/uiverticallayout.h b/src/framework/ui/uiverticallayout.h index 82668db2..aeec57d9 100644 --- a/src/framework/ui/uiverticallayout.h +++ b/src/framework/ui/uiverticallayout.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/ui/uiwidget.cpp b/src/framework/ui/uiwidget.cpp index bfd02882..89ec46cb 100644 --- a/src/framework/ui/uiwidget.cpp +++ b/src/framework/ui/uiwidget.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/ui/uiwidget.h b/src/framework/ui/uiwidget.h index 72ca2c21..d7a144a8 100644 --- a/src/framework/ui/uiwidget.h +++ b/src/framework/ui/uiwidget.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/ui/uiwidgetbasestyle.cpp b/src/framework/ui/uiwidgetbasestyle.cpp index d4aed1ed..0564c788 100644 --- a/src/framework/ui/uiwidgetbasestyle.cpp +++ b/src/framework/ui/uiwidgetbasestyle.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/ui/uiwidgetimage.cpp b/src/framework/ui/uiwidgetimage.cpp index a34856e9..bf8da408 100644 --- a/src/framework/ui/uiwidgetimage.cpp +++ b/src/framework/ui/uiwidgetimage.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/ui/uiwidgettext.cpp b/src/framework/ui/uiwidgettext.cpp index e0ad18c0..0574c352 100644 --- a/src/framework/ui/uiwidgettext.cpp +++ b/src/framework/ui/uiwidgettext.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/util/color.cpp b/src/framework/util/color.cpp index c44b56c2..7a4902b4 100644 --- a/src/framework/util/color.cpp +++ b/src/framework/util/color.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/util/color.h b/src/framework/util/color.h index 3d481602..c54d97a3 100644 --- a/src/framework/util/color.h +++ b/src/framework/util/color.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/util/crypt.cpp b/src/framework/util/crypt.cpp index 5f9b426f..ebeb4f62 100644 --- a/src/framework/util/crypt.cpp +++ b/src/framework/util/crypt.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/util/crypt.h b/src/framework/util/crypt.h index 2934ee8c..5a31f06f 100644 --- a/src/framework/util/crypt.h +++ b/src/framework/util/crypt.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/util/databuffer.h b/src/framework/util/databuffer.h index 32b1f9d6..61cf80e8 100644 --- a/src/framework/util/databuffer.h +++ b/src/framework/util/databuffer.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/util/matrix.h b/src/framework/util/matrix.h index e90b2350..0f0caad9 100644 --- a/src/framework/util/matrix.h +++ b/src/framework/util/matrix.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/util/point.h b/src/framework/util/point.h index ce1edf35..c1e2f23e 100644 --- a/src/framework/util/point.h +++ b/src/framework/util/point.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/util/rect.h b/src/framework/util/rect.h index dfeb4ce8..960a6312 100644 --- a/src/framework/util/rect.h +++ b/src/framework/util/rect.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/framework/util/size.h b/src/framework/util/size.h index d049a6fa..6c0581fc 100644 --- a/src/framework/util/size.h +++ b/src/framework/util/size.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/main.cpp b/src/main.cpp index 3108e896..ce0bff1f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 OTClient + * Copyright (c) 2010-2015 OTClient * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal From 83dc129f036b72973e489cfc0743444b0e4eec29 Mon Sep 17 00:00:00 2001 From: TheSumm Date: Sat, 7 Mar 2015 06:09:00 +0100 Subject: [PATCH 37/43] Protocol 10.76, fixed death window & death packet --- modules/game_playerdeath/deathwindow.otui | 5 ++-- modules/game_playerdeath/playerdeath.lua | 31 ++++++++++++++++++++--- modules/gamelib/const.lua | 6 +++++ modules/gamelib/game.lua | 2 +- src/client/const.h | 6 +++++ src/client/game.cpp | 12 ++++++--- src/client/game.h | 2 +- src/client/protocolgameparse.cpp | 10 ++++++-- 8 files changed, 61 insertions(+), 13 deletions(-) diff --git a/modules/game_playerdeath/deathwindow.otui b/modules/game_playerdeath/deathwindow.otui index 4e395bc0..4f185bf1 100644 --- a/modules/game_playerdeath/deathwindow.otui +++ b/modules/game_playerdeath/deathwindow.otui @@ -1,10 +1,11 @@ DeathWindow < MainWindow id: deathWindow !text: tr('You are dead') - size: 350 155 + &baseWidth: 350 + &baseHeight: 15 Label - !text: tr('Alas! Brave adventurer, you have met a sad fate.\nBut do not despair, for the gods will bring you back\ninto this world in exchange for a small sacrifice\n\nSimply click on Ok to resume your journeys!') + id: labelText width: 550 height: 140 anchors.left: parent.left diff --git a/modules/game_playerdeath/playerdeath.lua b/modules/game_playerdeath/playerdeath.lua index 5592797b..736f86e6 100644 --- a/modules/game_playerdeath/playerdeath.lua +++ b/modules/game_playerdeath/playerdeath.lua @@ -1,5 +1,11 @@ deathWindow = nil +local deathTexts = { + regular = {text = 'Alas! Brave adventurer, you have met a sad fate.\nBut do not despair, for the gods will bring you back\ninto this world in exchange for a small sacrifice\n\nSimply click on Ok to resume your journeys!', height = 140, width = 0}, + unfair = {text = 'Alas! Brave adventurer, you have met a sad fate.\nBut do not despair, for the gods will bring you back\ninto this world in exchange for a small sacrifice\n\nThis death penalty has been reduced by %i%%\nbecause it was an unfair fight.\n\nSimply click on Ok to resume your journeys!', height = 185, width = 0}, + blessed = {text = 'Alas! Brave adventurer, you have met a sad fate.\nBut do not despair, for the gods will bring you back into this world\n\nThis death penalty has been reduced by 100%\nbecause you are blessed with the Adventurer\'s Blessing\n\nSimply click on Ok to resume your journeys!', height = 170, width = 90} +} + function init() g_ui.importStyle('deathwindow') @@ -21,9 +27,9 @@ function reset() end end -function display() +function display(deathType, penalty) displayDeadMessage() - openWindow() + openWindow(deathType, penalty) end function displayDeadMessage() @@ -33,12 +39,31 @@ function displayDeadMessage() modules.game_textmessage.displayGameMessage(tr('You are dead.')) end -function openWindow() +function openWindow(deathType, penalty) if deathWindow then deathWindow:destroy() return end + deathWindow = g_ui.createWidget('DeathWindow', rootWidget) + + local textLabel = deathWindow:getChildById('labelText') + if deathType == DeathType.Regular then + if penalty == 100 then + textLabel:setText(deathTexts.regular.text) + deathWindow:setHeight(deathWindow.baseHeight + deathTexts.regular.height) + deathWindow:setWidth(deathWindow.baseWidth + deathTexts.regular.width) + else + textLabel:setText(string.format(deathTexts.unfair.text, 100 - penalty)) + deathWindow:setHeight(deathWindow.baseHeight + deathTexts.unfair.height) + deathWindow:setWidth(deathWindow.baseWidth + deathTexts.unfair.width) + end + elseif deathType == DeathType.Blessed then + textLabel:setText(deathTexts.blessed.text) + deathWindow:setHeight(deathWindow.baseHeight + deathTexts.blessed.height) + deathWindow:setWidth(deathWindow.baseWidth + deathTexts.blessed.width) + end + local okButton = deathWindow:getChildById('buttonOk') local cancelButton = deathWindow:getChildById('buttonCancel') diff --git a/modules/gamelib/const.lua b/modules/gamelib/const.lua index 4d64f686..71594a6c 100644 --- a/modules/gamelib/const.lua +++ b/modules/gamelib/const.lua @@ -130,6 +130,7 @@ GameExperienceBonus = 66 GameAuthenticator = 67 GameUnjustifiedPoints = 68 GameSessionKey = 69 +GameDeathType = 70 TextColors = { red = '#f55e5e', --'#c83200' @@ -270,4 +271,9 @@ Blessings = { SparkOfPhoenix = 32 } +DeathType = { + Regular = 0, + Blessed = 1 +} + -- @} diff --git a/modules/gamelib/game.lua b/modules/gamelib/game.lua index 3189538c..aff644c7 100644 --- a/modules/gamelib/game.lua +++ b/modules/gamelib/game.lua @@ -73,7 +73,7 @@ function g_game.getSupportedClients() 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1070, 1071, 1072, - 1073, 1074, 1075 + 1073, 1074, 1075, 1076 } end diff --git a/src/client/const.h b/src/client/const.h index 3e2db411..54bd164f 100644 --- a/src/client/const.h +++ b/src/client/const.h @@ -402,6 +402,7 @@ namespace Otc GameAuthenticator = 67, GameUnjustifiedPoints = 68, GameSessionKey = 69, + GameDeathType = 70, LastGameFeature = 101 }; @@ -466,6 +467,11 @@ namespace Otc BlessingWisdomOfSolitude = 1 << 4, BlessingSparkOfPhoenix = 1 << 5 }; + + enum DeathType { + DeathRegular = 0, + DeathBlessed = 1 + }; } #endif diff --git a/src/client/game.cpp b/src/client/game.cpp index 448e0544..106742c6 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -228,12 +228,12 @@ void Game::processGameEnd() g_map.cleanDynamicThings(); } -void Game::processDeath(int penality) +void Game::processDeath(int deathType, int penality) { m_dead = true; m_localPlayer->stopWalk(); - g_lua.callGlobalField("g_game", "onDeath", penality); + g_lua.callGlobalField("g_game", "onDeath", deathType, penality); } void Game::processGMActions(const std::vector& actions) @@ -1450,7 +1450,7 @@ void Game::setProtocolVersion(int version) if(isOnline()) stdext::throw_exception("Unable to change protocol version while online"); - if(version != 0 && (version < 740 || version > 1075)) + if(version != 0 && (version < 740 || version > 1076)) stdext::throw_exception(stdext::format("Protocol version %d not supported", version)); m_protocolVersion = version; @@ -1468,7 +1468,7 @@ void Game::setClientVersion(int version) if(isOnline()) stdext::throw_exception("Unable to change client version while online"); - if(version != 0 && (version < 740 || version > 1075)) + if(version != 0 && (version < 740 || version > 1076)) stdext::throw_exception(stdext::format("Client version %d not supported", version)); m_features.reset(); @@ -1596,6 +1596,10 @@ void Game::setClientVersion(int version) enableFeature(Otc::GameExperienceBonus); } + if(version >= 1055) { + enableFeature(Otc::GameDeathType); + } + if(version >= 1061) { enableFeature(Otc::GameOGLInformation); } diff --git a/src/client/game.h b/src/client/game.h index afe80b42..cf51fe6c 100644 --- a/src/client/game.h +++ b/src/client/game.h @@ -86,7 +86,7 @@ protected: void processGameStart(); void processGameEnd(); - void processDeath(int penality); + void processDeath(int deathType, int penality); void processGMActions(const std::vector& actions); void processInventoryChange(int slot, const ItemPtr& item); diff --git a/src/client/protocolgameparse.cpp b/src/client/protocolgameparse.cpp index a687a03a..d155b8d1 100644 --- a/src/client/protocolgameparse.cpp +++ b/src/client/protocolgameparse.cpp @@ -537,9 +537,15 @@ void ProtocolGame::parseChallenge(const InputMessagePtr& msg) void ProtocolGame::parseDeath(const InputMessagePtr& msg) { int penality = 100; - if(g_game.getFeature(Otc::GamePenalityOnDeath)) + int deathType = Otc::DeathRegular; + + if(g_game.getFeature(Otc::GameDeathType)) + deathType = msg->getU8(); + + if(g_game.getFeature(Otc::GamePenalityOnDeath) && deathType == Otc::DeathRegular) penality = msg->getU8(); - g_game.processDeath(penality); + + g_game.processDeath(deathType, penality); } void ProtocolGame::parseMapDescription(const InputMessagePtr& msg) From 3bffa6b04a0e4a75de8c66270e3e1918e52c9f75 Mon Sep 17 00:00:00 2001 From: TheSumm Date: Sat, 7 Mar 2015 16:32:45 +0100 Subject: [PATCH 38/43] Terminal new line (Shift+Enter) functionality --- modules/client_terminal/terminal.lua | 34 +++++++++++++++++++++------ modules/client_terminal/terminal.otui | 17 +++++++++++--- 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/modules/client_terminal/terminal.lua b/modules/client_terminal/terminal.lua index 861cbf35..38d74dde 100644 --- a/modules/client_terminal/terminal.lua +++ b/modules/client_terminal/terminal.lua @@ -30,6 +30,10 @@ local allLines = {} -- private functions local function navigateCommand(step) + if commandTextEdit:isMultiline() then + return + end + local numCommands = #commandHistory if numCommands > 0 then currentHistoryIndex = math.min(math.max(currentHistoryIndex + step, 0), numCommands) @@ -96,16 +100,29 @@ local function completeCommand() end end -local function doCommand() - local currentCommand = commandTextEdit:getText() +local function doCommand(textWidget) + local currentCommand = textWidget:getText() executeCommand(currentCommand) - - if commandTextEdit then - commandTextEdit:clearText() - end + textWidget:clearText() return true end +local function addNewline(textWidget) + if not textWidget:isOn() then + textWidget:setOn(true) + end + textWidget:appendText('\n') +end + +local function onCommandChange(textWidget, newText, oldText) + local _, newLineCount = string.gsub(newText, '\n', '\n') + textWidget:setHeight((newLineCount + 1) * textWidget.baseHeight) + + if newLineCount == 0 and textWidget:isOn() then + textWidget:setOn(false) + end +end + local function onLog(level, message, time) if disabled then return end -- avoid logging while reporting logs (would cause a infinite loop) @@ -129,6 +146,8 @@ function init() commandHistory = g_settings.getList('terminal-history') commandTextEdit = terminalWindow:getChildById('commandTextEdit') + commandTextEdit:setHeight(commandTextEdit.baseHeight) + connect(commandTextEdit, {onTextChange = onCommandChange}) g_keyboard.bindKeyPress('Up', function() navigateCommand(1) end, commandTextEdit) g_keyboard.bindKeyPress('Down', function() navigateCommand(-1) end, commandTextEdit) g_keyboard.bindKeyPress('Ctrl+C', @@ -138,6 +157,7 @@ function init() return true end, commandTextEdit) g_keyboard.bindKeyDown('Tab', completeCommand, commandTextEdit) + g_keyboard.bindKeyPress('Shift+Enter', addNewline, commandTextEdit) g_keyboard.bindKeyDown('Enter', doCommand, commandTextEdit) g_keyboard.bindKeyDown('Escape', hide, terminalWindow) @@ -293,7 +313,7 @@ function addLine(text, color) end function executeCommand(command) - if command == nil or #command == 0 then return end + if command == nil or #string.gsub(command, '\n', '') == 0 then return end -- add command line addLine("> " .. command, "#ffffff") diff --git a/modules/client_terminal/terminal.otui b/modules/client_terminal/terminal.otui index afcd0a26..67b8ba06 100644 --- a/modules/client_terminal/terminal.otui +++ b/modules/client_terminal/terminal.otui @@ -47,7 +47,7 @@ UIWindow anchors.left: parent.left anchors.right: terminalScroll.left anchors.top: terminalScroll.top - anchors.bottom: commandSymbolLabel.top + anchors.bottom: commandTextEdit.top layout: type: verticalBox align-bottom: true @@ -80,14 +80,25 @@ UIWindow UITextEdit id: commandTextEdit - height: 12 + background: #aaaaaa11 + border-color: #aaaaaa88 + &baseHeight: 12 anchors.bottom: parent.bottom anchors.left: commandSymbolLabel.right - anchors.right: parent.right + anchors.right: terminalScroll.left margin-left: 1 + padding-left: 2 font: terminus-10px selection-color: black selection-background-color: white + border-width-left: 0 + border-width-top: 0 + multiline: false + + $on: + border-width-left: 1 + border-width-top: 1 + multiline: true ResizeBorder id: bottomResizeBorder From b237b713ef15a9ed3bf9bdf663b4a4055f0373c7 Mon Sep 17 00:00:00 2001 From: TheSumm Date: Mon, 9 Mar 2015 16:46:26 +0100 Subject: [PATCH 39/43] Fix 10.76 login protocol, added missing lua consts --- modules/gamelib/const.lua | 4 +++- modules/gamelib/protocollogin.lua | 8 +++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/modules/gamelib/const.lua b/modules/gamelib/const.lua index 71594a6c..2134760a 100644 --- a/modules/gamelib/const.lua +++ b/modules/gamelib/const.lua @@ -195,7 +195,9 @@ MessageModes = { RVRChannel = 46, RVRAnswer = 47, RVRContinue = 48, - Last = 49, + GameHighlight = 49, + NpcFromStartBlock = 50, + Last = 51, Invalid = 255, } diff --git a/modules/gamelib/protocollogin.lua b/modules/gamelib/protocollogin.lua index 9b791b78..9d871aa4 100644 --- a/modules/gamelib/protocollogin.lua +++ b/modules/gamelib/protocollogin.lua @@ -11,6 +11,10 @@ LoginServerSessionKey = 40 LoginServerCharacterList = 100 LoginServerExtendedCharacterList = 101 +-- Since 10.76 +LoginServerRetry = 10 +LoginServerErrorNew = 11 + function ProtocolLogin:login(host, port, accountName, accountPassword, authenticatorToken, stayLogged) if string.len(host) == 0 or port == nil or port == 0 then signalcall(self.onLoginError, self, tr("You must enter a valid server address and port.")) @@ -144,7 +148,9 @@ end function ProtocolLogin:onRecv(msg) while not msg:eof() do local opcode = msg:getU8() - if opcode == LoginServerError then + if opcode == LoginServerErrorNew then + self:parseError(msg) + elseif opcode == LoginServerError then self:parseError(msg) elseif opcode == LoginServerMotd then self:parseMotd(msg) From fcd481ee1593da066ee54296c46590a7267cc1ca Mon Sep 17 00:00:00 2001 From: TheSumm Date: Mon, 9 Mar 2015 23:26:39 +0100 Subject: [PATCH 40/43] Added missing message mode --- src/client/protocolgameparse.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/client/protocolgameparse.cpp b/src/client/protocolgameparse.cpp index d155b8d1..31764b88 100644 --- a/src/client/protocolgameparse.cpp +++ b/src/client/protocolgameparse.cpp @@ -1323,6 +1323,7 @@ void ProtocolGame::parseTalk(const InputMessagePtr& msg) case Otc::MessageBarkLow: case Otc::MessageBarkLoud: case Otc::MessageSpell: + case Otc::MessageNpcFromStartBlock: pos = getPosition(msg); break; case Otc::MessageChannel: From ab5bed456b971eee8c2e171624eaf059f24dba84 Mon Sep 17 00:00:00 2001 From: TheSumm Date: Sun, 19 Apr 2015 13:54:55 +0200 Subject: [PATCH 41/43] Fix warning --- src/client/animator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/animator.cpp b/src/client/animator.cpp index e07bc6a2..87c03bd0 100644 --- a/src/client/animator.cpp +++ b/src/client/animator.cpp @@ -55,7 +55,7 @@ void Animator::unserialize(int animationPhases, const FileStreamPtr& fin) m_phase = getStartPhase(); - assert(m_animationPhases == m_phaseDurations.size()); + assert(m_animationPhases == (int)m_phaseDurations.size()); assert(m_startPhase >= -1 && m_startPhase < m_animationPhases); } From 84f6cdec8666a41b00f8b3d8f6d84f0d0c9830ee Mon Sep 17 00:00:00 2001 From: TheSumm Date: Sun, 19 Apr 2015 13:56:03 +0200 Subject: [PATCH 42/43] Fix #576, PopupMenus close when leaving the game --- modules/corelib/ui/uipopupmenu.lua | 16 +++++++++++++++- modules/game_console/console.lua | 2 ++ modules/game_interface/gameinterface.lua | 3 +++ modules/game_npctrade/npctrade.lua | 1 + modules/game_viplist/viplist.lua | 2 ++ modules/gamelib/ui/uiminimap.lua | 2 ++ 6 files changed, 25 insertions(+), 1 deletion(-) diff --git a/modules/corelib/ui/uipopupmenu.lua b/modules/corelib/ui/uipopupmenu.lua index 79907023..2167b839 100644 --- a/modules/corelib/ui/uipopupmenu.lua +++ b/modules/corelib/ui/uipopupmenu.lua @@ -8,6 +8,7 @@ function UIPopupMenu.create() local layout = UIVerticalLayout.create(menu) layout:setFitChildren(true) menu:setLayout(layout) + menu.isGameMenu = false return menu end @@ -34,6 +35,7 @@ function UIPopupMenu:display(pos) rootWidget:addChild(self) self:setPosition(pos) self:grabMouse() + self:focus() --self:grabKeyboard() currentMenu = self end @@ -76,6 +78,10 @@ function UIPopupMenu:addSeparator() g_ui.createWidget(self:getStyleName() .. 'Separator', self) end +function UIPopupMenu:setGameMenu(state) + self.isGameMenu = state +end + function UIPopupMenu:onDestroy() if currentMenu == self then currentMenu = nil @@ -105,4 +111,12 @@ local function onRootGeometryUpdate() currentMenu:destroy() end end -connect(rootWidget, { onGeometryChange = onRootGeometryUpdate} ) + +local function onGameEnd() + if currentMenu and currentMenu.isGameMenu then + currentMenu:destroy() + end +end + +connect(rootWidget, { onGeometryChange = onRootGeometryUpdate }) +connect(g_game, { onGameEnd = onGameEnd } ) diff --git a/modules/game_console/console.lua b/modules/game_console/console.lua index ce9fce28..46e561f8 100644 --- a/modules/game_console/console.lua +++ b/modules/game_console/console.lua @@ -599,6 +599,7 @@ end function processChannelTabMenu(tab, mousePos, mouseButton) local menu = g_ui.createWidget('PopupMenu') + menu:setGameMenu(true) channelName = tab:getText() if tab ~= defaultTab and tab ~= serverTab then @@ -618,6 +619,7 @@ end function processMessageMenu(mousePos, mouseButton, creatureName, text, label, tab) if mouseButton == MouseRightButton then local menu = g_ui.createWidget('PopupMenu') + menu:setGameMenu(true) if creatureName and #creatureName > 0 then if creatureName ~= g_game.getCharacterName() then menu:addOption(tr('Message to ' .. creatureName), function () g_game.openPrivateChannel(creatureName) end) diff --git a/modules/game_interface/gameinterface.lua b/modules/game_interface/gameinterface.lua index 24e61232..248afbe8 100644 --- a/modules/game_interface/gameinterface.lua +++ b/modules/game_interface/gameinterface.lua @@ -442,7 +442,10 @@ end function createThingMenu(menuPosition, lookThing, useThing, creatureThing) if not g_game.isOnline() then return end + local menu = g_ui.createWidget('PopupMenu') + menu:setGameMenu(true) + local classic = modules.client_options.getOption('classicControl') local shortcut = nil diff --git a/modules/game_npctrade/npctrade.lua b/modules/game_npctrade/npctrade.lua index a8d9acb6..d76be941 100644 --- a/modules/game_npctrade/npctrade.lua +++ b/modules/game_npctrade/npctrade.lua @@ -177,6 +177,7 @@ function itemPopup(self, mousePosition, mouseButton) if mouseButton == MouseRightButton then local menu = g_ui.createWidget('PopupMenu') + menu:setGameMenu(true) menu:addOption(tr('Look'), function() return g_game.inspectNpcTrade(self:getItem()) end) menu:display(mousePosition) return true diff --git a/modules/game_viplist/viplist.lua b/modules/game_viplist/viplist.lua index 8f15a03f..38b79773 100644 --- a/modules/game_viplist/viplist.lua +++ b/modules/game_viplist/viplist.lua @@ -345,6 +345,7 @@ function onVipListMousePress(widget, mousePos, mouseButton) local vipList = vipWindow:getChildById('contentsPanel') local menu = g_ui.createWidget('PopupMenu') + menu:setGameMenu(true) menu:addOption(tr('Add new VIP'), function() createAddWindow() end) menu:addSeparator() @@ -377,6 +378,7 @@ function onVipListLabelMousePress(widget, mousePos, mouseButton) local vipList = vipWindow:getChildById('contentsPanel') local menu = g_ui.createWidget('PopupMenu') + menu:setGameMenu(true) menu:addOption(tr('Send Message'), function() g_game.openPrivateChannel(widget:getText()) end) menu:addOption(tr('Add new VIP'), function() createAddWindow() end) menu:addOption(tr('Edit %s', widget:getText()), function() if widget then createEditWindow(widget) end end) diff --git a/modules/gamelib/ui/uiminimap.lua b/modules/gamelib/ui/uiminimap.lua index 13b23d46..0ce93079 100644 --- a/modules/gamelib/ui/uiminimap.lua +++ b/modules/gamelib/ui/uiminimap.lua @@ -85,6 +85,7 @@ end local function onFlagMouseRelease(widget, pos, button) if button == MouseRightButton then local menu = g_ui.createWidget('PopupMenu') + menu:setGameMenu(true) menu:addOption(tr('Delete mark'), function() widget:destroy() end) menu:display(pos) return true @@ -228,6 +229,7 @@ function UIMinimap:onMouseRelease(pos, button) return true elseif button == MouseRightButton then local menu = g_ui.createWidget('PopupMenu') + menu:setGameMenu(true) menu:addOption(tr('Create mark'), function() self:createFlagWindow(mapPos) end) menu:display(pos) return true From f936ab9aabf9f2a9a5bb48c1529e038d4a1c1a4e Mon Sep 17 00:00:00 2001 From: TheSumm Date: Sun, 19 Apr 2015 13:59:45 +0200 Subject: [PATCH 43/43] fix #638 --- vc12/otclient.vcxproj | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/vc12/otclient.vcxproj b/vc12/otclient.vcxproj index 0cc33c3d..e9ab5357 100644 --- a/vc12/otclient.vcxproj +++ b/vc12/otclient.vcxproj @@ -200,12 +200,7 @@ - - - - - - +