Jump to content


  • Content Count

  • Joined

  • Last visited

  • Days Won


Everything posted by Ken

  1. Hi, everyone today I would like to share a fix which Webzen has made with you. The fix is about the target position. Ymir is not checking if the target is on horse or not. It would be useful for range attacks. Find this: D3DXVECTOR3 CActorInstance::OnGetFlyTargetPosition() { D3DXVECTOR3 v3Center; if (m_fRadius<=0) { BuildBoundingSphere(); v3Center = m_v3Center; } else { v3Center = m_v3Center; } D3DXVec3TransformCoord(&v3Center, &v3Center, &GetTransform()); return v3Center; } Replace with this: D3DXVECTOR3 CActorInstance::OnGetFlyTargetPosition() { D3DXVECTOR3 v3Center; if (m_fRadius <= 0) BuildBoundingSphere(); v3Center = m_v3Center; D3DXVec3TransformCoord(&v3Center, &v3Center, &GetTransform()); if (__IsMountingHorse()) v3Center.z += 110.0f; return v3Center; } Best Regards Ken
  2. Ken

    open Search some functions and Lists

    Psuedo-Code ; signed int __stdcall CPythonNonPlayer::GetMonsterHitRange(char a1) { signed int v2; // [esp+0h] [ebp-1Ch] int v3; // [esp+18h] [ebp-4h] v3 = sub_3236B90(a1); if ( !v3 ) return 70.0; if ( *(v3 + 272) ) v2 = *(v3 + 272); else v2 = 100; return v2; } Reversed function: float CPythonNonPlayer::GetMonsterHitRangeByVnum(DWORD raceVnum) const { const TMobTable * p = GetTable(raceVnum); if (!p) return 70.0f; if (p->hitRange) return p->hitRange; return 100.0f; } Best Regards Ken
  3. At first the people can say "what i do if i have loss my phone." You can't loss your phone if you are doing this. What ever Everyone know this system as Google Authenticatior. This is not only for this. GoogleLastPassFacebookDropbox & SpideroakMicrosoftYahoo! MailAmazon Web Services (AWS)A few mmorpg is use this system for theirself games.Step 1 : - Install libqrencode. This lib provide see QR Code in your SSH terminal. cd /usr/ports/graphics/libqrencode make && make install Step 2 : - Install Google Authenticator. cd /usr/ports/security/pam_google_authenticator make && make install Step 3 : - Download Google Authenticator from Google Play and install that. Step 4 : Write this command in your ssh terminal. Write "y" for each question. You will see QR code. Take that QR Code via your android phone. Google Authenticator is show you that program in google play if you don't have Bardcode scanner. google-authenticator Step 5 : Write this command in your ssh terminal. ee /etc/ssh/sshd_config after find this : #ChallengeResponseAuthentication yes Change via this : ChallengeResponseAuthentication yes Step 6 : Write this command in your ssh terminal again. ee /etc/pam.d/sshd file after add this : auth optional /usr/local/lib/pam_google_authenticator.so ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Step 6.5 : Follow this If you are not sure to loss your phone Write this command in your ssh terminal again. ee /etc/pam.d/sshd file after add this auth requisite /usr/local/lib/pam_google_authenticator.so - What is change? Google authenticator give a few password (Step 2 end). Save them When you are trying to log in again, you should write the code from what google authenticator give for pwd. --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Step 7 : Write this command in your ssh terminal. service sshd reload - How is work this system ? Google authenticator is create new password in 5-10 seconds. They must know this if someone know your password. Screen from my server. €dit 2: If someone want to apply this theirself webpage, here a link for you ASP.NetPHPKind RegardsZerelth ~ Ellie
  4. Hey, I would like to share a small function for fish event. You can find this function in uiMiniGameFishEvent.py (The uncythonized root files) too. Best Regards Ken
  5. Ken


    I just want to say something about your "official" fix. Webzen didn't change anything like you did. If you want a proof, here it is. If you want to see with your eyes, here is the address from the official binary. (0x39004F0) http://prntscr.com/kvvkun Best Regards Ken
  6. Webzen didn't create a new function to return m_FriendNameMap. They just make m_FriendNameMap public. (It was protected before). Also, you can use const_iterator instead of iterator. (You're not modifying it.) Here is the reversed version of webzen's function. This version is for c++11 This is for c++03 PS: This function has come with a system that called mailbox. Best Regards Ken
  7. Ken

    open [DEV challenge]Dice System Exploit

    Sorry but this is not a challenge or something else. You just want someone to solve your problem without pay in your own way. (Challenge). If this is a challenge, then you can put some money. That's my option Best Regards Ken
  8. Hi, everyone. Most people know when you are trying to connect the server with a lot of people, the server can not respond to you or something might go wrong. This example is same for warp too. Webzen did something about this too and I'd like to share it with you. What are exactly are we doing? If the client can not connect to the server, the client will wait one second to connect the server again. Open NetStream.cpp. Find Connect function and replace with this bool CNetworkStream::Connect(const CNetworkAddress& c_rkNetAddr, int limitSec) { Clear(); m_addr = c_rkNetAddr; m_sock = socket(AF_INET, SOCK_STREAM, 0); if (m_sock == INVALID_SOCKET) { Clear(); OnConnectFailure(); return false; } DWORD arg = 1; ioctlsocket(m_sock, FIONBIO, &arg); // Non-blocking mode if (connect(m_sock, reinterpret_cast<PSOCKADDR>(&m_addr), m_addr.GetSize()) == SOCKET_ERROR) { int error = WSAGetLastError(); // If something went wrong, the client will wait one second to connect the server again. // Of course, it will clear and setting up everything again. if (error != WSAEWOULDBLOCK) { Sleep(1000); Clear(); m_sock = socket(AF_INET, SOCK_STREAM, 0); if (m_sock == INVALID_SOCKET) { Clear(); OnConnectFailure(); return false; } ioctlsocket(m_sock, FIONBIO, &arg); if (connect(m_sock, reinterpret_cast<PSOCKADDR>(&m_addr), m_addr.GetSize()) == SOCKET_ERROR) { Tracen("error != WSAEWOULDBLOCK"); Clear(); OnConnectFailure(); return false; } } } m_connectLimitTime = time(NULL) + limitSec; return true; } Best Regards Ken
  9. Ken

    open Help fopen

    std::string GetFirstLineFromFile(std::string stFileName) { std::ifstream file(stFileName.c_str(), std::ios::in); if (!file.is_open()) return "Can not open the file"; std::string stLine = ""; if (!getline(file, stLine)) return "Can not get the first line!"; return stLine; } It will get the first line of the file. You can use this anywhere you want. (Don't forget to include fstream and string libraries) Best Regards Ken
  10. Hi, I'd like to share a small fix about the messenger system. what exactly are we fixing? The main problem is when you remove any person from your list, the companion's messenger list is not refreshing until relog in. Webzen has fixed this situation with a small packet. That packet will provide to remove the name from the list. There is no part of Python because it's already done by Ymir. For serverside For client side Best Regards Ken
  11. Ken

    open [Request]Locking items on map

    The quest must know what's there in the item shop. You can create an array for this in questlib.lua or the quest. You can use a query to fetch what's there in the item shop. (I do not recommend this method because it might be a lag in the game.) You must cache it even If you want. Then you can check it with pc.get_wear() You can create an array for this in the quest or questlib.lua (I gave an example) The last thing is to combine all of them quest xxx begin state start begin when login with pc.get_map_index() == xx begin -- You can use a query to fetch the item vnums from the table. (I still do not recommend this method if you are not using cache method) local blockedItems = { 11209, 11409, 11609, 11809 } -- Wear positions, is exist in common/length.h if you want to check it out. local wearPositions = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 19, 20, 21, 22 } -- Make a loop and check every wear position and check is equal to the blocked items in array or not. for i = 1, table.getn(blockedItems), 1 do for j = 1, table.getn(wearPositions), 1 do if (pc.get_wear(wearPositions[j]) == blockedItems[i]) then chat("You can't..") return end end end end end end Best Regards Ken
  12. Ken


    You're playing a multiplayer game. The member might lose his connection sometimes because of the internet provider or unknown packets. You can't pay this to the party members. If you do, most people are going to insult you in the game. Anyway, thanks for sharing with us. Best Regards Ken
  13. Hey, @Horinna thanks for feeding back. About the last bug, the system is not doing the same things for the companion. To fix this; Find this line in messenger_manager.cpp m_Relation[account].erase(companion); m_InverseRelation[companion].erase(account); And add this code blog m_Relation[companion].erase(account); m_InverseRelation[account].erase(companion); Best Regards Ken
  14. A small fix about a query of messenger system. When you remove any person on your list, the companion will continue to see your name on his list (when the companion relog in the game again). This query will remove both of them's contact in the database. Best Regards Ken
  15. I've updated the codes again. Good luck
  16. Ken

    open Access to the brazilian servers?

    @Johnny69 I have looked at the binary file. The only way that you must need to have a Brazil IP Address. I have thought they're blocking it with block country feature of metin2 but when I look at a bit deeper, I saw it wasn't. They're blocking the whole IP addresses on their firewall. About Xigncode - Most people are saying that it's just joke. Also, I'm thinking about why Xigncode is forcing binary to close itself. (Could be incompatible because when I watch the process on Process Hacker 2, the operating system is only running WerFault.exe) When logininfo.py (I'm not talking about loginInfo.xml) is running, it's reading locale.cfg to change something inside. (Including IP Addresses)
  17. Ken

    open Access to the brazilian servers?

    I tried to ping the ip addresses but it looks like it's dead. (Including many countries). I think, there is no way to login the server without brazil ip address. Did you try to login the server with a brazil ip address?
  18. Ken

    open Access to the brazilian servers?

    After @Johnny69's file, the client is working fine. The only problem is why the server is not respond to client about '..' Did you figure out or still same?
  19. Ken

    open Access to the brazilian servers?

    I have the same problem at the moment. Xigncode is forcing binary to close for one reason. I have thought that they have blocked the ip addresses. However, it looks like xigncode is blocking us If I find any way, I'll let you know about it. PS1: It looks like Xigncode is incompatible with Windows 10. (That's the reason why you can't open it - I guess) The operating system is trying to stop it (Werfault.exe) when you try to open metin2client.bin. I will test the server on the other operating system.
  20. Ken

    open Access to the brazilian servers?

    Can you post the brazil server's ip address and ports? I'd like to test something on it, then I can tell you. Best Regards Ken
  21. You might right about tetris game
  22. This release is just information about fish event. I just made the class from their binary files. Some functions are not still accessible yet because of define flags. class FishEventGridSlotWindow(Window): def __init__(self): Window.__init__(self) self.startIndex = 0 def __del__(self): Window.__del__(self) def RegisterWindow(self, layer): self.hWnd = wndMgr.RegisterFishEventGridSlotWindow(self, layer) def ArrangeSlot(self, startIndex, xCount, yCount, xSize, ySize, xBlank, yBlank): self.startIndex = startIndex wndMgr.ArrangeSlot(self.hWnd, startIndex, xCount, yCount, xSize, ySize, xBlank, yBlank) def GetStartIndex(self): return self.startIndex # The newest compiled binary file is not contain this function yet. (ENABLE_FISH_EVENT) def SetPickedAreaRender(self, unkArg1): pass Best Regards Ken
  23. Ken

    open Safebox function C++

    I agree with you about that. You don't have to follow what exactly ymir did until now. (Except a few things). About code's readability, you can use comment line for that. About naming variables, you're right. It still depends on you. You can use it or not. Best Regards Ken