Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 06/13/21 in all areas

  1. M2 Download Center Download Here ( Internal ) GitHub repository: [Hidden Content]
    3 points
  2. M2 Download Center Download Here ( Internal ) Download Here ( GitHub )
    3 points
  3. M2 Download Center Download Here ( Internal ) Github repository: [Hidden Content]
    2 points
  4. M2 Download Center Download Here ( Internal ) Download Here ( GitHub )
    1 point
  5. M2 Download Center Download Here ( Internal ) VirusTotal Download
    1 point
  6. M2 Download Center Download Here ( Internal ) Mega
    1 point
  7. M2 Download Center Download Here ( Internal ) Download Here ( GitHub ) Showing a message by specific error type when a item failed into refine. [Hidden Content]
    1 point
  8. Welcome hopeless developers, in an attempt to reduce some random questions, and considering I haven't found anything about this there, I'll share this small method to fix the packet errors, which requires thinking. There's no copy/paste here as it requires you to think of what you modified. This tutorial is, of course, indented for new people not for the rest. If you are interested in how to make a new packet, head here: What is it and how metin2 implementes it? Keeping things simple and understandable, a packet is an information exchanged between the Client or the Server. For example, when you press the button Space (to attack), the client will send an information (which is a packet), which will tell the server that we attacking the player Shiba324. Read this if you are more interested: [Hidden Content] Each packet needs to be identified in an unique way between client and server otherwise the client or server won't understand which thing you are sending, that's why each packet of Metin2 starts with "BYTE bId". We see this numbers inside an enum block (like PACKET_CG_LOGIN2 which identifies the login packet), while it's content is defined inside a struct block (like TPacketGCLogin2). The files which this packets are defines are Packet.h inside UserInterface and game/src. There are two packet types, dynamic and static, the static ones have a fixed length (the structure size), the dynamic have an extra data called (length, usually WORD), which tells the game the size of it. All the packets have a nomenclature, which I'll explain here: CG -> Client to Game (sent by the client) GC -> Game to Client (sent by the server) GG -> Game to Game (used by P2P packets for communicating two cores with eachother) Before seeing how to fix the errors, there's another thing that I will explain called Sequence system. What is the sequence system? It's a system introduced in newer clients (like 34k). It's basically a check which the client will send an extra data after a packet, and the server will verify if it's correct, in case it's not it will kick the player out of the server. The verision system works by sending a different number each time a packet is sent or received to the server, the client can send up to 32768 unique numbers before resetting itself to 0 (it's stored in a big array). Error type 1: Unknown packet header: XXX, last: YYY ZZZ Number explanations: XXX is the packet that the game/client cannot handle YYY and ZZZ are the last two packets sent before this error (usefull for investigating what packet caused this error) This error can happen before of the following issues: You modified the source and you haven't added inside PythonNetworkPhaseGame.cpp or packet_map.cpp the packet You have a packet which size mismatches between client and server Error type 2: SEQUENCE XXXXXXX mismatch 0xYY != 0xZZ header KK This error could happen for some reasons: You specified a packet which uses the sequence in packet_info (last value true/false) and in the client you forgot to add "SendSequence()" or viceversa You have a packet which size mismatches between client and server (the server is thinking a packet data is a sequence data) Error type 3: We don't really have syserrs here but we can see the client fuzzying around or doing wacky things (even crash at some point!) or the server/client fails to process all the data sent. This error could happen for some reasons: You have a packet which size mismatches between client and serve You forgot to add a Send() or forgot to Recv() the data inside the client tl;dr: always check for the following things if you are unsure: Check if you have added SendSequence and modified the true/false in packet_info (if you use sequence system) ALWAYS CHECK if Packet.h has the same ID and structures Check what action causes the issue so you can track down the code Always check the last headers sent, most of the time is just a byte not sent at the end Always check your implementation of input_main (Server) and PythonNetworkPhaseGamexxxxxxx (Client) Pro hack tip: __PACKETDUMP__ and ENABLE_SEQUENCE_SYSTEM are cool bois. Good luck.
    1 point
  9. They've disabled the topic since I was too busy at manually sharing updates to my customers. Since then I've already enabled the automatic downloads from my website to solve the matter. After I'll add more content and info on it (mostly an extended download list containing individual patches per commit too), I'll ask @ASIKOO for a revaluation. --------- [Hidden Content] this is the uiexchange without the chat box
    1 point
  10. I no longer authorize Martysama to sell and offer its services. Too much trouble with him.
    1 point
  11. Hello! You can take clean files from martysama and do your own. 0 bugs, full clean
    1 point
  12. 1 point
  13. Hey guys, after i noticed some positive rule changes on the forum i will start to release some of my stuff i already published on an other forum. In the past I often had problems with the Exp/Yang/Drops of group members were also shared on different maps. The simplest solution was to just put the maps further apart, however I took a closer look why this is and fixed it accordingly. in char_battle.cpp // below FPartyAlignmentCompute f(-20000, pkKiller->GetX(), pkKiller->GetY()); // replace pkKiller->GetParty()->ForEachOnlineMember(f); pkKiller->GetParty()->ForEachOnMapMember(f, pkKiller->GetMapIndex()); // below f.m_iStep = 1; // replace pkKiller->GetParty()->ForEachOnlineMember(f); pkKiller->GetParty()->ForEachOnMapMember(f, pkKiller->GetMapIndex()); // below NPartyExpDistribute::FPartyTotaler f(ch); // replace pParty->ForEachOnlineMember(f); pParty->ForEachOnMapMember(f, ch->GetMapIndex()); // below NPartyExpDistribute::FPartyDistributor fDist(ch, f.member_count, f.total, iExp, pParty->GetExpDistributionMode()); // replace pParty->ForEachOnlineMember(fDist); pParty->ForEachOnMapMember(fDist, ch->GetMapIndex()); in char_item.cpp // below NPartyPickupDistribute::FCountNearMember funcCountNearMember(this); // replace pParty->ForEachOnlineMember(funcCountNearMember); pParty->ForEachOnMapMember(funcCountNearMember, GetMapIndex()); // below NPartyPickupDistribute::FMoneyDistributor funcMoneyDist(this, dwShare); // replace pParty->ForEachOnlineMember(funcMoneyDist); pParty->ForEachOnMapMember(funcMoneyDist, GetMapIndex()); // below NPartyPickupDistribute::FFindOwnership funcFindOwnership(item); // replace GetParty()->ForEachOnlineMember(funcFindOwnership); GetParty()->ForEachOnMapMember(funcFindOwnership, GetMapIndex());
    1 point
  14. I solved the problem that how to get the vid from player name if the player is on other map. Its a python-quest communication. quest: quest send_vid begin state start begin function GetPlayerName() cmdchat("init_getInfo") local name = input(cmdchat("getInfo")) cmdchat("ignore_getInfo") return name end when button or info begin local vid = find_pc_by_name(send_vid.GetPlayerName()) cmdchat("sendInfo "..vid) end when login begin cmdchat("saveInfo "..q.getcurrentquestindex()) end end end python(game.py): #GET PLAYER VID FROM SERVER def InitPlayerNameInfo(self): constInfo.IGNORE_SEND_PLAYER_NAME = 1 def IgnorePlayerNameInfo(self): constInfo.IGNORE_SEND_PLAYER_NAME = 0 def SendPlayerNameInfo(self): net.SendQuestInputStringPacket(constInfo.PLAYER_NAME) def GetPlayerVIDInfo(self, vid): constInfo.PLAYER_VID = vid def SavePlayerVIDInfo(self, value): constInfo.get_vid = value #END OF GET PLAYER VID FROM SERVER for example i used this for whisper trade python(uiwhisper.py): def StartExchange(self): constInfo.PLAYER_NAME = self.targetName event.QuestButtonClick(int(constInfo.get_vid)) vid = int(constInfo.PLAYER_VID) if vid != 0: chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.EXCHANGE_TARGET.format(self.targetName)) #if player is online net.SendExchangeStartPacket(vid) self.interface.StartExchange(self.targetName) else: chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.EXCHANGE_NO_TARGET.format(self.targetName)) #if player is offline def EndExchange(self): self.interface.EndExchange() def RefreshExchange(self): self.interface.RefreshExchange() and of course i connected a button for the function: self.tradeButton.SetEvent(ui.__mem_func__(self.StartExchange))
    1 point
  15. M2 Download Center Download Here ( Internal ) Ingame video: Download: Password:
    1 point
  16. Python version. Work in both ways. From inventory to safebox and from safebox to inventory. [Hidden Content]
    1 point
  17. M2 Download Center Download Here ( Internal )
    1 point
  18. M2 Download Center Download Here ( Internal ) Virustotal: [Hidden Content]
    1 point
  19. M2 Download Center Download Here ( Internal ) Download Here ( GitHub ) What's the issue? SYSERR: Aug 22 18:36:42.624296 :: ReadEtcDropItemFile: No such an item (name: Èò»ö ´ó±â+) SYSERR: Aug 22 18:36:42.624379 :: Boot: cannot load ETCDropItem: locale/germany/etc_drop_item.txt Some people fixed it long time ago by replacing the column name from item_proto (which is korean) with vnum. If you want to do it like this and don't want the source change (from below) or you don't have the source code of your game core, you can use a update query and copy the vnum to name just if the vnum from item_proto exists inside of mob_proto.drop_item by a specific mob. UPDATE player.item_proto SET name = vnum WHERE vnum IN (SELECT drop_item FROM player.mob_proto WHERE drop_item >= 10); # Affected rows: 83 # Time: 35.919ms How can i know where the items are dropped? So, the structure of etc_drop_item.txt is based on dropping a item with a probability from a specific mob where that mob have the item vnum attached in column mob_drop -> drop_item. SELECT DISTINCT locale_name, vnum, drop_item FROM player.mob_proto where drop_item >= 10; locale_name vnum drop_item Wolf 102 30028 Alpha Wolf 103 30069 Alpha Blue Wolf 105 30027 Grey Wolf 106 30070 How-To-Fix Default structure: item_proto.name prob 늑대발톱 2.0 늑대발톱+ 2.0 늑대털 2.0 멧돼지의 어금니 2.0 With the fix you can use both of methods: item_proto.[name or vnum] prob 30028 2.0 30069 2.0 30027 2.0 멧돼지의 어금니 2.0 Repository: [Hidden Content]
    1 point
  20. M2 Download Center Download Here ( Internal ) Hi to everyone! Summer is here so here is some fresh summer release [Hidden Content]
    1 point
×
×
  • 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.