Jump to content

[007]DawisHU

Member
  • Posts

    258
  • Joined

  • Last visited

  • Days Won

    4
  • Feedback

    0%

Posts posted by [007]DawisHU

  1. On 4/1/2019 at 4:52 AM, Tallywa said:

    Hello, what is the fix

    This is the fix ( Now tested)


    Upgradeitem

    Spoiler

    #if defined DENIE_EVERY_INSERT_TO_SPECIAL_STORAGE
            if (DestCell.window_type == UPGRADE_INVENTORY)
                if (!item->IsUpgradeItem())
                    return false;
    #endif


    BookItem

    Spoiler

    #if defined DENIE_EVERY_INSERT_TO_SPECIAL_STORAGE
            if (DestCell.window_type == BOOK_INVENTORY)
                if (!item->IsBook())
                    return false;
    #endif


    StoneItem
     

    Spoiler

    #if defined DENIE_EVERY_INSERT_TO_SPECIAL_STORAGE
            if (DestCell.window_type == STONE_INVENTORY)
                if (!item->IsStone())
                    return false;
    #endif


    ChestItem

    Spoiler

    #if defined DENIE_EVERY_INSERT_TO_SPECIAL_STORAGE
            if (DestCell.window_type == CHEST_INVENTORY)
                if (!item->IsChest())
                    return false;
    #endif


    Don't forget to define it 🙂

    (Char_item.cpp -> CHARACTER::MoveItem func)
    Enjoy 🙂
    If helped, Just drop LIKE to this.

  2. Hi guyz and @ Rakancito !

    I have some system from you, Rakancito.

    But first system is total bugged from you, i start developing and rewritting the whole bugged code.

    Shop is can't reupdate itself when server closed/restarted, problem start in char.cpp -> 
    void CHARACTER::LoadPremiumPrivateShop(int iItemCount, TPlayerItem* pItems) function.

    And in db side, the example ( your files ) totally useless for me.
    Example:
    your code :
     

    Spoiler

    #ifdef ENABLE_PREMIUM_PRIVATE_SHOP

    if(pi->bIsPrivateShop)

    {

    snprintf(szQuery, sizeof(szQuery),

    "INSERT INTO item%s (id, owner_id, window, pos, vnum, count, socket0, socket1, socket2) "

    "VALUES(%u, %u, '%s', %d, %u, %u, %u, %u, %u)",

    GetTablePostfix(),

    GainItemID(),

    pi->player_id,

    pi->ip[0] == 0 ? "PRIVATE_SHOP" : "PRIVATE_SHOP",

    iPos,

    pItemAward->dwVnum, pItemAward->dwCount, pItemAward->dwSocket0, pItemAward->dwSocket1, dwSocket2);

    }
    ........

    My code : 

     

    Spoiler

    snprintf(szQuery, sizeof(szQuery), 
                                    "INSERT INTO item%s (id, owner_id, window, pos, vnum, count, socket0, socket1, socket2) "
                                    "VALUES(%u, %u, '%s', %d, %u, %u, %u, %u, %u)",
                                    GetTablePostfix(),
                                    GainItemID(),
    #ifdef ENABLE_PREMIUM_PRIVATE_SHOP
                                pi->ip[0] == 2 ? pi->player_id : 
    #endif
                                pi->account_id,
    #ifdef ENABLE_PREMIUM_PRIVATE_SHOP
                                    //pi->bIsPrivateShop == true ? "PRIVATE_SHOP" : pi->ip[0] == 0 ? "SAFEBOX" : "MALL",
                                    pi->ip[0] == 2 ? "PRIVATE_SHOP" : pi->ip[0] == 0 ? "SAFEBOX" : "MALL",
    #else
                                    pi->ip[0] == 0 ? "SAFEBOX" : "MALL",
    #endif
                                    iPos,
                                    pItemAward->dwVnum, pItemAward->dwCount, pItemAward->dwSocket0, pItemAward->dwSocket1, dwSocket2);
                        }


    No need useless + lines just work smart 😉

    if i fixed the items load, and other things in shop, and need this, i will paste it to here.
    Excuse me for bad eng. 
    Best regard !
     

     

    #Update

    Finally fixed ❤️ 
    spacer.png

    • Good 1
    • muscle 1
  3. Hi.
    You are need source for it.

    Dump_proto/src

    Spoiler

    ItemCSVReader.cpp

    Search:
    int get_Item_WearFlag_Value(string inputString)In this func.:

    "WEAR_RING2",
    after add:
    "WEAR_RING3",

    Looks like this:

    string arWearrFlag[] = {
            "WEAR_BODY",
            "WEAR_HEAD",
            "WEAR_FOOTS",
            "WEAR_WRIST",
            "WEAR_WEAPON",
            "WEAR_NECK",
            "WEAR_EAR",
            "WEAR_SHIELD",
            "WEAR_UNIQUE",
            "WEAR_ARROW",
            "WEAR_HAIR",
            "WEAR_ABILITY",
            "WEAR_COSTUME_BODY",
            "WEAR_COSTUME_HAIR",
    #ifdef __SASH_SYSTEM__
            "WEAR_COSTUME_SASH",
    #endif
    #ifdef __WING_SYSTEM__
            "WEAR_COSTUME_WING",
    #endif
    #ifdef __COSTUME_WEAPON_SYSTEM__
            "WEAR_COSTUME_WEAPON",
    #endif
            "WEAR_RING1",
            "WEAR_RING2",
            "WEAR_RING3",
            "WEAR_BELT"
        };


    Szerver SRC/ Common 
     

    Spoiler

    Length.h

    Search EWearPosition enums:

    After WEAR_RING2, add:
    WEAR_RING3,

    Looks like:

     

    enum EWearPositions
    {
        WEAR_BODY,
        WEAR_HEAD,
        WEAR_FOOTS,
        WEAR_WRIST,
        WEAR_WEAPON,
        WEAR_NECK,
        WEAR_EAR,
        WEAR_UNIQUE1,
        WEAR_UNIQUE2,
        WEAR_ARROW,
        WEAR_SHIELD,
        WEAR_ABILITY1,
        WEAR_ABILITY2,
        WEAR_ABILITY3,
        WEAR_ABILITY4,
        WEAR_ABILITY5,
        WEAR_ABILITY6,
        WEAR_ABILITY7,
        WEAR_ABILITY8,
        WEAR_COSTUME_BODY,
        WEAR_COSTUME_HAIR,
    #ifdef __SASH_SYSTEM__
        WEAR_COSTUME_SASH,
    #endif
    #ifdef __WING_SYSTEM__
        WEAR_COSTUME_WING,
    #endif
    #ifdef __COSTUME_WEAPON_SYSTEM__
        WEAR_COSTUME_WEAPON,
    #endif
        WEAR_RING1,
        WEAR_RING2,
        WEAR_RING3,
        WEAR_BELT,

        WEAR_MAX = 32    // 
    };


    Szerver/DB/SRC
     

    Spoiler

    ProtoReader.cpp

    Search:
    int get_Item_WearFlag_Value(string inputString)In this func.:

    "WEAR_RING2",
    after add:
    "WEAR_RING3",

    Looks like this:

    string arWearrFlag[] = {
            "WEAR_BODY",
            "WEAR_HEAD",
            "WEAR_FOOTS",
            "WEAR_WRIST",
            "WEAR_WEAPON",
            "WEAR_NECK",
            "WEAR_EAR",
            "WEAR_SHIELD",
            "WEAR_UNIQUE",
            "WEAR_ARROW",
            "WEAR_HAIR",
            "WEAR_ABILITY",
            "WEAR_COSTUME_BODY",
            "WEAR_COSTUME_HAIR",
    #ifdef __SASH_SYSTEM__
            "WEAR_COSTUME_SASH",
    #endif
    #ifdef __WING_SYSTEM__
            "WEAR_COSTUME_WING",
    #endif
    #ifdef __COSTUME_WEAPON_SYSTEM__
            "WEAR_COSTUME_WEAPON",
    #endif
            "WEAR_RING1",
            "WEAR_RING2",
            "WEAR_RING3",
            "WEAR_BELT"
        };


    Szerver/GAME/SRC
     

    Spoiler

    item.cpp

    search:
    int CItem::FindEquipCell(LPCHARACTER ch, int iCandidateCell)

    in this func:
     
    in this" else if (GetType() == ITEM_RING)"

    change like this:

    if (ch->GetWear(WEAR_RING1) && ch->GetWear(WEAR_RING2))
                return WEAR_RING3;
            else if (ch->GetWear(WEAR_RING1) && ch->GetWear(WEAR_RING3))
                return WEAR_RING2;
            else if (ch->GetWear(WEAR_RING2) && ch->GetWear(WEAR_RING3))
                return WEAR_RING1;


    Client/userintergface
     

    Spoiler

    GameType.h

    Search #ifdef ENABLE_NEW_EQUIPMENT_SYSTEM

    In this :
    const DWORD c_New_Equipment_Ring2 = c_New_Equipment_Start + 1;
    after add this:
    const DWORD c_New_Equipment_Ring3 = c_New_Equipment_Start + 2;

    Looks like:

    #ifdef ENABLE_NEW_EQUIPMENT_SYSTEM
        const DWORD c_New_Equipment_Start = c_Costume_Slot_End;
        const DWORD c_New_Equipment_Count = 3;
        const DWORD c_New_Equipment_Ring1 = c_New_Equipment_Start + 0;
        const DWORD c_New_Equipment_Ring2 = c_New_Equipment_Start + 1;
        const DWORD c_New_Equipment_Ring3 = c_New_Equipment_Start + 2;
        const DWORD c_New_Equipment_Belt = c_New_Equipment_Start + 3;
        const DWORD c_Equipment_Slot_Count = 4;
        const DWORD c_New_Equipment_Slot_End = c_New_Equipment_Start + c_Equipment_Slot_Count;
    #endif

    Spoiler

    PythonItemModule.cpp

    search #ifdef ENABLE_NEW_EQUIPMENT_SYSTEM
    and
    PyModule_AddIntConstant(poModule, "EQUIPMENT_RING2", c_New_Equipment_Ring2);
    after add:
    PyModule_AddIntConstant(poModule, "EQUIPMENT_RING3", c_New_Equipment_Ring3);

    looks like:

    #ifdef ENABLE_NEW_EQUIPMENT_SYSTEM
        PyModule_AddIntConstant(poModule, "EQUIPMENT_RING1", c_New_Equipment_Ring1);
        PyModule_AddIntConstant(poModule, "EQUIPMENT_RING2", c_New_Equipment_Ring2);
        PyModule_AddIntConstant(poModule, "EQUIPMENT_RING3", c_New_Equipment_Ring3);
        PyModule_AddIntConstant(poModule, "EQUIPMENT_BELT", c_New_Equipment_Belt);
    #endif


    It is just quick searching in source, maybe i forget something? 🙂

    (Don't forget to add in python too)

    Sorry for my bad english!
     

  4. Hi.
    If u want from config (Player can enable it)
    original:
    Metin2.cfg ->SHADOW_LEVEL            number

    it is enum:
    SHADOW_NONE = 0
    SHADOW_GROUND = 1
    SHADOW_GROUND_AND_SOLO = 2
    SHADOW_ALL = 3
    SHADOW_ALL_HIGH = 4
    SHADOW_ALL_MAX = 5

    if u want to disable in source, go to :
    UserInterface/PythonBackground.cpp
    In this file search:


     

    bool CPythonBackground::SetShadowLevel(int eLevel)
    {
        if (!m_pkMap)
            return false;

        if (m_eShadowLevel == eLevel)
            return true;

        CMapOutdoor& rkMap = GetMapOutdoorRef();


    After add this:
    eLevel = 0;


    looks like:

     

    bool CPythonBackground::SetShadowLevel(int eLevel)
    {
        if (!m_pkMap)
            return false;

        if (m_eShadowLevel == eLevel)
            return true;

        CMapOutdoor& rkMap = GetMapOutdoorRef();

        eLevel = SHADOW_NONE;

        m_eShadowLevel = eLevel;

        switch (m_eShadowLevel)


    Excuse me for bad english.

    • Love 1
  5. Spoiler

    Hi. 🙂
    Possible..., try this.

    UserInterFace/InstanceBase.cpp

    Search this :
    void CInstanceBase::MovementProcess()

    In this void search this:

    if (__IsInDustRange())

    Upper add it:

    if (IsAffect(AFFECT_EUNHYEONG) || IsAffect(AFFECT_INVISIBILITY))
                return;


    I don't tested.
    If work, ❤️ this 😄

     

    • Metin2 Dev 1
  6. Are you sure? hidden?

    From virgin source, if not same, the hidden user name are found 😄

    DB side,
     

    Quote

     

    Quote

    main.cpp
    Search: 
    int Start()
    In this , search:
    if (CConfig::instance().GetValue("SQL_PLAYER", line, 256))

    Original looks like:
     

    Quote

    if (!CDBManager::instance().Connect(SQL_PLAYER, "localhost", 0, "player", "mt2", "mt2!@#"))
        {
            if (CConfig::instance().GetValue("SQL_PLAYER", line, 256))
            {
                sscanf(line, " %s %s %s %s %d ", szAddr, szDB, szUser, szPassword, &iPort);
                sys_log(0, "connecting to MySQL server (player)");

                int iRetry = 5;

                do
                {
                    if (CDBManager::instance().Connect(SQL_PLAYER, szAddr, iPort, szDB, szUser, szPassword))
                    {
                        sys_log(0, "   OK");
                        break;
                    }

                    sys_log(0, "   failed, retrying in 5 seconds");
                    fprintf(stderr, "   failed, retrying in 5 seconds");
                    sleep(5);
                } while (iRetry--);
                //fprintf(stderr, "Success PLAYER\n");
                SetPlayerDBName(szDB);
            }
            else
            {
                sys_err("SQL_PLAYER not configured");
                return false;
            }
        }

    Next is:

    if (CConfig::instance().GetValue("SQL_ACCOUNT", line, 256))
    Original looks like:
     

    Quote

    if (CConfig::instance().GetValue("SQL_ACCOUNT", line, 256))
        {
            sscanf(line, " %s %s %s %s %d ", szAddr, szDB, szUser, szPassword, &iPort);
            sys_log(0, "connecting to MySQL server (account)");

            int iRetry = 5;

            do
            {
                if (CDBManager::instance().Connect(SQL_ACCOUNT, szAddr, iPort, szDB, szUser, szPassword))
                {
                    sys_log(0, "   OK");
                    break;
                }

                sys_log(0, "   failed, retrying in 5 seconds");
                fprintf(stderr, "   failed, retrying in 5 seconds");
                sleep(5);
            } while (iRetry--);
            fprintf(stderr, "Success ACCOUNT\n");
        }
        else
        {
            sys_err("SQL_ACCOUNT not configured");
            return false;
        }

    Next is:
    if (CConfig::instance().GetValue("SQL_COMMON", line, 256))

    Original looks like:

     

    Quote

    if (CConfig::instance().GetValue("SQL_COMMON", line, 256))
        {
            sscanf(line, " %s %s %s %s %d ", szAddr, szDB, szUser, szPassword, &iPort);
            sys_log(0, "connecting to MySQL server (common)");

            int iRetry = 5;

            do
            {
                if (CDBManager::instance().Connect(SQL_COMMON, szAddr, iPort, szDB, szUser, szPassword))
                {
                    sys_log(0, "   OK");
                    break;
                }

                sys_log(0, "   failed, retrying in 5 seconds");
                fprintf(stderr, "   failed, retrying in 5 seconds");
                sleep(5);
            } while (iRetry--);
    fprintf(stderr, "Success COMMON\n");
        }
        else
        {
            sys_err("SQL_COMMON not configured");
            return false;
        }

    Next is:
    if (CConfig::instance().GetValue("SQL_HOTBACKUP", line, 256))
    Original looks like :

     

    Quote

    if (CConfig::instance().GetValue("SQL_HOTBACKUP", line, 256))
        {
            sscanf(line, " %s %s %s %s %d ", szAddr, szDB, szUser, szPassword, &iPort);
            sys_log(0, "connecting to MySQL server (hotbackup)");

            int iRetry = 5;

            do
            {
                if (CDBManager::instance().Connect(SQL_HOTBACKUP, szAddr, iPort, szDB, szUser, szPassword))
                {
                    sys_log(0, "   OK");
                    break;
                }

                sys_log(0, "   failed, retrying in 5 seconds");
                fprintf(stderr, "   failed, retrying in 5 seconds");
                sleep(5);
            }
            while (iRetry--);

    fprintf(stderr, "Success HOTBACKUP\n");
        }
        else
        {
            sys_err("SQL_HOTBACKUP not configured");
            return false;
        }

     


    Game side:

     

    Quote

    Config.cpp

    Search this:

    void config_init(const string& st_localeServiceName)

    in this void,  search this:

    TOKEN("player_sql")

    Original looks like:
     

    Quote

    TOKEN("player_sql")
            {
                const char * line = two_arguments(value_string, db_host[0], sizeof(db_host[0]), db_user[0], sizeof(db_user[0]));
                line = two_arguments(line, db_pwd[0], sizeof(db_pwd[0]), db_db[0], sizeof(db_db[0]));

                if (NULL != line[0])
                {
                    char buf[256];
                    one_argument(line, buf, sizeof(buf));
                    str_to_number(mysql_db_port[0], buf);
                }

                if (!*db_host[0] || !*db_user[0] || !*db_pwd[0] || !*db_db[0])
                {
                    fprintf(stderr, "PLAYER_SQL syntax: logsql <host user password db>\n");
                    exit(1);
                }

                char buf[1024];
                snprintf(buf, sizeof(buf), "PLAYER_SQL: %s %s %s %s %d", db_host[0], db_user[0], db_pwd[0], db_db[0], mysql_db_port[0]);
                isPlayerSQL = true;
                continue;
            }

    Next is:

    TOKEN("common_sql")

    Original looks like:
     

    Quote

    TOKEN("common_sql")
            {
                const char * line = two_arguments(value_string, db_host[1], sizeof(db_host[1]), db_user[1], sizeof(db_user[1]));
                line = two_arguments(line, db_pwd[1], sizeof(db_pwd[1]), db_db[1], sizeof(db_db[1]));

                if (NULL != line[0])
                {
                    char buf[256];
                    one_argument(line, buf, sizeof(buf));
                    str_to_number(mysql_db_port[1], buf);
                }

                if (!*db_host[1] || !*db_user[1] || !*db_pwd[1] || !*db_db[1])
                {
                    fprintf(stderr, "COMMON_SQL syntax: logsql <host user password db>\n");
                    exit(1);
                }

                char buf[1024];
                snprintf(buf, sizeof(buf), "COMMON_SQL: %s %s %s %s %d", db_host[1], db_user[1], db_pwd[1], db_db[1], mysql_db_port[1]);
                isCommonSQL = true;
                continue;
            }

    Next is:

    TOKEN("log_sql")
    Original looks like:

     

    Quote

    TOKEN("log_sql")
            {
                const char * line = two_arguments(value_string, log_host, sizeof(log_host), log_user, sizeof(log_user));
                line = two_arguments(line, log_pwd, sizeof(log_pwd), log_db, sizeof(log_db));

                if (NULL != line[0])
                {
                    char buf[256];
                    one_argument(line, buf, sizeof(buf));
                    str_to_number(log_port, buf);
                }

                if (!*log_host || !*log_user || !*log_pwd || !*log_db)
                {
                    fprintf(stderr, "LOG_SQL syntax: logsql <host user password db>\n");
                    exit(1);
                }

                char buf[1024];
                snprintf(buf, sizeof(buf), "LOG_SQL: %s %s %s %s %d", log_host, log_user, log_pwd, log_db, log_port);
                continue;
            }


    And check last one:

    if (!isPlayerSQL)
        {
            puts("LOAD_PLAYER_SQL_INFO_FAILURE:");
            puts("");
            puts("CONFIG:");
            puts("------------------------------------------------");
            puts("PLAYER_SQL: HOST USER PASSWORD DATABASE");
            puts("");
            exit(1);
        }

    after this :

    AccountDB::instance().Connect(db_host[1], mysql_db_port[1], db_user[1], db_pwd[1], db_db[1]);


    these things is same, with originals?

  7. Well.
    Here you go 😄 

    This is the hidden content, please

    Spoiler

    In my chase, this map insert looks like:
     

    Spoiler

    https://metin2.download/picture/f6XXrMNyNyiMhpJp96W4HcnwrG5r3Zw0/.png

    Adatbázis -> DB
    Patch szerver -> Patch server
    Beléptető rendszer -> Auth
    Csatorna 1~ 9 and 99 -> CH 1~4 - 9
    Futamok -> Runs
    Céhek -> Guild wars

    i'lli created more cores for solo work... 😄 
    Looks like Only Runs (Solo/Duo)
    Only Guild wars... 

    But your chase need to looks like:
     

    Spoiler

    You are need to put every CH*_1 except 99,
    or u are have a special server side, like Jade dyna*** From CH1 -> login on to -> CH 10 -> CH 8 -> ch 999 -> reaching map (5-6x teleport = each core)

    Put only one config file 😄

    CONFIG file -> MAP_ALLOW: end of line (space)and serverside map index.
    Example:
    /usr/servername/share/locale/language/map/
    index (Open with notepad)

    Metin2_Map_Milgyo -> 66 

    So Map_allow in ch1_1 CONFIG file: 
    looks like
    MAP_ALLOW: 61 62 63 64 65 67 68 69 70 112 301 302 303 304 66 <- here
    Now, go to:
    /usr/servername/share/locale/language/map/mapname
    Settings.txt open with notepad or other program...


    You are found MapSize (Default is : 4 4 )
    BasePosition (default is : 537600 512000)
    Or your values.
    NOW Memo THIS !!!!

    Go to client side:
    In my chase Atlasinfo is in root folder 😄 


    Search metin2_map_milgyo or add new line looks like
    metin2_map_milgyo(tab)537600(tab)51200(tab)4(tab)4
    restart server.
    Pack client -> try new map.

    If error/warning still same, use Koordinator exe...

    Usage:
    Copy atlasinfo.txt next to *.exe file
    Open Koordinator, replace your map, save and put back to the client.


    Excuse me for horrible english...





     

    • Metin2 Dev 1
    • Love 1
×
×
  • 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.