Sé, Crash, stb..

Indította TheSLESH, 2018-08-23, 15:22:53

2018-08-23, 15:22:53 Utolsó szerkesztés: 2018-08-23, 15:26:50 Szerző: TheSLESH
Beraktam a deven publikált SECONDARY, TRIPLE dolgot, hogy a boltba lehessen SÉ-ért, és WON-ért (NPC bolt) kitenni tárgyakat.
Mivel nem volt hozzá python rész, így megírtam magamnak, tökéletesen működik, amikor SÉ-ért akarok vásárolni levonja a SÉ-t, amikor nincs elég SÉ-m, kiirja hogy Nincs elég SÉ-d, viszont amikor egy sima yangért vásárolok, tökéletesen megveszi a tárgyat, ám amikor a SHOP_NOT_ENOUGH_MONEY jön (Nincs elég yangod) akkor az üzenet helyett, kifagy a CH, és újra kell indítani.

Szóval, ha kiteszek egy tárgyat 100 SÉ-ért, és van 99SÉ-m, akkor kiirja hogy nincs elég SÉ-m, de ha 100 yangért teszek ki valamit, és 99 yangom van, akkor kifagy a szerver... Hol lehet a hiba? Már kiég a szemem, de sehol sem találtam, gondolom valahol pythonban van, mert azt a részt írtam én, a c++ része az ugye adott volt...

Illetve, van egy rész amit módosítottam a shop.cpp-ben, a won-t átírtam runpontra.

if (item->GetAntiFlag() & ITEM_ANTIFLAG_SHOP_TRIPLE && !m_pkPC)
{
DWORD fiyat = r_item.price;
// SÉ
long ep = ch->Ep_Miktar();
if (ep < fiyat)
{
return YOK_2;
}
else
ch->Set_Ep(ch->Ep_Miktar()-fiyat);
}
else if (item->GetAntiFlag() & ITEM_ANTIFLAG_SHOP_SECONDARY && !m_pkPC)
{
DWORD fiyat = r_item.price;
// Run Pont
long ep = ch->Run_Pontok();
if (ep < fiyat)
{
return YOK_3;
}
else
ch->Run_Pont_adas(ch->Run_Pontok()-fiyat);
}
else
{
ch->PointChange(POINT_GOLD, -dwPrice, false);
#ifdef ENABLE_CHEQUE_SYSTEM
ch->PointChange(POINT_CHEQUE, -dwPriceCheque, false);
#endif
}


lehet a baj, hogy mind a kettő helyen ep a változó neve? Illetve ami még furcsa, hogy ITEM_ANTIFLAG_SHOP_SECONDARY a sé, és TRIPLE a runpont, pont fordítva mint ahogy itt szerepel, bár nem értem akkor sem,hogy miért pont a normális yangra (ch->PointChange(POINT_GOLD, -dwPrice, false);?) crashel ki.
Az ember csak fiatalon találhat ki igazán új dolgokat. Utána már túl tapasztalt, túl híres (...) és túl ostoba.

2018-08-23, 15:46:17 #1 Utolsó szerkesztés: 2018-08-23, 15:48:15 Szerző: K3zX
IdézHol lehet a hiba? Már kiég a szemem, de sehol sem találtam, gondolom valahol pythonban van, mert azt a részt írtam én, a c++ része az ugye adott volt...

Elég durva lenne ha elbaltáznánk valamit kliensoldalt és attól becrashelne a szerveroldal.
Akkor ma egy darab szerver nem futna már ;D

100% hogy szerveroldalt van a hiba. Ha linkeled talán belenézek a kódba, de nem ígérek semmit. Amúgy szerintem az hogy ep a változó mindkét helyen nem gond, hisz külön ágban vannak.

2018-08-23, 16:48:29 #2 Utolsó szerkesztés: 2018-08-24, 06:58:01 Szerző: TheSLESH
int CShop::Buy(LPCHARACTER ch, BYTE pos)
{
LPITEM item;

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 false;
}

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 false;
}
}

DWORD dwPrice = r_item.price;

if (it->second) // if other empire, price is triple
dwPrice *= 1;

//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;
//}
if (ch->GetGold() < (int) dwPrice && !(item->GetAntiFlag() & (ITEM_ANTIFLAG_SHOP_SECONDARY || ITEM_ANTIFLAG_SHOP_TRIPLE)))
{
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;
}

//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 (item->GetVnum() == 41005 || item->GetVnum() == 41006)
        {
            return SHOP_SUBHEADER_GC_END;
        }
    }

int iEmptyPos;
if (item->IsDragonSoul())
{
iEmptyPos = ch->GetEmptyDragonSoulInventory(item);
}
#ifdef ENABLE_SPLIT_INVENTORY_SYSTEM
else if (item->IsSkillBook())
{
iEmptyPos = ch->GetEmptySkillBookInventory(item->GetSize());
}
else if (item->IsUpgradeItem())
{
iEmptyPos = ch->GetEmptyUpgradeItemsInventory(item->GetSize());
}
else if (item->IsStone())
{
iEmptyPos = ch->GetEmptyStoneInventory(item->GetSize());
}
#endif
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);

if (item->GetAntiFlag() & ITEM_ANTIFLAG_SHOP_TRIPLE && !m_pkPC)
{
DWORD fiyat = r_item.price;
// SÉ
long ep = ch->Ep_Miktar();
if (ep < fiyat)
{
return YOK_2;
}
else
ch->Set_Ep(ch->Ep_Miktar()-fiyat);
}
else if (item->GetAntiFlag() & ITEM_ANTIFLAG_SHOP_SECONDARY && !m_pkPC)
{
DWORD fiyat = r_item.price;
// Run Pont
long ep = ch->Run_Pontok();
if (ep < fiyat)
{
return YOK_3;
}
else
ch->Run_Pont_adas(ch->Run_Pontok()-fiyat);
}
else
{
ch->PointChange(POINT_GOLD, -dwPrice, false);
#ifdef ENABLE_CHEQUE_SYSTEM
ch->PointChange(POINT_CHEQUE, -dwPriceCheque, false);
#endif
}

//세금 계산
DWORD dwTax = 0;
int iVal = 0;

if (LC_IsYMIR() ||  LC_IsKorea())
{
if (0 < (iVal = quest::CQuestManager::instance().GetEventFlag("trade_tax")))
{
if (iVal > 100)
iVal = 100;

dwTax = dwPrice * iVal / 100;
dwPrice = dwPrice - dwTax;
}
else
{
iVal = 0;
dwTax = dwPrice * iVal / 100;
dwPrice = dwPrice - dwTax;
}
}
else
{
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;
}
}

// 상점에서 살‹š 세금 5%
if (!m_pkPC)
{
CMonarch::instance().SendtoDBAddMoney(dwTax, ch->GetEmpire(), ch);
}

// 군주 시스템 : 세금 징수
if (m_pkPC)
{
m_pkPC->SyncQuickslot(QUICKSLOT_TYPE_ITEM, item->GetCell(), 1000);

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)
{
snprintf(buf, sizeof(buf), "%s FROM: %u TO: %u PRICE: %u", item->GetName(), ch->GetPlayerID(), m_pkPC->GetPlayerID(), dwPrice);
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));
#ifdef ENABLE_SPLIT_INVENTORY_SYSTEM
else if (item->IsSkillBook())
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
else if (item->IsUpgradeItem())
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
else if (item->IsStone())
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
#endif
else
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
ITEM_MANAGER::instance().FlushDelayedSave(item);


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);

if (m_pkPC != ch)
DBManager::instance().Query("INSERT INTO pazar_gecmis%s (name, alanname, vnum, gold, time) values('%s', '%s','%u','%u', now());", get_table_postfix(), m_pkPC->GetName(), ch->GetName(), item->GetVnum(),dwPrice);

}

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));
#ifdef ENABLE_SPLIT_INVENTORY_SYSTEM
else if (item->IsSkillBook())
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
else if (item->IsUpgradeItem())
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
else if (item->IsStone())
item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
#endif
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);
}

if (item)
sys_log(0, "SHOP: BUY: name %s %s(x %d):%u price %u", ch->GetName(), item->GetName(), item->GetCount(), item->GetID(), dwPrice);

    ch->Save();

    return (SHOP_SUBHEADER_GC_OK);
}


itt a teljes Buy függvény, megtudja valaki nézni, hogy hol van elrontva?

Üzenet összefésülés: 2018-08-23, 16:52:03

SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY

ezzel van a gond valahol..

Üzenet összefésülés: 2018-08-24, 06:58:01

Megoldva köszönöm K3zX
Az ember csak fiatalon találhat ki igazán új dolgokat. Utána már túl tapasztalt, túl híres (...) és túl ostoba.