Popular Content

Showing most liked content since 03/25/2017 in all areas

  1. 42 likes
    Hello everybody Today I will show my new system - I decided to release it...It's a very simple system and useful for PServers. What does it do? Well, it gives a random item to a player at every 12 hrs. He must enter the game and click on a gift to get the item. GM can set 5 items in DB and one of them will be gived to the players. You can change time for this system e.g.: Items ID are stored in a new table called "surprisebox". Server_side: FirstReq: If somebody wants to add new conditions to quest, first ask me in pm, then post here. Probably some people would think that it's my mistake...Thanks for understanding! Client_side: #####New: GS-Tool##### Updates: 13.iun.2014. - v1.2 - Added Gift box(17609 item) 3.july.2014 - v1.3 - Quest repaired. Added no-mysql_query version and shows box only when you can use it. Download the button: mega.co.nz - Add it in: (Etc.epk/eix)D:/ymir work/ui Download PHP-CPannel: mega.co.nz Kind regards, Zetsu I offer support, just ask me here or in PM! Soon I will add PHP_CPannel for beginners. I know this system it's very simple and contains some parts where i choose the hard way, but anyway.. i think this system keeps players online. Note: If you want to hide the Box press: LShift+P Sometimes it's annoying xD ...
  2. 41 likes
    Hi, In this thread I will show you how you can implement an advanced spam protection to your server. The player can write the same message just after 5 seconds. The player will receive 1 minute of chat ban if he is trying to send the same message more than 3 times in 5 seconds. You can specify a blockspamlist.lst file which contains words. If the user sending a message which contains a words from the list, the player will receive 5 minutes of chat ban. (You can specify the time of the chat ban) You can specify a bannspamlist.lst file which contains words. If the user sending a message which contains a words from the list, the player will receive a ban. (You can specify the time of the ban) Open game/input_main.cpp and search for this: if (ch->IncreaseChatCounter() >= 10) Add this over that: if (!strcmp(ch->LastPlayerMessage, buf) && (thecore_pulse() < (ch->LastMessageAt + SPAM_WAIT_SEC * 25)) && !ch->SpamAllowBuf(buf) && ch->GetGMLevel() < GM_LOW_WIZARD) { if (ch->BlockChatAfter < 2) { ch->ChatPacket(CHAT_TYPE_INFO, ("You must wait 5 seconds to repeat your message")); ch->BlockChatAfter++; return iExtraLen; } else { ch->BlockChatAfter = 0; ch->PlayerPunish(false, SPAM_CHAT_BAN_TIME); return iExtraLen; } } else { if (!ch->BannListCheck(buf) && ch->GetGMLevel() < GM_LOW_WIZARD) { ch->PlayerPunish(true, SPAM_BAN_TIME); return iExtraLen; } if (!ch->SpamListCheck(buf) && ch->GetGMLevel() < GM_LOW_WIZARD) { ch->ChatPacket(CHAT_TYPE_INFO, ("You wrote a not allowed words!")); ch->PlayerPunish(false, SPAM_CHAT_BAN_TIME); return iExtraLen; } } Still in input_main.cpp search for this: ch->GetMapIndex(), strlen(ch->GetName()))); Add this under that: strcpy(ch->LastPlayerMessage, buf); ch->LastMessageAt = thecore_pulse(); ch->BlockChatAfter = 0; Open game/char.h and search for this: BYTE GetChatCounter() const; Add this under that: int LastMessageAt; int BlockChatAfter; char LastPlayerMessage[CHAT_MAX_LEN + 1]; void PlayerPunish(bool PowerPunish, int Duration); bool SpamListCheck(const char *Message); bool BannListCheck(const char *Message); bool SpamAllowBuf(const char *Message); Open game/char.cpp and add these events: void CHARACTER::PlayerPunish(bool PowerPunish, int Duration) { if (!PowerPunish) { AddAffect(AFFECT_BLOCK_CHAT, POINT_NONE, 0, AFF_NONE, Duration, 0, true); sys_log(0, "%s[%d] has been chatbanned because of spamming/writing words which are in the spamlist.txt", GetName(), GetPlayerID()); } else { std::auto_ptr<SQLMsg> msg(DBManager::instance().DirectQuery("UPDATE account.account SET availDt = FROM_UNIXTIME(UNIX_TIMESTAMP(CURRENT_TIMESTAMP()) + %i) WHERE id = %d", Duration, GetAID())); sys_log(0, "%s[%d] has been banned because of saying blacklisted word", GetName(), GetPlayerID()); GetDesc()->DelayedDisconnect(5); } } bool CHARACTER::SpamAllowBuf(const char *Message) { if (!strcmp(Message, "(Ȳ´ç)") || !strcmp(Message, "(µ·)") || !strcmp(Message, "(±â»Ý)") || !strcmp(Message, "(ÁÁľĆ)") || !strcmp(Message, "(»ç¶ű)") || !strcmp(Message, "(şĐłë)") || !strcmp(Message, "(ľĆÇĎ)") || !strcmp(Message, "(żěżď)") || !strcmp(Message, "(ÁËĽŰ)")) { return true; } return false; } bool CHARACTER::SpamListCheck(const char *Message) { for (int i = 0; i < SpamBlockListArray.size(); i++) { if (!strcmp(Message, SpamBlockListArray[i].c_str())) { return false; } } return true; } bool CHARACTER::BannListCheck(const char *Message) { for (int i = 0; i < SpamBannListArray.size(); i++) { if (!strcmp(Message, SpamBannListArray[i].c_str())) { return false; } } return true; } Add 2 new files to your project: spamblock.cpp spamblock.h Add these to the spamblock.cpp #include "fstream" #include "string" #include "sstream" #include "stdafx.h" #include "../../common/length.h" std::vector<std::string> SpamBlockListArray; std::vector<std::string> SpamBannListArray; void LoadBlockSpamList() { std::string TempBlockList; std::ifstream File("chat/blockspamlist.lst"); if (!File.is_open()) { sys_log(0, "WARNING: cannot open chat/blockspamlist.lst"); return; } SpamBlockListArray.clear(); while (!File.eof()) { File >> TempBlockList; SpamBlockListArray.push_back(TempBlockList); } File.close(); } void LoadBannSpamList() { std::string TempBannList; std::ifstream File("chat/bannspamlist.lst"); if (!File.is_open()) { sys_log(0, "WARNING: cannot open chat/bannspamlist.lst"); return; } SpamBannListArray.clear(); while (!File.eof()) { File >> TempBannList; SpamBannListArray.push_back(TempBannList); } File.close(); } Add these to the spamblock.h #include "string" #include "../../common/length.h" extern void LoadBlockSpamList(); extern void LoadBannSpamList(); extern std::vector<std::string> SpamBlockListArray; extern std::vector<std::string> SpamBannListArray; Add this to game/char.cpp #include "spamblock.h" Add this to game/main.cpp #include "spamblock.h" Search for this in game/main.cpp: PanamaLoad(); Add these under that: LoadBlockSpamList(); LoadBannSpamList(); Open common/length.h and add these: SPAM_WAIT_SEC = 5, // The player can duplicate his message after 5 sec SPAM_CHAT_BAN_TIME = 60, // The player will receive 60 seconds chat ban, if he is saying a spamlist word SPAM_BAN_TIME = 3600, // The player will receive 1 hour ban, if he is saying a banlist word Open game/cmd_gm.cpp and search for this event: ACMD(do_reload) Add this to the switch function: case 'b': ch->ChatPacket(CHAT_TYPE_INFO, "Reloading bann/spam list infomations."); LoadBlockSpamList(); LoadBannSpamList(); sys_log(0, "Reloading bann/spam list infomations."); break; Add this to the top of the file: #include "spamblock.h" How to set up: Make sure you added everything to your game Create a new folder called chat in your channels Create 2 files, blockspamlist.lst and bannspamlist.lst Upload the words to these files Restart your server blockspamlist.lst example: obsceneword1 obsceneword2 obsceneword3 obsceneword4 bannspamlist.lst example: WWW.CHEAP-FARM-SERVICE.COM WWW.CHEAP-GOLD.COM WWW.EASY-HACKS.COM WWW.FREE-YANG.COM If you have any question or suggestion, please just reply to this topic. Kind Regards, Sanchez
  3. 30 likes
    Hi there Devs, I would like to share my "little" system. If you aren't interested in the introduction/preview etc. and you just want to download it and put in to your server, just scroll down until the "[How-To] Set up" subtitle. The story Firstly let me tell this system's story. I've got an idea one year before, that it would be good if the players would be able to put their items into a "global" system where they could see the other player's items, and they could buy it for DC or gold (that time I worked with the latest vanilla core (not with the source)). Then in the following 8 days I made it (it took about 80-90 working hours). Originally the system was created for one of my friend's server. but this server has never started, and nobody used this system. After some mounts I've decided to publish it on the Hungarian forum, because it won't worth to work on it for long hours if nobody uses it and its just collecting dust on my computer. Then I've published it on the 2nd of December, 2014. After some time I've decided to translate it into English and I've got a new idea for a new feature. This feature was: the trade system (I will explain its working later). This idea inspired by one of the players (from a server where this system was able to use). He told me that it would be better if they could set the gold price via an item (what's value is very high). Then with more than 180 working hours (totally) behind my back I'm here. Overview [How-To] Set up Customizing the tradehouse Questions and Answers Notes changelog: 19th of August, 2015: I publicated the tradehouse here. my toDo list: add logging for the system (the released version don't log the actions in the tradehouse) Thanks for reading the topic, if you have any problem/remark feel free to ask it here or write me a PM. Have a good day!
  4. 25 likes
    Hi devs! The original equipment viewer is not updated for the new equipments I am thinking of costumes + rings + belt Here is the extended version. Images: Here are my modified files to root and uiscript package, the .py files: uiEquipDialog.py Pastebin ~ MEGA UIScriptEquipmentDialog.py Pastebin ~ MEGA UIScriptCostumeEquipmentDialog.py Pastebin ~ MEGA Ehm yeah this was the easiest part of this, now comin' the serverside and binary parts. Server: 1.) Open gamepacket.h than search for: "typedef struct pakcet_view_equip" and replace all structure with this: typedef struct pakcet_view_equip { BYTE header; DWORD vid; struct { DWORD vnum; BYTE count; long alSockets[ITEM_SOCKET_MAX_NUM]; TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM]; } equips[16]; } TPacketViewEquip; PS: lel "pakcet" xD nevermind Save&Close 2.) Open char.cpp and search for this: "void CHARACTER::SendEquipment(LPCHARACTER ch)" and replace the event with this(Thanks ATAG): void CHARACTER::SendEquipment(LPCHARACTER ch) { TPacketViewEquip p; p.header = HEADER_GC_VIEW_EQUIP; p.vid = GetVID(); int pos[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 19, 20, 21, 22, 23 }; for (int i = 0; i < 16; i++) { LPITEM item = GetWear(pos[i]); if (item) { p.equips[i].vnum = item->GetVnum(); p.equips[i].count = item->GetCount(); thecore_memcpy(p.equips[i].alSockets, item->GetSockets(), sizeof(p.equips[i].alSockets)); thecore_memcpy(p.equips[i].aAttr, item->GetAttributes(), sizeof(p.equips[i].aAttr)); } else { p.equips[i].vnum = 0; } } ch->GetDesc()->Packet(&p, sizeof(p)); } Serverside done! - Build! Binary: 1.) Open UserInterfacePacket.h than search for this: "typedef struct pakcet_view_equip" and replace with this: typedef struct pakcet_view_equip { BYTE header; DWORD dwVID; TEquipmentItemSet equips[16]; } TPacketGCViewEquip; PS: we met again with pakcet xD, Save&Close. 2.) Open UserInterfacePythonNetworkStreamPhaseGame.cpp than search for this: "bool CPythonNetworkStream::RecvViewEquipPacket()" and replace with this: bool CPythonNetworkStream::RecvViewEquipPacket() { TPacketGCViewEquip kViewEquipPacket; if (!Recv(sizeof(kViewEquipPacket), &kViewEquipPacket)) return false; PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OpenEquipmentDialog", Py_BuildValue("(i)", kViewEquipPacket.dwVID)); for (int i = 0; i < 16; ++i) { TEquipmentItemSet & rItemSet = kViewEquipPacket.equips[i]; PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "SetEquipmentDialogItem", Py_BuildValue("(iiii)", kViewEquipPacket.dwVID, i, rItemSet.vnum, rItemSet.count)); for (int j = 0; j < ITEM_SOCKET_SLOT_MAX_NUM; ++j) PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "SetEquipmentDialogSocket", Py_BuildValue("(iiii)", kViewEquipPacket.dwVID, i, j, rItemSet.alSockets[j])); for (int k = 0; k < ITEM_ATTRIBUTE_SLOT_MAX_NUM; ++k) PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "SetEquipmentDialogAttr", Py_BuildValue("(iiiii)", kViewEquipPacket.dwVID, i, k, rItemSet.aAttr[k].bType, rItemSet.aAttr[k].sValue)); } return true; } Binaryside done! - Build! ---Edit---- Multiple opening bugfix: Open interFaceModule.py and search for this: "def OpenEquipmentDialog(self, vid):" if you found it replace that function with this: def OpenEquipmentDialog(self, vid): if self.equipmentDialogDict.has_key(vid): self.equipmentDialogDict[vid].Destroy() self.CloseEquipmentDialog(vid) dlg = uiEquipmentDialog.EquipmentDialog() dlg.SetItemToolTip(self.tooltipItem) dlg.SetCloseEvent(ui.__mem_func__(self.CloseEquipmentDialog)) dlg.Open(vid) self.equipmentDialogDict[vid] = dlg Show the "View equip" button on the targetbar: Open uitarget.py and check this diff to fix it for yourself: https://www.diffchecker.com/lqi9xdb7 ( ----EndEdit---- Ohh I almost forgot, here are the bgs ^^-> ui.7z - MEGA All done, press escape to exit... :')
  5. 24 likes
    Greetings! The new beta is finished! I'm proud to present r70140-BETA. This time a few things have changed. And in this revision, we have a lot of new stuff. That's the reason I want to make a BETA so everything's tested. In the following I'll provide the download link along with the things I'd love you to test. *** DISCLAIMER *** I am absolutely not responsible for you replacing your core with a Beta-revision. This is clearly undergoing development and had not enough testing to be labeled as stable. Please do not use it in production envirionments unless you're sure what you're doing (and even so it's madness). It's meant for testing purpose. Our main goal is to achieve a stable core. As soon as patches come in, I'll tidy up the patchlog. 1.) What's new? + Boot-Trigger for quests With this you can execute commands, timers, and all the stuff you'd like to have just on boot-time! * revisioned the unique class and added a ton of possibilities to it! More down below! + Added the functionality to create unique-groups + Temp-Variables for quests * upgraded all libs and moved completely to the newest clang version * fixed some big security issues in the source code * fixed the ingame ban and unban commands * unified tables and gave them a new way: unify! * Revisioned the Makefiles and gave the source a new, easier structure * Removed all external dependencies - you won't need them, just install them by ports. No External-folder necessary! * Partial implementation of the wolfman (claws etc. are added, needs review) - removed boost dependency (no boost lib needed yay) And basically everything that has been offered in the earlier versions of the vanilla core. Nothing should be missing. And if you miss something, just feel free to tell me! 2.) What needs testing? There is a lot of stuff to test! In this earlier BETA-stage I won't give out the source code. I will do so once I've made sure the core runs well enough to be released in public. Though there are few things I'd love you to test out! * Please check if the core is vulnerable to any security breaches you may know (also the public ones, don't know if I missed something) * Please test out the new features! I'd really love to know if the new unique-functions and the boot-trigger does the job. 3.) Explanation to new features * Unique with container support Unique has evolved! This time you have a few new possibilities. Don't know what unique is? Here's a short explanation: With the unique-questfunctions you can spawn or set mobs, npcs and now even players to have a unique name. This name is stored into a unique-container. You can access this container and get all the vid's by their unique name (also called: the key) So for example you can spawn a boss with a key. Later on you can check if this specific mob has been killed or not. Or you can set his hp on-the-fly. There's basically no limits! And now with the revised system you'll have even more options. The new unique system works with containers. By default there are two containers reserved: __DEFAULT__ and __CHARACTER__. The first one is for all the basic stuff. And the second one is reserved for players. Now, as you may have noticed, there's a default one which means that the container-stuff is optional. If you just use the unique-functions without specifying a container, it'll just use the default stuff. But you CAN use your own containers just as you want to. You can create, delete and list all the containers running. There is a list with all the quest-functions down below. * Boot-Trigger This is pretty self-explanatory. With this release you can use "when boot begin" to specify a block of code that will be executed once the core has been booted. * Temp-Variables With the new temp-variables you can set and remove player-specific variables. They are stored in the core and not written to disk or database. So be careful because they might get dropped once the core shutdowns. It's just a quick storage for people who want to have something like a cache for quick access. The new quest functions: nil unique.spawn_unique(string key, int vnum, string pos=unused, string container=optional) nil unique.set_unique(string key, int vid, string container=optional) nil unique.purge_unique(string key, string container=optional) nil unique.kill_unique(string key, string container=optional) bool unique.is_unique_dead(string key, string container=optional) int unique.get_hp_perc(string key, string container=optional) nil unique.set_def_grade(string key, int def, string container=optional) nil unique.set_hp(string key, int hp, string container=optional) nil unique.set_max_hp(string key, int maxhp, string container=optional) int unique.get_vid(string key, string container=optional) bool unique.exists(string key, string container=optional) table unique.get_container_list() --this prints out all the unique containers table unique.get_container_list(string key) --this prints out all the vids in the unique-container "key" nil unique.remove_container(string key) --removes a whole container (flushes it when called on standard containers) nil pc.temp_var_set(string key, string value) string pc.temp_var_get(string key) nil pc.temp_var_delete(string key) Thanks a lot for participating! If there are any questions, this is the topic related to it. Further releases will be made public here too! If you'd like to contribute, just post code additions here. Download: Here Download (source code): Here Password for both archives is: vanilla Libs are included. If you're building your own vanilla binary you'll first have to move into every project of the Internal directory and rebuild the libs. The main Makefile is not adapted yet, I was too lazy Best Regards Vanilla
  6. 24 likes
    Second fix - Description (Totally fix) Even If you don't use escape string for the companion, the function will search companion and account in the maps. If the result is not positive, the function will stop itself and write a log in syserr. Search this in messenger_manager.cpp void MessengerManager::RemoveFromList(MessengerManager::keyA account, MessengerManager::keyA companion) Replace with this void MessengerManager::RemoveFromList(MessengerManager::keyA account, MessengerManager::keyA companion) { if (companion.empty()) return; // Second fix if (m_Relation[account].find(companion) == m_Relation[account].end() || m_InverseRelation[companion].find(account) == m_InverseRelation[companion].end()) { LPCHARACTER ch = CHARACTER_MANAGER::Instance().FindPC(account.c_str()); if (ch) { sys_err("MessengerManager::RemoveFromList: %s tries to use messenger sql injection", ch->GetName()); if (ch->GetDesc()) ch->GetDesc()->DelayedDisconnect(3); } else sys_err("MessengerManager::RemoveFromList: Omg! The ghost tried to use this function!"); return; } sys_log(1, "MessengerManager::RemoveFromList: Remove %s %s", account.c_str(), companion.c_str()); DBManager::instance().Query("DELETE FROM messenger_list%s WHERE account='%s' AND companion = '%s'", get_table_postfix(), account.c_str(), companion.c_str()); __RemoveFromList(account, companion); TPacketGGMessenger p2ppck; p2ppck.bHeader = HEADER_GG_MESSENGER_REMOVE; strlcpy(p2ppck.szAccount, account.c_str(), sizeof(p2ppck.szAccount)); strlcpy(p2ppck.szCompanion, companion.c_str(), sizeof(p2ppck.szCompanion));; P2P_MANAGER::instance().Send(&p2ppck, sizeof(TPacketGGMessenger)); } If you want to ban who tries to use this SQL injection, here is a code for you. void MessengerManager::RemoveFromList(MessengerManager::keyA account, MessengerManager::keyA companion) { if (companion.empty()) return; // Second fix if (m_Relation[account].find(companion) == m_Relation[account].end() || m_InverseRelation[companion].find(account) == m_InverseRelation[companion].end()) { LPCHARACTER ch = CHARACTER_MANAGER::Instance().FindPC(account.c_str()); if (ch) { sys_err("MessengerManager::RemoveFromList: %s tries to use messenger sql injection", ch->GetName()); DBManager::Instance().DirectQuery("UPDATE account.account SET status = 'BAN' WHERE id = %u", ch->GetAID()); if (ch->GetDesc()) ch->GetDesc()->DelayedDisconnect(3); } else sys_err("MessengerManager::RemoveFromList: Omg! The ghost tried to use this function!"); return; } sys_log(1, "MessengerManager::RemoveFromList: Remove %s %s", account.c_str(), companion.c_str()); DBManager::instance().Query("DELETE FROM messenger_list%s WHERE account='%s' AND companion = '%s'", get_table_postfix(), account.c_str(), companion.c_str()); __RemoveFromList(account, companion); TPacketGGMessenger p2ppck; p2ppck.bHeader = HEADER_GG_MESSENGER_REMOVE; strlcpy(p2ppck.szAccount, account.c_str(), sizeof(p2ppck.szAccount)); strlcpy(p2ppck.szCompanion, companion.c_str(), sizeof(p2ppck.szCompanion));; P2P_MANAGER::instance().Send(&p2ppck, sizeof(TPacketGGMessenger)); }
  7. 20 likes
    Hello everyone. It's a good day to share an old code with you. First of all you need to know: I don't help to install it. Don't even take the contact with me about it. The whole code is written by me, and reversed from official binaries. At the beginning do a backup for your files(srcs+pys) and READ CAREFULLY the readme. W/o brain.exe please close this tab, or your browser, thank you for your understanding. Preview: Download.exe Enjoy & #h4v3fun, pngr
  8. 19 likes
    Here you have 50 New Npc's for your Privatserver. I dont have screens becuse of >> 50 Npcs... sorry maybe when i have Time, ill update the thread. Download: https://mega.co.nz/#!uBAWnahZ!m7HpAEoa7FPpguPpS40p8cU8KBQFTp_KgTDuElLpYH4 Hope you need the Npc's. Elitepvpers = Link down, now only here on metin2dev.
  9. 17 likes
    The new update(v17.1) is containing the following unpacked packfiles: locale(en,us,de,cz,hu) w/ unpacked protos <!!> via new antiflags <!!> root <!> dumped python and built-in datas <!> (Not raw .python files!) uiscript icon patch_easter2k16 patch_etc_costume1 patch_pc3_m patch_public patch_ramadan patch_summer outdoormilgyo1 outdoortrent02 https://mega.nz/#!6AgSQBKY!sVnPzou3wvNiWbcYFQJNihWFrJzwHOvA_fGDqnj6P6g
  10. 17 likes
    A collision or crash is an event in which two or more bodies exert forces on each other for a relatively short time. Although the most common colloquial use of the word "collision" refers to incidents in which two or more objects collide, the scientific use of the word "collision" implies nothing about the magnitude of the force. Some examples of physical interactions that scientists would consider collisions: An insect touches its antenna to the leaf of a plant. The antenna is said to collide with leaf. A cat walks delicately through the grass. Each contact that its paws make with the ground is a collision. Each brush of its fur against a blade of grass is a collision. I will come back with a video tonight [File: src/Client/Source/GameLib/ActorInstanceCollisionDetection.cpp] //1.) Search: #include "../eterLib/GrpMath.h" //2.) Add bellow: #include "../UserInterface/PythonBackground.h" #include "../UserInterface/Locale_inc.h" //3.) Search: BOOL CActorInstance::TestActorCollision(CActorInstance & rVictim) { //4.) Add bellow: #ifdef ENABLE_STOP_COLISSION_GLOBAL /********************************************************************* * date : 2016.02.16 * function : Stop Colission * developer : VegaS * skype : sacadatt.amazon * description : Checks if the victim is one of the examples below you can easily configure. If the victim was found success as vnum site / breed ve you could go through it no longer block. */ /************ * The first value is the minimum value and the second value is the maximum value of pet vnum (mob_proto) - change 34051 with your max vnum of pet */ int pListPet[2] = {34001, 34051}; /************ * You can add whatever you like vnum of npc or monster (mob_proto) */ int pListGlobal[] = {9001, 9002, 9003, 9004, 9005, 9006, 20011, 20091, 20092, 20093, 20094, 20095, 30000}; /************ * You can add what mapname you want for enable this stop collission global like pet / npc */ const char* strMapListGlobal[] = {"metin2_map_a1", "metin2_map_a3", "metin2_map_b1", "metin2_map_b3", "metin2_map_c1", "metin2_map_c3", "season2/metin2_map_skipia_dungeon_01", "season2/metin2_map_skipia_dungeon_02", "metin2_map_duel"}; /************ * Location name of the map where the event takes place ox */ const char* strMapEventOx = "season1/metin2_map_oxevent"; std::string stringName = CPythonBackground::Instance().GetWarpMapName(); for (int i = 0; i < _countof(strMapListGlobal); i++) { #ifdef ENABLE_STOP_COLLISION_PLAYER_OX if (strMapEventOx == stringName) // Check if u are place in map ox { if (0 <= rVictim.GetRace() && rVictim.GetRace() <= 7) // Check if the victim through which pass over a player (change 7 with 8 if u have wolfman) return FALSE; // Stop collission for player --> You can go through players now successfully without lock yourself } #endif if (strMapListGlobal[i] == stringName) // Check if you are in one of the maps listed in the global list { for (int i = 0; i < _countof(pListGlobal); i++) { if (rVictim.GetRace() == pListGlobal[i] || pListPet[0] <= rVictim.GetRace() && rVictim.GetRace() <= pListPet[1]) // Verify that the victim is npc vnum listed above, or if a pet. return FALSE; // Stop collission for global vnum like a pet or npc } } } #endif [File: src/Client/Source/UserInterface/Locale_inc.h] //1.) Search: #define ENABLE_COSTUME_SYSTEM //2.) Add bellow: #ifndef ENABLE_STOP_COLISSION_GLOBAL #define ENABLE_STOP_COLISSION_GLOBAL #define ENABLE_STOP_COLLISION_PLAYER_OX #endif
  11. 14 likes
    What is this ? : "When a player sends you a message icon taskbar starts flashing." https://www.youtube.com/watch?v=s2LkFrfrrhk [File: Client/root/InterfaceModule.py] //1.) Search: 2x btn.Flash() #in function def RecvWhisper(self, name): //2.) Add bellow: app.FlashApplication() [File: Source/src/Client/UserInterface/PythonApplication.cpp] //1.) Search: void CPythonApplication::Clear() { m_pySystem.Clear(); } //2.) Add bellow: #include <Windows.h> void CPythonApplication::FlashApplication() { HWND hWnd = GetWindowHandle(); FLASHWINFO fi; fi.cbSize = sizeof(FLASHWINFO); fi.hwnd = hWnd; fi.dwFlags = FLASHW_ALL | FLASHW_TIMERNOFG; fi.uCount = 0; fi.dwTimeout = 0; FlashWindowEx(&fi); } [File: Source/src/Client/UserInterface/PythonApplication.h] //1.) Search: void SetForceSightRange(int iRange); //2.) Add bellow: void FlashApplication(); [File: Source/src/Client/UserInterface/PythonApplicationModule.cpp] //1.) Search: PyObject* appLogoClose(PyObject* poSelf, PyObject* poArgs) { //CPythonApplication::Instance().OnLogoClose(); return Py_BuildNone(); } //2.) Add bellow: PyObject* appFlashApplication(PyObject* poSelf, PyObject* poArgs) { CPythonApplication::Instance().FlashApplication(); return Py_BuildNone(); } //3.) Search: { "OnLogoClose", appLogoClose, METH_VARARGS }, //4.) Add bellow: { "FlashApplication", appFlashApplication, METH_VARARGS },
  12. 14 likes
    Hi metin2dev i want to share skill party flag This flag will give buff to all members from your party. Sorry for my english Open skill.h Search: SKILL_FLAG_FIRE = (1 << 26), After this add: SKILL_FLAG_PARTY = (1 << 27), Now open char_skill.cpp Search: SKILL_RESIST_PENETRATE And after add: struct FPartyPIDCollector { std::vector <DWORD> vecPIDs; FPartyPIDCollector() { } void operator () (LPCHARACTER ch) { vecPIDs.push_back(ch->GetPlayerID()); } }; Like in picture Now search: if (IS_SET(pkSk->dwFlag, SKILL_FLAG_SELFONLY)) pkVictim = this; And after Add: if (IS_SET(pkSk->dwFlag, SKILL_FLAG_PARTY) && !GetParty()) pkVictim = this; And again: if (IS_SET(pkSk->dwFlag, SKILL_FLAG_SELFONLY)) pkVictim = this; After if (IS_SET(pkSk->dwFlag, SKILL_FLAG_PARTY) && !GetParty()) pkVictim = this; Now search: if (IS_SET(pkSk->dwFlag, SKILL_FLAG_SELFONLY)) ComputeSkill(dwVnum, this); And after: else if (IS_SET(pkSk->dwFlag, SKILL_FLAG_PARTY) && !GetParty()) ComputeSkill(dwVnum, this); else if (IS_SET(pkSk->dwFlag, SKILL_FLAG_PARTY) && GetParty()) { FPartyPIDCollector f; GetParty()->ForEachOnMapMember(f, GetMapIndex()); for (std::vector <DWORD>::iterator it = f.vecPIDs.begin(); it != f.vecPIDs.end(); it++) { LPCHARACTER ch = CHARACTER_MANAGER::instance().FindByPID(*it); ComputeSkill(dwVnum, ch); } } Open guild.cpp and search: if ((pkSk->dwFlag & SKILL_FLAG_SELFONLY)) { // 이미 걸려 있으므로 사용하지 않음. if (ch->FindAffect(pkSk->dwVnum)) return; victim = ch; } After add: if ((pkSk->dwFlag & SKILL_FLAG_PARTY)) { if (ch->FindAffect(pkSk->dwVnum)) return; victim = ch; } Open navicat->player->skill_proto->design table and at setFlag change the values with: 'ATTACK','USE_MELEE_DAMAGE','COMPUTE_ATTGRADE','SELFONLY','USE_MAGIC_DAMAGE','USE_HP_AS_COST','COMPUTE_MAGIC_DAMAGE','SPLASH','GIVE_PENALTY','USE_ARROW_DAMAGE','PENETRATE','IGNORE_TARGET_RATING','ATTACK_SLOW','ATTACK_STUN','HP_ABSORB','SP_ABSORB','ATTACK_FIRE_CONT','REMOVE_BAD_AFFECT','REMOVE_GOOD_AFFECT','CRUSH','ATTACK_POISON','TOGGLE','DISABLE_BY_POINT_UP','CRUSH_LONG','WIND','ELEC','FIRE','PARTY'
  13. 14 likes
    It's really long time i released some mobs, so today i will share with you my naga pack. It including 4 mobs with effects + 1 boss. I didn't make sound files, i have no time for it, maybe i make it during christmas. I will have a little free time then. You can use it how u want. You need granny 2.8+! I don't support old granny anymore. Download here
  14. 13 likes
    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! questcategory.7z server-side.7z
  15. 13 likes
    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
  16. 12 likes
    Hello everyone ! I've been away from metin2 for about 6 months and i've get back from less then a month and made thoes systems , i've start selling them but i didn't sell it to anyone and i got bored from metin2 again so i'm going to release it and go off from metin2 for ever . about the Advance Refine System here some info: so download and have fun Advance Refine System.rar Soul Bind System.rar Cheque System.rar
  17. 12 likes
    Hello devs. I don't want to talk a lot about nothing, but I have to say what is this. With this little modification the party and the friend requests are cancelled automatically in seconds what you can change in the Open method. ( pyObj.Open(sec) ) Preview video: Make a backup before you are implementing it! And if you found a bug, please explain it. 0.) Open your uiCommon.py file and import chat module. 1.) Replace the whole QuestionDialogWithTimeLimit class in the uiCommon.py file with this: class QuestionDialogWithTimeLimit(QuestionDialog2): def __init__(self): ui.ScriptWindow.__init__(self) self.__CreateDialog() self.endTime = 0 self.timeOverMsg = 0 self.timeOverEvent = None self.timeOverEventArgs = None def __del__(self): QuestionDialog2.__del__(self) def __CreateDialog(self): pyScrLoader = ui.PythonScriptLoader() pyScrLoader.LoadScriptFile(self, "uiscript/questiondialog2.py") self.board = self.GetChild("board") self.textLine1 = self.GetChild("message1") self.textLine2 = self.GetChild("message2") self.acceptButton = self.GetChild("accept") self.cancelButton = self.GetChild("cancel") def Open(self, timeout): self.SetCenterPosition() self.SetTop() self.Show() self.endTime = app.GetTime() + timeout def SetTimeOverEvent(self, event, *args): self.timeOverEvent = event self.timeOverEventArgs = args def SetTimeOverMsg(self, msg): self.timeOverMsg = msg def OnTimeOver(self): if self.timeOverEvent: apply(self.timeOverEvent, self.timeOverEventArgs) if self.timeOverMsg: chat.AppendChat(chat.CHAT_TYPE_INFO, self.timeOverMsg) def OnUpdate(self): leftTime = max(0, self.endTime - app.GetTime()) self.SetText2(localeInfo.UI_LEFT_TIME % (leftTime)) if leftTime <= 0: self.OnTimeOver() 2.) Open your game.py file and replace each of these three methods to these: def OnMessengerAddFriendQuestion(self, name): messengerAddFriendQuestion = uiCommon.QuestionDialogWithTimeLimit() messengerAddFriendQuestion.SetText1(localeInfo.MESSENGER_DO_YOU_ACCEPT_ADD_FRIEND % (name)) messengerAddFriendQuestion.SetTimeOverMsg(localeInfo.MESSENGER_ADD_FRIEND_ANSWER_TIMEOVER) messengerAddFriendQuestion.SetTimeOverEvent(self.OnDenyAddFriend) messengerAddFriendQuestion.SetAcceptEvent(ui.__mem_func__(self.OnAcceptAddFriend)) messengerAddFriendQuestion.SetCancelEvent(ui.__mem_func__(self.OnDenyAddFriend)) messengerAddFriendQuestion.Open(10) messengerAddFriendQuestion.name = name self.messengerAddFriendQuestion = messengerAddFriendQuestion def RecvPartyInviteQuestion(self, leaderVID, leaderName): partyInviteQuestionDialog = uiCommon.QuestionDialogWithTimeLimit() partyInviteQuestionDialog.SetText1(leaderName + localeInfo.PARTY_DO_YOU_JOIN) partyInviteQuestionDialog.SetTimeOverMsg(localeInfo.PARTY_ANSWER_TIMEOVER) partyInviteQuestionDialog.SetTimeOverEvent(self.AnswerPartyInvite, False) partyInviteQuestionDialog.SetAcceptEvent(lambda arg=True: self.AnswerPartyInvite(arg)) partyInviteQuestionDialog.SetCancelEvent(lambda arg=False: self.AnswerPartyInvite(arg)) partyInviteQuestionDialog.Open(10) partyInviteQuestionDialog.partyLeaderVID = leaderVID self.partyInviteQuestionDialog = partyInviteQuestionDialog def BINARY_OnQuestConfirm(self, msg, timeout, pid): confirmDialog = uiCommon.QuestionDialogWithTimeLimit() confirmDialog.SetText1(msg) confirmDialog.Open(timeout) confirmDialog.SetAcceptEvent(lambda answer=True, pid=pid: m2net.SendQuestConfirmPacket(answer, pid) or self.confirmDialog.Hide()) confirmDialog.SetCancelEvent(lambda answer=False, pid=pid: m2net.SendQuestConfirmPacket(answer, pid) or self.confirmDialog.Hide()) self.confirmDialog = confirmDialog 3.) Open your locale/xy/locale_game.txt and add these if these aren't exists: MESSENGER_ADD_FRIEND_ANSWER_TIMEOVER Friend request was cancelled. PARTY_ANSWER_TIMEOVER Party invite was cancelled. Remove MESSENGER_DO_YOU_ACCEPT_ADD_FRIEND_2 line and change MESSENGER_DO_YOU_ACCEPT_ADD_FRIEND_1 with this: MESSENGER_DO_YOU_ACCEPT_ADD_FRIEND %s added you as a friend, accept? At last take a look at your files and correct the net module calls and the True-False syntax. net <--> m2net, True <--> TRUE
  18. 12 likes
    EDIT: THE MAP IS READY! IF YOU ARE INTERESTED, WRITE ME HERE OR ON SKYPE. Hello everyone! As every bigger festival i make map for easter too! Easter are christians feast, for more people it's feast of spring! So my map will be in the spirit of nature Here is first picture of the map. Size of the map will be probably 4x5, i'm not sure if i make some stone cave part too, but i'll see
  19. 11 likes
    Dear metin2dev community, please don't bother us for taking down the forum for ~2 hours. We wanted to implement some changes which were discussed here. Please excuse that we didn't have time for everything - more changes (eg. changes to our rules) will follow soon. Changes to our sections: Questions & Answers (link) You now have the ability to up-vote answers to every question. The topic creator now can set a "best answer" which will be shown first. All other answers are ordered by their up-votes. Added predefined prefixes "open" & "solved" to show other members the state of your question. Please set them according to your question state. Tech Section (link) We're removing this section completely. As you can see we started with this in this maintenance but because we want to clear everything inside this section and put every topic at its proper place, this will take some more time. You can help us by reporting questions which are still in the remaining sections. But please don't post new stuff there, we created the appropriate sections in the Release Section. Private Servers (link) We removed the ability to receive points on your overall content count. Releases (link) We removed the sub-section "Scripts". Why? Keep reading! As mentioned before, we're removing the Tech Section. In the course of this we added three new sub-sections to the Release Section. General Moved all topics of "Maps", "Hosting" & "Security" to "General" Programming / Scripts Moved all topics of "Scripts" to "Programming". We also had the idea to move "Quests" there, but it will stay where it was/is. Operating Systems Moved all topics of "Linux" and "FreeBSD" of the old Tech Section to the new Section. Notice: We changed the order of the sub-sections and might do this again in the future. The front page We added some blocks to the sidebar so you can see better if there is something new: Rules News We extended the statistics footer with post and topic counts. We now have more languages than english! English Polish Romanian German French Spanish If you want to help us: We need someone which is able to translate our rules to those languages and also some front end strings like our section names and descriptions. Write us a private message if you're interested! Introducing: the Advanced Tags- and Prefixes-System Because we want to improve the forum, we bought the "Advanced Tags & Prefixes" add-on which got installed in this maintenance. With it you now should have a better overview over topics inside a specific section. Also you can easily filter for a specific prefix by clicking on it. We removed to add custom tags in some sections so you're forced to set an appropriate prefix. All prefixes for one section are now shown on the main page of metin2dev - additionally to this the current prefix which is set for a specific topic will be shown next to its name on every page of metin2dev. All changes mentioned here will be done in another maintenance for other sections too. If you want to know more about this add-on please don't hesitate to ask us or visit the plugins' page here. If you encounter any problems/errors after this maintenance please send us a private message so we can fix that. Please also write us if you have any idea to improve this site - or even if you don't like something here. We would be happy to hear from you! Sincerely, the metin2dev administration @.PolluX & @DevChuckNorris
  20. 11 likes
    Hi metin2dev, This semester I have one subject at the university called games design and development, in this subject we use unreal engine and c++. The guides and task are in english/romanian and it teach you of how to be a game developer and how to use unreal engine. I will let for you here the material of my subject and I there are people interested I will keep updating it. If you have any question or you can share your work, you can post here (I will share mine). You can also use unity but I choose unreal, here I let you the folder with the lessons 1 and 2, and one big book, (dont start to read all, read only the tasks asked in the lessons). https://mega.nz/#F!PQ0mzDRa!NJ2ghoEIhUFhUHeCxUbYug You can also find a lot of tutorias in youtube or ask me here, but Im a noob also, Im learning for now.
  21. 11 likes
    At first the people can say "what i do if i have loss my phone." You can't loss your phone if you are doing this. What ever Everyone know this system as Google Authenticatior. This is not only for this. GoogleLastPassFacebookDropbox & SpideroakMicrosoftYahoo! MailAmazon Web Services (AWS)A few mmorpg is use this system for theirself games.Step 1 : - Install libqrencode. This lib provide see QR Code in your SSH terminal. cd /usr/ports/graphics/libqrencode make && make install Step 2 : - Install Google Authenticator. cd /usr/ports/security/pam_google_authenticator make && make install Step 3 : - Download Google Authenticator from Google Play and install that. Step 4 : Write this command in your ssh terminal. Write "y" for each question. You will see QR code. Take that QR Code via your android phone. Google Authenticator is show you that program in google play if you don't have Bardcode scanner. google-authenticator Step 5 : Write this command in your ssh terminal. ee /etc/ssh/sshd_config after find this : #ChallengeResponseAuthentication yes Change via this : ChallengeResponseAuthentication yes Step 6 : Write this command in your ssh terminal again. ee /etc/pam.d/sshd file after add this : auth optional /usr/local/lib/pam_google_authenticator.so ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Step 6.5 : Follow this If you are not sure to loss your phone Write this command in your ssh terminal again. ee /etc/pam.d/sshd file after add this auth requisite /usr/local/lib/pam_google_authenticator.so - What is change? Google authenticator give a few password (Step 2 end). Save them When you are trying to log in again, you should write the code from what google authenticator give for pwd. --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Step 7 : Write this command in your ssh terminal. service sshd reload - How is work this system ? Google authenticator is create new password in 5-10 seconds. They must know this if someone know your password. Screen from my server. €dit 2: If someone want to apply this theirself webpage, here a link for you ASP.NetPHPKind RegardsZerelth ~ Ellie
  22. 10 likes
    Hello everyone! Many people really love my mushroom dungeon and many people asked me for next dungeons. So i've started work on next dungeon - Water dungeon! My work is on the beggining. I just finished 90% of models and effects and now i can start to make very dungeon. I will improve the dungeon with new ambience sounds and better ingame feeling. This is entry of dungeon and first floor.
  23. 10 likes
    hey, today i will share some stone sculptures from my server which i dont really use, so i am going to release it here. screen: download: best regards, dexam
  24. 9 likes
    Are you fucking retarded or what? I can not find other words right now... For moderator: Set some rule for stop requesting of files here. this topic has no meaning if 9/10 posts are still the same reuquests of files...
  25. 8 likes
  26. 8 likes
    New Map ! Updated graphics and HD Textures !
  27. 8 likes
    Hello Developers, because we want to be the best possible experience we have to setup some rules. Please re-read the rules - we've made some changes! Rules §1 Language (1.1) Language The language in this board is english. If you want to post something in your own language always add an english translation. The only exception for this rule is this section: Private Servers (1.2) Behaviour Don't flame at other users. We want this board to be the best possible experience. You maybe want help and everybody started with no or little knowledge. So help and don't flame! Also we don't want to see any racism or sexism. (1.3) Spamming Do not spam in this board. Posting a topic or a question once is enough. If you don't get an answer maybe your question needs more description. Or nobody is able to help you there. Double post aswell as double threads will be punished with an infraction. §2 Topics (2.1) Titles For titles there are the same rules as §1. (2.2) Bumping Allowed bumping times: Services area - 24 hours Q&A - 48 hours Any other bumping will result in an infraction! (2.3) Close/Move/Rename request To make a close/move or rename request please report the topic with the thing you want us to do. Rename request are only allowed by the thread owners (2.4) Content Don't post stuff other made and/or sell stuff others made. No Links to other boards with the same sense as metin2dev allowed. (This include file names and image content also!) No posting (whether to sell or give away for free) anything that involves cheating or stealing from people's clients or servers. It's not allowed to give your/our own skypes in public topics/posts nor signatures, only via pm. The only exception is for people that are trying to sell their services. (2.5) Questions & Answers specific rules Don't modify your thread (or reply to it) to mark it solved, and not explain the solution to the issue. Update: Please use our tag system and vote good/bad answers so everyone can clearly see what matters! (2.6) Services section specific rules You are not allowed to post more than one thread per section inside the services section (which are max. 4). Please post anything you want to sell in the correct section and just edit your posts. Please also mark your offer via tags inside your thread title and with the tag function of this board so possible customers can find what they're searching. Additionally to this you are not allowed to post any thread (and/or offer any content on m2dev) until you've reached 50 posts. Update: If you're registered for at least 1 year you're free to create a service thread without having those 50 posts. Update: Please do not spam senseless posts to reach the required post count or you will be banned! (2.7) Tech section specific rules You are not allowed to post your services or releases in here. We have a release/service section for this. You're free to start any discussion or ask general questions connected to the sections name. Anything which especially is connected to metin2 (questions) goes into Q&A. §3 Account (3.1) Names Names have the same rule as §1.2 (3.2) Multi-Account You are not allowed to create more than one Account. Also if you got a temporary ban. (3.3) VIP You are not able to become a VIP for now. Please don't ask us about this. If this changes we will inform you just in time. §4 Others (4.1) Contacting Team Members Contacting moderators and/or administrators personal (e.g via skype) for anything related to this board (questions, reports, etc) can be punished with an infraction. For reporting we have a report button in every post and for discussion about actions taken contact an administrator via a private message about the problem. Also don't contact any team member because your report wasn't solved in a specific time. We will do our best to solve it as fast as possible so there is no need to spam reports or write a pm within 24 hours the report got submit. (4.2) Scamming Scamming is a bad thing. If you do so on this board you will be banned permanently. Please keep in mind that you are not allowed to report a scam without trustworthy proofs. Sanctions We have some predefined sanctions and the possibility to create a custom one. Every action which is taken by us will have its correctness. But if you think your case was handled in a wrong way you have the possibility to contact an admin via pm. And because we have these predefined sanctions with infraction points i want to inform you about the actions taken by our system. < 3 points - no penalty >= 3 Points - suspended from accessing the site for 5 days >= 5 Points - suspended from accessing the site for 7 days >= 7 Points - suspended from accessing the site for 10 days >= 10 Points - suspended from accessing the site for 14 days 12 Points - suspended from accessing the site indefinitly Please note, that you are not allowed to create any other account while you are temporarily banned (as described in §3.2). If you are banned indefinitely you may create one more account (as a second chance) - but not more. Sincerly, .PolluX and the metin2dev team
  28. 8 likes
    Descarga:MEGA Please leave a "Like" ! ^^
  29. 7 likes
    __________________________________________________________________________________________________________ DownloaD https://mega.nz/#!lEwEQQTC!oxpbafnREClOWYula2MWCfYZvSgsa4kvUaunInkaPUY ScaN https://www.virustotal.com/pl/file/3871bf1c7fdf52d047be2beb9b56c3c1c1aad1afec89b4c0ba53fdf285a120ce/analysis/1484219366/
  30. 7 likes
  31. 7 likes
    Update Item_Proto Struct so you can use the newest item_proto RuskaDev 06.03.2017 Updatet ItemStruct ItemType WeaponSubTypes CostumeSubTypes UseSubTypes ApplyTypes Added MaskType MaskSubType M2-Server Source Files M2-Server\Server-Source\common M2-Server\Server-Source\db M2-Client Source Files M2-Client\Client-Source M2-Tools Last Offical Proto Client To Txt Bin\Proto_ClientToTxt TxT to Client item_proto Bin\Proto_TxtToClient DumpProto Source item_proto.sql masktype -- New masksubtype -- New Download: https://mega.nz/#!31tjxAiB!gAmhwPziHXofRGpk-5hqOdmLVpm60jg25G6WPEhAhQQ Skype: live:ruskadev09
  32. 7 likes
    Hello, the metin2dev administration is thinking about some changes of our rules and the forum itself which will affect all of you - and also may benefit you. First of all i want to give you an overview of our thoughts: the Services Section Sometimes it is a mess for you to reach the 50 posts to post your service. Especially for users which are registered for a long time. That's why we want to change this. One example: If you're reigstered for at least 6 months you are allowed to create a thread in our Services section without having 50 posts. But we keep to review every single thread. the Tech Section Do you think we need this section? Or do you think we can optimize it in any way? We think it isn't necessary to have this section with a lot of sub-sections because most of it isn't in use, it's some kind of dead. Forum languages We are an international forum so our language is english. But what do you think about some more languages? Should we translate the forum frontend into german, romanian, ... ? - this could give us the possibility to have our rules and the frontend in some more languages to help users which are using google translator because they didn't learn english. But keep in mind that we won't allow the use of any other language than english in your posts and threads. Questions and Answers I personally don't like this section because it is a mess. You don't see which thread is answered with an appropriate answer and on the other hand you don't see which still need a good answer. We have two(three) possible solutions for this: Users can ask questions that other users can post answers to. Answers can then be rated by other users and the highest rated answers are shown first. We create a sub-section named "Answered" in which we move all answered questions. A combination of 1. & 2. But before we change any of these things we would like to hear your opinion. Maybe you also have an idea/advice to tell us? Any concerns? Take part in this discussion! Sincerly, the metin2dev administration
  33. 6 likes
    This topic is not file request thread, please stop it. Everything* is public from the official client. 17.0.7 whole unpacked client: https://metin2dev.org/board/index.php?/topic/3541-official-unpacked-updates-metin2de/&do=findComment&comment=84202 17.0.12 whole unpacked client: https://metin2dev.org/board/index.php?/topic/3541-official-unpacked-updates-metin2de/&do=findComment&comment=86090 17.1 updates only: https://metin2dev.org/board/index.php?/topic/3541-official-unpacked-updates-metin2de/&do=findComment&comment=86516
  34. 6 likes
  35. 6 likes
    Re-upload on MEGA: Metin2 - Germany locale.rar Have fun, cheers!
  36. 6 likes
    Hi, i looked at some old stuff what i have in my computer...I found a lot of things what i've never used.. There is one old map for santhia, i won't use it anymore, so I hope someone from you use it. In pack is map and a some new objects for your maps. For map like desert.... Property are in pack too. WE screens: Click here for download PS: This topic is maybe better for Maps forum, but i want you download this from my web... If some admin can re-move it, i'll be glad. Thanks
  37. 5 likes
    Hello everybody, I don't know if it's already been suggested or treated, but I think a canva will be better for Q&A. For the poster as well as the people going to help him. Currently, it tends to be boring to see people posting "I have a bug !" without giving any details (even if the bug is something which has been solved 40 times in the past) and then see them come back here saying "Hurr durr no one helped me #fixed" without giving any solutions. Also, the lack of courtesy is noticeable. (No hello, no thank you). Indeed, this is easy to tell that the community is selfish or not skilled enough. But the real problem is that we can't really help someone if we didn't have any clue about the problem because only the bug is showed, without any details or logs. I think, as for me, that the basic thing to do before publishing our subject is to do a lot of researches. There's a bunch of posts out here, even more on some specifics forums, sometimes, just searching the bug on google will help you to find how to resolve it. My idea consist in creating a canva which will help everyone. Indeed, we did the test on a French forum and it's easier for everyone as soon as they respect the canva. What's more, if they post a request it means that they agree with some kind of rules (like Q&A rules), even though this is optionnal, it could be a plus. Here's a canva example if anyone think it's a good idea : https://pastebin.com/GW451bxz What do you think about it, folks ?
  38. 5 likes
    Hi guys . Halloween is nearly here so let's keep up with it . Here it is a fun release of mine with a short tut for beginners . Let's start ! Download Files : https://mega.nz/#!9gdDBAyB!fBIhjIdNMJZUu_sZHPMLA_FW2pyyT288kBS_5z2NgdE
  39. 5 likes
    Hi all im Djx and today I will show you my latest set of weapons made in 2014 Christmas Set Photo : Here Video : https://www.youtube.com/watch?v=6bqUsCCnX9k Download 1 : https://mega.co.nz/#!k8s2zLSD!f3-CkP7o31gNgbd9EjpusS7v9fe4Phw_5-LImFa_uPI Download 2 : http://djxm2m.com/ChrismassSetByDjx.rar Download 3 : http://www15.zippyshare.com/v/23636377/file.html La password è : https://www.youtube.com/Djxm2m
  40. 5 likes
  41. 5 likes
    Initialization; #include "LauncherCheck.h" #pragma comment(lib, "LauncherCheck.lib") using namespace LauncherCheck; Encryption example (You should use from your launcher process); if (false == CLauncherCheck::ProcessEncryption("YOUR_SUPER_SECRET_KEY")) { printf("Encryption fail! Error code: %d", CLauncherCheck::GetErrorCode()); return; /* Error, exit or what do you want. */ } Decryption example (You should use from game client process); if (false == CLauncherCheck::ProcessDecryption("YOUR_SUPER_SECRET_KEY")) { printf("Decryption fail! Error code: %d", CLauncherCheck::GetErrorCode()); return; /* Error, exit or what do you want. */ } The lib file is compatible with Visual studio 2015. https://mega.nz/#!wdgmnbQR!Aql-9VEObUuylXmLPArFNPb0tXuN2-ziPiPImXsFtVE
  42. 5 likes
    Hey, I have made a small function that will enable you to use an unlimited amount of arguments in server source code. For example look at the function do_item in cmd_gm.cpp, it gets 2 arguments : arg1 and arg2. Using my function you will be able to have as many arguments easier and in more convenient way. That means you can have 5,7 or even 20 arguments. Let's begin: Open utils.cpp and look for #include "stdafx.h" add below the following: #include <boost/algorithm/string/classification.hpp> // Include boost::for is_any_of #include <boost/algorithm/string/split.hpp> look for const char *first_cmd add above: void split_argument(const char *argument, std::vector<std::string> & vecArgs) { std::string arg = argument; boost::split(vecArgs, arg, boost::is_any_of(" "), boost::token_compress_on); } open utils.h and look for const char * first_cmd add above: extern void split_argument(const char *argument, std::vector<std::string> & vecArgs); That's all. How to use? Let's look for example in ACMD(do_item) method: Instead of char arg1[256], arg2[256]; two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2)); you can replace with: std::vector<std::string> vecArgs; split_argument(argument,vecArgs); And now you can access any of the arguments starting from index of 1. so for example if you type ingame the command /item 6001 10 vecArgs[1] is 6001 vecArgs[2] is 10 if you need to convert it to number, you can use as example: int iCount = 0; str_to_number(iCount, vecArgs[2].c_str()); If you need any assistance, write here a reply and ill do my best in helping you. Enjoy
  43. 5 likes
    clang-devel should be installed just via ports. It should work in FreeBSD < 10. c++14 needs the newer clang version. If you're on one of the older compilers like gcc 4.2 it most likely won't work. Also you need devel/libc++ and devel/libcxxrt To build you then only need security/googletest, security/cryptopp, graphics/devil (only jpg needed, all else is not needed), devel/gmake, devel/makedepend and database/mariadb101-client (or any other mysql client for the lib). These are all the dependencies. I've gathered them together into a list. Note that every additional port should be compiled with clang instead of gcc! You cannot use gcc-compiled libs in a clang-project. First install: - lang/clang-devel (you don't need to use the devel-version of clang, you can just install one of the most recent versions) - devel/libc++ - devel/libcxxrt - devel/gmake (should already be installed by one of the ports above) - devel/makedepend And then add the following to /etc/make.conf: CC = clang-devel CPP = clang-cpp-devel CXX = clang++-devel CFLAGS += -stdlib=libc++ After that you can start installing the dependencies: - security/googletest - security/cryptopp - graphics/devil (note: Only jpg needed) - databases/mariadb101-client (no server needed, only the client. You can also use mysql if you wish to, we only need the client lib) If everything is installed, make sure you rebuild the Depend-File. For this you can just cd into the source directory and remove it. Then you can just execute the following command: gmake depend After that you'll have everything you need. You can build the sources. gmake debug|release|all Note that you can either choose to compile debug, release or all. You can also use install if you specified a path in your Makefile. This way the created binary will be pushed into a directory once it's finished.
  44. 5 likes
    Open Locale_inc.h Add this if you dont have add: #define ENABLE_DRAGON_SOUL_SYSTEM #define ENABLE_NEW_EQUIPMENT_SYSTEM and compile again, and extract locale_xxlocalexxuiopen inventorywindow.py and find EQUIPMENT_RING1 and EQUIPMENT_RING2 and add ## Like this: ## »υ ΉέΑφ1 # {"index":item.EQUIPMENT_RING1, "x":2, "y":106, "width":32, "height":32}, ## »υ ΉέΑφ2 # {"index":item.EQUIPMENT_RING2, "x":75, "y":106, "width":32, "height":32}, ## »υ Ί§Ζ® and pack again locale.
  45. 4 likes
    New weapons set for free! Pack has: gr2 and icons Download page: Click Here Give me like for support!
  46. 4 likes
    I evaluated some possibilites. My favorite idea is to provide a new platform (e.g. under up.metin2dev.org) which uses the forum accounts. You can upload to it any files you want to and every user gets 5GB of space (except blue rank users who get 50GB of space). Every file will then be stored in an OpenStack Object Storage. This will be okay for the price, also I will implement then a donation button for this platform. For make the costs a little bit more transparent I can say that this will costs me 1 cent / GB / month for storage and 1 cent / GB download traffic. Is this a good idea?
  47. 4 likes
    Hey guyz, I just made a regen creator. Here's a how to use GIF: Download (EN and HU version too): metin2_regen_creator_by_distraught_EN.exe metin2_regen_creator_by_distraught_HU.exe
  48. 4 likes
    Sup metin2dev, got a pet for u which I ripped a few months ago, hope u'll like it. 2x run & 2 wait animations: enjoy, byee
  49. 4 likes
    Let's start to learn minimal c++ knowledge or use the google.
  50. 4 likes
    Hello everyone, today I present my first release. I called "AbysS" It's a design of a presentation for a hypothetical metin2 server. Inside the archive you will find the .PSD files complete with everything, ready to be modified and to be adapted to your needs. I hope you enjoy it. Sorry for errors in translation from Italian to English. -Thedanielx32 Screenshot Download