- Mesaj
- 89
- Çözümler
- 4
- Beğeni
- 39
- Puan
- 689
- Ticaret Puanı
- 0
Konu başlığına yardım veya help yazmak yasak, tekrarlanması durumunda gerekli yaptırımlar yapılacaktır.
iyi akşamlar,
won sistemini eklerken src kısmında takıldığım bir kaç nokta oldu ekleyeceğim kod bloklarında anlatımda ki 56. satırda değiştirmem gereken bir kod satırı var fakat files'a yang limit sistemi eklendiği için kodlar bayağı karmaşık nasıl yapacağımı bilemedim konu hakkında yardımcı olabilecek var mı?
won sistemini eklerken src kısmında takıldığım bir kaç nokta oldu ekleyeceğim kod bloklarında anlatımda ki 56. satırda değiştirmem gereken bir kod satırı var fakat files'a yang limit sistemi eklendiği için kodlar bayağı karmaşık nasıl yapacağımı bilemedim konu hakkında yardımcı olabilecek var mı?
Anlatım:
//ARA :
item.price = pTable->price; // 가격도 사용자가 정한대로..
//ALTINA EKLE :
#ifdef WJ_CHEQUE_SYSTEM
item.cheque_price = pTable->cheque_price;
#endif
//ARA :
if (r_item.price < 0)
//DE金?? :
#ifdef WJ_CHEQUE_SYSTEM
if (r_item.price < 0 && r_item.cheque_price <= 0)
#else
if (r_item.price < 0)
#endif
//ARA :
DWORD dwPrice = r_item.price;
//ALTINA EKLE :
#ifdef WJ_CHEQUE_SYSTEM
BYTE byChequePrice = r_item.cheque_price;
#endif
//ARA :
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;
}
//ALTINA EKLE :
#ifdef WJ_CHEQUE_SYSTEM
if (ch->GetCheque() < byChequePrice)
{
sys_log(1, "Shop::Buy : Not enough cheque : %s has %d, price %d", ch->GetName(), ch->GetCheque(), byChequePrice);
return SHOP_SUBHEADER_GC_NOT_ENOUGH_CHEQUE;
}
#endif
//ARA :
ch->PointChange(POINT_GOLD, -dwPrice, false);
//DE金?? :
#ifdef WJ_CHEQUE_SYSTEM
if(dwPrice)
ch->PointChange(POINT_GOLD, -dwPrice, false);
if(byChequePrice)
ch->PointChange(POINT_CHEQUE, -byChequePrice, false);
#else
ch->PointChange(POINT_GOLD, -dwPrice, false);
#endif
//ARA :
snprintf(buf, sizeof(buf), "%s %u(%s) %u %u", item->GetName(), m_pkPC->GetPlayerID(), m_pkPC->GetName(), dwPrice, item->GetCount());
LogManager::instance().ItemLog(ch, item, "SHOP_BUY", buf);
snprintf(buf, sizeof(buf), "%s %u(%s) %u %u", item->GetName(), ch->GetPlayerID(), ch->GetName(), dwPrice, item->GetCount());
LogManager::instance().ItemLog(m_pkPC, item, "SHOP_SELL", buf);
//DE金?? :
#ifdef WJ_CHEQUE_SYSTEM
snprintf(buf, sizeof(buf), "%s %u(%s) %u %u %u", item->GetName(), m_pkPC->GetPlayerID(), m_pkPC->GetName(), dwPrice, byChequePrice, item->GetCount());
#else
snprintf(buf, sizeof(buf), "%s %u(%s) %u %u", item->GetName(), m_pkPC->GetPlayerID(), m_pkPC->GetName(), dwPrice, item->GetCount());
#endif
LogManager::instance().ItemLog(ch, item, "SHOP_BUY", buf);
#ifdef WJ_CHEQUE_SYSTEM
snprintf(buf, sizeof(buf), "%s %u(%s) %u %u %u", item->GetName(), ch->GetPlayerID(), ch->GetName(), dwPrice, byChequePrice, item->GetCount());
#else
snprintf(buf, sizeof(buf), "%s %u(%s) %u %u", item->GetName(), ch->GetPlayerID(), ch->GetName(), dwPrice, item->GetCount());
#endif
LogManager::instance().ItemLog(m_pkPC, item, "SHOP_SELL", buf);
//ARA :
m_pkPC->PointChange(POINT_GOLD, dwPrice, false);
//DE金?? :
#ifdef WJ_CHEQUE_SYSTEM
if(dwPrice)
m_pkPC->PointChange(POINT_GOLD, dwPrice, false);
if(byChequePrice)
m_pkPC->PointChange(POINT_CHEQUE, byChequePrice, false);
#else
m_pkPC->PointChange(POINT_GOLD, dwPrice, false);
#endif
//ARA :
pack2.items[i].price = item.price;
//ALTINA EKLE :
#ifdef WJ_CHEQUE_SYSTEM
pack2.items[i].byChequePrice = item.cheque_price;
#endif
//ARA :
pack2.item.price = m_itemVector[pos].price;
//ALTINA EKLE :
#ifdef WJ_CHEQUE_SYSTEM
pack2.item.byChequePrice = m_itemVector[pos].cheque_price;
#endif
shop.cpp:
#include "stdafx.h"
#include "../../libgame/include/grid.h"
#include "constants.h"
#include "utils.h"
#include "config.h"
#include "shop.h"
#include "desc.h"
#include "desc_manager.h"
#include "char.h"
#include "char_manager.h"
#include "item.h"
#include "item_manager.h"
#include "buffer_manager.h"
#include "packet.h"
#include "log.h"
#include "db.h"
#include "questmanager.h"
#include "monarch.h"
#include "mob_manager.h"
#include "locale_service.h"
/* ------------------------------------------------------------------------------------ */
CShop::CShop()
: m_dwVnum(0), m_dwNPCVnum(0), m_pkPC(NULL)
{
m_pGrid = M2_NEW CGrid(5, 9);
}
CShop::~CShop()
{
TPacketGCShop pack;
pack.header = HEADER_GC_SHOP;
pack.subheader = SHOP_SUBHEADER_GC_END;
pack.size = sizeof(TPacketGCShop);
Broadcast(&pack, sizeof(pack));
GuestMapType::iterator it;
it = m_map_guest.begin();
while (it != m_map_guest.end())
{
LPCHARACTER ch = it->first;
ch->SetShop(NULL);
++it;
}
M2_DELETE(m_pGrid);
}
void CShop::SetPCShop(LPCHARACTER ch)
{
m_pkPC = ch;
}
bool CShop::Create(DWORD dwVnum, DWORD dwNPCVnum, TShopItemTable * pTable)
{
/*
if (NULL == CMobManager::instance().Get(dwNPCVnum))
{
sys_err("No such a npc by vnum %d", dwNPCVnum);
return false;
}
*/
sys_log(0, "SHOP #%d (Shopkeeper %d)", dwVnum, dwNPCVnum);
m_dwVnum = dwVnum;
m_dwNPCVnum = dwNPCVnum;
BYTE bItemCount;
for (bItemCount = 0; bItemCount < SHOP_HOST_ITEM_MAX_NUM; ++bItemCount)
if (0 == (pTable + bItemCount)->vnum)
break;
SetShopItems(pTable, bItemCount);
return true;
}
void CShop::SetShopItems(TShopItemTable * pTable, BYTE bItemCount)
{
if (bItemCount > SHOP_HOST_ITEM_MAX_NUM)
return;
m_pGrid->Clear();
m_itemVector.resize(SHOP_HOST_ITEM_MAX_NUM);
memset(&m_itemVector[0], 0, sizeof(SHOP_ITEM) * m_itemVector.size());
for (int i = 0; i < bItemCount; ++i)
{
LPITEM pkItem = NULL;
const TItemTable * item_table;
if (m_pkPC)
{
pkItem = m_pkPC->GetItem(pTable->pos);
if (!pkItem)
{
sys_err("cannot find item on pos (%d, %d) (name: %s)", pTable->pos.window_type, pTable->pos.cell, m_pkPC->GetName());
continue;
}
item_table = pkItem->GetProto();
}
else
{
if (!pTable->vnum)
continue;
item_table = ITEM_MANAGER::instance().GetTable(pTable->vnum);
}
if (!item_table)
{
sys_err("Shop: no item table by item vnum #%d", pTable->vnum);
continue;
}
int iPos;
if (IsPCShop())
{
sys_log(0, "MyShop: use position %d", pTable->display_pos);
iPos = pTable->display_pos;
}
else
iPos = m_pGrid->FindBlank(1, item_table->bSize);
if (iPos < 0)
{
sys_err("not enough shop window");
continue;
}
if (!m_pGrid->IsEmpty(iPos, 1, item_table->bSize))
{
if (IsPCShop())
{
sys_err("not empty position for pc shop %s[%d]", m_pkPC->GetName(), m_pkPC->GetPlayerID());
}
else
{
sys_err("not empty position for npc shop");
}
continue;
}
m_pGrid->Put(iPos, 1, item_table->bSize);
SHOP_ITEM & item = m_itemVector[iPos];
item.pkItem = pkItem;
item.itemid = 0;
if (item.pkItem)
{
item.vnum = pkItem->GetVnum();
item.count = pkItem->GetCount(); // PC 샵의 경우 아이템 개수는 진짜 아이템의 개수여야 한다.
item.price = pTable->price; // 가격도 사용자가 정한대로..
item.itemid = pkItem->GetID();
}
else
{
item.vnum = pTable->vnum;
item.count = pTable->count;
if (IS_SET(item_table->dwFlags, ITEM_FLAG_COUNT_PER_1GOLD))
{
if (item_table->dwGold == 0)
item.price = item.count;
else
item.price = item.count / item_table->dwGold;
}
else
item.price = item_table->dwGold * item.count;
}
char name[36];
snprintf(name, sizeof(name), "%-20s(#%-5d) (x %d)", item_table->szName, (int) item.vnum, item.count);
sys_log(0, "SHOP_ITEM: %-36s PRICE %-5d", name, item.price);
++pTable;
}
}
#ifdef ENABLE_YANG_LIMIT
long long CShop::Buy(LPCHARACTER ch, BYTE pos)
#else
int CShop::Buy(LPCHARACTER ch, BYTE pos)
#endif
{
if (pos >= m_itemVector.size())
{
sys_log(0, "Shop::Buy : invalid position %d : %s", pos, ch->GetName());
return SHOP_SUBHEADER_GC_INVALID_POS;
}
sys_log(0, "Shop::Buy : name %s pos %d", ch->GetName(), pos);
GuestMapType::iterator it = m_map_guest.find(ch);
if (it == m_map_guest.end())
return SHOP_SUBHEADER_GC_END;
SHOP_ITEM& r_item = m_itemVector[pos];
if (r_item.price <= 0)
{
LogManager::instance().HackLog("SHOP_BUY_GOLD_OVERFLOW", ch);
return SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY;
}
LPITEM pkSelectedItem = ITEM_MANAGER::instance().Find(r_item.itemid);
if (IsPCShop())
{
if (!pkSelectedItem)
{
sys_log(0, "Shop::Buy : Critical: This user seems to be a hacker : invalid pcshop item : BuyerPID:%d SellerPID:%d",
ch->GetPlayerID(),
m_pkPC->GetPlayerID());
return SHOP_SUBHEADER_GC_SOLD_OUT; // @fixme132 false to SHOP_SUBHEADER_GC_SOLD_OUT
}
if ((pkSelectedItem->GetOwner() != m_pkPC))
{
sys_log(0, "Shop::Buy : Critical: This user seems to be a hacker : invalid pcshop item : BuyerPID:%d SellerPID:%d",
ch->GetPlayerID(),
m_pkPC->GetPlayerID());
return SHOP_SUBHEADER_GC_SOLD_OUT; // @fixme132 false to SHOP_SUBHEADER_GC_SOLD_OUT
}
}
#ifdef ENABLE_YANG_LIMIT
long long dwPrice = r_item.price;
#else
DWORD dwPrice = r_item.price;
#endif
if (it->second) // if other empire, price is triple
dwPrice *= 3;
#ifdef ENABLE_YANG_LIMIT
if (ch->GetGold() < (long long) dwPrice)
{
sys_log(1, "Shop::Buy : Not enough money : %s has %lld, price %lld", ch->GetName(), ch->GetGold(), dwPrice);
return SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY;
}
#else
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;
}
#endif
LPITEM item;
if (m_pkPC) // 피씨가 운영하는 샵은 피씨가 실제 아이템을 가지고있어야 한다.
item = r_item.pkItem;
else
item = ITEM_MANAGER::instance().CreateItem(r_item.vnum, r_item.count);
if (!item)
return SHOP_SUBHEADER_GC_SOLD_OUT;
/*if (!m_pkPC)
{
if (quest::CQuestManager::instance().GetEventFlag("hivalue_item_sell") == 0)
{
if (item->GetVnum() == 70024 || item->GetVnum() == 70035)
{
return SHOP_SUBHEADER_GC_END;
}
}
}*/
int iEmptyPos;
if (item->IsDragonSoul())
{
iEmptyPos = ch->GetEmptyDragonSoulInventory(item);
}
else
{
iEmptyPos = ch->GetEmptyInventory(item->GetSize());
}
if (iEmptyPos < 0)
{
if (m_pkPC)
{
sys_log(1, "Shop::Buy at PC Shop : Inventory full : %s size %d", ch->GetName(), item->GetSize());
return SHOP_SUBHEADER_GC_INVENTORY_FULL;
}
else
{
sys_log(1, "Shop::Buy : Inventory full : %s size %d", ch->GetName(), item->GetSize());
M2_DESTROY_ITEM(item);
return SHOP_SUBHEADER_GC_INVENTORY_FULL;
}
}
ch->PointChange(POINT_GOLD, -dwPrice, false);
//세금 계산
DWORD dwTax = 0;
int iVal = 0;
{
iVal = quest::CQuestManager::instance().GetEventFlag("personal_shop");
if (0 < iVal)
{
if (iVal > 100)
iVal = 100;
dwTax = dwPrice * iVal / 100;
dwPrice = dwPrice - dwTax;
}
else
{
iVal = 0;
dwTax = 0;
}
}
if (!m_pkPC)
{
CMonarch::instance().SendtoDBAddMoney(dwTax, ch->GetEmpire(), ch);
}
if (m_pkPC)
{
m_pkPC->SyncQuickslot(QUICKSLOT_TYPE_ITEM, item->GetCell(), 255);
if (item->GetVnum() == 90008 || item->GetVnum() == 90009) // VCARD
{
VCardUse(m_pkPC, ch, item);
item = NULL;
}
else
{
char buf[512];
if (item->GetVnum() >= 80003 && item->GetVnum() <= 80007)
{
#ifdef ENABLE_YANG_LIMIT
snprintf(buf, sizeof(buf), "%s FROM: %u TO: %u PRICE: %lld", item->GetName(), ch->GetPlayerID(), m_pkPC->GetPlayerID(), dwPrice);
#else
snprintf(buf, sizeof(buf), "%s FROM: %u TO: %u PRICE: %u", item->GetName(), ch->GetPlayerID(), m_pkPC->GetPlayerID(), dwPrice);
#endif
LogManager::instance().GoldBarLog(ch->GetPlayerID(), item->GetID(), SHOP_BUY, buf);
LogManager::instance().GoldBarLog(m_pkPC->GetPlayerID(), item->GetID(), SHOP_SELL, buf);
}
item->RemoveFromCharacter();
if (item->IsDragonSoul())
item->AddToCharacter(ch, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyPos));
else
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
ITEM_MANAGER::instance().FlushDelayedSave(item);
#ifdef ENABLE_YANG_LIMIT
snprintf(buf, sizeof(buf), "%s %u(%s) %lld %u", item->GetName(), m_pkPC->GetPlayerID(), m_pkPC->GetName(), dwPrice, item->GetCount());
LogManager::instance().ItemLog(ch, item, "SHOP_BUY", buf);
snprintf(buf, sizeof(buf), "%s %u(%s) %lld %u", item->GetName(), ch->GetPlayerID(), ch->GetName(), dwPrice, item->GetCount());
LogManager::instance().ItemLog(m_pkPC, item, "SHOP_SELL", buf);
#else
snprintf(buf, sizeof(buf), "%s %u(%s) %u %u", item->GetName(), m_pkPC->GetPlayerID(), m_pkPC->GetName(), dwPrice, item->GetCount());
LogManager::instance().ItemLog(ch, item, "SHOP_BUY", buf);
snprintf(buf, sizeof(buf), "%s %u(%s) %u %u", item->GetName(), ch->GetPlayerID(), ch->GetName(), dwPrice, item->GetCount());
LogManager::instance().ItemLog(m_pkPC, item, "SHOP_SELL", buf);
#endif
}
r_item.pkItem = NULL;
BroadcastUpdateItem(pos);
m_pkPC->PointChange(POINT_GOLD, dwPrice, false);
if (iVal > 0)
m_pkPC->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("판매금액의 %d %% 가 세금으로 나가게됩니다"), iVal);
CMonarch::instance().SendtoDBAddMoney(dwTax, m_pkPC->GetEmpire(), m_pkPC);
}
else
{
if (item->IsDragonSoul())
item->AddToCharacter(ch, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyPos));
else
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
ITEM_MANAGER::instance().FlushDelayedSave(item);
LogManager::instance().ItemLog(ch, item, "BUY", item->GetName());
if (item->GetVnum() >= 80003 && item->GetVnum() <= 80007)
{
LogManager::instance().GoldBarLog(ch->GetPlayerID(), item->GetID(), PERSONAL_SHOP_BUY, "");
}
DBManager::instance().SendMoneyLog(MONEY_LOG_SHOP, item->GetVnum(), -dwPrice);
}
#ifdef ENABLE_YANG_LIMIT
if (item)
sys_log(0, "SHOP: BUY: name %s %s(x %d):%u price %lld", ch->GetName(), item->GetName(), item->GetCount(), item->GetID(), dwPrice);
#else
if (item)
sys_log(0, "SHOP: BUY: name %s %s(x %d):%u price %u", ch->GetName(), item->GetName(), item->GetCount(), item->GetID(), dwPrice);
#endif
ch->Save();
return (SHOP_SUBHEADER_GC_OK);
}
bool CShop::AddGuest(LPCHARACTER ch, DWORD owner_vid, bool bOtherEmpire)
{
if (!ch)
return false;
if (ch->GetExchange())
return false;
if (ch->GetShop())
return false;
ch->SetShop(this);
m_map_guest.insert(GuestMapType::value_type(ch, bOtherEmpire));
TPacketGCShop pack;
pack.header = HEADER_GC_SHOP;
pack.subheader = SHOP_SUBHEADER_GC_START;
TPacketGCShopStart pack2;
memset(&pack2, 0, sizeof(pack2));
pack2.owner_vid = owner_vid;
for (DWORD i = 0; i < m_itemVector.size() && i < SHOP_HOST_ITEM_MAX_NUM; ++i)
{
const SHOP_ITEM & item = m_itemVector[i];
if (item.vnum == 70024 || item.vnum == 70035)
{
continue;
}
if (m_pkPC && !item.pkItem)
continue;
pack2.items[i].vnum = item.vnum;
#ifdef ENABLE_NEWSTUFF
if (bOtherEmpire && !g_bEmpireShopPriceTripleDisable)
#else
if (bOtherEmpire)
#endif
{
pack2.items[i].price = item.price * 3;
}
else
pack2.items[i].price = item.price;
pack2.items[i].count = item.count;
if (item.pkItem)
{
thecore_memcpy(pack2.items[i].alSockets, item.pkItem->GetSockets(), sizeof(pack2.items[i].alSockets));
thecore_memcpy(pack2.items[i].aAttr, item.pkItem->GetAttributes(), sizeof(pack2.items[i].aAttr));
}
}
pack.size = sizeof(pack) + sizeof(pack2);
ch->GetDesc()->BufferedPacket(&pack, sizeof(TPacketGCShop));
ch->GetDesc()->Packet(&pack2, sizeof(TPacketGCShopStart));
return true;
}
void CShop::RemoveGuest(LPCHARACTER ch)
{
if (ch->GetShop() != this)
return;
m_map_guest.erase(ch);
ch->SetShop(NULL);
TPacketGCShop pack;
pack.header = HEADER_GC_SHOP;
pack.subheader = SHOP_SUBHEADER_GC_END;
pack.size = sizeof(TPacketGCShop);
ch->GetDesc()->Packet(&pack, sizeof(pack));
}
void CShop::Broadcast(const void * data, int bytes)
{
sys_log(1, "Shop::Broadcast %p %d", data, bytes);
GuestMapType::iterator it;
it = m_map_guest.begin();
while (it != m_map_guest.end())
{
LPCHARACTER ch = it->first;
if (ch->GetDesc())
ch->GetDesc()->Packet(data, bytes);
++it;
}
}
void CShop::BroadcastUpdateItem(BYTE pos)
{
TPacketGCShop pack;
TPacketGCShopUpdateItem pack2;
TEMP_BUFFER buf;
pack.header = HEADER_GC_SHOP;
pack.subheader = SHOP_SUBHEADER_GC_UPDATE_ITEM;
pack.size = sizeof(pack) + sizeof(pack2);
pack2.pos = pos;
if (m_pkPC && !m_itemVector[pos].pkItem)
pack2.item.vnum = 0;
else
{
pack2.item.vnum = m_itemVector[pos].vnum;
if (m_itemVector[pos].pkItem)
{
thecore_memcpy(pack2.item.alSockets, m_itemVector[pos].pkItem->GetSockets(), sizeof(pack2.item.alSockets));
thecore_memcpy(pack2.item.aAttr, m_itemVector[pos].pkItem->GetAttributes(), sizeof(pack2.item.aAttr));
}
else
{
memset(pack2.item.alSockets, 0, sizeof(pack2.item.alSockets));
memset(pack2.item.aAttr, 0, sizeof(pack2.item.aAttr));
}
}
pack2.item.price = m_itemVector[pos].price;
pack2.item.count = m_itemVector[pos].count;
buf.write(&pack, sizeof(pack));
buf.write(&pack2, sizeof(pack2));
Broadcast(buf.read_peek(), buf.size());
}
int CShop::GetNumberByVnum(DWORD dwVnum)
{
int itemNumber = 0;
for (DWORD i = 0; i < m_itemVector.size() && i < SHOP_HOST_ITEM_MAX_NUM; ++i)
{
const SHOP_ITEM & item = m_itemVector[i];
if (item.vnum == dwVnum)
{
itemNumber += item.count;
}
}
return itemNumber;
}
bool CShop::IsSellingItem(DWORD itemID)
{
bool isSelling = false;
for (DWORD i = 0; i < m_itemVector.size() && i < SHOP_HOST_ITEM_MAX_NUM; ++i)
{
if (static_cast<unsigned long>(m_itemVector[i].itemid) == itemID)
{
isSelling = true;
break;
}
}
return isSelling;
}