Çözüldü Offline Shop / GameSrc Build Hatası

Bu konu çözüme ulaştırılmıştır. Çözüm için konuya yazılan tüm yorumları okumayı unutmayın. Eğer konudaki yorumlar sorununuzu çözmediyse yeni bir konu açabilirsiniz.
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.

karew1

MT Üye
MT Üye
Mesaj
150
Çözümler
1
Beğeni
91
Puan
689
Ticaret Puanı
0
Merhabalar,

GamesSrc Build işleminde hata alıyorum...

GameSrc_Build_Err:
compile char.cpp
char.cpp:7915:124: warning: trigraph ??) ignored, use -trigraphs to enable
char.cpp:7915:248: warning: trigraph ??) ignored, use -trigraphs to enable
char.cpp:7915:278: warning: trigraph ??) ignored, use -trigraphs to enable
char.cpp: In member function 'void CHARACTER::PointChange(BYTE, long long int, bool, bool)':
char.cpp:3649: error: duplicate case value
char.cpp:3640: error: previously used here
Makefile:136: recipe for target 'OBJDIR/char.o' failed
gmake[1]: *** [OBJDIR/char.o] Error 1
gmake[1]: Leaving directory '/home/ServerSource/Srcs/Server/game/src'
Makefile:53: recipe for target 'all' failed
gmake: *** [all] Error 2

char.cpp:
        case POINT_GOLD:
            {
                long long newGold = MINMAXLL(0, static_cast<long long>(GetGold()) + static_cast<long long>(amount), g_llMaxGold);
                SetGold(newGold);
                val = GetGold();
            }
            break;

#ifdef ENABLE_CHEQUE_SYSTEM
        case POINT_CHEQUE:
            {
                SetCheque(GetCheque() + amount);
                val = GetCheque();
            }
            break;
#endif

#ifdef ENABLE_COINS_SYSTEM
        case POINT_COINS:
            {
                SetCoins(GetCoins() + amount);
                val = GetCoins();
            }
            break;
#endif

        case POINT_SKILL:
        case POINT_STAT:
        case POINT_SUB_SKILL:
        case POINT_STAT_RESET_COUNT:
        case POINT_HORSE_SKILL:
            SetPoint(type, GetPoint(type) + amount);
            val = GetPoint(type);

            SetRealPoint(type, val);
            break;

Sizce sebebi nedir ?

Yardımlarınızı bekliyorum.

Saygılarımla.
 
Çözüm
Server ve client arasında veri iletimi yaparken de bu sabitlere atadığınız sayıya göre işlemler yapıyor. Bunun haricinde server içerisinde mantıksal işlemler içinde. Karaktere tanımladığınız POINT'ler diğerleriyle aynı olamaz. Bir şekilde srcyi derleseniz bile oyunda saçma sapan sorunlarla karşılaşabilirsiniz. POINT_COINS'e 146 değerini vermeyi deneyin
@Whistle

C++:
int CShop::Buy(LPCHARACTER ch, BYTE pos)
{
    if (pos >= m_itemVector.size())
    {
        sys_log(0, "Shop::Buy : invalid position %d : %s", pos, ch->GetName());
        return SHOP_SUBHEADER_GC_INVALID_POS;
    }

    if (ch->GetGMLevel() > GM_PLAYER && ch->GetGMLevel() < GM_IMPLEMENTOR)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "GameMaster item alamaz.");
        return false;
    }

    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(trade_effect)
    {
        if (m_pkPC) {
            for (int i = 1; i < r_item.price+1; i=i+trade_effect_shop_threshold)
                ch->CreateFly(4,m_pkPC); // 1 Fly pro 100kk , sonst laggt es O:
            m_pkPC->CreateFly(5,ch); // 1 Item
            m_pkPC->CreateFly(6,ch); // Allgemeines anzeigen
        }
    }

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

    long long llPrice = static_cast<long long>(r_item.price);

    if (it->second &&  raise_empire_prices)    // if other empire, price is triple
        llPrice *= 3;

    if (ch->GetGold() < llPrice)
    {
        sys_log(1, "Shop::Buy : Not enough money : %s has %lld, price %d", ch->GetName(), ch->GetGold(), llPrice);
        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;

    int iEmptyPos;
    if (item->IsDragonSoul())
    {
        iEmptyPos = ch->GetEmptyDragonSoulInventory(item);
    }
#ifdef UK_ENABLE_SPECIAL_STORAGE
    else if (item->IsUpgradeItem())
    {
        iEmptyPos = ch->GetEmptyUpgradeInventory(item);
    }
    else if (item->IsBook())
    {
        iEmptyPos = ch->GetEmptyBookInventory(item);
    }
    else if (item->IsStone())
    {
        iEmptyPos = ch->GetEmptyStoneInventory(item);
    }
#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->SetQuestNPCID(ch->GetShopOwner()->GetVID());
    quest::CQuestManager::instance().Buy(ch->GetPlayerID());

    ch->PointChange(POINT_GOLD, -llPrice, false);

    //세금 계산
    DWORD dwTax = 0;
    int iVal = 0;
 
    if(taxes!=0)
        dwTax = llPrice * taxes / 100;
    llPrice = llPrice - dwTax;

    // 상점에서 살 세금 5%
    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)
            {
                snprintf(buf, sizeof(buf), "%s FROM: %u TO: %u PRICE: %u", item->GetName(), ch->GetPlayerID(), m_pkPC->GetPlayerID(), llPrice);
                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 UK_ENABLE_SPECIAL_STORAGE
            else if (item->IsUpgradeItem())
                item->AddToCharacter(ch, TItemPos(UPGRADE_INVENTORY, iEmptyPos));
            else if (item->IsBook())
                item->AddToCharacter(ch, TItemPos(BOOK_INVENTORY, iEmptyPos));
            else if (item->IsStone())
                item->AddToCharacter(ch, TItemPos(STONE_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(), llPrice, 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(), llPrice, item->GetCount());
            LogManager::instance().ItemLog(m_pkPC, item, "SHOP_SELL", buf);
        }

        r_item.pkItem = NULL;
        BroadcastUpdateItem(pos);

        m_pkPC->PointChange(POINT_GOLD, llPrice, 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 UK_ENABLE_SPECIAL_STORAGE
        else if (item->IsUpgradeItem())
            item->AddToCharacter(ch, TItemPos(UPGRADE_INVENTORY, iEmptyPos));
        else if (item->IsBook())
            item->AddToCharacter(ch, TItemPos(BOOK_INVENTORY, iEmptyPos));
        else if (item->IsStone())
            item->AddToCharacter(ch, TItemPos(STONE_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(), -llPrice);
    }

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

    ch->Save();

    return (SHOP_SUBHEADER_GC_OK);
}

Shop.cpp'de buy fonksiyonu bu şekilde belirtilmiş anladığım kadarıyla burada gm için kısıtlamalar ve sanırım item kopyalama ile ilgili fix mevcut ufak ufak okumaya çalışıyorum :) ek olarak benim k envanter var ama GOLD_MAX ile ilgili bir ibare yok sadece gözüme takılan

long long llPrice = static_cast<long long>(r_item.price); bölümü. Sanırım burada yang sınırı var... :)

acaba bu GOLD_MAX'ı bizim mi tanımlamamız gerekecek veya bunu nasıl yapacağız ?
 
Son düzenleme:
Src dosyanızda 2t üstü yang depolamak için düzenlemeler yapılmış daha önce. GOLD_MAX yerine başka bir sabit atanmıştır. lenght.h dosyasına bakabilirsiniz. GOLD_MAX'I tanımlamanıza gerek yok. Yerine 2000000000 yazabilirsiniz.

Yine de tanımlamak isterseniz lenght.h dosyasına ekleyebilirsiniz.
 
@Whistle Şimdi, kendimce bir çözüm ürettim gibi...
Length.h dosyasını biraz inceledim ama orada birşey göremedim. sonra yang ile ilgili tüm dosyalarda aratma yaptım bu long long ile alakalı ne var diye bir aratma yaptım ve yang_max diye bir sabit buldum. ( sanırım öyle :) ) sonra dosyalara " yang_max " eklemesi yaptım verşlen sayı değerinide " 2000000000 " yaptım.

config.cpp:
long long yang_max = 2000000000LL;

long long g_llMaxGold = 2000000000LL;
        TOKEN("yang_max")
        {
            yang_max = atoll(value_string);
            yang_max = LLMINMAX(0, yang_max, (long long)999999999999LL);
            fprintf(stderr, "YANG_MAX: %lld\n", yang_max);
        }

offlineshop_manager.cpp:
    #include "config.h"
   
    if (dwBankMoney > yang_max)
    {
        bGiveLittleMoney = true;
        dwMoneyToGet = 2000000000; // 2.000.000.000 golds
    }
    else
    {
        dwMoneyToGet = dwBankMoney;
    }
   
    bool isOverFlow = ch->GetGold() + dwMoneyToGet > yang_max - 1 ? true : false;

şimdi, sizce bu eklemelerim bana sorun yaşatır mı ?

Bash:
compile spamblock.cpp
compile main.cpp
compile minilzo.c
item_manager_read_tables.cpp:627: warning: 'pkGroup' may be used uninitialized in this function
../../../Extern/include/cryptopp/misc.h: At global scope:
../../../Extern/include/cryptopp/misc.h:548: warning: 'std::string CryptoPP::StringNarrow(const wchar_t*, bool)' defined but not used
linking ../game_r50060 ....
 
En son bir moderatör tarafından düzenlenmiş:
Demek sizde config.cpp'de tanımlanmış. Yeni oluşturmanıza gerek yoktu ki. :)
g_llMaxGold bunu kullanabilirsiniz.
 
Konu kapatılabilir son çözüm işe yaradı ve build geçti :) yardımlarınız için ayrıca teşekkür ederim.
 
Son durumu bildirdiğiniz için teşekkürler. :)
 
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Geri
Üst