Ajutor

Totalitatea subiectelor care nu respectă regulamentul impus in sectiunea "Probleme şi Întrebări" vor fi stocate aici.
Închis
Avatar utilizator
george20082
Nivel 1

Nivel 1
Mesaje: 134
Membru din: 04 Noi 2015, 23:23
Server: extream
Regat: Chunjo
Aprecieri: 102  
Mulţumiri: 1  
  Rezolvări prob.: 2
Medalii

*Problemă/Întrebare: Buna ziua cum pot sa modific la vrajeste obiect sa se stokeze 1000 in loc de 200? va multumesc
Tipologie server:pvm-lv 120
*Resursă folosită:internet
*ServerFiles utilizat:Clever1
*Syserr:
Poză:
*Detalii suplimentare:
Avatar utilizator
amvenitsavadcv
Nivel 3

Nivel 3
Mesaje: 413
Membru din: 28 Iul 2018, 11:25
Server: da
Aprecieri: 44  
Mulţumiri: 156  
Medalii

sursa/extend-maximum-items-stack-t93440.html

Nu am probat daca merge. Eu am folosit altu, dar ar trebui sa mearga si ala, la prima vedere.
O să trebuiască în unele cazuri să mai adaptezi și tu. Gen cam peste tot un ai BYTE dwCount trebuie modificat in short/DWORD sau WORD aici depinzând ce vrei tu să declari.
Ca ideea dacă declari short o să ai maximum de stack 32k
DWORD si WORD nu mi mintesc cat erau exact, dar era mai mult de 32k daca imi aduc aminte bine.
Avatar utilizator
george20082
Nivel 1

Nivel 1
Mesaje: 134
Membru din: 04 Noi 2015, 23:23
Server: extream
Regat: Chunjo
Aprecieri: 102  
Mulţumiri: 1  
  Rezolvări prob.: 2
Medalii

amvenitsavadcv scrie: ↑22 Noi 2020, 13:49 sursa/extend-maximum-items-stack-t93440.html

Nu am probat daca merge. Eu am folosit altu, dar ar trebui sa mearga si ala, la prima vedere.
O să trebuiască în unele cazuri să mai adaptezi și tu. Gen cam peste tot un ai BYTE dwCount trebuie modificat in short/DWORD sau WORD aici depinzând ce vrei tu să declari.
Ca ideea dacă declari short o să ai maximum de stack 32k
DWORD si WORD nu mi mintesc cat erau exact, dar era mai mult de 32k daca imi aduc aminte bine.
explicami te rog unde trebuie sa caut maiexact in item proto ? in sf
Avatar utilizator
amvenitsavadcv
Nivel 3

Nivel 3
Mesaje: 413
Membru din: 28 Iul 2018, 11:25
Server: da
Aprecieri: 44  
Mulţumiri: 156  
Medalii

Las-o așa
Închis. Du te și învață prima dată cu ce se mananca un server de metin și după să vii cu întrebări.
Avatar utilizator
Alcinous
Untrusted User

Untrusted User
Mesaje: 670
Membru din: 13 Noi 2020, 23:46
Server: None
Regat: Jinno
Aprecieri: 322  
Mulţumiri: 487  
Discord: Copiază ID

Tin sa mentionez ca l-am bagat si eu pe server si n am avut nici un fel de problema,poti incerca.
client
packet.h

Search for this: typedef struct command_item_drop2
then replace this in the struct:

BYTE        count;
to this:

WORD        count;
Then search for this: typedef struct command_item_move
then replace this in the struct:

BYTE num;
To this:

WORD num;
Search for this: typedef struct SShopItemTable
then replace this in the struct:

BYTE		count;
to this:

WORD		count;
Search for this: typedef struct packet_set_item2
then replace this in the struct:

BYTE		count;
to this:

WORD		count;
Then search for this: typedef struct packet_update_item
then replace this in the struct:

BYTE		count;
to this:

WORD		count;

Then search for this: typedef struct SEquipmentItemSet
replace this:

BYTE    count;
to this:

WORD    count;

PythonNetworkPhaseGame.cpp->RecvExchangePacket function

Replace this:

CPythonExchange::Instance().SetItemToSelf(iSlotIndex, exchange_packet.arg1, (BYTE) exchange_packet.arg3);
To this:

CPythonExchange::Instance().SetItemToSelf(iSlotIndex, exchange_packet.arg1, (WORD) exchange_packet.arg3);
and this:

CPythonExchange::Instance().SetItemToTarget(iSlotIndex, exchange_packet.arg1, (BYTE) exchange_packet.arg3);
to this:

CPythonExchange::Instance().SetItemToTarget(iSlotIndex, exchange_packet.arg1, (WORD) exchange_packet.arg3);

pythonexchange.cpp:

Replace this:

BYTE CPythonExchange::GetItemCountFromTarget(BYTE pos)
With this:

WORD CPythonExchange::GetItemCountFromTarget(BYTE pos)
Then this:

BYTE CPythonExchange::GetItemCountFromSelf(BYTE pos)
With this:

WORD CPythonExchange::GetItemCountFromSelf(BYTE pos)
And this:

void CPythonExchange::SetItemToTarget(DWORD pos, DWORD vnum, BYTE count)
With this:

void CPythonExchange::SetItemToTarget(DWORD pos, DWORD vnum, WORD count)
And then this:

void CPythonExchange::SetItemToSelf(DWORD pos, DWORD vnum, BYTE count)
With this:

void CPythonExchange::SetItemToSelf(DWORD pos, DWORD vnum, WORD count)

pythonexchange.h

Replace this ones:

		BYTE			GetItemCountFromTarget(BYTE pos);
		BYTE			GetItemCountFromSelf(BYTE pos);
		
		void			SetItemToTarget(DWORD pos, DWORD vnum, BYTE count);
		void			SetItemToSelf(DWORD pos, DWORD vnum, BYTE count);
		
		BYTE					item_count[EXCHANGE_ITEM_MAX_NUM];
To this:

		WORD			GetItemCountFromTarget(BYTE pos);
		WORD			GetItemCountFromSelf(BYTE pos);
		
		void			SetItemToTarget(DWORD pos, DWORD vnum, WORD count);
		void			SetItemToSelf(DWORD pos, DWORD vnum, WORD count);
		
		WORD					item_count[EXCHANGE_ITEM_MAX_NUM];

PythonNetworkStreamPhaseGameItem.cpp

Replace the whole function:

bool CPythonNetworkStream::SendShopSellPacketNew
With this:

typedef struct fckOFF
{
	BYTE		bySlot;
	WORD		byCount;
} TfckOFF;

bool CPythonNetworkStream::SendShopSellPacketNew(BYTE bySlot, WORD byCount)
{
	if (!__CanActMainInstance())
		return true;

	TPacketCGShop PacketShop;
	PacketShop.header = HEADER_CG_SHOP;
	PacketShop.subheader = SHOP_SUBHEADER_CG_SELL2;
	TfckOFF second;
	second.byCount = byCount;
	second.bySlot = bySlot;

	if (!Send(sizeof(TPacketCGShop), &PacketShop))
	{
		Tracef("SendShopSellPacket Error\n");
		return false;
	}
	if (!Send(sizeof(TfckOFF), &second))
	{
		Tracef("SendShopAddSellPacket Error\n");
		return false;
	}
	/*if (!Send(sizeof(WORD), &byCount))
	{
		Tracef("SendShopAddSellPacket Error\n");
		return false;
	}*/

	Tracef(" SendShopSellPacketNew(bySlot=%d, byCount=%u)\n", bySlot, byCount);

	return SendSequence();
}
Then replace this:

bool CPythonNetworkStream::SendItemMovePacket(TItemPos pos, TItemPos change_pos, BYTE num)
bool CPythonNetworkStream::SendSafeBoxItemMovePacket(BYTE bySourcePos, BYTE byTargetPos, BYTE byCount)
To this:

bool CPythonNetworkStream::SendItemMovePacket(TItemPos pos, TItemPos change_pos, WORD num)
bool CPythonNetworkStream::SendSafeBoxItemMovePacket(BYTE bySourcePos, BYTE byTargetPos, WORD byCount)

pythonplayermodule.cpp

Replace the whole function:

PyObject * playerSetItemCount(PyObject* poSelf, PyObject* poArgs)
With this:

PyObject * playerSetItemCount(PyObject* poSelf, PyObject* poArgs)
{
	switch (PyTuple_Size(poArgs))
	{
	case 2:
		{
			int iSlotIndex;
			if (!PyTuple_GetInteger(poArgs, 0, &iSlotIndex))
				return Py_BuildException();

			WORD wCount;
			if (!PyTuple_GetInteger(poArgs, 1, &wCount))
				return Py_BuildException();

			if (0 == wCount)
				return Py_BuildException();

			CPythonPlayer::Instance().SetItemCount(TItemPos (INVENTORY, iSlotIndex), wCount);
			return Py_BuildNone();
		}
	case 3:
		{
			TItemPos Cell;
			if (!PyTuple_GetByte(poArgs, 0, &Cell.window_type))
				return Py_BuildException();

			if (!PyTuple_GetInteger(poArgs, 1, &Cell.cell))
				return Py_BuildException();

			WORD wCount;
			if (!PyTuple_GetInteger(poArgs, 2, &wCount))
				return Py_BuildException();

			CPythonPlayer::Instance().SetItemCount(Cell, wCount);

			return Py_BuildNone();
		}
	default:
		return Py_BuildException();

	}
}
PythonNetworkStreamModule.cpp

Replace the following function:

PyObject* netSendItemMovePacket(PyObject* poSelf, PyObject* poArgs)
With this:

PyObject* netSendItemMovePacket(PyObject* poSelf, PyObject* poArgs)
{
	TItemPos Cell;
	TItemPos ChangeCell;
	int num;

	switch (PyTuple_Size(poArgs))
	{
	case 3:
		if (!PyTuple_GetInteger(poArgs, 0, &Cell.cell))
			return Py_BuildException();
		if (!PyTuple_GetInteger(poArgs, 1, &ChangeCell.cell))
			return Py_BuildException();
		if (!PyTuple_GetInteger(poArgs, 2, &num))
			return Py_BuildException();
		break;
	case 5:
		{
			if (!PyTuple_GetByte(poArgs, 0, &Cell.window_type))
				return Py_BuildException();
			if (!PyTuple_GetInteger(poArgs, 1, &Cell.cell))
				return Py_BuildException();
			if (!PyTuple_GetByte(poArgs, 2, &ChangeCell.window_type))
				return Py_BuildException();
			if (!PyTuple_GetInteger(poArgs, 3, &ChangeCell.cell))
				return Py_BuildException();
			if (!PyTuple_GetInteger(poArgs, 4, &num))
				return Py_BuildException();
		}
		break;
	default:
		return Py_BuildException();
	}

	CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance();
	rkNetStream.SendItemMovePacket(Cell, ChangeCell, (WORD) num);//ez a sor az
	return Py_BuildNone();
}
GameType.h

Search for this: typedef struct packet_item
Then replace this:

BYTE        count;
With this:

WORD        count;
Search for this: typedef struct packet_shop_item
And edit this:

BYTE        count;
to this:

WORD        count;
AbstractPlayer.h

Replace this:

virtual void	SetItemCount(TItemPos itemPos, BYTE byCount) = 0;
With this:

virtual void	SetItemCount(TItemPos itemPos, WORD byCount) = 0;
PythonPlayer.cpp

Replace this:

void CPythonPlayer::SetItemCount(TItemPos Cell, BYTE byCount)
With this:

void CPythonPlayer::SetItemCount(TItemPos Cell, WORD byCount)
PythonPlayer.h

Replace this:

void	SetItemCount(TItemPos Cell, BYTE byCount);
With this:

void	SetItemCount(TItemPos Cell, WORD byCount);
PythonNetworkStream.h

And this:

bool SendSafeBoxItemMovePacket(BYTE bySourcePos, BYTE byTargetPos, BYTE byCount);
bool SendShopSellPacketNew(BYTE bySlot, BYTE byCount);
bool SendItemMovePacket(TItemPos pos, TItemPos change_pos, BYTE num);
With this:

bool SendSafeBoxItemMovePacket(BYTE bySourcePos, BYTE byTargetPos, WORD byCount);
bool SendShopSellPacketNew(BYTE bySlot, WORD byCount);
bool SendItemMovePacket(TItemPos pos, TItemPos change_pos, WORD num);
Now we are done with the client, you can build it now.


server

common/tables.h

Search this: typedef struct SShopItemTable
Then replace this:

BYTE		count;
To this:

WORD		count;
packet.h

Search for this: typedef struct command_item_drop2
Then edit this:

BYTE	count;
To this:

WORD	count;
Then search this:: typedef struct command_item_move
Replace this:

BYTE	count;
With this:

WORD	count;
Then search this: typedef struct packet_item_set
Replace this:

BYTE	count;
To this:

WORD	count;
Search this: typedef struct packet_item_update
Replace this:

BYTE	count;
To this:

WORD	count;
Search this: struct packet_shop_item
Replace this:

BYTE        count;
To this:

WORD        count;
Search this: typedef struct pakcet_view_equip
Then replace this:

BYTE	count;
To this:

WORD	count;

input_main.cpp

Replace this whole function:

int CInputMain::Shop(LPCHARACTER ch, const char * data, size_t uiBytes)
With this:

typedef struct fckOFF
{
	BYTE		bySlot;
	WORD		byCount;
} TfckOFF;

int CInputMain::Shop(LPCHARACTER ch, const char * data, size_t uiBytes)
{
	TPacketCGShop * p = (TPacketCGShop *) data;

	if (uiBytes < sizeof(TPacketCGShop))
		return -1;

	if (test_server)
		sys_log(0, "CInputMain::Shop() ==> SubHeader %d", p->subheader);

	const char * c_pData = data + sizeof(TPacketCGShop);
	uiBytes -= sizeof(TPacketCGShop);

	switch (p->subheader)
	{
		case SHOP_SUBHEADER_CG_END:
			sys_log(1, "INPUT: %s SHOP: END", ch->GetName());
			CShopManager::instance().StopShopping(ch);
			return 0;

		case SHOP_SUBHEADER_CG_BUY:
			{
				if (uiBytes < sizeof(BYTE) + sizeof(BYTE))
					return -1;

				BYTE bPos = *(c_pData + 1);
				sys_log(1, "INPUT: %s SHOP: BUY %d", ch->GetName(), bPos);
				CShopManager::instance().Buy(ch, bPos);
				return (sizeof(BYTE) + sizeof(BYTE));
			}

		case SHOP_SUBHEADER_CG_SELL:
			{
				if (uiBytes < sizeof(BYTE))
					return -1;

				BYTE pos = *c_pData;

				sys_log(0, "INPUT: %s SHOP: SELL", ch->GetName());
				CShopManager::instance().Sell(ch, pos);
				return sizeof(BYTE);
			}

		case SHOP_SUBHEADER_CG_SELL2:
			{
				if (uiBytes < sizeof(TfckOFF))
					return -1;
				TfckOFF*p2 = (TfckOFF*)c_pData;
				/*BYTE pos = *(c_pData++);
				WORD count = *(c_pData);*/

				sys_log(0, "INPUT: %s SHOP: SELL2", ch->GetName());
				CShopManager::instance().Sell(ch, p2->bySlot, p2->byCount);
				return sizeof(TfckOFF);
			}

		default:
			sys_err("CInputMain::Shop : Unknown subheader %d : %s", p->subheader, ch->GetName());
			break;
	}

	return 0;
}

shop_manager.cpp

Replace this:

void CShopManager::Sell(LPCHARACTER ch, BYTE bCell, BYTE bCount)
To this:

void CShopManager::Sell(LPCHARACTER ch, BYTE bCell, WORD bCount)
 
shop.h
Search this: typedef struct shop_item

Replace this:

BYTE	count;
To this:

WORD	count;
shop_manager.h

Replace this:

void	Sell(LPCHARACTER ch, BYTE bCell, BYTE bCount=0);
To this:

void	Sell(LPCHARACTER ch, BYTE bCell, WORD bCount=0);
char_item.cpp

Replace this:

bool CHARACTER::DropItem(TItemPos Cell, BYTE bCount)
To this:

bool CHARACTER::DropItem(TItemPos Cell, WORD bCount)
Then replace this:

bool CHARACTER::MoveItem(TItemPos Cell, TItemPos DestCell, BYTE count)
To this:

bool CHARACTER::MoveItem(TItemPos Cell, TItemPos DestCell, WORD count)
And replace this in this function:

count = MIN(200 - item2->GetCount(), count);
To this:

count = MIN(ITEM_MAX_COUNT - item2->GetCount(), count);
Then replace this:

LPITEM CHARACTER::AutoGiveItem(DWORD dwItemVnum, BYTE bCount, int iRarePct, bool bMsg)
To this:

LPITEM CHARACTER::AutoGiveItem(DWORD dwItemVnum, WORD bCount, int iRarePct, bool bMsg)
And replace this in this function:

BYTE bCount2 = MIN(200 - item->GetCount(), bCount);
To this:

WORD bCount2 = MIN(ITEM_MAX_COUNT - item->GetCount(), bCount);
And replace this inside the PickupItem function:

BYTE bCount = item->GetCount();
To this:

WORD bCount = item->GetCount();
And this (still inside this function):

BYTE bCount2 = MIN(200 - item2->GetCount(), bCount);
To this:

WORD bCount2 = MIN(ITEM_MAX_COUNT - item2->GetCount(), bCount);

item.cpp->DWORD CItem::GetCount()

Replace this:

return MIN(m_dwCount, 200);
To this:

return MIN(m_dwCount, ITEM_MAX_COUNT);

safebox.cpp

Replace this:

bool CSafebox::MoveItem(BYTE bCell, BYTE bDestCell, BYTE count)
To this:

bool CSafebox::MoveItem(BYTE bCell, BYTE bDestCell, WORD count)
Then replace this inside this function:

count = MIN(200 - item2->GetCount(), count);
To this:

count = MIN(ITEM_MAX_COUNT - item2->GetCount(), count);
common/item_lenght.h

Here you can set the maximum number in a stack. Change this as big as you want (between 0 and ~60k)

ITEM_MAX_COUNT				= 200,
(I changed this to 300, just for the test)

char.h

Replace this:

bool			DropItem(TItemPos Cell,  BYTE bCount=0);
bool			MoveItem(TItemPos pos, TItemPos change_pos, BYTE num);
LPITEM			AutoGiveItem(DWORD dwItemVnum, BYTE bCount=1, int iRarePct = -1, bool bMsg = true);
To this:

bool			DropItem(TItemPos Cell,  WORD bCount=0);
bool			MoveItem(TItemPos pos, TItemPos change_pos, WORD num);
LPITEM			AutoGiveItem(DWORD dwItemVnum, WORD bCount=1, int iRarePct = -1, bool bMsg = true);

safebox.h

Replace this:

bool		MoveItem(BYTE bCell, BYTE bDestCell, BYTE count);
To this:

bool		MoveItem(BYTE bCell, BYTE bDestCell, WORD count);
oxevent.cpp

Replace this:

bool COXEventManager::GiveItemToAttender(DWORD dwItemVnum, BYTE count)
To this:

bool COXEventManager::GiveItemToAttender(DWORD dwItemVnum, WORD count)
oxevent.h

Replace this:

bool GiveItemToAttender(DWORD dwItemVnum, BYTE count);
With this:

bool GiveItemToAttender(DWORD dwItemVnum, WORD count);
Parte navicat
Go to the player database, right click on the item table -> desing table, then edit the count column's type from tinyint to smallint and the lenght from 3 to 4.
shop_item table->desing table: edit the count column's type from tinyint to smallint
Avatar utilizator
Kidro
Membru Club

Membru Club
Mesaje: 2487
Membru din: 29 Aug 2019, 16:49
Aprecieri: 331  
Mulţumiri: 5190  
Discord: Copiază ID
Medalii

Salut. Ai nevoie de sursa game, mysql și sursa client.
Apoi urmează tutorialul postat de mine aici.
sursa/extend-maximum-items-stack-t93440.html
In mare parte trebuie sa schimbi în funcțiile ce au legătură cu count ul valoarea din byte în word.
Byte - 255 limita
Word - 65565 limita

Bafta.

[ Postat de pe Android ] Imagine
Avatar utilizator
Alcinous
Untrusted User

Untrusted User
Mesaje: 670
Membru din: 13 Noi 2020, 23:46
Server: None
Regat: Jinno
Aprecieri: 322  
Mulţumiri: 487  
Discord: Copiază ID

Arhivat.

[ Postat de pe iPhone ] Imagine
Închis
Ajutor
Răspunsuri
1
Vizualizări
162
Răspunsuri
3
Vizualizări
243

Înapoi la “Arhivă Probleme şi Întrebări”

  • Informaţie
  • Cine este conectat

    Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 52 vizitatori