Jump to content
metin2dev

Leaderboard


Popular Content

Showing content with the highest reputation since 05/19/2018 in Posts

  1. 14 points
    Hello. Today I'd like to share this little stuff what I reversed from the official binary a month ago. This will fix the positions of textails(name position changes by every update packet on the main character), and also the position of the emotions when you are on a mount . I've made a little demonstration video where you can see a private server without the fix, my fixxed version and the official aswell. 1. Client/bin/playersettingmodule.py 2. Client/bin/introLoading.py 3. Place the race_height.txt from the official client into the yours and pack it in the root. 4. Client/UserInterface/PythonCharacterManagerModule.cpp 5. Client/GameLib/RaceManager.h 6. Client/GameLib/RaceManager.cpp 7. Client/UserInterface/InstanceBase.h 8. Client/UserInterface/InstanceBase.cpp 9. Client/UserInterface/InstanceBaseEffect.cpp 10. Client/UserInterface/PythonTextTail.cpp 11. Client/GameLib/ActorInstance.cpp I hope you like it, and if you find any problem just let me know in this topic.
  2. 7 points
    Why are you criticizing someone who tries to share a work for the community what he has created? I didn't take a look on the code.. But why you don't give any code improvement suggestions? That would help the creators more to understand how to do something better! Your comment is meaningless in this regard! You have never released anything... I can't understand why you can't say just thank you .. P.S: @Whisy thank you for the release Best regards Raylee
  3. 7 points
    They did it again... Now the gameguard isn't runing. Here is the whole pack with item and mob protos, but the mob_proto isn't clear just dumped with false values, and ofc I don't recommend of use one of them either. (Exclude files: root, outdoor, outdoorempirebattle1) https://mega.nz/#!GBhjkLbZ!CU1tB_6RrgsD-PkosOJl-MeKXlwD3q7tSIufoxCyFJY
  4. 4 points
    https://github.com/blackdragonx61/Metin2-Hide-Objects
  5. 3 points
    Hi devs, I just discovered many client are using old versions of Unicows.dll, DevIL.dll and ILU.dll. It's not as hard to update them and if you are deeply into a client development you appreciate those SDK or PDB. DevIL & ILU (?) Default client is using 16 years old version. Come clean, looks horrible, right? These libraries are open source so you can modify them. Here you can download latest SDK. During those 16 years of development there have been a lot of changes, here is excerpt of them. Changes: DirectX 9 & 10 support New bilinear scaling routine Support for alpha-only formats Better support for ICO, GIF and DDS format Fixed minor bugs with BMP and PNG formats Fixed a lot of issues about DDS format A lot of bug fixes Unicows (?) Well, actually you can delete this library from your client and it won't have any effect on client proper working (Windows Vista and newer). However, you have to keep this library if you want to support compatibility with Windows 95, Windows 98 and Windows Millenium Edition. Here is available package which contains library, it's PDB and license. Sources: http://openil.sourceforge.net/ https://www.microsoft.com/en-us
  6. 3 points
    Hello guys. I'm Narvikz, I've been in the Metin2 scene since forever, actually I feel like I'm kind of the furniture already and unluckily full of dust by now This will actually be one of the slight amount of contributes I've given to metin2dev, I've jumped off ship a while back since this game died but apparently some troll still support it, anyway that's not related to this thread so let's keep it out of here. As there's still demand for some reason so is there a supply of game hacks, it's the basics of games, the more players there are the bigger the market for payhax and so the more profitable they are. I was contacted by a friend of mine (Runah Services) which told me that he wasn't unable to detect m2bob in any way, he also said that there are very few people who are doing it and those who are able to detect were keeping it private, he did not find anyone providing a satisfactory service to protect against these tools. What I have to say about this? You fools, you clueless fools. So, let's face it, you guys just don't have a clue about what you are doing. Right off the bat I could enumerate dozens of ways to systematically detect that m2bob is running on some system and think of its basic architecture. But first, let's talk about its architecture and how we can defeat it. Architecture M2Bob - Patcher.exe: This is the start up process when you first start using M2bob, this will generate a 128-bit Digest (probably md5) for each file that is to be checked on disk, send it through a POST HTML request to an API that will compare the client side files to the server side up-to-date files, if any file's digest is any different it will download the most up to date file using the HTTP protocol and replace it at disk. This patcher will connect to a web server hosted at the subdomain ni220471_1.vweb02.nitrado.net and as you can see in the spoiler, little reservations has Slait as to what's hosted there. Once everything is updated it will open M2Bob.exe which we'll talk about next. M2Bob.exe This file when opened from outside the Program Files will create a randomly named (yet with constant size - 10 characters) folder inside of the Program Files folder of your computer and then another one with the same template. After that it will spawn a copy of itself with a random name (yet same size once again) and do the same for the M2Bob_Dll.dll changing its extension to ".e" instead of "dll". After that it will open that randomly named executable and execute from there. Once you press the button to start the game it will spawn a metin2client instance, it will inject its module into the process memory. After that it doesn't close the open HANDLE to the game which leaves us a HUGE detection vector to take advantage of. M2Bob_Dll.dll This module once injected into metin2client will run a few Signature Scans to find the game's subroutines it needs to call in order to simulate game actions. If you take a look into the module's memory you can see those patterns and its masks quite easily, this uses a standard FindPattern function that's been around since the very start of the cheating scene. It will then automate the actions of the player using complex algorithms which are not relevant for what we care about. Security wise all M2Bob does is hooking Module32Next and whenever at your iteration through the module list you hit the m2bob random named module it jumps it to the next one, successfully hiding its module from the simplest of all module enumeration techniques. Good job Slait, always work for the minimal standards and do not think out of the box The hooking method used is the BIGGEST PILE OF CRAP I'VE EVER SEEN being done on a Windows NT based Operative System This is still a detour with a trampoline hook at function start but instead of replacing the first 5 bytes with a JMP + 32 bit absolute memory address he does THE MOST RETARDED SHIT I'VE SEEN IN A WHILE. Trust me guys, I've seen so much retarded shit lately, but Slait takes the crown on this one, he really deserves it since he's put a lot of effort into this. Instead of copying the first five bytes of this function, replacing it by a simple JMP to a memory region where it has these first five bytes followed by his detour function and then a trampoline JMP back to where it all started, he managed to do a 8 FUCKING BYTE LONG in-line hook, when literally every Windows API function is compatible with Hotpatching (easy first 5 bytes hooks). System Overview The whole system is really weak, it circumvents the protection mechanisms that is supposed to which are a PILE OF CRAP like Hackshield and GameGuard or whatever the fuck GameForge is using nowadays, but it doesn't really think out of the box when it comes to protection and obfuscation. Slait wouldn't stand a chance if GameForge purchased an actual decent service from someone who has a single clue about what they're doing (lol, even fucking Bastian Suter would perform better) instead of this pile of crap. There's no solid DRM and the system is overall really weak and shouldn't take much longer than a few hours to crack to a talented reverse engineer. Detection Vectors Well, I don't even know where to start, the whole system is flawed and weak, there's holes everywhere so I'll enumerate some quick detection vectors I can think off, and yes, I HAVE TESTED MOST OF THOSE AND THEY WORK Method #1 - Hidden Memory Pages (TESTED & WORKING) Iterate through memory pages and using VirtualQuery find those which are 4096 byte long (size of the PE Header) and being used, for those check if you can get a DOS MZ executable signature, and if you do then you most probably have a PE Header memory page. Interpret cast that memory address to NT Header and check the TimeDateStamp and or SizeOfCode or other parameters that are constant (there's tons of them) and allow you to uniquely identify m2bob. Method #2 - Open HANDLEs to game process (TESTED & WORKING) You're gonna have to use the Native API and some Undocumented structures and functions to get this done, it's really easy to do so though, shouldn't take you longer than an hour to being able to enumerate all you need to do this. Calling NtQuerySystemInformation with SystemHandleInformation as first parameter while the return value of this function is different than STATUS_INFO_LENGTH_MISMATCH or STATUS_BUFFER_OVERFLOW you are able to populate a SYSTEM_HANDLE_INFORMATION object which will have the first 4 bytes as the count of SYSTEM_HANDLE objects present in an array that follows it. This list once populated will contain a list that contains all the HANDLEs opened in your environment, this means all the File, Registry Keys, Processes, Threads, etc, HANDLEs will be enumerated and will be in that list. But to know the type of HANDLE you're dealing with you have to first call QueryObject on that HANDLE with ObjectTypeInformation to know more about it. This will get you a UNICODE string that will contain the HANDLE type, you only want the ones that are "Process" so you can filter the irrelevant ones out. Then you can check if the HANDLE is targeting your game's process id (you can get your process id at the PEB of your process), if it is you're gonna want to run some checks on that process to check whether if it's a legit one or a blacklisted one. You can do this by opening a HANDLE to it with OpenProcess and PROCESS_QUERY_LIMITED_INFORMATION as parameter. Then you're gonna want to get the executable path in disk using QueryFullProcessImageName, from there you can just read the first 4096 bytes of that file, cast them to NT Header and do the same checks as mentioned above. Alternatively you could just open the handle with PROCESS_VM_READ privileges, and use ReadProcessMemory to get the PE Header, but PROCESS_QUERY_LIMITED_INFORMATION never fails, even if the process is run as administrator or it is a system process and since m2bob doesn't use any Dynamic Forking technique it is pointless to use anything more than that. Method #3 - Integrity checks at Module32Next (TESTED & WORKING) Okay, this might sound retarded because there's malware that will spread to every process in the target system and hide itself using a user-mode rootkit that might hook Module32Next, thing is, Slait's kind of hooking is so retarded there is no actual way this would raise a false positive. This is his retarded hook: The 1st byte will always be FF, the 2nd will always be 25, the 7th will always be E4 and the 8th stays at a constant F8 as well. Check those and insert a huge dildo in Slait's ass, seriously, isn't that hard really. Do you think that's even hard? Please...... Method #4 - DNS Cache (Untested But Will Work) So, now we're jumping to the shitty methods that are only here to fill the thread just so you can be proven wrong when you say it can't be done. Basically whenever you resolve a domain name a UDP request is sent to your DNS Server asking for the resolution of a certain domain or subdomain, it will answer with some records for that domain, these records contain the IP Address it resolves to, and that IP address will be the one you'll connect using the Internet Protocol version 4. Your operative system will cache those resolutions so that each time you need to have that domain solved it doesn't bother your DNS Server with requests each time and there is a faster resolution, you can use this to beat M2Bob once again. You don't wanna look for m2bob.net since that could flag players that just crawled around that website, but if you flag their patch server subdomain, you can actually accurately flag players that have been using m2bob. Remember ni220471_1.vweb02.nitrado.net? Yup, flag the shit out of it. Method #5 - USN Journal (Untested But Will Work) The USN Journal is a system in the NTFS that keeps track of changes to files in the user's system. It will contain the timestamp of the said change, the file name and the reason for the log. The first two need no explanation, as to the third it could range from Opening the file, deleting, moving, renaming, creating, etc, etc. How's this useful? Remember how opening M2Bob.exe spawns a different executable in the Program Files folder and opens it? Well, you don't access that executable directly, you still open M2Bob.exe, this means that you could just look for entries in the USN Journal in the last 15 minutes or so that contain the name M2Bob.exe and are followed by some program in the Program Files folder a few milliseconds after (or even skip the latter) that has been opened and just kick the player from the game whenever you detect it. Aditional Methods Detection Vectors, detection vectors everywhere, I laugh at all the incompetents that for months tried to do it and failed systematically, you fools, how can you be so clueless? Even though Module32Next is hooked Module32NextW is not, which means that if you use the UNICODE alternative of the kernel32 library you will get unfiltered results - Good fucking job Slait, Incompetence at its fittest (inb4 every incompetent out there edits a public anti cheat source to use Module32NextW LOL) Haven't checked it, but even though Windows API module enumeration modules are hooked to spoof the results, you should be able to use the InInitializationOrderModuleList, InLoadOrderModuleList or the InMemoryOrderModuleList to find its module. Just be h4rdc0r3 and use Syscalls. Since you're incompetent you won't do this, hell you couldn't even get the indexes for your own operative system version let alone do it for 20 different versions per each function you wanna call. Anyway just implement the native API functions without actually calling them, this can be done really easy and WITH LITTLE INLINE ASM CODE using naked hooks, that will make sure that you don't break the stack inside of the function. You can look into this HERE. Your function call will be done within the kernel, meaning that this would bypass any placed hooks by Slait. Why the hell would your metin2 game process own 2 windows bruh? Doesn't make sense to me, just kick them dude. Signature Scans, this is pointless because his system is all flawed but could be a nice backup resort if he ever decides to use his brain. Pretty sure m2bob has some exported shit in their PE Header, just scan for it using the hidden PE Header detection shown above. As I'm really fucking tired already of writing a long ass thread incomparable to anything ever seen before here or anywhere released publicly online I won't even write down any more detection vectors, the system is filled with holes, I think I've proven my point already and it's pointless to keep doing this. This is a rant thread because you guys that own a metin2 server to make a quick buck should be ashamed of how unskilled you actually are, you are complete incompetents that keep leeching public releases and stealing other people's/servers' work, claiming it as your own or often not even mentioning it since people just don't even care any more. You provide public PAID services on an area you don't have a clue about, you're just scamming customers and selling them dreams. It is really frustrating for me since I left the scene when I was still a kid, I barely knew English and I stayed mostly on my local country's forums, my contributes back then were merely in the translation area, I've put a lot of effort into it now that I think about it, after that I limited my contributes to helping people with general Linux/BSD issues, but then it seemed that owning a Metin2 Private Servers built with pieces and pieces of stolen or leaked work was a trend, and I got really really pissed at the whole scene, I just started trolling all the retards asking for assistance with BSD issues that are from 101 classes, obvious errors that even my grandfather could solve and other retarded threads. Have Fun guys, I know most of you won't use this for anything since even being spoonfed all the methods you're so clueless you can't write this down on code, but maybe there's some one out there that will actually use some nice tips like this, and since I gave them to one guy privately on skype I might as well post them publicly for everyone to see. I've been contacted by SandMann016 to work with him, and to be honest it kind of makes me sad that I am releasing this, I never managed to proceed with those plans but still, he seemed to be a decent guy back when I first met him, but oh well, here it is now. /rant
  7. 3 points
    You don't need to ask them to logout, shutdown does this. Never lost items on my server.
  8. 3 points
    Hello, System is written me. System gif; +There are 9 effect. +And Clear Button. DOWLOAD : TIKLA VT : TIKLA Skype; whisytm05@gmail.com
  9. 3 points
    I've modified def __LoadRaceHeight for my own purpose, here it is in case someone needs it: I wanted to use comment tags inside the .txt file EDIT: iI think I was too sleepy at 4 AM when I wrote this reply, I didn't think I could modifty it into a dictionary def __LoadRaceHeight(): Dict = npcheight.NPC_HEIGHT for k,v in Dict.items(): chrmgr.SetRaceHeight(k, v) NPC_HEIGHT = { # horse 20030 : 220.00, 20101 : 220.00, 20102 : 220.00, 20103 : 220.00, 20104 : 220.00, 20105 : 220.00, 20106 : 220.00, 20107 : 220.00, 20108 : 220.00, 20109 : 220.00, # shop 30000 : 150.00, # mount 20212 : 0.01, # uff.. the mounts need to have 0.01 29212 : 0.01, # dragon 2493 : 300.00, }
  10. 3 points
    The textures of this water are ideally joined by no visible textures (seams). Colors are well matched to the climate of the metin. If you like this look here: https://metin2dev.org/board/index.php?/topic/16751-3d-art-tatsumaru/
  11. 2 points
    If you have questions about the [Official] "Unpacked Updates Metin2.de", do not hesitate to ask them here!! This thread was created because more and more questions arise to this topic! It's not allowed to post here official patches! This thread is only for discuss about the new patches!! You can also ask if anyone is willing to share Official patches here. The official updates you can find as usual here! Best regards Metin2dev-Team
  12. 2 points
    Lul. You are not informing him when you ask "So, did you fix it?" but instead it sounds like a request from somebody who should only be grateful, if you want to help then go for a pull request implementing the feature/bugfix on your own. I've been helping random people way too much, that's why I understood that random people usually don't deserve anything :]. It's git tho, if you want to know if he updated the code then check the commits instead of asking here, you know.
  13. 2 points
    The Bank has the following facilities: Create a account Login on account Add money Withdraw money Send money Change password 1.) Create account: Length of characters allowed for the account name is 12 characters (as with login). Characters allowed for password length is 4 characters. You can generate a random password automatically in case you have not a good idea for a password, for security on your account we advise you to generate a random password, but take great care not to forget your password, so you have to contact the server team. You can not create an account already exists with that name. You can not enter special symbols in the same account name and password. Account name and password accept any type of data, such as numbers and 2.) Login on account : Timeout for logging into your account is a timer for 3 sec. The password will be secret in the edit window. During logging can detect the following: Connection success Connection Failed: The account name is wrong. Connection Failed: The password is wrong. 3.) Add money : You can not enter a smaller amount as in 1. You can not enter an amount less than or greater than that of the inventory. You can enter up to 10 numbers. (Ex: 1999999999) can change. 4.) Withdraw money: You can not enter a smaller amount as in 1. You can not enter an amount less than or greater than that of the bank. You can not withdraw an amount from the bank that exceeds the maximum limit of the server, for example if you have in inventory 1.3kkk, you can withdraw from the bank only 300kk, because GOLD_MAX = 2kkk. You can enter up to 10 numbers. (Ex: 1999999999) can change. 5.) Send money: You can not send money to an account that does not exist in the database. You can not send a smaller amount as 1. You can not send a larger amount of deposit that the banks. To transfer money from one account to another you need the account name asks that person to do that. An example conversation: A: Hello, i am your brother, send me 444 Yang please. B: Ok bro, give me your name account from bank for can do this. A: Here is my account name from bank: girl123 B: Done, already i send you 444 Yang, please check your account and you will see in logs. My name account is vegas123, check and you will see, good luck my brother. PHOTO FROM ACCOUNT GIRL123 6.) Change password: The new password must have a maximum of 4 characters. New password must be the same as repeating the password field of safety. You can not put the same password as current. Example: Old Password: psw8 New Password: psw8 It is not allowed entry same as the old password. Other informations: For every action that you take in your bank account logs exist, such as: Time action was taken. The time when the action was taken. The action that was taken. Ip from who make action. To / From is when you received, or sending money to another bank account. Amount sent or received. For every action there is a set time to run once the action 10 seconds, which means you can not withdraw / etc add money to your account within 10 seconds, you have to wait for each action separately this time. There can be no bug in the bank. You can not connect to another account if you do not account name and its password. You can not enter characters that go nowhere to exploit. You can enter the account name and truncate or drop etc. Logs are displayed depending on the new date, which means that the latest logs will always be displayed first. When you receive money from another person (another account) ip it will be removed. (Why this? Because we do not want players to have the chance to learn real ip a player, you can see only ip for your action.) Every action has a special type with a separate color. Everything is in real time. Causes no problems in server functions that communicate with the database are not very well optimized that will allow you to do any exploits or a flood that overloads the database. Date and time are taken in real time server, you must have time to FreeBSD updated in real time, it can test the console ssh “data”. How to change date and Timezone The maximum limit for logs is 1,000 logs which are set to 40 pages. Everything communicate with packet and everything is written in c ++. It is compatible with any version of the source. #
  14. 2 points
    Just to make it sure, right? The best part is the importing of the interfacemodule, you always made my day.
  15. 2 points
    if (pkAttacker->IsPC() == true) { iAtk -= (iAtk * pkVictim->GetPoint(POINT_RESIST_HUMAN)) / 100; switch (pkAttacker->GetJob()) { case JOB_WARRIOR: iAtk -= (iAtk * pkVictim->GetPoint(POINT_RESIST_WARRIOR)) / 100; break; case JOB_ASSASSIN: iAtk -= (iAtk * pkVictim->GetPoint(POINT_RESIST_ASSASSIN)) / 100; break; case JOB_SURA: iAtk -= (iAtk * pkVictim->GetPoint(POINT_RESIST_SURA)) / 100; break; case JOB_SHAMAN: iAtk -= (iAtk * pkVictim->GetPoint(POINT_RESIST_SHAMAN)) / 100; break; #ifdef ENABLE_WOLFMAN_CHARACTER case JOB_WOLFMAN: // TODO: 수인족 저항 처리 iAtk -= (iAtk * pkVictim->GetPoint(POINT_RESIST_WOLFMAN)) / 100; break; #endif } } iAtk -= (iAtk * pkVictim->GetPoint(POINT_RESIST_HUMAN)) / 100; GL
  16. 2 points
    Please wait weekend I'm busy
  17. 2 points
  18. 2 points
    I hate when some people delete their bug fix topic...
  19. 1 point
    Hello, That's fine and great, but I don't get the point. I think using a decoration system like official servers did is better, I don't think a lot of people will disable terrain, water, trees or even clouds Good job anyway !
  20. 1 point
    Amazing work Best regards Raylee
  21. 1 point
    I dont know, what you do in gif Aah, body effect.
  22. 1 point
    Description: Today's New Year's eve, and I felt that I should help the people who can't compile the gamecore/db on FreeBSD, because of the library mess that's usually going on - most people compile DevIL, mysqlclient etc from the ports collection, as this takes a lot of time, hardware resources, and even knowledge for some. Given this situation, I've decided to compile from the official sources of all the required libraries, and tidy a bit up the all lib-includes files, by putting them all into the Extern folder (link below). This allows to brush away some stuff from the Server folder: (Yay, it's so clean and shiny ) I've also changed the makefiles according to the needs (link also below). This pre-done stuff should easy the process of compilation a lot for others, not to mention that it should work on all branches (I'm gonna test this next year lol ) Usage: Decompress your Server folder from your favourite branch, and upload it to a FreeBSD machine, which has gmake, makedepend and python installed. Nothing more is needed (except for gcc/g++ ofc). Upload the Extern.tgz archive into the same folder where you put the Server folder, and extract it. Patch the Makefiles in the Server folder with the ones from Makefiles.zip. Compile using gmake / gmake all / gmake game / gmake db from within the Server folder. Video (da n00b prooph part): Note: my English pronounciation isn't that great; I'll be adding subtitles asap. Downloads: Extern.tgz: https://mega.co.nz/#!EZMzxD4R!w1HSgj5F14-K0nB2oLOMzvXZan-UOVKtYjNiGjc3Ioo Makefiles.zip: https://mega.co.nz/#!ZY1FGBzD!3tgmBRLfAfVTwC-qWo4oDAW2sq_jkGX7gADzkExn3_c Happy New Year!
  23. 1 point
    Intro This release will explain how to "convert" your root .py files to .c ones. Actually, Cython only converts those files to pure CPython code. Download NOTE: ALL THE FILES HAVE BEEN MOVED TO HOW-TO-CYTHON-MT2. EDIT: As requested by many people, you can download the compatible and clean official cn root dated 20131228-0034 without further edits: rootCn_20131228-0034_edit.raruiscriptCn_20131228-0034.rarcN-serverinfo-edit.pyIs Cython really worth it?ProsAll the modules are compiled, and they can't be "extracted as .py" anymore.We can always disassemble the launcher with IDA, but the result will be pseudo-c code after waiting 6-8h of analyzing. Since we're not using .pyx files but directly .py ones, there's no "so much optimization".At least, 10% of performance increasing is guaranteed. ConsFor testing purposes, it's heavy to maintain. Everytime you try to re-compile your root files, you should wait 5-10 minutes.You can always use the uncythonized root (.py files) when you perform tests, and compile cython whenever you will make an update in your live server. The launcher's size will increase ~10mb. You can actually pack it to save space.If you directly use a .pyd (still 10mb), the launcher's size won't increase. VideoTutorial Credits Me (lollo_9_1/martysama0134)Night (OST suggestion)Random TestersWhat's New:v2.0The module's name check is now case-insensitive (colorInfo == colorinfo)Added a new function rootlib/uiscriptlib.getList() to retrieve a tuple of all the available cythonized modules.Now you can compile a uiscriptlib library from the uiscript*.py files! (implemented as __USE_EXTRA_CYTHON__)Added a sample ui.py containing the code to run uiscriptlib.
  24. 1 point
    A guy asked in this community a tutorial on how to add a bonus of alignment. Well today I show you a small tutorial that can do that, i not tested. - [ File: /Src/game/affect.h ] #1.) Search: AFFECT_BLEND, // 2) After make a new line and paste: ALIGNMENT_BONUS_1, ALIGNMENT_BONUS_2, Code for use: #ifdef __ALIGNMENT_BONUS__ if (GetRealAlignment() == NAME_ALIGNMENT_1) { AddAffect(ALIGNMENT_BONUS_1, POINT_MAX_HP, VALUE_BONUS_ALIGNMENT_1, 0, ALIGNMENT_TIME, 0, true); } if (GetRealAlignment() == NAME_ALIGNMENT_2) { AddAffect(ALIGNMENT_BONUS_2, POINT_MAX_HP, VALUE_BONUS_ALIGNMENT_2, 0, ALIGNMENT_TIME, 0, true); } #endif #ifdef __ALIGNMENT_BONUS__ if (FindAffect(ALIGNMENT_BONUS_1)) { if (GetRealAlignment() != NAME_ALIGNMENT_1) { RemoveAffect(ALIGNMENT_BONUS_1); } } #endif - [ File: /Src/common/service.h ] #define __ALIGNMENT_BONUS__ - [ File: /Src/common/ length .h ] #ifdef __ALIGNMENT_BONUS__ enum EAlignmentBonus { NAME_ALIGNMENT_1 = 100000 NAME_ALIGNMENT_2 = 200000, ALIGNMENT_TIME = 60*60*24*365, VALUE_BONUS_ALIGNMENT_1 = 1000, VALUE_BONUS_ALIGNMENT_2 = 2000, }; #endif You can use the code in function ComputePoints() from char.cpp or EnterGame() from input_main.cpp
  25. 1 point
×