Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 05/30/20 in all areas

  1. M2 Download Center Download Here ( Internal ) Hello, I know this files were released and released a lot of times, but I've decided to slim them for new comers or people who are interested in looking at them. It's basically, the 2014 krazy sources with every binary/compiled object cleaned up. Tools+Client+Server of mainline, mainline_cythonized, dev, dev_wolf_branch, mainline_w20, mainline_w21, mainline_released included. The archive size is 32MB Link: Here Password: ke5389JIEGH@r Good luck.
    11 points
  2. M2 Download Center Download Here ( Internal ) Download Here ( Latest Version ) This WE is a version compiled directly by me which includes infinite fixes and features. It's certain that you won't longer use the worldeditor_en! To make it simple, I wrote all the details about this feature and the common WE inside the relative config file: (called WorldEditorRemix.ini) ; Info: ; -) 100% translated ; -) granny2.11 ; -) F6 as Insert alternative ; -) many default features not present inside the worldeditor_en (probably, that binary was taken out from an SVN long time ago and resource hacked) such as Ins for all regions and skyboxes ; -) WASD UPLEFTDOWNRIGHT to move around (+asynchronous diagonally movements) ; -) UP-LEFT-DOWN-RIGHT to move around*10 (+asynchronous diagonally movements) ; -) config file for few things ; Output options by default ; few others such as default WASD movement ; whether or not Insert should let you go where you were before the press ; no MAI dump when saving atlas ; whether or not DevIL should compress and remove alpha from minimap.dds ; whether or not loading .mdatr building heights ; default textureset when creating maps ; overlapped tabs ; other stuff ; -) several bugfixes ; default title app name ; attempting to write to an empty textureset name when creating new maps ; ViewRadius doubled every load&save ; shadowmap.dds creation ; assert when saving atlas ; crash when adjusting height ; many buffer under/overflows ; *.mdc collision data saving (for game_test) ; not checking output options when loading maps ; water brush waterid bug (the id was increased until 256 each time the function was called; now it's based on the water height just like it should be) ; init texture map reload map crash and last 2px always blank ; square shape even for up/down height brushes ; add textureset texture button (+multiselection) ; remove textureset texture feature (just selecting a texture from the list and pressing DELETE) ; creation of empty textureset with index -1 (changed to 0) ; change baseposition button ; misspelled stuff ; skybox bottom image (nb: you also need a fixed launcher for this) ; removed boring CTRL requirement (to move the camera) when editing daylight/attr ; fixed refresh texture imagebox onKey pressing the down/up keys (like when onClicking them) ; fixed TextureSet file creation if not existing ; fixed new wolfman motion event handling ; fixed crash when editing animation attack bones and 00010.gr2 was missing ; fixed locale/ymir/mob_proto load (it autodetects the most common structures) and <map>/regen.txt load/save ; fixed ./group.txt load ; fixed load/save/edit <map>/regen.txt (very nice for "m" regens, untested for "g") ; load from PACK is available if pack/property is present! Be sure pack/Index exists! ; fixed multi-object selection crash ; fixed crash when previewing a missing texture ; fixed not clearing of old environment (e.g. skybox) when switching maps ; fixed not creating property folders in root tree (object tab) ; fixed object attachment in Model Tab ; fixed newly particles names in Effect Tab ; fixed crash when saving a .mse script with no mesh model ; fixed crash when inserting a lower gradient ; -) created new TextureSet field when creating new maps ; -) created new Change/Delete Texture buttons when double-clicking a texture ; -) created Background Music playback and Shadow Recalculate buttons ; -) created water height "set 0z", "+1z", "-1z" buttons ; -) server_attr generator ; -) every crash will generate a logs/WorldEditorRemix_{target}_{date}.dmp file useful for debugging ; -) implemented a "water path" mapsettings option (the launcher requires additional code) ; -) implemented a "wind strength" msenv option (the launcher requires additional code) ; -) the "encrypt data" feature does nothing (unimplemented) ; Note: ; 0) there are no regressions in this version! a bug here means it'd also be present in older WE versions too! ; 1) the shadow output option is tricky: when UpdateUI is called, shadows are hidden although the check is pressed (i implemented the shadow recalculate function for that) #fixed since v11 ; 2) the bgm player requires /miles and the fadein/out doesn't work until you load the map ; 3) the adjusting height button works only if mdatr height is detected ; 4) the Debug version is laggy when working on maps such as n_flame_dungeon and n_ice_dungeon (by default, because SphereRadius are intensively checked in SphereLib\spherepack.h) ; 5) if you load a map, the script panels (where you load .msa et similia) will have the camera perspective a little fucked up (0z instead of -32767z or 0x 0y -163,94z) ; 6) few tree objects are not movable and/or highlightable after placed on the ground and their selection is invisible (you can still delete 'em) ; trick: draw a square selecting a normal building and 'em, then move the building and you'll see all of 'em will be moved! ; 7) the server_attr generator will clean all the unused flags! attr[idx]&=~0xFFFFFFF8; ; 8) you can read files from pack/Index 'n stuff but be aware that Property will not be considered! #fixed since v15 ; 9) the MonsterAreaInfo features are laggy and buggy as fuck ; 10) even though you can select many textures at once (using ctrl+click on textureset list; for brushing or initializing a base texture), you can't delete more than one at the same time ; 11) the .mdatr height is tricky; if you move a building, the height will not be refreshed until you put a new building or whatever you want to trigger the update event ; 12) by default, the worldeditor tries to render only the first 8 terrain textures of a 32x32px region (nb: a 1x1 map is a 256x256 px region) ; 13) the minimap rendering cannot catch the buildings/trees inside the first 2x2 regions due a ymir cache fault and you need to set the camera to "see" them ; 14) when the textureset, environment, etc load fails, the old filename still remains loaded ; 15) the attr flag "3" (three) has no implementation, so don't use it! ; 16) load from PACK doesn't load texturesets from files for first (if they are already in pack/), and the object placer's object list will remain empty because it takes the list from property/ (and not from pack/property) ; 17) to save the regen.txt you press CTRL+S ; 18) if you enable the wireframe (f4) when on Attr Tab, you see the terrain all white ; 19) the water brush disappears when the camera renders the waterwheel small/big effect ; 20) the monster area info goes under ground if you're outside the relative sectree ; 21) the full skybox may be displayed only after the top picture has been added (if the other textures have already been inserted) ; 22) the slider in the Attr Tab is something like "16 photoshop layers" in which you can split your attrs; not so helpful and quite confusing sometimes ; 23) the fixed model - object attachment attaches static objects (hairs'skeleton will not mirror the playing animation) ; 24) in environment tab, if you insert lower gradients, you may end up with an out of range crash #fixed since v30 ; 25) brushes working out-of-screen/map-range may affect random terrain places ; TODO: ; A) look at more than 8 textures for region -> DONE ; B) create a shortcut to fix the #5 note -> DONE ; C) disable the radius <= GetRadius()+0.0001f check to fix the #4 note -> REJECTED ; the worldeditor_en calls this assert and, if ignored, the lag ceases to exist (this will not occur in source version) ; at least, if the release version is not a problem for you, use that in those few cases when .mse are abused and try to kill the debug one ; D) translation in more languages other than english -> REJECTED ; english should be enough! ; E) alternative path for d: -> REJECTED ; you can mount d as a subpath of c like this: ; subst d: "c:\mt2stuff" ; F) need to fix note #19 #25 -> TODO [shortcuts] ; ### SHORTCUTS ; # ESC(ape) Clean cursor ; # Canc(el|Delete) Delete stuff such as selected buildings ; # Ctrl+S Save map ; # Ins(ert) or F6 Save shadowmap|minimap.dds ; # F3 BoundGrid Show/Hide ; # F4 Render UI Show/Hide ; # F11 WireFrame Show/Hide ; # R Reload Texture ; # Z and X Decrease/Increase Texture Splat by 0.1 ; # CapsLock Show GaussianCubic effect if shadows are displayed ; # L-Shift+1-6 Show TextureCountThreshold flags (&2-7) as colors on the ground ; # L-Shift+8 Set Max Showable texture to 8 (de-fix note 12) ; # L-Shift+0 Set Max Showable texture to 255 (fix note 12) ; # H Refresh MDATR Heights (useful when you move an object) (fix note 11) ; # Y Set Perspective as default (fix note 5) ; # T Set the Camera to catch all the object on the screen (w/a note 13) then you'll be ready to press Insert/F6 ; # DO NOT HAVE AN OBJECT SELECTED WHEN USING THOSE SHORTCUTS (MW1-7) ; # MouseWheel+1 move cursor x rotation ; # MouseWheel+2 move cursor y rotation ; # MouseWheel+3 move cursor z rotation ; # MouseWheel+4 move cursor height base (1x) ; # MouseWheel+5 move cursor height base (0.5x) ; # MouseWheel+6 move cursor height base (0.05x) ; # MouseWheel+7 move cursor ambience scale (1x) ; # MouseWheel+Q move selected object height base (1x) ; # MouseWheel+9 move selected object x position (1x) (+asyncronous) ; # MouseWheel+0 move selected object y position (1x) (+asyncronous) ; # MW+RSHIFT+9|0 as above but *10x (+asyncronous) ; # MW+RCONTROL+9|0 as above but *100x (+asyncronous) ; # MouseLeft Insert Objects ; # MouseRight Move camera (it could require CTRL too) ; # SPACE Start move/selected animation in Object/Effect/Fly CB ; # ESC Stop animation in Effect/Fly CB [config] ; ### CONFIG OPTIONS VIEW_CHAR_OUTPUT_BY_DEFAULT = 1 VIEW_SHADOW_OUTPUT_BY_DEFAULT = 1 VIEW_WATER_OUTPUT_BY_DEFAULT = 1 ; WINDOW_HEIGHT_SIZE = 1080 ; WINDOW_WIDTH_SIZE = 1920 WINDOW_FOV_SIZE = 45 ; #100 = 1px (minimal px movement when pressing WASD) WASD_MINIMAL_MOVE = 100 ; came back from where you were before pressing Insert/F6 NO_GOTO_AFTER_INSERT = 1 ; disable MAI dumps when saving atlas and/or pressing Insert/F6 NOMAI_ATLAS_DUMP = 1 ; disable minimap.dds alpha saving and enable compression NOMINIMAP_RAWALPHA = 1 ; enable .mdatr height collision loading when moving on buildings or adjusting terrain DETECT_MDATR_HEIGHT = 1 ; disable fog when loading maps NOFOG_ONMAPLOAD = 1 ; refresh all checkbox configurations when loading maps 'n stuff REFRESHALL_ONUPDATEUI = 0 ; set a default mapname prefix when creating new maps ("" to disable) NEW_MAP_MAPNAME_PREFIX = "metin2_map_" ; display a default textureset when creating new maps ("" to disable) ; note: it loads the filepath if exists, otherwise it will create an empty textureset file NEWMAP_TEXTURESETLOADPATH = "textureset\metin2_a1.txt" ; create a default textureset as "textureset/{mapname}.txt" ; note: this option is not considered if NEWMAP_TEXTURESETLOADPATH is not empty. [before v24] ; note: this option is not considered if the TextureSet path input is not empty when creating a new map [since v24] NEWMAP_TEXTURESETSAVEASMAPNAME = 1 ; remove the weird attr flags from the generated server_attr SERVERATTR_REMOVE_WEIRD_FLAGS = 1 ; show diffuse lighting to object VIEW_OBJECT_LIGHTING = 1 ; path of mob_proto used for regen MOB_PROTO_PATH = "locale/ymir/mob_proto" ; select monster area info checkbox at startup VIEW_MONSTER_AREA_INFO = 0 ; brush cursor / object selection color RGB float between 0.0 to 1.0 (default: green -> 0 1 0) RENDER_CURSOR_COLOR_R = 0.0 RENDER_CURSOR_COLOR_G = 1.0 RENDER_CURSOR_COLOR_B = 0.0 Download: [Hidden Content] How To Map: This release will not cover this part. Look at CryPrime`s tutorials to understand how to do it. About the ServerAttr Generator: (since v14) This is a beta function but it should work fine. I tested it on gm_guild_build (1x1), metin2_map_a1 (4x5), metin2_map_trent (2x2), metin2_n_snowm_01 (6x6) and the result was the same as the blackyuko map editor. (I use a different lzo version and I clean deprecated and useless flags, so the size is different from this last one but the "final image" will be the same; using game_test to fix his server_attr will let mine and his perfectly equal byte per byte) I also give you the source code of my server_attr generator function. CLICK A server_attr file is based on all the attr.atr files merged into a one raw RGBA image and each one scaled from 256x256 to 512x512. After that, the image will be splitted into sectors of 128x128 px and each one compressed using lzo compression. The server_attr header is composed by the size of the map*4. (e.g. a 4x4 will have a 16x16 size with 256 sectors inside) (gj ymir CLICK) An uncompressed server_attr sector is just like this: CLICK (the sub 4 byte header is the size returned by the LzoCompress which indicates how much the compressed sector data are large) Each attr.atr is just like this: CLICK (the header is composed of 6 byte in total: 3 WORDs respectively for version, width and height; they are always 2634, 1, 1 so don't bother about it) A single attr.atr scaled from 256x256 to 512x512 will be just like this: CLICK You can use the game_test (from source) to perform few tasks like: Create a server_attr from a .mcd file (I won't suggest it) a <collision data filename> <map directory> Regenerate an old server_attr to server_attr.new using the current lzo compression and cleaning useless flag CLICK c <filename> Other stuff such as b to create a character instance or q to quit About the SkyBox Bottom pic fix: (since v21) Both metin2launch.exe and worldeditor.exe should be edited to see the bottom pic of the skybox. Ymir messed up the code wrongly flipping the bottom image. Open ./Srcs/Client/EterLib/SkyBox.cpp and replace: ////// Face 5: BOTTOM v3QuadPoints[0] = D3DXVECTOR3(1.0f, -1.0f, -1.0f); v3QuadPoints[1] = D3DXVECTOR3(1.0f, 1.0f, -1.0f); v3QuadPoints[2] = D3DXVECTOR3(-1.0f, -1.0f, -1.0f); v3QuadPoints[3] = D3DXVECTOR3(-1.0f, 1.0f, -1.0f); with: ////// Face 5: BOTTOM v3QuadPoints[0] = D3DXVECTOR3(1.0f, 1.0f, -1.0f); v3QuadPoints[1] = D3DXVECTOR3(1.0f, -1.0f, -1.0f); v3QuadPoints[2] = D3DXVECTOR3(-1.0f, 1.0f, -1.0f); v3QuadPoints[3] = D3DXVECTOR3(-1.0f, -1.0f, -1.0f); then recompile. Credits:
    3 points
  3. Detailed information about #6: As you all aware, the resource loading is not async. (like @IceShiva said it earlier) There are 2 types of resource loading: Ask the packer tool itself (eterpack) directly for some file (this could be any type of file). This method will always block, so it does not cache, and by default (using eterpack) it always read from the disk (it uses mapped files so its a little bit better than directly reading from the disk, cus some sections could be already cached inside the OS). Ask the resource manager to load a resource. Only some type of data can be used here (images, .sub, .mdatr, .fnt, .gr2, etc). There are also 2 scenarios: If the resource already exists inside the cache, it will directly return with the loaded data. If the data is not yet loaded, #1 happens, but it will cache the data. There is a time limit for unused resources to keep them cached. Once the limit has been reached and still nothing uses it it will unload the unused resources. The problems When a new player arrives the motion files are not cached (not the .gr2 files), so for every player it will try to use method #1. When you meet a new player/mob with uncached models (armours, weapons, hairs, etc) the game will use #1 due to the reason explained in method #2 scenario #2. A proper solution: Make it async! This would mean that you have to provide a callback every time you ask for something. You will have to change lots of stuff, mostly in python part, to handle async loading correctly. For example the python UI sometimes depends on other element's size. If the image is not yet loaded, then it would mean that its size is 0x0. You could however for example tell the UI that okay, preload the images first, then if everything is loaded then you can build the interface. Here is an example:
    3 points
  4. M2 Download Center Download Here ( Internal ) Hi everyone! So, after serveral days of searching a tool that could change the texture path of a .gr2 file, I found the tool(probably all of you know it, the texture changer by marv). After that I tried to change the texture paths of some gr2 models of a weapon, and guess what, it didn't work. I'm gonna reupload the file, because I didn't seen it on metin2dev, and I'm gonna teach you how to use it. First of all, I don't know about others, but for me it didn't work to change anything with this (I'm running windows 7 x64 bit). Some of guys told me that this "texture changer" works only on windows 7 x86 bit, so I reinstalled my windows(I really needed that tool), of course, it didn't work either way. So, go in Start and search cmd, and run it. After the cmd started you'll see a path right there C:\Users\Name (Instead of Name you'll have your username of computer administrator, or the account you're logged in), now that's the path where we can work with the tool. PAY ATTENTION!!! IF YOU START THE TOOL IN OTHER FOLDER INSTEAD OF C:\Users\Name THE TOOL WILL NOT WORK, AND YOU WILL NOT BE ABLE TO SAVE THE NEW MODEL. Exctract all the files from the archive(I'll post it below), and start Metin2TextureChanger.exe. Now click "Load" to choose a gr2 file you want to change texture path, BUT, the model name can't have spaces in name(devil sword.gr2 for example, it's wrong, the tool won't read it, and you'll not be able to save your new gr2 model), so if you want to change for example devil sword.gr2 you need to rename it into devil_sword.gr2 or devilsword.gr2 or any other name without spaces betwen. Where is "Neuer Texturpfad" we will chose the new path for texture, for example d:\ymir work\test\devil_sword_blue.dds , there you can choose any other path, but you can't modify "d:\ymir work" or you won't be able to see the weapon/armour in-game. Now we save the file wherever we want, it doesn't matter, this way must work for everybody. AGAIN, THIS TOOL WASN'T MADE BY ME. And I made this post because I've searched many days a tool that would work, but neither didn't work, and this tool didn't work for me either just when I used this method. So, this post is for guys who had the same problem like me (they had the tool, but couldn't save the new model) that's why I wanted to help them, and any other people who weren't been able to use it. And about the other tool I've found on this forum, the tool "made" by thunder-core, I didn't find that tool satisfying, it worked, but after the new model was made, I wasn't been able to import it in 3d max, or to convert the model from file format revision 7 to 6. So you were basicaly forced to upgrade your client to granny 2.9, and I found that inconvenient, because, I don't know about others, but I don't use source for binary, and because of that it's imposible to see the model in-game. And of course, the new model you've created, with the tool in attachement, is revision 7, so you need the new granny if you want to see it in-game, but you can use the converter from archive to convert from revision 7, to revision 6 (old), and you'll be able to see it in-game. If you already see it in-game, you don't need to use the converter. If you found this post helpful I'm glad I could help you.
    3 points
  5. M2 Download Center Download Here ( Internal ) Hi, here I publish my edit of the public Render Target System. I hate it, when people earn money with public systems. Preview: [Hidden Content] DL: [Hidden Content] Original Thread [Hidden Content]
    2 points
  6. M2 Download Center Download Here ( Internal ) So, someone asked me to do this some time ago, I know some servers have already thought of this idea and have been present for some time but anyway I will share it since I haven’t seen nothing similar shared elsewhere and this has been sitting around my hard drive. Although it's something very simple, it’s a good feeling to see from the inventory the status of the dragon soul. Instead of adding the tutorial here I will link a repository to the guidelines. Git Repository [Hidden Content]
    1 point
  7. Hello, After some lurking and bugfixings in my own sources and some chit-chat with @ASIKOO , who is one my guinea pig for almost every bugs that I've encountered so far (I always double check so that it's not my fault), we decided that it might be good to create a thread about the "old metin2 bugs". Those bugs are (for the most part) unresolved in most servers, if not none. It might be anything from a poorly handled method to do something to a major bug, or simply anything that has bothered you when playing the game. Feel free to add bugs you know if you ever find them. But note that it must be a real bug affecting vanilla (kraizy) sources and not a bug that you've encountered on a specific server and nowhere else. I'll start with a few that I've noticed so far and that are confirmed. I will update this list if I find more of them or if some of you post them here. If anyone come up with a proper fix (some of them are easy to fix, some are more tricky and can be fixed in various ways) feel free to share it on the forum. 1. Textures blurring out when prompting any UAC check. (Fix in Spoilers) 2. Any character being automatically attacked by another character is unable to move, to run away or to attack (Pre-fix in Spoilers) 3. Teleporting when mounting an entity will completely cancel its walking / running sound. (Fix in Spoilers) 4. The game will try to load a .mss file for every .msa file. 5. The game will try to load indefinitely the motions of a non-existing file. 6. Multiple fps drops on loading mounts, pets and players (Fixes in Spoiler) 7. Some mobs can run away on death instead of playing the death animation. (Fix in Spoilers) That's for the most part of the bugs I currently remember, I will most likely update this list later based on what I remember or what's posted on this topic. Feel free to contribute! Regards, Gurgarath
    1 point
  8. M2 Download Center Download Here ( Internal ) Description : The mount will follow you. The bonuses is set from item_proto. [Hidden Content] [Hidden Content] [Hidden Content] Code is based on default pet code from Ymir, i don't offer support for extra features, details, anyway easy for use. (Sorry for tutorial, not so perfect.) Download (Reupload): [Hidden Content]
    1 point
  9. Download Metin2 Download Hi, I did not find a share with the Sources of Metin2... I share the sources with you today ! Kraizy sources with all branches of development. External Link : Mega or Go Sincerly, ASIKOO
    1 point
  10. M2 Download Center Download Here ( Internal ) VirusTotal: [Hidden Content] Hi ! Today ThunderCore Society will offer you a special tool for Granny3D Models. Note: That tool isn't for begginers and we don't offer suport for that. We hereby inform you that we take the copyrights file and his contents because ThunderCore Society has paid to perform this work. Attention: NonCommercial — You may not use the material for commercial purposes. NoDerivatives — If you transform, or build upon the material, you may not distribute the modified material. No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits. Kind Regards - Johnny White
    1 point
  11. M2 Download Center Download Here ( Internal ) Hi there. While cleaning out "my closet", I found this thing I developed between 2014-2015 - maybe(?) - for my, at that moment, server. Since it's now closed, and I won't use it, I'm sharing it with you guys. Note: Didn't do the scrollbar, wasn't needed for me, so yeah. Now, let's start with opening your locale_game.txt and adding these lines: QUESTCATEGORY_0 Main Quests QUESTCATEGORY_1 Sub Quests QUESTCATEGORY_2 Collect Quests QUESTCATEGORY_3 Levelup Quests QUESTCATEGORY_4 Scroll Quests QUESTCATEGORY_5 System Quests Alright, now find your characterwindow.py (uiscript?) and you can either comment Quest_Page children or simply remove them all. Moving on to your interfaceModule.py find this line self.BINARY_RecvQuest(index, name, "file", localeInfo.GetLetterImageName()) and replace it with self.wndCharacter.questCategory.RecvQuest(self.BINARY_RecvQuest, index, name) Ok, then we are at the most, let's say, difficult part of this. Open your uiCharacter.py and just as you did in your characterwindow.py, remove or simply comment any single line related to quests. You can just search for these vars: self.questShowingStartIndex self.questScrollBar self.questSlot self.questNameList self.questLastTimeList self.questLastCountList Once you did that, you just: # Find these lines self.soloEmotionSlot = self.GetChild("SoloEmotionSlot") self.dualEmotionSlot = self.GetChild("DualEmotionSlot") self.__SetEmotionSlot() # And add the following import uiQuestCategory self.questCategory = uiQuestCategory.QuestCategoryWindow(self.pageDict["QUEST"]) # Find this def OnUpdate(self): self.__UpdateQuestClock() # Replace it with def OnUpdate(self): self.questCategory.OnUpdate() And we're done with the client-side. I attached some extra elements needed (such as the main python file (uiQuestCategory.py) and some image resources). Remember to edit the path linked to these images in that file. For the server-side... Well, screw it, uploaded it too. Too lazy to write. It has only a new quest function (q.getcurrentquestname()) and a few things to add in your questlib.lua. Btw, not sure if you have it, but if not, just add this extra function in ui.Button() (ui.py - class Button). def SetTextAlignLeft(self, text, height = 4): if not self.ButtonText: textLine = TextLine() textLine.SetParent(self) textLine.SetPosition(27, self.GetHeight()/2) textLine.SetVerticalAlignCenter() textLine.SetHorizontalAlignLeft() textLine.Show() self.ButtonText = textLine #Äù½ºÆ® ¸®½ºÆ® UI¿¡ ¸ÂÃç À§Ä¡ ÀâÀ½ self.ButtonText.SetText(text) self.ButtonText.SetPosition(27, self.GetHeight()/2) self.ButtonText.SetVerticalAlignCenter() self.ButtonText.SetHorizontalAlignLeft() Forgot the source part, fml, here it is. Add it to your questlua_quest.cpp. int quest_get_current_quest_name(lua_State* L) { CQuestManager& q = CQuestManager::instance(); PC* pPC = q.GetCurrentPC(); lua_pushstring(L, pPC->GetCurrentQuestName().c_str()); return 1; } void RegisterQuestFunctionTable() { luaL_reg quest_functions[] = { { "getcurrentquestname", quest_get_current_quest_name}, { NULL, NULL } }; CQuestManager::instance().AddLuaFunctionTable("q", quest_functions); } Now, finally, have fun and bye!
    1 point
  12. M2 Download Center Download Here ( Internal ) Hello, Working on some new stuff I found out that current implementation of event looks a bit tricky. Due to this fact I basically deciced to re-implement it in C++11 providing up to date tech. Don`t forget to take a look at this topic before you start: [Hidden Content] So lets begin. Add include into the main.cpp: #ifdef __NEW_EVENT_HANDLER__ #include "EventFunctionHandler.h" #endif And add this into main function before: while (idle()); #ifdef __NEW_EVENT_HANDLER__ CEventFunctionHandler EventFunctionHandler; #endif Now add this at the end of idle: #ifdef __NEW_EVENT_HANDLER__ CEventFunctionHandler::instance().Process(); #endif Now search for: sys_log(0, "<shutdown> Destroying CArenaManager..."); And add before: #ifdef __NEW_EVENT_HANDLER__ sys_log(0, "<shutdown> Destroying CEventFunctionHandler..."); CEventFunctionHandler::instance().Destroy(); #endif Now open service.h and add this define: #define __NEW_EVENT_HANDLER__ That`s all. Now just download attachment and add included files to your source.
    1 point
  13. M2 Download Center Download Here ( Internal ) Hello togehter, today i want to share a small, but in my opinion, usefull security upgrade for your player password-hashes. The current default hash, which is used by the most of you (some exeptions might be out there) is the MD5 Hash. This hash might be not the best choice for hashing passwords in this modern days. This is why i thought about something to change there. And my solution for this is Argon2. This Method had won the Password Hashing Competition and this is why i had choosen this over bcrypt or scrypt. This tutorial isn't a 100% beginner firendly guide! Just follow my instructions if you got a little bit of c++ knowledge and know how to work with the source! Create the libargon2 Change the hash inner the game-core source (DEFAULT PASSWORD() MYSQL FUNC TUTORIAL) For now you just need to edit the account.account table and set the size for the password to 128 (Why 128? Db.h EArgon2::HASH_LENGTH = 64. 64 * 2 = 128) And you need to replace your hashes with the argon2 once. For this follow the link to the generation: [Hidden Content] Example config for the tutorial setup: Have fun
    1 point
  14. Hi everyone, İ think the title explains everything. my English still terrible but I'm improving. I put English subtitles to video so you can understand. If there are enough requests, I'm gonna put subtitles to other videos also.
    1 point
  15. Nooooooooooooooooooooooooooooooooo not my food! My only weakness! Welcome!
    1 point
  16. First of all, you should be aware that metin2 is not the greatest thing when it comes to multithreading so you should always look for something that has higher CPU Clock Speed rather than more cores at low freq. I'd clearly say a big no to OVH ever since they would legally work with anyone including gameforge themselves. However some of my recommendations are: FastPipe Zap-Hosting Contabo ReliableSite Tried them all and the best out of them all i'd say it is fastpipe and reliable, they all offer freebsd images and the prices are great.
    1 point
  17. M2 Download Center Download Here ( Internal ) Download Here ( GitHub ) System to turn on/off/restart the server together with online status and time This is the free version, I also have a premium with colors, the ability to control each channel separately and browse syserr/syslog. Do you need a quest, system or www? Write to me, I can create everything. (Full STACK, Web (PHP, JS, SQL, HTML, CSS), Server (C ++, Python, Lua)) Discord Alerin#5559
    1 point
  18. So a quick fix should be this for the knockdown problem. You won't be able to walk away, but you can at least attack. case NAME_DAMAGE_FLYING: case NAME_DAMAGE_FLYING_BACK: //SetType(TYPE_KNOCKDOWN); break;
    1 point
  19. uitarget.py search: if not player.IsSameEmpire(self.vid): self.__HideButton(localeInfo.TARGET_BUTTON_INVITE_PARTY) self.__HideButton(localeInfo.TARGET_BUTTON_FRIEND) self.__HideButton(localeInfo.TARGET_BUTTON_FIGHT) comment this line: ##self.__HideButton(localeInfo.TARGET_BUTTON_FIGHT)
    1 point
  20. Your getting hit by blades and you think its a bug when the character cant move ? I mean in reallife if you have a knife in your head do you still walk away
    1 point
  21. [Hidden Content] -block change pkmode on 114 map index
    1 point
  22. affect.add_collect Can't save same type/value in SQL player.affect so it will overwrite. You MUST change value, to save different collects. Regards.
    1 point
  23. The forum is going into a wrong direction. Regarding to the chatbox and these kind of posts, I feel so bad.
    1 point
  24. Hello everyone. Let me share these with you here. This post contains everything for the recent[v20.1.5.1 05.05.2020] item and mob proto structure. About the mob_proto it might be some false data, but it's okay , it is impossible to figure out totally from clientside only. I am going to explain my thoughts about the new AI Flags as well as about everything I know, or think. enum EMisc { CHARACTER_NAME_MAX_LEN = 24, MOB_SKILL_MAX_NUM = 5, ITEM_NAME_MAX_LEN = 24, ITEM_LIMIT_MAX_NUM = 2, ITEM_VALUES_MAX_NUM = 6, ITEM_APPLY_MAX_NUM = 4, ITEM_SOCKET_MAX_NUM = 3, CHARACTER_FOLDER_MAX_LEN = 64, }; Fist stop, this enum contains some basic informations which mostly the same, except one. ITEM_APPLY_MAX_NUM has been increased to 4 from 3. Why? Because of the new mounting system what they have done. The seal items of the mounts control everything about the mounting and its bonuses; - New APPLY_MOUNT bonus, its value is the vnum of the mount, stored into POINT_MOUNT. - The bonuses what the mount gives are in the rest of the applies. This why they had to add an extra apply because some mounts gives up to 3 bonuses. typedef struct SItemLimit { BYTE bType; long lValue; } TItemLimit; typedef struct SItemApply { WORD wType; long lValue; } TItemApply; Ho-ho-ho another stop here for a sentence. Might be you cannot see any new values, but if you check the datatypes in the TItemApply, you will see they have changed the datatype of the ApplyType from BYTE(unsigned char) to WORD(unsigned short). Why? The answer is easy; because of their number of the bonuses reached the 255 limit of the BYTE, above of 255 the data will overflow. This modification they made with the 6th 7th bonuses. They added lots of worthless bonuses to be different from the private section and to squeeze out the money of the players with the 6th 7th bonuses. enum EItemAntiFlag { ITEM_ANTIFLAG_FEMALE = (1 << 0), ITEM_ANTIFLAG_MALE = (1 << 1), ITEM_ANTIFLAG_WARRIOR = (1 << 2), ITEM_ANTIFLAG_ASSASSIN = (1 << 3), ITEM_ANTIFLAG_SURA = (1 << 4), ITEM_ANTIFLAG_SHAMAN = (1 << 5), ITEM_ANTIFLAG_GET = (1 << 6), ITEM_ANTIFLAG_DROP = (1 << 7), ITEM_ANTIFLAG_SELL = (1 << 8), ITEM_ANTIFLAG_EMPIRE_A = (1 << 9), ITEM_ANTIFLAG_EMPIRE_B = (1 << 10) ITEM_ANTIFLAG_EMPIRE_R = (1 << 11) ITEM_ANTIFLAG_SAVE = (1 << 12) ITEM_ANTIFLAG_GIVE = (1 << 13) ITEM_ANTIFLAG_PKDROP = (1 << 14) ITEM_ANTIFLAG_STACK = (1 << 15) ITEM_ANTIFLAG_MYSHOP = (1 << 16) ITEM_ANTIFLAG_SAFEBOX = (1 << 17) ITEM_ANTIFLAG_WOLFMAN = (1 << 18) ITEM_ANTIFLAG_RT_REMOVE = (1 << 19) ITEM_ANTIFLAG_QUICKSLOT = (1 << 20) ITEM_ANTIFLAG_CHANGELOOK = (1 << 21) ITEM_ANTIFLAG_REINFORCE = (1 << 22) ITEM_ANTIFLAG_ENCHANT = (1 << 23) ITEM_ANTIFLAG_ENERGY = (1 << 24) ITEM_ANTIFLAG_PETFEED = (1 << 25) ITEM_ANTIFLAG_APPLY = (1 << 26) ITEM_ANTIFLAG_ACCE = (1 << 27) ITEM_ANTIFLAG_MAIL = (1 << 28) }; Okay, here also there are many of new antiflags and I am going the explain the new flags only: ITEM_ANTIFLAG_RT_REMOVE : This one kind of funny, because this doesn't have any reference at clientside, but it should be ANTIFLAG_REAL_TIME_REMOVE. Which blocks the destroyitem function when the real_time_expire_event is executed. It is about 98% sure. Only the new pet system seals have this flag, and their transport box. Isn't it funny that I've just figured this out now when I wrote this? haha ITEM_ANTIFLAG_QUICKSLOT : Obviously blocks to attach the item with this flag to the quickslots. ITEM_ANTIFLAG_CHANGELOOK : This one will block the changelook process. That item which has this flag cannot be used for appearance for another. ITEM_ANTIFLAG_REINFORCE : Blocks to add new bonuses to an item. ITEM_ANTIFLAG_ENCHANT : Blocks to change the attributes of an item. ITEM_ANTIFLAG_ENERGY : Blocks to use the item for making Energy Fragment from it. ITEM_ANTIFLAG_PETFEED : This flag blocks the pet, to eat the item which has it. ITEM_ANTIFLAG_APPLY : This flag will make the item unstonable, you will not be able to put any stones into it. Or It blocks every applicable item to use on it, can be both too, dunno. ITEM_ANTIFLAG_ACCE : This flag will block theowadan to absorb the bonuses from the item which has this flag. ITEM_ANTIFLAG_MAIL : The flag will make the item unsendable via mail. enum EItemFlag { ITEM_FLAG_REFINEABLE = (1 << 0), ITEM_FLAG_SAVE = (1 << 1), ITEM_FLAG_STACKABLE = (1 << 2), ITEM_FLAG_COUNT_PER_1GOLD = (1 << 3), ITEM_FLAG_SLOW_QUERY = (1 << 4), ITEM_FLAG_RARE = (1 << 5), ITEM_FLAG_UNIQUE = (1 << 6), ITEM_FLAG_MAKECOUNT = (1 << 7), ITEM_FLAG_IRREMOVABLE = (1 << 8), ITEM_FLAG_CONFIRM_WHEN_USE = (1 << 9), ITEM_FLAG_QUEST_USE = (1 << 10), ITEM_FLAG_QUEST_USE_MULTIPLE= (1 << 11), ITEM_FLAG_QUEST_GIVE = (1 << 12), ITEM_FLAG_LOG = (1 << 13), ITEM_FLAG_APPLICABLE = (1 << 14), }; Small confess about the normal Flags, I'm too lazy to explain everything so I just put here the list of them Anyway they didn't add any new, just removed some unused from 2003 devphase. enum EItemWearFlag { WEARABLE_BODY = (1 << 0), WEARABLE_HEAD = (1 << 1), WEARABLE_FOOTS = (1 << 2), WEARABLE_WRIST = (1 << 3), WEARABLE_WEAPON = (1 << 4), WEARABLE_NECK = (1 << 5), WEARABLE_EAR = (1 << 6), WEARABLE_UNIQUE = (1 << 7), WEARABLE_SHIELD = (1 << 8), WEARABLE_ARROW = (1 << 9), WEARABLE_HAIR = (1 << 10), WEARABLE_ABILITY = (1 << 11), WEARABLE_PENDANT = (1 << 12), }; Here for a comment, they have just added the pendant as new, and changed the index of the unique with the shield. Also wondering when they are going to remove the unused wear ability flag, and its I dont know how many slots from the equipments .. Those were back in time couple of hidden items, for the collection quests bonus holder of the results, or whatever, stupid thing, unused, supposed to be removed. Done. The Immune flag is untouched, pf obviously because it is used for nothing at all rofl. About the LimitTypes, they removed the PC_BANG value, and its items, codes completely. typedef struct SItemTable { DWORD dwVnum; DWORD dwVnumRange; char szName[ITEM_NAME_MAX_LEN + 1]; char szLocaleName[ITEM_NAME_MAX_LEN + 1]; BYTE bType; BYTE bSubType; BYTE bWeight; BYTE bSize; DWORD dwAntiFlags; DWORD dwFlags; DWORD dwWearFlags; DWORD dwImmuneFlag; DWORD dwBuyItemPrice; DWORD dwSellItemPrice; TItemLimit aLimits[ITEM_LIMIT_MAX_NUM]; TItemApply aApplies[ITEM_APPLY_MAX_NUM]; long alValues[ITEM_VALUES_MAX_NUM]; long alSockets[ITEM_SOCKET_MAX_NUM]; DWORD dwRefinedVnum; WORD wRefineSet; DWORD dw67Material; BYTE bAlterToMagicItemPct; BYTE bSpecular; BYTE bGainSocketPct; BYTE bMaskType; BYTE bMaskSubType; } TItemTable; Okay, lets do this one too. So, as you can see here are couple of new values, compared to the old one from 2013. Let's roll over on the new values. dw67Material : This one will be the vnum for the 6th 7th bonus adder, which material is necessary to add the bonus to the item. You can read about this on the official wiki. bMaskType : This is used for the private shop search to categorize the items. bMaskSubType : This is also used for the private shop search to categorize the items. Last word about the item_proto: I will not put the types, subtypes, and their mask version and describe them because none of you will use it . Coming up the mob_proto. enum EMobEnchants { MOB_ENCHANT_CURSE, MOB_ENCHANT_SLOW, MOB_ENCHANT_POISON, MOB_ENCHANT_STUN, MOB_ENCHANT_CRITICAL, MOB_ENCHANT_PENETRATE, MOB_ENCHANTS_MAX_NUM, }; Yes this is untoucheed. No, they didn't add bleeding as enchant to the mobs. It is an effect of some skills of the monsters in the zodiac temple. enum EMobResists { MOB_RESIST_FIST, MOB_RESIST_SWORD, MOB_RESIST_TWOHAND, MOB_RESIST_DAGGER, MOB_RESIST_BELL, MOB_RESIST_FAN, MOB_RESIST_BOW, MOB_RESIST_CLAW, MOB_RESIST_FIRE, MOB_RESIST_ELECT, MOB_RESIST_MAGIC, MOB_RESIST_WIND, MOB_RESIST_POISON, MOB_RESIST_BLEEDING, MOB_RESISTS_MAX_NUM, }; Here you can see couple of new values, all of them obvious, and readable to understand. But if it isn't... MOB_RESIST_FIST: Resist to fist, so when you hit the monster without weapon equipped and it has this defence value, the damage will be reduced. MOB_RESIST_CLAW: Resist against claw attacks, come on, I don't want to do this. MOB_RESIST_BLEEDING: Same as resist_poison just against of the bleeding. enum EMobElementaryWhatevers { MOB_ELEMENTAL_ELEC, MOB_ELEMENTAL_FIRE, MOB_ELEMENTAL_ICE, MOB_ELEMENTAL_WIND, MOB_ELEMENTAL_EARTH, MOB_ELEMENTAL_DARK, MOB_ELEMENTAL_MAX_NUM }; Without serverside these values are not understandable properly. Naturaly those monsters which has elemental resists they have this values as well on the same elemental. Forexample: Lets see the Death reaper(1093). He has UNDEAD and ATT_DARK as RaceFlag, 50% resist fist(just telling ;]), ElemDark=1 and resist dark "-20%" But some monsters are having these values 100+ which is.... no idea why. Zodiac monsters only if I'm not wrong. enum EMobAIFlags { AIFLAG_AGGRESSIVE = (1 << 0), AIFLAG_NOMOVE = (1 << 1), AIFLAG_COWARD = (1 << 2), AIFLAG_NOATTACKSHINSU = (1 << 3), AIFLAG_NOATTACKJINNO = (1 << 4), AIFLAG_NOATTACKCHUNJO = (1 << 5), AIFLAG_ATTACKMOB = (1 << 6), AIFLAG_BERSERK = (1 << 7), AIFLAG_STONESKIN = (1 << 8), AIFLAG_GODSPEED = (1 << 9), AIFLAG_DEATHBLOW = (1 << 10), AIFLAG_REVIVE = (1 << 11), AIFLAG_HEALER = (1 << 12), AIFLAG_COUNT = (1 << 13), AIFLAG_NORECOVERY = (1 << 14), AIFLAG_REFLECT = (1 << 15), AIFLAG_FALL = (1 << 16), AIFLAG_VIT = (1 << 17), AIFLAG_RATTSPEED = (1 << 18), AIFLAG_RCASTSPEED = (1 << 19), AIFLAG_RHP_REGEN = (1 << 20), AIFLAG_TIMEVIT = (1 << 21), }; Here you can see many of new AIFlag values. I am not 100% sure about them, but here is what I think about these new values: AIFLAG_HEALER : This one is the healer, who will heal all members in its group. AIFLAG_COUNT : Who has this flag, you can make just 1 damage on it. AIFLAG_NORECOVERY : This will blocks the monster to recover its health. AIFLAG_REFLECT : <vice> With this flag the monster will be able to transform you into a monster, npc, or statue. AIFLAG_FALL : Ability to force you to fall off your mount. AIFLAG_VIT : <versa> Make your attack damage half, for 10 minutes, until the zodiac floor expires. AIFLAG_RATTSPEED : Reduces the speed of your attack. AIFLAG_RCASTSPEED : Reduces the speed of your skills, it means the cooldown of your skills will be increased. AIFLAG_RHP_REGEN : Reduces the regeneration of your health. AIFLAG_TIMEVIT : <versa> Make your attack damage half, for x seconds. About the vice-versa, those values are imaginable in switched description too. If the reflect is removing your attack damage with the half of it for x seconds then the VIT flags are the transformations. Forexample: the timevit is for tranforming you into monster, or mount for couple of seconds. the vit is for transforming you into a statue until the zodiac floor runs, or until one of your mate hits you. typedef struct SMobSkillLevel { DWORD dwVnum; BYTE bLevel; } TMobSkillLevel; typedef struct SMobTable { DWORD dwVnum; char szName[CHARACTER_NAME_MAX_LEN + 1]; char szLocaleName[CHARACTER_NAME_MAX_LEN + 1]; BYTE bType; BYTE bRank; BYTE bBattleType; BYTE bLevel; BYTE bScale; BYTE bSize; DWORD dwGoldMin; DWORD dwGoldMax; DWORD dwExp; DWORD dwMaxHP; BYTE bRegenCycle; BYTE bRegenPercent; WORD wDef; DWORD dwAIFlag; DWORD dwRaceFlag; DWORD dwImmuneFlag; BYTE bStr, bDex, bCon, bInt; DWORD dwDamageRange[2]; short sAttackSpeed; short sMovingSpeed; BYTE bAggresiveHPPct; WORD wAggressiveSight; WORD wAttackRange; char cEnchants[MOB_ENCHANTS_MAX_NUM]; char cResists[MOB_RESISTS_MAX_NUM]; char cElementalFlags[MOB_ELEMENTAL_MAX_NUM]; char cResistDark, cResistIce, cResistEarth; DWORD dwResurrectionVnum; DWORD dwDropItemVnum; BYTE bMountCapacity; BYTE bOnClickType; BYTE bEmpire; char szFolder[CHARACTER_FOLDER_MAX_LEN + 1]; float fDamMultiply; DWORD dwSummonVnum; DWORD dwDrainSP; DWORD dwMonsterColor; DWORD dwPolymorphItemVnum; TMobSkillLevel Skills[MOB_SKILL_MAX_NUM]; BYTE bBerserkPoint; BYTE bStoneSkinPoint; BYTE bGodSpeedPoint; BYTE bDeathBlowPoint; BYTE bRevivePoint; BYTE bHealPoint; BYTE bRAttSpeedPoint; BYTE bRCastSpeedPoint; BYTE bRHPRegenPoint; FLOAT fHitRange; } TMobTable; bScale: : Scale value between 50 and 200. It will resize the monster. cElementalFlags : So I've told you some info about this, I don't know more. cResistDark : This is a missing elemental resist, they have added it, I just don't really know why even there, not into the resists array, stupid. cResistIce : This is a missing elemental resist, they have added it, I just don't really know why even there, not into the resists array, stupid. cResistEarth : This is a missing elemental resist, they have added it, I just don't really know why even there, not into the resists array, stupid. bHealPoint : Healing percent for the healers. bRAttSpeedPoint : These can be used for what I've named them or the REFLECT or the VIT and TIMEVIT flags too, to give them special value, so it is still a questionmark. bRCastSpeedPoint : These can be used for what I've named them or the REFLECT or the VIT and TIMEVIT flags too, to give them special value, so it is still a questionmark. bRHPRegenPoint : These can be used for what I've named them or the REFLECT or the VIT and TIMEVIT flags too, to give them special value, so it is still a questionmark. fHitRange : Because the client is using its default value to make the checks, this one for sure is on serverside, to check the distance between the character and the monster to validate the attack, skill or the movement of the monsters. But still not 100% I hope it is understandable, my english isn't the best sorry for that. If I missed something let me know in PM.
    1 point
  25. M2 Download Center Download Here ( Internal ) Hello everyone. With this tool you will be able to convert XML proto files into self-defined structure of SQL or TXT files. Files contains definitions for default metin2 structure of mob and item protos (includes txt version of mob proto). Now few words about program structure. There are files named like '*ProtoItem' - this is definition of input and result structure. You can define own names for properties in XML files, result SQL columns and indexes for positions in TXT version of protos. XmlAttribute is used to define input data type and name of property in XML file. SqlMapAttribute is used to define database column name or position in TXT file(by ClientProtoIdx property). MobProto & ItemProto classes inherits from abstract classes for specified destiny(client or database). I implemented basic functionallity to convert XML files into SQL, but you can easly implement your own version - it's really flexible. [Hidden Content]
    1 point
  26. There you go, uiCharacter.py and characterwindow.py for you to compare with yours. characterwindow.py uicharacter.py
    1 point
  27. Hello, i'm here to eat your food, gimme all your scooby snacks and then slowly leave, k?
    0 points
  28. Hey guys, i edited my shop and noticed that the Items are just randomly put in. Does someone know how i can sort the shop of a certain npc (vnum check) depending on Level and item type/subtype? if there are lv30 swords and lvl75 swords it should show the lv30 first OG's @xP3NG3Rx, @VegaS™, @martysama0134 PLS!
    -1 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.