Skocz do zawartości
Masz już aplikację Sharegon?

Odkryj wszystkie możliwości. Dowiedz się więcej

Sharegon.pl

Zainstaluj aplikację Sharegon i korzystaj z powiadomień push oraz licznika nowych aktywności bezpośrednio z ekranu głównego.

Aby zainstalować tę aplikację na iOS i iPadOS.
  1. Tap the Share icon in Safari
  2. Przewiń menu i stuknij Dodaj do ekranu początkowego.
  3. Stuknij Dodaj w prawym górnym rogu.
Zainstaluj aplikację Sharegon na Androidzie
  1. Otwórz Sklep Google Play na swoim smarfonie.
  2. Wyszukaj „Sharegon” w pasku wyszukiwania.
  3. Stuknij „Zainstaluj”, aby pobrać aplikację.

Pliki serwerowe MT2009 + source

Featured Replies

Opublikowano
18 minut temu, Mizuki napisał(a):

Tutaj na start masz do poprawy

  • Cythona

  • Captcha

  • SQL

  • State po stronie source bo się przepełnia, ale to wygląda jak celowe uszkodzenie

  • Cofanie postaci przy PvP

  • Lag przy teleporcie

  • No i połowa root jest rozkopana przez kogoś kto nawet kodu nie umie usuwać

Hej uruchomic ci pliki

  • Odpowiedzi 155
  • Wyświetleń 7 tys.
  • Dodano
  • Ostatniej odpowiedzi

Top użytkownicy w tym temacie

Najbardziej popularny wpis

  • @Mizuki nie dasz ty, to ja dam toolsa. ( może w końcu nie będziesz miał problemów z mysql) HOWTO.zip

  • Thorek
    Thorek

    W tym kontekście nazywanie kogokolwiek kto się tym zajmował „programistą” to duże nadużycie :D

  • Przyjmuje zakłady, ile dni minie do pierwszego serwera na tych plikach

Najbardziej pomocny post

  • właśnie, przypomniało mi się @bosmanxmetin szukałeś plików, no to masz XDD

  • Sevence
    Sevence

    Grymuar?

  • Nooooo, ale 2009 to kilka edycji, a nie układanie 95% rozgrywki na nowo c:

Opublikowane grafiki

Opublikowano

Zamiast się wyzywać i prześmiewać drugiego to może porozkminiamy jak fixnac te błędy z cython, cofaniem w pvp i kickami 😀 Ja nie mam pojęcia ale może ktoś coś podpowie? Jak rozumiem ten captcha to useless i można to po prostu wywalić z kodu? Wtedy nie będzie problemu ale też nie będzie możliwości wysłania captcha jako GM do gracza?

Opublikowano
  • Autor
59 minut temu, mefedronix napisał(a):

Zamiast się wyzywać i prześmiewać drugiego to może porozkminiamy jak fixnac te błędy z cython, cofaniem w pvp i kickami 😀 Ja nie mam pojęcia ale może ktoś coś podpowie? Jak rozumiem ten captcha to useless i można to po prostu wywalić z kodu? Wtedy nie będzie problemu ale też nie będzie możliwości wysłania captcha jako GM do gracza?

sharegon_1770908952492.png

Opublikowano

Panowie jakie hasło do pobrania z tego mega.nz?

Opublikowano
2 godziny temu, mefedronix napisał(a):

Zamiast się wyzywać i prześmiewać drugiego to może porozkminiamy jak fixnac te błędy z cython, cofaniem w pvp i kickami 😀 Ja nie mam pojęcia ale może ktoś coś podpowie? Jak rozumiem ten captcha to useless i można to po prostu wywalić z kodu? Wtedy nie będzie problemu ale też nie będzie możliwości wysłania captcha jako GM do gracza?

Jak nie masz pojęcia jak to naprawiać to lepiej zostaw te pliki w spokoju i weź się za coś przy czym będziesz mógł od zera się nauczyć 😉😁

Opublikowano
44 minuty temu, Nietykalny napisał(a):

Próbuję wyciągnąć offline shopy i wjebać w arezzo, ale same errory ;/

Ahh te hardcode xd

powodzenia xd

Opublikowano
9 godzin temu, mefedronix napisał(a):

w root/ uitooltip zakomentuj sobie self.auxiliaryDict = kwargs.get("auxiliaryDict", player.GetAuxiliaryString(window_type, slotIndex))

@Mizuki szkoda 😢 Bo source ciekawe tylko niepotrzebnie tyle osób przy tym grzebało i narobiło syfu.

Dzięki za odpowiedz. dodałem # przed ta linijki w uitooltip, ale dalej to samo jest po zapakowaniu.

Opublikowano

Odnośnie braku tytułów i opisów dla rzeczy w eq, w moim przypadku pomogła edycja 3 linijek po stronie klienta w uitooltip.py, a mianowicie:

linia132: self.auxiliaryDict = "" -> self.auxiliaryDict = {}
linia140: self.auxiliaryDict = "" -> self.auxiliaryDict = {}

+dodanie # przy linijce jak ktoś wyżej napisał
#self.auxiliaryDict = kwargs.get("auxiliaryDict", player.GetAuxiliaryString(window_type, slotIndex))

Samo dodanie # bez zmiany linii 132 i 140 nie zadziałało

Zamieniłem znaki "" na {} i naprawiło się. Nie wiem czy przy okazji nie wysypałem czegoś innego bo nie siedzę na co dzień w tym, ale po tym udało mi się to naprawić i nie zauważyłem żeby coś innego się wykrzyczało.

Opublikowano

Ktoś wie czemu mam błąd podczas łączenia się z serwerem? Obstawiam, że client ma inne ip ustawione ale nigdzie nie mogę znaleźć serverinfo.py a root jest jakoś dziwnie zaszyfrowany + ten unpacker nie działa co jest w folderze pack. Siedzę nad tym pół dnia i za chiny nie mogę tego uruchomić.

Opublikowano
7 godzin temu, xBodzio23 napisał(a):

Ktoś wie czemu mam błąd podczas łączenia się z serwerem? Obstawiam, że client ma inne ip ustawione ale nigdzie nie mogę znaleźć serverinfo.py a root jest jakoś dziwnie zaszyfrowany + ten unpacker nie działa co jest w folderze pack. Siedzę nad tym pół dnia i za chiny nie mogę tego uruchomić.

Musisz pobrać PackMakerLite i exe wrzucić do pack, żebyś .bat mógł używać. Powinien być na forum.

Edytowane przez Magdon

Opublikowano
W dniu 11.02.2026 o 23:19, Sasori napisał(a):

Łapta skrypt w pythonie by chat GPT do wyciągniecie item proto i mob proto Z MT2009 do txt

Skrypt

#!/usr/bin/env python3# -*- coding: utf-8 -*-

import pymysql

# =========================# USTAWIENIA POŁĄCZENIA# =========================
host_mysql = "adres_aj_pi"
user_mysql = "login_usera"
passwd_mysql = "haslo_usera*"
db_name = "world"       #-- Nowa struktura tabeli world na mt2009 
port_mysql = 3306def mysql_connect():
    """
    Wymusza kodowanie połączenia na utf8mb4, żeby polskie znaki wracały poprawnie.
    """
    return pymysql.connect(
        host=host_mysql,
        user=user_mysql,
        password=passwd_mysql,
        database=db_name,
        port=port_mysql,
        charset="utf8mb4",
        use_unicode=True,
        init_command="SET NAMES utf8mb4 COLLATE utf8mb4_general_ci",
        autocommit=True,
        cursorclass=pymysql.cursors.Cursor,
    )


def fix_text(v):
    """
    Naprawa typowych krzaków z baz Metin2:
    - latin1->utf8 (mojibake)
    - latin1->cp1250 (PL znaki typu: D³ugi = Długi)
    """
    if v is None:
        return ""

    # jak DB zwróci bytes (rzadziej)
    if isinstance(v, (bytes, bytearray)):
        for enc in ("utf-8", "cp1250", "latin1"):
            try:
                return v.decode(enc)
            except UnicodeDecodeError:
                pass
        return v.decode("latin1", errors="replace")

    if not isinstance(v, str):
        return str(v)

    # 1) typowe mojibake: latin1 -> utf8
    try:
        repaired = v.encode("latin1").decode("utf-8")
        if repaired != v:
            return repaired
    except UnicodeError:
        pass

    # 2) klasyk Metin: CP1250 udaje latin1 (D³ugi, Pi±tek, itp.)
    try:
        repaired = v.encode("latin1").decode("cp1250")
        # jeśli to była taka konwersja, to zwykle znikają ³, ±, ¶ itd.
        if repaired != v:
            return repaired
    except UnicodeError:
        pass

    return v



def convert_mob_proto():
    rank = {
        1: "S_PAWN",
        2: "KNIGHT",
        3: "S_KNIGHT",
        4: "BOSS",
        5: "KING",
    }

    typeee = {
        1: "NPC",
        2: "STONE",
        3: "WARP",
        4: "DOOR",
        5: "BUILDING",
        7: "POLYMORPH_PC",
        8: "HORSE",
        9: "GOTO",
    }

    battletype = {
        2: "RANGE",
        3: "MAGIC",
        4: "SPECIAL",
        5: "POWER",
        6: "TANKER",
    }

    def q(s: str) -> str:
        return f"\"{s}\""

    def get_rank(level):
        return q(rank.get(level, "PAWN"))

    def get_type(typee_):
        return q(typeee.get(typee_, "MONSTER"))

    def get_battletype(battle):
        return q(battletype.get(battle, "MELEE"))

    def get_flag(flag):
        flag = fix_text(flag)
        return "" if flag == "" else q(flag)

    def get_race(race):
        race = fix_text(race)
        return "" if race == "" else q(race)

    def get_immune(immune):
        immune = fix_text(immune)
        return "" if immune == "" else q(immune)

    def get_folder(folder):
        folder = fix_text(folder)
        return q("wolf" if folder == "" else folder)

    print("Connecting to database proto...")
    db = mysql_connect()
    print("Connected.")

    with db.cursor() as cur:
        cur.execute("SELECT * FROM mob_proto")
        rows = cur.fetchall()

    # utf-8-sig = UTF-8 z BOM (Windows/Notepad od razu widzi polskie znaki)
    with open("mob_proto.txt", "w", encoding="utf-8-sig", newline="") as out_file_mobproto, \
         open("mob_names.txt", "w", encoding="utf-8-sig", newline="") as out_file_mobnames:

        print("Converting mob_proto...")

        for row in rows:
            mob_proto_line = (
                "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s"
                % (
                    row[0],
                    f"\"{fix_text(row[1])}\"",
                    get_rank(row[3]),
                    get_type(row[4]),
                    get_battletype(row[5]),
                    row[6],
                    row[7],
                    get_flag(row[8]),
                    row[9],
                    get_race(row[10]),
                    get_immune(row[11]),
                    row[12],
                    get_folder(row[13]),
                    row[14],
                    row[15],
                    row[16],
                    row[17],
                    row[18],
                    row[19],
                    row[20],
                    row[21],
                    row[22],
                    row[23],
                    row[24],
                    row[25],
                    row[26],
                    row[27],
                    row[28],
                    row[29],
                    row[30],
                    row[31],
                    row[32],
                    row[33],
                    row[34],
                    row[35],
                    row[36],
                    row[37],
                    row[38],
                    row[39],
                    row[40],
                    row[41],
                    row[42],
                    row[43],
                    row[44],
                    row[45],
                    row[46],
                    row[47],
                    row[48],
                    row[49],
                    row[50],
                    row[51],
                    row[52],
                    row[53],
                    row[54],
                    row[55],
                    row[56],
                    row[57],
                    row[58],
                    row[59],
                    row[60],
                    row[61],
                    row[62],
                    row[63],
                    row[64],
                    row[65],
                    row[66],
                    row[67],
                    row[68],
                    row[69],
                    row[70],
                    row[71],
                )
            )

            mob_names_line = "%s\t%s" % (row[0], fix_text(row[2]))

            out_file_mobproto.write(mob_proto_line + "\r\n")
            out_file_mobnames.write(mob_names_line + "\r\n")

    db.close()
    print("Mob proto converted!")
    return "OK"def convert_item_proto():
    item_type = {
        0: "ITEM_NONE",
        1: "ITEM_WEAPON",
        2: "ITEM_ARMOR",
        3: "ITEM_USE",
        4: "ITEM_AUTOUSE",
        5: "ITEM_MATERIAL",
        6: "ITEM_SPECIAL",
        7: "ITEM_TOOL",
        8: "ITEM_LOTTERY",
        9: "ITEM_ELK",
        10: "ITEM_METIN",
        11: "ITEM_CONTAINER",
        12: "ITEM_FISH",
        13: "ITEM_ROD",
        14: "ITEM_RESOURCE",
        15: "ITEM_CAMPFIRE",
        16: "ITEM_UNIQUE",
        17: "ITEM_SKILLBOOK",
        18: "ITEM_QUEST",
        19: "ITEM_POLYMORPH",
        20: "ITEM_TREASURE_BOX",
        21: "ITEM_TREASURE_KEY",
        22: "ITEM_SKILLFORGET",
        23: "ITEM_GIFTBOX",
        24: "ITEM_PICK",
        25: "ITEM_HAIR",
        26: "ITEM_TOTEM",
        27: "ITEM_BLEND",
        28: "ITEM_COSTUME",
        29: "ITEM_DS",
        30: "ITEM_SPECIAL_DS",
        31: "ITEM_EXTRACT",
        32: "ITEM_SECONDARY_COIN",
        33: "ITEM_RING",
        34: "ITEM_BELT",
    }

    item_subtype = {
        1: {
            0: "WEAPON_SWORD",
            1: "WEAPON_DAGGER",
            2: "WEAPON_BOW",
            3: "WEAPON_TWO_HANDED",
            4: "WEAPON_BELL",
            5: "WEAPON_FAN",
            6: "WEAPON_ARROW",
            7: "WEAPON_MOUNT_SPEAR",
            8: "WEAPON_NUM_TYPES",
        },
        2: {
            0: "ARMOR_BODY",
            1: "ARMOR_HEAD",
            2: "ARMOR_SHIELD",
            3: "ARMOR_WRIST",
            4: "ARMOR_FOOTS",
            5: "ARMOR_NECK",
            6: "ARMOR_EAR",
            7: "ARMOR_NUM_TYPES",
        },
        3: {
            0: "USE_POTION",
            1: "USE_TALISMAN",
            2: "USE_TUNING",
            3: "USE_MOVE",
            4: "USE_TREASURE_BOX",
            5: "USE_MONEYBAG",
            6: "USE_BAIT",
            7: "USE_ABILITY_UP",
            8: "USE_AFFECT",
            9: "USE_CREATE_STONE",
            10: "USE_SPECIAL",
            11: "USE_POTION_NODELAY",
            12: "USE_CLEAR",
            13: "USE_INVISIBILITY",
            14: "USE_DETACHMENT",
            15: "USE_BUCKET",
            16: "USE_POTION_CONTINUE",
            17: "USE_CLEAN_SOCKET",
            18: "USE_CHANGE_ATTRIBUTE",
            19: "USE_ADD_ATTRIBUTE",
            20: "USE_ADD_ACCESSORY_SOCKET",
            21: "USE_PUT_INTO_ACCESSORY_SOCKET",
            22: "USE_ADD_ATTRIBUTE2",
            23: "USE_RECIPE",
            24: "USE_CHANGE_ATTRIBUTE2",
            25: "USE_BIND",
            26: "USE_UNBIND",
            27: "USE_TIME_CHARGE_PER",
            28: "USE_TIME_CHARGE_FIX",
            29: "USE_PUT_INTO_BELT_SOCKET",
            30: "USE_PUT_INTO_RING_SOCKET",
        },
        4: {
            0: "AUTOUSE_POTION",
            1: "AUTOUSE_ABILITY_UP",
            2: "AUTOUSE_BOMB",
            3: "AUTOUSE_GOLD",
            4: "AUTOUSE_MONEYBAG",
            5: "AUTOUSE_TREASURE_BOX",
        },
        5: {
            0: "MATERIAL_LEATHER",
            1: "MATERIAL_BLOOD",
            2: "MATERIAL_ROOT",
            3: "MATERIAL_NEEDLE",
            4: "MATERIAL_JEWEL",
            5: "MATERIAL_DS_REFINE_NORMAL",
            6: "MATERIAL_DS_REFINE_BLESSED",
            7: "MATERIAL_DS_REFINE_HOLLY",
        },
        6: {
            0: "SPECIAL_MAP",
            1: "SPECIAL_KEY",
            2: "SPECIAL_DOC",
            3: "SPECIAL_SPIRIT",
        },
        7: {0: "TOOL_FISHING_ROD"},
        8: {0: "LOTTERY_TICKET", 1: "LOTTERY_INSTANT"},
        10: {0: "METIN_NORMAL", 1: "METIN_GOLD"},
        12: {0: "FISH_ALIVE", 1: "FISH_DEAD"},
        14: {
            0: "RESOURCE_FISHBONE",
            1: "RESOURCE_WATERSTONEPIECE",
            2: "RESOURCE_WATERSTONE",
            3: "RESOURCE_BLOOD_PEARL",
            4: "RESOURCE_BLUE_PEARL",
            5: "RESOURCE_WHITE_PEARL",
            6: "RESOURCE_BUCKET",
            7: "RESOURCE_CRYSTAL",
            8: "RESOURCE_GEM",
            9: "RESOURCE_STONE",
            10: "RESOURCE_METIN",
            11: "RESOURCE_ORE",
        },
        16: {
            0: "UNIQUE_NONE",
            1: "UNIQUE_BOOK",
            2: "UNIQUE_SPECIAL_RIDE",
            3: "UNIQUE_3",
            4: "UNIQUE_4",
            5: "UNIQUE_5",
            6: "UNIQUE_6",
            7: "UNIQUE_7",
            8: "UNIQUE_8",
            9: "UNIQUE_9",
            10: "USE_SPECIAL",
        },
        28: {0: "COSTUME_BODY", 1: "COSTUME_HAIR"},
        29: {
            0: "DS_SLOT1",
            1: "DS_SLOT2",
            2: "DS_SLOT3",
            3: "DS_SLOT4",
            4: "DS_SLOT5",
            5: "DS_SLOT6",
        },
        31: {0: "EXTRACT_DRAGON_SOUL", 1: "EXTRACT_DRAGON_HEART"},
    }

    wearflag = {
        1: "WEAR_BODY",
        2: "WEAR_HEAD",
        4: "WEAR_FOOTS",
        8: "WEAR_WRIST",
        16: "WEAR_WEAPON",
        32: "WEAR_NECK",
        64: "WEAR_EAR",
        128: "WEAR_SHIELD",
        256: "WEAR_UNIQUE",
        512: "WEAR_ARROW",
        1024: "WEAR_HAIR",
        2048: "WEAR_ABILITY",
    }

    limittype = {
        1: "LEVEL",
        2: "STR",
        3: "DEX",
        4: "INT",
        5: "CON",
        6: "PC_BANG",
        7: "REAL_TIME",
        8: "REAL_TIME_FIRST_USE",
        9: "TIMER_BASED_ON_WEAR",
    }

    bonus = {
        1: "APPLY_MAX_HP",
        2: "APPLY_MAX_SP",
        3: "APPLY_CON",
        4: "APPLY_INT",
        5: "APPLY_STR",
        6: "APPLY_DEX",
        7: "APPLY_ATT_SPEED",
        8: "APPLY_MOV_SPEED",
        9: "APPLY_CAST_SPEED",
        10: "APPLY_HP_REGEN",
        11: "APPLY_SP_REGEN",
        12: "APPLY_POISON_PCT",
        13: "APPLY_STUN_PCT",
        14: "APPLY_SLOW_PCT",
        15: "APPLY_CRITICAL_PCT",
        16: "APPLY_PENETRATE_PCT",
        17: "APPLY_ATTBONUS_HUMAN",
        18: "APPLY_ATTBONUS_ANIMAL",
        19: "APPLY_ATTBONUS_ORC",
        20: "APPLY_ATTBONUS_MILGYO",
        21: "APPLY_ATTBONUS_UNDEAD",
        22: "APPLY_ATTBONUS_DEVIL",
        23: "APPLY_STEAL_HP",
        24: "APPLY_STEAL_SP",
        25: "APPLY_MANA_BURN_PCT",
        26: "APPLY_DAMAGE_SP_RECOVER",
        27: "APPLY_BLOCK",
        28: "APPLY_DODGE",
        29: "APPLY_RESIST_SWORD",
        30: "APPLY_RESIST_TWOHAND",
        31: "APPLY_RESIST_DAGGER",
        32: "APPLY_RESIST_BELL",
        33: "APPLY_RESIST_FAN",
        34: "APPLY_RESIST_BOW",
        35: "APPLY_RESIST_FIRE",
        36: "APPLY_RESIST_ELEC",
        37: "APPLY_RESIST_MAGIC",
        38: "APPLY_RESIST_WIND",
        39: "APPLY_REFLECT_MELEE",
        40: "APPLY_REFLECT_CURSE",
        41: "APPLY_POISON_REDUCE",
        42: "APPLY_KILL_SP_RECOVER",
        43: "APPLY_EXP_DOUBLE_BONUS",
        44: "APPLY_GOLD_DOUBLE_BONUS",
        45: "APPLY_ITEM_DROP_BONUS",
        46: "APPLY_POTION_BONUS",
        47: "APPLY_KILL_HP_RECOVER",
        48: "APPLY_IMMUNE_STUN",
        49: "APPLY_IMMUNE_SLOW",
        50: "APPLY_IMMUNE_FALL",
        51: "APPLY_SKILL",
        52: "APPLY_BOW_DISTANCE",
        53: "APPLY_ATT_GRADE_BONUS",
        54: "APPLY_DEF_GRADE_BONUS",
        55: "APPLY_MAGIC_ATT_GRADE",
        56: "APPLY_MAGIC_DEF_GRADE",
        57: "APPLY_CURSE_PCT",
        58: "APPLY_MAX_STAMINA",
        59: "APPLY_ATTBONUS_WARRIOR",
        60: "APPLY_ATTBONUS_ASSASSIN",
        61: "APPLY_ATTBONUS_SURA",
        62: "APPLY_ATTBONUS_SHAMAN",
        63: "APPLY_ATTBONUS_MONSTER",
        64: "APPLY_MALL_ATTBONUS",
        65: "APPLY_MALL_DEFBONUS",
        66: "APPLY_MALL_EXPBONUS",
        67: "APPLY_MALL_ITEMBONUS",
        68: "APPLY_MALL_GOLDBONUS",
        69: "APPLY_MAX_HP_PCT",
        70: "APPLY_MAX_SP_PCT",
        71: "APPLY_SKILL_DAMAGE_BONUS",
        72: "APPLY_NORMAL_HIT_DAMAGE_BONUS",
        73: "APPLY_SKILL_DEFEND_BONUS",
        74: "APPLY_NORMAL_HIT_DEFEND_BONUS",
        75: "APPLY_PC_BANG_EXP_BONUS",
        76: "APPLY_PC_BANG_DROP_BONUS",
        77: "APPLY_EXTRACT_HP_PCT",
        78: "APPLY_RESIST_WARRIOR",
        79: "APPLY_RESIST_ASSASSIN",
        80: "APPLY_RESIST_SURA",
        81: "APPLY_RESIST_SHAMAN",
        82: "APPLY_ENERGY",
        83: "APPLY_DEF_GRADE",
        84: "APPLY_COSTUME_ATTR_BONUS",
        85: "APPLY_MAGIC_ATTBONUS_PER",
        86: "APPLY_MELEE_MAGIC_ATTBONUS_PER",
        87: "APPLY_RESIST_ICE",
        88: "APPLY_RESIST_EARTH",
        89: "APPLY_RESIST_DARK",
        90: "APPLY_ANTI_CRITICAL_PCT",
        91: "APPLY_ANTI_PENETRATE_PCT",
    }

    errors = ""

    def q(s: str) -> str:
        return f"\"{s}\""

    def get_item_type(t, vnum):
        nonlocal errors
        errors = ""
        if t in item_type:
            return item_type[t]
        errors += f"Strange type in item {vnum}\r\n"
        return item_type[0]

    def get_item_subtype(t, st, vnum):
        nonlocal errors
        errors = ""
        if t in item_subtype and st in item_subtype[t]:
            return item_subtype[t][st]
        errors += f"Strange subtype in item {vnum}\r\n"
        return "NONE"

    def get_antiflag(antiflag, vnum):
        nonlocal errors
        s = ""
        for bit, name in [
            (131072, "ANTI_SAFEBOX"),
            (65536, "ANTI_MYSHOP"),
            (32768, "ANTI_STACK"),
            (16384, "ANTI_PKDROP"),
            (8192, "ANTI_GIVE"),
            (4096, "ANTI_SAVE"),
            (2048, "ANTI_EMPIRE_C"),
            (1024, "ANTI_EMPIRE_B"),
            (512, "ANTI_EMPIRE_A"),
            (256, "ANTI_SELL"),
            (64, "ANTI_GET"),
            (32, "ANTI_MUDANG"),
            (16, "ANTI_SURA"),
            (8, "ANTI_ASSASSIN"),
            (4, "ANTI_MUSA"),
            (2, "ANTI_MALE"),
            (1, "ANTI_FEMALE"),
        ]:
            if antiflag >= bit:
                antiflag -= bit
                s = name if not s else f"{name} | {s}"

        if antiflag == 0 and s:
            return q(s)

        errors += f"Strange antiflag in item {vnum}\r\n"
        return "\"NONE\""

    def get_flag(flag, vnum):
        nonlocal errors
        s = ""
        for bit, name in [
            (32768, "ITEM_APPLICABLE"),
            (16384, "REFINEABLE"),
            (8192, "LOG"),
            (4096, "ITEM_QUEST"),
            (2048, "QUEST_GIVE"),
            (1024, "QUEST_USE_MULTIPLE"),
            (512, "QUEST_USE"),
            (256, "CONFIRM_WHEN_USE"),
            (128, "ITEM_IRREMOVABLE"),
            (64, "ITEM_MAKECOUNT"),
            (32, "ITEM_UNIQUE"),
            (16, "ITEM_SLOW_QUERY"),
            (8, "COUNT_PER_1GOLD"),
            (4, "ITEM_STACKABLE"),
            (2, "ITEM_SAVE"),
            (1, "ITEM_TUNABLE"),
        ]:
            if flag >= bit:
                flag -= bit
                s = name if not s else f"{name} | {s}"

        if flag == 0 and s:
            return q(s)

        errors += f"Strange flag in item {vnum}\r\n"
        return "\"NONE\""

    def get_wearflag(wear, vnum):
        nonlocal errors
        if wear in wearflag:
            return q(wearflag[wear])
        errors += f"Strange wearflag in item {vnum}\r\n"
        return "\"NONE\""

    def get_immuneflag(_immune):
        return "\"NONE\""

    def get_limittype(limit):
        return q(limittype.get(limit, "LIMIT_NONE"))

    def get_apply(apply):
        return q(bonus.get(apply, "APPLY_NONE"))

    print("Connecting to database proto...")
    db = mysql_connect()
    print("Connected.")

    with db.cursor() as cur:
        cur.execute("SELECT * FROM item_proto")
        rows = cur.fetchall()

    # utf-8-sig = UTF-8 z BOM (Windows/Notepad od razu widzi polskie znaki)
    with open("item_proto.txt", "w", encoding="utf-8-sig", newline="") as out_file_itemproto, \
         open("item_names.txt", "w", encoding="utf-8-sig", newline="") as out_file_itemnames:

        print("Converting item_proto...")

        for row in rows:
            item_proto_line = (
                "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s"
                % (
                    row[0],
                    f"\"{fix_text(row[1])}\"",
                    q(get_item_type(row[3], row[0])),
                    q(get_item_subtype(row[3], row[4], row[0])),
                    row[6],
                    get_antiflag(row[7], row[0]),
                    get_flag(row[8], row[0]),
                    get_wearflag(row[9], row[0]),
                    get_immuneflag(row[10]),
                    row[11],
                    row[12],
                    row[13],
                    row[14],
                    row[16],
                    get_limittype(row[17]),
                    row[18],
                    get_limittype(row[19]),
                    row[20],
                    get_apply(row[21]),
                    row[22],
                    get_apply(row[23]),
                    row[24],
                    get_apply(row[25]),
                    row[26],
                    row[27],
                    row[28],
                    row[29],
                    row[30],
                    row[31],
                    row[32],
                    row[39],
                    row[40],
                    row[41],
                )
            )

            item_names_line = "%s\t%s" % (row[0], fix_text(row[2]))

            out_file_itemproto.write(item_proto_line + "\r\n")
            out_file_itemnames.write(item_names_line + "\r\n")

    db.close()
    print("Item proto converted!")
    return "OK"if __name__ == "__main__":
    print(convert_item_proto())
    print(convert_mob_proto())

Dump_proto mt2009

dump_proto.exe

Po wygenerowaniu plików txt i spakowaniu jest błąd i gra się zawiesza przy wchodziu. Różnią się od ryginału wielkościa

Opublikowano
39 minut temu, Nietykalny napisał(a):

Po wygenerowaniu plików txt i spakowaniu jest błąd i gra się zawiesza przy wchodziu. Różnią się od ryginału wielkościa

No to chyba inny wyciek mamy bo u mnie śmiga xd

Opublikowano

Ktoś naprawił laga przy zmianie itemów, albo może nakierować co jest powodem?

Opublikowano
8 godzin temu, Magdon napisał(a):

Musisz pobrać PackMakerLite i exe wrzucić do pack, żebyś .bat mógł używać. Powinien być na forum.

Tak właśnie zrobiłem, ale niby pisze mi "root unpack" ale nie mam nigdzie tych plików i folderu root. Nie wiem gdzie się to wypakowuję.

Opublikowano
16 godzin temu, xBodzio23 napisał(a):

tak właśnie zrobiłem, ale niby pisze mi "root unpack" ale nie mam nigdzie tych plików i folderu root. Nie wiem gdzie się to wypakowywuje.

Musisz przeciągnąć plik na plik bat, nie otwierasz .bat

Opublikowano
2 godziny temu, Magdon napisał(a):

Musisz przeciągnąć plik na plik bat, nie otwierasz .bat

tak wlasnie robie. Na innych plikach serwerowych działa a tutaj nie.

Opublikowano
  • Autor
5 minut temu, xBodzio23 napisał(a):

tak wlasnie robie. Na innych plikach serwerowych działa a tutaj nie.

Bro wszystko działa wrzucasz do pack program PackMakerLite.exe, który pobierasz z forum. I wtedy przeciągasz plik .index na plik PackMakerLite_u.bat otworzy się konsola i rozpakuje plik pojawi się rozpakowany folder.

Opublikowano
1 godzinę temu, Sevence napisał(a):

Bro wszystko działa wrzucasz do pack program PackMakerLite.exe, który pobierasz z forum. I wtedy przeciągasz plik .index na plik PackMakerLite_u.bat otworzy się konsola i rozpakuje plik pojawi się rozpakowany folder.

https://youtu.be/EOszp3QyAYY

Bro specjalnie dla ciebie nagrałem to, drugi client to dla porównania odpakowanie roota na cliencie TMP4 i tam wszystko działa.

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Konto

Nawigacja

Skonfiguruj powiadomienia push w przeglądarce.

Chrome (Android)
  1. Stuknij ikonę kłódki obok paska adresu.
  2. Wybierz Uprawnienia → Powiadomienia.
  3. Dostosuj swoje preferencje.
Chrome (Desktop)
  1. Kliknij ikonę kłódki na pasku adresu.
  2. Wybierz Ustawienia witryny.
  3. Znajdź Powiadomienia i dostosuj swoje preferencje.