Ir para conteúdo

Líderes

Conteúdo Popular

Exibindo conteúdo com a maior reputação em 05/14/20 em todas áreas

  1. 1 ponto
    REV3884 TFS 0.4 OTC 0.6.6 OBSERVAÇÃO: Bom galera hoje vim trazer um código de expansão de visão para o otclient alterado por mim, usado somente para rev3884 e então se você usa um tfs 0.3.6 ou tfs 1.0 não vai dar certo, *Esse código foi alterado por mim para ser usado apenas para rev3884, procolo 8.60 e TFS 0.4 que no caso não achei e resolvi compartilhar essas alterações. 1° TUTORIAL 1 SOURCE DO SEU SERVIDOR. Abra Protocollgame.cpp 1 Ache ((x >= myPos.x - 8 + offsetz) && (x <= myPos.x + 9 + offsetz) && //(y >= myPos.y - 6 + offsetz) && (y <= myPos.y + 7 + offsetz)); ALTERE PARA: ((x >= myPos.x - Map::maxClientViewportX + offsetz) && (x <= myPos.x + (Map::maxClientViewportX+1) + offsetz) && (y >= myPos.y - Map::maxClientViewportY + offsetz) && (y <= myPos.y + (Map::maxClientViewportY+1) + offsetz)); 2 Ache: GetMapDescription(pos.x - 8, pos.y - 6, pos.z, 18, 14, msg); ALTERE PARA: GetMapDescription(pos.x - Map::maxClientViewportX, pos.y - Map::maxClientViewportY, pos.z, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, msg); 3 Ache: if(oldPos.y > newPos.y) // north, for old x { msg->put<char>(0x65); GetMapDescription(oldPos.x - 8, newPos.y - 6, newPos.z, 18, 1, msg); } else if(oldPos.y < newPos.y) // south, for old x { msg->put<char>(0x67); GetMapDescription(oldPos.x - 8, newPos.y + 7, newPos.z, 18, 1, msg); } if(oldPos.x < newPos.x) // east, [with new y] { msg->put<char>(0x66); GetMapDescription(newPos.x + 9, newPos.y - 6, newPos.z, 1, 14, msg); } else if(oldPos.x > newPos.x) // west, [with new y] { msg->put<char>(0x68); GetMapDescription(newPos.x - 8, newPos.y - 6, newPos.z, 1, 14, msg); } ALTERE PARA: if (oldPos.y > newPos.y) { // north, for old x msg->put<char>(0x65); GetMapDescription(oldPos.x - Map::maxClientViewportX, newPos.y - Map::maxClientViewportY, newPos.z, (Map::maxClientViewportX+1)*2, 1, msg); } else if (oldPos.y < newPos.y) { // south, for old x msg->put<char>(0x67); GetMapDescription(oldPos.x - Map::maxClientViewportX, newPos.y + (Map::maxClientViewportY+1), newPos.z, (Map::maxClientViewportX+1)*2, 1, msg); } if (oldPos.x < newPos.x) { // east, [with new y] msg->put<char>(0x66); GetMapDescription(newPos.x + (Map::maxClientViewportX+1), newPos.y - Map::maxClientViewportY, newPos.z, 1, (Map::maxClientViewportY+1)*2, msg); } else if (oldPos.x > newPos.x) { // west, [with new y] msg->put<char>(0x68); GetMapDescription(newPos.x - Map::maxClientViewportX, newPos.y - Map::maxClientViewportY, newPos.z, 1, (Map::maxClientViewportY+1)*2, msg); } 4 ache GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 5, 18, 14, 3, skip); //(floor 7 and 6 already set) GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 4, 18, 14, 4, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 3, 18, 14, 5, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 2, 18, 14, 6, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 1, 18, 14, 7, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 0, 18, 14, 8, skip); Altere para GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 5, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 3, skip); //(floor 7 and 6 already set) GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 4, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 4, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 3, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 5, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 2, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 6, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 1, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 7, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 0, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 8, skip); 5 ache GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, oldPos.z - 3, 18, 14, 3, skip); ALTERE PARA GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, oldPos.z - 3, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 3, skip); 6 ACHE GetMapDescription(oldPos.x - 8, oldPos.y + 1 - 6, newPos.z, 1, 14, msg); ALTERE PARA GetMapDescription(oldPos.x - Map::maxClientViewportX, oldPos.y - (Map::maxClientViewportY-1), newPos.z, 1, (Map::maxClientViewportY+1)*2, msg); 7 ACHE GetMapDescription(oldPos.x - 8, oldPos.y - 6, newPos.z, 18, 1, msg); ALTERE PARA GetMapDescription(oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, newPos.z, (Map::maxClientViewportX+1)*2, 1, msg); 8 Ache GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, newPos.z, 18, 14, -1, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, newPos.z + 1, 18, 14, -2, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, newPos.z + 2, 18, 14, -3, skip); Altere para GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, newPos.z, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, -1, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, newPos.z + 1, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, -2, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, newPos.z + 2, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, -3, skip); 9 ache GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, newPos.z + 2, 18, 14, -3, skip); Altere para GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, newPos.z + 2, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, -3, skip); 10 ache GetMapDescription(oldPos.x + 9, oldPos.y - 1 - 6, newPos.z, 1, 14, msg); Altere para GetMapDescription(oldPos.x + Map::maxClientViewportX+1, oldPos.y - (Map::maxClientViewportY+1), newPos.z, 1, ((Map::maxClientViewportY+1)*2), msg); AGORA EM MAP.H ache static const int32_t maxViewportX = 11; //min value: maxClientViewportX + 1 static const int32_t maxViewportY = 11; //min value: maxClientViewportY + 1 static const int32_t maxClientViewportX = 8; static const int32_t maxClientViewportY = 6; altere para: static const int32_t maxViewportX = 18; //min value: maxClientViewportX + 1 static const int32_t maxViewportY = 18; //min value: maxClientViewportY + 1 static const int32_t maxClientViewportX = 14; static const int32_t maxClientViewportY = 12; Pronto agora é só compilar a source do seu servidor 8.60 rev3884 PARTE 2 OTCLIENT 0.6.6 abra o map.cpp da source do otclient ache void Map::resetAwareRange() { AwareRange range; range.left = 8; range.top = 6; range.bottom = 7; range.right = 9; setAwareRange(range); } ALTERE PARA void Map::resetAwareRange() { AwareRange range; range.left = 14; //Change this to = maxClientViewportX range.top = 12; //Change this to = maxClientViewportY range.bottom = range.top+1; range.right = range.left+1; setAwareRange(range); } COMPILE A SOURCE DO OTCLIENT E PRONTO!!! ESPERO TER SANADO VÁRIAS DÚVIDAS DE AUMENTAR TELA DO OTCLIENT EM REV3884. CRÉDITOS: Pra mim pela alterações funcionais. e pelo Flatlander por disponibilizar para tfs 0.3.6 e 1.0 pois esse está alterado pra tfs 0.4
  2. AutoLoot 100% Funcional

    brendonbh reagiu a Belmont por uma resposta no tópico

    1 ponto
    E ai pessoal, vi que muitas pessoas tem problemas em instalar, e achar um script de autoloot 100% funcional. Foi ai que decidi postar aqui para vocês, um script totalmente novo e que realmente funciona, pronto para usar e abusar dele kkk. Bom, vamos parar de lero lero e bora ao que interessa. Fixados: Dinheiro Duplicado; Coleta itens até mesmo dentro das bag dos monstros; Lembrando que esse script NÃO é de minha autoria, e que já existe no Tk, mas em tópicos diferentes. Como eu uso ele já vou deixar tudo certo para o uso do mesmo. 1° Passo - Dentro da pasta data/actions/scripts crie um arquivo chamado autoloot_boost.lua Em data/actions/actions.xml registre o script assim: <action itemid="ITEMID" event="script" value="autoloot_boost.lua"/> 2° Passo - Vá na pasta data/creaturescripts/script e crie dois arquivos, um chamado autoloot.lua e o outro fimautoloot.lua depois, adicione os seguintes códigos: autoloot.lua fimautoloot.lua Agora em data/creaturescripts/creaturescripts.xml você vai registrar esses scripts dessa forma: <event type="kill" name="autoloot" event="script" value="autoloot.lua"/> <event type="login" name="fimautoloot" event="script" value="fimautoloot.lua"/> Abra o arquivo login.lua localizado na mesma pasta e adicione este código abaixo de outro registerCreatureEvent registerCreatureEvent(cid, "autoloot") Depois de instalar tudo, vamos para a pasta data/talkactions/script nela você irá criar um arquivo chamado autoloot.lua e vai adicionar este código: Em data/talkactions/talkcations.xml resgistra o script assim: <talkaction words="!autoloot" event="script" value="autoloot.lua"/> Vá na pasta lib, e crie um arquivo chamado autoloot, e cole isso dentro: Ainda na pasta lib crie um arquivo .lua e coloque esse script dentro, ou faça o download do mesmo logo abaixo: Download: killua's lib.lua Isso é tudo pessoal! Informações: Este sistema funciona através de Premium Account, junto com ele vem o sistema de Autoloot Booster, que consiste em vender automaticamente os itens coletados. Foi testado em um servidor de Tibia 8.60 utilizando OTX 2. Créditos: @lordzetros @KOLISAO @Dwarfer
  3. Auto Loot Sytem for TFS 1.3 + revscripts

    L3K0T reagiu a Pedriinz por uma resposta no tópico

    1 ponto
    Depois de milhões de anos sem programar porcaria nenhuma... Eu desenvolvi este sistema como um método de estudo. (C++) Este sistema foi inspirado no Auto Loot System por @psychonaut. (OTland) Criei o mesmo na versão mais recente do tfs. Auto Loot System for TFS 1.3 Como funciona? Simples, quando você mata um monstro e abre o corpo (você precisa clicar no corpo), os itens vão para o seu personagem. Instalando em actions.cpp, encontre: if (corpseOwner != 0 && !player->canOpenCorpse(corpseOwner)) { return RETURNVALUE_YOUARENOTTHEOWNER; } e mude isso para: if (corpseOwner != 0 && !player->canOpenCorpse(corpseOwner)) { return RETURNVALUE_YOUARENOTTHEOWNER; } else { if (player->canOpenCorpse(corpseOwner) && player->autoLootList.size() != 0) { if (player->getCapacity() > 100 * 100) { //Minimum of Capacity for autoloot works. (100 CAP) for (Item* item : container->getItemList()) { if (player->getItemFromAutoLoot(item->getID())) { std::ostringstream msgAutoLoot; msgAutoLoot << "You looted a " << item->getItemCount() << "x " << item->getName() << "."; g_game.internalMoveItem(container, player, CONST_SLOT_WHEREEVER, item, item->getItemCount(), nullptr); player->sendTextMessage(MESSAGE_INFO_DESCR, msgAutoLoot.str()); } } } else { player->sendTextMessage(MESSAGE_INFO_DESCR, "Sorry, you don't have enough capacity to use auto loot, so it has been disabled. (100+ capacity is required)"); } } } em player.h, abaixo de: std::unordered_set<uint32_t> VIPList; adicione isso: std::set<uint32_t> autoLootList; ainda em player.h encontre: bool hasLearnedInstantSpell(const std::string& spellName) const; adicione em baixo: void addItemToAutoLoot(uint16_t itemId); void removeItemFromAutoLoot(uint16_t itemId); bool getItemFromAutoLoot(uint16_t itemId); em player.cpp no final do arquivo, adicione: void Player::addItemToAutoLoot(uint16_t itemId) { autoLootList.insert(itemId); } void Player::removeItemFromAutoLoot(uint16_t itemId) { autoLootList.erase(itemId); } bool Player::getItemFromAutoLoot(const uint16_t itemId) { return autoLootList.find(itemId) != autoLootList.end(); } em luascript.cpp encontre: registerMethod("Player", "getFightMode", LuaScriptInterface::luaPlayerGetFightMode); e adicione em baixo: registerMethod("Player", "addItemToAutoLoot", LuaScriptInterface::luaPlayerAddItemToAutoLoot); registerMethod("Player", "removeItemFromAutoLoot", LuaScriptInterface::luaPlayerRemoveItemFromAutoLoot); registerMethod("Player", "getItemFromAutoLoot", LuaScriptInterface::luaPlayerGetItemFromAutoLoot); registerMethod("Player", "getAutoLootList", LuaScriptInterface::luaPlayerGetAutoLootList); ainda em luascript.cpp encontre essa função: int LuaScriptInterface::luaPlayerGetFightMode(lua_State* L) { // player:getFightMode() Player* player = getUserdata<Player>(L, 1); if (player) { lua_pushnumber(L, player->fightMode); } else { lua_pushnil(L); } return 1; } abaixo dela, adicione: int LuaScriptInterface::luaPlayerAddItemToAutoLoot(lua_State* L) { // player:addItemToAutoLoot(itemId) Player* player = getUserdata<Player>(L, 1); if (!player) { lua_pushnil(L); return 1; } uint16_t itemId; if (isNumber(L, 2)) { itemId = getNumber<uint16_t>(L, 2); } else { itemId = Item::items.getItemIdByName(getString(L, 2)); if (itemId == 0) { lua_pushnil(L); return 1; } } player->addItemToAutoLoot(itemId); pushBoolean(L, true); return 1; } int LuaScriptInterface::luaPlayerRemoveItemFromAutoLoot(lua_State* L) { // player:removeItemFromAutoLoot(itemId) Player* player = getUserdata<Player>(L, 1); if (!player) { lua_pushnil(L); return 1; } uint16_t itemId; if (isNumber(L, 2)) { itemId = getNumber<uint16_t>(L, 2); } else { itemId = Item::items.getItemIdByName(getString(L, 2)); if (itemId == 0) { lua_pushnil(L); return 1; } } player->removeItemFromAutoLoot(itemId); pushBoolean(L, true); return 1; } int LuaScriptInterface::luaPlayerGetItemFromAutoLoot(lua_State* L) { // player:getItemFromAutoLoot(itemId) Player* player = getUserdata<Player>(L, 1); if (!player) { lua_pushnil(L); return 1; } uint16_t itemId; if (isNumber(L, 2)) { itemId = getNumber<uint16_t>(L, 2); } else { itemId = Item::items.getItemIdByName(getString(L, 2)); if (itemId == 0) { lua_pushnil(L); return 1; } } if (player->getItemFromAutoLoot(itemId)) { pushBoolean(L, true); } else { pushBoolean(L, false); } return 1; } int LuaScriptInterface::luaPlayerGetAutoLootList(lua_State* L) { // player:getAutoLootList() Player* player = getUserdata<Player>(L, 1); if (player) { std::set<uint32_t> value = player->autoLootList; if (value.size() == 0) { lua_pushnil(L); return 1; } int index = 0; lua_createtable(L, value.size(), 0); for(auto i : value) { lua_pushnumber(L, i); lua_rawseti(L, -2, ++index); } } else { lua_pushnil(L); } return 1; } em luascript.h encontre: static int luaPlayerGetFightMode(lua_State* L); adicione a baixo: static int luaPlayerAddItemToAutoLoot(lua_State* L); static int luaPlayerRemoveItemFromAutoLoot(lua_State* L); static int luaPlayerGetItemFromAutoLoot(lua_State* L); static int luaPlayerGetAutoLootList(lua_State* L); em iologindata.cpp encontre: //load storage map query.str(std::string()); query << "SELECT `key`, `value` FROM `player_storage` WHERE `player_id` = " << player->getGUID(); if ((result = db.storeQuery(query.str()))) { do { player->addStorageValue(result->getNumber<uint32_t>("key"), result->getNumber<int32_t>("value"), true); } while (result->next()); } e adicione em baixo: query.str(std::string()); query << "SELECT `autoloot_list` FROM `player_autoloot` WHERE `player_id` = " << player->getGUID(); if ((result = db.storeQuery(query.str()))) { unsigned long lootlistSize; const char* autolootlist = result->getStream("autoloot_list", lootlistSize); PropStream propStreamList; propStreamList.init(autolootlist, lootlistSize); int16_t value; int16_t item = propStreamList.read<int16_t>(value); while (item) { player->addItemToAutoLoot(value); item = propStreamList.read<int16_t>(value); } } acima de: //save inbox items adicione: query.str(std::string()); query << "DELETE FROM `player_autoloot` WHERE `player_id` = " << player->getGUID(); if (!db.executeQuery(query.str())) { return false; } PropWriteStream propWriteStreamAutoLoot; for (auto i : player->autoLootList) { propWriteStreamAutoLoot.write<uint16_t>(i); } size_t lootlistSize; const char* autolootlist = propWriteStreamAutoLoot.getStream(lootlistSize); query.str(std::string()); DBInsert autolootQuery("INSERT INTO `player_autoloot` (`player_id`, `autoloot_list`) VALUES "); query << player->getGUID() << ',' << db.escapeBlob(autolootlist, lootlistSize); if (!autolootQuery.addRow(query)) { return false; } if (!autolootQuery.execute()) { return false; } em sua database, execute esta query CREATE TABLE player_autoloot ( id int NOT NULL AUTO_INCREMENT, player_id int NOT NULL, autoloot_list blob, PRIMARY KEY (id) ); agora vá em data/scripts/talkactions e crie esse arquivo LUA autoloot.lua local talk = TalkAction("!autoloot") function talk.onSay(player, words, param) local i = player:getAutoLootList() local cache = "Check your loot list: " local split = param:split(",") local action = split[1] if param == "list" then if i then for _, item in ipairs(i) do cache = cache .. (ItemType(item)):getName() .. ", " end else player:sendTextMessage(MESSAGE_INFO_DESCR, "Your list is empty! Add some item and try again.") return false end player:sendTextMessage(MESSAGE_INFO_DESCR, cache:sub(1, -3)) return false end if action == "add" then local item = split[2]:gsub("%s+", "", 1) local itemType = ItemType(item) if itemType:getId() == 0 then itemType = ItemType(tonumber(item)) if itemType:getName() == '' then player:sendCancelMessage("There is no item with that id or name.") return false end end if player:getItemFromAutoLoot(itemType:getId()) then player:sendCancelMessage("You're already autolooting this item.") return false end player:addItemToAutoLoot(itemType:getId()) player:sendTextMessage(MESSAGE_INFO_DESCR, "You're now auto looting " .. itemType:getName()) return false elseif action == "remove" then local item = split[2]:gsub("%s+", "", 1) local itemType = ItemType(item) if itemType:getId() == 0 then itemType = ItemType(tonumber(item)) if itemType:getName() == '' then player:sendCancelMessage("There is no item with that id or name.") return false end end if player:getItemFromAutoLoot(itemType:getId()) then player:removeItemFromAutoLoot(itemType:getId()) player:sendTextMessage(MESSAGE_INFO_DESCR, "You removed the " .. itemType:getName() .. " from your loot list.") else player:sendCancelMessage("This item does not exist in your loot list.") end return false end player:sendTextMessage(MESSAGE_EVENT_ORANGE, "Auto Loot commands (items are automatically moved to your bp if you open monster corpse):"..'\n'.."!addloot add, nameItem - add item to auto loot by name"..'\n'.."!autoloot remove, itemName - remove item from auto loot by name"..'\n'.."!autoloot list - list your current auto loot items") return false end talk:separator(" ") talk:register() É isso, espero que gostem do sisteminha Se você encontrar algum bug, deixe-me saber. Falta fazer: Optimizar a mensagem de loot. Adicionar ModalWindow. Cheers~
  4. Item Key System

    cain23 reagiu a Dwarfer por uma resposta no tópico

    1 ponto
    Fala, galerinha! Há um tempo atrás tinha feito esse sisteminha simples, como achei que não seria muito útil, acabou sumindo nas profundezas das pastas do meu computador. No entanto, como vi o pedido do membro @DboHere, acho que outras pessoas podem precisar. Como funciona: Uma key única que pode ser usada somente uma vez adicionará um item ao player quando for utilizada. - Criando uma key contendo 10 crystal coins: !createkey 2160,10 ou !createkey crystal coin,10 O player receberá a mensagem: "You have created the key: rXo-980376. You can add other items using !addkey." - Adicionando novos itens à mesma key: !addkey rXo-980376,2463,1 O player receberá a mensagem: "You have added other items to the key rXo-980376." - Checando os itens que uma key possui: !checkkey rXo-980376 - Utilizando a key o player receberá todos os itens associados a essa key. Depois disso, a key ficará inválida. !key rXo-980376 - Deletando a key da database (apenas se necessário): !deletekey rXo-980376 Configuração: Execute o seguinte comando no mysql do seu servidor: CREATE TABLE `code_key` ( `id` INT NOT NULL AUTO_INCREMENT, `key` VARCHAR(255) NOT NULL, `item_id` INT NOT NULL, `count` INT NOT NULL, `invalid` INT NOT NULL DEFAULT 0, PRIMARY KEY (`id`) ); Em talkactions/scripts, crie um arquivo: keysystem.lua Em "access" edite o grupo que pode utilizar cada comando. No exemplo abaixo, apenas players com acesso maior que 3 podem utilizar o comando !createkey. ["!createkey"] = {access = 3}, Em talkactions.xml, adicione a tag: <talkaction words="!key;!createkey;!deletekey;!checkkey;!addkey" event="script" value="keysystem.lua"/> E é isso, espero que seja útil
  5. [TFS 0.4] 8.60 com Tela Extendida

    Frenesy reagiu a Jededias321 por uma resposta no tópico

    1 ponto
    Gente muita gente tinha dificuldade em extender a tela do cliente do Tibia, então eu resolvi ajudar. Está aqui a distro TFS 0.4 rev 3777, com o OTCLIENT mais atualizado. Não coloquei datapack incluso, vocês podem baixar qualquer datapack 8.60 que vai ser compatível. Podem repostar suas modificações, mas coloquem meu crédito. Conteúdo: Distro, Otclient + SRC de ambos. Banco de dados MYSQL: https://www.mediafire.com/file/pa9xuav9kz4j2gg/tibia.sql/file Download: (39.88 MB, descompactado fica 106 MB) https://www.mediafire.com/file/6oo987114fvf8x7/TFS_860_com_tela_maior.rar/file Scan: https://www.virustotal.com/gui/file/a283cfbaadf383ad115e7452abd1c505ef4e404872595740cad5ce0f6867fc95/detection Imagens:
  6. Vingeance's

    Lurk reagiu a Vingeance por uma resposta no tópico

    1 ponto
    Medieval Yurots 8.60
  7. 1 ponto
    @unknownbeats Faz pelo Sublime Text 3, ele faz isso pra você nos 1000k arquivos que você tem em 3 segundos. Link
  8. 1 ponto
    @unknownbeats Ai nesse caso você vai ter que abrir os arquivos dos monstros um por um e remover esta linha: <event event name="Spawn" </event> Recomendo usar o Sublime para fazer isso.
  9. Solução Hasflag OTX tfs 1.3 10~12

    Augusto reagiu a amoxicilina por uma resposta no tópico

    1 ponto
    Olá pessoal, venho aqui hoje trazer a solução para o erro que tenho visto no servidor OTXServer Global Full Kilmaresh by malucooo, hasflag e não perde o Loot ao morrer. erro hasflag na console: Lembrando que essa solução consegui através de outro fórum e resolvi trazer-lo aqui. Quem me ajudou a solucioná-lo foi: Sarah Wesker, da otland. Então vamos ao que interessa, rs... Abra a pasta do seu servidor OTX em, data/lib/core/player.lua Cole ao final. function Player.hasFlag(self, flag) if not flag or type(flag) ~= 'number' then return false end return bit.band(self:getGroup():getFlags(), flag) ~= 0 end Pronto! resolvido os problemas. ?
  10. (Resolvido)Erro Gesior ao criar conta

    premii reagiu a Ryaan por uma resposta no tópico

    1 ponto
    tenta rodar esse comando na sua DB, já me salvou de muitos problemas SET GLOBAL sql_mode='';
  11. EMOTE SPELLS DINÂMICO!

    stauro reagiu a Lyu por uma resposta no tópico

    1 ponto
    Fala clã, tudo bom? Então, vi esse tal emote spells em um servidor e decidi fazer, e também, compartilhá-lo com vocês ? O que é? É um código simpleszinho que possibilita players escolherem a cor da mensagem das spells por meio de comando, LARANJA ou AMARELO, como nas imagens abaixo: Vamos aos códigos.. abra game.cpp, na função playerSaySpell, procure por: if (result == TALKACTION_BREAK) { if (!g_config.getBoolean(ConfigManager::EMOTE_SPELLS)) { return internalCreatureSay(player, TALKTYPE_SAY, words, false); } else { return internalCreatureSay(player, TALKTYPE_MONSTER_SAY, words, false); } } else if (result == TALKACTION_FAILED) { return true; } e substitua por: if (result == TALKACTION_BREAK) { int32_t value; player->getStorageValue(203500, value); return internalCreatureSay(player, value == 1 ? TALKTYPE_MONSTER_SAY : TALKTYPE_SAY, words, false); } else if (result == TALKACTION_FAILED) { return true; } Beleza, agora precisamos de uma talkaction para fazer a alteração de storage, vamos lá.. data/talkactions/scripts/emotespells.lua: function onSay(player) local switch = player:getStorageValue(203500) == -1 and 1 or -1 player:sendTextMessage(MESSAGE_INFO_DESCR, 'emote spells: (' .. (switch == 1 and 'monster_say' or 'say') .. ')') player:setStorageValue(203500, switch) end data/talkactions/talkactions.xml: <talkaction words="!emotespells" script="emotespells.lua"/> Agora só compilar as sources e pronto? Versão do TFS: 1.3 Créditos: Lyu (isme)
  12. Troll Clan Cave | Cave Hunt | 8.60

    Valhinhos reagiu a DdJs por uma resposta no tópico

    1 ponto
    Cave hunt - Troll Clan Cave. Download: Here Scan: Here Imagens:
  13. Lost Tomb | Cave Hunt | 8.60

    Valhinhos reagiu a DdJs por uma resposta no tópico

    1 ponto
    Cave hunt - Lost Tomb. Download: Here Scan: Here Imagens:
  14. [C++] Atribute isPokeball

    Unknown Beats reagiu a DarkWore por uma resposta no tópico

    1 ponto
    Falaaa galeraaa, beleza? então, estou trazendo pra vocês aquela função do PDA a isPokeball que achei em outro fórum e vi que não tem aqui Bem, se você tá adaptando seu PDA com source, e deu erro no atributo isPokeball, após colocar essa função não irá mais dar erro. Vá em items.cpp procure por: decayTime = 0; e em baixo adicione: isPokeball = false; agora procure por: else if(tmpStrValue == "transformto") { if(readXMLInteger(itemAttributesNode, "value", intValue)) it.transformToFree = intValue; } abaixo do }, adicione: else if(tmpStrValue == "ispokeball") { it.weight = 1000; } agora em items.h procure por: Ammo_t ammoType; e em baixo adicione: bool isPokeball; Recompile. E puff, seu cap está igual o pda xd Lembrando que nas pokebolas deve ter o atributo. Como neste exemplo: <item id="xxxx" article="a" name="safarri ball"> <attribute key="ispokeball" value="1"/> <attribute key="weight" value="100" /> <attribute key="slotType" value="feet" /> </item> Créditos Deadpool (por desenvolver e postar em outro fórum) Eu (por trazer ao fórum)
  15. Adicionando novas RAÇAS!

    Unknown Beats reagiu a Byte por uma resposta no tópico

    1 ponto
    Olá pessoal, estive reparando que varias pessoas estão a procura de como criar uma nova raça no Tibia além das normais (fire, venom e undead), então estarei postando o método de como criar uma nova raça. 1 - No arquivo const.h procure por: enum TextColor_t { 1.2 - E coloque isso abaixo: TEXTCOLOR_NOVARACE = 5, 2 - Agora no arquivo enums.h procure por: enum RaceType_t{ RACE_NONE = 0, RACE_VENOM, RACE_BLOOD, RACE_UNDEAD, RACE_FIRE, RACE_ENERGY, 2.1 - E coloque isso abaixo de RACE_ENERGY: RACE_NOVARACE = 6, 3 - Em monster.cpp agora procure por isso: if(readXMLString(root, "race", strValue)){ std::string tmpStrValue = asLowerCaseString(strValue); if(tmpStrValue == "venom" || atoi(strValue.c_str()) == 1) mType->race = RACE_VENOM; else if(tmpStrValue == "blood" || atoi(strValue.c_str()) == 2) mType->race = RACE_BLOOD; else if(tmpStrValue == "undead" || atoi(strValue.c_str()) == 3) mType->race = RACE_UNDEAD; else if(tmpStrValue == "fire" || atoi(strValue.c_str()) == 4) mType->race = RACE_FIRE; else if(tmpStrValue == "energy" || atoi(strValue.c_str()) == 5) mType->race = RACE_ENERGY; 3.1 - Agora coloque isso abaixo de mType->race = RACE_ENERGY; else if(tmpStrValue == "NOVARACE" || atoi(strValue.c_str()) == 6) mType->race = RACE_NOVARACE; 4 - Agora em game.cpp procure por: case RACE_BLOOD:textColor = TEXTCOLOR_RED; magicEffect = MAGIC_EFFECT_DRAW_BLOOD; splash = Item::CreateItem(ITEM_SMALLSPLASH, FLUID_BLOOD); break; 4.1 - Agora coloque isso abaixo: case RACE_NOVARACE:textColor = TEXTCOLOR_NOVARACE; magicEffect = MAGIC_EFFECT_DRAW_BLOOD; splash = Item::CreateItem(ITEM_SMALLSPLASH, FLUID_BLOOD); break; Pronto você tem uma nova raça agora no seu servidor!
  16. Comando !rank não pega

    Lincoln123123 reagiu a Ghur por uma resposta no tópico

    1 ponto
    Ja tentei e não deu certo. De qualquer maneira, obrigado por tentar ajudar Ele da esse erro aqui no distro: [6/7/2014 19:21:29] [Error - TalkAction Interface] [6/7/2014 19:21:29] data/talkactions/scripts/ranks.lua:onSay [6/7/2014 19:21:29] Description: [6/7/2014 19:21:29] data/talkactions/scripts/ranks.lua:21: attempt to call global 'getHighscoreString' (a nil value) [6/7/2014 19:21:29] stack traceback: [6/7/2014 19:21:29] data/talkactions/scripts/ranks.lua:21: in function <data/talkactions/scripts/ranks.lua:17> Consegui resolver, para quem ta com o mesmo erro, o script que deu certo aqui foi function getPlayerNameByGUID2(n) local c = db.getResult("SELECT `name` FROM `players` WHERE `id` = "..n..";") if c:getID() == -1 then return "SQL_ERROR["..n.."]" end return c:getDataString("name") end function onSay(cid, words, param) local max = 20 local letters_to_next = 20 local skills = { ['fist'] = 0, ['club'] = 1, ['sword'] = 2, ['axe'] = 3, ['distance'] = 4, ['shielding'] = 5, ['fishing'] = 6, ['dist'] = 4, ['shield'] = 5, ['fish'] = 6, } local name_now local name = "Highscore for level\n" local rkn = 0 local no_break = 0 param = string.lower(param) dofile('config.lua') if param == "" or param == "level" and ( param ~= "magic" and param == "ml") and skills[param] == nil then name = name.."\n" name = name.."Rank Level - Nome do Jogador\n" local v = db.getResult("SELECT `name`, `level`, `experience` FROM `players` WHERE `group_id` <= 2 ORDER BY `experience` DESC LIMIT 0,"..(max)..";") repeat no_break = no_break +1 if v:getID() == -1 then break end rkn = rkn+1 name_now, l = v:getDataString("name"), string.len(v:getDataString("name")) space = "" for i=1, letters_to_next-l do space = space.." " end name = name..rkn..". "..v:getDataInt("level") .." - "..name_now..space.." ".."\n" if no_break >= 20 then break end until v:next() == false elseif param == "magic" or param == "ml" then name = name.."\n" name = name.."Rank Magic - Nome do Jogador\n" local v = db.getResult("SELECT `name`, `level`, `maglevel` FROM `players` WHERE `group_id` <= 2 ORDER BY `maglevel` DESC LIMIT 0,"..(max)..";") repeat if v:getID() == -1 then break end rkn = rkn+1 name_now, l = v:getDataString("name"), string.len(v:getDataString("name")) space = "" for i=1, letters_to_next-l do space = space.." " end name = name..rkn..". "..v:getDataInt("maglevel").." - "..name_now..space.." ".." ".."".."\n" until v:next() == false elseif param == "reset" or param == "resets" then name = name.."\n" name = name.."Rank Reset - Nome do Jogador\n" local v = db.getResult("SELECT `player_id`, `value` FROM `player_storage` WHERE `key` = 36874 ORDER BY cast(value as INTEGER) DESC;") local kk = 0 repeat if kk == max or v:getID() == -1 then break end kk = kk+1 name_now, l = getPlayerNameByGUID2(v:getDataInt("player_id")), string.len(getPlayerNameByGUID2(v:getDataInt("player_id"))) space = "" for i=1, letters_to_next-l do space = space.." " end if name_now == nil then name_now = 'sql error['..v:getDataInt("player_id")..']' end name = name..kk..". "..v:getDataInt("value").." - "..name_now..space.." \n" until v:next() == false elseif skills[param] ~= nil then name = name.."\n" name = name.."Rank "..param.." fighting - Nome do Jogador\n" local v = db.getResult("SELECT `player_id`, `value` FROM `player_skills` WHERE `skillid` = "..skills[param].." ORDER BY `value` DESC;") local kk = 0 repeat if kk == max or v:getID() == -1 then break end kk = kk+1 name_now, l = getPlayerNameByGUID2(v:getDataInt("player_id")), string.len(getPlayerNameByGUID2(v:getDataInt("player_id"))) space = "" for i=1, letters_to_next-l do space = space.." " end if name_now == nil then name_now = 'sql error['..v:getDataInt("player_id")..']' end name = name..kk..". "..v:getDataInt("value").." - "..name_now..space.." \n" until v:next() == false end if name ~= "Highscore\n" then doPlayerPopupFYI(cid, name) end return TRUE end
Líderes está configurado para São Paulo/GMT-03:00

Informação Importante

Confirmação de Termo