Fix-Add : Exchange Item Remove System

s1nwar

Level 3
Katılım
9 Haz 2025
Konular
25
Mesajlar
102
Online süresi
14d 5h
Reaksiyon Skoru
122
Altın Konu
0
TM Yaşı
12 Ay 1 Gün
Başarım Puanı
62
MmoLira
2,740
DevLira
60
Ticaret - 0%
0   0   0

ROHAN2 WORLD 1-120 TR TİPİ OFFICIAL YOHARA, BALATHOR VE AMON! 80. GÜNÜNDE! +10.000 ONLİNE! HİLE VE BOT %100 ENGELLİ HEMEN TIKLA!

Merhaba, iki oyuncu arasındaki ticaret penceresinden koyulan itemi geri çekmeye yarar. Ymir bunu yapmış fakat slot-grid hesabı karışıktı, pasif etmişler, yada bende böyleydi en azından, hem mevcut yapıyı güncelledim hem de sağ click ile kaldırmayı özelleştirdim.

- Seri seri kaldırma engeli mevcuttur.
- WJ_ENABLE_TRADABLE_ICON kullanmayanlar pythonda if bloğunu kaldırabilir.


[CODE lang="cpp" title="[Client] UserInterface \ PythonNetworkStreamPhaseGame.cpp"]// Fonksiyonu bul ve şurayı kaldır veya yorum satırına al. > bool CPythonNetworkStream::SendExchangeItemDelPacket(BYTE pos)
//assert(!"Can't be called function - CPythonNetworkStream::SendExchangeItemDelPacket");
//return true;[/CODE]
[CODE lang="cpp" title="[Server] Game \ exchange.cpp"]// Bu fonksiyonu bul ve değiştir (veya güncelle) : bool CExchange::AddItem(TItemPos item_pos, BYTE display_pos)

bool CExchange::AddItem(TItemPos item_pos, BYTE display_pos)
{
assert(m_pOwner != NULL && GetCompany());

if (!item_pos.IsValidItemPosition())
{
return false;
}

if (item_pos.IsEquipPosition())
{
return false;
}

LPITEM item = m_pOwner->GetItem(item_pos);
if (!item)
{
return false;
}

if (IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_GIVE))
{
m_pOwner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Bu eþya takasa verilemez."));
return false;
}

if (item->isLocked())
{
return false;
}

if (item->IsExchanging())
{
return false;
}

#if defined(ITEM_CHECKINOUT_UPDA#if
if (SelectPosAuto)
{
int AutoPos = GetEmptyExchange(item->GetSize());
if (AutoPos == -1)
{
GetOwner()->ChatPacket(CHAT_TYPE_INFO, "Yetersiz alan.");
return false;
}
display_pos = AutoPos;
}
#endif

if (!m_pGrid)
{
#endif return false;
}

if (!m_pGrid->IsEmpty(display_pos, 1, item->GetSize()))
{
return false;
}

Accept(false);
GetCompany()->Accept(false);

int i = -1;

for (int idx = 0; idx < EXCHANGE_ITEM_MAX_NUM; ++idx)
{
if (m_apItems[idx] && m_abItemDisplayPos[idx] == display_pos)
{
m_apItems[idx] = NULL;
m_aItemPos[idx] = NPOS;
m_abItemDisplayPos[idx] = 0;
i = idx;
break;
}
}

if (i == -1)
{
for (int idx = 0; idx < EXCHANGE_ITEM_MAX_NUM; ++idx)
{
if (!m_apItems[idx])
{
i = idx;
break;
}
}
}

if (i == -1)
{
return false;
}

m_apItems = item;
m_aItemPos = item_pos;
m_abItemDisplayPos = display_pos;

m_pGrid->Put(display_pos, 1, item->GetSize());
item->SetExchanging(true);

exchange_packet(m_pOwner,EXCHANGE_SUBHEADER_GC_ITEM_ADD,true,item->GetVnum(),TItemPos(RESERVED_WINDOW, display_pos),item->GetCount(),item);
exchange_packet(GetCompany()->GetOwner(),EXCHANGE_SUBHEADER_GC_ITEM_ADD,false,item->GetVnum(),TItemPos(RESERVED_WINDOW, display_pos),item->GetCount(),item);

return true;
}
[/CODE]
[CODE lang="cpp" title="[Server] Game \ exchange.cpp"]// Fonksiyonu bul ve değiştir. (Veya güncelle) : bool CExchange::RemoveItem(BYTE displayPos)

bool CExchange::RemoveItem(BYTE displayPos)
{
int realIndex = -1;
for (int i = 0; i < EXCHANGE_ITEM_MAX_NUM; ++i)
{
if (m_apItems && m_abItemDisplayPos == displayPos)
{
realIndex = i;
break;
}
}

if (realIndex == -1)
{
return false;
}

BYTE pos = realIndex;

if (pos >= EXCHANGE_ITEM_MAX_NUM)
{
return false;
}

if (!m_apItems[pos])
{
return false;
}

LPITEM pItem = m_apItems[pos];
if (!pItem)
{
return false;
}

TItemPos invPos = m_aItemPos[pos];
pItem->SetExchanging(false);

int itemSize = pItem->GetSize();
if (itemSize <= 0)
{
itemSize = 1;
}

if (!m_pGrid)
{
return false;
}

m_pGrid->Get(displayPos, 1, itemSize);


exchange_packet(GetOwner(),EXCHANGE_SUBHEADER_GC_ITEM_DEL,true,displayPos,NPOS,0);
exchange_packet(GetCompany()->GetOwner(),EXCHANGE_SUBHEADER_GC_ITEM_DEL,false,displayPos,invPos,0);

Accept(false);
GetCompany()->Accept(false);

m_apItems[pos] = nullptr;
m_aItemPos[pos] = NPOS;
m_abItemDisplayPos[pos] = 0;

return true;
}[/CODE]

[CODE lang="cpp" title="[Server] Game \ item.h"]// Bul ve değiştir : BYTE GetSize() { return m_pProto ? m_pProto->bSize : 0; }

BYTE GetSize() { return (m_pProto && m_pProto->bSize > 0) ? m_pProto->bSize : 1; }[/CODE]
[CODE lang="python" title="[Python] root \ uiexchange.py"]# Altına ekle : self.OwnerSlot.SetOverOutItemEvent(ui.__mem_func__(self.OverOutItem))

self.OwnerSlot.SetUnselectItemSlotEvent(ui.__mem_func__(self.OnRightClickOwnerItem))

# class ExchangeDialog Sınıfındaki def OpenDialog(self): fonksiyonun hemen altına ekle:

self.pendingRemove = set()
self.lastRemoveTime = 0.0

# class ExchangeDialog Sınıfındaki def CloseDialog(self): fonksiyonun hemen altına ekle:

self.pendingRemove = set()
self.lastRemoveTime = 0.0

# class ExchangeDialog Sınıfına ekle global alana
# Not: WJ_ENABLE_TRADABLE_ICON sistemi yok ise bu if bloğunu kaldır veya yorum satırına al

def OnRightClickOwnerItem(self, SlotIndex):
if exchange.GetAcceptFromSelf():
chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.EXCHANGE_CANT_EDIT_MONEY)
return

# --- Global Cooldown ---
if not hasattr(self, "lastRemoveGlobal"):
self.lastRemoveGlobal = 0.0
current_time = app.GetTime()
global_cooldown = 0.6
elapsed_global = current_time - self.lastRemoveGlobal
if elapsed_global < global_cooldown:
remaining = global_cooldown - elapsed_global
chat.AppendChat(chat.CHAT_TYPE_INFO, "Time required to remove: %.1fsec." % remaining)
return
self.lastRemoveGlobal = current_time

#try:
# itemVnum = exchange.GetItemVnumFro#tryf(SlotIndex)
# itemCount = exchange.GetItemCountFromSelf(SlotIndex)
# itemWidth, itemHeight = (1, 1)
# itemName = "?"
# if itemVnum > 0:
# item.SelectItem(itemVnum)
# itemName = item.GetItemName()
# itemWidth, itemHeight = item.GetItemSize()
#except Exception:
# return

# ---#exceptg Remove Protection ---
if not hasattr(self, "pendingRemove"):
self.pendingRemove = set()
if SlotIndex in self.pendingRemove:
chat.AppendChat(chat.CHAT_TYPE_INFO, "This item is already being removed!")
return
self.pendingRemove.add(SlotIndex)

# --- Slot Cooldown ---
if not hasattr(self, "lastRemoveTime"):
self.lastRemoveTime = 0.0
slot_cooldown = 0.4
elapsed_slot = current_time - self.lastRemoveTime
if elapsed_slot < slot_cooldown:
remaining = slot_cooldown - elapsed_slot
chat.AppendChat(chat.CHAT_TYPE_INFO, "Time required to remove: %.1fsec." % remaining)
self.pendingRemove.remove(SlotIndex)
return
self.lastRemoveTime = current_time

try:
net.SendExchangeItemDelPacket(SlotIndex)
except Exception:
if SlotIndex in self.pendingRemove:
self.pendingRemove.remove(SlotIndex)
return

#chat.AppendChat(chat.CHAT_TYPE_INFO, "%s is being re#chat.AppendChat(chat.CHAT_TYPE_INFOation)" % itemName)

if app.WJ_ENABLE_TRADABLE_ICON:
try:
if hasattr(self, "lockedItems"):
page, invSlot = self.lockedItems.get(SlotIndex, (-1, -1))
else:
self.lockedItems = {}
page, invSlot = (-1, -1)

self.lockedItems[SlotIndex] = (-1, -1)
if invSlot != -1 and hasattr(self, "wndInventory"):
self.wndInventory.wndItem.SetCanMouseEventSlot(invSlot)
self.wndInventory.wndItem.RefreshSlot()

if hasattr(self, "interface") and self.interface and self.interface.wndInventory:
self.interface.wndInventory.RefreshMarkSlots()
except Exception:
pass

if hasattr(self, "pendingRemove") and SlotIndex in self.pendingRemove:
self.pendingRemove.remove(SlotIndex)

if hasattr(self, "lastRemoveTime"):
self.lastRemoveTime = 0.0[/CODE]
 
Paylaşım için teşekkürler
 
Paylaşım için teşekkürler
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)