Jump to content
metin2dev

martysama0134

Developer
  • Content count

    344
  • Joined

  • Last visited

  • Days Won

    59

Everything posted by martysama0134

  1. martysama0134

    <Project> Metin-Refresh [Github]

    I don't think using "The Unlicensed" license is the best idea (since you chose one). Try either "Apache License 2.0" or "GNU GPL 3.0" at the very least. (even though it doesn't have a real legal value) If I were you, I would have released only the following systems on github instead of the whole stuff: (just like vegas has done for some systems) Weather System, you can change his setting in MySQL side, the command for reload it is: /reload m Swimming system (Beta). Sura Man is the only character to have animation in client side for now. Fly System (Beta). Sura Man is the only character to have animation in client side for now. Jump System (Beta). Sura Man is the only character to have animation in client side for now. Afk System (Beta), use the system of title for use it manually, the AFK title is also showed automaticaly after 10 minutes of inactivity of the player. An example of animation is also used. Sura Man is the only character to have animation in client side for now. Mob Scale System (Beta), you can update scale of mobs without to edit the client, you can update it by MySQL. Meddling with the whole source code can easily introduce new bugs without even you knowing, just like in one of your last commits: https://github.com/MetinRefresh/Metin-Refresh-Server-Src/commit/6dd4f901128352b41bde9b960b2592050a0a4cc3 (edit: some errors mentioned in here) Also, public repositories containing the whole Metin2 source get DMCA'd often on github. (I know there are still some of them on github, but they are not "famous" = ignored)
  2. martysama0134

    solved Weird Commands

    Check my docs for those commands: https://martysama0134.github.io/m2-docs/cmd.html
  3. martysama0134

    WorldEditor ReMIX

    File Name: WorldEditor ReMIX File Submitter: martysama0134 File Submitted: 27 Aug 2014 File Category: Tools Intro: 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 WorldEditor.txt) // I recently built a new worldeditor version with new features, so: Be a guinea pig of mine and test it all! // Info: (v24) // -) 100% translated // -) granny2.9 // -) 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 // -) few 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 // if pack/property exists, it'll be read! (note: if found, the local property/ directory will not be considered!) // 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 the boring CTRL requirement (to move the camera) when editing daylight/attr // fixed refresh texture imagebox when onKey-pressing the down/up keys (like when onClicking them) // fixed TextureSet file creation if not existing // fixed new wolfman motion event handling // -) 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 // 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! // 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" // ### WE CONFIG FILE 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 // ## SHORT-CUTs // # 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 NB: A space is required for such things: //*space*stuff KEY*space*=*space*VALUE Download: http://www.mediafire.com/download/c4yhd41ruy97c88/we_remix_v23__20140801-1859.rar http://www.mediafire.com/download/jxmemazw50vmnmj/we_remix_v24__20150621-0154.rar​ 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 .SrcsClientEterLibSkyBox.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: Click here to download this file
  4. martysama0134

    [How-To] Metin2 & Cython

    Intro This release will explain how to "convert" your root .py files to .c ones. Actually, Cython only converts those files to pure CPython code. Download NOTE: ALL THE FILES HAVE BEEN MOVED TO HOW-TO-CYTHON-MT2. EDIT: As requested by many people, you can download the compatible and clean official cn root dated 20131228-0034 without further edits: rootCn_20131228-0034_edit.raruiscriptCn_20131228-0034.rarcN-serverinfo-edit.pyIs Cython really worth it?ProsAll the modules are compiled, and they can't be "extracted as .py" anymore.We can always disassemble the launcher with IDA, but the result will be pseudo-c code after waiting 6-8h of analyzing. Since we're not using .pyx files but directly .py ones, there's no "so much optimization".At least, 10% of performance increasing is guaranteed. ConsFor testing purposes, it's heavy to maintain. Everytime you try to re-compile your root files, you should wait 5-10 minutes.You can always use the uncythonized root (.py files) when you perform tests, and compile cython whenever you will make an update in your live server. The launcher's size will increase ~10mb. You can actually pack it to save space.If you directly use a .pyd (still 10mb), the launcher's size won't increase. VideoTutorial Credits Me (lollo_9_1/martysama0134)Night (OST suggestion)Random TestersWhat's New:v2.0The module's name check is now case-insensitive (colorInfo == colorinfo)Added a new function rootlib/uiscriptlib.getList() to retrieve a tuple of all the available cythonized modules.Now you can compile a uiscriptlib library from the uiscript*.py files! (implemented as __USE_EXTRA_CYTHON__)Added a sample ui.py containing the code to run uiscriptlib.
  5. martysama0134

    WorldEditor ReMIX

    https://github.com/martysama0134/how-to-mt2-general/tree/master/worldeditor-dpi-fix Try to decrease the dpi to 100% from the computer panel, and if not resolved, use the manifest as well. Note: I use win10 and it works all fine
  6. martysama0134

    open databases crashes, server dont start

    Ignore him. He's just iratm shitposting again. 1) A peer can be null, and it's used when we send something without caring for an answer from db. 2) BlockCountry return type isn't handled, so even if it fails, it doesn't exit. Avenuetm didn't reply to Dr3am3r when he asked whether or not a db.core has been generated (in the thread title, it says "db crash", so we expect he got one), but he ended up giving some random likes and nothing more If he doesn't reply, mods should close this thread then. EDIT: how to read a core dump: https://github.com/martysama0134/how-to-general/blob/master/freebsd-tips/how-to-analyze-a-core-dump.md Enjoy.
  7. martysama0134

    open InnoDB or MyISAM the better?

    InnoDB is slightly faster in writing, but it gets totally corrupted very often in case of system crash or reboot (with metin2 server still running) (shutdown -r now is safe). Making Sql backups of InnoDB is mandatory if you don't want to die fast. (cold backups, if not complete, are junk with innodb) MyISAM is slightly faster in reading. MariaDB has also Aria as engine, Mysql8 improves MyISAM and InnoDB by a lot (like InnoDB with improved ACID). https://dev.mysql.com/doc/refman/8.0/en/innodb-benefits.html https://dev.mysql.com/doc/refman/8.0/en/myisam-storage-engine.html
  8. 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: http://pastebin.com/TAk9bx92 II) In questlib.lua, replace send_letter_ex with: http://pastebin.com/wDYjJdnp 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") send_letter_ex(localeInfo.LanguageOptionTitle, "golden,blink,ex", "scroll_open_green.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. colored-quest-scrolls-v2-res.7z
  9. martysama0134

    WorldEditor ReMIX

    https://github.com/martysama0134/how-to-mt2-general/tree/master/worldeditor-dpi-fix Try this way in case of higher resolutions and menus overflowing.
  10. Frankie/M2BobFixed/warxwar/RaFFa is stealing your players' passwords! What does it mean? Everyone who is using his last "ultimate protection" is indirectly sending all his players' users&passwords to his webserver. How? https://imgur.com/a/TqYYC As you can see, he's sending the player's user&pass at login to his remote webserver faking it as "m2bob login". Haha To understand better what's going on, we need to "decrypt" the text. https://i.imgur.com/iq9DuFj.png Why would he do such a thing? Well, it's nothing new that he does retarded things like this. Mostly for his own profit. And also to harm/destroy other servers, since he opened one from stolen server-files. How many servers are now fucked up? There are quite some so far. Is he really skilled? Haha, no. He's a retard. 99.8% of his code comes from stackoverflow.com, and he also was trying to rip-off Koray's protection. He also needs to update the hashes in his protection each time there's a new m2bob version. So, who is Frankie? He's an Italian bipolar guy, and professional liar (he would NEVER NEVER NEVER confess, but he would make some excuses). I taught him python in 2010, but he understood nothing, and I gave up on him. Between 2010-2013 he was just begging for money by doing some quick dirty job in python for random servers. In 2014-2015, he created his m2bobfixed service, and there's quite some people who cried blood because of that. In 2017, he faked that his skype was hacked by romanians to start reselling other people's files. In 2018, he opened a(n infamous) pserver from stolen files, and he's currently stealing users&passwords and private files from all of his "clients". If he joined your PC via teamviewer, or if he sent you some .exe/.dll, it's quite sure he stole something from you. Additional things: 1) He placed the protection inside a folder called "AccountProtect", but in reality it's a password stealer. Can you understand the irony? https://i.imgur.com/PuupV8U.png 2) You can try and decrypt the strings by yourself. Download https://pastebin.com/H9v0heBh then compile n run it: # c++ main.cpp # ./a.out
  11. martysama0134

    Frankie/M2BobFixed/warxwar/RaFFa is stealing your players' passwords!

    He got permabanned 2 weeks ago from here.
  12. martysama0134

    SEARCHING GOOD EXPERT OF PACKETS!

    Yeah, yeah. So bad that I just need to fart to annihilate your existence. I don't like meddling with shit though. I prefer to keep myself clean.
  13. martysama0134

    SEARCHING GOOD EXPERT OF PACKETS!

  14. martysama0134

    c++ C++/Python Chest Drop View (My version)

    I gave you some suggestions/tips, because I thought you were the creator of this script, but it seems not.
  15. martysama0134

    python [Fix] Ghost GUI

    Technically, this is a work-around, because the previous "ghost interface" is still there, but it remains just hidden (undeleted). You get such bug due to a python's garbage collector "issue/condition" when destroying the relative class: Since, in your case, the class' object count is higher than 1, when deleting self, the object count is decreased by 1, but since it doesn't still become 0, self doesn't get destroyed at all. (and del self.wndInventory wouldn't trigger def __del__ either) Normally, the object count for gui instances should remain as 1, but (mostly in every case) if someone during a .SetEvent (or similar) passed the self parameter without proxing it (proxy=creating a weak uncounted instance of self), it will lead to create 2 self instances in two different modules (interfaceModule and ui in this case), which means the object count will be >=2, and then you'll get a "ghost interface" when rewarping. Even so, considering everything beside self gets still deleted (i mean, its internal elements get deleted except the methods; that's why ESC still works), putting a .Hide() in there is still safe. (the memory leak would still remain unfixed though; maybe after retriggering the bug the "ghost interface" gets deleted, but a new one would still be generated to replace it)
  16. martysama0134

    c++ C++/Python Chest Drop View (My version)

    The "Chest Drop Preview" as idea is interesting: I don't think opening 200 boxes at once without delay would be as good as expected. It would be better adding another sliderbar to specify the relative delay (e.g. from 0.0 to 1.0s). (you can simply move the for loop in the OnUpdate function to accomplish such a thing quite easily) (and by reclicking the OpenChestButtonMultiple, you stop the unboxing process) Tips: Instead of "if not self.chestDrop.has_key(self.currentChest):" you can simply do "if self.currentChest not in self.chestDrop:" (has_key is a thing of the past, pre 2.2) Instead of "if 0 != self.tooltipItem:" you can simply do "if self.tooltipItem:" (python evalues as false even if it's 0 "" [] {} () set() None False)
  17. martysama0134

    python Sequence Generator

    I made a sequence generator script. You can find it in here: https://github.com/martysama0134/how-to-mt2-general/tree/master/sequence-generator This python script automatically generates the sequence table for `EterLib\NetStream.cpp` (in `s_bSequenceTable`) and `game\src\sequence.cpp` (in `gc_abSequence`). (the keys get changed every time you run the script) A sequence table is just a simple random generated array with 16x2048 bytes between 0x0 and 0xfe. Replacing the sequence table makes older/unwanted launchers unable to access the server.
  18. martysama0134

    python Sequence Generator

    It's not necessary, but it's still something that can be done quite easily. Some servers though disable the whole sequence.
  19. Instead of changing window to windows, you can simply change it to `window`. (this little change is present on mysql8.0 as well) Including <mariadb>'s includes isn't 100% required (at must, it's suggested to do so) since the <mysql>'s ones are also added when installing mariadb. Instead of directly adding the mariadb define in CFLAGS, you can perform a check like mysql --version | grep -c MariaDB. By default, when linking mariadb, several other dynamic .so are included in the game. (it may be annoying)
  20. martysama0134

    open Can't compile quest because dragon soul defines?

    You need pre_qc.py. python pre_qc.py -ac (if you use mine; the quest list is specified in quest_list)
  21. martysama0134

    python Xtea Keys Generator

    Some years ago I created a (python2) script to generate xtea keys randomly, here it is: xtea-keys-generator.rar You can also find it in here: https://github.com/martysama0134/how-to-mt2-general/tree/master/xtea-keys-generator It generates the code for EterNexus, for EterPack.cpp, and also the hex string you see inside the compiled launcher.
  22. martysama0134

    python [Py] Root 02.02.2018

    Definitely DevDick. You can find him several times dicking around in this new leaked root: (screenshot by Syreldar)
  23. martysama0134

    c++ Teleport Skill for Party

    In reality, he was called warxwar in italian boards in 2009. I helped him a lot through these years. I taught him python and other stuff. (but he forgot them) Well, you can see the result now with this kind of thread ahah
  24. martysama0134

    c++ Teleport Skill for Party

    I never created nor sold that thing. I also hate using "attached braces". (code formatting style) What a pig.
  25. martysama0134

    open Offline shop crash bug

    In the relative .cpp file, you have something like: DirectQuery(query); so change it to: DirectQuery("%s", query);
×