• TibiaFace

    Tibiaface | Una comunidad Open Tibia donde encontras : mapas, scripts, Otserver, npc y amigos etc ...

    .
    demo menumenu

    Afiliados



    Votar:

    [Codigo] Auto Loot System for TFS 1.3

    Compartir:

    Ver el tema anterior Ver el tema siguiente Ir abajo  Mensaje (Página 1 de 1.)

    1default [Codigo] Auto Loot System for TFS 1.3 el Lun Oct 21, 2019 8:38 pm

    [Admin] God Maya

    [Admin] God Maya
    Administrador
    Administrador

    Auto Loot System for TFS 1.3

    [Codigo] Auto Loot System for TFS 1.3 Autolo10

    ¿Cómo funciona?
    Simple, cuando matas a algún monstruo y abres el cadáver (necesitas hacer clic en el cadáver para saquear) y los elementos van para tu personaje.

    [Codigo] Auto Loot System for TFS 1.3 Autolo10

    Instalacion:
    en actions.cpp, Buscar:

    Código:


    if (corpseOwner != 0 && !player->canOpenCorpse(corpseOwner)) {
        return RETURNVALUE_YOUARENOTTHEOWNER;
    }

    y cámbielo por:

    Código:

    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)");
            }
        }
    }

    En player.h, Abajo de esta linea

    Código:

    std::unordered_set<uint32_t> VIPList;

    agregar esto:

    Código:

    std::set<uint32_t> autoLootList;

    abajo de esta liena:

    Código:

    bool hasLearnedInstantSpell(const std::string& spellName) const;

    agregar:

    Código:

    void addItemToAutoLoot(uint16_t itemId);
    void removeItemFromAutoLoot(uint16_t itemId);
    bool getItemFromAutoLoot(uint16_t itemId);

    En player.cpp, al final... añadir

    Código:

    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();
    }


    En luascript.cpp, Buscar:

    Código:

    registerMethod("Player", "getFightMode", LuaScriptInterface::luaPlayerGetFightMode);

    agregar esto abajo:

    Código:

    registerMethod("Player", "addItemToAutoLoot", LuaScriptInterface::luaPlayerAddItemToAutoLoot);
    registerMethod("Player", "removeItemFromAutoLoot", LuaScriptInterface::luaPlayerRemoveItemFromAutoLoot);
    registerMethod("Player", "getItemFromAutoLoot", LuaScriptInterface::luaPlayerGetItemFromAutoLoot);
    registerMethod("Player", "getAutoLootList", LuaScriptInterface::luaPlayerGetAutoLootList);

    buscar esta funcion:


    Código:

    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;
    }

    debajo de toda esta función, agregue:

    Código:

    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;
    }

    En luascript.h, Buscar:

    Código:
    static int luaPlayerGetFightMode(lua_State* L);

    Añadir abajo:

    Código:

    static int luaPlayerAddItemToAutoLoot(lua_State* L);
    static int luaPlayerRemoveItemFromAutoLoot(lua_State* L);
    static int luaPlayerGetItemFromAutoLoot(lua_State* L);
    static int luaPlayerGetAutoLootList(lua_State* L);

    Y en iologindata.cpp, buscar:

    Código:

        //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());
        }

    Añadir:

    Código:

    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);
            }
        }

    Y por encima de esto:
    Código:

    //save inbox items

    añadir esto:

    Código:

     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;
        }

    ahora, vaya a su base de datos y ejecute esta consulta:

    Código:

    CREATE TABLE player_autoloot (
        id int NOT NULL AUTO_INCREMENT,
        player_id int NOT NULL,
        autoloot_list blob,
        PRIMARY KEY (id)
    );

    data/scripts/talkactions y crear un nuevo archivo:

    Código:

    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()

    Código:
    <talkaction words="!autoloot" script="bless.lua"/>   

    creditos:

    Delusion

    psychonaut

    login12




    [Codigo] Auto Loot System for TFS 1.3 YNU5B25
    https://www.tibiaface.com

    Ver el tema anterior Ver el tema siguiente Volver arriba  Mensaje (Página 1 de 1.)

    Permisos de este foro:
    No puedes responder a temas en este foro.

     

    BienvenidosTibiaFace es una comunidad de Open Tibia. Para participar debes estar registrado (click para Regístrate).