-
Posts
21 -
Joined
-
Last visited
-
Feedback
0%
About Reached
- Birthday 01/03/2002
Metin2 Dev
Informations
-
Gender
Male
-
Country
Turkey
-
Nationality
Turkish
Development
- Github
Social Networks
-
Discord
Emir.#4017
-
Skype
live:noami_55
- Website
Recent Profile Visitors
The recent visitors block is disabled and is not being shown to other users.
Reached's Achievements
-
Reached started following Find mount mobs wihout folder
-
Hello, this is a script that will help you fill in the empty spaces of the folder section of the mount caused by missing additions in mob_proto. import os import chardet ITEM_PROTO_PATH = "item_proto.txt" MOB_PROTO_PATH = "mob_proto.txt" NPC_LIST_PATH = "npclist.txt" LOG_FILE_PATH = "no_folder_mounts.txt" MOB_NAMES_FILE_PATH = "mob_names.txt" MOUNT_WITH_FOLDERS = "mount_with_folders.txt" SERVER_DATA_FOLDER = "C:\\git\\CarbonSFv2\\server\\srv1\\share\\data\\monster" SERVER_MISSING_FOLDERS = "server_missing_folders.txt" MOUNT_TYPE = "ITEM_COSTUME" MOUNT_SUBTYPE = "COSTUME_MOUNT" MOUNT_LIST = [] MOUNT_WITH_NO_FOLDER = [] ITEM_TYPE = 2 ITEM_SUBTYPE = 3 ITEM_MOUNT_VALUE = 28 MOB_PROTO_MOUNT_VNUM = 0 MOB_PROTO_FOLDER_INDEX = 12 def process_file(file_path): with open(file_path, 'rb') as file: rawdata = file.read() encoding = chardet.detect(rawdata)['encoding'] #convert to utf-8 if not already if encoding and encoding.lower() != 'utf-8': with open(file_path, 'r', encoding=encoding) as file: content = file.read() with open(file_path, 'w', encoding='utf-8') as file: file.write(content) def checkCostumeMount(file_path): with open(file_path, 'r') as file: for line in file: if not line.strip(): continue split = line.split('\t') try: if split[ITEM_TYPE] == MOUNT_TYPE and split[ITEM_SUBTYPE] == MOUNT_SUBTYPE: MOUNT_LIST.append(split[ITEM_MOUNT_VALUE]) except IndexError: print("Index Error on line: " + line) def checkMobLine(file_path): process_file(file_path) with open(file_path, 'r', encoding='utf-8') as file: try: for line in file: if not line.strip(): continue split = line.split('\t') try: if split[MOB_PROTO_MOUNT_VNUM] in MOUNT_LIST and split[MOB_PROTO_FOLDER_INDEX] == "": print("Mount with no folder: " + split[MOB_PROTO_MOUNT_VNUM]) MOUNT_WITH_NO_FOLDER.append(split[MOB_PROTO_MOUNT_VNUM]) except IndexError: print("Index Error on line: " + line) except UnicodeDecodeError: print("UnicodeDecodeError on line: " + line) def writeIntoFile(file_path, log_file_path): logFile = open(log_file_path, 'w') with open(file_path, 'r') as file: for line in file: if not line.strip(): continue split = line.split('\t') try: if split[0] in MOUNT_WITH_NO_FOLDER: logFile.write(line) except IndexError: print("Index Error on line: " + line) logFile.close() def setFolder(file_path): mountWithFolders = open(MOUNT_WITH_FOLDERS, 'w') with open(file_path, 'r') as file: for line in file: if not line.strip(): continue split = line.split('\t') try: if split[0] in MOUNT_WITH_NO_FOLDER: mountWithFolders.write(line) except IndexError: print("Index Error on line: " + line) mountWithFolders.close() def checkFolderExist(folder_path): serverMissingFolders = open(SERVER_MISSING_FOLDERS, 'w') with open(MOUNT_WITH_FOLDERS, 'r') as file: for line in file: if not line.strip(): continue split = line.split('\t') folder = os.path.join(folder_path, split[1]) if not os.path.exists(folder): serverMissingFolders.write(folder + "\n") else: print("Folder exists: " + folder) serverMissingFolders.close() def main(): checkCostumeMount(ITEM_PROTO_PATH) checkMobLine(MOB_PROTO_PATH) writeIntoFile(MOB_NAMES_FILE_PATH, LOG_FILE_PATH) setFolder(NPC_LIST_PATH) checkFolderExist(SERVER_DATA_FOLDER) if __name__ == "__main__": main() Tutorial There are files for the vnums you need to complete in the mount_with_folder.txt file. You can complete the missing
- 1 reply
-
- 6
-
Reached started following Paid Service - Carbon Projects
-
Hello, we have prepared clean, short and performance based products using modern libraries. We hope you choose us at the point you need. Our Services: Systems. Error solving. UI Modules & construction. Preparing Tools & Analyzer Auto Item Sell Mob Drop Simulation Auto Event System Skill Set Bonus Extend Skill Duration Answer System Item Combination Spin Wheel Metinstone Hunt Queue Guild Ranking Guild War Options Guild War Gate Battle Pass Mac Dungeon Cooldown Jotun Thrym Dungeon Nemere Dungeon Our References: Nethan2 Ezel2 Project Luxu Nors/Milas Metin2 RoM2 Santoria2 Arogan2 Rhyzon2 Contact: Discord : reached
-
Thank you for your contribution.
-
Reached started following Translate Tool , Chat Stack , [C++]Client source c++20 and 4 others
-
# Search ENABLE_CHAT_COMMAND = True # Add below chatStack = [] LAST_SENTENCE_STACK_SIZE = 32 # Search def __PrevLastSentenceStack(self): # Change whole function def __PrevLastSentenceStack(self): if self.lastSentencePos < len(chatStack): self.lastSentencePos += 1 lastSentence = chatStack[-self.lastSentencePos] self.SetText(lastSentence) self.SetEndPosition() # Search def __NextLastSentenceStack(self): # Change whole function def __NextLastSentenceStack(self): if self.lastSentencePos > 1: self.lastSentencePos -= 1 lastSentence = chatStack[-self.lastSentencePos] self.SetText(lastSentence) self.SetEndPosition() # Search def __PushLastSentenceStack(self, text): # Change whole function. def __PushLastSentenceStack(self, text): global ENABLE_LAST_SENTENCE_STACK if not ENABLE_LAST_SENTENCE_STACK: return if len(text) <= 0: return if len(chatStack) > LAST_SENTENCE_STACK_SIZE: chatStack.pop(0) chatStack.append(text) It ensures that the saved message in the chat is not lost after teleporting.
-
Reached changed their profile photo
-
Thank you for sharing this tutorial, for the Set function error NetPacketHeaderMap.h //Add under the SPacketType struct TPacketType& createPacketType(int iSize = 0, bool bFlag = false) { return *(new TPacketType(iSize, bFlag)); } and replace all the //replace CNetworkPacketHeaderMap::TPacketType( //to this createPacketType( i solve it like this without any errors.
-
Download Alternative download links → Github Preview -> [Hidden Content] * When extracting a map from a files, it outputs all objects belonging to that map. * Rarely, some dds files are not put in the same folder with their gr2, so some objects may have problems with their textures. You can take the textures with the problem by hand by opening the gr2. * There is a video on how to do it in the Github README
-
Thank you for your suggestions and corrections.
-
Download Alternative download links → Github I like Aeldra's Nilay Dungeon so I made it. Allows you to hit a metinstone up to 50% health and start a stage within the stage. The logic is simple, do this to bosses etc. You can also adapt it. I added an example dungeon quest usage, you can easily understand the logic.
-
Download Metin2 Download It compares 2 diffrent locale_game (One is the language you want to convert and the other is the original) You can also use as locale_interface [Hidden Content] [Hidden Content]
-
Increase the value of a specific attribute
Reached replied to Reached's topic in Features & Metin2 Systems
yes, i shared -
Increase the value of a specific attribute
Reached replied to Reached's topic in Features & Metin2 Systems
Can you try like this else if (item->GetVnum() == 75891) { if ((item2->GetType() == ITEM_WEAPON) && item2->HasAttr(72)) { int16_t idx = item2->FindAttribute(72); int32_t value = item2->GetAttributeValue(idx)+1; if ((150 > item2->GetAttributeValue(idx)) && (item2->GetAttributeValue(idx) >= 50)) { item2->SetForceAttribute(idx, 72, value); } else { ChatPacket(CHAT_TYPE_INFO, "You can only use this item which is between 80-200 avg."); return false; } } else { ChatPacket(CHAT_TYPE_INFO, "You can only use this item on weapons with average damage."); return false; } } Uhm no, I don't want to get the value 32767. I just want to increase an attribute type 150 by increasing value and this code does that. if you gonna do ++value, you'll increase by 1, and equals value to value+1. But you don't set it trough the weapon. You just declare a value by variable and you'll just increase value by 1. -
Today I will share with you something simple. char_item.cpp // Add in the USE_CHANGE_ATTRIBUTE case else if (item->GetVnum() == 75891) { if ((item2->GetType() == ITEM_WEAPON) && item2->HasAttr(72)) { int16_t idx = item2->FindAttribute(72); int32_t value = item2->GetAttributeValue(idx)+1; if ((150 > item2->GetAttributeValue(idx)) && (item2->GetAttributeValue(idx) >= 50)) { item2->SetForceAttribute(idx, 72, value); } else { ChatPacket(CHAT_TYPE_INFO, "You can only use this item which is between 80-200 avg."); return false; } } else { ChatPacket(CHAT_TYPE_INFO, "You can only use this item on weapons with average damage."); return false; } } item_names.txt 75891 Efsun Arttırma item_proto.txt 75891 a_c ITEM_USE USE_CHANGE_ATTRIBUTE 1 ANTI_DROP | ANTI_SELL ITEM_STACKABLE | LOG NONE NONE 1000 0 0 0 0 LIMIT_NONE 0 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 0 0 0 0 0 0 0 0 0 [Hidden Content]
-
Thnx for release, btw they still steal xd.