[SRC] MAX_GOLD bővítés

Indította [VIP]P3NG3R, 2015-05-02, 11:32:44

2015-05-02, 11:32:44 Utolsó szerkesztés: 2015-05-08, 16:17:02 Szerző: [VIP]P3NG3R
Sziasztok :)

Mivel sokan kérdezgetik (tőlem is), hogy hogy kell megemelni a maximális yang mennyiséget a karakter leltárában és normális, részletes leírás meg nincs, így hát itt az ideje pontot tenni a végére. Több megoldás is lehet rá, mármint másféle módszerek, én a saját variációm írom le.

Biztonsági mentést mindenképp csinálj mielőtt nekilátsz, ha netán elbaltáznál valamit és előlről kell kezdeni legyen kiindulópont!!!

Szerver-common:
1.) Nyisd meg a common/tables.h fájlt.
1.1) Keresd meg a következő struktúrát:
typedef struct SPlayerTable

1.2) Cseréld le benne az INT gold; sort erre:
long long gold;



Szerver-game:
1.) Nyisd meg a packet.h fájlt és keress rá a következőkre:
typedef struct packet_points
typedef struct packet_point_change


Cseréld le őket ezekre:
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:
typedef struct character_point
typedef struct character_point_instant


long points[POINT_MAX_NUM];
long gold;

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:
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:
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!):
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):
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:
snprintf(buf, sizeof(buf), "%s %d %d %ld %d",
inet_ntoa(GetDesc()->GetAddr().sin_addr), GetGold(), g_bChannel, GetMapIndex(), GetAlignment());


Erre:
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:
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:
if (bAmount)
pack.amount = amount;
else
pack.amount = 0;


Erre:
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:
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:
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:
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):
if (ch->GetGold() >= GOLD_MAX)

5.1.2) Cseréld le erre mind a kettőt:
if (ch->GetGold() > g_llMaxGold)

5.2.1) Tekerj, ugorj a "void CInputMain::Exchange" eljáráshoz.
5.2.2) Keresd ezt:
case EXCHANGE_SUBHEADER_CG_ELK_ADD:

5.2.3) Az egész ágat cseréld le erre:
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:
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:
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:
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:
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:
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:
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:
sys_err("QUEST wrong ChangeGold %d (now %d)", gold, ch->GetGold());

9.1.2) Cseréld le erre:
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:
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:
long long g_llMaxGold = 2140000000;


11.2.1) Keresd a következőt:
// 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:
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:
"gold = %d, "

1.1.2) Írd át erre:
"gold = %lld, "

1.2.1) Keress rá erre:
sys_log(0, "[PLAYER_LOAD] ID %s pid %d gold %d ", pTab->name, pTab->id, pTab->gold);

1.2.2) Írd át erre:
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:
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:
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:
int MINMAX(int min, int value, int max)

1.1.2) Alá illeszd be a következőket:
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:
extern int MINMAX(int min, int value, int max);

2.1.2) Alá illeszd be a következőket:
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:
typedef struct packet_points
typedef struct packet_point_change


1.2) Cseréld le őket erre:
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:
virtual int GetStatus(DWORD dwType) = 0;


2.2) Cseréld le erre:
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:
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:
void SetStatus(DWORD dwType, long lValue);
int GetStatus(DWORD dwType);


3.2.2) Majd módosítsd így:
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:
const DWORD POINT_MAGIC_NUMBER = 0xe73ac1da;

4.1.2) A típusát írd át long long-ra, tehát így nézzen ki:
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:
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:
void CPythonPlayer::SetStatus(DWORD dwType, long lValue)


4.3.2) Cseréld le erre:
void CPythonPlayer::SetStatus(DWORD dwType, long long lValue)


4.4.1) Keresd meg ezt a sort:
int CPythonPlayer::GetStatus(DWORD dwType)


4.4.2) Cseréld le erre:
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:
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 :D
Nekem a limit 20.000.000.000 azaz 20milliárd, de ez nyugodtan lehet több.
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.

2015-05-09, 13:08:26 #1 Utolsó szerkesztés: 2015-07-04, 10:59:21 Szerző: [VIP]P3NG3R
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;
[spoiler]
1.) Nyisd meg a char.h fájlt.
1.1) Keress rá erre:
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:
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:
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:
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:
int pc_change_money(lua_State * L)

3.2) Cseréld le az egészet erre:
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.
{ "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:
typedef struct SPacketMoneyLog

4.2) Az ott található INT típusú gold változót írd át long long típúsúra.
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:
SendMoneyLog(BYTE type, DWORD vnum, int gold);

5.2) Magától értetődő, hogy a változót long long-osítani kell :D
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:
void DBManager::SendMoneyLog(BYTE type, DWORD vnum, int gold)

6.2) Majd cseréld le erre:
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:
MoneyLog(BYTE type, DWORD vnum, int gold);

7.2) Majd a gold típusát írd át:
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:
void LogManager::MoneyLog(BYTE type, DWORD vnum, int gold)

8.2) Ha megvan cseréld le az egészet erre:
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:
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:
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:
void CMoneyLog::AddLog(BYTE bType, DWORD dwVnum, int iGold)

10.2) Cseréld le az egész eljárást erre:
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:
µ· %d łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů.

12.2) És ahány találat van(általában 5), mindet cseréld le erre:
µ· %lld łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů.

13.) Nyisd meg a questlua_pc.cpp fájlt.
13.1) Itt is végezd el az előbbieket, keresd ezt:
µ· %d łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů.

13.2) És cseréld le erre:
µ· %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:
"µ· %d łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů.";
"%d Yangot kaptál.";


13.2) Így nézzen ki:
"µ· %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.
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µ· %lld łÉŔ» ČąµćÇß˝Ŕ´Ď´Ů."), static_cast<long long>(dwCounts[i]));
////
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:
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:
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:
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.
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:
if (set_fields[i].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[i].cmd, amount);
}


14.4) Cseréld le erre:
if (set_fields[i].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[i].cmd, amount);
}

[/spoiler]



Kereskedésben átadható yang:
[spoiler]Hamarosan... Készül csak lusta vagyok ;D :-*
Kis türelmet :)[/spoiler]


#06: Vásárlási hibajavítás:[spoiler]1.) Nyisd meg a shop.cpp fájlt.
1.1) Keress rá a következő sorra:
DWORD dwPrice = r_item.price;

1.2) Cseréld le erre:
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-ra

1.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.
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);

[/spoiler]
--
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.
--