Leaderboard


Popular Content

Showing content with the highest reputation since 11/09/2019 in all areas

  1. 24 points
    Hey everybody! Long time no release, so I would like to share this small stuff with you. With this you can change the values of the bonuses in an item. There are two types of the new switcher: Normal: rolls the bonus values from all of the available values (value0=0) Plus: sets the bonuses to the max. value (value0=1) Demo: Download ps.: any problem appears, just tell us in comment.
  2. 15 points
    #! /usr/bin/env python # -*- coding: utf-8 -*- __name__ = "ProtoChecker" __author__ = "VegaS" __date__ = "2019-11-18" __version__ = "0.0.3" import sys import os import string import csv # Set the base color of command prompt os.system("color 00") # Set working directory os.chdir(os.path.dirname(os.path.realpath(__file__))) # Auto detection of vnum range VNUM_RANGE_ITEM_VNUM_START = 110000 # Start item vnum VNUM_RANGE_ITEM_VNUM_END = 165400 # End item vnum VNUM_RANGE = 99 # itemVnumStart~itemVnumEnd+99 VNUM_RANGE_DELIMITER = '~' # Separator ################################################# ## Builtin translations ################################################# COLOR_GREEN = "\033[92m{}\033[00m" COLOR_RED = "\033[91m{}\033[00m" COLOR_GRAY = "\033[37m{}\033[00m" TRANSLATE_DICT = { "FILE_EMPTY": COLOR_RED.format("File {} is empty."), "FILE_NAME": COLOR_GRAY.format("Reading file: {}"), "FILE_OK": COLOR_GREEN.format("\tOK"), "FILE_TOTAL_LINES": COLOR_RED.format("\tTotal lines: {}"), "FILE_DUPLICATE_LINE": COLOR_RED.format("\tDuplicated itemVnum: {} at line: {}"), "FILE_COMPARING_LINE": COLOR_RED.format("\tMissing itemVnum: {}"), } for localeName, localeValue in TRANSLATE_DICT.items(): locals().update({localeName: localeValue}) ################################################# ## ProtoChecker ################################################# class ProtoChecker: BASE_PATH = "resource\\" LOG_FILE_NAME = 'syslog.txt' ITEM_PROTO_FILE_NAME = BASE_PATH + 'item_proto.txt' ITEM_NAMES_FILE_NAME = BASE_PATH + 'item_names.txt' MOB_PROTO_FILE_NAME = BASE_PATH + 'mob_proto.txt' MOB_NAMES_FILE_NAME = BASE_PATH + 'mob_names.txt' def __init__(self): self.outputFileList = [] self.itemProtoDict = self.load_file(self.ITEM_PROTO_FILE_NAME) self.itemNamesDict = self.load_file(self.ITEM_NAMES_FILE_NAME) self.mobProtoDict = self.load_file(self.MOB_PROTO_FILE_NAME) self.mobNamesDict = self.load_file(self.MOB_NAMES_FILE_NAME) def load_file(self, fileName): fileExists = os.path.exists(fileName) if fileExists: if os.path.getsize(fileName) == 0: self.write_log(FILE_EMPTY.format(fileName)) self.create_syslog() sys.exit(0) fileData = [] vnumRangeSet = set() if fileExists: with open(fileName, 'r') as csv_file: csv_reader = csv.reader(csv_file, delimiter='\t') next(csv_reader, None) for row in csv_reader: if row: column = row[0] if VNUM_RANGE_DELIMITER in column: vnumRangeSet.add(tuple(map(int, column.split(VNUM_RANGE_DELIMITER)))) fileData.append(column) fileData.sort() return {'name': fileName, 'data': fileData, 'range': vnumRangeSet, 'exists': fileExists} def find_duplicate(self, file): if not file["exists"]: return self.write_log(FILE_NAME.format(file["name"])) duplicateSet = set([itemVnum for itemVnum in file["data"] if file["data"].count(itemVnum) > 1]) for itemVnum in duplicateSet: self.write_log(FILE_DUPLICATE_LINE.format(itemVnum, len(file["data"]) - file["data"][-1::-1].index(itemVnum) + 1)) self.write_log(FILE_TOTAL_LINES.format(duplicateSet.__len__()) if duplicateSet else FILE_OK) # noinspection PyDefaultArgument def compare(self, firstFile, secondFile): differenceList = [] def check_diff(value, data): if value not in data: differenceList.append(value) if not firstFile['exists'] or not secondFile['exists']: return self.write_log(FILE_NAME.format(secondFile['name'])) cmpItemProto = secondFile['name'] == self.ITEM_PROTO_FILE_NAME cmpItemNames = secondFile['name'] == self.ITEM_NAMES_FILE_NAME if cmpItemProto or cmpItemNames: for itemVnum in firstFile['data']: baseItemVnum = itemVnum # Comparing item_names with item_proto if cmpItemProto: intItemVnum = int(itemVnum) if intItemVnum in range(VNUM_RANGE_ITEM_VNUM_START, VNUM_RANGE_ITEM_VNUM_END + 1): itemVnumRange = '{start}{separator}{end}'.format(start=intItemVnum, separator=VNUM_RANGE_DELIMITER, end=intItemVnum + VNUM_RANGE) baseItemVnum = itemVnumRange check_diff(baseItemVnum, secondFile['data']) # Comparing item_proto with item_names elif cmpItemNames: if VNUM_RANGE_DELIMITER in itemVnum: itemVnumStart, itemVnumEnd = itemVnum.split(VNUM_RANGE_DELIMITER) baseItemVnum = itemVnumStart check_diff(baseItemVnum, secondFile['data']) else: # Comparing mob_proto with mob_names and vice-versa differenceList = list(set(firstFile['data']).difference(secondFile['data'])) if not differenceList: self.write_log(FILE_OK) return for itemVnum in differenceList: self.write_log(FILE_COMPARING_LINE.format(itemVnum)) self.write_log(FILE_TOTAL_LINES.format(differenceList.__len__())) def write_log(self, line, lineDelimiter='\n', formatDelimiter='{}'): sys.stdout.write(line + lineDelimiter) for color in (COLOR_GREEN, COLOR_RED, COLOR_GRAY): for item in color.split(formatDelimiter): line = line.replace(item, string.whitespace[0]) self.outputFileList.append(line) def create_syslog(self): with open(self.LOG_FILE_NAME, 'w') as out: out.write('\n'.join(self.outputFileList)) def run(self): self.write_log("###### START_CHECKING_FOR_DUPLICATE ######") for file in (self.itemProtoDict, self.itemNamesDict, self.mobProtoDict, self.mobNamesDict): self.find_duplicate(file) self.write_log("###### END_CHECKING_FOR_DUPLICATE ######\n") self.write_log("###### START_COMPARING ######") for files in ((self.itemProtoDict, self.itemNamesDict), (self.mobProtoDict, self.mobNamesDict)): for firstFile, secondFile in zip(files, reversed(files)): self.compare(firstFile, secondFile) self.write_log("###### END_COMPARING ######") self.create_syslog() protoChecker = ProtoChecker() protoChecker.run()
  3. 10 points
    The characters on the icons are in standard costumes and hairstyles. Download: https://mega.nz/#!qkkHUQob!HmP3KVA5Wc6gXLvvsFvvE3zDDmICgOGWwItefk5b2HE
  4. 7 points
    Idea:https://puu.sh/EGkkj/8dc3300bdd.png https://github.com/blackdragonx61/Metin2-Chat-Flash
  5. 7 points
    There's a better version instead of what i did some time ago, which find the differences directly, without check each progress index. tmpLoadStepList = tuple(zip(*self.loadStepList))[0] for progress in set(range(tmpLoadStepList[0], tmpLoadStepList[-1] + 1)).difference(tmpLoadStepList): self.loadStepList.append((progress, lambda: None)) self.loadStepList.sort()
  6. 6 points
    Hey M2DEV! Today i will show you my new tool. This tool checks item_names.txt and item_proto.txt for duplicates and also shows differences in these files. For example: Test 1: We take all the VNUM of the file item_names.txt and check the same VNUM in the item_proto.txt Test 2: We take all the VNUM of the file item_proto.txt and checks the same VNUM in the item_names.txt The result is written in the console and in a text file: output_log.txt DOWNLOAD ver.1.0.0.0 VT P.S We are waiting for the Python version by dear Vegas
  7. 5 points
    Hey m2dev. Today i will show you my new tool. This tool will allow you to clean your files (txt to example) from special symbols. If you do not understand why this tool, look spoiler. DOWNLOAD ver. 1.0.0.0 VT
  8. 5 points
    v19.6.7 Includes(all last modified files): New map New pet New boss New minigame gui elements New effects for the elemental refined weapons Locales(protos below) v19.6.7 Protos: Download v19.6.8 Locale w/ protos: Download
  9. 4 points
    fast fix with small logic int i_add = (strstr(m_fontName, "Tahoma") == 0) ? 1 : 0; //for more fonts TextOutW(hDC, m_x + i_add, m_y, &keyValue, 1);
  10. 3 points
    wtf? it turns out instead of the standard mobs it allows you to make all the mobs visually dogs. Who the hell needs it? do you consider this optimization in its purest form? Anyway thanks for the release.
  11. 3 points
    Now creating servers for developers will become even easier. We've put a lot of useful stuff together with dear Vegas lately.
  12. 3 points
    Sexy. But I hope the server shuts down before 2 years :kappa:
  13. 3 points
    Search for: local bonuses = { [1] = {3,40,"Ενέργεια Ζωής "}, [2] = {4,40,"Ευφυΐα "}, [3] = {5,40,"Δύναμη "}, [4] = {6,40,"Ευκινησία "}, [5] = {11,20,"Ενέργεια Ζωής & Δύναμη "}, [6] = {11,20,"Ευφυΐα & Δύναμη "}, [7] = {11,20,"Ευφυΐα & Ευκινησία "}, [8] = {11,20,"Δύναμη & Ευκινησία "}, } affect.add(567, bonuses[s][1], bonuses[s][2], bonuses[s][3], bonuses[s][4], bonuses[s][5], bonuses[s][6], bonuses[s][7], bonuses[s][8], 60*60*24*365*2) Replace with: local bonus_info_table = { {{apply.CON, 40, "Ενέργεια Ζωής"}}, {{apply.INT, 40, "Ευφυΐα"}}, {{apply.STR, 40, "Δύναμη"}}, {{apply.DEX, 40, "Ευκινησία"}}, {{apply.CON, 15, "Ενέργεια Ζωής"}, {apply.STR, 15, "Δύναμη"}}, {{apply.INT, 15, "Ευφυΐα"}, {apply.STR, 15, "Δύναμη"}}, {{apply.INT, 15, "Ευφυΐα"}, {apply.DEX, 15, "Ευκινησία"}}, {{apply.STR, 15, "Δύναμη"}, {apply.DEX, 15, "Ευκινησία"}} } for k, v in ipairs(bonus_info_table[s]) do local index, value, name = unpack(v) affect.add_collect(index, value, 60 * 60 * 24 * 365 * 2) chat(string.format("[Biolog] You received +%d%% %s", value, name)) end
  14. 3 points
    Hello guys, I have finished couple mounts from wow and I would like to share this one with you! Best Regards, Baltazar download link: https://mega.nz/#!ZBJxyAzR!wfmsiC4M-2fM8w2-M6yyUEAtIKZEUXajXv4p4NSuL0Y
  15. 3 points
  16. 3 points
    Good idea, if somebody wants the source code, here's my faster python version, when i've time i'll upload to git.
  17. 2 points
    There are a lot of people which had problem with localeInfo because korean-characters and bad encoding, there's a clean file with refactored code. Removed all the code which isn't used like korean characters < bad encoding [runmain error / crash](editors problem) and more checks. Removed over 500 lines unused. Removed function mapping(**kwargs) and use constructor of dict > dict(**kwarg) which is same (**kwarg let you take arbitrary number of keyword arguments). Removed function CutMoneyString because is used just when locale is HongKong, CIBN. Removed check IsYMIR from function LoadLocaleData which load locale as locale/ymir or locale/we_korea. Removed GUILD_MARK_NOT_ENOUGH_LEVEL, GUILD_HEADQUARTER, GUILD_FACILITY, GUILD_OBJECT, MAP_TRENT02, MAP_WL, MAP_NUSLUCK, MAP_TREE2, LOGIN_FAILURE_WEB_BLOCK, LOGIN_FAILURE_BLOCK_LOGIN, CHANNEL_NOTIFY_FULL, now they're readed directly from locale_game.txt. Removed declared global variables. Removed checks for declaring LOCALE_FILE_NAME, FN_GM_MARK and use current path. Removed korean functions/lists/dictionaries/characters GetAuxiliaryWordType, JOBINFO_DATA_LIST, dictSingleWord, dictDoubleWord, etc. Removed unused things: locale mapping, 'all' list etc. Removed IN_GAME_SHOP_ENABLE declaration, should be declared inside of constInfo directly. Removed checks (locale path) - 949, 932 == app.GetDefaultCodePage(), IsHONGKONG, IsNEWCIBN() or IsCIBN10() from declaration of functions like (NumberToMoneyString, NumberToSecondaryCoinString, ...),now they're declared directly from old style (IsEUROPE() and not IsWE_KOREA() and not IsYMIR()). Added custom string format(format_string, *args, **kwargs) instead of %. (old-style). Added new checks inside of LoadLocaleFile for security: Check if token3 (token1=original_string, token2=return-string, token3=function) function name exist in our types (SA, SNA, SAA, SAN) then try to call it. Check if string line have no tabs. Diff-checker: (856 Removals + 301 Additions) https://www.diffchecker.com/v1Nwk2r0 Download link
  18. 2 points
    UPDATE (i don't have so much time at the moment to do a proper documentation, i'll do asap) Here's a diff: https://github.com/Vegas007/Proto-Checker/commit/72d22ab74ef36d395e36f27ae6303ed51b85ade9 Read the files with csv library Added output file for logs Fixed index position of duplicate items Support for vnum range more... You can drag your files into resource folder and run the .bat + uploaded on git: https://github.com/Vegas007/Proto-Checker
  19. 2 points
    Thanks! Love you Mali
  20. 2 points
    Dear metin2.dev community, after nearly 6 years of metin2.dev and more than 4 years being the main administrator and owner of metin2.dev it’s time to pass this project to a new person. I would like to thank all current and past members of the team, and all members of metin2.dev who made this place to what it is today. But after all these years it’s time for me to move on and leave the metin2 underground section. Because of that we are looking for a new administration to take metin2.dev. We have multiple requirements for all candidates: You are well known in the scene You are a trusted person You must have committed a great value to the metin2 underground scene. If you do not meet all the requirements you can also make me an offer for metin2.dev. Included are: The board The discord server The sponsored webserver from Hyperfilter All registered domains (metin2.dev and metin2dev.org) You have to pay a renew fee for the domains to transfer these. The deadline for this is the 31th December 2019. If we didn’t find a new administration until then we will take metin2.dev offline. Best regards, metin2.dev - Administration
  21. 2 points
    Depend of your costume type, if is REAL_TIME and REAL_TIME_FIRST_USE you need to use get_global_time() for time verification, will be something like this static const DWORD COSTUME_EXTEND_TIME_LIMIT = (7 * 24 * 60 * 60) - get_global_time();
  22. 2 points
    I don't understand very well what you want, but you can try something like this. static const DWORD COSTUME_EXTEND_TIME_LIMIT = 7 * 24 * 60 * 60; const DWORD remain_sec = item2->GetSocket(ITEM_SOCKET_REMAIN_SEC); if (remain_sec >= COSTUME_EXTEND_TIME_LIMIT) { ChatPacket(CHAT_TYPE_INFO, "COSTUME_EXTEND_TIME_LIMIT"); return false; }
  23. 2 points
    But that deleted the items of all the players in the game. lol.
  24. 2 points
    Bug: Find in Client/UserInterface/PythonPlayerInputMouse.cpp: if (pkInstMain->NEW_GetDistanceFromDestPixelPosition(kPPosPickedItem)<20.0f) Change: float distance = 20.0f; if (pkInstMain->IsMountingHorse() || pkInstMain->IsNewMount()) distance = 110.0f; if (pkInstMain->NEW_GetDistanceFromDestPixelPosition(kPPosPickedItem) < distance)
  25. 2 points