Jump to content

AlexxD

Inactive Member
  • Posts

    161
  • Joined

  • Last visited

  • Days Won

    1
  • Feedback

    0%

Everything posted by AlexxD

  1. I use just .txt files bro and I guarantee you that I don't have REAL_TIME or something like that on its.
  2. Hi devs, today I'm coming here with a problem.. :/ I have one problem and that's that I see "Remaining time" on all items except weapons, accesories and armors.. An example: IMG "Timp ramas: 0" means "Remaining time: 0".. But at mounts/rings I have a good value: IMG The question is, how can I make to disappear time on 'non-timing' items?
  3. Add code in RaceData.cpp CRaceData::SWing* CRaceData::FindWing(UINT eWing) { std::map<DWORD, SWing>::iterator f=m_kMap_dwWingKey_kWing.find(eWing); if (m_kMap_dwWingKey_kWing.end()==f) return NULL; return &f->second; } void CRaceData::SetWingSkin(UINT eWing, UINT ePart, const char * c_szModelFileName, const char* c_szSrcFileName, const char* c_szDstFileName) { SSkin kSkin; kSkin.m_ePart=ePart; kSkin.m_stSrcFileName=c_szSrcFileName; kSkin.m_stDstFileName=c_szDstFileName; CFileNameHelper::ChangeDosPath(kSkin.m_stSrcFileName); m_kMap_dwWingKey_kWing[eWing].m_kVct_kSkin.push_back(kSkin); m_kMap_dwWingKey_kWing[eWing].m_stModelFileName = c_szModelFileName; }
  4. At least, if you add SetWing to InstantBase.cpp then armor will not shown on you. Even shoulder.. you're 'nude', on metin.
  5. InstantBase.cpp part? *playersettingmodule.py = SetWing module syserr*
  6. You puted client side, server side is not complete, that's why npc has that problem.
  7. This isn't complete man.. You created the codes for Attach wings on players, but void codes for compiling the new launcher? Take a look on that.. Also, good work. Thanks for post it, but take a look on it.
  8. Yes but for those who wants diferite values like HT 3000 and VT 2000, with MAX_STATUS = 4000.. You can use short int when you use values begin from 0 to 32767. the value of int is big, what you saying is true, but for those who wants extremely values on them servers, can use int value.
  9. You know what I mean in saying 'revenge'. But it won't be discused, meanwhile you're ..
  10. You need to install gcc49 on your VDI, after compile cryptopp 5.6.2 and then will works.
  11. whew then vanilla must've made a little bit of a mess Let's play a little scenario. Here's what you'd do to have a bug in your CONFIG: MAX_HT: 32767 MAX_STATUS: 100 In this case, when the gamefile reads your max-status, it'll do the following statement: if(gPlayerMaxHT==32767) gPlayerMaxHT = gPlayerMaxStatus; So what happened to our max_ht of 32767? Yep, it's now 100. Though I guess no one will use 32767 I think it still counts as a bug. Also I don't know why the variable isn't short int.. since.. well.. 32767 is the max length of short int. So it'd make more sense to chose short int You're right but I don't know why're you talking at third person.. Whatever, there's some people who loves Pokemon Metin2 and if they want int then they can use max value of it, not short int but if they want this they'll gonna change that 32767 with the max value of int, from config.cpp and cmd_general.cpp if I'm don't wrong. :/ I don't tested it with different value, i put them to not 'bug' the server. In some servers I saw 90 VIT, 95 INT, 90 STR, 90 DEX. And it's from gamefiles, not with another adds.
  12. I see that you don't have config.hpp in boost/regex folder. So, maybe that's the problem. You'll need to install boost from ports.
  13. Well, I do not know how to compile it with VS 2013, but I'll try. Thanks in advance for interest.
  14. For those who have error with 'unique_ptr', you just need to put this in Makefiles from libpoly, libsql, etc, and to compile them again. -lstdc++ -std=c++11 And for those who really wants to remain without 90% of warnings, just delete -Wall from Makefiles.
  15. You're 'the revenge', can I say that. Thanks for this code. Really apreciate.
  16. I know it's your code, but I've put it completly, with commands in cmd.cpp.
  17. Hi devs, today I'll show you my change race from C++, with / without wolfman. 1) First, change race with WOLFMAN! 1. Go to cmd.cpp search ACMD(do_vote_block_chat); and after it add: // Change race ACMD(do_change_race); // Change race end 2. Also in cmd.cpp search // END_OF_BLOCK_CHAT and after it add: // Change race { "change_race", do_change_race, 0, POS_DEAD, GM_IMPLEMENTOR }, // Change race end 3. Now, in cmd_gm.cpp you'll need to go at the end of the file and put this code: ACMD(do_change_race) { char arg1[256], arg2[256]; two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2)); // init bool bIsSetSkillGroup = false; DWORD dwRace = MAIN_RACE_MAX_NUM; DWORD dwSkillGroup = 0; // check arg1 if (!*arg1) { goto USAGE; return; } // check&analyze arg2 if (*arg2) { str_to_number(dwSkillGroup, arg2); dwSkillGroup = MINMAX(0, dwSkillGroup, 2); bIsSetSkillGroup = true; } // analyze arg1 str_to_number(dwRace, arg1); if (dwRace >= MAIN_RACE_MAX_NUM) { goto USAGE; return; } // skip if same race if (dwRace==ch->GetRaceNum()) return; // process change race ch->ChatPacket(CHAT_TYPE_INFO, "Old race=%u, Group=%u", ch->GetRaceNum(), ch->GetSkillGroup()); ch->SetRace(dwRace); ch->ClearSkill(); // ch->ClearSubSkill(); if (bIsSetSkillGroup) { ch->SetSkillGroup(dwSkillGroup); } // quick mesh change workaround begin ch->SetPolymorph(101); ch->SetPolymorph(0); // quick mesh change workaround end ch->ChatPacket(CHAT_TYPE_INFO, "New race=%u, Group=%u", ch->GetRaceNum(), ch->GetSkillGroup()); return; // Usage USAGE: ch->ChatPacket(CHAT_TYPE_INFO, "Usage: /change_race <race_id>"); // lista raselor ch->ChatPacket(CHAT_TYPE_INFO, "Races list:"); ch->ChatPacket(CHAT_TYPE_INFO, "tWarrior M = %d", MAIN_RACE_WARRIOR_M); ch->ChatPacket(CHAT_TYPE_INFO, "tNinja F = %d", MAIN_RACE_ASSASSIN_W); ch->ChatPacket(CHAT_TYPE_INFO, "tSura M = %d", MAIN_RACE_SURA_M); ch->ChatPacket(CHAT_TYPE_INFO, "tShaman F = %d", MAIN_RACE_SHAMAN_W); ch->ChatPacket(CHAT_TYPE_INFO, "tWarrior W = %d", MAIN_RACE_WARRIOR_W); ch->ChatPacket(CHAT_TYPE_INFO, "tNinja M = %d", MAIN_RACE_ASSASSIN_M); ch->ChatPacket(CHAT_TYPE_INFO, "tSura W = %d", MAIN_RACE_SURA_W); ch->ChatPacket(CHAT_TYPE_INFO, "tShaman M = %d", MAIN_RACE_SHAMAN_M); ch->ChatPacket(CHAT_TYPE_INFO, "tWolfman M = %d", MAIN_RACE_WOLFMAN_M); ch->ChatPacket(CHAT_TYPE_INFO, "tMax race number = %d", MAIN_RACE_MAX_NUM); // Group lists. ch->ChatPacket(CHAT_TYPE_INFO, "Lista grupelor:"); ch->ChatPacket(CHAT_TYPE_INFO, "tNone = 0"); ch->ChatPacket(CHAT_TYPE_INFO, "tFirst = 1"); ch->ChatPacket(CHAT_TYPE_INFO, "tSecond = 2"); return; } 4. You're done. 2) If you want change_race without wolfman, put this code in cmd_gm.cpp: ACMD(do_change_race) { char arg1[256], arg2[256]; two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2)); // init bool bIsSetSkillGroup = false; DWORD dwRace = MAIN_RACE_MAX_NUM; DWORD dwSkillGroup = 0; // check arg1 if (!*arg1) { goto USAGE; return; } // check&analyze arg2 if (*arg2) { str_to_number(dwSkillGroup, arg2); dwSkillGroup = MINMAX(0, dwSkillGroup, 2); bIsSetSkillGroup = true; } // analyze arg1 str_to_number(dwRace, arg1); if (dwRace >= MAIN_RACE_MAX_NUM) { goto USAGE; return; } // skip if same race if (dwRace==ch->GetRaceNum()) return; // process change race ch->ChatPacket(CHAT_TYPE_INFO, "Old race=%u, Group=%u", ch->GetRaceNum(), ch->GetSkillGroup()); ch->SetRace(dwRace); ch->ClearSkill(); // ch->ClearSubSkill(); if (bIsSetSkillGroup) { ch->SetSkillGroup(dwSkillGroup); } // quick mesh change workaround begin ch->SetPolymorph(101); ch->SetPolymorph(0); // quick mesh change workaround end ch->ChatPacket(CHAT_TYPE_INFO, "New race=%u, Group=%u", ch->GetRaceNum(), ch->GetSkillGroup()); return; // Usage USAGE: ch->ChatPacket(CHAT_TYPE_INFO, "Usage: /change_race <race_id>"); // lista raselor ch->ChatPacket(CHAT_TYPE_INFO, "Races list:"); ch->ChatPacket(CHAT_TYPE_INFO, "tWarrior M = %d", MAIN_RACE_WARRIOR_M); ch->ChatPacket(CHAT_TYPE_INFO, "tNinja F = %d", MAIN_RACE_ASSASSIN_W); ch->ChatPacket(CHAT_TYPE_INFO, "tSura M = %d", MAIN_RACE_SURA_M); ch->ChatPacket(CHAT_TYPE_INFO, "tShaman F = %d", MAIN_RACE_SHAMAN_W); ch->ChatPacket(CHAT_TYPE_INFO, "tWarrior W = %d", MAIN_RACE_WARRIOR_W); ch->ChatPacket(CHAT_TYPE_INFO, "tNinja M = %d", MAIN_RACE_ASSASSIN_M); ch->ChatPacket(CHAT_TYPE_INFO, "tSura W = %d", MAIN_RACE_SURA_W); ch->ChatPacket(CHAT_TYPE_INFO, "tShaman M = %d", MAIN_RACE_SHAMAN_M); ch->ChatPacket(CHAT_TYPE_INFO, "tMax race number = %d", MAIN_RACE_MAX_NUM); // Group lists. ch->ChatPacket(CHAT_TYPE_INFO, "Lista grupelor:"); ch->ChatPacket(CHAT_TYPE_INFO, "tNone = 0"); ch->ChatPacket(CHAT_TYPE_INFO, "tFirst = 1"); ch->ChatPacket(CHAT_TYPE_INFO, "tSecond = 2"); return; } 1. You're done completly now. Enjoy!
  18. Hi Dev's, for three days untill now I've worked to do some options in gamesource for CONFIG's files from server, to make my job for server easier! Now, first option: First new option in config is players max status over CONFIG: 1. In cmd_general.cpp, after extern int g_server_id; add: extern int gPlayerMaxStatus; extern int gPlayerMaxHT; extern int gPlayerMaxIQ; extern int gPlayerMaxST; extern int gPlayerMaxDX; 2. Also in cmd_general.cpp search ACMD(do_stat) and after idx = POINT_IQ; add: if (ch->GetRealPoint(idx) >= gPlayerMaxStatus) checking = true; switch (idx) { case POINT_HT: if ((ch->GetRealPoint(idx) < gPlayerMaxHT)) checking = false; else checking = true; case POINT_IQ: if (ch->GetRealPoint(idx) < gPlayerMaxIQ) checking = false; else checking = true; case POINT_ST: if (ch->GetRealPoint(idx) < gPlayerMaxST) checking = false; else checking = true; case POINT_DX: if (ch->GetRealPoint(idx) < gPlayerMaxDX) checking = false; else checking = true; } if(checking==true) return; 3. Well done, pro metiners. Now in cmd_gm.cpp after DropEvent_RefineBox_SetValue(const std::string& name, int value); add: extern int gPlayerMaxStatus; extern int gPlayerMaxHT; extern int gPlayerMaxIQ; extern int gPlayerMaxST; extern int gPlayerMaxDX; 4. Also in cmd_gm.cpp search ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Cannot set stat under initial stat.")); and you'll see something, a little bit down: if (nPoint > change it with: if (nPoint > gPlayerMaxStatus) { nChangeAmount -= nPoint - gPlayerMaxStatus; nPoint = gPlayerMaxStatus; } 5. Good. Now in config.cpp we'll need to insert our variables, to be read by rest of files! After int gPlayerMaxLevel add: int gPlayerMaxStatus = 90; int gPlayerMaxHT = 32767; int gPlayerMaxIQ = 32767; int gPlayerMaxST = 32767; int gPlayerMaxDX = 32767; 6. After, search TOKEN ("block_char_creation") and after it add: TOKEN("max_status") { str_to_number(gPlayerMaxStatus, value_string); gPlayerMaxStatus = MINMAX(1, gPlayerMaxStatus, 32767); if(gPlayerMaxHT==32767) gPlayerMaxHT = gPlayerMaxStatus; if(gPlayerMaxIQ==32767) gPlayerMaxIQ = gPlayerMaxStatus; if(gPlayerMaxST==32767) gPlayerMaxST = gPlayerMaxStatus; if(gPlayerMaxDX==32767) gPlayerMaxDX = gPlayerMaxStatus; fprintf(stderr, "PLAYER_MAX_STATUS: %dn", gPlayerMaxStatus); } TOKEN("max_ht") { str_to_number(gPlayerMaxHT, value_string); gPlayerMaxHT = MINMAX(1, gPlayerMaxHT, 32767); fprintf(stderr, "PLAYER_MAX_HT: %dn", gPlayerMaxHT); } TOKEN("max_iq") { str_to_number(gPlayerMaxIQ, value_string); gPlayerMaxIQ = MINMAX(1, gPlayerMaxIQ, 32767); fprintf(stderr, "PLAYER_MAX_IQ: %dn", gPlayerMaxIQ); } TOKEN("max_st") { str_to_number(gPlayerMaxST, value_string); gPlayerMaxST = MINMAX(1, gPlayerMaxST, 32767); fprintf(stderr, "PLAYER_MAX_ST: %dn", gPlayerMaxST); } TOKEN("max_dx") { str_to_number(gPlayerMaxDX, value_string); gPlayerMaxDX = MINMAX(1, gPlayerMaxDX, 32767); fprintf(stderr, "PLAYER_MAX_DX: %dn", gPlayerMaxDX); } 7. The last thing we need to do, is that we'll need to put extern's variables in config.h. Search extern int gPlayerMaxLevel; and add after it: extern int gPlayerMaxStatus; extern int gPLayerMaxHT; extern int gPLayerMaxIQ; extern int gPLayerMaxST; extern int gPLayerMaxDX; 8. Well done. Warning. Once you do that, you'll need to put in CONFIG's files from game99 and channels that: max_status: (from 0 to 32767) max_ht: (from 0 to 32767) max_iq: (from 0 to 32767) max_st: (from 0 to 32767) max_dx: (from 0 to 32767) 9. After that, if you do like me, you need to change POINT_VT, IQ, ST and DX from some files, to read it from CONFIG. In cmd_gm.cpp search case POINT_HT : // and change from case POINT_HT untill POINT_DX with: case POINT_HT : // 체력 if (nPoint + ch->GetPoint(POINT_HT) > gPlayerMaxHT) { nPoint = gPlayerMaxHT - ch->GetPoint(POINT_HT); } break; case POINT_IQ : // 지능 if (nPoint + ch->GetPoint(POINT_IQ) > gPlayerMaxIQ) { nPoint = gPlayerMaxIQ - ch->GetPoint(POINT_IQ); } break; case POINT_ST : // 근력 if (nPoint + ch->GetPoint(POINT_ST) > gPlayerMaxST) { nPoint = gPlayerMaxST - ch->GetPoint(POINT_ST); } break; case POINT_DX : // 민첩 if (nPoint + ch->GetPoint(POINT_DX) > gPlayerMaxDX) { nPoint = gPlayerMaxDX - ch->GetPoint(POINT_DX); } break; 10. There you go. Enjoy. You're done!
  19. Hi, for those who doesn't know, there's a bug at lycan's items. These two: [Hidden Content] And the bug is that you can't put finishes on them. And today we'll fix it. 1) We need to edit the game source, exactly two files. 2) We need to edit constinfo.py from root, and we're done. 1)In item.cpp search: const static JewelAccessoryInfo infos[] = { and at end after: { 50638, 14560, 16560, 17560 }, put this: { 50639, 14570, 16570, 17570 }, In mining.cpp search: SInfo info[MAX_ORE] = and at end, after: { 30305, 50618, 50638 }, put this: { 30306, 50619, 50639 }, Good, well done. Also in mining.cpp search MAX_ORE = 18, replace with: MAX_ORE = 19, Game source part is ready. 2)Decrypt root, and in constinfo search after: ACCESSORY_MATERIAL_LIST and at end, after: , 50638 put this: , 50639 Also in constinfo.py search: JewelAccessoryInfos = [ and at the end after: [ 50638, 14560, 16560, 17560 ], put this: [ 50639, 14570, 16570, 17570 ], Well done, enjoy.
  20. Consider using [ code ] tag next time. Care to Python tabulation. Nice tutorial, anyway. I'll do that.. Thanks
  21. M2 Download Center Download Here ( Internal ) 1) First part, Client Binary. UserInterface folder: In InstanceBase.cpp add const char * CInstanceBase::GetLevelString() { char * str = new char[3]; sprintf(str,"%d",m_dwLevel); return str; } in InstanceBase.h add const char * GetLevelString(); Next in PythonNetworkStreamPhaseGame.cpp add in "if (pCharacterInstance){}" CPythonExchange::Instance().SetTargetLevel(pCharacterInstance->GetLevelString()); Open PythonExchange.cpp and add void CPythonExchange::SetTargetLevel(const char *name) { strncpy(m_victim.level, name, 3); } char * CPythonExchange::GetLevelFromTarget() { return m_victim.level; } In PythonExchange.h inside "typedef struct trade{}", after char name[CHARACTER_NAME_MAX_LEN + 1]; add: char level[3]; elsewhere in PythonExchange.h add after: void SetElkMode(bool value); add this: void SetTargetLevel(const char *name); char *GetLevelFromTarget(); In PythonExchangeModule.cpp add after: {"isTrading", exchangeisTrading, METH_VARARGS}, put: {"GetLevelFromTarget", exchangeGetLevelFromTarget, METH_VARARGS}, After: PyObject * exchangeGetElkMode(PyObject * poTarget, PyObject * poArgs) { return Py_BuildValue("b", CPythonExchange::Instance().GetElkMode()); } add: PyObject * exchangeGetLevelFromTarget(PyObject * poTarget, PyObject * poArgs) { return Py_BuildValue("s", CPythonExchange::Instance().GetLevelFromTarget()); } Binary part is ready. 2) Python part now. Decrypt root with EterNexus or anything else you want and in: uiexchange.py, find this; def OpenDialog(self): and replace all what's in there and put this: def OpenDialog(self): self.TitleName.SetText(localeInfo.EXCHANGE_TITLE % (exchange.GetNameFromTarget() + "(" + (exchange.GetLevelFromTarget() + ")"))) self.AcceptButton.Enable() self.AcceptButton.SetUp() self.Show() [Hidden Content] 3) Ready. Now you have level in trade. An example: [Hidden Content]
×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.