• 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

    2default Re: [Codigo] Auto Loot System for TFS 1.3 el Jue Nov 28, 2019 10:44 pm

    dazel169

    dazel169
    Miembro
    Miembro
    maya, en que parte puedo modificar el limite de items que se agregan?

    3default Re: [Codigo] Auto Loot System for TFS 1.3 el Vie Nov 29, 2019 2:25 pm

    [Admin] God Maya

    [Admin] God Maya
    Administrador
    Administrador
    [Tienes que estar registrado y conectado para ver este vínculo] escribió:maya, en que parte puedo modificar el limite de items que se agregan?

    hmmmmpor lo que veo no tiene abria que agragarle y hacer pruebas con el sistema instalado pero como no lo tengo y tampoco tengo el compilador se lo dejaria en sus manos



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

    4default Re: [Codigo] Auto Loot System for TFS 1.3 el Lun Dic 02, 2019 2:05 am

    [Adm] SevuOT

    [Adm] SevuOT
    Miembro
    Miembro
    [Tienes que estar registrado y conectado para ver este vínculo] escribió:maya, en que parte puedo modificar el limite de items que se agregan?

    Aquí esta el script talkaction con una pequeña modificación que hace que tenga un limite máximo, así ya no podrás seguir agregando mas items hasta que primero quites otros de la lista.
    Código:
    local talk = TalkAction("!autoloot")

    local autolootMaxItems = 10

    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
            if #i <= autolootMaxItems then
                player:sendCancelMessage(string.format("The max limit is %u items, you must first remove another one before continuing to add more.", autolootMaxItems))
                return false
            end
            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()



    Si necesitas hospedaje para tu servidor usa este enlace y mira los buenos planes de Windows y Linux:
    Si tu cuenta de PayPal no esta verificada no importara, igual aceptan pagos con cuentas no verificadas.


    [Codigo] Auto Loot System for TFS 1.3 TRJEB8aSRYK5IulEU6ilJw

    5default Re: [Codigo] Auto Loot System for TFS 1.3 el Sáb Dic 21, 2019 9:22 am

    heitor1

    heitor1
    Nuevo Miembro
    Nuevo Miembro
    In file included from /home/server/src/game.h:32:0,
    from /home/server/src/actions.cpp:28:
    /home/server/src/player.h:1466:8: error: ‘set’ in namespace ‘std’ does not name a template type
    std::set<uint32_t> autoLootList;
    ^~~
    /home/server/src/actions.cpp: In member function ‘ReturnValue Actions::internalUseItem(Player*, const Position&, uint8_t, Item*, bool)’:
    /home/server/src/actions.cpp:419:55: error: ‘class Player’ has no member named ‘autoLootList’
    if (player->canOpenCorpse(corpseOwner) && player->autoLootList.size() != 0) {

    6default Re: [Codigo] Auto Loot System for TFS 1.3 el Sáb Dic 21, 2019 9:49 am

    [Admin] God Maya

    [Admin] God Maya
    Administrador
    Administrador
    [Tienes que estar registrado y conectado para ver este vínculo] escribió:In file included from /home/server/src/game.h:32:0,
                    from /home/server/src/actions.cpp:28:
    /home/server/src/player.h:1466:8: error: ‘set’ in namespace ‘std’ does not name a template type
      std::set<uint32_t> autoLootList;
           ^~~
    /home/server/src/actions.cpp: In member function ‘ReturnValue Actions::internalUseItem(Player*, const Position&, uint8_t, Item*, bool)’:
    /home/server/src/actions.cpp:419:55: error: ‘class Player’ has no member named ‘autoLootList’
        if (player->canOpenCorpse(corpseOwner) && player->autoLootList.size() != 0) {


    todo el error es por que esto no esta agregado segun el error que nos muestra

    Código:
    std::set<uint32_t> autoLootList;



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

    Contenido patrocinado


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