Metin2 Files Kodlama işlerinde yeniyim işi kavramaya çalışıyorum genelde yardım almak yerine kendim uğraşır yaparım ama bu bölümde baya bi takıldım araştırma yaptım ama bir çözüm bulamadım K envanterinde azrail sandığı gelince sandık stacklenmiyor item_protodan düzenlememe rağmen birşey değişmiyor char_item.cpp dosyasındaki moveıtem bölümünü kontrol edip değişiklikler yapmaya çalışıyorum ama başka itemler stacklenirken sandıktaki azrail sandığı stacklenmiyor aşağıya char_item.cpp dosyasındaki MoveItem bölümünü ve azo sandığının protosunu paylaştım şimdiden yardımlarınız için teşekkür ederim
Kullandığım K Envanteri Sistemi:
Kullandığım K Envanteri Sistemi:
Linkleri görebilmek için
giriş yap veya kayıt ol.
item_proto.txt:
50186 ¾Æ±Í´ëÁ¦ÀÇ»óÀÚ ITEM_GIFTBOX 0 1 ANTI_DROP | ANTI_SELL ITEM_STACKABLE NONE 4 0 0 0 0 LIMIT_NONE 0 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 0 0 0 0 0 0 0 0 0
char_item.cpp:
bool CHARACTER::MoveItem(TItemPos Cell, TItemPos DestCell, BYTE count)
{
LPITEM item = NULL;
if (!IsValidItemPosition(Cell))
return false;
if (!(item = GetItem(Cell)))
return false;
if (item->IsExchanging())
return false;
if (item->GetCount() < count)
return false;
#ifdef ENABLE_SPLIT_INVENTORY_SYSTEM
if (INVENTORY == Cell.window_type && Cell.cell >= INVENTORY_AND_EQUIP_SLOT_MAX && IS_SET(item->GetFlag(), ITEM_FLAG_IRREMOVABLE))
return false;
#else
if (INVENTORY == Cell.window_type && Cell.cell >= INVENTORY_MAX_NUM && IS_SET(item->GetFlag(), ITEM_FLAG_IRREMOVABLE))
return false;
#endif
if (true == item->isLocked())
return false;
if (!IsValidItemPosition(DestCell))
{
return false;
}
if (!CanHandleItem())
{
if (NULL != DragonSoul_RefineWindow_GetOpener())
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°ÈâÀ» ¿¬ »óÅ¿¡¼´Â ¾ÆÀÌÅÛÀ» ¿Å±æ ¼ö ¾ø½À´Ï´Ù."));
return false;
}
// ±âȹÀÚÀÇ ¿äûÀ¸·Î º§Æ® Àκ¥Å丮¿¡´Â ƯÁ¤ ŸÀÔÀÇ ¾ÆÀÌÅÛ¸¸ ³ÖÀ» ¼ö ÀÖ´Ù.
if (DestCell.IsBeltInventoryPosition() && false == CBeltInventoryHelper::CanMoveIntoBeltInventory(item))
{
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÀÌ ¾ÆÀÌÅÛÀº º§Æ® Àκ¥Å丮·Î ¿Å±æ ¼ö ¾ø½À´Ï´Ù."));
return false;
}
LPITEM item2;
item2 = GetItem(DestCell);
#ifdef ENABLE_SPLIT_INVENTORY_SYSTEM
if (item->IsSkillBook())
{
if (DestCell.window_type != SKILL_BOOK_INVENTORY)
{
return false;
}
else if (SKILL_BOOK_INVENTORY == DestCell.window_type)
{
return false;
}
}
else if (item->IsUpgradeItem())
{
if (DestCell.window_type != UPGRADE_ITEMS_INVENTORY)
{
return false;
}
else if (UPGRADE_ITEMS_INVENTORY == DestCell.window_type)
{
return false;
}
}
else if (item->IsStone())
{
if (DestCell.window_type != STONE_INVENTORY)
{
return false;
}
else if (STONE_INVENTORY == DestCell.window_type)
{
return false;
}
}
else if (item->IsBox())
{
if (DestCell.window_type != BOX_INVENTORY)
{
return false;
}
else if (BOX_INVENTORY == DestCell.window_type)
{
if (count == 0)
count = item->GetCount();
sys_log(0, "%s: ITEM_STACK %s (window: %d, cell : %d) -> (window:%d, cell %d) count %d", GetName(), item->GetName(), Cell.window_type, Cell.cell,
DestCell.window_type, DestCell.cell, count);
count = MIN(200 - item2->GetCount(), count);
item->SetCount(item->GetCount() - count);
item2->SetCount(item2->GetCount() + count);
return true;
}
}
else if (item->IsEfsun())
{
if (DestCell.window_type != EFSUN_INVENTORY)
{
return false;
}
else if (EFSUN_INVENTORY == DestCell.window_type)
{
return false;
}
}
else if (item->IsCicek())
{
if (DestCell.window_type != CICEK_INVENTORY)
{;
return false;
}
else if (CICEK_INVENTORY == DestCell.window_type)
{
return false;
}
}
#endif
// ÀÌ¹Ì Âø¿ëÁßÀÎ ¾ÆÀÌÅÛÀ» ´Ù¸¥ °÷À¸·Î ¿Å±â´Â °æ¿ì, 'ÀåÃ¥ ÇØÁ¦' °¡´ÉÇÑ Áö È®ÀÎÇÏ°í ¿Å±è
if (Cell.IsEquipPosition() && !CanUnequipNow(item))
return false;
if (DestCell.IsEquipPosition())
{
if (GetItem(DestCell)) // ÀåºñÀÏ °æ¿ì ÇÑ °÷¸¸ °Ë»çÇصµ µÈ´Ù.
{
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÀÌ¹Ì Àåºñ¸¦ Âø¿ëÇÏ°í ÀÖ½À´Ï´Ù."));
return false;
}
EquipItem(item, DestCell.cell - INVENTORY_MAX_NUM);
}
else
{
if (item->IsDragonSoul())
{
if (item->IsEquipped())
{
return DSManager::instance().PullOut(this, DestCell, item);
}
else
{
if (DestCell.window_type != DRAGON_SOUL_INVENTORY)
{
return false;
}
if (!DSManager::instance().IsValidCellForThisItem(item, DestCell))
return false;
}
}
// ¿ëÈ¥¼®ÀÌ ¾Æ´Ñ ¾ÆÀÌÅÛÀº ¿ëÈ¥¼® Àκ¥¿¡ µé¾î°¥ ¼ö ¾ø´Ù.
else if (DRAGON_SOUL_INVENTORY == DestCell.window_type)
return false;
if ((item2 = GetItem(DestCell)) && item != item2 && item2->IsStackable() &&
!IS_SET(item2->GetAntiFlag(), ITEM_ANTIFLAG_STACK) &&
item2->GetVnum() == item->GetVnum()) // ÇÕÄ¥ ¼ö ÀÖ´Â ¾ÆÀÌÅÛÀÇ °æ¿ì
{
for (int i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
if (item2->GetSocket(i) != item->GetSocket(i))
return false;
if (count == 0)
count = item->GetCount();
sys_log(0, "%s: ITEM_STACK %s (window: %d, cell : %d) -> (window:%d, cell %d) count %d", GetName(), item->GetName(), Cell.window_type, Cell.cell,
DestCell.window_type, DestCell.cell, count);
count = MIN(200 - item2->GetCount(), count);
item->SetCount(item->GetCount() - count);
item2->SetCount(item2->GetCount() + count);
return true;
}
if (!IsEmptyItemGrid(DestCell, item->GetSize(), Cell.cell))
return false;
if (count == 0 || count >= item->GetCount() || !item->IsStackable() || IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_STACK))
{
sys_log(0, "%s: ITEM_MOVE %s (window: %d, cell : %d) -> (window:%d, cell %d) count %d", GetName(), item->GetName(), Cell.window_type, Cell.cell,
DestCell.window_type, DestCell.cell, count);
item->RemoveFromCharacter();
SetItem(DestCell, item);
if (INVENTORY == Cell.window_type && INVENTORY == DestCell.window_type)
SyncQuickslot(QUICKSLOT_TYPE_ITEM, Cell.cell, DestCell.cell);
}
else if (count < item->GetCount())
{
//check non-split items
//if (LC_IsNewCIBN())
//{
// if (item->GetVnum() == 71095 || item->GetVnum() == 71050 || item->GetVnum() == 70038)
// {
// return false;
// }
//}
sys_log(0, "%s: ITEM_SPLIT %s (window: %d, cell : %d) -> (window:%d, cell %d) count %d", GetName(), item->GetName(), Cell.window_type, Cell.cell,
DestCell.window_type, DestCell.cell, count);
item->SetCount(item->GetCount() - count);
LPITEM item2 = ITEM_MANAGER::instance().CreateItem(item->GetVnum(), count);
// copy socket -- by mhh
FN_copy_item_socket(item2, item);
item2->AddToCharacter(this, DestCell);
char szBuf[51+1];
snprintf(szBuf, sizeof(szBuf), "%u %u %u %u ", item2->GetID(), item2->GetCount(), item->GetCount(), item->GetCount() + item2->GetCount());
LogManager::instance().ItemLog(this, item, "ITEM_SPLIT", szBuf);
}
}
return true;
}