Active Member ReFresh 2330 Posted November 2, 2015 Active Member Share Posted November 2, 2015 Hi guys, I want to ask you for this solution: How can I change the max increased limit of yang in inventory up to 999kkk (999 999 999 999)? Or which file I must edit in source? Somebody says that file names lenght.h, but I can't find this file in my source. PS:I'm using novaline source with maxmi edit. Version of maxmi edit is 4.1. Thank you for your answers. Kind Regards ReFresh I'll be always helpful! Link to comment Share on other sites More sharing options...
Former Staff Shisui 490 Posted November 2, 2015 Former Staff Share Posted November 2, 2015 1 Link to comment Share on other sites More sharing options...
SeXpL0SiVe 4 Posted November 2, 2015 Share Posted November 2, 2015 hey man have u fixed any bugs in maxmi? Link to comment Share on other sites More sharing options...
Active Member ReFresh 2330 Posted November 2, 2015 Author Active Member Share Posted November 2, 2015 I have maxmi source a few days, but if I find bugs, I fix it. I'll be always helpful! Link to comment Share on other sites More sharing options...
SeXpL0SiVe 4 Posted November 2, 2015 Share Posted November 2, 2015 I have found many bugs i have fixed some but others not yet u want to help me fix them? Link to comment Share on other sites More sharing options...
Active Member ReFresh 2330 Posted November 2, 2015 Author Active Member Share Posted November 2, 2015 (edited) I should help you, write me which bugs you want to fix and I look at it. Edited November 2, 2015 by ReFresh I'll be always helpful! Link to comment Share on other sites More sharing options...
SeXpL0SiVe 4 Posted November 2, 2015 Share Posted November 2, 2015 Thank you so much Client crashes when wolfman runs on mount (clear syserr) Aura of the Sword, Enchanted Blade and Attack+ increase attack but in the C panel there is no change. Red Possession is the same but in C panel you can see that it takes attack instead of giving. This is visual bug Bleeding is applyed but the red cloud or the debuff icon is not displayed Strong against Lycans is displayed as Bleeding PCT and Defence against Lycans is displayed as Bleeding Resist Blue Possession supposed to be applyed at all members of the team, instead it is only applyed to self. I have checked everything i believe its in the source i just don't know what to do to fix it... If you want source and binary i have them both Appreciate your help Link to comment Share on other sites More sharing options...
Active Member ReFresh 2330 Posted November 2, 2015 Author Active Member Share Posted November 2, 2015 I look at it and I try to repair it. I have a question, you have a novaline source with maxmi edit? I'll be always helpful! Link to comment Share on other sites More sharing options...
SeXpL0SiVe 4 Posted November 2, 2015 Share Posted November 2, 2015 I use Reboot's binary with maxmi GameLib and UserInterface... Any other binaries have failed to compile... Do you want me to help you a little to take a closer look together on this? Link to comment Share on other sites More sharing options...
fenixplayscz 16 Posted November 2, 2015 Share Posted November 2, 2015 For increase yang, you must edit some files, not only length you must change data type to long long 1 Link to comment Share on other sites More sharing options...
Active Member ReFresh 2330 Posted November 2, 2015 Author Active Member Share Posted November 2, 2015 #SeXpL0SiVe I'm using novaline with some maxmi files and compiling is sucessfull. Send me message, i help you with some problems I'll be always helpful! Link to comment Share on other sites More sharing options...
Traktorzysta 17 Posted November 2, 2015 Share Posted November 2, 2015 (edited) Tutorial from metin2hungary.net:(for me server side is good) 1 post: Szerver-common:1.) Nyisd meg a common/tables.h fájlt.1.1) Keresd meg a következő struktúrát: Kód: [Kijelölés] typedef struct SPlayerTable 1.2) Cseréld le benne az INT gold; sort erre: Kód: [Kijelölés] long long gold; Szerver-game:1.) Nyisd meg a packet.h fájlt és keress rá a következőkre: Kód: [Kijelölés] typedef struct packet_points typedef struct packet_point_change Cseréld le őket ezekre: Kód: [Kijelölés] typedef struct packet_points { BYTE header; long long points[POINT_MAX_NUM]; } TPacketGCPoints; typedef struct packet_point_change { int header; DWORD dwVID; BYTE type; long long amount; long long value; } TPacketGCPointChange; 2.) Nyisd meg a char.h fájlt és a következőket módosítsd: Kód: [Kijelölés] typedef struct character_point typedef struct character_point_instant Kód: [Kijelölés] long points[POINT_MAX_NUM]; long gold; Kód: [Kijelölés] long points[POINT_MAX_NUM]; Mind a háromnál írd át a típust long long-ra! 2.1) Keress rá erre: "// Money related" és az alatta lévő sorok így nézzenek ki: Kód: [Kijelölés] long long GetGold() const { return m_points.gold; } void SetGold(long long gold) { m_points.gold = gold; } bool DropGold(int gold); int GetAllowedGold() const; void GiveGold(int iAmount); // ĆÄĆĽ°ˇ ŔÖŔ¸¸é ĆÄĆĽ şĐąč, ·Î±× µîŔÇ Ăł¸® 3.) Nyisd meg a char.cpp fájlt. 3.1.1) Menj a következő eljáráshoz: Kód: [Kijelölés] void CHARACTER::OpenMyShop(const char * c_pszSign, TShopItemTable * pTable, BYTE bItemCount) 3.1.2) Keresd azon a helyen ahová érkeztél ezt(szintaxis nem azonos!): Kód: [Kijelölés] int64_t nTotalMoney = 0; for (int n = 0; n < bItemCount; ++n) nTotalMoney += static_cast<int64_t>((pTable+n)->price); nTotalMoney += static_cast<int64_t>(GetGold()); if (GOLD_MAX <= nTotalMoney) { sys_err("[OVERFLOW_GOLD] Overflow (GOLD_MAX) id %u name %s", GetPlayerID(), GetName()); ChatPacket(CHAT_TYPE_INFO, LC_TEXT("20ľď łÉŔ» ĂĘ°úÇĎż© »óÁˇŔ» żĽö°ˇ ľř˝Ŕ´Ď´Ů")); return; } 3.1.3) Cseréld le erre(e miatt írtam át a szintaxisát az előzőnek): Kód: [Kijelölés] long long nTotalMoney = 0; for (int n = 0; n < bItemCount; ++n) nTotalMoney += static_cast<long long>((pTable+n)->price); nTotalMoney += static_cast<long long>(GetGold()); if (g_llMaxGold < nTotalMoney) { sys_err("[OVERFLOW_GOLD] Overflow (GOLD_MAX) id %u name %s", GetPlayerID(), GetName()); ChatPacket(CHAT_TYPE_INFO, LC_TEXT("20ľď łÉŔ» ĂĘ°úÇĎż© »óÁˇŔ» żĽö°ˇ ľř˝Ŕ´Ď´Ů")); return; } Megjegyzésként: a g_llMaxGold változó a CONFIG fájlban lesz feltöltve értékkel, lesz róla szó. 3.2) Menj a "CHARACTER::Disconnect" eljáráshoz és cseréld le a következőt: Kód: [Kijelölés] snprintf(buf, sizeof(buf), "%s %d %d %ld %d", inet_ntoa(GetDesc()->GetAddr().sin_addr), GetGold(), g_bChannel, GetMapIndex(), GetAlignment()); Erre: Kód: [Kijelölés] snprintf(buf, sizeof(buf), "%s %lld %d %ld %d", inet_ntoa(GetDesc()->GetAddr().sin_addr), GetGold(), g_bChannel, GetMapIndex(), GetAlignment()); 3.3) Ugorj a "CHARACTER::PointChange" eljáráshoz. 3.3.1) A val változó típusát már az elején írd át long long-ra! 3.3.2) A "case POINT_GOLD:" ágat teljes egészében cseréld le erre: Kód: [Kijelölés] case POINT_GOLD: { long long newGold = MINMAXLL(0, static_cast<long long>(GetGold()) + static_cast<long long>(amount), g_llMaxGold); SetGold(newGold); val = GetGold(); } break; Megjegyzés: A MINMAXLL új függvény, de írok arról is majd. 3.3.3) Következőt, még a PointChange-en belül változtasd: Kód: [Kijelölés] if (bAmount) pack.amount = amount; else pack.amount = 0; Erre: Kód: [Kijelölés] if (bAmount) pack.amount = (long long)amount; else pack.amount = 0; 4.) Nyisd meg a char_item.cpp fájlt. 4.1) Keress rá erre: "GetGold()" és ahol találat van ott tegyél egy (long long)-ot a következők szerint: Kód: [Kijelölés] if (GetGold() < (long long)cost) if (GetGold() < (long long)prt->cost) if (gold <= 0 || (long long)gold > GetGold()) 5.) Nyisd meg a cmd_gm.cpp fájlt. 5.1) Keress rá a do_set parancsra és a GOLD ágat cseréld le: Kód: [Kijelölés] case 0: // gold { int gold = 0; str_to_number(gold, arg3); DBManager::instance().SendMoneyLog(MONEY_LOG_MISC, 3, gold); int before_gold = tch->GetGold(); tch->PointChange(POINT_GOLD, gold, true); int after_gold = tch->GetGold(); if (0 == after_gold && 0 != before_gold) { LogManager::instance().CharLog(tch, gold, "ZERO_GOLD", "GM"); } } break; Erre: Kód: [Kijelölés] case 0: // gold { int gold = 0; str_to_number(gold, arg3); DBManager::instance().SendMoneyLog(MONEY_LOG_MISC, 3, gold); long long before_gold = tch->GetGold(); tch->PointChange(POINT_GOLD, gold, true); long long after_gold = tch->GetGold(); if (0 == after_gold && 0 != before_gold) { LogManager::instance().CharLog(tch, gold, "ZERO_GOLD", "GM"); } } break; 5.) Nyisd meg az input_main.cpp fájlt. 5.1.1) Keress rá erre(2x lesz): Kód: [Kijelölés] if (ch->GetGold() >= GOLD_MAX) 5.1.2) Cseréld le erre mind a kettőt: Kód: [Kijelölés] if (ch->GetGold() > g_llMaxGold) 5.2.1) Tekerj, ugorj a "void CInputMain::Exchange" eljáráshoz. 5.2.2) Keresd ezt: Kód: [Kijelölés] case EXCHANGE_SUBHEADER_CG_ELK_ADD: 5.2.3) Az egész ágat cseréld le erre: Kód: [Kijelölés] case EXCHANGE_SUBHEADER_CG_ELK_ADD: // arg1 == amount of gold if (ch->GetExchange()) { const long long nTotalGold = static_cast<long long>(ch->GetExchange()->GetCompany()->GetOwner()->GetGold()) + static_cast<long long>(pinfo->arg1); if (g_llMaxGold < nTotalGold) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ó´ëąćŔÇ Ăѱݾ×ŔĚ 20ľď łÉŔ» ĂĘ°úÇĎż© °Ĺ·ˇ¸¦ ÇŇĽö°ˇ ľř˝Ŕ´Ď´Ů..")); sys_err("[OVERFLOW_GOLD] ELK_ADD (%lld) id %u name %s ", ch->GetExchange()->GetCompany()->GetOwner()->GetGold(), ch->GetExchange()->GetCompany()->GetOwner()->GetPlayerID(), ch->GetExchange()->GetCompany()->GetOwner()->GetName()); return; } if (ch->GetExchange()->GetCompany()->GetAcceptStatus() != true) ch->GetExchange()->AddGold(pinfo->arg1); } break; 6.) Nyisd meg a shopEx.cpp fájlt. 6.1.1) Keresd meg ezt a függvényt: Kód: [Kijelölés] int CShopEx::Buy 6.1.2) Majd az ott található első switchben cseréld le az egész "case SHOP_COIN_TYPE_GOLD:" ágat erre: Kód: [Kijelölés] case SHOP_COIN_TYPE_GOLD: if (it->second) // if other empire, price is triple dwPrice *= 3; if (ch->GetGold() < (long long) dwPrice) { sys_log(1, "ShopEx::Buy : Not enough money : %s has %lld, price %d", ch->GetName(), ch->GetGold(), dwPrice); return SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY; } break; 7.) Nyisd meg a shop_manager.cpp fájlt. 7.1.1) Menj a "void CShopManager::Sell" nevű eljáráshoz. 7.1.2) Cseréld le a következőt: Kód: [Kijelölés] const int64_t nTotalMoney = static_cast<int64_t>(ch->GetGold()) + static_cast<int64_t>(dwPrice); if (GOLD_MAX <= nTotalMoney) { sys_err("[OVERFLOW_GOLD] id %u name %s gold %u", ch->GetPlayerID(), ch->GetName(), ch->GetGold()); ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("20ľďłÉŔĚ ĂĘ°úÇĎż© ą°Ç°Ŕ» ĆČĽö ľř˝Ŕ´Ď´Ů.")); return; } Erre: Kód: [Kijelölés] const long long nTotalMoney = static_cast<long long>(ch->GetGold()) + static_cast<long long>(dwPrice); if (g_llMaxGold < nTotalMoney) { sys_err("[OVERFLOW_GOLD] id %u name %s gold %lld", ch->GetPlayerID(), ch->GetName(), ch->GetGold()); ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("20ľďłÉŔĚ ĂĘ°úÇĎż© ą°Ç°Ŕ» ĆČĽö ľř˝Ŕ´Ď´Ů.")); return; } 8.) Nyisd meg a shop.cpp fájlt. 8.1.1) Keress rá erre: Kód: [Kijelölés] if (ch->GetGold() < (int) dwPrice) { sys_log(1, "Shop::Buy : Not enough money : %s has %d, price %d", ch->GetName(), ch->GetGold(), dwPrice); return SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY; } 8.1.2) Cseréld le erre: Kód: [Kijelölés] if (ch->GetGold() < dwPrice) { sys_log(1, "Shop::Buy : Not enough money : %s has %lld, price %d", ch->GetName(), ch->GetGold(), dwPrice); return SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY; } 9.) Nyisd meg a questlua_pc.cpp fájlt. 9.1.1) Keresd meg ezt: Kód: [Kijelölés] sys_err("QUEST wrong ChangeGold %d (now %d)", gold, ch->GetGold()); 9.1.2) Cseréld le erre: Kód: [Kijelölés] sys_err("QUEST wrong ChangeGold %d (now %lld)", gold, ch->GetGold()); 10.) Nyisd meg a config.h fájlt. 10.1) Illeszd be alulra a következő sort: Kód: [Kijelölés] extern long long g_llMaxGold; 11.) Nyisd meg a config.cpp fájlt. 11.1) A fájl elejére ahol a többi deklaráció van, illeszd be a következő sort: Kód: [Kijelölés] long long g_llMaxGold = 2140000000; 11.2.1) Keresd a következőt: Kód: [Kijelölés] // LOG_KEEP_DAYS_EXTEND log_set_expiration_days(2); // END_OF_LOG_KEEP_DAYS_EXTEND while (fgets(buf, 256, fp)) { parse_token(buf, token_string, value_string); 11.2.2) Alá illeszd be, a többi(alatta) mutatja, hogy hogy: Kód: [Kijelölés] TOKEN("max_gold") { long long money = 0; str_to_number(money, value_string); g_llMaxGold = MINMAXLL(2000000000, money, 9223372036854775807LL); fprintf(stderr, "PLAYER_MAX_GOLD: %lld\n", g_llMaxGold); } Szerver-db:1.) Nyisd meg a ClientManagerPlayer.cpp fájlt. 1.1.1) Keress rá erre: Kód: [Kijelölés] "gold = %d, " 1.1.2) Írd át erre: Kód: [Kijelölés] "gold = %lld, " 1.2.1) Keress rá erre: Kód: [Kijelölés] sys_log(0, "[PLAYER_LOAD] ID %s pid %d gold %d ", pTab->name, pTab->id, pTab->gold); 1.2.2) Írd át erre: Kód: [Kijelölés] sys_log(0, "[PLAYER_LOAD] ID %s pid %d gold %lld ", pTab->name, pTab->id, pTab->gold); 1.3.1) Keresd ezt az eljárást: "CClientManager::__QUERY_PLAYER_CREATE" 1.3.2) Cseréld le a következőt: Kód: [Kijelölés] else { peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0); return; } queryLen = snprintf(queryStr, sizeof(queryStr), "INSERT INTO player%s " "(id, account_id, name, level, st, ht, dx, iq, " "job, voice, dir, x, y, z, " "hp, mp, random_hp, random_sp, stat_point, stamina, part_base, part_main, part_hair, gold, playtime, " "skill_level, quickslot) " "VALUES(0, %u, '%s', %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, %d, 0, %d, 0, ", GetTablePostfix(), packet->account_id, packet->player_table.name, packet->player_table.level, packet->player_table.st, packet->player_table.ht, packet->player_table.dx, packet->player_table.iq, packet->player_table.job, packet->player_table.voice, packet->player_table.dir, packet->player_table.x, packet->player_table.y, packet->player_table.z, packet->player_table.hp, packet->player_table.sp, packet->player_table.sRandomHP, packet->player_table.sRandomSP, packet->player_table.stat_point, packet->player_table.stamina, packet->player_table.part_base, packet->player_table.part_base, packet->player_table.gold); sys_log(0, "PlayerCreate accountid %d name %s level %d gold %d, st %d ht %d job %d", packet->account_id, packet->player_table.name, packet->player_table.level, packet->player_table.gold, packet->player_table.st, packet->player_table.ht, packet->player_table.job); 1.3.3) Erre: Kód: [Kijelölés] else { peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0); return; } queryLen = snprintf(queryStr, sizeof(queryStr), "INSERT INTO player%s " "(id, account_id, name, level, st, ht, dx, iq, " "job, voice, dir, x, y, z, " "hp, mp, random_hp, random_sp, stat_point, stamina, part_base, part_main, part_hair, gold, playtime, " "skill_level, quickslot) " "VALUES(0, %u, '%s', %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, %d, 0, %lld, 0, ", GetTablePostfix(), packet->account_id, packet->player_table.name, packet->player_table.level, packet->player_table.st, packet->player_table.ht, packet->player_table.dx, packet->player_table.iq, packet->player_table.job, packet->player_table.voice, packet->player_table.dir, packet->player_table.x, packet->player_table.y, packet->player_table.z, packet->player_table.hp, packet->player_table.sp, packet->player_table.sRandomHP, packet->player_table.sRandomSP, packet->player_table.stat_point, packet->player_table.stamina, packet->player_table.part_base, packet->player_table.part_base, packet->player_table.gold); sys_log(0, "PlayerCreate accountid %d name %s level %d gold %lld, st %d ht %d job %d", packet->account_id, packet->player_table.name, packet->player_table.level, packet->player_table.gold, packet->player_table.st, packet->player_table.ht, packet->player_table.job); 1.4) Menj nvaicatba, és módosítsd a player.player tábla gold mezőjét bigint-re valamint növeld a mező karakterszélességét, pld 20-ra. Jobbklikk a player táblán -> Design table és ott már gyerekjáték.Szerver-thecore:1.) Menj a libthecore/src mappába és nyisd meg az utils.c fájlt. 1.1.1) Keresd ezt a függvényt: Kód: [Kijelölés] int MINMAX(int min, int value, int max) 1.1.2) Alá illeszd be a következőket: Kód: [Kijelölés] long long MAXLL(long long a, long long b) { return a < b ? a : b; } long long MINLL(long long a, long long b) { return a > b ? a : b; } long long MINMAXLL(long long min, long long val, long long max) { register long long tv; tv = (min > val ? min : val); return (max < tv) ? max : tv; } 2.) Menj a libthecore/include mappába és nyisd meg az utils.h fájlt 2.1.1) Keresd a következő sort: Kód: [Kijelölés] extern int MINMAX(int min, int value, int max); 2.1.2) Alá illeszd be a következőket: Kód: [Kijelölés] extern long long MAXLL(long long a, long long b); extern long long MINLL(long long a, long long b); extern long long MINMAXLL(long long min, long long val, long long max); Kliens-bin:1.) Nyisd meg a Packet.h fájlt. 1.1) Keresd meg a következő struktúrákat: Kód: [Kijelölés] typedef struct packet_points typedef struct packet_point_change 1.2) Cseréld le őket erre: Kód: [Kijelölés] typedef struct packet_points { BYTE header; long long points[POINT_MAX_NUM]; } TPacketGCPoints; typedef struct packet_point_change { int header; DWORD dwVID; BYTE Type; long long amount; // ąŮ˛ď °Ş long long value; // ÇöŔç °Ş } TPacketGCPointChange; 2.) Nyisd meg az AbstractPlayer.h fájlt. 2.1) Keresd meg ezt a sort: Kód: [Kijelölés] virtual int GetStatus(DWORD dwType) = 0; 2.2) Cseréld le erre: Kód: [Kijelölés] virtual long long GetStatus(DWORD dwType) = 0; 3.) Nyisd meg a PythonPlayer.h fájlt. 3.1.1) Keresd meg ezt a struktúrát: "typedef struct SPlayerStatus" 3.1.2) Cseréld le erre: Kód: [Kijelölés] typedef struct SPlayerStatus { TItemData aItem[c_Inventory_Count]; TItemData aDSItem[c_DragonSoul_Inventory_Count]; TQuickSlot aQuickSlot[QUICKSLOT_MAX_NUM]; TSkillInstance aSkill[SKILL_MAX_NUM]; long long m_alPoint[POINT_MAX_NUM]; long lQuickPageIndex; void SetPoint(UINT ePoint, long long lPoint); long long GetPoint(UINT ePoint); } TPlayerStatus; 3.2.1) Keresd ezeket a sorokat: Kód: [Kijelölés] void SetStatus(DWORD dwType, long lValue); int GetStatus(DWORD dwType); 3.2.2) Majd módosítsd így: Kód: [Kijelölés] void SetStatus(DWORD dwType, long long lValue); long long GetStatus(DWORD dwType); 4.) Nyisd meg a PythonPlayer.cpp fájlt. 4.1.1) Keresd meg ezt: Kód: [Kijelölés] const DWORD POINT_MAGIC_NUMBER = 0xe73ac1da; 4.1.2) A típusát írd át long long-ra, tehát így nézzen ki: Kód: [Kijelölés] const long long POINT_MAGIC_NUMBER = 0xe73ac1da; 4.2) Rögtön az alatta lévő eljárást és függvényt is módosíthatod a következő példa szerint: Kód: [Kijelölés] void CPythonPlayer::SPlayerStatus::SetPoint(UINT ePoint, long long lPoint) { m_alPoint[ePoint]=lPoint ^ POINT_MAGIC_NUMBER; } long long CPythonPlayer::SPlayerStatus::GetPoint(UINT ePoint) { return m_alPoint[ePoint] ^ POINT_MAGIC_NUMBER; } 4.3.1) Keresd meg ezt a sort: Kód: [Kijelölés] void CPythonPlayer::SetStatus(DWORD dwType, long lValue) 4.3.2) Cseréld le erre: Kód: [Kijelölés] void CPythonPlayer::SetStatus(DWORD dwType, long long lValue) 4.4.1) Keresd meg ezt a sort: Kód: [Kijelölés] int CPythonPlayer::GetStatus(DWORD dwType) 4.4.2) Cseréld le erre: Kód: [Kijelölés] long long CPythonPlayer::GetStatus(DWORD dwType) 5.) Nyisd meg a PythonPlayerModule.cpp fájlt. 5.1.1) Keresd meg a playerGetElk parancsot. 5.1.2) Majd cseréld le erre: Kód: [Kijelölés] PyObject * playerGetElk(PyObject* poSelf, PyObject* poArgs) { long long llGold = CPythonPlayer::Instance().GetStatus(POINT_GOLD); #ifdef _DEBUG Tracef("GetElk(): %lld\n", llGold); #endif return PyLong_FromLongLong(llGold); } -- Végül CONFIG fájlban meghatározhatod a maximális yangmennyiséget egy játékosnál. Túllépni nem tudja, nem ugrik át 0-ra a MINMAXLL megakadályoz mindent Nekem a limit 20.000.000.000 azaz 20milliárd, de ez nyugodtan lehet több. Kód: [Kijelölés] MAX_GOLD: 20000000000 -- Ha valami kimaradt volna, vagy valami hibádzik PM, ha segítség kell a berakáshoz ott a segítség topic.Ne feledd a módosított libthecore forrását lefordítani, mielőtt a game forrást fordítod! Remélem nem hagytam ki semmit :3 -- Changelog: #01: 2015.05.02. 20:22 :: config.cpp fájlban volt egy kis unix-win fordítási különbözet a MAXLONGLONG változóval kapcsolatban, ezért az helyettesítve lett a LONGLONG maximális értékével. #02: 2015.05.08. 16:17 :: Elírás javítás. (AbstractPlayer.cpp --> AbstractPlayer.h) -- Külön köszönet Disco/Sanchez-t illeti, amiért annak idején (forrás publikálás után) segített benne.« Utoljára szerkesztve: 2015-05-08, 16:17:02 by [VIP]P3NG3R » 2 post: Mivel több mint valószínű, hogy meghaladta volna az első post a 20.000 karakterszámot, így kénytelen voltam új hozzászólást írni.Választható módosítások:Fontos tudni!Ezeket nem kötelező, de ajánlott elvégezni; ha questtel 2,1md feletti yangot akarsz kiosztani jutalomként.Valamint ha bővíteni szeretnéd a kereskedésben átadható yang küszöböt.Quest pc.change_gold; (click to show/hide) 1.) Nyisd meg a char.h fájlt.1.1) Keress rá erre:Kód: [Kijelölés] PointChange(BYTE type, int amount, bool bAmount = false, bool bBroadcast = false); 1.2) Írd át az amount változó típusát long long-ra, vagy cseréld le erre:Kód: [Kijelölés] PointChange(BYTE type, long long amount, bool bAmount = false, bool bBroadcast = false); 2.) Nyisd meg a char.cpp fájlt.2.1) Keress rá a következő eljárásra:Kód: [Kijelölés] void CHARACTER::PointChange(BYTE type, int amount, bool bAmount, bool bBroadcast) 2.2) Írd át itt is az amount változó típusát long long-ra, vagy cseréld le erre:Kód: [Kijelölés] void CHARACTER::PointChange(BYTE type, long long amount, bool bAmount, bool bBroadcast) 3.) Nyisd meg a questlua_pc.cpp fájlt.3.1) Keresd meg a következő függvényt:Kód: [Kijelölés] int pc_change_money(lua_State * L) 3.2) Cseréld le az egészet erre:Kód: [Kijelölés] int pc_change_money(lua_State * L) { LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); if (!ch) return 0; if (!lua_isnumber(L, -1)) { sys_err("QUEST : wrong argument"); return 0; } long long llGold = (long long)lua_tonumber(L, -1); if (llGold + ch->GetGold() < 0) sys_err("QUEST wrong ChangeGold %d (now %lld)", llGold, ch->GetGold()); else { DBManager::instance().SendMoneyLog(MONEY_LOG_QUEST, ch->GetPlayerID(), llGold); ch->PointChange(POINT_GOLD, llGold, true); } return 0; } 3.3) Az összes give_gold, givegold stb variációnak ezt a parancsot add meg! És a pc_give_gold törölhető is. Hogy miért? Mert az alapból nem ellenőrzi, hogy átadható-e annyi yang, amennyit tényleg akarsz adni.Kód: [Kijelölés] { "givegold", pc_change_money }, { "give_gold", pc_change_money }, Ajh, ahogy láthatod a SendMoneyLog megkapja a gold változót, ami már nem int, így ott is alakítani kell.Ez a változtatás érinteni fogja a db-t is!4.) Nyisd meg a common/tables.h fájlt.4.1) Keresd ezt a struktúrát:Kód: [Kijelölés] typedef struct SPacketMoneyLog 4.2) Az ott található INT típusú gold változót írd át long long típúsúra.Kód: [Kijelölés] typedef struct SPacketMoneyLog { BYTE type; DWORD vnum; long long gold; } TPacketMoneyLog; 5.) Vissza a game mappába. Nyisd meg a db.h fájlt.5.1) Keresd meg ezt:Kód: [Kijelölés] SendMoneyLog(BYTE type, DWORD vnum, int gold); 5.2) Magától értetődő, hogy a változót long long-osítani kell Kód: [Kijelölés] SendMoneyLog(BYTE type, DWORD vnum, long long gold); 6.) Ezt megtesszük a db.cpp fájlban is.6.1) Keresd meg ezt a sort:Kód: [Kijelölés] void DBManager::SendMoneyLog(BYTE type, DWORD vnum, int gold) 6.2) Majd cseréld le erre:Kód: [Kijelölés] void DBManager::SendMoneyLog(BYTE type, DWORD vnum, long long gold) 7.) Nyisd meg a log.h fájlt.7.1) Keresd meg a következő sort:Kód: [Kijelölés] MoneyLog(BYTE type, DWORD vnum, int gold); 7.2) Majd a gold típusát írd át:Kód: [Kijelölés] MoneyLog(BYTE type, DWORD vnum, long long gold); 8.) Nyisd meg a log.cpp fájlt.8.1) Keresd meg a következő eljárást:Kód: [Kijelölés] void LogManager::MoneyLog(BYTE type, DWORD vnum, int gold) 8.2) Ha megvan cseréld le az egészet erre:Kód: [Kijelölés] void LogManager::MoneyLog(BYTE type, DWORD vnum, long long gold) { if (type == MONEY_LOG_RESERVED || type >= MONEY_LOG_TYPE_MAX_NUM) { sys_err("TYPE ERROR: type %d vnum %u gold %lld", type, vnum, gold); return; } Query("INSERT DELAYED INTO money_log%s VALUES (NOW(), %d, %d, %lld)", get_table_postfix(), type, vnum, gold); } 9.) Ugrunk a db mappába. Nyisd meg a MoneyLog.h fájlt.9.1) A következő sorokat:Kód: [Kijelölés] void AddLog(BYTE bType, DWORD dwVnum, int iGold); std::map<DWORD, int> m_MoneyLogContainer[MONEY_LOG_TYPE_MAX_NUM]; 9.2) Cseréld le, azaz így nézzenek ki:Kód: [Kijelölés] void AddLog(BYTE bType, DWORD dwVnum, long long llGold); std::map<DWORD, long long> m_MoneyLogContainer[MONEY_LOG_TYPE_MAX_NUM]; 10.) Nyisd meg a MoneyLog.cpp fájlt.10.1) Keresd meg a következő eljárást:Kód: [Kijelölés] void CMoneyLog::AddLog(BYTE bType, DWORD dwVnum, int iGold) 10.2) Cseréld le az egész eljárást erre:Kód: [Kijelölés] void CMoneyLog::AddLog(BYTE bType, DWORD dwVnum, long long llGold) { m_MoneyLogContainer[bType][dwVnum] += llGold; } 11.) Irány navicat, log adatbázis, money_log tábla -> Design table -> pid mező típusa legyen bigint, a hossza pedig 20.UPDATE#02:12.) Nyisd meg a char_item.cpp fájlt.12.1) A következő szöveget keresd:Kód: [Kijelölés] µ· %d łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů. 12.2) És ahány találat van(általában 5), mindet cseréld le erre:Kód: [Kijelölés] µ· %lld łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů. 13.) Nyisd meg a questlua_pc.cpp fájlt.13.1) Itt is végezd el az előbbieket, keresd ezt:Kód: [Kijelölés] µ· %d łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů. 13.2) És cseréld le erre:Kód: [Kijelölés] µ· %lld łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů. 14.) Forráson kívüli módosítás!!444 locale_string.txt fájlt nyisd meg.14.1) A következő sorpárt keresd:Kód: [Kijelölés] "µ· %d łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů."; "%d Yangot kaptál."; 13.2) Így nézzen ki:Kód: [Kijelölés] "µ· %lld łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů."; "%lld Yangot kaptál."; 13.3) Ahol le lett cserélve forrásban az LC_TEXT("µ· %d łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů."), azon a soron belül a hozzá tartozó paraméter adattípusát long long-gá kell tenni! Mutatok két példát rá az érintett részekről.Kód: [Kijelölés] ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µ· %lld łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů."), static_cast<long long>(dwCounts)); //// case ITEM_ELK_VNUM: // µ·˛Ů·ŻąĚ { long long llGold = (long long)item->GetSocket(0); ITEM_MANAGER::instance().RemoveItem(item); ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µ· %lld łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů."), llGold); PointChange(POINT_GOLD, llGold); } break; 13+1) Nyisd meg a Client/Userinterface/PythonNetworkStreamPhaseGame.cpp fájlt.13+1.1) Keresd meg ezt a részt: Kód: [Kijelölés] if (POINT_GOLD == PointChange.Type) { if (PointChange.amount > 0) { PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnPickMoney", Py_BuildValue("(i)", PointChange.amount)); } } 13+1.2) Cseréld le erre: Kód: [Kijelölés] if (POINT_GOLD == PointChange.Type) { if (PointChange.amount > 0) { PyObject *args = PyTuple_New(1); PyTuple_SetItem(args, 0, PyLong_FromLongLong(PointChange.amount)); PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnPickMoney", args); } } UPDATE#03:14.) Nyisd meg a cmd_gm.cpp fájlt.14.1) Keresd meg a következő parancsot: Kód: [Kijelölés] ACMD(do_set) 14.2) Tekerj le amíg a yangos részhez nem érsz (case 0: ) és a "gold = 0" típusát írd át long long-ra. Kód: [Kijelölés] case 0: // gold { long long gold = 0; str_to_number(gold, arg3); DBManager::instance().SendMoneyLog(MONEY_LOG_MISC, 3, gold); long long before_gold = tch->GetGold(); tch->PointChange(POINT_GOLD, gold, true); long long after_gold = tch->GetGold(); if (0 == after_gold && 0 != before_gold) { LogManager::instance().CharLog(tch, gold, "ZERO_GOLD", "GM"); } } break; 14.3) Tekerj a parancs aljára, ehhez: Kód: [Kijelölés] if (set_fields.type == NUMBER) { int amount = 0; str_to_number(amount, arg3); ch->ChatPacket(CHAT_TYPE_INFO, "%s's %s set to [%d]", tch->GetName(), set_fields.cmd, amount); } 14.4) Cseréld le erre: Kód: [Kijelölés] if (set_fields.type == NUMBER) { long long amount = 0; str_to_number(amount, arg3); ch->ChatPacket(CHAT_TYPE_INFO, "%s's %s set to [%lld]", tch->GetName(), set_fields.cmd, amount); } Kereskedésben átadható yang: (click to show/hide) #06: Vásárlási hibajavítás: (click to show/hide) 1.) Nyisd meg a shop.cpp fájlt.1.1) Keress rá a következő sorra: Kód: [Kijelölés] DWORD dwPrice = r_item.price; 1.2) Cseréld le erre: Kód: [Kijelölés] long long llPrice = static_cast<long long>(r_item.price); 1.3) Majd mindenhol(A CShop::Buy függvényen belül!!) a dwPrice-t írd át llPrice-ra1.4) Ahol az újonnan llPrice-ként szereplő változó formázott szövegként van meghívva(%d/%u), írd át %lld-re. Felsorolom az érintett, már átírt sorokat. Kód: [Kijelölés] sys_log(1, "Shop::Buy : Not enough money : %s has %lld, price %lld", ch->GetName(), ch->GetGold(), llPrice); snprintf(buf, sizeof(buf), "%s FROM: %u TO: %u PRICE: %lld", item->GetName(), ch->GetPlayerID(), m_pkPC->GetPlayerID(), llPrice); snprintf(buf, sizeof(buf), "%s %u(%s) %lld %u", item->GetName(), m_pkPC->GetPlayerID(), m_pkPC->GetName(), llPrice, item->GetCount()); snprintf(buf, sizeof(buf), "%s %u(%s) %lld %u", item->GetName(), ch->GetPlayerID(), ch->GetName(), llPrice, item->GetCount()); sys_log(0, "SHOP: BUY: name %s %s(x %d):%u price %lld", ch->GetName(), item->GetName(), item->GetCount(), item->GetID(), llPrice); --Changelog:#01> 2015.05.09 14:30 :: pc_change_money fv-ben véletlen letiltottam a negatív értékadást, ezt orvosoltam(3.2-es pont), köszi masodikbela.#02> 2015.05.09 18:25 :: 2,1 milliárd feletti yang adás után a chaten rosszul jelent meg a "n Yangot kaptál." üzenet, javítva(12-13-as pont).#03> 2015.05.09 18:45 :: 2,1 milliárd feletti yang adás gm paranccsal, hozzáadva(14-es pont).#04> 2015.05.09 19:20 :: #02 javítása kliens oldalon(13+1-es pont).#05> 2015.05.09 20:55 :: #02 javítása szerver oldalon(13.3-as pont).#06> 2015.07.04 10:56 :: Boltból való vásárlás esetén 4.294.967.296 yangot adott a szerver, javítva. Edited August 20, 2022 by Metin2 Dev Core X - External 2 Internal Link to comment Share on other sites More sharing options...
Premium TAUMP 825 Posted November 2, 2015 Premium Share Posted November 2, 2015 (edited) Tutorial from metin2hungary.net:(for me server side is good) 1 post: Szerver-common:1.) Nyisd meg a common/tables.h fájlt.1.1) Keresd meg a következő struktúrát: Kód: [Kijelölés] typedef struct SPlayerTable 1.2) Cseréld le benne az INT gold; sort erre: Kód: [Kijelölés] long long gold; Szerver-game:1.) Nyisd meg a packet.h fájlt és keress rá a következőkre: Kód: [Kijelölés] typedef struct packet_points typedef struct packet_point_change Cseréld le őket ezekre: Kód: [Kijelölés] typedef struct packet_points { BYTE header; long long points[POINT_MAX_NUM]; } TPacketGCPoints; typedef struct packet_point_change { int header; DWORD dwVID; BYTE type; long long amount; long long value; } TPacketGCPointChange; 2.) Nyisd meg a char.h fájlt és a következőket módosítsd: Kód: [Kijelölés] typedef struct character_point typedef struct character_point_instant Kód: [Kijelölés] long points[POINT_MAX_NUM]; long gold; Kód: [Kijelölés] long points[POINT_MAX_NUM]; Mind a háromnál írd át a típust long long-ra! 2.1) Keress rá erre: "// Money related" és az alatta lévő sorok így nézzenek ki: Kód: [Kijelölés] long long GetGold() const { return m_points.gold; } void SetGold(long long gold) { m_points.gold = gold; } bool DropGold(int gold); int GetAllowedGold() const; void GiveGold(int iAmount); // ĆÄĆĽ°ˇ ŔÖŔ¸¸é ĆÄĆĽ şĐąč, ·Î±× µîŔÇ Ăł¸® 3.) Nyisd meg a char.cpp fájlt. 3.1.1) Menj a következő eljáráshoz: Kód: [Kijelölés] void CHARACTER::OpenMyShop(const char * c_pszSign, TShopItemTable * pTable, BYTE bItemCount) 3.1.2) Keresd azon a helyen ahová érkeztél ezt(szintaxis nem azonos!): Kód: [Kijelölés] int64_t nTotalMoney = 0; for (int n = 0; n < bItemCount; ++n) nTotalMoney += static_cast<int64_t>((pTable+n)->price); nTotalMoney += static_cast<int64_t>(GetGold()); if (GOLD_MAX <= nTotalMoney) { sys_err("[OVERFLOW_GOLD] Overflow (GOLD_MAX) id %u name %s", GetPlayerID(), GetName()); ChatPacket(CHAT_TYPE_INFO, LC_TEXT("20ľď łÉŔ» ĂĘ°úÇĎż© »óÁˇŔ» żĽö°ˇ ľř˝Ŕ´Ď´Ů")); return; } 3.1.3) Cseréld le erre(e miatt írtam át a szintaxisát az előzőnek): Kód: [Kijelölés] long long nTotalMoney = 0; for (int n = 0; n < bItemCount; ++n) nTotalMoney += static_cast<long long>((pTable+n)->price); nTotalMoney += static_cast<long long>(GetGold()); if (g_llMaxGold < nTotalMoney) { sys_err("[OVERFLOW_GOLD] Overflow (GOLD_MAX) id %u name %s", GetPlayerID(), GetName()); ChatPacket(CHAT_TYPE_INFO, LC_TEXT("20ľď łÉŔ» ĂĘ°úÇĎż© »óÁˇŔ» żĽö°ˇ ľř˝Ŕ´Ď´Ů")); return; } Megjegyzésként: a g_llMaxGold változó a CONFIG fájlban lesz feltöltve értékkel, lesz róla szó. 3.2) Menj a "CHARACTER::Disconnect" eljáráshoz és cseréld le a következőt: Kód: [Kijelölés] snprintf(buf, sizeof(buf), "%s %d %d %ld %d", inet_ntoa(GetDesc()->GetAddr().sin_addr), GetGold(), g_bChannel, GetMapIndex(), GetAlignment()); Erre: Kód: [Kijelölés] snprintf(buf, sizeof(buf), "%s %lld %d %ld %d", inet_ntoa(GetDesc()->GetAddr().sin_addr), GetGold(), g_bChannel, GetMapIndex(), GetAlignment()); 3.3) Ugorj a "CHARACTER::PointChange" eljáráshoz. 3.3.1) A val változó típusát már az elején írd át long long-ra! 3.3.2) A "case POINT_GOLD:" ágat teljes egészében cseréld le erre: Kód: [Kijelölés] case POINT_GOLD: { long long newGold = MINMAXLL(0, static_cast<long long>(GetGold()) + static_cast<long long>(amount), g_llMaxGold); SetGold(newGold); val = GetGold(); } break; Megjegyzés: A MINMAXLL új függvény, de írok arról is majd. 3.3.3) Következőt, még a PointChange-en belül változtasd: Kód: [Kijelölés] if (bAmount) pack.amount = amount; else pack.amount = 0; Erre: Kód: [Kijelölés] if (bAmount) pack.amount = (long long)amount; else pack.amount = 0; 4.) Nyisd meg a char_item.cpp fájlt. 4.1) Keress rá erre: "GetGold()" és ahol találat van ott tegyél egy (long long)-ot a következők szerint: Kód: [Kijelölés] if (GetGold() < (long long)cost) if (GetGold() < (long long)prt->cost) if (gold <= 0 || (long long)gold > GetGold()) 5.) Nyisd meg a cmd_gm.cpp fájlt. 5.1) Keress rá a do_set parancsra és a GOLD ágat cseréld le: Kód: [Kijelölés] case 0: // gold { int gold = 0; str_to_number(gold, arg3); DBManager::instance().SendMoneyLog(MONEY_LOG_MISC, 3, gold); int before_gold = tch->GetGold(); tch->PointChange(POINT_GOLD, gold, true); int after_gold = tch->GetGold(); if (0 == after_gold && 0 != before_gold) { LogManager::instance().CharLog(tch, gold, "ZERO_GOLD", "GM"); } } break; Erre: Kód: [Kijelölés] case 0: // gold { int gold = 0; str_to_number(gold, arg3); DBManager::instance().SendMoneyLog(MONEY_LOG_MISC, 3, gold); long long before_gold = tch->GetGold(); tch->PointChange(POINT_GOLD, gold, true); long long after_gold = tch->GetGold(); if (0 == after_gold && 0 != before_gold) { LogManager::instance().CharLog(tch, gold, "ZERO_GOLD", "GM"); } } break; 5.) Nyisd meg az input_main.cpp fájlt. 5.1.1) Keress rá erre(2x lesz): Kód: [Kijelölés] if (ch->GetGold() >= GOLD_MAX) 5.1.2) Cseréld le erre mind a kettőt: Kód: [Kijelölés] if (ch->GetGold() > g_llMaxGold) 5.2.1) Tekerj, ugorj a "void CInputMain::Exchange" eljáráshoz. 5.2.2) Keresd ezt: Kód: [Kijelölés] case EXCHANGE_SUBHEADER_CG_ELK_ADD: 5.2.3) Az egész ágat cseréld le erre: Kód: [Kijelölés] case EXCHANGE_SUBHEADER_CG_ELK_ADD: // arg1 == amount of gold if (ch->GetExchange()) { const long long nTotalGold = static_cast<long long>(ch->GetExchange()->GetCompany()->GetOwner()->GetGold()) + static_cast<long long>(pinfo->arg1); if (g_llMaxGold < nTotalGold) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ó´ëąćŔÇ Ăѱݾ×ŔĚ 20ľď łÉŔ» ĂĘ°úÇĎż© °Ĺ·ˇ¸¦ ÇŇĽö°ˇ ľř˝Ŕ´Ď´Ů..")); sys_err("[OVERFLOW_GOLD] ELK_ADD (%lld) id %u name %s ", ch->GetExchange()->GetCompany()->GetOwner()->GetGold(), ch->GetExchange()->GetCompany()->GetOwner()->GetPlayerID(), ch->GetExchange()->GetCompany()->GetOwner()->GetName()); return; } if (ch->GetExchange()->GetCompany()->GetAcceptStatus() != true) ch->GetExchange()->AddGold(pinfo->arg1); } break; 6.) Nyisd meg a shopEx.cpp fájlt. 6.1.1) Keresd meg ezt a függvényt: Kód: [Kijelölés] int CShopEx::Buy 6.1.2) Majd az ott található elsőswitchben cseréld le az egész "case SHOP_COIN_TYPE_GOLD:" ágat erre: Kód: [Kijelölés] case SHOP_COIN_TYPE_GOLD: if (it->second) // if other empire, price is triple dwPrice *= 3; if (ch->GetGold() < (long long) dwPrice) { sys_log(1, "ShopEx::Buy : Not enough money : %s has %lld, price %d", ch->GetName(), ch->GetGold(), dwPrice); return SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY; } break; 7.) Nyisd meg a shop_manager.cpp fájlt. 7.1.1) Menj a "void CShopManager::Sell" nevű eljáráshoz. 7.1.2) Cseréld le a következőt: Kód: [Kijelölés] const int64_t nTotalMoney = static_cast<int64_t>(ch->GetGold()) + static_cast<int64_t>(dwPrice); if (GOLD_MAX <= nTotalMoney) { sys_err("[OVERFLOW_GOLD] id %u name %s gold %u", ch->GetPlayerID(), ch->GetName(), ch->GetGold()); ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("20ľďłÉŔĚ ĂĘ°úÇĎż© ą°Ç°Ŕ» ĆČĽö ľř˝Ŕ´Ď´Ů.")); return; } Erre: Kód: [Kijelölés] const long long nTotalMoney = static_cast<long long>(ch->GetGold()) + static_cast<long long>(dwPrice); if (g_llMaxGold < nTotalMoney) { sys_err("[OVERFLOW_GOLD] id %u name %s gold %lld", ch->GetPlayerID(), ch->GetName(), ch->GetGold()); ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("20ľďłÉŔĚ ĂĘ°úÇĎż© ą°Ç°Ŕ» ĆČĽö ľř˝Ŕ´Ď´Ů.")); return; } 8.) Nyisd meg a shop.cpp fájlt. 8.1.1) Keress rá erre: Kód: [Kijelölés] if (ch->GetGold() < (int) dwPrice) { sys_log(1, "Shop::Buy : Not enough money : %s has %d, price %d", ch->GetName(), ch->GetGold(), dwPrice); return SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY; } 8.1.2) Cseréld le erre: Kód: [Kijelölés] if (ch->GetGold() < dwPrice) { sys_log(1, "Shop::Buy : Not enough money : %s has %lld, price %d", ch->GetName(), ch->GetGold(), dwPrice); return SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY; } 9.) Nyisd meg a questlua_pc.cpp fájlt. 9.1.1) Keresd meg ezt: Kód: [Kijelölés] sys_err("QUEST wrong ChangeGold %d (now %d)", gold, ch->GetGold()); 9.1.2) Cseréld le erre: Kód: [Kijelölés] sys_err("QUEST wrong ChangeGold %d (now %lld)", gold, ch->GetGold()); 10.) Nyisd meg a config.h fájlt. 10.1) Illeszd be alulra a következő sort: Kód: [Kijelölés] extern long long g_llMaxGold; 11.) Nyisd meg a config.cpp fájlt. 11.1) A fájl elejére ahol a többi deklaráció van, illeszd be a következő sort: Kód: [Kijelölés] long long g_llMaxGold = 2140000000; 11.2.1) Keresd a következőt: Kód: [Kijelölés] // LOG_KEEP_DAYS_EXTEND log_set_expiration_days(2); // END_OF_LOG_KEEP_DAYS_EXTEND while (fgets(buf, 256, fp)) { parse_token(buf, token_string, value_string); 11.2.2) Alá illeszd be, a többi(alatta) mutatja, hogy hogy: Kód: [Kijelölés] TOKEN("max_gold") { long long money = 0; str_to_number(money, value_string); g_llMaxGold = MINMAXLL(2000000000, money, 9223372036854775807LL); fprintf(stderr, "PLAYER_MAX_GOLD: %lld\n", g_llMaxGold); } Szerver-db:1.) Nyisd meg a ClientManagerPlayer.cpp fájlt. 1.1.1) Keress rá erre: Kód: [Kijelölés] "gold = %d, " 1.1.2) Írd át erre: Kód: [Kijelölés] "gold = %lld, " 1.2.1) Keress rá erre: Kód: [Kijelölés] sys_log(0, "[PLAYER_LOAD] ID %s pid %d gold %d ", pTab->name, pTab->id, pTab->gold); 1.2.2) Írd át erre: Kód: [Kijelölés] sys_log(0, "[PLAYER_LOAD] ID %s pid %d gold %lld ", pTab->name, pTab->id, pTab->gold); 1.3.1) Keresd ezt az eljárást: "CClientManager::__QUERY_PLAYER_CREATE" 1.3.2) Cseréld le a következőt: Kód: [Kijelölés] else { peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0); return; } queryLen = snprintf(queryStr, sizeof(queryStr), "INSERT INTO player%s " "(id, account_id, name, level, st, ht, dx, iq, " "job, voice, dir, x, y, z, " "hp, mp, random_hp, random_sp, stat_point, stamina, part_base, part_main, part_hair, gold, playtime, " "skill_level, quickslot) " "VALUES(0, %u, '%s', %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, %d, 0, %d, 0, ", GetTablePostfix(), packet->account_id, packet->player_table.name, packet->player_table.level, packet->player_table.st, packet->player_table.ht, packet->player_table.dx, packet->player_table.iq, packet->player_table.job, packet->player_table.voice, packet->player_table.dir, packet->player_table.x, packet->player_table.y, packet->player_table.z, packet->player_table.hp, packet->player_table.sp, packet->player_table.sRandomHP, packet->player_table.sRandomSP, packet->player_table.stat_point, packet->player_table.stamina, packet->player_table.part_base, packet->player_table.part_base, packet->player_table.gold); sys_log(0, "PlayerCreate accountid %d name %s level %d gold %d, st %d ht %d job %d", packet->account_id, packet->player_table.name, packet->player_table.level, packet->player_table.gold, packet->player_table.st, packet->player_table.ht, packet->player_table.job); 1.3.3) Erre: Kód: [Kijelölés] else { peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0); return; } queryLen = snprintf(queryStr, sizeof(queryStr), "INSERT INTO player%s " "(id, account_id, name, level, st, ht, dx, iq, " "job, voice, dir, x, y, z, " "hp, mp, random_hp, random_sp, stat_point, stamina, part_base, part_main, part_hair, gold, playtime, " "skill_level, quickslot) " "VALUES(0, %u, '%s', %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, %d, 0, %lld, 0, ", GetTablePostfix(), packet->account_id, packet->player_table.name, packet->player_table.level, packet->player_table.st, packet->player_table.ht, packet->player_table.dx, packet->player_table.iq, packet->player_table.job, packet->player_table.voice, packet->player_table.dir, packet->player_table.x, packet->player_table.y, packet->player_table.z, packet->player_table.hp, packet->player_table.sp, packet->player_table.sRandomHP, packet->player_table.sRandomSP, packet->player_table.stat_point, packet->player_table.stamina, packet->player_table.part_base, packet->player_table.part_base, packet->player_table.gold); sys_log(0, "PlayerCreate accountid %d name %s level %d gold %lld, st %d ht %d job %d", packet->account_id, packet->player_table.name, packet->player_table.level, packet->player_table.gold, packet->player_table.st, packet->player_table.ht, packet->player_table.job); 1.4) Menj nvaicatba, és módosítsd a player.player tábla gold mezőjét bigint-re valamint növeld a mező karakterszélességét, pld 20-ra. Jobbklikk a player táblán -> Design table és ott már gyerekjáték.Szerver-thecore:1.) Menj a libthecore/src mappába és nyisd meg az utils.c fájlt. 1.1.1) Keresd ezt a függvényt: Kód: [Kijelölés] int MINMAX(int min, int value, int max) 1.1.2) Alá illeszd be a következőket: Kód: [Kijelölés] long long MAXLL(long long a, long long b) { return a < b ? a : b; } long long MINLL(long long a, long long b) { return a > b ? a : b; } long long MINMAXLL(long long min, long long val, long long max) { register long long tv; tv = (min > val ? min : val); return (max < tv) ? max : tv; } 2.) Menj a libthecore/include mappába és nyisd meg az utils.h fájlt 2.1.1) Keresd a következő sort: Kód: [Kijelölés] extern int MINMAX(int min, int value, int max); 2.1.2) Alá illeszd be a következőket: Kód: [Kijelölés] extern long long MAXLL(long long a, long long b); extern long long MINLL(long long a, long long b); extern long long MINMAXLL(long long min, long long val, long long max); Kliens-bin:1.) Nyisd meg a Packet.h fájlt. 1.1) Keresd meg a következő struktúrákat: Kód: [Kijelölés] typedef struct packet_points typedef struct packet_point_change 1.2) Cseréld le őket erre: Kód: [Kijelölés] typedef struct packet_points { BYTE header; long long points[POINT_MAX_NUM]; } TPacketGCPoints; typedef struct packet_point_change { int header; DWORD dwVID; BYTE Type; long long amount; // ąŮ˛ď °Ş long long value; // ÇöŔç °Ş } TPacketGCPointChange; 2.) Nyisd meg az AbstractPlayer.h fájlt. 2.1) Keresd meg ezt a sort: Kód: [Kijelölés] virtual int GetStatus(DWORD dwType) = 0; 2.2) Cseréld le erre: Kód: [Kijelölés] virtual long long GetStatus(DWORD dwType) = 0; 3.) Nyisd meg a PythonPlayer.h fájlt. 3.1.1) Keresd meg ezt a struktúrát: "typedef struct SPlayerStatus" 3.1.2) Cseréld le erre: Kód: [Kijelölés] typedef struct SPlayerStatus { TItemData aItem[c_Inventory_Count]; TItemData aDSItem[c_DragonSoul_Inventory_Count]; TQuickSlot aQuickSlot[QUICKSLOT_MAX_NUM]; TSkillInstance aSkill[SKILL_MAX_NUM]; long long m_alPoint[POINT_MAX_NUM]; long lQuickPageIndex; void SetPoint(UINT ePoint, long long lPoint); long long GetPoint(UINT ePoint); } TPlayerStatus; 3.2.1) Keresd ezeket a sorokat: Kód: [Kijelölés] void SetStatus(DWORD dwType, long lValue); int GetStatus(DWORD dwType); 3.2.2) Majd módosítsd így: Kód: [Kijelölés] void SetStatus(DWORD dwType, long long lValue); long long GetStatus(DWORD dwType); 4.) Nyisd meg a PythonPlayer.cpp fájlt. 4.1.1) Keresd meg ezt: Kód: [Kijelölés] const DWORD POINT_MAGIC_NUMBER = 0xe73ac1da; 4.1.2) A típusát írd át long long-ra, tehát így nézzen ki: Kód: [Kijelölés] const long long POINT_MAGIC_NUMBER = 0xe73ac1da; 4.2) Rögtön az alatta lévő eljárást és függvényt is módosíthatod a következő példa szerint: Kód: [Kijelölés] void CPythonPlayer::SPlayerStatus::SetPoint(UINT ePoint, long long lPoint) { m_alPoint[ePoint]=lPoint ^ POINT_MAGIC_NUMBER; } long long CPythonPlayer::SPlayerStatus::GetPoint(UINT ePoint) { return m_alPoint[ePoint] ^ POINT_MAGIC_NUMBER; } 4.3.1) Keresd meg ezt a sort: Kód: [Kijelölés] void CPythonPlayer::SetStatus(DWORD dwType, long lValue) 4.3.2) Cseréld le erre: Kód: [Kijelölés] void CPythonPlayer::SetStatus(DWORD dwType, long long lValue) 4.4.1) Keresd meg ezt a sort: Kód: [Kijelölés] int CPythonPlayer::GetStatus(DWORD dwType) 4.4.2) Cseréld le erre: Kód: [Kijelölés] long long CPythonPlayer::GetStatus(DWORD dwType) 5.) Nyisd meg a PythonPlayerModule.cpp fájlt. 5.1.1) Keresd meg a playerGetElk parancsot. 5.1.2) Majd cseréld le erre: Kód: [Kijelölés] PyObject * playerGetElk(PyObject* poSelf, PyObject* poArgs) { long long llGold = CPythonPlayer::Instance().GetStatus(POINT_GOLD); #ifdef _DEBUG Tracef("GetElk(): %lld\n", llGold); #endif return PyLong_FromLongLong(llGold); } -- Végül CONFIG fájlban meghatározhatod a maximális yangmennyiséget egy játékosnál. Túllépni nem tudja, nem ugrik át 0-ra a MINMAXLL megakadályoz mindent Nekem a limit 20.000.000.000 azaz 20milliárd, de ez nyugodtan lehet több. Kód: [Kijelölés] MAX_GOLD: 20000000000 -- Ha valami kimaradt volna, vagy valami hibádzik PM, ha segítség kell a berakáshoz ott a segítség topic.Ne feledd a módosított libthecore forrását lefordítani, mielőtt a game forrást fordítod! Remélem nem hagytam ki semmit :3 -- Changelog: #01: 2015.05.02. 20:22 :: config.cpp fájlban volt egy kis unix-win fordítási különbözet a MAXLONGLONG változóval kapcsolatban, ezért az helyettesítve lett a LONGLONG maximális értékével. #02: 2015.05.08. 16:17 :: Elírás javítás. (AbstractPlayer.cpp --> AbstractPlayer.h) -- Külön köszönet Disco/Sanchez-t illeti, amiért annak idején (forrás publikálás után) segített benne.« Utoljára szerkesztve: 2015-05-08, 16:17:02 by [VIP]P3NG3R » 2 post: Mivel több mint valószínű, hogy meghaladta volna az első post a 20.000 karakterszámot, így kénytelen voltam új hozzászólást írni.Választható módosítások:Fontos tudni!Ezeket nem kötelező, de ajánlott elvégezni; ha questtel 2,1md feletti yangot akarsz kiosztani jutalomként.Valamint ha bővíteni szeretnéd a kereskedésben átadható yang küszöböt.Quest pc.change_gold; (click to show/hide) 1.) Nyisd meg a char.h fájlt.1.1) Keress rá erre:Kód: [Kijelölés] PointChange(BYTE type, int amount, bool bAmount = false, bool bBroadcast = false); 1.2) Írd át az amount változó típusát long long-ra, vagy cseréld le erre:Kód: [Kijelölés] PointChange(BYTE type, long long amount, bool bAmount = false, bool bBroadcast = false); 2.) Nyisd meg a char.cpp fájlt.2.1) Keress rá a következő eljárásra:Kód: [Kijelölés] void CHARACTER::PointChange(BYTE type, int amount, bool bAmount, bool bBroadcast) 2.2) Írd át itt is az amount változó típusát long long-ra, vagy cseréld le erre:Kód: [Kijelölés] void CHARACTER::PointChange(BYTE type, long long amount, bool bAmount, bool bBroadcast) 3.) Nyisd meg a questlua_pc.cpp fájlt.3.1) Keresd meg a következő függvényt:Kód: [Kijelölés] int pc_change_money(lua_State * L) 3.2) Cseréld le az egészet erre:Kód: [Kijelölés] int pc_change_money(lua_State * L) { LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); if (!ch) return 0; if (!lua_isnumber(L, -1)) { sys_err("QUEST : wrong argument"); return 0; } long long llGold = (long long)lua_tonumber(L, -1); if (llGold + ch->GetGold() < 0) sys_err("QUEST wrong ChangeGold %d (now %lld)", llGold, ch->GetGold()); else { DBManager::instance().SendMoneyLog(MONEY_LOG_QUEST, ch->GetPlayerID(), llGold); ch->PointChange(POINT_GOLD, llGold, true); } return 0; } 3.3) Az összes give_gold, givegold stb variációnak ezt a parancsot add meg! És a pc_give_gold törölhető is. Hogy miért? Mert az alapból nem ellenőrzi, hogy átadható-e annyi yang, amennyit tényleg akarsz adni.Kód: [Kijelölés] { "givegold", pc_change_money }, { "give_gold", pc_change_money }, Ajh, ahogy láthatod a SendMoneyLog megkapja a gold változót, ami már nem int, így ott is alakítani kell.Ez a változtatás érinteni fogja a db-t is!4.) Nyisd meg a common/tables.h fájlt.4.1) Keresd ezt a struktúrát:Kód: [Kijelölés] typedef struct SPacketMoneyLog 4.2) Az ott található INT típusú gold változót írd át long long típúsúra.Kód: [Kijelölés] typedef struct SPacketMoneyLog { BYTE type; DWORD vnum; long long gold; } TPacketMoneyLog; 5.) Vissza a game mappába. Nyisd meg a db.h fájlt.5.1) Keresd meg ezt:Kód: [Kijelölés] SendMoneyLog(BYTE type, DWORD vnum, int gold); 5.2) Magától értetődő, hogy a változót long long-osítani kell Kód: [Kijelölés] SendMoneyLog(BYTE type, DWORD vnum, long long gold); 6.) Ezt megtesszük a db.cpp fájlban is.6.1) Keresd meg ezt a sort:Kód: [Kijelölés] void DBManager::SendMoneyLog(BYTE type, DWORD vnum, int gold) 6.2) Majd cseréld le erre:Kód: [Kijelölés] void DBManager::SendMoneyLog(BYTE type, DWORD vnum, long long gold) 7.) Nyisd meg a log.h fájlt.7.1) Keresd meg a következő sort:Kód: [Kijelölés] MoneyLog(BYTE type, DWORD vnum, int gold); 7.2) Majd a gold típusát írd át:Kód: [Kijelölés] MoneyLog(BYTE type, DWORD vnum, long long gold); 8.) Nyisd meg a log.cpp fájlt.8.1) Keresd meg a következő eljárást:Kód: [Kijelölés] void LogManager::MoneyLog(BYTE type, DWORD vnum, int gold) 8.2) Ha megvan cseréld le az egészet erre:Kód: [Kijelölés] void LogManager::MoneyLog(BYTE type, DWORD vnum, long long gold) { if (type == MONEY_LOG_RESERVED || type >= MONEY_LOG_TYPE_MAX_NUM) { sys_err("TYPE ERROR: type %d vnum %u gold %lld", type, vnum, gold); return; } Query("INSERT DELAYED INTO money_log%s VALUES (NOW(), %d, %d, %lld)", get_table_postfix(), type, vnum, gold); } 9.) Ugrunk a db mappába. Nyisd meg a MoneyLog.h fájlt.9.1) A következő sorokat:Kód: [Kijelölés] void AddLog(BYTE bType, DWORD dwVnum, int iGold); std::map<DWORD, int> m_MoneyLogContainer[MONEY_LOG_TYPE_MAX_NUM]; 9.2) Cseréld le, azaz így nézzenek ki:Kód: [Kijelölés] void AddLog(BYTE bType, DWORD dwVnum, long long llGold); std::map<DWORD, long long> m_MoneyLogContainer[MONEY_LOG_TYPE_MAX_NUM]; 10.) Nyisd meg a MoneyLog.cpp fájlt.10.1) Keresd meg a következő eljárást:Kód: [Kijelölés] void CMoneyLog::AddLog(BYTE bType, DWORD dwVnum, int iGold) 10.2) Cseréld le az egész eljárást erre:Kód: [Kijelölés] void CMoneyLog::AddLog(BYTE bType, DWORD dwVnum, long long llGold) { m_MoneyLogContainer[bType][dwVnum] += llGold; } 11.) Irány navicat, log adatbázis, money_log tábla -> Design table -> pid mező típusa legyen bigint, a hossza pedig 20.UPDATE#02:12.) Nyisd meg a char_item.cpp fájlt.12.1) A következő szöveget keresd:Kód: [Kijelölés] µ· %d łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů. 12.2) És ahány találat van(általában 5), mindet cseréld le erre:Kód: [Kijelölés] µ· %lld łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů. 13.) Nyisd meg a questlua_pc.cpp fájlt.13.1) Itt is végezd el az előbbieket, keresd ezt:Kód: [Kijelölés] µ· %d łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů. 13.2) És cseréld le erre:Kód: [Kijelölés] µ· %lld łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů. 14.) Forráson kívüli módosítás!!444 locale_string.txt fájlt nyisd meg.14.1) A következő sorpárt keresd:Kód: [Kijelölés] "µ· %d łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů."; "%d Yangot kaptál."; 13.2) Így nézzen ki:Kód: [Kijelölés] "µ· %lld łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů."; "%lld Yangot kaptál."; 13.3) Ahol le lett cserélve forrásban az LC_TEXT("µ· %d łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů."), azon a soron belül a hozzá tartozó paraméter adattípusát long long-gá kell tenni! Mutatok két példát rá az érintett részekről.Kód: [Kijelölés] ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µ· %lld łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů."), static_cast<long long>(dwCounts)); //// case ITEM_ELK_VNUM: // µ·˛Ů·ŻąĚ { long long llGold = (long long)item->GetSocket(0); ITEM_MANAGER::instance().RemoveItem(item); ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µ· %lld łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů."), llGold); PointChange(POINT_GOLD, llGold); } break; 13+1) Nyisd meg a Client/Userinterface/PythonNetworkStreamPhaseGame.cpp fájlt.13+1.1) Keresd meg ezt a részt: Kód: [Kijelölés] if (POINT_GOLD == PointChange.Type) { if (PointChange.amount > 0) { PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnPickMoney", Py_BuildValue("(i)", PointChange.amount)); } } 13+1.2) Cseréld le erre: Kód: [Kijelölés] if (POINT_GOLD == PointChange.Type) { if (PointChange.amount > 0) { PyObject *args = PyTuple_New(1); PyTuple_SetItem(args, 0, PyLong_FromLongLong(PointChange.amount)); PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnPickMoney", args); } } UPDATE#03:14.) Nyisd meg a cmd_gm.cpp fájlt.14.1) Keresd meg a következő parancsot: Kód: [Kijelölés] ACMD(do_set) 14.2) Tekerj le amíg a yangos részhez nem érsz (case 0: ) és a "gold = 0" típusát írd át long long-ra. Kód: [Kijelölés] case 0: // gold { long long gold = 0; str_to_number(gold, arg3); DBManager::instance().SendMoneyLog(MONEY_LOG_MISC, 3, gold); long long before_gold = tch->GetGold(); tch->PointChange(POINT_GOLD, gold, true); long long after_gold = tch->GetGold(); if (0 == after_gold && 0 != before_gold) { LogManager::instance().CharLog(tch, gold, "ZERO_GOLD", "GM"); } } break; 14.3) Tekerj a parancs aljára, ehhez: Kód: [Kijelölés] if (set_fields.type == NUMBER) { int amount = 0; str_to_number(amount, arg3); ch->ChatPacket(CHAT_TYPE_INFO, "%s's %s set to [%d]", tch->GetName(), set_fields.cmd, amount); } 14.4) Cseréld le erre: Kód: [Kijelölés] if (set_fields.type == NUMBER) { long long amount = 0; str_to_number(amount, arg3); ch->ChatPacket(CHAT_TYPE_INFO, "%s's %s set to [%lld]", tch->GetName(), set_fields.cmd, amount); } Kereskedésben átadható yang: (click to show/hide) #06: Vásárlási hibajavítás: (click to show/hide) 1.) Nyisd meg a shop.cpp fájlt.1.1) Keress rá a következő sorra: Kód: [Kijelölés] DWORD dwPrice = r_item.price; 1.2) Cseréld le erre: Kód: [Kijelölés] long long llPrice = static_cast<long long>(r_item.price); 1.3) Majd mindenhol(A CShop::Buy függvényen belül!!) a dwPrice-t írd át llPrice-ra1.4) Ahol az újonnan llPrice-ként szereplő változó formázott szövegként van meghívva(%d/%u), írd át %lld-re. Felsorolom az érintett, már átírt sorokat. Kód: [Kijelölés] sys_log(1, "Shop::Buy : Not enough money : %s has %lld, price %lld", ch->GetName(), ch->GetGold(), llPrice); snprintf(buf, sizeof(buf), "%s FROM: %u TO: %u PRICE: %lld", item->GetName(), ch->GetPlayerID(), m_pkPC->GetPlayerID(), llPrice); snprintf(buf, sizeof(buf), "%s %u(%s) %lld %u", item->GetName(), m_pkPC->GetPlayerID(), m_pkPC->GetName(), llPrice, item->GetCount()); snprintf(buf, sizeof(buf), "%s %u(%s) %lld %u", item->GetName(), ch->GetPlayerID(), ch->GetName(), llPrice, item->GetCount()); sys_log(0, "SHOP: BUY: name %s %s(x %d):%u price %lld", ch->GetName(), item->GetName(), item->GetCount(), item->GetID(), llPrice); --Changelog:#01> 2015.05.09 14:30 :: pc_change_money fv-ben véletlen letiltottam a negatív értékadást, ezt orvosoltam(3.2-es pont), köszi masodikbela.#02> 2015.05.09 18:25 :: 2,1 milliárd feletti yang adás után a chaten rosszul jelent meg a "n Yangot kaptál." üzenet, javítva(12-13-as pont).#03> 2015.05.09 18:45 :: 2,1 milliárd feletti yang adás gm paranccsal, hozzáadva(14-es pont).#04> 2015.05.09 19:20 :: #02 javítása kliens oldalon(13+1-es pont).#05> 2015.05.09 20:55 :: #02 javítása szerver oldalon(13.3-as pont).#06> 2015.07.04 10:56 :: Boltból való vásárlás esetén 4.294.967.296 yangot adott a szerver, javítva. Tutorial from metin2hungary.net:(for me server side is good) 1 post: Szerver-common:1.) Nyisd meg a common/tables.h fájlt.1.1) Keresd meg a következő struktúrát: Kód: [Kijelölés] typedef struct SPlayerTable 1.2) Cseréld le benne az INT gold; sort erre: Kód: [Kijelölés] long long gold; Szerver-game:1.) Nyisd meg a packet.h fájlt és keress rá a következőkre: Kód: [Kijelölés] typedef struct packet_points typedef struct packet_point_change Cseréld le őket ezekre: Kód: [Kijelölés] typedef struct packet_points { BYTE header; long long points[POINT_MAX_NUM]; } TPacketGCPoints; typedef struct packet_point_change { int header; DWORD dwVID; BYTE type; long long amount; long long value; } TPacketGCPointChange; 2.) Nyisd meg a char.h fájlt és a következőket módosítsd: Kód: [Kijelölés] typedef struct character_point typedef struct character_point_instant Kód: [Kijelölés] long points[POINT_MAX_NUM]; long gold; Kód: [Kijelölés] long points[POINT_MAX_NUM]; Mind a háromnál írd át a típust long long-ra! 2.1) Keress rá erre: "// Money related" és az alatta lévő sorok így nézzenek ki: Kód: [Kijelölés] long long GetGold() const { return m_points.gold; } void SetGold(long long gold) { m_points.gold = gold; } bool DropGold(int gold); int GetAllowedGold() const; void GiveGold(int iAmount); // ĆÄĆĽ°ˇ ŔÖŔ¸¸é ĆÄĆĽ şĐąč, ·Î±× µîŔÇ Ăł¸® 3.) Nyisd meg a char.cpp fájlt. 3.1.1) Menj a következő eljáráshoz: Kód: [Kijelölés] void CHARACTER::OpenMyShop(const char * c_pszSign, TShopItemTable * pTable, BYTE bItemCount) 3.1.2) Keresd azon a helyen ahová érkeztél ezt(szintaxis nem azonos!): Kód: [Kijelölés] int64_t nTotalMoney = 0; for (int n = 0; n < bItemCount; ++n) nTotalMoney += static_cast<int64_t>((pTable+n)->price); nTotalMoney += static_cast<int64_t>(GetGold()); if (GOLD_MAX <= nTotalMoney) { sys_err("[OVERFLOW_GOLD] Overflow (GOLD_MAX) id %u name %s", GetPlayerID(), GetName()); ChatPacket(CHAT_TYPE_INFO, LC_TEXT("20ľď łÉŔ» ĂĘ°úÇĎż© »óÁˇŔ» żĽö°ˇ ľř˝Ŕ´Ď´Ů")); return; } 3.1.3) Cseréld le erre(e miatt írtam át a szintaxisát az előzőnek): Kód: [Kijelölés] long long nTotalMoney = 0; for (int n = 0; n < bItemCount; ++n) nTotalMoney += static_cast<long long>((pTable+n)->price); nTotalMoney += static_cast<long long>(GetGold()); if (g_llMaxGold < nTotalMoney) { sys_err("[OVERFLOW_GOLD] Overflow (GOLD_MAX) id %u name %s", GetPlayerID(), GetName()); ChatPacket(CHAT_TYPE_INFO, LC_TEXT("20ľď łÉŔ» ĂĘ°úÇĎż© »óÁˇŔ» żĽö°ˇ ľř˝Ŕ´Ď´Ů")); return; } Megjegyzésként: a g_llMaxGold változó a CONFIG fájlban lesz feltöltve értékkel, lesz róla szó. 3.2) Menj a "CHARACTER::Disconnect" eljáráshoz és cseréld le a következőt: Kód: [Kijelölés] snprintf(buf, sizeof(buf), "%s %d %d %ld %d", inet_ntoa(GetDesc()->GetAddr().sin_addr), GetGold(), g_bChannel, GetMapIndex(), GetAlignment()); Erre: Kód: [Kijelölés] snprintf(buf, sizeof(buf), "%s %lld %d %ld %d", inet_ntoa(GetDesc()->GetAddr().sin_addr), GetGold(), g_bChannel, GetMapIndex(), GetAlignment()); 3.3) Ugorj a "CHARACTER::PointChange" eljáráshoz. 3.3.1) A val változó típusát már az elején írd át long long-ra! 3.3.2) A "case POINT_GOLD:" ágat teljes egészében cseréld le erre: Kód: [Kijelölés] case POINT_GOLD: { long long newGold = MINMAXLL(0, static_cast<long long>(GetGold()) + static_cast<long long>(amount), g_llMaxGold); SetGold(newGold); val = GetGold(); } break; Megjegyzés: A MINMAXLL új függvény, de írok arról is majd. 3.3.3) Következőt, még a PointChange-en belül változtasd: Kód: [Kijelölés] if (bAmount) pack.amount = amount; else pack.amount = 0; Erre: Kód: [Kijelölés] if (bAmount) pack.amount = (long long)amount; else pack.amount = 0; 4.) Nyisd meg a char_item.cpp fájlt. 4.1) Keress rá erre: "GetGold()" és ahol találat van ott tegyél egy (long long)-ot a következők szerint: Kód: [Kijelölés] if (GetGold() < (long long)cost) if (GetGold() < (long long)prt->cost) if (gold <= 0 || (long long)gold > GetGold()) 5.) Nyisd meg a cmd_gm.cpp fájlt. 5.1) Keress rá a do_set parancsra és a GOLD ágat cseréld le: Kód: [Kijelölés] case 0: // gold { int gold = 0; str_to_number(gold, arg3); DBManager::instance().SendMoneyLog(MONEY_LOG_MISC, 3, gold); int before_gold = tch->GetGold(); tch->PointChange(POINT_GOLD, gold, true); int after_gold = tch->GetGold(); if (0 == after_gold && 0 != before_gold) { LogManager::instance().CharLog(tch, gold, "ZERO_GOLD", "GM"); } } break; Erre: Kód: [Kijelölés] case 0: // gold { int gold = 0; str_to_number(gold, arg3); DBManager::instance().SendMoneyLog(MONEY_LOG_MISC, 3, gold); long long before_gold = tch->GetGold(); tch->PointChange(POINT_GOLD, gold, true); long long after_gold = tch->GetGold(); if (0 == after_gold && 0 != before_gold) { LogManager::instance().CharLog(tch, gold, "ZERO_GOLD", "GM"); } } break; 5.) Nyisd meg az input_main.cpp fájlt. 5.1.1) Keress rá erre(2x lesz): Kód: [Kijelölés] if (ch->GetGold() >= GOLD_MAX) 5.1.2) Cseréld le erre mind a kettőt: Kód: [Kijelölés] if (ch->GetGold() > g_llMaxGold) 5.2.1) Tekerj, ugorj a "void CInputMain::Exchange" eljáráshoz. 5.2.2) Keresd ezt: Kód: [Kijelölés] case EXCHANGE_SUBHEADER_CG_ELK_ADD: 5.2.3) Az egész ágat cseréld le erre: Kód: [Kijelölés] case EXCHANGE_SUBHEADER_CG_ELK_ADD: // arg1 == amount of gold if (ch->GetExchange()) { const long long nTotalGold = static_cast<long long>(ch->GetExchange()->GetCompany()->GetOwner()->GetGold()) + static_cast<long long>(pinfo->arg1); if (g_llMaxGold < nTotalGold) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ó´ëąćŔÇ Ăѱݾ×ŔĚ 20ľď łÉŔ» ĂĘ°úÇĎż© °Ĺ·ˇ¸¦ ÇŇĽö°ˇ ľř˝Ŕ´Ď´Ů..")); sys_err("[OVERFLOW_GOLD] ELK_ADD (%lld) id %u name %s ", ch->GetExchange()->GetCompany()->GetOwner()->GetGold(), ch->GetExchange()->GetCompany()->GetOwner()->GetPlayerID(), ch->GetExchange()->GetCompany()->GetOwner()->GetName()); return; } if (ch->GetExchange()->GetCompany()->GetAcceptStatus() != true) ch->GetExchange()->AddGold(pinfo->arg1); } break; 6.) Nyisd meg a shopEx.cpp fájlt. 6.1.1) Keresd meg ezt a függvényt: Kód: [Kijelölés] int CShopEx::Buy 6.1.2) Majd az ott található elsőswitchben cseréld le az egész "case SHOP_COIN_TYPE_GOLD:" ágat erre: Kód: [Kijelölés] case SHOP_COIN_TYPE_GOLD: if (it->second) // if other empire, price is triple dwPrice *= 3; if (ch->GetGold() < (long long) dwPrice) { sys_log(1, "ShopEx::Buy : Not enough money : %s has %lld, price %d", ch->GetName(), ch->GetGold(), dwPrice); return SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY; } break; 7.) Nyisd meg a shop_manager.cpp fájlt. 7.1.1) Menj a "void CShopManager::Sell" nevű eljáráshoz. 7.1.2) Cseréld le a következőt: Kód: [Kijelölés] const int64_t nTotalMoney = static_cast<int64_t>(ch->GetGold()) + static_cast<int64_t>(dwPrice); if (GOLD_MAX <= nTotalMoney) { sys_err("[OVERFLOW_GOLD] id %u name %s gold %u", ch->GetPlayerID(), ch->GetName(), ch->GetGold()); ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("20ľďłÉŔĚ ĂĘ°úÇĎż© ą°Ç°Ŕ» ĆČĽö ľř˝Ŕ´Ď´Ů.")); return; } Erre: Kód: [Kijelölés] const long long nTotalMoney = static_cast<long long>(ch->GetGold()) + static_cast<long long>(dwPrice); if (g_llMaxGold < nTotalMoney) { sys_err("[OVERFLOW_GOLD] id %u name %s gold %lld", ch->GetPlayerID(), ch->GetName(), ch->GetGold()); ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("20ľďłÉŔĚ ĂĘ°úÇĎż© ą°Ç°Ŕ» ĆČĽö ľř˝Ŕ´Ď´Ů.")); return; } 8.) Nyisd meg a shop.cpp fájlt. 8.1.1) Keress rá erre: Kód: [Kijelölés] if (ch->GetGold() < (int) dwPrice) { sys_log(1, "Shop::Buy : Not enough money : %s has %d, price %d", ch->GetName(), ch->GetGold(), dwPrice); return SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY; } 8.1.2) Cseréld le erre: Kód: [Kijelölés] if (ch->GetGold() < dwPrice) { sys_log(1, "Shop::Buy : Not enough money : %s has %lld, price %d", ch->GetName(), ch->GetGold(), dwPrice); return SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY; } 9.) Nyisd meg a questlua_pc.cpp fájlt. 9.1.1) Keresd meg ezt: Kód: [Kijelölés] sys_err("QUEST wrong ChangeGold %d (now %d)", gold, ch->GetGold()); 9.1.2) Cseréld le erre: Kód: [Kijelölés] sys_err("QUEST wrong ChangeGold %d (now %lld)", gold, ch->GetGold()); 10.) Nyisd meg a config.h fájlt. 10.1) Illeszd be alulra a következő sort: Kód: [Kijelölés] extern long long g_llMaxGold; 11.) Nyisd meg a config.cpp fájlt. 11.1) A fájl elejére ahol a többi deklaráció van, illeszd be a következő sort: Kód: [Kijelölés] long long g_llMaxGold = 2140000000; 11.2.1) Keresd a következőt: Kód: [Kijelölés] // LOG_KEEP_DAYS_EXTEND log_set_expiration_days(2); // END_OF_LOG_KEEP_DAYS_EXTEND while (fgets(buf, 256, fp)) { parse_token(buf, token_string, value_string); 11.2.2) Alá illeszd be, a többi(alatta) mutatja, hogy hogy: Kód: [Kijelölés] TOKEN("max_gold") { long long money = 0; str_to_number(money, value_string); g_llMaxGold = MINMAXLL(2000000000, money, 9223372036854775807LL); fprintf(stderr, "PLAYER_MAX_GOLD: %lld\n", g_llMaxGold); } Szerver-db:1.) Nyisd meg a ClientManagerPlayer.cpp fájlt. 1.1.1) Keress rá erre: Kód: [Kijelölés] "gold = %d, " 1.1.2) Írd át erre: Kód: [Kijelölés] "gold = %lld, " 1.2.1) Keress rá erre: Kód: [Kijelölés] sys_log(0, "[PLAYER_LOAD] ID %s pid %d gold %d ", pTab->name, pTab->id, pTab->gold); 1.2.2) Írd át erre: Kód: [Kijelölés] sys_log(0, "[PLAYER_LOAD] ID %s pid %d gold %lld ", pTab->name, pTab->id, pTab->gold); 1.3.1) Keresd ezt az eljárást: "CClientManager::__QUERY_PLAYER_CREATE" 1.3.2) Cseréld le a következőt: Kód: [Kijelölés] else { peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0); return; } queryLen = snprintf(queryStr, sizeof(queryStr), "INSERT INTO player%s " "(id, account_id, name, level, st, ht, dx, iq, " "job, voice, dir, x, y, z, " "hp, mp, random_hp, random_sp, stat_point, stamina, part_base, part_main, part_hair, gold, playtime, " "skill_level, quickslot) " "VALUES(0, %u, '%s', %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, %d, 0, %d, 0, ", GetTablePostfix(), packet->account_id, packet->player_table.name, packet->player_table.level, packet->player_table.st, packet->player_table.ht, packet->player_table.dx, packet->player_table.iq, packet->player_table.job, packet->player_table.voice, packet->player_table.dir, packet->player_table.x, packet->player_table.y, packet->player_table.z, packet->player_table.hp, packet->player_table.sp, packet->player_table.sRandomHP, packet->player_table.sRandomSP, packet->player_table.stat_point, packet->player_table.stamina, packet->player_table.part_base, packet->player_table.part_base, packet->player_table.gold); sys_log(0, "PlayerCreate accountid %d name %s level %d gold %d, st %d ht %d job %d", packet->account_id, packet->player_table.name, packet->player_table.level, packet->player_table.gold, packet->player_table.st, packet->player_table.ht, packet->player_table.job); 1.3.3) Erre: Kód: [Kijelölés] else { peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0); return; } queryLen = snprintf(queryStr, sizeof(queryStr), "INSERT INTO player%s " "(id, account_id, name, level, st, ht, dx, iq, " "job, voice, dir, x, y, z, " "hp, mp, random_hp, random_sp, stat_point, stamina, part_base, part_main, part_hair, gold, playtime, " "skill_level, quickslot) " "VALUES(0, %u, '%s', %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, %d, 0, %lld, 0, ", GetTablePostfix(), packet->account_id, packet->player_table.name, packet->player_table.level, packet->player_table.st, packet->player_table.ht, packet->player_table.dx, packet->player_table.iq, packet->player_table.job, packet->player_table.voice, packet->player_table.dir, packet->player_table.x, packet->player_table.y, packet->player_table.z, packet->player_table.hp, packet->player_table.sp, packet->player_table.sRandomHP, packet->player_table.sRandomSP, packet->player_table.stat_point, packet->player_table.stamina, packet->player_table.part_base, packet->player_table.part_base, packet->player_table.gold); sys_log(0, "PlayerCreate accountid %d name %s level %d gold %lld, st %d ht %d job %d", packet->account_id, packet->player_table.name, packet->player_table.level, packet->player_table.gold, packet->player_table.st, packet->player_table.ht, packet->player_table.job); 1.4) Menj nvaicatba, és módosítsd a player.player tábla gold mezőjét bigint-re valamint növeld a mező karakterszélességét, pld 20-ra. Jobbklikk a player táblán -> Design table és ott már gyerekjáték.Szerver-thecore:1.) Menj a libthecore/src mappába és nyisd meg az utils.c fájlt. 1.1.1) Keresd ezt a függvényt: Kód: [Kijelölés] int MINMAX(int min, int value, int max) 1.1.2) Alá illeszd be a következőket: Kód: [Kijelölés] long long MAXLL(long long a, long long b) { return a < b ? a : b; } long long MINLL(long long a, long long b) { return a > b ? a : b; } long long MINMAXLL(long long min, long long val, long long max) { register long long tv; tv = (min > val ? min : val); return (max < tv) ? max : tv; } 2.) Menj a libthecore/include mappába és nyisd meg az utils.h fájlt 2.1.1) Keresd a következő sort: Kód: [Kijelölés] extern int MINMAX(int min, int value, int max); 2.1.2) Alá illeszd be a következőket: Kód: [Kijelölés] extern long long MAXLL(long long a, long long b); extern long long MINLL(long long a, long long b); extern long long MINMAXLL(long long min, long long val, long long max); Kliens-bin:1.) Nyisd meg a Packet.h fájlt. 1.1) Keresd meg a következő struktúrákat: Kód: [Kijelölés] typedef struct packet_points typedef struct packet_point_change 1.2) Cseréld le őket erre: Kód: [Kijelölés] typedef struct packet_points { BYTE header; long long points[POINT_MAX_NUM]; } TPacketGCPoints; typedef struct packet_point_change { int header; DWORD dwVID; BYTE Type; long long amount; // ąŮ˛ď °Ş long long value; // ÇöŔç °Ş } TPacketGCPointChange; 2.) Nyisd meg az AbstractPlayer.h fájlt. 2.1) Keresd meg ezt a sort: Kód: [Kijelölés] virtual int GetStatus(DWORD dwType) = 0; 2.2) Cseréld le erre: Kód: [Kijelölés] virtual long long GetStatus(DWORD dwType) = 0; 3.) Nyisd meg a PythonPlayer.h fájlt. 3.1.1) Keresd meg ezt a struktúrát: "typedef struct SPlayerStatus" 3.1.2) Cseréld le erre: Kód: [Kijelölés] typedef struct SPlayerStatus { TItemData aItem[c_Inventory_Count]; TItemData aDSItem[c_DragonSoul_Inventory_Count]; TQuickSlot aQuickSlot[QUICKSLOT_MAX_NUM]; TSkillInstance aSkill[SKILL_MAX_NUM]; long long m_alPoint[POINT_MAX_NUM]; long lQuickPageIndex; void SetPoint(UINT ePoint, long long lPoint); long long GetPoint(UINT ePoint); } TPlayerStatus; 3.2.1) Keresd ezeket a sorokat: Kód: [Kijelölés] void SetStatus(DWORD dwType, long lValue); int GetStatus(DWORD dwType); 3.2.2) Majd módosítsd így: Kód: [Kijelölés] void SetStatus(DWORD dwType, long long lValue); long long GetStatus(DWORD dwType); 4.) Nyisd meg a PythonPlayer.cpp fájlt. 4.1.1) Keresd meg ezt: Kód: [Kijelölés] const DWORD POINT_MAGIC_NUMBER = 0xe73ac1da; 4.1.2) A típusát írd át long long-ra, tehát így nézzen ki: Kód: [Kijelölés] const long long POINT_MAGIC_NUMBER = 0xe73ac1da; 4.2) Rögtön az alatta lévő eljárást és függvényt is módosíthatod a következő példa szerint: Kód: [Kijelölés] void CPythonPlayer::SPlayerStatus::SetPoint(UINT ePoint, long long lPoint) { m_alPoint[ePoint]=lPoint ^ POINT_MAGIC_NUMBER; } long long CPythonPlayer::SPlayerStatus::GetPoint(UINT ePoint) { return m_alPoint[ePoint] ^ POINT_MAGIC_NUMBER; } 4.3.1) Keresd meg ezt a sort: Kód: [Kijelölés] void CPythonPlayer::SetStatus(DWORD dwType, long lValue) 4.3.2) Cseréld le erre: Kód: [Kijelölés] void CPythonPlayer::SetStatus(DWORD dwType, long long lValue) 4.4.1) Keresd meg ezt a sort: Kód: [Kijelölés] int CPythonPlayer::GetStatus(DWORD dwType) 4.4.2) Cseréld le erre: Kód: [Kijelölés] long long CPythonPlayer::GetStatus(DWORD dwType) 5.) Nyisd meg a PythonPlayerModule.cpp fájlt. 5.1.1) Keresd meg a playerGetElk parancsot. 5.1.2) Majd cseréld le erre: Kód: [Kijelölés] PyObject * playerGetElk(PyObject* poSelf, PyObject* poArgs) { long long llGold = CPythonPlayer::Instance().GetStatus(POINT_GOLD); #ifdef _DEBUG Tracef("GetElk(): %lld\n", llGold); #endif return PyLong_FromLongLong(llGold); } -- Végül CONFIG fájlban meghatározhatod a maximális yangmennyiséget egy játékosnál. Túllépni nem tudja, nem ugrik át 0-ra a MINMAXLL megakadályoz mindent Nekem a limit 20.000.000.000 azaz 20milliárd, de ez nyugodtan lehet több. Kód: [Kijelölés] MAX_GOLD: 20000000000 -- Ha valami kimaradt volna, vagy valami hibádzik PM, ha segítség kell a berakáshoz ott a segítség topic.Ne feledd a módosított libthecore forrását lefordítani, mielőtt a game forrást fordítod! Remélem nem hagytam ki semmit :3 -- Changelog: #01: 2015.05.02. 20:22 :: config.cpp fájlban volt egy kis unix-win fordítási különbözet a MAXLONGLONG változóval kapcsolatban, ezért az helyettesítve lett a LONGLONG maximális értékével. #02: 2015.05.08. 16:17 :: Elírás javítás. (AbstractPlayer.cpp --> AbstractPlayer.h) -- Külön köszönet Disco/Sanchez-t illeti, amiért annak idején (forrás publikálás után) segített benne.« Utoljára szerkesztve: 2015-05-08, 16:17:02 by [VIP]P3NG3R » 2 post: Mivel több mint valószínű, hogy meghaladta volna az első post a 20.000 karakterszámot, így kénytelen voltam új hozzászólást írni.Választható módosítások:Fontos tudni!Ezeket nem kötelező, de ajánlott elvégezni; ha questtel 2,1md feletti yangot akarsz kiosztani jutalomként.Valamint ha bővíteni szeretnéd a kereskedésben átadható yang küszöböt.Quest pc.change_gold; (click to show/hide) 1.) Nyisd meg a char.h fájlt.1.1) Keress rá erre:Kód: [Kijelölés] PointChange(BYTE type, int amount, bool bAmount = false, bool bBroadcast = false); 1.2) Írd át az amount változó típusát long long-ra, vagy cseréld le erre:Kód: [Kijelölés] PointChange(BYTE type, long long amount, bool bAmount = false, bool bBroadcast = false); 2.) Nyisd meg a char.cpp fájlt.2.1) Keress rá a következő eljárásra:Kód: [Kijelölés] void CHARACTER::PointChange(BYTE type, int amount, bool bAmount, bool bBroadcast) 2.2) Írd át itt is az amount változó típusát long long-ra, vagy cseréld le erre:Kód: [Kijelölés] void CHARACTER::PointChange(BYTE type, long long amount, bool bAmount, bool bBroadcast) 3.) Nyisd meg a questlua_pc.cpp fájlt.3.1) Keresd meg a következő függvényt:Kód: [Kijelölés] int pc_change_money(lua_State * L) 3.2) Cseréld le az egészet erre:Kód: [Kijelölés] int pc_change_money(lua_State * L) { LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); if (!ch) return 0; if (!lua_isnumber(L, -1)) { sys_err("QUEST : wrong argument"); return 0; } long long llGold = (long long)lua_tonumber(L, -1); if (llGold + ch->GetGold() < 0) sys_err("QUEST wrong ChangeGold %d (now %lld)", llGold, ch->GetGold()); else { DBManager::instance().SendMoneyLog(MONEY_LOG_QUEST, ch->GetPlayerID(), llGold); ch->PointChange(POINT_GOLD, llGold, true); } return 0; } 3.3) Az összes give_gold, givegold stb variációnak ezt a parancsot add meg! És a pc_give_gold törölhető is. Hogy miért? Mert az alapból nem ellenőrzi, hogy átadható-e annyi yang, amennyit tényleg akarsz adni.Kód: [Kijelölés] { "givegold", pc_change_money }, { "give_gold", pc_change_money }, Ajh, ahogy láthatod a SendMoneyLog megkapja a gold változót, ami már nem int, így ott is alakítani kell.Ez a változtatás érinteni fogja a db-t is!4.) Nyisd meg a common/tables.h fájlt.4.1) Keresd ezt a struktúrát:Kód: [Kijelölés] typedef struct SPacketMoneyLog 4.2) Az ott található INT típusú gold változót írd át long long típúsúra.Kód: [Kijelölés] typedef struct SPacketMoneyLog { BYTE type; DWORD vnum; long long gold; } TPacketMoneyLog; 5.) Vissza a game mappába. Nyisd meg a db.h fájlt.5.1) Keresd meg ezt:Kód: [Kijelölés] SendMoneyLog(BYTE type, DWORD vnum, int gold); 5.2) Magától értetődő, hogy a változót long long-osítani kell Kód: [Kijelölés] SendMoneyLog(BYTE type, DWORD vnum, long long gold); 6.) Ezt megtesszük a db.cpp fájlban is.6.1) Keresd meg ezt a sort:Kód: [Kijelölés] void DBManager::SendMoneyLog(BYTE type, DWORD vnum, int gold) 6.2) Majd cseréld le erre:Kód: [Kijelölés] void DBManager::SendMoneyLog(BYTE type, DWORD vnum, long long gold) 7.) Nyisd meg a log.h fájlt.7.1) Keresd meg a következő sort:Kód: [Kijelölés] MoneyLog(BYTE type, DWORD vnum, int gold); 7.2) Majd a gold típusát írd át:Kód: [Kijelölés] MoneyLog(BYTE type, DWORD vnum, long long gold); 8.) Nyisd meg a log.cpp fájlt.8.1) Keresd meg a következő eljárást:Kód: [Kijelölés] void LogManager::MoneyLog(BYTE type, DWORD vnum, int gold) 8.2) Ha megvan cseréld le az egészet erre:Kód: [Kijelölés] void LogManager::MoneyLog(BYTE type, DWORD vnum, long long gold) { if (type == MONEY_LOG_RESERVED || type >= MONEY_LOG_TYPE_MAX_NUM) { sys_err("TYPE ERROR: type %d vnum %u gold %lld", type, vnum, gold); return; } Query("INSERT DELAYED INTO money_log%s VALUES (NOW(), %d, %d, %lld)", get_table_postfix(), type, vnum, gold); } 9.) Ugrunk a db mappába. Nyisd meg a MoneyLog.h fájlt.9.1) A következő sorokat:Kód: [Kijelölés] void AddLog(BYTE bType, DWORD dwVnum, int iGold); std::map<DWORD, int> m_MoneyLogContainer[MONEY_LOG_TYPE_MAX_NUM]; 9.2) Cseréld le, azaz így nézzenek ki:Kód: [Kijelölés] void AddLog(BYTE bType, DWORD dwVnum, long long llGold); std::map<DWORD, long long> m_MoneyLogContainer[MONEY_LOG_TYPE_MAX_NUM]; 10.) Nyisd meg a MoneyLog.cpp fájlt.10.1) Keresd meg a következő eljárást:Kód: [Kijelölés] void CMoneyLog::AddLog(BYTE bType, DWORD dwVnum, int iGold) 10.2) Cseréld le az egész eljárást erre:Kód: [Kijelölés] void CMoneyLog::AddLog(BYTE bType, DWORD dwVnum, long long llGold) { m_MoneyLogContainer[bType][dwVnum] += llGold; } 11.) Irány navicat, log adatbázis, money_log tábla -> Design table -> pid mező típusa legyen bigint, a hossza pedig 20.UPDATE#02:12.) Nyisd meg a char_item.cpp fájlt.12.1) A következő szöveget keresd:Kód: [Kijelölés] µ· %d łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů. 12.2) És ahány találat van(általában 5), mindet cseréld le erre:Kód: [Kijelölés] µ· %lld łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů. 13.) Nyisd meg a questlua_pc.cpp fájlt.13.1) Itt is végezd el az előbbieket, keresd ezt:Kód: [Kijelölés] µ· %d łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů. 13.2) És cseréld le erre:Kód: [Kijelölés] µ· %lld łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů. 14.) Forráson kívüli módosítás!!444 locale_string.txt fájlt nyisd meg.14.1) A következő sorpárt keresd:Kód: [Kijelölés] "µ· %d łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů."; "%d Yangot kaptál."; 13.2) Így nézzen ki:Kód: [Kijelölés] "µ· %lld łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů."; "%lld Yangot kaptál."; 13.3) Ahol le lett cserélve forrásban az LC_TEXT("µ· %d łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů."), azon a soron belül a hozzá tartozó paraméter adattípusát long long-gá kell tenni! Mutatok két példát rá az érintett részekről.Kód: [Kijelölés] ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µ· %lld łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů."), static_cast<long long>(dwCounts)); //// case ITEM_ELK_VNUM: // µ·˛Ů·ŻąĚ { long long llGold = (long long)item->GetSocket(0); ITEM_MANAGER::instance().RemoveItem(item); ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µ· %lld łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů."), llGold); PointChange(POINT_GOLD, llGold); } break; 13+1) Nyisd meg a Client/Userinterface/PythonNetworkStreamPhaseGame.cpp fájlt.13+1.1) Keresd meg ezt a részt: Kód: [Kijelölés] if (POINT_GOLD == PointChange.Type) { if (PointChange.amount > 0) { PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnPickMoney", Py_BuildValue("(i)", PointChange.amount)); } } 13+1.2) Cseréld le erre: Kód: [Kijelölés] if (POINT_GOLD == PointChange.Type) { if (PointChange.amount > 0) { PyObject *args = PyTuple_New(1); PyTuple_SetItem(args, 0, PyLong_FromLongLong(PointChange.amount)); PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnPickMoney", args); } } UPDATE#03:14.) Nyisd meg a cmd_gm.cpp fájlt.14.1) Keresd meg a következő parancsot: Kód: [Kijelölés] ACMD(do_set) 14.2) Tekerj le amíg a yangos részhez nem érsz (case 0: ) és a "gold = 0" típusát írd át long long-ra. Kód: [Kijelölés] case 0: // gold { long long gold = 0; str_to_number(gold, arg3); DBManager::instance().SendMoneyLog(MONEY_LOG_MISC, 3, gold); long long before_gold = tch->GetGold(); tch->PointChange(POINT_GOLD, gold, true); long long after_gold = tch->GetGold(); if (0 == after_gold && 0 != before_gold) { LogManager::instance().CharLog(tch, gold, "ZERO_GOLD", "GM"); } } break; 14.3) Tekerj a parancs aljára, ehhez: Kód: [Kijelölés] if (set_fields.type == NUMBER) { int amount = 0; str_to_number(amount, arg3); ch->ChatPacket(CHAT_TYPE_INFO, "%s's %s set to [%d]", tch->GetName(), set_fields.cmd, amount); } 14.4) Cseréld le erre: Kód: [Kijelölés] if (set_fields.type == NUMBER) { long long amount = 0; str_to_number(amount, arg3); ch->ChatPacket(CHAT_TYPE_INFO, "%s's %s set to [%lld]", tch->GetName(), set_fields.cmd, amount); } Kereskedésben átadható yang: (click to show/hide) #06: Vásárlási hibajavítás: (click to show/hide) 1.) Nyisd meg a shop.cpp fájlt.1.1) Keress rá a következő sorra: Kód: [Kijelölés] DWORD dwPrice = r_item.price; 1.2) Cseréld le erre: Kód: [Kijelölés] long long llPrice = static_cast<long long>(r_item.price); 1.3) Majd mindenhol(A CShop::Buy függvényen belül!!) a dwPrice-t írd át llPrice-ra1.4) Ahol az újonnan llPrice-ként szereplő változó formázott szövegként van meghívva(%d/%u), írd át %lld-re. Felsorolom az érintett, már átírt sorokat. Kód: [Kijelölés] sys_log(1, "Shop::Buy : Not enough money : %s has %lld, price %lld", ch->GetName(), ch->GetGold(), llPrice); snprintf(buf, sizeof(buf), "%s FROM: %u TO: %u PRICE: %lld", item->GetName(), ch->GetPlayerID(), m_pkPC->GetPlayerID(), llPrice); snprintf(buf, sizeof(buf), "%s %u(%s) %lld %u", item->GetName(), m_pkPC->GetPlayerID(), m_pkPC->GetName(), llPrice, item->GetCount()); snprintf(buf, sizeof(buf), "%s %u(%s) %lld %u", item->GetName(), ch->GetPlayerID(), ch->GetName(), llPrice, item->GetCount()); sys_log(0, "SHOP: BUY: name %s %s(x %d):%u price %lld", ch->GetName(), item->GetName(), item->GetCount(), item->GetID(), llPrice); --Changelog:#01> 2015.05.09 14:30 :: pc_change_money fv-ben véletlen letiltottam a negatív értékadást, ezt orvosoltam(3.2-es pont), köszi masodikbela.#02> 2015.05.09 18:25 :: 2,1 milliárd feletti yang adás után a chaten rosszul jelent meg a "n Yangot kaptál." üzenet, javítva(12-13-as pont).#03> 2015.05.09 18:45 :: 2,1 milliárd feletti yang adás gm paranccsal, hozzáadva(14-es pont).#04> 2015.05.09 19:20 :: #02 javítása kliens oldalon(13+1-es pont).#05> 2015.05.09 20:55 :: #02 javítása szerver oldalon(13.3-as pont).#06> 2015.07.04 10:56 :: Boltból való vásárlás esetén 4.294.967.296 yangot adott a szerver, javítva. Not work. And is not full serverside. Edited August 20, 2022 by Metin2 Dev Core X - External 2 Internal 1 Link to comment Share on other sites More sharing options...
Traktorzysta 17 Posted November 3, 2015 Share Posted November 3, 2015 I can't check this in 100% because i can't fix problem with show yang >2,14kkk in client. When i login to game all is good but when i add/sell/buy with yang client show 0 yang.. Link to comment Share on other sites More sharing options...
Active Member ReFresh 2330 Posted November 3, 2015 Author Active Member Share Posted November 3, 2015 (edited) I don't know, why YMIR create for currency in yang only integer. This is problem because it will need edit all files in source and binary integer for numbers is everywhere But thanks to all for answers Edited November 3, 2015 by ReFresh I'll be always helpful! Link to comment Share on other sites More sharing options...
Premium TAUMP 825 Posted November 3, 2015 Premium Share Posted November 3, 2015 1 Link to comment Share on other sites More sharing options...
fenixplayscz 16 Posted November 3, 2015 Share Posted November 3, 2015 Every tutorials for max yangs on internet is not 100% missing some functions,variables just change by yourself search (gold,point,elk) and change to long long from int Link to comment Share on other sites More sharing options...
Ace 3246 Posted November 3, 2015 Share Posted November 3, 2015 (edited) i just have a importent Question for you Genius: for what over 50KKK yang? you fck's your server with so much yang. Edited November 3, 2015 by Ace 1 Spoiler Ymir Entertainment was founded in 1999 in Seoul, Korea and is currently headed by Byoung Gwan Kim as CEO. The company started developing its first 2D online game Metin the same year it was founded. The game was commercially launched in Korea a year later and received a prize from the Korean Ministry of Information and Communication in December of the same year. Following the success of their flagship game Ymir Entertainment immediately started work on the game’s sequel Metin 2, which went into Closed Beta in Korea in May 2004. The game was officially launched in Korea and China in March 2005 before being launched in Asia, Europe and North America in the years that followed. In January 2011 all of the company’s shares were bought by Webzen Inc., a Korean game giant known for their popular MMORPG, MU Online. The company was also awarded Gameforge’s Global Best Partner of the Year in 2011. Source: https://mmos.com/publishers/ymir-entertainment Thank you ymir and F*** you Gameforge, 2011 you ruined it. Link to comment Share on other sites More sharing options...
Active Member ReFresh 2330 Posted November 4, 2015 Author Active Member Share Posted November 4, 2015 (edited) . Edited August 11, 2022 by ReFresh I'll be always helpful! Link to comment Share on other sites More sharing options...
fenixplayscz 16 Posted November 4, 2015 Share Posted November 4, 2015 Tumpe tos určitě nedělal ty. Vypadá to spíše, jako dobrej photoshop. #Ace Because I love a lot's of money Proč by to nedělal on? šak je to jednoduché Why he cant do it? its so easy Link to comment Share on other sites More sharing options...
Active Member ReFresh 2330 Posted November 4, 2015 Author Active Member Share Posted November 4, 2015 (edited) . Edited August 11, 2022 by ReFresh I'll be always helpful! Link to comment Share on other sites More sharing options...
fenixplayscz 16 Posted November 4, 2015 Share Posted November 4, 2015 #fenixplayscz Neřekl bych, že je to tak jednoduché, když se to musí měnit ve všech souborech, ale dám na tvou radu a vyzkouším to Je to jednoduché, taky je mam funkční Link to comment Share on other sites More sharing options...
Recommended Posts
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now