Jump to content

nazox

Active Member
  • Posts

    170
  • Joined

  • Last visited

  • Feedback

    100%

Posts posted by nazox

  1. Thanks @ Malí for the system, you are incredible! and @ Owsap for the script, all work great!.

    .png

    (Forgot the names of NPC i don't translate that.)

    11 hours ago, kza54 said:

    Excuse me, I posted a thank you message here for access to the download links, and my post was deleted, may I know why? While in addition I have a problem with this system I don't even know if I have the right to post now.

    My problem with this system :
    In my client I added the "say(locale_quest(14188))" (Please excuse me in advance if it is written in French in my locale_quest.txt because I am French)

     

      Hide contents

    14188    Veuillez d'abord invoquer votre buffeuse.
    14189    Veuillez mettre le nom de votre choix.
    14190    Félicitations, votre nom de buff a changé.
    14191    Une erreur s'est produite. Veuillez réessayer..
    14196    Veuillez essayer un autre nom.
    14192    Buffi Dragon
    14193    Pouvoir du Dragon Buff
    14194    Buffi Vitesse du vent
    14195    Attaque renforcée de Buffi
    14197    Vous n'avez aucune compétence de buff pour avoir besoin d'une mise à niveau.
    14198    Veuillez sélectionner une compétence.

    Server side :

      Reveal hidden contents

    quest __buffi__ begin
        state start begin
            when 952006.use begin
                say_title(item_name(952006))
                say("")
                if pc.get_buffi_count() < 1 then
                    say(locale_quest(14188))
                    return
                end
                say(locale_quest(14189))

                local result = pc.set_buffi_name(tostring(input()))
                say_title(item_name(952006))
                say("")
                if result == 99 then
                    say(locale_quest(14190))
                    item.set_count(item.get_count()-1)
                elseif result == 0 then
                    say(locale_quest(14191))
                elseif result == 1 or result == 2 then
                    say(locale_quest(14196))
                end
            end
            function BuildSkillList()
                local skillIdxList = {164, 165, 166, 167}
                local skillNameList = {locale_quest(14192), locale_quest(14193), locale_quest(14194), locale_quest(14195)}
                local ret_vnum_list = {}
                local ret_name_list = {}
                table.foreach(skillIdxList, 
                function(i, skillIdx)
                local skillLevel = pc.get_skill_level(skillIdx)
                if skillLevel >= 30 and skillLevel < 40 then
                    table.insert(ret_vnum_list, skillIdx)
                    table.insert(ret_name_list, skillNameList[i])
                    end
                end)
                return {ret_vnum_list, ret_name_list}
            end

            when 952005.use begin
                if get_time() < pc.getqf("next_time_buffi") then
                    if pc.is_skill_book_no_delay() then
                        say_title(locale_quest(9913))
                        say(locale_quest(9935))
                        wait()
                    else
                        say_title(locale_quest(9913))
                        say(locale_quest(9936))
                        return
                    end
                end

                local result = __buffi__.BuildSkillList()

                local vnum_list = result[1]
                local name_list = result[2]
                
                say_title(item_name(952005))
                say("")

                if table.getn(vnum_list) == 0 then
                    say(locale_quest(14197))
                    return
                end

                say(locale_quest(14198))

                local menu_list = {}
                table.foreach(name_list, function(i, name) table.insert(menu_list, name) end)
                table.insert(menu_list, locale_quest(1117))
                local s=select_table(menu_list)
                if table.getn(menu_list) == s then
                    return
                end

                local skill_name=name_list[s]
                local skill_vnum=vnum_list[s]
                local skill_level = pc.get_skill_level(skill_vnum)
                local cur_alignment = pc.get_real_alignment()
                local need_alignment = 1000+500*(skill_level-30)

                say_title(locale_quest(9913))
                say(locale_quest(9942))

                if cur_alignment<-19000+need_alignment then
                    say_reward(locale_quest(9914))
                    return
                end

                if cur_alignment<0 then
                    say_reward(string.format(locale_quest(9915), need_alignment, need_alignment*2))
                    say_reward(locale_quest(9916))
                    need_alignment=need_alignment*2
                elseif cur_alignment<need_alignment then
                    say_reward(string.format(locale_quest(9917), need_alignment))
                    say_reward(locale_quest(9918))
                else
                    say_reward(string.format(locale_quest(9917), need_alignment))
                end

                local s= select(locale_quest(10065), locale_quest(10066))
                if s==2 then
                    return
                end

                if get_time() < pc.getqf("next_time_buffi") then
                    if pc.is_skill_book_no_delay() then
                        pc.remove_skill_book_no_delay()
                    else
                        say_title(locale_quest(9913))
                        return
                    end
                end

                pc.setqf("next_time_buffi", get_time() + time_hour_to_sec(number(8, 12)))        

                if need_alignment>0 then
                    if pc.count_item(952005) > 0 then
                        local title=string.format(locale_quest(9941), name_list[s])

                        if pc.learn_grand_master_skill(skill_vnum) then
                            pc.change_alignment(-need_alignment)
                            say_title(title)
                            say_reward(locale_quest(9923))
                            if 40 == pc.get_skill_level(skill_vnum) then
                                say(locale_quest(9925))
                                say(string.format(locale_quest(9926), name_list[s]))
                                say(locale_quest(9927))
                            else
                                say(locale_quest(9928))
                                say(string.format(locale_quest(9929), name_list[s], skill_level-30+1+1))
                            end
                            say_reward(locale_quest(9930))
                            say_reward(string.format(locale_quest(9931), need_alignment))
                        else
                            say_title(title)
                            say_reward(locale_quest(9932))
                            say(locale_quest(9933))
                            say_reward(locale_quest(9934))
                            pc.change_alignment(-number(need_alignment/3, need_alignment/2))
                        end
                        pc.remove_item(952005)
                    end
                end
            end
        end
    end

    InGame :

    https://metin2.download/picture/0DuFaN3XJ16kadvf7olS369rjWFQM533/.png

     

    Hello, you add in quest_functions:

    Spoiler

    locale_quest

    locale_string

    locale_in

    locale_mn

    locale_sn

    locale_psn

    locale_ox

    in questlib.lua:

    Spoiler

    -- @desc: function for locale quest converstion

    -- @ref: https://www.lua.org/pil/5.2.html

    -- @author: Owsap

    locale_quest = function(vnum, ...)

    local val = ""

    for i, v in ipairs(arg) do

    val = val .. tostring(string.format(";%s", v))

    end

    return string.format("[LC;%d%s]", vnum, val)

    end

     

    locale_string = function(vnum, ...)

    local val = ""

    for i, v in ipairs(arg) do

    val = val .. tostring(string.format(";%s", v))

    end

    return string.format("[LS;%d%s]", vnum, val)

    end

     

    locale_in = function(vnum)

    return string.format("[IN;%d]", vnum)

    end

     

    locale_mn = function(vnum)

    return string.format("[MN;%d]", vnum)

    end

     

    locale_sn = function(vnum)

    return string.format("[SN;%d]", vnum)

    end

     

    locale_psn = function(vnum)

    return string.format("[PSN;%d]", vnum)

    end

     

    locale_ox = function(vnum)

    return string.format("[LOX;%d]", vnum)

    end

    If even with this, you have this error, you can try the script that Owsap provided us, with which you can translate the translate.lua and not worry about the quests, since you will execute the corresponding LC according to the phrase for example "gameforge.metin2" in translate.lua would have something like "gameforge.metin2 = Hello" with the script it would become something like "gameforge.metin2 = [LC;01]" and within the game, it would execute the file "locale_quest 01 = Hello"  like the photo I posted in my post.

  2. 5 minutes ago, Marcos17 said:

    I can implement one or the other, apparently few or no one has managed to implement both.

    I can't try to fix all kingdoms because I can't work this system,  I think the problem for me is from DayType system because I have DayType NIGHT on BoundingSpherePosition but doesn't work. So sorry I can't help you with other kingdoms xD

  3. I have the same problem of the last time, in day and night the lantern is on, i try add with crc, without crc, reinstaling 10 times the system and reinstall the system DayType, compare with other guys from this post working but i can't, i try to add effect with World Editor but idk, any idea?, thanks. 🙂

  4. Hello again @ Owsap again thanks for the system work very great:

    fc6d205ac5ea8186b845c079bdd97ff4.gif

    But maybe people have a few problems, because don't have functions or like that.

    The first, you need to change certain functions as mentioned @Dominic. in Uicommon.py:

    Spoiler

    class QuestionDialog(ui.ScriptWindow): def GetTextSize(self): if self.textLine: return self.textLine.GetTextSize() return (0,0) def SetLineHeight(self, Height): self.textLine.SetLineHeight(Height)

    and uiEscapePopoup.py:

    Spoiler

    def __EscapePopupRangeCheck(self): SHOW_UI_WINDOW_LIMIT_RANGE = 1000 (x, y, z) = player.GetMainCharacterPosition() # if abs(x - self.escape_window_open_x) > player.SHOW_UI_WINDOW_LIMIT_RANGE or abs(y - self.escape_window_open_y) > player.SHOW_UI_WINDOW_LIMIT_RANGE: if abs(x - self.escape_window_open_x) > SHOW_UI_WINDOW_LIMIT_RANGE or abs(y - self.escape_window_open_y) > SHOW_UI_WINDOW_LIMIT_RANGE: chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.OPTION_ESCAPE_FAR_DISTANCE) self.Close()

    If you have the problem with 

    Spoiler

    net.SendCommandPacket("/escape")

    Change with:

    Spoiler

    net.SendChatPacket("/escape")

    If you lost some functions like (SetLineHeight, GetLineHeight, etc) you need add the system (or functions) from here:

     

    (you can use this version or @ Mali version).

    Thanks again :).

    • Love 1
  5. Thanks @ Owsap i'm fixing button, but work, nice released thanks!

    72ab56fbbb38c99dbb9714cf355fd310.gif

    edit1: if someone don't have 

    Quote

        def __del__(self):
            ui.ScriptWindow.__del__(self)
            if app.OWSAP_ESCAPE:
                del self.tooltip

    you cand add on def Destroy:

    Quote

        def Destroy(self):
            self.ClearDictionary()
            
            if self.gameOptionDlg:
                self.gameOptionDlg.Destroy()
                
            if self.systemOptionDlg:
                self.systemOptionDlg.Destroy()
           if app.OWSAP_ESCAPE:     
                 del self.tooltip

            self.__Initialize()

     

    • Love 1
  6. Hello @ Mali thanks for the system, and sorry to revive this, this is a little update to after use the command and the players are kicked, the account automaticaly have "BLOCK" on navicat

    Open ipban.cpp and replace function with:

    Spoiler

    #ifdef IP_BAN <--Change with your macro
    void do_ipban(LPCHARACTER ch, const char *argument, int cmd, int subcmd)
    {
        char arg1[256];
        one_argument(argument, arg1, sizeof(arg1));

        if (!*arg1) {
            ch->ChatPacket(CHAT_TYPE_INFO, "Uso: ipban <nombre>");
            return;
        }

        std::unique_ptr<SQLMsg> checkAccountStatus(DBManager::instance().DirectQuery("SELECT status FROM account.account WHERE id = (SELECT account_id FROM player.player WHERE name = '%s')", arg1));

        if (checkAccountStatus->Get()->uiNumRows)
        {
            const auto statusRow = mysql_fetch_row(checkAccountStatus->Get()->pSQLResult);
            const std::string accountStatus(statusRow[0]);

            if (accountStatus == "BLOCK")
            {
                ch->ChatPacket(CHAT_TYPE_INFO, "La cuenta de %s's esta actualmente baneada.", arg1);
                return;
            }
            else {
                std::unique_ptr<SQLMsg> blockAccount(DBManager::instance().DirectQuery("UPDATE account.account SET status = 'BLOCK' WHERE id = (SELECT account_id FROM player.player WHERE name = '%s')", arg1));

                if (blockAccount->Get()->uiAffectedRows > 0) {
                    ch->ChatPacket(CHAT_TYPE_INFO, "La cuenta de %s's ha sido baneada.", arg1);
                }
                else {
                    ch->ChatPacket(CHAT_TYPE_INFO, "Error al bnear la cuenta de %s's .", arg1);
                    return;
                }
            }
        }
        else {
            ch->ChatPacket(CHAT_TYPE_INFO, "No se encuentra al jugador %s", arg1);
            return;
        }

        LPDESC d = DESC_MANAGER::instance().FindByCharacterName(arg1);

        if (d && d->GetCharacter()) {
            if (ch == d->GetCharacter()) {
                ch->ChatPacket(CHAT_TYPE_INFO, "No puedes banearte a ti mismo.");
                return;
            }

            if (d->GetCharacter()->IsGM()) {
                ch->ChatPacket(CHAT_TYPE_INFO, "No puedes banear a un GameMaster.");
                return;
            }

            std::unique_ptr<SQLMsg> msg(DBManager::instance().DirectQuery("SELECT ip FROM player.player WHERE name = '%s'", d->GetCharacter()->GetName()));

            if (msg->Get()->uiNumRows) {
                const auto row = mysql_fetch_row(msg->Get()->pSQLResult);
                AddBanIP(row[0]);
                ch->ChatPacket(CHAT_TYPE_INFO, "El jugador %s ha sido baneado, con ip: %s", d->GetCharacter()->GetName(), row[0]);
                DESC_MANAGER::instance().DestroyDesc(d);  // Desconectar al jugador inmediatamente
            }
            else {
                ch->ChatPacket(CHAT_TYPE_INFO, "Error al busca la IP %s", arg1);
            }
        }
        else {
            ch->ChatPacket(CHAT_TYPE_INFO, "No se encuentra %s", arg1);
        }
    }
    #endif

    It's a shame we have to restart to apply the changes, because until then you can continue connecting/creating accounts, I'm still looking into this, anyway, thank you very much, you always do an incredible job.

    9454b76c65ca624b3d918493f2978b12.gif

  7. Hello, you can edit your npc.txt with excel or something like that, and edit "dir" to rotate your npc, are 9 possible values:

    1. South direction

    2. South-East direction

    3. East direction

    4. North-East direction

    5. North direction

    6. North-West direction

    7. West direction

    8. Southwest direction

    0. Random direction (among the 8 previous ones)

    and this is a useful image to guide you:

    .png

    you can read more here:

     

    thanks to @ Veltor88 for the guide.

  8. On 10/23/2022 at 3:59 PM, bekolay1 said:
    1023 16:55:22017 :: CProperty::ReadFromMemory: File format error after FourCC: property/defensewave/back_dot.prb
    
    1023 16:55:22034 :: CProperty::ReadFromMemory: File format error after FourCC: property/defensewave/box04.prb
    
    1023 16:55:22043 :: CProperty::ReadFromMemory: File format error after FourCC: property/defensewave/wall_lantern.prb
    
    1023 16:55:22044 :: CProperty::ReadFromMemory: File format error after FourCC: property/defensewave/vent06.prb
    
    1023 16:55:22044 :: CProperty::ReadFromMemory: File format error after FourCC: property/defensewave/vent04.prb
    
    1023 16:55:22044 :: CProperty::ReadFromMemory: File format error after FourCC: property/defensewave/vent03.prb
    
    1023 16:55:22044 :: CProperty::ReadFromMemory: File format error after FourCC: property/defensewave/vent01.prb
    
    1023 16:55:22045 :: CProperty::ReadFromMemory: File format error after FourCC: property/defensewave/ropeset03.prb
    
    1023 16:55:22046 :: CProperty::ReadFromMemory: File format error after FourCC: property/defensewave/rope03.prb
    
    1023 16:55:22046 :: CProperty::ReadFromMemory: File format error after FourCC: property/defensewave/right.prb
    
    1023 16:55:22047 :: CProperty::ReadFromMemory: File format error after FourCC: property/defensewave/steerhandle.prb
    
    1023 16:55:22047 :: CProperty::ReadFromMemory: File format error after FourCC: property/defensewave/rail_crack05.prb
    
    1023 16:55:22048 :: CProperty::ReadFromMemory: File format error after FourCC: property/defensewave/rail_crack02.prb


    error ploblem

    The same problem, i think maybe is problem from eternexus

  9. On 10/8/2023 at 12:18 PM, chairman said:

    Hi, where should I use this CRCS?

    PropertyManager.cpp:

    Quote

    #if defined(__BL_AUTO_LANTERN_EFFECT__)
        const std::string strFileName(pProperty->GetFileName());
        if (m_dwLanternCRC == 0xffffffff && strFileName.find("ob-b1-013-lamp02.prb") != std::string::npos)
            m_dwLanternCRC = 2288483325;
        else if (m_dwLanternEffectCRC == 0xffffffff && strFileName.find("fire_ob-b1-013-lamp02.mse.pre") != std::string::npos)
            m_dwLanternEffectCRC = 3363030126;
    #endif

    Btw @ Mali thanks, work great, but i have a doubt, when i put /x1 (day) the light is on, and you know how i can fix the effect? You can see the brightness, but the lamps look off

    008b2334376474e087ba0d3c8567b39e.png

     

  10. Hello  again @ TMP4 ITEM_QUEST / CONFIRM_WHEN_USE and others doesn't work, i fixed it, maybe is no the best solution, but for me work.

    1-Make copy your files.

    2-Go to: /usr/metin2/src/common and open Item_lenght.h and search:

    Spoiler

    enum EItemFlag
    {
        ITEM_FLAG_REFINEABLE        = (1 << 0),
        ITEM_FLAG_SAVE            = (1 << 1),
        ITEM_FLAG_STACKABLE        = (1 << 2),    // ¿©·¯°³ ÇÕÄ¥ ¼ö ÀÖÀ½
        ITEM_FLAG_COUNT_PER_1GOLD    = (1 << 3),
        ITEM_FLAG_SLOW_QUERY        = (1 << 4),
        ITEM_FLAG_UNUSED01        = (1 << 5),    // UNUSED
        ITEM_FLAG_UNIQUE        = (1 << 6),
        ITEM_FLAG_MAKECOUNT        = (1 << 7),
        ITEM_FLAG_IRREMOVABLE        = (1 << 8),
        ITEM_FLAG_CONFIRM_WHEN_USE    = (1 << 9),
        ITEM_FLAG_QUEST_USE        = (1 << 10),
        ITEM_FLAG_QUEST_USE_MULTIPLE    = (1 << 11),
        ITEM_FLAG_QUEST_GIVE        = (1 << 12),
        ITEM_FLAG_LOG            = (1 << 13),
        ITEM_FLAG_APPLICABLE        = (1 << 14),
    };

    If we look closely, we will see that it does not add up, we have a function that is "UNUSED" and FLAG_ITEM_QUEST does not exist, not to mention that it does not match the position of the files.

    Well, let's go to fix this, after you open and search, replace with this:

    Spoiler

    enum EItemFlag
    {
        ITEM_FLAG_REFINEABLE        = (1 << 0),
        ITEM_FLAG_SAVE            = (1 << 1),
        ITEM_FLAG_STACKABLE        = (1 << 2),    // ¿©·¯°³ ÇÕÄ¥ ¼ö ÀÖÀ½
        ITEM_FLAG_COUNT_PER_1GOLD    = (1 << 3),
        ITEM_FLAG_SLOW_QUERY        = (1 << 4),
        //ITEM_FLAG_UNUSED01        = (1 << 5),    // UNUSED
        ITEM_FLAG_UNIQUE        = (1 << 5),
        ITEM_FLAG_MAKECOUNT        = (1 << 6),
        ITEM_FLAG_IRREMOVABLE        = (1 << 7),
        ITEM_FLAG_CONFIRM_WHEN_USE    = (1 << 8),
        ITEM_FLAG_QUEST_USE        = (1 << 9),
        ITEM_FLAG_QUEST_USE_MULTIPLE    = (1 << 10),
        ITEM_FLAG_QUEST_GIVE        = (1 << 11),
        ITEM_FLAG_ITEM_QUEST        = (1 << 12),
        ITEM_FLAG_LOG            = (1 << 13),
        ITEM_FLAG_APPLICABLE        = (1 << 14),
    };

    Or just, remove the "ITEM_FLAG_UNUSED01" and add "ITEM_FLAG_ITEM_QUEST" after "ITEM_FLAG_QUEST_GIVE"

    3.Compile game, and go to db/ProtoReader.cpp and search;

    Spoiler

        string arFlag[] = {"ITEM_TUNABLE", "ITEM_SAVE", "ITEM_STACKABLE", "COUNT_PER_1GOLD", "ITEM_SLOW_QUERY", "ITEM_UNIQUE",
                "ITEM_MAKECOUNT", "ITEM_IRREMOVABLE", "CONFIRM_WHEN_USE", "QUEST_USE", "QUEST_USE_MULTIPLE",
                "QUEST_GIVE", "ITEM_QUEST", "LOG", "STACKABLE", "SLOW_QUERY", "REFINEABLE", "IRREMOVABLE", "ITEM_APPLICABLE"};

    You can se, how this call "ITEM_TUNABLE" but this doesn't exist, apart the count max in item_lenght.h is 14 but here you have 17, so now change with this:

    Quote

        string arFlag[] = {"ITEM_REFINEABLE", "ITEM_SAVE", "ITEM_STACKABLE", "COUNT_PER_1GOLD", "ITEM_SLOW_QUERY", "ITEM_UNIQUE",
                            "ITEM_MAKECOUNT", "ITEM_IRREMOVABLE", "CONFIRM_WHEN_USE", "QUEST_USE", "QUEST_USE_MULTIPLE",
                            "QUEST_GIVE", "ITEM_QUEST", "LOG", "ITEM_APPLICABLE"};

    4.Now compile DB and go to Source Client/UserInterface and open PythonItemModule.cpp and comment this line:

    Spoiler

    //PyModule_AddIntConstant(poModule, "ITEM_FLAG_RARE",                CItemData::ITEM_FLAG_RARE);

    4.1.Now go to GameLib/itemData.h and search:

    Spoiler

            enum EItemFlag
            {
                ITEM_FLAG_REFINEABLE        = (1 << 0),        // °³·® °¡´É
                ITEM_FLAG_SAVE              = (1 << 1),
                ITEM_FLAG_STACKABLE         = (1 << 2),     // ¿©·¯°³ ÇÕÄ¥ ¼ö ÀÖÀ½
                ITEM_FLAG_COUNT_PER_1GOLD   = (1 << 3),        // °¡°ÝÀÌ °³¼ö / °¡°ÝÀ¸·Î º¯ÇÔ
                ITEM_FLAG_SLOW_QUERY        = (1 << 4),        // °ÔÀÓ Á¾·á½Ã¿¡¸¸ SQL¿¡ Äõ¸®ÇÔ
                ITEM_FLAG_RARE              = (1 << 5),
                ITEM_FLAG_UNIQUE            = (1 << 6),
                ITEM_FLAG_MAKECOUNT            = (1 << 7),
                ITEM_FLAG_IRREMOVABLE        = (1 << 8),
                ITEM_FLAG_CONFIRM_WHEN_USE    = (1 << 9),
                ITEM_FLAG_QUEST_USE         = (1 << 10),    // Äù½ºÆ® ½ºÅ©¸³Æ® µ¹¸®´ÂÁö?
                ITEM_FLAG_QUEST_USE_MULTIPLE= (1 << 11),    // Äù½ºÆ® ½ºÅ©¸³Æ® µ¹¸®´ÂÁö?
                ITEM_FLAG_UNUSED03          = (1 << 12),    // UNUSED03
                ITEM_FLAG_LOG               = (1 << 13),    // »ç¿ë½Ã ·Î±×¸¦ ³²±â´Â ¾ÆÀÌÅÛÀΰ¡?
                ITEM_FLAG_APPLICABLE        = (1 << 14),
            };

    Replace:

    Spoiler

            enum EItemFlag
            {
                ITEM_FLAG_REFINEABLE        = (1 << 0),        // °³·® °¡´É
                ITEM_FLAG_SAVE              = (1 << 1),
                ITEM_FLAG_STACKABLE         = (1 << 2),     // ¿©·¯°³ ÇÕÄ¥ ¼ö ÀÖÀ½
                ITEM_FLAG_COUNT_PER_1GOLD   = (1 << 3),        // °¡°ÝÀÌ °³¼ö / °¡°ÝÀ¸·Î º¯ÇÔ
                ITEM_FLAG_SLOW_QUERY        = (1 << 4),        // °ÔÀÓ Á¾·á½Ã¿¡¸¸ SQL¿¡ Äõ¸®ÇÔ
                //ITEM_FLAG_RARE              = (1 << 5),
                ITEM_FLAG_UNIQUE            = (1 << 5),
                ITEM_FLAG_MAKECOUNT            = (1 << 6),
                ITEM_FLAG_IRREMOVABLE        = (1 << 7),
                ITEM_FLAG_CONFIRM_WHEN_USE    = (1 << 8),
                ITEM_FLAG_QUEST_USE         = (1 << 9),    // Äù½ºÆ® ½ºÅ©¸³Æ® µ¹¸®´ÂÁö?
                ITEM_FLAG_QUEST_USE_MULTIPLE= (1 << 10),    // Äù½ºÆ® ½ºÅ©¸³Æ® µ¹¸®´ÂÁö?
                ITEM_QUEST_GIVE                = (1 << 11),
                ITEM_FLAG_ITEM_QUEST          = (1 << 12),    // UNUSED03
                ITEM_FLAG_LOG               = (1 << 13),    // »ç¿ë½Ã ·Î±×¸¦ ³²±â´Â ¾ÆÀÌÅÛÀΰ¡?
                ITEM_FLAG_APPLICABLE        = (1 << 14),
            };

    5.In the end, compile Source Client, and open Dump_proto/ItemCSVReader.cpp and search:

    Spoiler

    int get_Item_Flag_Value(string inputString) 
    {

        string arFlag[] = {"ITEM_REFINEABLE", "ITEM_SAVE", "ITEM_STACKABLE", "COUNT_PER_1GOLD", "ITEM_SLOW_QUERY", "ITEM_UNIQUE",
                "ITEM_MAKECOUNT", "ITEM_IRREMOVABLE", "CONFIRM_WHEN_USE", "QUEST_USE", "QUEST_USE_MULTIPLE",
                "QUEST_GIVE", "ITEM_QUEST", "LOG", "STACKABLE", "SLOW_QUERY", "REFINEABLE", "IRREMOVABLE", "ITEM_APPLICABLE"};

    Replace:

    Quote

    int get_Item_Flag_Value(string inputString) 
    {

        string arFlag[] = {"ITEM_REFINEABLE", "ITEM_SAVE", "ITEM_STACKABLE", "COUNT_PER_1GOLD", "ITEM_SLOW_QUERY", "ITEM_UNIQUE",
                "ITEM_MAKECOUNT", "ITEM_IRREMOVABLE", "CONFIRM_WHEN_USE", "QUEST_USE", "QUEST_USE_MULTIPLE",
                "QUEST_GIVE", "ITEM_QUEST", "LOG", "ITEM_APPLICABLE"};

    Compile, dump the item/mob replace in locale, and have fun!!

    https://metin2.download/picture/Vvv5TUrRwXW4bLbSHP31Yx8ohV20rB9G/.gif

    9 minutes ago, TMP4 said:

    The problem I don't have backup of the video file and youtube won't let you download it if it's striked.

    If I have backup, I would reupload it to somewhere else.

    What is the video about? I don't remember, I can record one myself and do you a favor, greetings.

  11. On 14/12/2022 at 20:37, StarSoul said:

    ¿Qué es esto? ¿Esto te permite ver archivos de Granny? ¿Te permite editarlos? ¿Te permite exportarlos a otros formatos de archivo? ¿Te permite convertir archivos a archivos .GR2? Se necesita una explicación.

    This, give you the chance, to change your old .gr2 (2.9, 2.4 2.x) to .gr2 (2.11.8) or inverse, the Granny_common is "source"

    • Metin2 Dev 1
  12. Edit: in the end I decided to go for it and as I liked it, I adapted it and fixed it for my server.

    As I told you in the other message, you can use the normal drop, with the range you want, now I will attach a fragment of my mob_drop_item, where I made several tests that you can see in the video. By the way, remember that it works also for common_drop_item, greetings, and I hope I solved your question.

    Mob_drop_item old code example (using the warrior armour lv70);

    Quote

    Group    City1
    {
        Mob    171    --Dog
        Type    drop
        1    11290    1 50
        2    11291    1 50
        3    11292    1 50
        4    11293    1 50
        5    11294    1 50
        6    11295    1 50
        7    11296    1 50
        8    11297    1 50
        9    11298    1 50
        10    11299    1 50
    }

    New code with the system:

    Quote

    Group    City1
    {
        Mob    171 --Dog
        Type    drop
        1    11290~11299    1    100
    }

    Examples using mob_drop_item:

    Quote

    Group    City1
    {
        Mob    171    --Dog
        Type    drop
        1    10    1    100 --Sword
    }
    Group    City1
    {
        Mob    8001~8005    --Metin Stone
        Type    drop
        1    11400    1    100 --Blue Ninja Armour
    }
    Group    City1
    {
        Mob    171,691,101 --Dog, Chief Orc, Dog2
        Type    drop
        1    11290~11299    1    100 --Warrior Armour +0 to +9 random

        2   150     1   100  --Sword <-New example

       3    11295 1   50   --Warrior Armour +5 <--New example
    }

    You can also add a mob randomly in another group, as you can see, I use 2 times the id "171" and I will receive both the item in group 1 and the item in group 2 containing that mob.

    https://metin2.download/picture/fY1LkOYQr87TVjL0L10cv1ZYK66SF389/.gif

     

  13. 5 hours ago, xGalardo said:

    Después de utilizar este sistema, todas las gotas deben escribirse como, por ejemplo: 30000 ~ 30000, por lo que no puedo simplemente escribir una ID de 30000 en mob_drop_item.txt.

    Ejemplo:

    Grupo metinstone
    {
        escriba drop
        mob 8001
        1 30000~30002 1 100
        2 20000~20000 1 100
    }
    Entonces, ¿se deben incluir todas las identificaciones para que ~ se separe?

    Sorry if I don't understand it well, you mean if it's necessary or mandatory to use the "~" in all?, as far as I remember you could still do the normal drop, only this allows you to add a lot of mobs or items saving you to create a huge list, here I leave you an example of how I used it, although I don't have a copy of the system, I should have an old copy of the mob_drop, if I find it and show you how I used it, if you didn't mean it, tell me something more detailed, I'll try to explain you :), this is example:

    Quote

        Group Nazox
        {
            Mob 101~102 <--Wild dog and dog
            Type drop
            1    11290~11290 1 10 <-War Weapon +0 or +9 random
            2    10~219 1 95 <--Sword +0 or +9 random
            3    50    1    20 <--Sword lv20 +0
            4    55    1    50 <--Sword lv20 +5
        }
        Group Nazox2
        {
            Mob 101,102,691,2598  <--Wild dog, dog, Orc Chief, Azrael
            Type drop
            1    11210~11290 1 10 <-War Weapon lv1 to lv 70 +0 random
            2    10~219 1 95 <--Sword +0 or +9 random
            3    50    1    20 <--Sword lv20 +0
            4    55    1    50 <--Sword lv20 +5
        }

        Group Nazox3
        {
            Mob 691  <--Orc Chief
            Type drop
            1    11210~11290 1 10 <-War Weapon lv1 to lv 70 +0 random
            2    10~219 1 95 <--Sword +0 or +9 random
            3    50    1    20 <--Sword lv20 +0
            4    55    1    50 <--Sword lv20 +5
        }

     

  14. Yes, you have to use std::pair as @ Dex said, besides, if you have the "Drop info system" you have to adapt the code in item_manager.cpp because you replace that function and use another method in its coding, once I managed to do it but I didn't save backup and I haven't managed to do it since xD! but the few times I tried it, that system was great, by the way, if you have modifications from other systems in item_manager.cpp, item_manager_private_types.h i item_manager_read_tables.cpp try to adapt it, not just replace, and don't forget to add public_tables.cpp in makefile, after that no more modifications required in principle as far as I remember, but try to read the "HowTo.txt" file is very easy to commit problems when editing common_drop, etc.

×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.