Blazera 8.60
blazera.net
SOBRE O BLAZERA
Um fresh start em um servidor 8.6 clássico, com real map, focado na experiência raiz do Tibia. | Classic Real Map • Fresh Start • Client 8.6 • Old School Gameplay • Active Community
Inicia em:
--
Participar
Histórico de Curtidas
-
d0gw4r deu reputação a Pedriinz em Auto Loot Sytem for TFS 1.3 + revscriptsDepois 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~
-
d0gw4r deu reputação a Pedriinz em Auto Loot Sytem for TFS 1.3 + revscriptsYo!
Acabei de realizar algumas atualizações no código. As mudanças foram:
Junção de todos os scripts LUA em um só, resultando em um único comando para administrar o sistema de autoloot.
Exemplo:
!autoloot add, boots of haste !autoloot remove, boots of haste !autoloot list !autoloot
Também adicionei algumas verificações no script para que o mesmo não seja executado caso o personagem não tenha nenhum item adicionado a lista de autoloot. (optimização). Verificação de capacidade também está aqui agora, caso o personagem não tenha mais que 100 de cap uma mensagem é retornada para o player informando que não foi possível saquear aquele loot devida a mesma. (No futuro talvez eu deixe isso configurável pelo config.lua).
Cheers
-
d0gw4r deu reputação a lordzetros em (Resolvido)Talkaction, comando /B (broadcast) não funcionando!É porque ele tá entrando na primeira condição, do flag. Caso seja tfs 1.3, deixe seu código atualizo com as funções da versão atual, ficando desta forma:
function onSay(player, words, param) if not (player:hasFlag(PlayerFlag_CanBroadcast)) then return true end print("> " .. player:getName() .. " broadcasted: \"" .. param .. "\".") for _, targetPlayer in ipairs(Game.getPlayers()) do targetPlayer:sendPrivateMessage(player, param, TALKTYPE_BROADCAST) end return false end Caso não resolva, verifique se sua conta do player que está utilizando o comando tem acesso necessário, experimente colocar type 5. (sua database -> accounts -> conta_escolhida: type 5), desta forma:
Caso não queira setar o nível de acesso da conta, pode modificar o script deixando desta forma:
local nivel_acesso = 2 -- ID dos GMs nas novas versoes function onSay(player, words, param) if not (player:getGroup():getId() >= nivel_acesso) then return true end print("> " .. player:getName() .. " broadcasted: \"" .. param .. "\".") for _, targetPlayer in ipairs(Game.getPlayers()) do targetPlayer:sendPrivateMessage(player, param, TALKTYPE_BROADCAST) end return false end Modifique o nível de acesso, no caso tá 2 porque é GM (versão atual 1.3). Caso queira outro ID, modifique ali a variável 'nivel_acesso'.
-
d0gw4r deu reputação a lordzetros em Acesso aos mechanism dos Quarters de YalaharErro de formatação, muito comum quando copiamos códigos de sites/fóruns e colamos no arquivo.
Segue anexo:
login.lua
-
d0gw4r deu reputação a lordzetros em Acesso aos mechanism dos Quarters de YalaharJá tentou printar se está entrando no condicional do login?
-
d0gw4r deu reputação a vankk em Liberar as missões das QuestsAdiciona no login.lua
local storageValue = { {12130, 1}, {12131, 2}, {12132, 3} } for i = 1, #storageValue do local k = player:getStorageValue(i[1]) if (k < 1 or (i[2] ~= nil and k ~= i[2])) then player:setStorageValue(i[1], i[2] and i[2] or 1) end end
Edita os storageValues, e boa sorte.
-
d0gw4r deu reputação a vankk em Liberar as missões das QuestsNão, depende, você não precisa adicionar todos manualmente, vai depender da Storage para a liberação de uma Quest. Em Storages do global da ORTS possui várias storages dentro da Lib de Storages, você deve pegar a que garanta o acesso final e utilizar, ou então, caso não saiba, você pode adicionar todas as Storages também. Esse código você deve adicionar no login.lua.
-
d0gw4r deu reputação a Pedro. em Thora Layout CompletoEstou trazendo o layout do ThoraOT, foi disponibilizado em outro fórum cheio de erros, faltando várias coisas e como estou aprendendo php, entrando nesse ritmo quis da uma mexida nele e tô trazendo para vocês.
Fixes;
Fixado Players Online 100% Fixado Top Guilds 100% Fixado Powergamers 100%
Added;
Adicionado versão mais recente do boostrap Adicionado Cast System Page Adicionado Glyphicons Reformulada pagina de Characters. Reformulada Suporte Team (com funções) Adicionado World Map (passar o mouse no mapa e aparecer informações)
Screens:
Antes:
DEPOIS:
Vou adicionar créditos ao membro que disponibilizou o layout.
Tabela para o a pagina de Suporte.
ALTER TABLE `players` ADD `function` VARCHAR(100) NOT NULL DEFAULT '';
Download: http://www.mediafire.com/file/9zsn7l3xzas5v8x/Thora Layout.rar
Scan: https://www.virustotal.com/#/file-analysis/OTUyM2RlZDIwZjFmOWZjNjRjMGE0YTNjYWRkMzA2YjI6MTUyNDE2NzI1NA==