• TibiaFace

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

    .
    demo menumenu

    Afiliados



    Votar:

    [Codigo] C++ Algunos arreglos a 1.5 8.00 o 7.72

    Compartir:

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

    samsung123

    samsung123
    Miembro
    Miembro
    Post improvisado para versión 1.5 Downgrades8.00 o 7.72
    son versiones mas olvidadas en comparación de 8.60 github


     Repositorio :
    [Tienes que estar registrado y conectado para ver este vínculo]




    TEMARIO escribió:1.- Monster se mueven con delay al perseguir a un player
    2.- HP y Mana a porcentaje.
    3.- Push Delay a players:
    4.- Quitar Mensaje del Emote_Spells
    5.- Reemplazar first skill por attack speed skill.
    6.- Bug Cliente visualiza que tiene premium , cuando no es asi
    7.- BUG: Mensaje a todo los spectadores 100 loses player1 due to your attack.
    8.- Quitar full mana y hp al subir level
    9.- Quitar Corpses no puedes abrirlo porque no eres el dueño
    10. Agregar en config.lua configuración del pvp experiencia
    12.- Delay rango
    13.- Item que se encuentran en el piso pueden ser remplazado con los item que tienes en tu inventario
    14 .- Clonacion de item en el dp
    15 .- FIX Si tienes el security mode off entonces el AOE  NO obtienes skull white y NO generas daño








    1.- Monster se mueven con delay al perseguir a un player



    Solución:


    creature.cpp
       
    Código:
        if (hasFollowPath) {
                isUpdatingPath = true;

            }


    remplazar por

    Código:
         if (hasFollowPath) {
                isUpdatingPath = false;
                g_dispatcher.addTask(createTask(std::bind(&Game::updateCreatureWalk, &g_game, getID())));
            }

    Creditos: https://otland.net/threads/weird-monster-behaviour-in-tfs-1-1.228021/










    2.- HP y Mana a porcentaje.

    los clientes tienen un limite de aproximadamente 65.999 de visualización. en los server de alta experiencia o custom . para arreglar esto es mejor usar hp y mana en porcentaje.


    Solucion: protocolgame.cpp 


    1/2


    Código:
       msg.add<uint16_t>(std::min<int32_t>(player->getHealth(), std::numeric_limits<uint16_t>::max()));
        msg.add<uint16_t>(std::min<int32_t>(player->getMaxHealth(), std::numeric_limits<uint16_t>::max()));

    remplazar por

    Código:
       if (player->getMaxHealth() > 0)
        {
            msg.add<uint16_t>(std::min<int32_t>(player->getHealth() * 100 / player->getMaxHealth(), std::numeric_limits<uint16_t>::max()));
            msg.add<uint16_t>(100);
        }
        else
        {
            msg.add<uint16_t>(0);
            msg.add<uint16_t>(0);
        }

    2/2

    Código:
       msg.add<uint16_t>(std::min<int32_t>(player->getMana(), std::numeric_limits<uint16_t>::max()));
        msg.add<uint16_t>(std::min<int32_t>(player->getMaxMana(), std::numeric_limits<uint16_t>::max()));

    remplazar por 

    Código:
       if (player->getMaxMana() > 0)
        {
            msg.add<uint16_t>(std::min<int32_t>(player->getMana() * 100 / player->getMaxMana(), std::numeric_limits<uint16_t>::max()));
            msg.add<uint16_t>(100);
        }
        else
        {
            msg.add<uint16_t>(0);
            msg.add<uint16_t>(0);
        }

    Creditos : https://otland.net/threads/health-and-mana-percent-tfs-1-2.259246/








    3.- Push Delay a players:


    Game.h

    Código:
    static constexpr int32_t MOVE_CREATURE_INTERVAL = 1000;
    static constexpr int32_t RANGE_MOVE_CREATURE_INTERVAL = 1500;

    Remplazar por

    Código:
    static constexpr int32_t MOVE_CREATURE_INTERVAL = 250;
    static constexpr int32_t RANGE_MOVE_CREATURE_INTERVAL = 250;


    Números son los milisegundos del delay push

    Creditos : no me acuerdo.









    4.- Quitar Mensaje del Emote_Spells


    game.ccp 

    Código:
    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);
     }
     Remplazar a

    Código:
    if (result == TALKACTION_BREAK) {
     if (!g_config.getBoolean(ConfigManager::EMOTE_SPELLS)) {
     return true;
     } else {
     return true;
     }

    Creditos: M0stafa otland.net












    5.- Reemplazar first skill por attack speed skill.


    player.cpp

    Código:
    uint32_t Player::getAttackSpeed() const
    {
     const Item* weapon = getWeapon(true);
     if (!weapon || weapon->getAttackSpeed() == 0) {
     return vocation->getAttackSpeed();
     }

     return weapon->getAttackSpeed();
    }


    Reemplazarlo por:

    Código:
    uint32_t Player::getAttackSpeed() const
    {
     uint32_t extraSpeed = getSkillLevel(SKILL_FIST) * 10;
     const Item* weapon = getWeapon(true);

     if (!weapon || weapon->getAttackSpeed() == 0) {
     return (vocation->getAttackSpeed() - extraSpeed);
     }

     return (weapon->getAttackSpeed() - extraSpeed);
    }

    Creditos : no me acuerdo











    6.- Bug Cliente visualiza que tiene premium , cuando no es asi

    protocollogin.cpp



    Código:
    if (g_config.getBoolean(ConfigManager::FREE_PREMIUM)) {
     output->add<uint16_t>(0xFFFF); //client displays free premium
     } else {
     output->add<uint16_t>((account.premiumEndsAt - time(nullptr)) / 86400);

     }


    remplazalo por 

    Código:
    if (g_config.getBoolean(ConfigManager::FREE_PREMIUM)) {
     output->add<uint16_t>(0xFFFF); //client displays free premium
     } else {
     output->add<uint16_t>(std::max<time_t>(0, account.premiumEndsAt - time(nullptr)) / 86400);
     }











    7.- BUG: Mensaje a todo los spectadores 100 loses player1 due to your attack.



    Ejemplo En mitad de city , 2 jugadores están atacándose.
    y a TODOS los playera que están en templo les aparece este mensaje.
    (que les interesa a 20 player que estan en city cuanto se atacan ellos 2) mucho spam en el chat


    server escribió:100 loses player1 due to your attack.

    Game.cpp
    1/2

    Código:
    if (tmpPlayer == attackerPlayer && attackerPlayer != targetPlayer) {
     //message.type = MESSAGE_DAMAGE_DEALT;
     message.type = MESSAGE_EVENT_DEFAULT;
     message.text = fmt::format("{:s} loses {:s} due to your attack.", target->getNameDescription(), damageString);
     
     message.text[0] = std::toupper(message.text[0]);
     } else if (tmpPlayer == targetPlayer) {
     //message.type = MESSAGE_DAMAGE_RECEIVED;
     message.type = MESSAGE_EVENT_DEFAULT;
     if (!attacker) {
     message.text = fmt::format("You lose {:s}.", damageString);
     } else if (targetPlayer == attackerPlayer) {
     message.text = fmt::format("You lose {:s} due to your own attack.", damageString);
      
     } else {
     message.text = fmt::format("You lose {:s} due to an attack by {:s}.", damageString, attacker->getNameDescription());
     }
     } else {
     //message.type = MESSAGE_DAMAGE_OTHERS;
     message.type = MESSAGE_EVENT_DEFAULT;
     if (spectatorMessage.empty()) {
     if (!attacker) {
     spectatorMessage = fmt::format("{:s} loses {:s}.", target->getNameDescription(), damageString);
     } else if (attacker == target) {
     spectatorMessage = fmt::format("{:s} loses {:s} due to {:s} own attack.", target->getNameDescription(), damageString, targetPlayer ? (targetPlayer->getSex() == PLAYERSEX_FEMALE ? "her" : "his") : "its");
     } else {
     spectatorMessage = fmt::format("{:s} loses {:s} due to an attack by {:s}.", target->getNameDescription(), damageString, attacker->getNameDescription());
     }
     spectatorMessage[0] = std::toupper(spectatorMessage[0]);
     }
     message.text = spectatorMessage;
     }
     tmpPlayer->sendTextMessage(message);
     tmpPlayer->sendColoredText(coloredText);
     }
     }

    Remplazarlo por


    Código:
    if (tmpPlayer == attackerPlayer && attackerPlayer != targetPlayer) {
     //message.type = MESSAGE_DAMAGE_DEALT;
     message.type = MESSAGE_EVENT_DEFAULT;
     message.text = fmt::format("{:s} loses {:s} due to your attack.", target->getNameDescription(), damageString);
     tmpPlayer->sendTextMessage(message);
     message.text[0] = std::toupper(message.text[0]);
     } else if (tmpPlayer == targetPlayer) {
     //message.type = MESSAGE_DAMAGE_RECEIVED;
     message.type = MESSAGE_EVENT_DEFAULT;
     if (!attacker) {
     message.text = fmt::format("You lose {:s}.", damageString);
     } else if (targetPlayer == attackerPlayer) {
     message.text = fmt::format("You lose {:s} due to your own attack.", damageString);
     tmpPlayer->sendTextMessage(message);
     } else {
     
      
     
     
      
     
      
      
      
      
      
      
      
      
     }
     
     }
     
     tmpPlayer->sendColoredText(coloredText);
     }
     }

    Se requiere mas testeo. porque lo hice yo xd




    2/2 MANA "You were healed for xxxxx  hitpoints."


    Código:
    map.getSpectators(spectators, targetPos, false, true);
     for (Creature* spectator : spectators) {
     Player* tmpPlayer = spectator->getPlayer();
     if (tmpPlayer == attackerPlayer && attackerPlayer != targetPlayer) {
     //message.type = MESSAGE_HEALED;
     message.type = MESSAGE_EVENT_DEFAULT;
     message.text = fmt::format("You heal {:s} for {:s}.", target->getNameDescription(), damageString);
     } else if (tmpPlayer == targetPlayer) {
     //message.type = MESSAGE_HEALED;
     message.type = MESSAGE_EVENT_DEFAULT;
     if (!attacker) {
     message.text = fmt::format("You were healed for {:s}.", damageString);
     } else if (targetPlayer == attackerPlayer) {
     message.text = fmt::format("You healed yourself for {:s}.", damageString);
     } else {
     message.text = fmt::format("You were healed by {:s} for {:s}.", attacker->getNameDescription(), damageString);
     }
     } else {
     //message.type = MESSAGE_HEALED_OTHERS;
     message.type = MESSAGE_EVENT_DEFAULT;
     if (spectatorMessage.empty()) {
     if (!attacker) {
     spectatorMessage = fmt::format("{:s} was healed for {:s}.", target->getNameDescription(), damageString);
     } else if (attacker == target) {
     spectatorMessage = fmt::format("{:s} healed {:s}self for {:s}.", attacker->getNameDescription(), targetPlayer ? (targetPlayer->getSex() == PLAYERSEX_FEMALE ? "her" : "him") : "it", damageString);
     } else {
     spectatorMessage = fmt::format("{:s} healed {:s} for {:s}.", attacker->getNameDescription(), target->getNameDescription(), damageString);
     }
     spectatorMessage[0] = std::toupper(spectatorMessage[0]);
     }
     message.text = spectatorMessage;
     }
     tmpPlayer->sendTextMessage(message);
     }
     }

    Remplazar por

    Código:
    map.getSpectators(spectators, targetPos, false, true);
     for (Creature* spectator : spectators) {
     Player* tmpPlayer = spectator->getPlayer();
     if (tmpPlayer == attackerPlayer && attackerPlayer != targetPlayer) {
     //message.type = MESSAGE_HEALED;
     message.type = MESSAGE_EVENT_DEFAULT;
     message.text = fmt::format("You heal {:s} for {:s}.", target->getNameDescription(), damageString);
     } else if (tmpPlayer == targetPlayer) {
     //message.type = MESSAGE_HEALED;
     message.type = MESSAGE_EVENT_DEFAULT;
     if (!attacker) {
     message.text = fmt::format("You were healed for {:s}.", damageString);
     tmpPlayer->sendTextMessage(message);
     } else if (targetPlayer == attackerPlayer) {
     message.text = fmt::format("You healed yourself for {:s}.", damageString);
     
     } else {
     
     }
     }
     
     
     }
     }





    8.- Quitar full mana y hp al subir level


    player.cpp, search

    Código:
    if (prevLevel != level)

    remove

    Código:
    health = getMaxHealth();

    mana = getMaxMana();



    and search

    Código:
    if (oldLevel != level)

    remove

    Código:
    health = getMaxHealth();

    mana = getMaxMana();

    creditos: Ramon Bernardo otland







    9.- Quitar Corpses no puedes abrirlo porque no eres el dueño

    actions.cpp

    Eliminar esta línea
    Código:
    uint32_t corpseOwner = container->getCorpseOwner();
     if (corpseOwner != 0 && !player->canOpenCorpse(corpseOwner)) {
     return RETURNVALUE_YOUARENOTTHEOWNER;
     }












    10. Agregar en config.lua configuración del pvp experiencia


    configmanager.h

    Below of:

    Código:
    EXP_FROM_PLAYERS_LEVEL_RANGE,

    Add:

    Código:
    EXP_FROM_PLAYERS_RATIO_PERCENT,

    ---

    configmanager.cpp

    Below of:

    Código:
    integer[EXP_FROM_PLAYERS_LEVEL_RANGE] = getGlobalNumber(L, "expFromPlayersLevelRange", 75);

    Add:

    Código:
    integer[EXP_FROM_PLAYERS_RATIO_PERCENT] = getGlobalNumber(L, "expFromPlayersRatioPercent", 75);

    ---

    luascript.cpp

    Below of:

    Código:
    registerEnumIn("configKeys", ConfigManager::EXP_FROM_PLAYERS_LEVEL_RANGE)

    Add:

    Código:
    registerEnumIn("configKeys", ConfigManager::EXP_FROM_PLAYERS_RATIO_PERCENT)

    ---

    player.cpp

    Overwrite this line:

    Código:
    return std::max<uint64_t>(0, std::floor(getLostExperience() * getDamageRatio(attacker) * 0.75));

    By this line:

    Código:
    return std::max<uint64_t>(0, std::floor(getLostExperience() * getDamageRatio(attacker) * (g_config.getNumber(ConfigManager::EXP_FROM_PLAYERS_RATIO_PERCENT) / 100.)));

    ---

    config.lua (if you want to commit it in your repository, put it also in config.lua.dist)

    Below of:

    Código:
    expFromPlayersLevelRange = 75

    Add:

    Código:
    expFromPlayersRatioPercent = 75

    ---

    Note: 75 means 75%.

    creditos : River KA otland.net


    12.- Delay rango
    Un player desde rango, al usar doors tiene un delay importante.
    o desde rango poner un item que esta en el piso a tu inventario. para arreglar esto editas en

    Game.h

    Código:
    static constexpr int32_t RANGE_MOVE_ITEM_INTERVAL = 100;
    static constexpr int32_t RANGE_USE_ITEM_INTERVAL = 100;
    static constexpr int32_t RANGE_USE_ITEM_EX_INTERVAL = 100;



    13.- Item que se encuentran en el piso pueden ser remplazado con los item que tienes en tu inventario
    player.cpp
    Código:
       //need an exchange with source? (destination item is swapped with currently moved item)
        const Item* inventoryItem = getInventoryItem(static_cast<slots_t>(index));
        if (inventoryItem && (!inventoryItem->isStackable() || inventoryItem->getID() != item->getID())) {
            const Cylinder* cylinder = item->getTopParent();
            if (cylinder && (dynamic_cast<const DepotChest*>(cylinder) || dynamic_cast<const Player*>(cylinder))) {
                return RETURNVALUE_NEEDEXCHANGE;
            }
            return RETURNVALUE_NOTENOUGHROOM;
        }

    Remplazar

    Código:
      //need an exchange with source? (destination item is swapped with currently moved item)
        const Item* inventoryItem = getInventoryItem(static_cast<slots_t>(index));
        if (inventoryItem && (!inventoryItem->isStackable() || inventoryItem->getID() != item->getID())) {
            const Cylinder* cylinder = item->getTopParent();
            if (cylinder) {
                return RETURNVALUE_NEEDEXCHANGE;
            }
            return RETURNVALUE_NOTENOUGHROOM;
    }


    14.- CLONACION ITEM EN DP a falta de codigo fix en src. un parche en items.xml


    item.xml 
    <attribute key="containerSize" value="0" />

    Código:
    <item id="2594" article="a" name="depot chest">
     <attribute key="slotType" value="backpack" />
     <attribute key="containerSize" value="0" />
     </item>





    NO USAR :getDepotItems(1)


    crear una nueva función   player:getDepotLocker(townId)

    Envia el item al locker y no al depot Chest


    luascript.cpp
    Código:
    registerMethod("Player", "getDepotLocker", LuaScriptInterface::luaPlayerGetDepotLocker);


    Código:
    int LuaScriptInterface::luaPlayerGetDepotLocker(lua_State* L)
    {
        // player:getDepotLocker(townId)
        Player* player = getUserdata<Player>(L, 1);
        if (!player) {
            lua_pushnil(L);
            return 1;
        }

        uint32_t townId = getNumber<uint32_t>(L, 2);
        Town* town = g_game.map.towns.getTown(townId);
        if (!town) {
            lua_pushnil(L);
            return 1;
        }

        DepotLocker* depotLocker = player->getDepotLocker(townId);
        if (depotLocker) {
            pushUserdata<Item>(L, depotLocker);
            setItemMetatable(L, -1, depotLocker);
        }
        else {
            pushBoolean(L, false);
        }

        return 1;
    }

    luascript.h
    Código:
    static int luaPlayerGetDepotLocker(lua_State* L);

    USO
    Código:
    local locker = player:getDepotLocker(winner:getTown():getId())
    if locker then
        locker:addItem(2160, 5, INDEX_WHEREEVER, FLAG_NOLIMIT) -- # item will be sent even if locker is full
    end



    Creditos: Roddet by discord


    14.- FIX Si tienes el security mode off entonces el AOE  NO obtienes skull white y NO generas daño
     
    data/scripts/

    Código:
        local ec = EventCallback
        
        function ec.onTargetCombat(creature, target)
            if creature:isPlayer() and target:isPlayer() then
                if creature:hasSecureMode()== true then

                return RETURNVALUE_YOUMAYNOTATTACKTHISPLAYER
                end
            end

            return RETURNVALUE_NOERROR
        end
        
        ec:register(1)

    15.- PVP . player puede entrar a zona pz si golpea a un player que le saco pk

    Si el server es pvp .
    player A saca skull black con player B

    player B puede atacar a player A , luego player B puede entrar a zona protect . por algun motivo el server no hace que el player b tenga pz lock

    para arreglar esto en player.cpp
    en la funcion
    Código:
    onAttackedCreature
    cambie

    Código:
     if (!pzLocked && g_game.getWorldType() == WORLD_TYPE_PVP_ENFORCE) {
    por
    Código:
    if (!pzLocked && g_game.getWorldType() == WORLD_TYPE_PVP) {

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