Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 10/31/20 in all areas

  1. M2 Download Center Download Here ( Internal ) Hello guys, Backstory: This is really a problem that is kind of hard to detect because it could have occured only on the wedding map. I said could have because Ymir decided to remove this bridge and to put a normal bridge instead. As far as I checked, this bridge was dropped before 2005. This is a bridge in the style of the wedding map and it has a collision bug. I don't know if it is the reason why they decided not to use it, but anyway. The Bug: It has a collision bug, the collision is not stuck to the model and also, the height is, for some reason, too high, almost twice as big as the actual bridge size. Here is a video of the bug: [Hidden Content] I've used a work around for a map I did in 2017 by putting two bridges and rotating them, but when I was looking at these maps again today I've simply decided to fix it completely using 3DS max. So here is the fixed collision, I also decided to reduce the height of it to make it stick to the actual model. Fixed Version: [Hidden Content] Download: [Hidden Content] Instructions: Simply replace the existing file into "zone\ymir work\zone\b\obj". Enjoy and best regards. Gurgarath
    17 points
  2. good luck with it it costed me an about 35-40 euros to get these back so good luck with it hairdyes [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]] PS: yes i made these for dany but somehow he didn't really wanted to make a server with wolfman.
    3 points
  3. M2 Download Center Download Here ( Internal ) A very fast item split system written by me. A very optimized one. Instead of sending hundered of packets it only sends maybe a dozen max. It is searching algorithm is also better than most split systems. It can do backward searching. [Hidden Content]
    2 points
  4. 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:
    1 point
  5. M2 Download Center Download Here ( Internal ) Download Here ( GitHub ) Hi guys, I leave the system of PENDANT, It's basically like the official system, If you see something is missing, you can tell me.
    1 point
  6. M2 Download Center Download Here ( Internal ) [Hidden Content] [Hidden Content] VT: [Hidden Content]
    1 point
  7. Hey, Today i will show you how you can fix easy the invisibility effect bug and the AFFECT_EUNHYEONG = sealth ninja skill from 17.5 Official update. InstanceBase.cpp (Is hiding the ninja from the minimap) InstanceBaseEffect.cpp Search for: Replace with:
    1 point
  8. M2 Download Center Download Here ( Internal ) [Hidden Content]
    1 point
  9. M2 Download Center Download Here ( Internal ) As the title says, here's how you can synchronize your skill_table from client with skill_proto from server. [1]. First of all we've to rewrite the enum part of tokens (which is used in CPythonSkill::RegisterSkillTable), that means we change the order of index-tab-line with a new order, because ymir didn't used all columns. In that way we keep the file much cleaner and just with necessary columns (9 columns instead of 27). Srcs/Client/UserInterface/PythonSkill.h Search for the next enum: Replace it with: Srcs/Client/UserInterface/Locale_Inc.h [2]. Compile the source client again. [3]. Open Navicat (preferably the latest versions) and do the following things: Open player table Export Wizard -> Mark skill_proto -> Export to ../location/skilltable.txt Export format -> *.txt Unmark All fields then Unselect All Select available fields: -> {'dwVnum', 'bMaxLevel', 'bLevelLimit', 'szPointPoly', 'szSPCostPoly', 'szDurationPoly', 'szDurationSPCostPoly', 'szCooldownPoly', 'dwTargetRange'} Unmark: Include column titles Text Qualifier: None Copy the skilltable.txt from Desktop to ../locale/en/ HOW-TO - VIDEO (The video is just an example, please follow the tutorial from step [3]) [Hidden Content] Thanks to @Syreldar for the idea.
    1 point
  10. Hey M2DEV! Today I will show you how to fix one unpleasant error related to the auto attack. When you attack a monster automatically and for example want to move away from the monster, what do you do? Probably you will turn off the auto attack and try to move away from the monster using the WASD keys? Yes, but it won't work because the target doesn't reset when you try to disable the auto-attack. Before fix: [Hidden Content] After fix: [Hidden Content] Open file: UserInterface\PythonPlayer.h Make "__ClearAutoAttackTargetActorID();" public! Open file: UserInterface\PythonPlayerModulec.cpp We need to create a new method PyObject * playerClearAutoAttackTargetActorID(PyObject* poSelf, PyObject* poArgs) { CPythonPlayer::Instance().__ClearAutoAttackTargetActorID(); return Py_BuildNone(); } add method to s_methods[] { "ClearAutoAttackTargetActorID", playerClearAutoAttackTargetActorID, METH_VARARGS }, Compile bin! Open file: root/uitaskbar.py search elif self.EVENT_MOVE_AND_ATTACK == event: replace this part: elif self.EVENT_MOVE_AND_ATTACK == event: btn = self.mouseModeButtonList[dir].GetChild("button_move_and_attack") func = player.MBF_SMART player.ClearAutoAttackTargetActorID() tooltip_text = localeInfo.TASKBAR_ATTACK pack root file! P.S Please forgive me for my English, I use a GoogleTranslate
    1 point
  11. M2 Download Center Download Here ( Internal ) Hey there, I have an Halloween gift for you all. i have been working for a few hours on official like element image on target window(See screenshots below). When you click on a mob if it is defined as elemental, it will open an element image in addition to the target window. Don't forget to hit the like button! (C) Metin2 guild wars - coded by [GA]Ruin - 27/10/2017 (I create custom metin2 systems in c++/python. if you want a custom system send me a pm and we can talk over skype). Let's begin! Server Side: Open service.h, add in the end: #define ELEMENT_TARGET Open char.cpp, search for else { p.dwVID = 0; p.bHPPercent = 0; } add below: #ifdef ELEMENT_TARGET const int ELEMENT_BASE = 11; DWORD curElementBase = ELEMENT_BASE; DWORD raceFlag; if (m_pkChrTarget && m_pkChrTarget->IsMonster() && (raceFlag = m_pkChrTarget->GetMobTable().dwRaceFlag) >= RACE_FLAG_ATT_ELEC) { for (int i = RACE_FLAG_ATT_ELEC; i <= RACE_FLAG_ATT_DARK; i *= 2) { curElementBase++; int diff = raceFlag - i; if (abs(diff) <= 1024) break; } p.bElement = curElementBase - ELEMENT_BASE; } else { p.bElement = 0; } #endif open packet.h, search for: } TPacketGCTarget; add above: #ifdef ELEMENT_TARGET BYTE bElement; #endif Client side: open locale_inc.h, add in the end: #define ELEMENT_TARGET open packet.h, search for } TPacketGCTarget; add above: #ifdef ELEMENT_TARGET BYTE bElement; #endif open PythonNetworkPhaseGame.cpp, look for: else if (pInstPlayer->CanViewTargetHP(*pInstTarget)) replace below with the following: #ifdef ELEMENT_TARGET PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "SetHPTargetBoard", Py_BuildValue("(iii)", TargetPacket.dwVID, TargetPacket.bHPPercent, TargetPacket.bElement)); #else PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "SetHPTargetBoard", Py_BuildValue("(ii)", TargetPacket.dwVID, TargetPacket.bHPPercent)); #endif open PythonApplicationModule.cpp, look for #ifdef ENABLE_ENERGY_SYSTEM add above: #ifdef ELEMENT_TARGET PyModule_AddIntConstant(poModule, "ENABLE_VIEW_ELEMENT", 1); #else PyModule_AddIntConstant(poModule, "ENABLE_VIEW_ELEMENT", 0); #endif open game.py, look for def SetHPTargetBoard(self, vid, hpPercentage): if vid != self.targetBoard.GetTargetVID(): self.targetBoard.ResetTargetBoard() self.targetBoard.SetEnemyVID(vid) self.targetBoard.SetHP(hpPercentage) self.targetBoard.Show() replace with: if app.ENABLE_VIEW_ELEMENT: def SetHPTargetBoard(self, vid, hpPercentage,bElement): if vid != self.targetBoard.GetTargetVID(): self.targetBoard.ResetTargetBoard() self.targetBoard.SetEnemyVID(vid) self.targetBoard.SetHP(hpPercentage) self.targetBoard.SetElementImage(bElement) self.targetBoard.Show() else: def SetHPTargetBoard(self, vid, hpPercentage): if vid != self.targetBoard.GetTargetVID(): self.targetBoard.ResetTargetBoard() self.targetBoard.SetEnemyVID(vid) self.targetBoard.SetHP(hpPercentage) self.targetBoard.Show() open uitarget.py, look for import background add below: if app.ENABLE_VIEW_ELEMENT: ELEMENT_IMAGE_DIC = {1: "elect", 2: "fire", 3: "ice", 4: "wind", 5: "earth", 6 : "dark"} look for: self.isShowButton = False add below: if app.ENABLE_VIEW_ELEMENT: self.elementImage = None inside Destroy method, look for: self.__Initialize() add below: if app.ENABLE_VIEW_ELEMENT: self.elementImage = None inside ResetTargetBoard method, look for: self.hpGauge.Hide() add below: if app.ENABLE_VIEW_ELEMENT and self.elementImage: self.elementImage = None look for : def SetElementImage(self,elementId): add above: if app.ENABLE_VIEW_ELEMENT: def SetElementImage(self,elementId): try: if elementId > 0 and elementId in ELEMENT_IMAGE_DIC.keys(): self.elementImage = ui.ImageBox() self.elementImage.SetParent(self.name) self.elementImage.SetPosition(-60,-12) self.elementImage.LoadImage("d:/ymir work/ui/game/12zi/element/%s.sub" % (ELEMENT_IMAGE_DIC[elementId])) self.elementImage.Show() except: pass Compile server, client source and root pack and that's it! Enjoy! Happy halloween!
    1 point
  12. NOT FOR SALE ! Dont write to me about this costumes. Just only shows
    1 point
  13. M2 Download Center Download Here ( Internal ) Hello, Like the title says it's a pet system with level effect and experience. If you want to change the max level just change this variable: local MAX_LEVEL = 20 But if you change the max level you have to edit the exp table too.For example I set local MAX_LEVEL = 25 so the exp table should looks like this: local exp_table = {100,200,300,400,500,600,700,800,900,1000,1100,1200,1300,1400,1500,1600,1700,1800,1900,2000,2100,2200,2300,2400,2500} for any bugs/problems feel free to ask...
    1 point
  14. M2 Download Center Download Here ( Internal ) root/uiRefine.py [Hidden Content] root/constInfo.py Another idea: (you don't have to use this, is just a example, can add in tooltip where you can drop items which you need, you can add a listbox+scrollbar and send drops from server and cache it in dictionary.) [Hidden Content]
    1 point
  15. M2 Download Center Download Here ( Internal ) GitHub repository: [Hidden Content]
    1 point
  16. M2 Download Center Download Here ( Internal ) Download Here ( GitHub ) Hi, Download : Here It doesn't contain 50 soul requirement. You can remove or change it. Author: @Mali61 (Back to the past)
    1 point
  17. M2 Download Center Download Here ( Internal ) This system adds new pages for DS inventory. The system is written by me. [Hidden Content]
    1 point
  18. When hovering over a skill, it's recharge duration in tooltip is always the same because it ignores player's casting speed. In PythonSkill.cpp search for : PyObject * skillGetSkillCoolTime(PyObject * poSelf, PyObject * poArgs) Replace with: PyObject * skillGetSkillCoolTime(PyObject * poSelf, PyObject * poArgs) { int iSkillIndex; if (!PyTuple_GetInteger(poArgs, 0, &iSkillIndex)) return Py_BadArgument(); float fSkillPoint; if (!PyTuple_GetFloat(poArgs, 1, &fSkillPoint)) return Py_BadArgument(); CPythonSkill::SSkillData * c_pSkillData; if (!CPythonSkill::Instance().GetSkillData(iSkillIndex, &c_pSkillData)) return Py_BuildException("skill.GetSkillCoolTime - Failed to find skill by %d", iSkillIndex); DWORD dwSkillCoolTime = c_pSkillData->GetSkillCoolTime(fSkillPoint); int iCastingSpeed = CPythonPlayer::Instance().GetStatus(POINT_CASTING_SPEED); int iSpd = 100 - iCastingSpeed; if (iSpd > 0) iSpd = 100 + iSpd; else if (iSpd < 0) iSpd = 10000 / (100 - iSpd); else iSpd = 100; dwSkillCoolTime = dwSkillCoolTime * iSpd / 100; return Py_BuildValue("i", dwSkillCoolTime); }
    1 point
  19. Ooo thank you, more releases of repairs old things
    1 point
  20. Rubinum esport costumes and pets for Worlds 2020
    1 point
  21. M2 Download Center Download Here ( Internal ) Download: [Hidden Content]
    1 point
  22. I would understand if you really posted a "2020 style" after 3 years (released in 2017) ... but you did it worst than actually is, if you think a std::array and std::find it's better than a switch for 6 values which are static, that's really wrong. Also you're redeclaring the std::aray variable each time when the function it's called, that's not 2020 anymore. Basically if you really want something called "2020", this is: static const std::set<std::uint8_t> ignoreSkillSet = {SKILL_HOSIN, SKILL_REFLECT, SKILL_GICHEON, SKILL_JEONGEOP, SKILL_KWAESOK, SKILL_JEUNGRYEOK}; if (ignoreSkillSet.contains(dwType)) { const auto& affect = FindAffect(dwType); if (affect && affect->lApplyValue > lApplyValue) return false; } But still, switch is better than everything what you could do with your "2020 style", in this case. switch (dwType) { case SKILL_HOSIN: case SKILL_REFLECT: case SKILL_GICHEON: case SKILL_JEONGEOP: case SKILL_KWAESOK: case SKILL_JEUNGRYEOK: { [...] } break; } But it's fine, seems you're that type of guy who's using "auto" on everything and think that's cool and 2020 style, typical for metin2 "developers".
    1 point
  23. I have found a reference long time ago. PythonPlayerSkill.cpp > CPythonPlayer::__ProcessEnemySkillTargetRange:
    1 point
  24. I didn't tested your code, but how you implemented this it's bad because you called multiple times ActivateSlot and DeactivateSlot for no reason (before your code already there're other conditions that are called), so you create small visual bugs for a millisecond. So, you could include it in the default code like this: Search for: Replace with: Also you should say that the function ActivateSlot by default doesn't have those features. Meme for the math method:
    1 point
  25. M2 Download Center Download Here ( Internal ) Hey, Today i will share how can you change the Whitemark in Minimap with a new one. I saw that there is a topic in Questions & Answers but seems not complete so. Minimap Whitemark - New Download:
    1 point
  26. 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
    1 point
  27. I updated the original topic with Legends Code directly (I had a backup on my storage). I hope it works! Best regards Raylee
    1 point
  28. M2 Download Center Download Here ( Internal ) Today i release a code which you can walk through safezone without block Client Source: GameLib ActorInstance.h // Search for: BOOL TestPhysicsBlendingCollision(CActorInstance & rVictim); // Add under: // #ifdef ENABLE_SAFEZONE_STOP_COLLISION BOOL IsInSafe(CActorInstance & ptr); // #endif ActorInstanceCollisionDetection.cpp // Search for: BOOL CActorInstance::TestActorCollision(CActorInstance & rVictim) // Add before: // #ifdef ENABLE_SAFEZONE_STOP_COLLISION #include "../UserInterface/PythonBackground.h" BOOL CActorInstance::IsInSafe(CActorInstance & ptr) { const TPixelPosition& c_rkPPosCur = ptr.NEW_GetCurPixelPositionRef(); if (CPythonBackground::Instance().isAttrOn(c_rkPPosCur.x, c_rkPPosCur.y, (1 << 2))) return true; return false; } // #endif // On CActorInstance::TestActorCollision // Search for: if (rVictim.IsDead()) return false; // Add under: // #ifdef ENABLE_SAFEZONE_STOP_COLLISION if (IsInSafe(rVictim)) return false; // #endif Enjoy.
    1 point
  29. Find in ClientManager.cpp(x2): pkPeer->EncodeHeader(HEADER_DG_SAFEBOX_WRONG_PASSWORD, dwHandle, 0); Add(x2): delete pSafebox; safebox.cpp Find: if (pkOldGrid) m_pkGrid = M2_NEW CGrid(pkOldGrid, 5, m_iSize); else m_pkGrid = M2_NEW CGrid(5, m_iSize); Change: if (pkOldGrid) { m_pkGrid = M2_NEW CGrid(pkOldGrid, 5, m_iSize); delete pkOldGrid; } else m_pkGrid = M2_NEW CGrid(5, m_iSize);
    1 point
  30. There are a lot of people which had problem with localeInfo because korean-characters and bad encoding, there's a clean file with refactored code. Removed all the code which isn't used like korean characters < bad encoding [runmain error / crash](editors problem) and more checks. Removed over 500 lines unused. Removed function mapping(**kwargs) and use constructor of dict > dict(**kwarg) which is same (**kwarg let you take arbitrary number of keyword arguments). Removed function CutMoneyString because is used just when locale is HongKong, CIBN. Removed check IsYMIR from function LoadLocaleData which load locale as locale/ymir or locale/we_korea. Removed GUILD_MARK_NOT_ENOUGH_LEVEL, GUILD_HEADQUARTER, GUILD_FACILITY, GUILD_OBJECT, MAP_TRENT02, MAP_WL, MAP_NUSLUCK, MAP_TREE2, LOGIN_FAILURE_WEB_BLOCK, LOGIN_FAILURE_BLOCK_LOGIN, CHANNEL_NOTIFY_FULL, now they're readed directly from locale_game.txt. Removed declared global variables. Removed checks for declaring LOCALE_FILE_NAME, FN_GM_MARK and use current path. Removed korean functions/lists/dictionaries/characters GetAuxiliaryWordType, JOBINFO_DATA_LIST, dictSingleWord, dictDoubleWord, etc. Removed unused things: locale mapping, 'all' list etc. Removed IN_GAME_SHOP_ENABLE declaration, should be declared inside of constInfo directly. Removed checks (locale path) - 949, 932 == app.GetDefaultCodePage(), IsHONGKONG, IsNEWCIBN() or IsCIBN10() from declaration of functions like (NumberToMoneyString, NumberToSecondaryCoinString, ...),now they're declared directly from old style (IsEUROPE() and not IsWE_KOREA() and not IsYMIR()). Added custom string format(format_string, *args, **kwargs) instead of %. (old-style). Added new checks inside of LoadLocaleFile for security: Check if token3 (token1=original_string, token2=return-string, token3=function) function name exist in our types (SA, SNA, SAA, SAN) then try to call it. Check if string line have no tabs. Diff-checker: (856 Removals + 301 Additions) [Hidden Content] [Hidden Content]
    1 point
  31. The idea is good, but the code is bugged and unreadable, here're the bugs: text = '1kks' ValueError: invalid literal for int() with base 10: '1000000s' text = '1kk500' 1000000500 text = '1abcd' '1abcd' If I'm the one who do this, i would do it more extendable and using a proficient way. [Hidden Content] At least, keep the copyright.
    1 point
  32. The idea isn't so bad, but the code has too many useless lines, here's what you can do to improve it. def RefreshPickupFilter(self): #Weapon if systemSetting.IsPickUpFilterWeapon(): self.PickUpFilterList[0].Down() else: self.PickUpFilterList[0].SetUp() #Armor if systemSetting.IsPickUpFilterArmor(): self.PickUpFilterList[1].Down() else: self.PickUpFilterList[1].SetUp() #Ear if systemSetting.IsPickUpFilterEar(): self.PickUpFilterList[2].Down() else: self.PickUpFilterList[2].SetUp() #Neck if systemSetting.IsPickUpFilterNeck(): self.PickUpFilterList[3].Down() else: self.PickUpFilterList[3].SetUp() #Foots if systemSetting.IsPickUpFilterFoots(): self.PickUpFilterList[4].Down() else: self.PickUpFilterList[4].SetUp() #Shield if systemSetting.IsPickUpFilterShield(): self.PickUpFilterList[5].Down() else: self.PickUpFilterList[5].SetUp() #Book if systemSetting.IsPickUpFilterBook(): self.PickUpFilterList[6].Down() else: self.PickUpFilterList[6].SetUp() #Stone if systemSetting.IsPickUpFilterStone(): self.PickUpFilterList[7].Down() else: self.PickUpFilterList[7].SetUp() #Etc if systemSetting.IsPickUpFilterEtc(): self.PickUpFilterList[8].Down() else: self.PickUpFilterList[8].SetUp() To: def RefreshPickupFilter(self): checkFilterList = ( systemSetting.IsPickUpFilterWeapon(), systemSetting.IsPickUpFilterArmor(), systemSetting.IsPickUpFilterEar(), systemSetting.IsPickUpFilterNeck(), systemSetting.IsPickUpFilterFoots(), systemSetting.IsPickUpFilterShield(), systemSetting.IsPickUpFilterBook(), systemSetting.IsPickUpFilterStone(), systemSetting.IsPickUpFilterEtc() ) for child, flag in zip(self.PickUpFilterList, checkFilterList): if flag: child.Down() else: child.SetUp() self.PickUpFilterList.append(GetObject("Pick_Up_FilterWeapon")) self.PickUpFilterList.append(GetObject("Pick_Up_FilterArmor")) self.PickUpFilterList.append(GetObject("Pick_Up_FilterEar")) self.PickUpFilterList.append(GetObject("Pick_Up_FilterNeck")) self.PickUpFilterList.append(GetObject("Pick_Up_FilterFoots")) self.PickUpFilterList.append(GetObject("Pick_Up_FilterShield")) self.PickUpFilterList.append(GetObject("Pick_Up_FilterBook")) self.PickUpFilterList.append(GetObject("Pick_Up_FilterStone")) self.PickUpFilterList.append(GetObject("Pick_Up_FilterEtc")) To: for name in ('Weapon','Armor','Ear','Neck','Foots','Shield','Book','Stone','Etc'): self.PickUpFilterList.append(GetObject("Pick_Up_Filter{}".format(name))) self.PickUpFilterList[0].SetToggleUpEvent(self.__OnClickPickupFilterButtonWeapon) # Weapon self.PickUpFilterList[0].SetToggleDownEvent(self.__OnClickPickupFilterButtonWeapon) # Weapon self.PickUpFilterList[1].SetToggleUpEvent(self.__OnClickPickupFilterButtonArmor) # Armor self.PickUpFilterList[1].SetToggleDownEvent(self.__OnClickPickupFilterButtonArmor) # Armor self.PickUpFilterList[2].SetToggleUpEvent(self.__OnClickPickupFilterButtonEar) # Ear self.PickUpFilterList[2].SetToggleDownEvent(self.__OnClickPickupFilterButtonEar) # Ear self.PickUpFilterList[3].SetToggleUpEvent(self.__OnClickPickupFilterButtonNeck) # Neck self.PickUpFilterList[3].SetToggleDownEvent(self.__OnClickPickupFilterButtonNeck) # Neck self.PickUpFilterList[4].SetToggleUpEvent(self.__OnClickPickupFilterButtonFoots) # Foots self.PickUpFilterList[4].SetToggleDownEvent(self.__OnClickPickupFilterButtonFoots) # Foots self.PickUpFilterList[5].SetToggleUpEvent(self.__OnClickPickupFilterButtonShield) # Shield self.PickUpFilterList[5].SetToggleDownEvent(self.__OnClickPickupFilterButtonShield) # Shield self.PickUpFilterList[6].SetToggleUpEvent(self.__OnClickPickupFilterButtonBook) # Books self.PickUpFilterList[6].SetToggleDownEvent(self.__OnClickPickupFilterButtonBook) # Books self.PickUpFilterList[7].SetToggleUpEvent(self.__OnClickPickupFilterButtonStone) # Stone self.PickUpFilterList[7].SetToggleDownEvent(self.__OnClickPickupFilterButtonStone) # Stone self.PickUpFilterList[8].SetToggleUpEvent(self.__OnClickPickupFilterButtonEtc) # Etc self.PickUpFilterList[8].SetToggleDownEvent(self.__OnClickPickupFilterButtonEtc) # Etc To: eventFuncList = ( self.__OnClickPickupFilterButtonWeapon, self.__OnClickPickupFilterButtonArmor, self.__OnClickPickupFilterButtonEar, self.__OnClickPickupFilterButtonNeck, self.__OnClickPickupFilterButtonFoots, self.__OnClickPickupFilterButtonShield, self.__OnClickPickupFilterButtonBook, self.__OnClickPickupFilterButtonStone, self.__OnClickPickupFilterButtonEtc ) for child, event in zip(self.PickUpFilterList, eventFuncList): child.SetToggleUpEvent(event) child.SetToggleDownEvent(event)
    1 point
  33. Since already is a check for distance, is impossible that the entity to be in another map, so is enough to check if you're in the map. [Hidden Content]
    1 point
  34. 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.
    1 point
  35. [Hidden Content] As I said before, this is just an example, don't paste it into your source, it won't work with this base!
    1 point
  36. Really nice work now the armor then is perfectly
    1 point
  37. M2 Download Center Download Here ( Internal ) This is a revised version of an old thread. Following this How-To, you will have a better customizable solution for the aspect of your quests. You will be able to choice amongst: quest icon, text color, blink effect (like whisper buttons) How To You just need to replace 2 little things: I) In interfaceModule.py, replace BINARY_RecvQuest with: [Hidden Content] II) In questlib.lua, replace send_letter_ex with: [Hidden Content] Explanation: -the 2° argument of send_letter_ex will support multiple parameters: -green|blue|purple|golden|fucsia|aqua and so on (you can add them in BINARY_RecvQuest by adding new colors 0xFF+#HEX; Color Picker Online) -blink (the quest will flash like the whisper messages) -ex (a dummy tag to separate it from "info" and "item") -the 3° argument is the name of the icon to choose, which the current availables are: -scroll_open.tga -scroll_open_green.tga -scroll_open_blue.tga -scroll_open_purple.tga -scroll_open_golden.tga Examples: send_letter_ex(localeInfo.LanguageOptionTitle, "green,blink,ex", "scroll_open_green.tga") send_letter_ex(localeInfo.LanguageOptionTitle, "blue,blink,ex", "scroll_open_blue.tga") send_letter_ex(localeInfo.LanguageOptionTitle, "purple,blink,ex", "scroll_open_purple.tga") send_letter_ex(localeInfo.LanguageOptionTitle, "golden,blink,ex", "scroll_open_golden.tga") send_letter_ex(localeInfo.LanguageOptionTitle, "golden,blink,ex", "scroll_open.tga") Note: As you can imagine, the only limitation is that the color in N won't appear. (it will require additional code and work, so just forget it) Download: Check the attachment (colored-quest-scrolls-v2-res.7z) and add metin2_patch_new_questicon in your client.
    1 point
  38. I prepared other buttons for this system, which I think are holding a better climate. I put it here, maybe it will be useful to someone PS: I also put a project save in the package, so that you can more conveniently edit each button if necessary. Download: Mega (Metin2 Download)
    1 point
  39. M2 Download Center Download Here ( Internal ) Hello There. I publish here this system i hope that this help you a bit with this you can hide your costume if you dont like it (if I forgot something just say it ) (this system is not complete yet you can hide only your costume no hairstyle,sash,weapon) (This system is not mine! i just found the source function and made the python codes and quest)
    1 point
  40. M2 Download Center Download Here ( Internal ) Hi devs, I maked new user check system(like IP) with Hardware Needed Files; Server Part: Common -> tables.h, lenght.h Game -> input_auth.cpp, packet.h Client Part: Pack -> intrologin.py, networkmodule.py, constinfo.py Client -> AccountConnector.cpp, AccountConnector.h, Packet.h, PythonNetworkStream.cpp, PythonNetworkStream.h, PythonNetworkStreamModule.cpp, PythonNetworkStreamPhaseLogin.cpp A BACKUP BEFORE YOU START KNOWN BUGS; All Auth Events logging(not only succesfuly) Let's start 1) First Server Part: 1-1) Common 1-1-1) Tables.h Search typedef struct SAccountTable And replace with this typedef struct SAccountTable { DWORD id; char login[LOGIN_MAX_LEN + 1]; char Hwid[HWID_MAX_LEN + 1]; char Snn[SNN_MAX_LEN + 1]; char passwd[PASSWD_MAX_LEN + 1]; char social_id[SOCIAL_ID_MAX_LEN + 1]; char status[ACCOUNT_STATUS_MAX_LEN + 1]; BYTE bEmpire; TSimplePlayer players[PLAYER_PER_ACCOUNT]; } TAccountTable; Search typedef struct SLoginPacket And replace with this typedef struct SLoginPacket { char login[LOGIN_MAX_LEN + 1]; char passwd[PASSWD_MAX_LEN + 1]; char Hwid[HWID_MAX_LEN + 1]; char Snn[SNN_MAX_LEN + 1]; } TLoginPacket; Search typedef struct SPacketGDAuthLogin And replace with this typedef struct SPacketGDAuthLogin { DWORD dwID; DWORD dwLoginKey; char szLogin[LOGIN_MAX_LEN + 1]; char szHwid[HWID_MAX_LEN + 1]; char szSnn[SNN_MAX_LEN + 1]; char szSocialID[SOCIAL_ID_MAX_LEN + 1]; DWORD adwClientKey[4]; BYTE bBillType; DWORD dwBillID; int iPremiumTimes[PREMIUM_MAX_NUM]; } TPacketGDAuthLogin; 1-1-2) Lenght.h Search PASSWD_MAX_LEN = 16, Add it below HWID_MAX_LEN = 50, SNN_MAX_LEN = 50, 1-2) Game 1-2-1) input_auth.cpp Search this function void CInputAuth::Login(LPDESC d, const char * c_pData) Find this char passwd[PASSWD_MAX_LEN + 1]; strlcpy(passwd, pinfo->passwd, sizeof(passwd)); and add it below char Hwid[HWID_MAX_LEN + 1]; strlcpy(Hwid, pinfo->Hwid, sizeof(Hwid)); char Snn[SNN_MAX_LEN + 1]; strlcpy(Snn, pinfo->Snn, sizeof(Snn)); std::auto_ptr<SQLMsg> msg(DBManager::instance().DirectQuery("UPDATE account.account SET hwid = '%s', Snn = '%s' WHERE login = '%s'", pinfo->Hwid, pinfo->Snn, login)); 1-2-2) packet.h Search typedef struct command_login2 and replace with this typedef struct command_login2 { BYTE header; char login[LOGIN_MAX_LEN + 1]; DWORD dwLoginKey; DWORD adwClientKey[4]; char Hwid[HWID_MAX_LEN + 1]; char Snn[SNN_MAX_LEN + 1]; } TPacketCGLogin2; Search typedef struct command_login3 and replace with this typedef struct command_login3 { BYTE header; char login[LOGIN_MAX_LEN + 1]; char passwd[PASSWD_MAX_LEN + 1]; char Hwid[HWID_MAX_LEN + 1]; char Snn[SNN_MAX_LEN + 1]; DWORD adwClientKey[4]; } TPacketCGLogin3; 2) Second Client Part 2-1)Pack 2-1-1)Constinfo.py Add anywhere import os try: Hwid = os.popen("wmic csproduct get uuid").read().split("n")[1] except: Hwid = os.popen("%WINDIR%/system32/wbem/wmic csproduct get uuid").read().split("n")[1] try: Snn = os.popen('wmic path win32_physicalmedia get SerialNumber').read().split("n")[1] except: Snn = os.popen("%WINDIR%/system32/wbem/wmic path win32_physicalmedia get SerialNumber").read().split("n")[1] 2-1-2)Networkmodule.py add this import import constInfo and add it below Hwid=constInfo.Hwid Snn=constInfo.Snn Search self.pwd="" and add it below self.Hwid=constInfo.Hwid self.Snn=constInfo.Snn Search def SetLoginInfo(self, id, pwd) self.id = id self.pwd = pwd net.SetLoginInfo(id, pwd) and replace with this def SetLoginInfo(self, id, pwd, Hwid, Snn): self.id = id self.pwd = pwd self.Hwid = constInfo.Hwid self.Snn = constInfo.Snn net.SetLoginInfo(id, pwd, Hwid, Snn) 2-2-3)introLogin.py Search RUNUP_MATRIX_AUTH = FALSE Add top Hwid = constInfo.Hwid Snn = constInfo.Snn Search this function def Connect(self, id): and replace with this def Connect(self, id, pwd, Hwid, Snn): global Hwid, Snn if constInfo.SEQUENCE_PACKET_ENABLE: net.SetPacketSequenceMode() if IsLoginDelay(): loginDelay = GetLoginDelay() self.connectingDialog = ConnectingDialog() self.connectingDialog.Open(loginDelay) self.connectingDialog.SAFE_SetTimeOverEvent(self.OnEndCountDown) self.connectingDialog.SAFE_SetExitEvent(self.OnPressExitKey) self.isNowCountDown = TRUE else: self.stream.popupWindow.Close() self.stream.popupWindow.Open(localeInfo.LOGIN_CONNETING, self.SetPasswordEditLineFocus, localeInfo.UI_CANCEL) self.stream.SetLoginInfo(id, pwd, Hwid, Snn) self.stream.Connect() Search def __LoadLoginInfo(self, loginInfoFileName): Add it below global Hwid, Snn Search self.pwd = None Add it below self.Hwid = Hwid self.Snn = Snn Search self.Connect(id, pwd) Replace with this self.Connect(id, pwd, Hwid, Snn) Search self.Connect(id, pwd) Replace With This self.Connect(id, pwd, Hwid, Snn) Search def __OnClickLoginButton(self): Add it below global Hwid, Snn 2-2)Client 2-2-1)Packet.h Search PASS_MAX_NUM = 16, and add it below HWID_MAX_NUM = 50, SNN_MAX_NUM = 50, Search typedef struct command_login And replace with this typedef struct command_login { BYTE header; char name[ID_MAX_NUM + 1]; char pwd[PASS_MAX_NUM + 1]; char Hwid[HWID_MAX_NUM + 1]; char Snn[SNN_MAX_NUM + 1]; } TPacketCGLogin; Search typedef struct command_login3 And replace with this typedef struct command_login3 { BYTE header; char name[ID_MAX_NUM + 1]; char pwd[PASS_MAX_NUM + 1]; char Hwid[HWID_MAX_NUM + 1]; char Snn[SNN_MAX_NUM + 1]; DWORD adwClientKey[4]; } TPacketCGLogin3; Search typedef struct command_direct_enter And replace with this typedef struct command_direct_enter { BYTE bHeader; char login[ID_MAX_NUM + 1]; char passwd[PASS_MAX_NUM + 1]; char Hwid[HWID_MAX_NUM + 1]; char Snn[SNN_MAX_NUM + 1]; BYTE index; } TPacketCGDirectEnter; 2-2-2)AccountConnector.h Search void SetLoginInfo(const char * c_szName, const char * c_szPwd Replace with this void SetLoginInfo(const char * c_szName, const char * c_szPwd, const char * c_szHwid, const char * c_szSnn); Search std::string m_strPassword; Add it below std::string m_strHwid; std::string m_strSnn; 2-2-3)AccountConnector.cpp Search this function void CAccountConnector::SetLoginInfo(const char * c_szName, const char * c_szPwd) Replace with this void CAccountConnector::SetLoginInfo(const char * c_szName, const char * c_szPwd, const char * c_szHwid, const char * c_szSnn) { m_strID = c_szName; m_strPassword = c_szPwd; m_strHwid = c_szHwid; m_strSnn = c_szSnn; } Search strncpy(LoginPacket.pwd, m_strPassword.c_str(), PASS_MAX_NUM); add it below strncpy(LoginPacket.Hwid, m_strHwid.c_str(), HWID_MAX_NUM); strncpy(LoginPacket.Snn, m_strSnn.c_str(), SNN_MAX_NUM); Search LoginPacket.pwd[PASS_MAX_NUM] = '0'; Add it below LoginPacket.Hwid[HWID_MAX_NUM] = '0'; LoginPacket.Snn[SNN_MAX_NUM] = '0'; Search SetLoginInfo("", ""); Replace with this SetLoginInfo("", "", "", ""); 2-2-4)PythonNetworkStreamPhaseLogin.cpp Search(2x) if (0 != m_dwLoginKey) and replace with this if (0 != m_dwLoginKey) SendLoginPacketNew(m_stID.c_str(), m_stPassword.c_str(), m_stHwid.c_str(), m_stSnn.c_str()); else SendLoginPacket(m_stID.c_str(), m_stPassword.c_str(), m_stHwid.c_str(), m_stSnn.c_str()); Search this function bool CPythonNetworkStream::SendDirectEnterPacket(const char* c_szID, const char* c_szPassword) replace with this bool CPythonNetworkStream::SendDirectEnterPacket(const char* c_szID, const char* c_szPassword, const char* c_szHwid, const char* c_szSnn, UINT uChrSlot) { TPacketCGDirectEnter kPacketDirectEnter; kPacketDirectEnter.bHeader=HEADER_CG_DIRECT_ENTER; kPacketDirectEnter.index=uChrSlot; strncpy(kPacketDirectEnter.login, c_szID, ID_MAX_NUM); strncpy(kPacketDirectEnter.passwd, c_szPassword, PASS_MAX_NUM); strncpy(kPacketDirectEnter.Hwid, c_szHwid, HWID_MAX_NUM); strncpy(kPacketDirectEnter.Snn, c_szSnn, SNN_MAX_NUM); if (!Send(sizeof(kPacketDirectEnter), &kPacketDirectEnter)) { Tracen("SendDirectEnter"); return false; } return SendSequence(); } Search this function bool CPythonNetworkStream::SendLoginPacket(const char* c_szName, const char* c_szPassword) and replace with this bool CPythonNetworkStream::SendLoginPacket(const char* c_szName, const char* c_szPassword, const char* c_szHwid, const char* c_szSnn) { TPacketCGLogin LoginPacket; LoginPacket.header = HEADER_CG_LOGIN; strncpy(LoginPacket.name, c_szName, sizeof(LoginPacket.name)-1); strncpy(LoginPacket.pwd, c_szPassword, sizeof(LoginPacket.pwd)-1); strncpy(LoginPacket.Hwid, c_szHwid, sizeof(LoginPacket.Hwid)-1); strncpy(LoginPacket.Snn, c_szSnn, sizeof(LoginPacket.Snn)-1); LoginPacket.name[ID_MAX_NUM]='0'; LoginPacket.pwd[PASS_MAX_NUM]='0'; LoginPacket.Hwid[HWID_MAX_NUM]='0'; LoginPacket.Snn[SNN_MAX_NUM]='0'; if (!Send(sizeof(LoginPacket), &LoginPacket)) { Tracen("SendLogin Error"); return false; } return SendSequence(); } Search bool CPythonNetworkStream::SendLoginPacketNew(const char * c_szName, const char * c_szPassword) and replace with this bool CPythonNetworkStream::SendLoginPacketNew(const char * c_szName, const char * c_szPassword, const char * c_szHwid, const char * c_szSnn) 2-2-4)PythonNetworkStreamModule.cpp Search this function PyObject* netSetLoginInfo(PyObject* poSelf, PyObject* poArgs) and replace with this PyObject* netSetLoginInfo(PyObject* poSelf, PyObject* poArgs) { char* szName; if (!PyTuple_GetString(poArgs, 0, &szName)) return Py_BuildException(); char* szPwd; if (!PyTuple_GetString(poArgs, 1, &szPwd)) return Py_BuildException(); char* szHwid; if (!PyTuple_GetString(poArgs, 2, &szHwid)) return Py_BuildException(); char* szSnn; if (!PyTuple_GetString(poArgs, 3, &szSnn)) return Py_BuildException(); CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); CAccountConnector & rkAccountConnector = CAccountConnector::Instance(); rkNetStream.SetLoginInfo(szName, szPwd, szHwid, szSnn); rkAccountConnector.SetLoginInfo(szName, szPwd, szHwid, szSnn); return Py_BuildNone(); } Search this function PyObject* netSendLoginPacket(PyObject* poSelf, PyObject* poArgs) and replace with this PyObject* netSendLoginPacket(PyObject* poSelf, PyObject* poArgs) { char* szName; if (!PyTuple_GetString(poArgs, 0, &szName)) return Py_BuildException(); char* szPwd; if (!PyTuple_GetString(poArgs, 1, &szPwd)) return Py_BuildException(); char* szHwid; if (!PyTuple_GetString(poArgs, 2, &szHwid)) return Py_BuildException(); char* szSnn; if (!PyTuple_GetString(poArgs, 3, &szSnn)) return Py_BuildException(); CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance(); rkNetStream.SendLoginPacket(szName, szPwd, szHwid, szSnn); return Py_BuildNone(); } 2-2-5)PythonNetworkStream.h Search void SetLoginInfo(const char* c_szID, const char* c_szPassword); Replace with this void SetLoginInfo(const char* c_szID, const char* c_szPassword, const char* c_szHwid, const char* c_szSnn); Search bool SendLoginPacket(const char * c_szName, const char * c_szPassword); bool SendLoginPacketNew(const char * c_szName, const char * c_szPassword); Replace with this bool SendLoginPacket(const char * c_szName, const char * c_szPassword, const char * c_szHwid, const char * c_szSnn); bool SendLoginPacketNew(const char * c_szName, const char * c_szPassword, const char * c_szHwid, const char * c_szSnn); Search bool SendDirectEnterPacket(const char * c_szName, const char * c_szPassword, UINT uChrSlot); And replace with this bool SendDirectEnterPacket(const char * c_szName, const char * c_szPassword, const char * c_szHwid, const char * c_szSnn, UINT uChrSlot); Search std::string m_stPassword; Add it below std::string m_stHwid; std::string m_stSnn; 2-2-6)PythonNetworkStream.cpp Search this function void CPythonNetworkStream::SetLoginInfo(const char* c_szID, const char* c_szPassword) And replace with this void CPythonNetworkStream::SetLoginInfo(const char* c_szID, const char* c_szPassword, const char* c_szHwid, const char* c_szSnn) { m_stID=c_szID; m_stPassword=c_szPassword; m_stHwid=c_szHwid; m_stSnn=c_szSnn; } Now run this query commands; ALTER TABLE account.account ADD Hwid VARCHAR(50); ALTER TABLE account.account ADD Snn VARCHAR(50); Create tables DROP TABLE IF EXISTS `snnban`; CREATE TABLE `snnban` ( `Snn` varchar(255) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; DROP TABLE IF EXISTS `hwidban`; CREATE TABLE `hwidban` ( `Hwid` varchar(255) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; Basic php ban script <?php error_reporting(0); if($_GET) { $baglanti = mysqli_connect('localhost', 'root', 'PASSWORD', 'account'); $hwid = mysqli_real_escape_string($baglanti, $_GET['hwid']); $snn = mysqli_real_escape_string($baglanti, $_GET['snn']); if(strlen($snn) == 0) { $hwid_bul = mysqli_query($baglanti, "SELECT null FROM hwidban WHERE hwid='$hwid'"); if(mysqli_num_rows($hwid_bul) > 0) echo 'BLOCK'; mysqli_free_result($hwid_bul); }else{ $snn_bul = mysqli_query($baglanti, "SELECT null FROM snnban WHERE snn='$snn'"); if(mysqli_num_rows($snn_bul) > 0) echo 'BLOCK'; mysqli_free_result($snn_bul); } mysqli_close($baglanti); } ?> Bonus; if you want alternative ways (mac, cpu etc.) check tutorials below #CPU INFO: import platform platform.processor() #MAC INFO: mac = '' for line in os.popen('getmac /nh /fo CSV').readlines(): m = line.split(',')[0] dev = line.split(',')[1] if dev.find('Device') and mac == '': mac = m mac = mac.replace('"', '') #HWID INFO: *DEFAULT hwid = os.popen('wmic csproduct get uuid').read().split("n")[1] #HDD INFO: hddinfo = win32api.GetVolumeInformation("C:") #COMPUTER NAME: pcadi = os.environ['COMPUTERNAME'] #CPU NAME: cpu = os.popen('wmic cpu get name').read().split("n")[1] #MOTHERBOARD INFO: anakart = os.popen('wmic baseboard get serialnumber').read().split("n")[1] #RAM SERIAL: ram = os.popen('wmic memorychip get serialnumber').read().split("n")[2] #BIOS VERSION: biosv = os.popen('wmic bios get smbiosbiosversion').read().split("n")[1] #COMPUTER MODEL: model = os.popen('wmic csproduct get name').read().split("n")[1] #SYSTEM TYPE: systype = os.popen('wmic computersystem get systemtype').read().split("n")[1] #COMPUTER OWNER: owner = os.popen('wmic computersystem get manufacturer').read().split("n")[1] #OS NAME: osname = os.popen('wmic os get Caption,CSDVersion /value').read().split("n")[2].split("Caption=")[-1] #WINDOWS USERNAME: winusnm = os.popen('echo %username%').read().split("n")[0] #VOLUME NAME: volname = os.popen('wmic logicaldisk get volumename').read().split("n")[1] #SMART SNN: *DEFAULT smartsnn = os.popen('wmic path win32_physicalmedia get SerialNumber').read().split("n")[1] #USER SID: usersid = os.popen('wmic useraccount get name,sid').read().split("n")[2].replace(" ", " - ") #TOTAL MEMORY: ramboyut = os.popen('wmic computersystem get TotalPhysicalMemory').read().split("n")[1] Example files: [Hidden Content] Virustotal: [Hidden Content] Result: Sorry my bad english Regards
    1 point
  41. Thank you, this will stop some idiots.
    1 point
  42. not working for me, i have error "return is not defined"
    0 points
  43. That looks nice? 1. 2.
    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.