• TibiaFace

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

    .
    demo menumenu

    Afiliados



    Votar:

    [Function] Funcion auxiliar || doAddContainerItem

    Compartir:

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

    [Adm] SevuOT

    [Adm] SevuOT
    Miembro
    Miembro
    Esta funcion ya viene incluida en las fuentes por defecto, sin embargo si tu necesitas cambiarla o modificarla usando una funcion auxiliar, aqui esta su solucion.

    TFS 1.x+
    Código:
    function doAddContainerItem(uid, itemId, count)
     local container = Container(uid)
     if not container then
     error("LUA_ERROR_CONTAINER_NOT_FOUND")
     return false
     end
     local itemType = ItemType(itemId)
     local itemCount = 1
     local subType = 1
     local count = count or 1
     if itemType:isStackable() then
     itemCount = math.ceil(count / 100)
     subType = count
     else
     itemCount = math.max(1, count)
     end

     while itemCount > 0 do
     local stackCount = math.min(100, subType)
     local newItem = Game.createItem(itemId, stackCount)
     if not newItem then
     error("LUA_ERROR_ITEM_NOT_FOUND")
     return false
     end

     if itemType:isStackable() then
     subType = subType - stackCount
     end

     local ret = container:addItemEx(newItem)
     if not ret then
     newItem:remove()
     return false
     end

     itemCount = itemCount - 1
     if itemCount == 0 then
     if newItem:getParent() then
     return newItem:getUniqueId()
     else
     --stackable item stacked with existing object, newItem will be released
     return false
     end
     end
     end
     return false
    end

    Para TFS menores:
    Código:
    function doAddContainerItem(uid, itemId, count)
       local container = isContainer(uid)
       if not container then
          error("LUA_ERROR_CONTAINER_NOT_FOUND")
          return false
       end
       local itemType = getItemInfo(itemId)
       local itemCount = 1
       local subType = 1
       local count = count or 1
       if itemType.stackable then
          itemCount = math.ceil(count / 100)
          subType = count
       else
          itemCount = math.max(1, count)
       end

       while itemCount > 0 do
          local stackCount = math.min(100, subType)
          local newItem = doCreateItemEx(itemId, stackCount)
          if not newItem then
             error("LUA_ERROR_ITEM_NOT_FOUND")
             return false
          end

          if itemType.stackable then
             subType = subType - stackCount
          end

          local ret = doAddContainerItemEx(uid, newItem)
          if not ret then
             doRemoveItem(newItem)
             return false
          end

          itemCount = itemCount - 1
          if itemCount == 0 then
             if getItemParent(newItem) then
                return newItem
             else
                --stackable item stacked with existing object, newItem will be released
                return false
             end
          end
       end
       return false
    end



    Última edición por [Adm] SevuOT el Vie Dic 21, 2018 1:22 pm, editado 1 vez



    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.


    [Function] Funcion auxiliar || doAddContainerItem TRJEB8aSRYK5IulEU6ilJw
    2 participantes

    [Admin] God Maya

    [Admin] God Maya
    Administrador
    Administrador
    excelente pero esta funcion es referida a los tfs 1.x

    sera que prodrias recrearla para tfs menores

    Código:

    int LuaScriptInterface::luaDoAddContainerItem(lua_State *L)
    {
       //doAddContainerItem(uid, itemid, <optional> count/subtype)
       int32_t parameters = lua_gettop(L);

       uint32_t count = 1;
       if(parameters > 2){
          count = popNumber(L);
       }

       uint16_t itemId = (uint16_t)popNumber(L);
       uint32_t uid = popNumber(L);

       ScriptEnviroment* env = getScriptEnv();
       Container* container = env->getContainerByUID(uid);
       if(!container){
          reportErrorFunc(getErrorDesc(LUA_ERROR_CONTAINER_NOT_FOUND));
          lua_pushboolean(L, false);
          return 1;
       }

       const ItemType& it = Item::items[itemId];

       int32_t itemCount = 1;
       int32_t subType = 1;

       if(it.hasSubType()){

          if(it.stackable){
             itemCount = (int32_t)std::ceil((float)count / 100);
          }

          subType = count;
       }
       else{
          itemCount = std::max((int32_t)1, (int32_t)count);
       }

       while(itemCount > 0){
          int32_t stackCount = std::min((int32_t)100, (int32_t)subType);
          Item* newItem = Item::CreateItem(itemId, stackCount);

          if(!newItem){
             reportErrorFunc(getErrorDesc(LUA_ERROR_ITEM_NOT_FOUND));
             lua_pushboolean(L, false);
             return 1;
          }

          if(it.stackable){
             subType -= stackCount;
          }
          ReturnValue ret = g_game.internalAddItem(container, newItem);

          if(ret != RET_NOERROR){
             delete newItem;
             lua_pushboolean(L, false);
             return 1;
          }

          --itemCount;
          if(itemCount == 0){
             if(newItem->getParent()){
                uint32_t uid = env->addThing(newItem);
                lua_pushnumber(L, uid);
                return 1;
             }
             else{
                //stackable item stacked with existing object, newItem will be released
                lua_pushnumber(L, 0);
                return 1;
             }
          }
       }

       lua_pushnumber(L, 0);
       return 1;
    }



    [Function] Funcion auxiliar || doAddContainerItem YNU5B25
    2 participantes
    http://www.tibiaface.com

    [Adm] SevuOT

    [Adm] SevuOT
    Miembro
    Miembro
    Ya esta para TFS menores tambien: http://www.tibiaface.com/t3909-function-funcion-auxiliar-doaddcontaineritem



    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.


    [Function] Funcion auxiliar || doAddContainerItem TRJEB8aSRYK5IulEU6ilJw
    2 participantes

    Contenido patrocinado


    2 participantes

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