Search the Community

Showing results for tags 'tutorial'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Community
    • Announcements
    • Feedback
  • Metin2
    • General
    • Questions and Answers
    • Frequently Asked Questions
    • Guides & HowTo
    • Design
    • Private Servers
    • Services
    • Videos
  • Releases
    • General
    • Tools
    • Programming / Scripts
    • Quests
    • Binaries & Clients/Serverfiles
    • 3D Models
    • 2D Graphics
    • Operating Systems
  • Safe Zone
    • Offtopic
    • Games Talk
    • Music/Videos/Art
  • D:\YMIR WORK\'s Topics

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Website URL


Discord


Skype


ICQ


Yahoo


Location

Found 10 results

  1. masodikbela

    [C++]Expand maximum level

    Hi there Devs, I have published a tutorial yesterday on a Hungarian forum, and I decided to share it here, too. So... I chose int type for the level variables (originally its unsigned char) because: its more than enough maximum level 2147483647the damage done by the characters (and much more thing) is calculated via they levels, and the type of this variables is intThis is why I recommend to use int type game/src char.cpp Search this: void CHARACTER::SetLevel(BYTE level)Then replace to this: void CHARACTER::SetLevel(int level)char.h Search this: void SetLevel(BYTE level);Then replace to this: void SetLevel(int level);Then search: BYTE level; (its under this: typedef struct character_point) And replace to this: int level;party.cpp Search this one: void CParty::P2PSetMemberLevel(DWORD pid, BYTE level)Then replace to this: void CParty::P2PSetMemberLevel(DWORD pid, int level)Then replace this: BYTE CParty::GetMemberMaxLevel() { BYTE bMax = 0;To this: int CParty::GetMemberMaxLevel() { int bMax = 0;Find this one: BYTE CParty::GetMemberMinLevel() { BYTE bMin = PLAYER_MAX_LEVEL_CONST;And replace to this: int CParty::GetMemberMinLevel() { int bMin = PLAYER_MAX_LEVEL_CONST;And then this: void CParty::RequestSetMemberLevel(DWORD pid, BYTE level)To this: void CParty::RequestSetMemberLevel(DWORD pid, int level)party.h Search this: BYTE bLevel; (its under typedef struct SMember)And replace to this: int bLevel;Then this ones: BYTE GetMemberMaxLevel(); BYTE GetMemberMinLevel();To this: int GetMemberMaxLevel(); int GetMemberMinLevel();And these: void RequestSetMemberLevel(DWORD pid, BYTE level); void P2PSetMemberLevel(DWORD pid, BYTE level);To: void RequestSetMemberLevel(DWORD pid, int level); void P2PSetMemberLevel(DWORD pid, int level);char_battle.cpp Find: struct FPartyTotaler { int total;And replace to: struct FPartyTotaler { long total;And this: struct FPartyDistributor { int total; LPCHARACTER c; int x, y; DWORD _iExp; int m_iMode; int m_iMemberCount; FPartyDistributor(LPCHARACTER center, int member_count, int total, DWORD iExp, int iMode) To this: struct FPartyDistributor { long total; LPCHARACTER c; int x, y; DWORD _iExp; int m_iMode; int m_iMemberCount; FPartyDistributor(LPCHARACTER center, int member_count, long total, DWORD iExp, int iMode) config.h Find this: extern BYTE PK_PROTECT_LEVEL;And replace to this: extern int PK_PROTECT_LEVEL;locale_service.cpp Change: BYTE PK_PROTECT_LEVELTo this: int PK_PROTECT_LEVELconstants.cpp Well, here you should decide how much is the maximum level you want. You should fill these tables with as much records, as the maximum level. (e.g if you want to have maximum level 300, you need to put 300 records to these tables) const DWORD exp_table_euckr[PLAYER_EXP_TABLE_MAX + 1] const DWORD exp_table_common[PLAYER_EXP_TABLE_MAX + 1] const DWORD exp_table_newcibn[PLAYER_EXP_TABLE_MAX + 1 ] const DWORD party_exp_distribute_table[PLAYER_MAX_LEVEL_CONST + 1] const int aiExpLossPercents[PLAYER_EXP_TABLE_MAX + 1]log.h Edit this: void LoginLog(bool isLogin, DWORD dwAccountID, DWORD dwPID, BYTE bLevel, BYTE bJob, DWORD dwPlayTime);To this: void LoginLog(bool isLogin, DWORD dwAccountID, DWORD dwPID, int bLevel, BYTE bJob, DWORD dwPlayTime);log.cpp Replace this: void LogManager::LoginLog(bool isLogin, DWORD dwAccountID, DWORD dwPID, BYTE bLevel, BYTE bJob, DWORD dwPlayTime)To this: void LogManager::LoginLog(bool isLogin, DWORD dwAccountID, DWORD dwPID, int bLevel, BYTE bJob, DWORD dwPlayTime)guild.h Replace this: typedef struct SGuildMemberPacketData { DWORD pid; BYTE grade; BYTE is_general; BYTE job; BYTE level; DWORD offer; BYTE name_flag; char name[CHARACTER_NAME_MAX_LEN+1]; } TGuildMemberPacketData;To this: typedef struct SGuildMemberPacketData { DWORD pid; BYTE byGrade; BYTE byIsGeneral; BYTE byJob; int byLevel; DWORD dwOffer; BYTE byNameFlag; } TGuildMemberPacketData;Then this: void ChangeMemberData(DWORD pid, DWORD offer, BYTE level, BYTE grade);To this: void ChangeMemberData(DWORD pid, DWORD offer, int level, BYTE grade);Then SGuildMember(DWORD pid, BYTE grade, BYTE is_general, BYTE job, BYTE level, DWORD offer_exp, char* name);To this: SGuildMember(DWORD pid, BYTE grade, BYTE is_general, BYTE job, int level, DWORD offer_exp, char* name);And this: DWORD pid; // player Ĺ×ŔĚşíŔÇ id; primary key BYTE grade; // ±ćµĺ»óŔÇ ÇĂ·ąŔĚľîŔÇ °č±Ţ 1 to 15 (1ŔĚ ÂŻ) BYTE is_general; BYTE job; BYTE level; DWORD offer_exp; // °řÇĺÇŃ °ćÇčġ BYTE _dummy;To this: DWORD pid; // player Ĺ×ŔĚşíŔÇ id; primary key BYTE grade; // ±ćµĺ»óŔÇ ÇĂ·ąŔĚľîŔÇ °č±Ţ 1 to 15 (1ŔĚ ÂŻ) BYTE is_general; BYTE job; int level; DWORD offer_exp; // °řÇĺÇŃ °ćÇčġ BYTE _dummy; And then this: void LevelChange(DWORD pid, BYTE level);To this: void LevelChange(DWORD pid, int level);guild.cpp Find this: BYTE level = (BYTE)strtoul(row[4], (char**) NULL, 10);Replace to this: int level = (int)strtoul(row[4], (char**) NULL, 10); Then this: sys_log(0, "GUILD: AddMember PID %u, grade %u, job %u, level %u, offer %u, name %s ptr %p",To this: sys_log(0, "GUILD: AddMember PID %u, grade %u, job %u, level %d, offer %u, name %s ptr %p",Then replace the whole function: void CGuild::ChangeMemberData(DWORD pid, DWORD offer, BYTE level, BYTE grade)To this: void CGuild::ChangeMemberData(DWORD pid, DWORD offer, int level, BYTE grade) { TGuildMemberContainer::iterator cit = m_member.find(pid); if (cit == m_member.end()) return; cit->second.offer_exp = offer; cit->second.level = level; cit->second.grade = grade; cit->second._dummy = 0; TPacketGCGuild pack; TGuildMemberPacketData mbData; pack.header = HEADER_GC_GUILD; pack.subheader = GUILD_SUBHEADER_GC_LIST; pack.size = sizeof(TPacketGCGuild); pack.size += sizeof(TGuildMemberPacketData); for (TGuildMemberOnlineContainer::iterator it = m_memberOnline.begin(); it != m_memberOnline.end(); ++it) { LPDESC d = (*it)->GetDesc(); if (d) { TEMP_BUFFER buf; buf.write(&pack, sizeof(pack)); mbData.byNameFlag = 0; mbData.byGrade = cit->second.grade; mbData.byIsGeneral = cit->second.is_general; mbData.byJob = cit->second.job; mbData.byLevel = cit->second.level; mbData.dwOffer = cit->second.offer_exp; mbData.pid = cit->second.pid; buf.write(&mbData, sizeof(TGuildMemberPacketData)); d->Packet(buf.read_peek(), buf.size()); } } }And replace this function too: void CGuild::LevelChange(DWORD pid, BYTE level)To this: void CGuild::LevelChange(DWORD pid, int level) { TGuildMemberContainer::iterator cit = m_member.find(pid); if (cit == m_member.end()) return; cit->second.level = level; TPacketGuildChangeMemberData gd_guild; gd_guild.guild_id = GetID(); gd_guild.pid = pid; gd_guild.offer = cit->second.offer_exp; gd_guild.grade = cit->second.grade; gd_guild.level = level; db_clientdesc->DBPacket(HEADER_GD_GUILD_CHANGE_MEMBER_DATA, 0, &gd_guild, sizeof(gd_guild)); TPacketGCGuild pack; TGuildMemberPacketData mbData; pack.header = HEADER_GC_GUILD; pack.subheader = GUILD_SUBHEADER_GC_LIST; pack.size = sizeof(TPacketGCGuild); pack.size += sizeof(TGuildMemberPacketData); cit->second._dummy = 0; for (TGuildMemberOnlineContainer::iterator it = m_memberOnline.begin(); it != m_memberOnline.end(); ++it) { LPDESC d = (*it)->GetDesc(); if (d) { TEMP_BUFFER buf; buf.write(&pack, sizeof(pack)); mbData.byNameFlag = 0; mbData.byGrade = cit->second.grade; mbData.byIsGeneral = cit->second.is_general; mbData.byJob = cit->second.job; mbData.byLevel = cit->second.level; mbData.dwOffer = cit->second.offer_exp; mbData.pid = cit->second.pid; buf.write(&mbData, sizeof(TGuildMemberPacketData)); d->Packet(buf.read_peek(), buf.size()); } } }Then this function: bool CGuild::OfferExp(LPCHARACTER ch, int amount)To this: bool CGuild::OfferExp(LPCHARACTER ch, int amount) { TGuildMemberContainer::iterator cit = m_member.find(ch->GetPlayerID()); if (cit == m_member.end()) return false; if (m_data.exp+amount < m_data.exp) return false; if (amount < 0) return false; if (ch->GetExp() < (DWORD) amount) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±ćµĺ> Á¦°řÇĎ°íŔÚ ÇĎ´Â °ćÇčġ°ˇ ł˛Ŕş °ćÇčġş¸´Ů ¸ą˝Ŕ´Ď´Ů.")); return false; } if (ch->GetExp() - (DWORD) amount > ch->GetExp()) { sys_err("Wrong guild offer amount %d by %s[%u]", amount, ch->GetName(), ch->GetPlayerID()); return false; } ch->PointChange(POINT_EXP, -amount); TPacketGuildExpUpdate guild_exp; guild_exp.guild_id = GetID(); guild_exp.amount = amount / 100; db_clientdesc->DBPacket(HEADER_GD_GUILD_EXP_UPDATE, 0, &guild_exp, sizeof(guild_exp)); GuildPointChange(POINT_EXP, amount / 100, true); cit->second.offer_exp += amount / 100; cit->second._dummy = 0; TPacketGCGuild pack; TGuildMemberPacketData mbData; pack.header = HEADER_GC_GUILD; pack.subheader = GUILD_SUBHEADER_GC_LIST; pack.size = sizeof(TPacketGCGuild); pack.size += sizeof(TGuildMemberPacketData); for (TGuildMemberOnlineContainer::iterator it = m_memberOnline.begin(); it != m_memberOnline.end(); ++it) { LPDESC d = (*it)->GetDesc(); if (d) { TEMP_BUFFER buf; buf.write(&pack, sizeof(pack)); mbData.byNameFlag = 0; mbData.byGrade = cit->second.grade; mbData.byIsGeneral = cit->second.is_general; mbData.byJob = cit->second.job; mbData.byLevel = cit->second.level; mbData.dwOffer = cit->second.offer_exp; mbData.pid = cit->second.pid; buf.write(&mbData, sizeof(TGuildMemberPacketData)); d->Packet(buf.read_peek(), buf.size()); } } SaveMember(ch->GetPlayerID()); TPacketGuildChangeMemberData gd_guild; gd_guild.guild_id = GetID(); gd_guild.pid = ch->GetPlayerID(); gd_guild.offer = cit->second.offer_exp; gd_guild.level = ch->GetLevel(); gd_guild.grade = cit->second.grade; db_clientdesc->DBPacket(HEADER_GD_GUILD_CHANGE_MEMBER_DATA, 0, &gd_guild, sizeof(gd_guild)); return true; }And this function: void CGuild::SendListPacket(LPCHARACTER ch)To this: void CGuild::SendListPacket(LPCHARACTER ch) { /* List Packet Header Count (byte) [ ... name_flag 1 - Ŕ̸§Ŕ» ş¸ł»´ŔłÄ ľČş¸ł»´ŔłÄ name CHARACTER_NAME_MAX_LEN+1 ] * Count */ LPDESC d; if (!(d=ch->GetDesc())) return; TPacketGCGuild pack; pack.header = HEADER_GC_GUILD; pack.size = sizeof(TPacketGCGuild); pack.subheader = GUILD_SUBHEADER_GC_LIST; pack.size += sizeof(TGuildMemberPacketData) * m_member.size(); pack.size += (CHARACTER_NAME_MAX_LEN + 1) * m_member.size(); TEMP_BUFFER buf; TGuildMemberPacketData mbData; buf.write(&pack,sizeof(pack)); char c[CHARACTER_NAME_MAX_LEN+1]; for (TGuildMemberContainer::iterator it = m_member.begin(); it != m_member.end(); ++it) { it->second._dummy = 1; mbData.byNameFlag = 1; mbData.byGrade = it->second.grade; mbData.byIsGeneral = it->second.is_general; mbData.byJob = it->second.job; mbData.byLevel = it->second.level; mbData.dwOffer = it->second.offer_exp; mbData.pid = it->second.pid; buf.write(&mbData, sizeof(TGuildMemberPacketData)); strlcpy(c, it->second.name.c_str(), MIN(sizeof(c), it->second.name.length() + 1)); buf.write(c, CHARACTER_NAME_MAX_LEN+1 ); if ( test_server ) sys_log(0 ,"name %s job %d ", it->second.name.c_str(), it->second.job ); } d->Packet(buf.read_peek(), buf.size()); for (TGuildMemberOnlineContainer::iterator it = m_memberOnline.begin(); it != m_memberOnline.end(); ++it) { SendLoginPacket(ch, *it); } for (TGuildMemberP2POnlineContainer::iterator it = m_memberP2POnline.begin(); it != m_memberP2POnline.end(); ++it) { SendLoginPacket(ch, *it); } }Then this function: void CGuild::SendListOneToAll(DWORD pid)To this: void CGuild::SendListOneToAll(DWORD pid) { TPacketGCGuild pack; pack.header = HEADER_GC_GUILD; pack.size = sizeof(TPacketGCGuild); pack.subheader = GUILD_SUBHEADER_GC_LIST; pack.size += sizeof(TGuildMemberPacketData); TGuildMemberPacketData mbData; char c[CHARACTER_NAME_MAX_LEN+1]; memset(c, 0, sizeof(c)); TGuildMemberContainer::iterator cit = m_member.find(pid); if (cit == m_member.end()) return; for (TGuildMemberOnlineContainer::iterator it = m_memberOnline.begin(); it!= m_memberOnline.end(); ++it) { LPDESC d = (*it)->GetDesc(); if (!d) continue; TEMP_BUFFER buf; buf.write(&pack, sizeof(pack)); cit->second._dummy = 1; mbData.byNameFlag = 1; mbData.byGrade = cit->second.grade; mbData.byIsGeneral = cit->second.is_general; mbData.byJob = cit->second.job; mbData.byLevel = cit->second.level; mbData.dwOffer = cit->second.offer_exp; mbData.pid = cit->second.pid; //buf.write(&(cit->second), sizeof(DWORD) * 3 +1); buf.write(&mbData, sizeof(TGuildMemberPacketData)); buf.write(cit->second.name.c_str(), cit->second.name.length()); buf.write(c, CHARACTER_NAME_MAX_LEN + 1 - cit->second.name.length()); d->Packet(buf.read_peek(), buf.size()); } }Then find this: SGuildMember::SGuildMember(DWORD pid, BYTE grade, BYTE is_general, BYTE job, BYTE level, DWORD offer_exp, char* name)And replace to this: SGuildMember::SGuildMember(DWORD pid, BYTE grade, BYTE is_general, BYTE job, int level, DWORD offer_exp, char* name)common tables.h Find this: BYTE byLevel;Replace to this: int byLevel;Then this: BYTE level;To this: int level;And this: BYTE level;To this: int level;Then this: BYTE bLevel;(under typedef struct SPacketPartySetMemberLevel) To this: int bLevel;And then this: BYTE bLevel;(under typedef struct SPacketDGGuildMember) To this: int bLevel;lenght.h Then here set the maximum level: PLAYER_EXP_TABLE_MAX = 120, PLAYER_MAX_LEVEL_CONST = 120,db/src ClientManager.h Find this: struct TPartyInfo { BYTE bRole; BYTE bLevel;Replace to this: struct TPartyInfo { BYTE bRole; int bLevel;ClientManager.cpp Search this: pkPeer->Encode(&it_member->second.bLevel, sizeof(BYTE));(its in the void CClientManager::SendPartyOnSetup(CPeer* pkPeer) function) and replace with this: pkPeer->Encode(&it_member->second.bLevel, sizeof(int));ClientManagerPlayer.cpp Find this: "PLAYER_DELETE FAILED LEVEL %u >= DELETE LIMIT %d"Then replace to this: "PLAYER_DELETE FAILED LEVEL %d >= DELETE LIMIT %d"And find this: "PLAYER_DELETE FAILED LEVEL %u >= DELETE LIMIT %d"You will find it 2 times, replace both to this: "PLAYER_DELETE FAILED LEVEL %d >= DELETE LIMIT %d"client packet.h Find this: BYTE byLevel;Then replace to this: int byLevel;And this: BYTE byLevel;To this: int byLevel;PythonGuild.h Find this: BYTE byLevel;And replace to this: int byLevel;And finally, edit the level colum in the player table in the player database. Set its type from tinyint to smallint (or int, it depends how high is the maximum level) and expand its size to 3 (or higher). And then, here you are I also made a video while I made this, if you have free 42 minute, maybe worth to watch it (if you do, you are my guest for a beer (or something liquid :D)) https://www.youtube.com/embed/NTN5mwEeEv8 If you have question(s)/problem(s)/remark(s), feel free to post it here, or send me a PM. Have a nice day, ~masodikbela
  2. Hi! How to install item_proto? I just do not see the texture of the gun,Icon and texture bug. Sorry no speak English! Thanks! Example link weapons:
  3. Hello, I will present my YouTube Channel. You can find more tutorials for Metin2 Server and Client. Url Channel: https://www.youtube.com/channel/UCWjieJ4HU_gyB_cYTLA6Qjw Playlist [How To]: https://www.youtube.com/watch?v=rof50j7gRuc&list=PLo-E8JKC-GAzoo7YiMkyU7JWElG_oHw18 Example: #1 How to build source metin2 (db, game, binary) #9 How to apply Diff on game / db (ServerFiles Metin2) And more on youtube. If you want other tutorials I can make.
  4. Mind Rapist

    Searching for small client tut

    Hello devs and merry christmas Today Im looking for a small tut kinda like the Non-tradable items effect system (on this board) but a little different. I want to make the item's slot red when somebody adds it into the trade window you know make it unusable for the rest of the trade because its already in the trade and I want to do that with the private shop building as well with the items that the player already put on the shop window for sale. Just like the official effect. If there is a tut like this please share the link here thank you so much guys
  5. Hi guys, Before then I start I must say: It isn't release and it isn't my own tutorial, I'm not official author. I only translated this tutorial. Open root/constInfo.py and then paste under "CONSOLE_ENABLE = 0" this: GM_MARK = 0 Next open game.py and search: def OnUpdate(self): app.UpdateGame() and paste under that: gmlogosys = player.GetName() gmlogosys2 = guild.GetGuildName() then search: self.interface.BUILD_OnUpdate() and paste this above: if gmlogosys.find("[KRAL]")!=-1 and constInfo.GM_MARK == 0: constInfo.GM_MARK = 1 net.SendChatPacket("(kral_lonca_live)") if gmlogosys.find("[KRAL]")!=-1 and constInfo.GM_MARK == 0: constInfo.GM_MARK = 1 net.SendChatPacket("(kral_live)") if gmlogosys.find("[VIP]")!=-1 and constInfo.GM_MARK == 0: constInfo.GM_MARK = 1 net.SendChatPacket("(vip_live)") if gmlogosys.find("[AVCI]")!=-1 and constInfo.GM_MARK == 0: constInfo.GM_MARK = 1 net.SendChatPacket("(avci_live)") if gmlogosys.find("[PRENSES]")!=-1 and constInfo.GM_MARK == 0: constInfo.GM_MARK = 1 net.SendChatPacket("(prenses_live)") if gmlogosys.find("[KRALICE]")!=-1 and constInfo.GM_MARK == 0: constInfo.GM_MARK = 1 net.SendChatPacket("(kralice_live)") if gmlogosys.find("[GA]Athena")!=-1 and constInfo.GM_MARK == 0: constInfo.GM_MARK = 1 net.SendChatPacket("(juliet_pma)") if gmlogosys.find("[PRENS]")!=-1 and constInfo.GM_MARK == 0: constInfo.GM_MARK = 1 net.SendChatPacket("(prens_live)") if gmlogosys.find("[GA]Leonardo")!=-1 and constInfo.GM_MARK == 0: constInfo.GM_MARK = 1 net.SendChatPacket("(leonardo_gameadmin)") Open root/uisystem.py then search: def __ClickChangeCharacterButton(self): and paste under that: constInfo.GM_MARK = 0 Open root/playersettingmodule.py then search: (fish) and paste under that: #SYSTEM chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+12, "", EmoticonStr+"kral_lonca.mse") net.RegisterEmoticonString("(kral_lonca_live)") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+13, "", EmoticonStr+"kral.mse") net.RegisterEmoticonString("(kral_live)") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+14, "", EmoticonStr+"vip.mse") net.RegisterEmoticonString("(vip_live)") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+15, "", EmoticonStr+"avc.mse") net.RegisterEmoticonString("(avci_live)") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+16, "", EmoticonStr+"prenses.mse") net.RegisterEmoticonString("(prenses_live)") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+17, "", EmoticonStr+"kralice.mse") net.RegisterEmoticonString("(kralice_live)") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+18, "", EmoticonStr+"juliet.mse") net.RegisterEmoticonString("(juliet_pma)") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+19, "", EmoticonStr+"prens.mse") net.RegisterEmoticonString("(prens_live)") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+20, "", EmoticonStr+"leonardo_pma.mse") net.RegisterEmoticonString("(leonardo_gameadmin)") #END OF SYSTEM And then paste to a client this files: https://mega.nz/#!UIJj2AYR!H5sjPWN9R6KQPUhl7J_AP3SKYGkZddnhOBgoqaFO6Uw And my problem is here: Thanks for your answers! Sincerely, ReFresh
  6. Mind Rapist

    Need for a quick C++ tutorial

    Hello devs, sorry for making you seeing another topic of mine at your home page What I need this time is a quick tutorial in the game source. I have 18 skills by vnums: 221, 222, 223, 224, 225, 226, 227, 228, 229, 236, 237, 238, 239, 240, 241, 242, 243, 244. Now those skills can be upgraded normally with skill points until reaching M1. What I need is to make them upgradable with skill points AND their book before M1 (not both just 1 skill point or 1 book from 1 -> 2 then from 2 -> 3 and so on). After M1 no skill points just books like default. Thank you in advance and sorry again for the so many questions of mine
  7. Mind Rapist

    Searching for complete NEW Sash items

    Hello guys I'm searching for the new sash items (effects, icons, txt records and id vnums) and if possible a way to implement them into my binary and packs. I'm using msm but 2 days ago I saw a post somewhere that can help one sash item to apply to every class's body height from the binary. I appreciate any help
  8. Hello guys I added a Quiver in my system recently. I use only 1 vnum id and it's subtype is set as ARROW like the normal arrows, but it works normally (unlimited arrows and ignoring distance). Now I just need a tutorial on how to install the blue effect on my arrows. I have the official files I just don't know what to do in game/binary source to make it work. Does anybody have a little tip for me? Btw if anybody wants me to show you how to do the quiver comment and I will Thanks metin2dev
  9. flexivk123

    [TuT] 3ds max weapons modelling

    Greetings Metin2Dev, a lot of people releasing posts with a question how to create something in 3ds max ( usually weapons ) So i have decided that i'll show you how to do. It's not nothing extra, but it should help you :-) If u want weapons with better quality you should create your own textures. Textures used in video are downloaded so it may look like bullshit. Hope it'll help you.How to : Part 1 - https://www.youtube.com/watch?v=zVC2x82TfyU Part 2 - https://www.youtube.com/watch?v=IMvxuwIkIHE 3ds max 7 with gr2 exporter - downloadhttps://mega.nz/#!F1AEQBRY!WQE1gEuHb...24HHQWMPFAHpSImesh convertor - you can convert already created gr2 model to .obj which is supported by 3ds max. https://mega.nz/#!2dcxQCLR!M4GvlGOvX...qMCCS29wBd9BY0
  10. Hello guys I need a full tutorial on how to install a new resist to the mob_proto table. You see there is resist_poison but not resist_bleeding and because of that Metin Stones can be affected with bleeding. I already found 2 files that I need to edit but since I don't have advanced or expert skills on c++ and metin2 source code I can use a little tut. I need to know all the files I need to edit to make my resist_bleeding work...