Jump to content

Reached

Active+ Member
  • Posts

    21
  • Joined

  • Last visited

  • Feedback

    0%

1 Follower

About Reached

  • Birthday 01/03/2002

Informations

  • Gender
    Male
  • Country
    Turkey
  • Nationality
    Turkish

Social Networks

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

Reached's Achievements

Collaborator

Collaborator (7/16)

  • Collaborator
  • Very Popular Rare
  • Dedicated
  • Reacting Well
  • First Post

Recent Badges

473

Reputation

  1. 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
  2. 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
  3. # 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.
  4. 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.
  5. 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
  6. Thank you for your suggestions and corrections.
  7. 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.
  8. Download Alternative download links → Github Requirements python3 pip install bs4
  9. 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]
  10. Download Metin2 Download [Hidden Content] If you select 1; It compares your item_names, item_proto itemlist. If you select 2; It compares your mob_names, mob_proto, npclist.
  11. 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.
  12. 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]
  13. Thnx for release, btw they still steal xd.
×
×
  • 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.