Jump to content

Max yang increased up to 999kkk in inventory


Recommended Posts

  • Gold

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

Thank you so much :)

  1. Client crashes when wolfman runs on mount (clear syserr)
  2. 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
  3. Bleeding is applyed but the red cloud or the debuff icon is not displayed
  4. Strong against Lycans is displayed as Bleeding PCT and Defence against Lycans is displayed as Bleeding Resist
  5. 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

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:

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.
« 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:
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));
////
							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.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:
	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:
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);

--
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 by Metin2 Dev
Core X - External 2 Internal
Link to comment
Share on other sites

  • Premium

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:

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.
« 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:
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));
////
							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.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:
	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:
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);

--
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:

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.
« 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:
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));
////
							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.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:
	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:
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);

--
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 by Metin2 Dev
Core X - External 2 Internal
  • Love 1


 

Link to comment
Share on other sites

i just have a importent Question for you Genius:

for what over 50KKK yang?

you fck's your server with so much yang.

Edited by Ace
  • Love 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

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

Announcements



×
×
  • Create New...

Important Information

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