-
Posts
41 -
Joined
-
Last visited
-
Feedback
0%
Content Type
Forums
Store
Third Party - Providers Directory
Feature Plan
Release Notes
Docs
Events
Posts posted by B0ne
-
-
On 2/18/2020 at 6:34 AM, pask1994 said:
one problem, offline shop npc disappear (value npc 30000) after /reload regen ... please how i fix that?
Sorry to turn the topic back on, but maybe it will help someone.
Go go char_manager.cpp
void CHARACTER_MANAGER::DestroyCharacterInMap(long lMapIndex)
Inside search these
if (pkChr && pkChr->GetMapIndex() == lMapIndex && pkChr->IsNPC() && !pkChr->IsPet() && pkChr->GetRider() == NULL)
change to
if (pkChr && pkChr->GetMapIndex() == lMapIndex && pkChr->IsNPC() && !pkChr->IsPet() && !pkChr->IsPrivShop() && pkChr->GetRider() == NULL)
thats all. and now the shops dont disappear after /reload_regen
-
On 3/24/2021 at 8:32 AM, PandiCore said:
Boot: shop table size error any have this problem dont open the server
Navicat -> Player DB -> Design Shop_Item Table -> Search count -> Change to smallint and 4
-
On 10/17/2015 at 4:52 PM, masodikbela said:
Hi there Devs,
I successfully extended the maximum number of items in a stack, so I'd like to share it. Originally the type of the "count" variables are "BYTE", so the maximum number only 255. I changed this to "WORD" (unsigned short), so now its about 60k.
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.hSearch this:
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);
Now we are done with the server, don't foget to build
the db and the gamefile too!
database
We have to do 2 more things:
- 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
And we are done I also captured the "progress" like in my "Expand maximum level" topic, its about 40 minutes long again, its not necessary at all to watch it, but if you are interested about the progress, or you just bored and have 40-50 minute freetime, watch it, if you want
Special thanks to TheSLZ for testing the edits.
If you have any problem/remark/question, or you've just found a bug, feel free to tell/ask it here or in PM.Have a nice day,
~masodikbelaThanks, works nice and no problems!
- 1
- 1
-
On 12/28/2020 at 6:30 PM, thebangerschmid22 said:
1228 18:28:08362 :: networkModule.py(line:208) SetSelectCharacterPhase system.py(line:130) pack_import system.py(line:110) _process_result introSelect.py(line:23) <module> system.py(line:130) pack_import system.py(line:110) _process_result uiAffectShower.py(line:8) <module> system.py(line:130) __pack_import networkModule.SetSelectCharacterPhase - <type 'exceptions.IndentationError'>:unexpected indent (uiToolTip.py, line 864) 1228 18:28:08362 :: ============================================================================================================ 1228 18:28:08362 :: Abort!!!!
uitooltip line 864 - you have tab error. ckeck your tabs
-
6 hours ago, Kafa said:
You did something wrong, for me everything works perfect.
i looked 100 times but i cant find...
-
On 12/19/2020 at 5:37 AM, Rakancito said:
M2 Download Center
( Internal )
( GitHub )
This is the Level System and Point's for Yohara
1. The maps are empty, in essence it's the system, (without mobs).
2. If you want to add the monsters on the maps you can contact me and, I add the monsters and put your credits, the truth was I was lazy :'(.
3. I can upload updates if you need it.
4. In essence if you are level 1 or higher, you become "Conqueror", otherwise you are a normal player, your job is simply to add that after Hydra, though, I'll add it later.
5. At the moment it calls the normal experience table, since I have not reviewed the officer's experience tables, but if you indicate the tables, I can modify the code and add that part.
Images:
In GitHub REAMDE.
Link:
You will need a some visual parts, you can with:
I will continue making updates with information by Official Servers .
The system is working properly.Nice System and works good, but my Character is Lv 120 (max) and if i change Conq.Lv to 1, the AttachTitle dont change
the normal playerlevel to conq. level
If i ride a horse, the level will be updated for 2 seconds and then change back to lv. 120
- 5
- 2
-
vor 2 Minuten schrieb Sebyca1911:
I do like in tutorial and I was careful to do not make somethink wrogn, I chek 2 times, but when I compile db I get this error in putty . I Don't find a full tutorial and don't know where I shuld modify int in long long anymore. Can someone help me please?
error is in lenght.h
Spoiler -
-
vor 14 Stunden schrieb Pongo Metin2:
Ken
xd
- 1
-
uiInventory.py
Search:
def RefreshBagSlotWindow(self):
Find this:
self.wndItem.RefreshSlot() if self.wndBelt: self.wndBelt.RefreshSlot()
Add below:
if 53001 <= itemVnum and 53051 >= itemVnum: metinSocket = [player.GetItemMetinSocket(slotNumber, j) for j in xrange(player.METIN_SOCKET_MAX_NUM)] if slotNumber >= player.INVENTORY_PAGE_SIZE*self.inventoryPageIndex: slotNumber -= player.INVENTORY_PAGE_SIZE*self.inventoryPageIndex isActivated = 0 != metinSocket[1] if isActivated: self.wndItem.ActivateSlot(slotNumber) else: self.wndItem.DeactivateSlot(slotNumber)
-
3 hours ago, AlexKenT said:
Can you leave your uicharacter.py ?
Yeah, pls
-
-
4 minutes ago, alondark said:
check item_length.h or length.h
checked....
-
-
Following problem:
I have added the shoulder sash system.
The shoulder strap goes into the imaginary costume braid.
The effect that it has been equipped is also displayed.
In the item_proto, the value3 is adapted to the index in the .msm (root) (since no scale).
The paths to the respective .gr2 files of the sash are correct.
Granny was also upgraded from 2.4 to 2.9 and
The Granny (.gr2) also with the Bulkconverter.
Now the sash are still invisible ....- 1
-
the .dll at : \source\UserInterface ??
-
Nice.
Without Source:
Go to: ../ymir work/npc2 ...
pwahuang1.msm search:
{
Radius
Position
}edit like this:
{
Radius -100.000000
Position -100.000000 -100.000000 -100.000000
} -
same problem
-
Tut is in Guides and Howto or C++ !!
-
binary source ->
UserInterface / InstanceBaseEffect.cpp -> void CInstanceBase::UpdateTextTailLevel(DWORD level)
-
don't work?
I don't now.
-
Thanks !
-
-
ln -s /usr/home/game2 /home ^^
- 1
Expanded Reload Commands
in Commands
Posted
need visual part for client.