Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 05/14/21 in all areas

  1. Hello, This tutorial is intended to help beginner who don’t know how to configure regeneration files for specific maps. It may seem obvious to some but some don’t know how it works completely. That is, choose the correct location of your Monsters, Metins, Bosses and NPC’s as well as their coordinates, direction and spawn time. Information. The tutorial presents the 4 files (regen.txt, boss.txt, stone.txt, npc.txt) at the same time because they work particular the same way. These files are located in your server files at “share/locale/country/map/name_of_your_map/” How to get started? First, you need access to your server file directory. We recommend using WinSCP as it open source as in globally used among everyone. The map folder which you will configure. I. How to configure spawns? II. Manage group.txt and group_group.txt Special thanks to @Owsap for his help ! A category Questions and Answers is available. If you have a problem or a question, feel free to post a request!
    1 point
  2. M2 Download Center Download Here ( Internal ) Hi I'd like to release my small project of hairs [hide][Hidden Content] [Hidden Content] [Hidden Content] [Hidden Content]] 46kid [hide][Hidden Content] [Hidden Content] [Hidden Content] [Hidden Content]] 47kid [hide][Hidden Content] [Hidden Content] [Hidden Content] [Hidden Content]] 48kid [hide][Hidden Content] [Hidden Content] [Hidden Content] [Hidden Content]]
    1 point
  3. M2 Download Center Download Here ( Internal ) Download Here ( GitHub ) Original system forked from Mali61 Link Adapted by ASIKOO
    1 point
  4. @Creo my previous message was for the user @eeevil123 bcs I have some problem with that bracket. You should check the files InstanceBase.h and just double check all. #ifdef ENABLE_SHINING_SYSTEM //2-Dimensions for Left & Right sided effects DWORD m_weaponShiningEffects[2][CItemData::ITEM_SHINING_MAX_COUNT]; DWORD m_armorShiningEffects[CItemData::ITEM_SHINING_MAX_COUNT]; #endif Also core function is in instanceBase.cpp you should focus on this file to find the problem //Check for double sided weapons or fan which is attached on both sides when mounted. #ifdef ENABLE_WOLFMAN bool twoSidedWeapon = bSubType == CItemData::WEAPON_DAGGER || (IsMountingHorse() && bSubType == CItemData::WEAPON_FAN) || bSubType == CItemData::WEAPON_CLAW; #else bool twoSidedWeapon = bSubType == CItemData::WEAPON_DAGGER || (IsMountingHorse() && bSubType == CItemData::WEAPON_FAN); #endif if (twoSidedWeapon) { __AttachWeaponShiningEffect(i, shiningTable.szShinings[i], "PART_WEAPON_LEFT"); } __AttachWeaponShiningEffect(i, shiningTable.szShinings[i], "PART_WEAPON"); I use the same system and works perfectly fine after a few changes because I had to adjust it to my files [Hidden Content]
    1 point
  5. Competent people, fast service and good quality. Highly recommended.
    1 point
  6. Huhh thats a little bit too much to ask. Back in its time the solutions they made for various problems were acceptable due to the hardware limits, but nowadays the whole server is utterly trash. The question is more like what is okay for modern needs. But to be a little more specific, here is some of the most annoying problems: No serverside checks for some critical game mechanics. There are numerous stuff that depends on the client, and therefore can be easily faked. For example when you attack, the client calculates the positions your attack would hit, and there is only a distance check on serverside if you really hit that entity. There is no other kind of checks, like combo, direction, or more fine tuned stuff. Nowadays it should be completely independent from the client, the server should determine every attack/movement, and the client should just receive the results. No standard packet protocol. The game uses some homemade messy hardcoded tcp network code, where the headers/packets can be messed up easily. Something like google protobuf should solve this problem. Also due to the use of tcp there are noticable delays in movement/attacks so that should be replaced with reliable udp aswell. The cores are single threaded (except the mysql working threads) and to spread the load across the cpu multiple cores are being used (so it means that best case you have one map / cpu core (which obviously very rare in production servers)). But on farmmaps especially on server openings there are large amount of players and sometimes it noticeably draws performance, and literally nothing you can do about it, since you cannot make it use more cpu threads. Because of this higher cpu clock speed is usually prefered over more cpu threads when selecting hardwares for metin servers.
    1 point
  7. For those who need FN_compare_item_socket function and also with fixed 'memory leak' which already is public. Srcs/game/src/char_item.cpp 1.0) Add at the beginning of file: static bool FN_compare_item_socket(const LPITEM pkItemSrc, const LPITEM pkItemDest) { if (!pkItemSrc || !pkItemDest) return false; return memcmp(pkItemSrc->GetSockets(), pkItemDest->GetSockets(), sizeof(long) * ITEM_SOCKET_MAX_NUM) == 0; } 2.0) Search for: 2.1) Replace it with: [Hidden Content]
    1 point
  8. Thanks for release, the idea isn't bad, but there're some bad things. I'll show you the problems part and how can be improved, there're just advices, i hope you'll get them. def __del__(self): if len(self.eventList) > 0: self.eventList.clear() If you're using Python 2+ or Python 3.2 and below, you can't use the clear() method (allowed on 3.3+), also as i said in the second message you don't need to check the length of the list, already the clear() method doing that inside and there's no reason to put it to __del__ method, it will be called when the object is garbage collected. if you really want to use in future, something outside of this and want just to check the list if isn't empty, is enough to do it just with if some_list, like a normal boolean, there no need to check the length of the list if you don't use it in your code. if len(self.eventList) > 0: for j in xrange(len(self.eventList)): [...] You don't have to check the list if you already did a numeric range loop or iterator based loop. app.GetTime() + time I would say to use app.GetGlobalTimeStamp() instead of app.GetTime(), if you teleport while the event is running, the event function will run after 10 seconds like. While app.GetGlobalTimeStamp() will run after the specific time, because is the server timestamp and is updated on each enter in game. if i == 0: self.eventList[j].clear() I would put here an big exclamation, with this you creating 999999999 lines in syserr, what you do here is like: While Process() function is called in OnUpdate, so, your condition trying to get the returned value from an specific function, what means the next update time or 0 to destroy the event/clear it. Everything's fine until you return 0 and event should be stopped yes? But there is a problem, you clear the specific dictionary of event and still remained in the list [{}], and the Process() function will take your self.eventList with the items included, the empty dictionaries from your events, and of course even if you've [{}, {}, {}], that doesn't mean your list is empty, have 3 items, so, the loop will trying to read an empty dictionary and you'll get key errors in each milisecond. The method which you need is to delete the dictionary itself from the list after the result value from the function is 0, like this: _______________________________________ I wrote fast some self extensions, if somebody is interested i'll do another updates in the next days. You can use unlimited arguments on functions, now is using the apply method which returns the result of a function or class object called with supplied arguments, with the old structure you could use just one argument. You can lock/unlock an event for being processed, it's like a prevent in some actions, if the event is created and you want to do something, you should lock the event, do some actions then you can unlock it again and the process function will run where remained. Delete an event instantly and force it to stop the process. Adding return t.EXIT inside of the running function, will delete the event too. Functions to check if an event exists or is locked or not. Check if the function is a method type. Delete the events with a properly method. Using app.GetGlobalTimeStamp() now will give you the chance to run the event after teleport where timer remained instantly. _______________________________________ The code: [Hidden Content] PS: Don't quote this reply, will be updated.
    1 point
  9. Python version. Work in both ways. From inventory to safebox and from safebox to inventory. [Hidden Content]
    0 points
×
×
  • 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.