• Content count

  • Joined

  • Last visited

metin2-factory last won the day on December 15 2016

metin2-factory had the most liked content!

Community Reputation

93 Excellent

1 Follower

About metin2-factory

  • Rank

Profile Information

  • Gender

Recent Profile Visitors

1,357 profile views
  1. Topic has been updated.
  2. Hey, Today i will make a small guide how to enable refinement scroll to be stackable. This will enable you to stack any refinement scroll such as blessing scroll, magic metal etc. Before we start diving into the source code, make sure to look into item_proto and check that there isn't any ANTI_STACK flag and the item is defined as ITEM_STACKABLE. Client side: Open Search for: def __DropSrcItemToDestItemInInventory(self, srcItemVID, srcItemSlotPos, dstItemSlotPos): if srcItemSlotPos == dstItemSlotPos: return if item.IsRefineScroll(srcItemVID): Replace with: def __DropSrcItemToDestItemInInventory(self, srcItemVID, srcItemSlotPos, dstItemSlotPos): if srcItemSlotPos == dstItemSlotPos: return if item.IsRefineScroll(srcItemVID): if player.GetItemIndex(srcItemSlotPos) == player.GetItemIndex(dstItemSlotPos): self.__SendMoveItemPacket(srcItemSlotPos, dstItemSlotPos,0) else: self.RefineItem(srcItemSlotPos, dstItemSlotPos) self.wndItem.SetUseMode(FALSE) Search for: if item.IsRefineScroll(srcItemVNum): if player.REFINE_OK == player.CanRefine(srcItemVNum, dstSlotPos) Replace with: if item.IsRefineScroll(srcItemVNum): if player.REFINE_OK == player.CanRefine(srcItemVNum, dstSlotPos) or player.GetItemIndex(dstSlotPos) == srcItemVNum: That's all, Enjoy!
  3. 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
  4. Great work, looking forward for your next creation
  5. Looking for working server/client side protection against hacks such m2 bob or similar hacks. Paying via paypal/pay safe card. Send me a pm with your skype info.
  6. Hi, I'v been working on a small tool since last week that helps,make it faster and easier to modify & add new item names/icons into item_names/item_list files. It is now finished, and i'd like to share it with the community and get feedback from you for any bugs you have encountered. What can you do with this program? Add item name record into item_name(example screen shot below). Add item record into item_list(example screen shot below). Save logs of every action made. Once insert item button has been clicked,it has a check if an item vnum already exist, if so, nothing happens. ** By having a log file that stores info of every of your action by the tool, you can track your last changes with the exact date and time. this is pretty useful i can say. Example of inserting new item name: Example of inserting new item icon: Log file: ############################ Author: © Metin2 Factory Date: 09/02/2017 ############################ This application will allow you to easily add new item names/icons. How to use: 1.Open the file metin2_file_editor.exe 2.Click on browse and select one of the following files: a.item_names.txt b.item_list.txt Type the vnum of the new item and fill the rest of the fields. Enjoy! Please, like this topic if you find it useful. Metin2 File Editor.rar
  7. open char_skill.cpp look for: case SKILL_NORMAL: add below: if (GetSkillLevel(pkSk->dwVnum) == 10) { SetSkillLevel(pkSk->dwVnum, 20); } You can change 10 to the level you wish it to change to m.
  8. @tierrilopes Atleast if you give an answer, give a proper one. Anyway, open input_login.cpp, look for : add below:
  9. Does it happen only with you move an item that its size is 3 slots?(like the weapon you show). If so, try the following: look for if (busy) { busy->RemoveFromCharacter(); busy->AddToCharacter(this, TItemPos(INVENTORY, bCell1 + (5 * i))); } } add below (if item1->GetSize() == 3) bDestCell -= 5;
  10. What do you think?
  11. Look for: void CNewPetActor::ItemCubeFeed() below if (!itemxp) return; add: if (itemxp->IsEquipped()) return;
  12. There are 2 ways you can modify it. Open item_attribute.cpp look for: int nAttrLevel = 5; First way(totally random): int nAttrLevel = number(1, 6); // Randomize attribute level from 1 to 5 Second way(less random): int randomChance = number(0, 100); if (randomChance < 20) // 20% Chance to get max lvl attr nAttrLevel = 5; else if (randomChance < 50) // 30% chance to get max lvl attr nAttrLevel = 4; .... // etc..
  13. in input_main.cpp look for: if (pkItem->GetCell() >= INVENTORY_MAX_NUM && IS_SET(pkItem->GetFlag(), ITEM_FLAG_IRREMOVABLE)) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<â°í> â°í·Î ¿Å±æ ¼ö ¾ø´Â ¾ÆÀÌÅÛ ÀÔ´Ï´Ù.")); return; } Add below: if (pkItem->IsEquipped()) { ch->ChatPacket(CHAT_TYPE_INFO, "You must first unequip this item."); return; }
  14. Open input_main.cpp Look for: if (ch->IsGM()) bType = (bType & 0xF0) | WHISPER_TYPE_GM; Change to: if (ch->IsGM() && (ch->IsAffectFlag(AFF_STAFF_GA) || ch->IsAffectFlag(AFF_STAFF_SGM))) bType = (bType & 0xF0) | WHISPER_TYPE_GM;
  15. in block_item.cpp modify these 2 functions