noisiv 1
noisiv
Manwe Work 1
Manwe Work
mavzermete 1
mavzermete
Mt2Hizmet 1
Mt2Hizmet
Reklam vermek için turkmmo@gmail.com

[PyLUA++] Ticaret Evi (Tradehouse)

Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...
Genel Bakış

Sistem bonus resimler içermiyor. Yani birebir Metin2 oyunuyla aynı grafikler kullanılmış..

ss2015-08-19at02.25.47.jpg

Burada neyi görüyoruz?
  • Sol tarafta mevcut menüleri bulabiliriz. Öğeler gruplara ayrılmıştır. Eşyalardan sonra, ürünlerimizi yönetebileceğimiz 3 grup var. Daha sonra 2 tane daha fonksiyon, arama ve satış fonksiyonlarını bulabilirsiniz.
  • Ortadaki eşyaları bulabiliriz. Fareyi öğenin resminde tutarsak, bonuslarını / taşlarını görebilirdik. Sağ taraftaki size (ve altın / DC metinleri) sadece bu fiyatın tanımlanması durumunda görüntülenir.
  • Gösterilen altın sistemde saklanır ve değeri oyuncunun envanterinden elde edilen değere eşit değildir.
  • Satın alma işleminiz başarılı olursa, satın alınan öğe "satın alma" grubuna yerleştirilir ve öğenizi orada talep edebilirsiniz. Ürünün fiyatı, ticari hesabınızın faturasından kaldırılacak ve sahibin hesabına yansıtılacaktır.

ss2015-08-19at02.42.06.png

Yukarıdaki resimde neyi görüyoruz?

  • Eğer "Görüntüle" düğmesine tıklarsanız (eğer gösteriliyorsa), sahibinin talebini göreceksiniz.
  • Seçtiğiniz öğeyi başka bir öğe (ler) için satın almak isterseniz, sahibinin "hayalini" gerçekleştirmeniz gerekir. Öğeleri yalnızca "sahiplerin listesi" ndeki doğru kılavuza çekebilirsiniz.
  • Sahibinin talebini yerine getirdiyseniz "Satın al" düğmesi artacaktır. (Tüm koşullar sağlandığında tek tıklanabilir.)
  • Eşyalarını nereye koyduğun önemli değil.
  • Öğenizin bonus değeri sahibinin listesindeki aynı öğe ile aynı veya daha yüksekse, öğeniz kabul edilir.
  • Öğenizin sahibinin listesinde aynı öğeden daha fazla bonus varsa, ancak diğer bonuslar uygunsa, öğeniz kabul edilir.
  • Ürününüzün sayısı, sahibinin ürün sayısından herhangi birine uymuyorsa, öğeniz kabul edilmeyecektir.
  • Öğeyi zaten listede bulunan doğru ızgaraya çekmek isterseniz, tekrar kabul edilmeyecektir.
  • Etkilenen eşyalarınızı envanterinize taşırsanız veya ticaret sırasında miktarlarını değiştirirseniz, ticaret başarısız olur.
  • Ticaret başarılı bir şekilde bitirilirse, satın alınan kalem "alımlar" grubuna yerleştirilir ve asıl sahibi, "Eşyadan ürün al" grubunda kendi eşyalarını / mallarını talep edebilir.
ss2015-08-19at03.16.31.jpg

Resimde neyi görüyoruz?

  • Burada ürününüzün satışını yapabilirsiniz. En az bir fiyat tanımlamanız gerekir.
  • Nesnenin bonusları pencerenin ortasında görüntülenir.
  • Saklanabilir ürün satıyorsanız, oyuncular ne kadar satın almak istediklerini seçebilirler. "Ticaret fiyatını" tanımlarsanız, ne kadar satın almak istediklerini seçemezler (yalnızca tüm yığını satın alabilirler)
ss2015-08-19at03.39.40.jpg

Yukarıdaki resimde neyi görüyoruz?

  • "Ticaret yap" düğmesine tıklarsanız, ticareti ayarlayabilirsiniz.
  • Öncelikle, öğenin tam adını girmelisiniz. (büyük / küçük harfe duyarlı değildir)
  • Öğenin adı yoksa veya sunucunun item_proto tablosunda birden fazla eşleşme varsa, bir hata iletisini geri gönderir.
  • Öğe istiflenebilirse, bir giriş kutusu görünür.
  • Eğer öğe bir "giyilebilir eşya" ise (örneğin silah, zırh, vb.) "Set bonusları" butonu görünecektir. Ayrıca, yuvaya prizler kurabiliyorsanız, soket düğmeleri görünecektir.
  • "Uygula" düğmesine basarsanız, öğeleriniz geçici olarak kaydedilir. Ticaret penceresini tekrar açarsanız, kaydedilen durumunu göreceksiniz. Öğeleri silerseniz ancak uygulama düğmesine basmazsanız, değişiklikler geçerli olmaz.
ss2015-08-19at03.49.36.jpg

Resimde neyi görüyoruz?

  • Burada diğer oyuncunun eşyalarını arayabilirsiniz. Metnin dediği gibi, en az bir alanı doldurmalısınız.
  • Sahibinin adını doğru girmelisiniz. (harfe duyarlı)
  • Tüm ürün adını girmek zorunda değilsiniz, ancak en az 2 karakter girmelisiniz. (büyük küçük harf duyarlı değil)
ss2015-08-19at04.05.54.jpg

Resimde neyi görüyoruz?

  • Burada mevcut dilleri görebilirsiniz. Şimdi sadece 2 dil var, ancak bunu dilinize çevirebilir (ve dilerseniz), beni bulun ve yeni bir lang için hazırlamanıza yardım edeceğim. (ve tabiki isminizle burada paylaşacağım)
  • Dili değiştirirseniz, tüm pencere (sadece ticaret merkezinin) kapanacak ve yeni lang ile yeniden açılacaktır.
  • Bu dil değişiklikleri, ürün isimleri ve bonus isimleri üzerinde etkili olmayacaktır! (Müşterinin diline göre değişir.
Biraz zamanınız var ise aşağıdaki videoyu da izlemelisiniz:



Nasıl Kurulur?

Öncelikle indir;

İndirme Linki



Virus Total:

VirusTotal-Logo.png

İndirdikten sonra aç. Ardından client source/pack.h aç.

Bunu bul ve düzenle:

Kod:
QUEST_INPUT_STRING_MAX_NUM = 120,

Client ile işimiz bitti.

Server source/game/packet.h aç ve düzenle:

Kod:
typedef struct command_quest_input_string
{
    BYTE header;
    char msg[120+1];
} TPacketCGQuestInputString;

Ardından input_main.cpp dosyasını düzenleyin: (tüm işlevi değiştirin)

Kod:
void CInputMain::QuestInputString(LPCHARACTER ch, const void* c_pData)
{
    TPacketCGQuestInputString * p = (TPacketCGQuestInputString*) c_pData;

    char msg[121];
    strlcpy(msg, p->msg, sizeof(msg));
    sys_log(0, "QUEST InputString pid %u msg %s", ch->GetPlayerID(), msg);

    quest::CQuestManager::Instance().Input(ch->GetPlayerID(), msg);
}

Daha sonra questlua_game.cpp dosyasını açın (Eğer source game.mysql_query fonksiyonuna sahipseniz bunu yapmanıza gerek yoktur.)
ve dosyanın üst kısmındaki içerden sonra şunu ekleyin:


C++:
#include "db.h"

Ardından bu işlevin üstüne ekleyin:

C++:
void RegisterGameFunctionTable ()

C++:
int game_mysql_query(lua_State* L)
    {
        //MYSQL_FIELD *field;
        SQLMsg* run = DBManager::instance().DirectQuery(lua_tostring(L,1));
        MYSQL_RES* res=run->Get()->pSQLResult;
        if (!res){
            lua_pushnumber(L, 0);
            return 0;
        }
        MYSQL_ROW row;
        lua_newtable(L);    
        int rowcount = 1;
        while((row = mysql_fetch_row(res))){
            lua_newtable(L);
            lua_pushnumber(L, rowcount);
            lua_pushvalue(L, -2);
            lua_settable(L, -4);
            unsigned int fields = mysql_num_fields(res);
            for(unsigned int i = 0; i < fields; i++){
                lua_pushnumber(L, i + 1);
                lua_pushstring(L, row[i]);
                lua_settable(L, -3);
            }
            lua_pop(L, 1);
            rowcount++;
        }
        return 1;
    }

Sonra bu kodu boşluğa ekleyin: ( void RegisterGameFunctionTable() under this: { "open_web_mall", game_web_mall }, )

C++:
{"mysql_query", game_mysql_query},

Sonra questlua_item.cpp açın ve bu işlevleri bundan önce ekleyin: ( void RegisterITEMFunctionTable() )

C++:
int item_get_attr_value(lua_State* L)
    {
        CQuestManager& q = CQuestManager::instance();
        LPITEM item = q.GetCurrentItem();

        if (!item)
        {
            sys_err("cannot get current item");
            lua_pushnumber(L, 0);
            return 1;
        }

        if (false == lua_isnumber(L, 1))
        {
            sys_err("index is not a number");
            lua_pushnumber(L, 0);
            return 1;
        }

        int index = lua_tonumber(L, 1);
        const TPlayerItemAttribute& attrItem = item->GetAttribute(index);

        lua_pushnumber(L, attrItem.sValue);

        return 1;
    }

    int item_get_attr_type(lua_State* L)
    {
        CQuestManager& q = CQuestManager::instance();
        LPITEM item = q.GetCurrentItem();

        if (!item)
        {
            sys_err("cannot get current item");
            lua_pushnumber(L, 0);
            return 1;
        }

        if (false == lua_isnumber(L, 1))
        {
            sys_err("index is not a number");
            lua_pushnumber(L, 0);
            return 1;
        }

        int index = lua_tonumber(L, 1);
        const TPlayerItemAttribute& attrItem = item->GetAttribute(index);

        lua_pushnumber(L, attrItem.bType);

        return 1;
    }

Ardından bunu bundan sonra ekleyin: { "copy_and_give_before_remove", item_copy_and_give_before_remove},

C++:
{ "get_attr_type", item_get_attr_type },
            { "get_attr_value", item_get_attr_value },

Daha sonra questlua_pc.cpp dosyasını açın ve bu yeni işlevi bunun üzerine ekleyin: void RegisterPCFunctionTable()

C++:
int pc_give_item_with(lua_State* L)
    {
        if (lua_gettop(L) != 19)
        {
            lua_pushboolean(L, false);
            return 1;
        }

        LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();

        if (!ch)
        {
            sys_err("Char not found (give item with)");
            lua_pushboolean(L, false);
            return 1;
        }

        if (!lua_isstring(L, 1) && !lua_isnumber(L, 1))
        {
            sys_err("QUEST Make item call error : wrong argument");
            lua_pushboolean(L, false);
            return 1;
        }

        DWORD dwVnum;

        if (lua_isnumber(L, 1)) // ąřČŁŔΰćżě ąřČŁ·Î ÁŘ´Ů.
        {
            dwVnum = (int)lua_tonumber(L, 1);
        }
        else if (!ITEM_MANAGER::instance().GetVnum(lua_tostring(L, 1), dwVnum))
        {
            sys_err("QUEST Make item call error : wrong item name : %s", lua_tostring(L, 1));
            lua_pushboolean(L, false);
            return 1;
        }

        int icount = 1;
        if (lua_isnumber(L, 2) && lua_tonumber(L, 2)>0)
        {
            icount = (int)rint(lua_tonumber(L, 2));
            if (icount <= 0)
            {
                sys_err("QUEST Make item call error : wrong item count : %g", lua_tonumber(L, 2));
                lua_pushboolean(L, false);
                return 1;
            }
        }

        LPITEM item = ch->AutoGiveItem(dwVnum, icount);

        if (NULL != item)
        {
            int attr1;
            int value1;
            int attr2;
            int value2;
            int attr3;
            int value3;
            int attr4;
            int value4;
            int attr5;
            int value5;
            int attr6;
            int value6;
            int attr7;
            int value7;
            int socket1;
            int socket2;
            int socket3;

            if (lua_isnumber(L, 3) && lua_isnumber(L, 4) && lua_isnumber(L, 5) && lua_isnumber(L, 6) && lua_isnumber(L, 7) && lua_isnumber(L, 8) && lua_isnumber(L, 9) && lua_isnumber(L, 10) && lua_isnumber(L, 11) && lua_isnumber(L, 12) && lua_isnumber(L, 13) && lua_isnumber(L, 14) && lua_isnumber(L, 15) && lua_isnumber(L, 16) && lua_isnumber(L, 17) && lua_isnumber(L, 18) && lua_isnumber(L, 19))
            {
                attr1 = (int)lua_tonumber(L, 3);
                value1 = (int)lua_tonumber(L, 4);

                attr2 = (int)lua_tonumber(L, 5);
                value2 = (int)lua_tonumber(L, 6);

                attr3 = (int)lua_tonumber(L, 7);
                value3 = (int)lua_tonumber(L, 8);

                attr4 = (int)lua_tonumber(L, 9);
                value4 = (int)lua_tonumber(L, 10);

                attr5 = (int)lua_tonumber(L, 11);
                value5 = (int)lua_tonumber(L, 12);

                attr6 = (int)lua_tonumber(L, 13);
                value6 = (int)lua_tonumber(L, 14);

                attr7 = (int)lua_tonumber(L, 15);
                value7 = (int)lua_tonumber(L, 16);

                socket1 = (int)lua_tonumber(L, 17);
                socket2 = (int)lua_tonumber(L, 18);
                socket3 = (int)lua_tonumber(L, 19);


                item->SetForceAttribute(0, attr1, value1);
                item->SetForceAttribute(1, attr2, value2);
                item->SetForceAttribute(2, attr3, value3);
                item->SetForceAttribute(3, attr4, value4);
                item->SetForceAttribute(4, attr5, value5);
                item->SetForceAttribute(5, attr6, value6);
                item->SetForceAttribute(6, attr7, value7);

                item->SetSocket(0, socket1);
                item->SetSocket(1, socket2);
                item->SetSocket(2, socket3);

                lua_pushboolean(L, true);
                return 1;
            }

            lua_pushboolean(L, false);
            return 1;
        }
        lua_pushboolean(L, false);
        return 1;
    }

Ve sonra bunu önüne ekleyin: { NULL, NULL }

C++:
{ "give_item_with", pc_give_item_with },

Şimdi source ile işimiz bitti. Questlib.lua dosyasını açın ve bunu bir yere yazın:

C++:
os.setlocale("fr_FR.ISO8859-1","ctype")
dofile(get_locale_base_path().."/quest/igshop_settings.lua")
dofile(get_locale_base_path().."/quest/igshop.lua")

Eğer gerekirse "dofile" leri düzenleyin. Os.setlocale gereklidir, çünkü eğer onu ayarlamazsak, string.lower () LUA fonksiyonu bazı karakterlerle çalışmayacaktır (örneğin, lanÉÁÍ (Macarca lang)). HU dili veya bu os.setlocale ve bunlara ihtiyacınız olmadığından emin olmanız yeterlidir (mb_igshop_source.quest dosyasında başka bir tane bulabilirsiniz).

Bundan sonra tüm dosyaları (igshop dizini dahil) serveride dir'den görev klasörünüze kopyalayın.

Daha sonra igshop_settings.lua dosyasını açın ve igshop_path değişkenini düzenleyin (igshop dizinine işaret etmelidir!)

Bundan sonra mb_igshop_source.quest komutunu deneyin. Eğer eksik fonksiyonlar çalıştırıyorsanız, bunları kopyalayıp quest_functions dosyanıza yapıştırın.

Tamam, buraya kadar bir sorun olmadıysa client taraflı işimiz bitti. Kök (unpack) dosyalarımızı açın, igshop.py ve igshop_lang.py dosyalarını clientide dizininden kopyalayın ve kök (unpack) dosyalarımıza ekleyin.

Sonra game.py'yi açın ve yazın:

C++:
import igshop

Dosyanın en üstüne

Bunu bulduktan sonra:

C++:
class GameWindow(ui.ScriptWindow):
    def __init__(self, stream):

Daha sonra bunu __init__ işlevine ekleyin:

C++:
## Ingame Shop
        self.InGameShop = None
        ## Ingame Shop END

Ardından şunu arayın:

C++:
def Close(self):

ve şunu ekleyin:

C++:
if self.InGameShop != None:
            self.InGameShop.Close()

        ## Ingame Shop
        self.InGameShop = None
        ## Ingame Shop END

Ardından şunu arayın:

C++:
def __ServerCommand_Build(self):
        serverCommandList={

ve bunu listeye ekleyin:

C++:
##Ingame Shop
            "IGShopqID"                    : self._IGShopqID,
            "IGSHOP"                    : self._IGShopCMD,
            "IGShop_ITEMS"                : self._IGShopItems,
            "IGShop_BOUGHTITEMS"        : self._IGShopBoughtItems,
            "IGShop_MYSALES"            : self._IGShopMyItems,
            "IGSHOP_ADDTOTEMPSLOT"        : self._AddItemSlot,
            "trade.ReturnSearchItem"    : self._IGShopReturnSearchItem,
            "trade.ApplySocket"            : self._IGShopApplySocket,
            "trade.SendData"             : self._IGShopAppendTradeDiagItem,
            "trade.GetTradeItems"        : self._IGShopGetTradeItem,
            "trade.AppendGetItem"        : self._IGShopAppendGetItem,
            ##End of Ingame Shop
            #InputBlock
            "inputblock"            : self.__InputBlock,
            "inputblockend"            : self.__InputBlockEnd,
            ##End of InputBlock

Sonra bu fonksiyonu arayın:

C++:
def OpenQuestWindow(self, skin, idx):

ve bunu doğrudan işlevin tanımı altında ekleyin !!!:

C++:
if constInfo.INPUT_IGNORE == 1:
            return

Ardından, dosyanın düğmesine ilerleyin ve bu işlevleri ekleyin:

C++:
#InputBlock

    def __InputBlock(self):
        constInfo.INPUT_IGNORE = 1
 
    def __InputBlockEnd(self):
        constInfo.INPUT_IGNORE = 0

    ##End of InputBlock

    ## Ingame Shop
    def _IGShopqID(self, qID):
        constInfo.IGShop["qID"] = int(qID)
 
    def _IngameShopQuestCMD(self):
        net.SendQuestInputStringPacket(str(constInfo.IGShop["questCMD"]))
        constInfo.IGShop["questCMD"] = "NULL#"
 
    def _IGShopCMD(self, command):
        cmd = command.split("/")
 
        if cmd[0] == "QUESTCMD":
            self._IngameShopQuestCMD()

        elif cmd[0] == "OPEN":
            if self.InGameShop == None:
                enableTradeSys = False
                if int(cmd[2]) == 1:
                    enableTradeSys = True
                self.InGameShop = igshop.IngameShop(enableTradeSys, int(cmd[3])-1)
            tradeSys = 0
            if self.InGameShop.enableTradeSys:
                tradeSys = 1
            if tradeSys != int(cmd[2]) or int(cmd[3])-1 != self.InGameShop.lang:
                del self.InGameShop
                enableTradeSys = False
                if int(cmd[2]) == 1:
                    enableTradeSys = True
                self.InGameShop = igshop.IngameShop(enableTradeSys, int(cmd[3])-1)
            if not self.InGameShop.IsShow():
                self.InGameShop.SetSE(int(cmd[1]))
                self.InGameShop.Show()
     
        elif cmd[0] == "MANAGEPAGES":
            self.InGameShop.ManagePageButtons(int(cmd[1]), int(cmd[2]))
     
        elif cmd[0] == "SETCASH":
            self.InGameShop.SetSE(cmd[1])
     
        elif cmd[0] == "SETGOLD":
            self.InGameShop.SetGold(cmd[1])
 
        elif cmd[0] == "REFRESHAFTERBUY":
            self.InGameShop.Refresh_func()
     
        elif cmd[0] == "EMPTYINPUTGOLD":
            self.InGameShop.GetMoney.SetText("0")

        elif cmd[0] == "trade.ApplyWantsItem":
            self.InGameShop.sellTradeDiag.RecvAppendItemCommand()

        elif cmd[0] == "recvSuccessSaleItem":
            self.InGameShop.RecvFinisSale()
            if self.InGameShop.enableTradeSys:
                self.InGameShop.sellTradeDiag.Close(2)

        elif cmd[0] == "OpenTradeDiag":
            if self.InGameShop.enableTradeSys:
                self.InGameShop.tradeDiag.Open()

        elif cmd[0] == "RecvTradeError":
            if self.InGameShop.enableTradeSys:
                self.InGameShop.tradeDiag.representedSlots.remove(int(cmd[2]))
                self.InGameShop.tradeDiag.applyedSlots.pop(int(cmd[1]))

        elif cmd[0] == "SecondFail":
            if self.InGameShop.enableTradeSys:
                self.InGameShop.tradeDiag.representedSlots.remove(int(cmd[1]))

                for i in self.InGameShop.tradeDiag.applyedSlots:
                    if i[0] == int(cmd[2]):
                        self.InGameShop.tradeDiag.applyedSlots.remove(i)
                        break

                for i in self.InGameShop.tradeDiag.applyedSlots:
                    if i[0] == int(cmd[1]):
                        i[0] = int(cmd[2])
                        break

        elif cmd[0] == "SuccessAppend":
            if self.InGameShop.enableTradeSys:
                self.InGameShop.tradeDiag.SuccessAppend(int(cmd[1]))
        elif cmd[0] == "OpenGetDialog":
            if self.InGameShop.enableTradeSys:
                isPreview = False
                if int(cmd[4]) == 1:
                    isPreview = True
                self.InGameShop.getTradeDiag.Open(int(cmd[1]), int(cmd[2]), int(cmd[3]), isPreview)
     
    def _IGShopItems(self, slot, mID, vnum, count, owner_name, price_se, price_yang, socket0, socket1, socket2, socket3, socket4, socket5, attrtype0,attrvalue0, attrtype1,attrvalue1, attrtype2, attrvalue2, attrtype3, attrvalue3, attrtype4, attrvalue4, attrtype5, attrvalue5, attrtype6, attrvalue6, istate, isTradeItem):
        item.SelectItem(int(vnum))
        constInfo.IGShop["slot"+slot]["socket"] = [int(socket0), int(socket1), int(socket2), int(socket3), int(socket4), int(socket5)]
        constInfo.IGShop["slot"+slot]["attr"] = [(int(attrtype0),int(attrvalue0)), (int(attrtype1),int(attrvalue1)), (int(attrtype2), int(attrvalue2)), (int(attrtype3), int(attrvalue3)), (int(attrtype4), int(attrvalue4)), (int(attrtype5), int(attrvalue5)), (int(attrtype6), int(attrvalue6))]
        constInfo.IGShop["vnum"+slot] = int(vnum)
        self.InGameShop.AddItem(int(slot), long(mID), int(vnum), item.GetItemName(), count, owner_name, price_se, price_yang, int(isTradeItem))
 
    def _IGShopBoughtItems(self, slot, mID, vnum, count, owner_name, price_se, price_yang, socket0, socket1, socket2, socket3, socket4, socket5, attrtype0,attrvalue0, attrtype1,attrvalue1, attrtype2, attrvalue2, attrtype3, attrvalue3, attrtype4, attrvalue4, attrtype5, attrvalue5, attrtype6, attrvalue6, istate, isTradeItem):
        item.SelectItem(int(vnum))
        constInfo.IGShop["slot"+slot]["socket"] = [int(socket0), int(socket1), int(socket2), int(socket3), int(socket4), int(socket5)]
        constInfo.IGShop["slot"+slot]["attr"] = [(int(attrtype0),int(attrvalue0)), (int(attrtype1),int(attrvalue1)), (int(attrtype2), int(attrvalue2)), (int(attrtype3), int(attrvalue3)), (int(attrtype4), int(attrvalue4)), (int(attrtype5), int(attrvalue5)), (int(attrtype6), int(attrvalue6))]
        constInfo.IGShop["vnum"+slot] = int(vnum)
        self.InGameShop.AddItemToBoughtItems(int(slot), long(mID), int(vnum), item.GetItemName(), count, owner_name, int(isTradeItem))
 
    def _IGShopMyItems(self, slot, mID, vnum, count, owner_name, price_se, price_yang, socket0, socket1, socket2, socket3, socket4, socket5, attrtype0,attrvalue0, attrtype1,attrvalue1, attrtype2, attrvalue2, attrtype3, attrvalue3, attrtype4, attrvalue4, attrtype5, attrvalue5, attrtype6, attrvalue6, istate, isTradeItem):
        item.SelectItem(int(vnum))
        constInfo.IGShop["slot"+slot]["socket"] = [int(socket0), int(socket1), int(socket2), int(socket3), int(socket4), int(socket5)]
        constInfo.IGShop["slot"+slot]["attr"] = [(int(attrtype0),int(attrvalue0)), (int(attrtype1),int(attrvalue1)), (int(attrtype2), int(attrvalue2)), (int(attrtype3), int(attrvalue3)), (int(attrtype4), int(attrvalue4)), (int(attrtype5), int(attrvalue5)), (int(attrtype6), int(attrvalue6))]
        constInfo.IGShop["vnum"+slot] = int(vnum)
        self.InGameShop.AddItemToMyItems(int(slot), long(mID), int(vnum), item.GetItemName(), count, long(istate), int(isTradeItem))
 
    def _AddItemSlot(self, slot ,itemVnum, count, socket0, socket1, socket2, socket3, socket4, socket5, attrtype0,attrvalue0, attrtype1,attrvalue1, attrtype2, attrvalue2, attrtype3, attrvalue3, attrtype4, attrvalue4, attrtype5, attrvalue5, attrtype6, attrvalue6):
        self.InGameShop.itembs["socket"] = [int(socket0), int(socket1), int(socket2), int(socket3), int(socket4), int(socket5)]
        self.InGameShop.itembs["attr"] = [(int(attrtype0),int(attrvalue0)), (int(attrtype1),int(attrvalue1)), (int(attrtype2), int(attrvalue2)), (int(attrtype3), int(attrvalue3)), (int(attrtype4), int(attrvalue4)), (int(attrtype5), int(attrvalue5)), (int(attrtype6), int(attrvalue6))]
        self.InGameShop.vnumb = int(itemVnum)
        self.InGameShop.countb = int(count)
        self.InGameShop.Slots.ClearSlot(1)
        self.InGameShop.Slots.ClearSlot(2)
        self.InGameShop.Slots.ClearSlot(3)
        if int(count) == 1:
            count = 0
        self.InGameShop.Slots.SetItemSlot(int(slot), int(itemVnum), int(count))
        self.InGameShop.Slots.RefreshSlot()
        self.InGameShop.ShowForSell()
        self.InGameShop.SetBuypageTexts()

    def _IGShopReturnSearchItem(self, itemVnum, slot, isStackable, addOnType, maxSocket):
        if int(isStackable) > 0:
            isStackable = True
        else:
            isStackable = False
        self.InGameShop.sellTradeDiag.SetSearchSlots(int(itemVnum), int(slot), isStackable, int(addOnType), int(maxSocket))

    def _IGShopApplySocket(self, pos, vnum):
        self.InGameShop.sellTradeDiag.ApplySocket(int(pos), int(vnum))

    def _IGShopAppendTradeDiagItem(self, pos, vnum, count, socket1, socket2, socket3, attrtype1, attrvalue1, attrtype2, attrvalue2, attrtype3, attrvalue3, attrtype4, attrvalue4, attrtype5, attrvalue5, attrtype6, attrvalue6, attrtype7, attrvalue7):
        self.InGameShop.tradeDiag.AppendWantsItem(int(pos), int(vnum), int(count), [int(socket1), int(socket2), int(socket3)], [[int(attrtype1), int(attrvalue1)], [int(attrtype2), int(attrvalue2)], [int(attrtype3), int(attrvalue3)], [int(attrtype4), int(attrvalue4)], [int(attrtype5), int(attrvalue5)], [int(attrtype6), int(attrvalue6)], [int(attrtype7), int(attrvalue7)]])

    def _IGShopGetTradeItem(self, slot, itemID, vnum, count, buyer_name, socket0, socket1, socket2, socket3, socket4, socket5, attrtype0,attrvalue0, attrtype1,attrvalue1, attrtype2, attrvalue2, attrtype3, attrvalue3, attrtype4, attrvalue4, attrtype5, attrvalue5, attrtype6, attrvalue6):
        item.SelectItem(int(vnum))
        constInfo.IGShop["slot"+slot]["socket"] = [int(socket0), int(socket1), int(socket2), int(socket3), int(socket4), int(socket5)]
        constInfo.IGShop["slot"+slot]["attr"] = [(int(attrtype0),int(attrvalue0)), (int(attrtype1),int(attrvalue1)), (int(attrtype2), int(attrvalue2)), (int(attrtype3), int(attrvalue3)), (int(attrtype4), int(attrvalue4)), (int(attrtype5), int(attrvalue5)), (int(attrtype6), int(attrvalue6))]
        constInfo.IGShop["vnum"+slot] = int(vnum)
        self.InGameShop.AddItemToTradeItem(int(slot), int(vnum), int(count), buyer_name, long(itemID))

    def _IGShopAppendGetItem(self, pos, vnum, count, socket1, socket2, socket3, attrtype1, attrvalue1, attrtype2, attrvalue2, attrtype3, attrvalue3, attrtype4, attrvalue4, attrtype5, attrvalue5, attrtype6, attrvalue6, attrtype7, attrvalue7):
        self.InGameShop.getTradeDiag.AppendItem(int(pos), int(vnum), int(count), [int(socket1), int(socket2), int(socket3)], [[int(attrtype1), int(attrvalue1)], [int(attrtype2), int(attrvalue2)], [int(attrtype3), int(attrvalue3)], [int(attrtype4), int(attrvalue4)], [int(attrtype5), int(attrvalue5)], [int(attrtype6), int(attrvalue6)], [int(attrtype7), int(attrvalue7)]])
    ## Ingame Shop END

Bundan sonra ui.py dosyasını açın ve bu "yeni" sınıfı dosyaya ekleyin:

C++:
class IgShopListBox(Window):

    TEMPORARY_PLACE = 3

    def __init__(self, layer = "UI", isIgShop = False):
        Window.__init__(self, layer)
        self.isIgShop = isIgShop
        self.overLine = -1
        self.selectedLine = -1
        self.width = 0
        self.height = 0
        self.stepSize = 17
        self.basePos = 0
        self.showLineCount = 0
        self.itemCenterAlign = True
        self.itemList = []
        self.keyDict = {}
        self.textDict = {}
        self.event = lambda *arg: None
    def __del__(self):
        Window.__del__(self)

    def GetSelectedItemText(self):
        return self.textDict.get(self.selectedLine, "")

    def SetWidth(self, width):
        self.SetSize(width, self.height)

    def SetSize(self, width, height):
        Window.SetSize(self, width, height)
        self.width = width
        self.height = height

    def SetTextCenterAlign(self, flag):
        self.itemCenterAlign = flag

    def SetBasePos(self, pos):
        self.basePos = pos
        self._LocateItem()

    def ClearItem(self):
        self.keyDict = {}
        self.textDict = {}
        self.itemList = []
        self.overLine = -1
        self.selectedLine = -1

    def InsertItem(self, number, text):
        self.keyDict[len(self.itemList)] = number
        self.textDict[len(self.itemList)] = text

        textLine = TextLine()
        textLine.SetParent(self)
        textLine.SetText(text)
        textLine.Show()

        if self.itemCenterAlign:
            textLine.SetWindowHorizontalAlignCenter()
            textLine.SetHorizontalAlignCenter()

        self.itemList.append(textLine)

        self._LocateItem()

    def ChangeItem(self, number, text):
        for key, value in self.keyDict.items():
            if value == number:
                self.textDict[key] = text

                if number < len(self.itemList):
                    self.itemList[key].SetText(text)

                return

    def LocateItem(self):
        self._LocateItem()

    def _LocateItem(self):

        skipCount = self.basePos
        yPos = 0
        self.showLineCount = 0

        for textLine in self.itemList:
            textLine.Hide()

            if skipCount > 0:
                skipCount -= 1
                continue

            if localeInfo.IsARABIC():
                w, h = textLine.GetTextSize()
                textLine.SetPosition(w+10, yPos + 3)
            else:
                textLine.SetPosition(0, yPos + 3)

            yPos += self.stepSize

            if yPos <= self.GetHeight():
                self.showLineCount += 1
                textLine.Show()

    def ArrangeItem(self):
        self.SetSize(self.width, len(self.itemList) * self.stepSize)
        self._LocateItem()

    def GetViewItemCount(self):
        return int(self.GetHeight() / self.stepSize)

    def GetItemCount(self):
        return len(self.itemList)

    def SetEvent(self, event):
        self.event = event

    def SelectItem(self, line):

        if not self.keyDict.has_key(line):
            return

        if line == self.selectedLine:
            return

        self.selectedLine = line
        self.event(self.keyDict.get(line, 0), self.textDict.get(line, "None"))

    def GetSelectedItem(self):
        return self.keyDict.get(self.selectedLine, 0)

    def OnMouseLeftButtonDown(self):
        if self.overLine < 0:
            return

    def OnMouseLeftButtonUp(self):
        if self.overLine >= 0:
            if self.isIgShop and self.keyDict.has_key(self.overLine+self.basePos):
                if self.textDict.get(self.overLine+self.basePos, "") == "":
                    return
            self.SelectItem(self.overLine+self.basePos)

    def OnUpdate(self):

        self.overLine = -1

        if self.IsIn():
            x, y = self.GetGlobalPosition()
            height = self.GetHeight()
            xMouse, yMouse = wndMgr.GetMousePosition()

            if yMouse - y < height - 1:
                self.overLine = (yMouse - y) / self.stepSize

                if self.overLine < 0:
                    self.overLine = -1
                if self.overLine >= len(self.itemList):
                    self.overLine = -1
                if self.overLine != -1 and self.isIgShop and self.keyDict.has_key(self.overLine):
                    if self.textDict.get(self.overLine, "") == "":
                        self.overLine = -1


    def OnRender(self):
        xRender, yRender = self.GetGlobalPosition()
        yRender -= self.TEMPORARY_PLACE
        widthRender = self.width
        heightRender = self.height + self.TEMPORARY_PLACE*2

        if localeInfo.IsCIBN10:
            if -1 != self.overLine and self.keyDict[self.overLine] != -1:
                grp.SetColor(HALF_WHITE_COLOR)
                grp.RenderBar(xRender + 2, yRender + self.overLine*self.stepSize + 4, self.width - 3, self.stepSize)        

            if -1 != self.selectedLine and self.keyDict[self.selectedLine] != -1:
                if self.selectedLine >= self.basePos:
                    if self.selectedLine - self.basePos < self.showLineCount:
                        grp.SetColor(SELECT_COLOR)
                        grp.RenderBar(xRender + 2, yRender + (self.selectedLine-self.basePos)*self.stepSize + 4, self.width - 3, self.stepSize)

        else:
            if -1 != self.overLine:
                grp.SetColor(HALF_WHITE_COLOR)
                grp.RenderBar(xRender + 2, yRender + self.overLine*self.stepSize + 4, self.width - 3, self.stepSize)        

            if -1 != self.selectedLine:
                if self.selectedLine >= self.basePos:
                    if self.selectedLine - self.basePos < self.showLineCount:
                        grp.SetColor(SELECT_COLOR)
                        grp.RenderBar(xRender + 2, yRender + (self.selectedLine-self.basePos)*self.stepSize + 4, self.width - 3, self.stepSize)

Ardından constinfo.py dosyasını açın ve şunu ekleyin:

C++:
INPUT_IGNORE = 0

## Ingame Shop
IGShop = {
    "qID"    : 0,
    "questCMD" : "",
    "slot1" : {"socket" : {}, "attr" : {}},
    "slot2" : {"socket" : {}, "attr" : {}},
    "slot3" : {"socket" : {}, "attr" : {}},
    "slot4" : {"socket" : {}, "attr" : {}},
    "slot5" : {"socket" : {}, "attr" : {}},
    "vnum1" : 0,
    "vnum2" : 0,
    "vnum3" : 0,
    "vnum4" : 0,
    "vnum5" : 0,
}
##End of Ingame Shop

Ardından mousemodule.py dosyasını açın ve bunu aşağıdaki şekilde düzenleyin: def AttachObject (self, Owner, Type, SlotNumber, ItemIndex, count = 0):

C++:
if Type == player.SLOT_TYPE_INVENTORY or\
                Type == player.SLOT_TYPE_PRIVATE_SHOP or\
                Type == player.SLOT_TYPE_SHOP or\
                Type == player.SLOT_TYPE_SAFEBOX or\
                Type == player.SLOT_TYPE_MALL or\
                Type == player.SLOT_TYPE_DRAGON_SOUL_INVENTORY:

Buna:

C++:
if Type == player.SLOT_TYPE_INVENTORY or\
                Type == player.SLOT_TYPE_PRIVATE_SHOP or\
                Type == player.SLOT_TYPE_SHOP or\
                Type == player.SLOT_TYPE_SAFEBOX or\
                Type == player.SLOT_TYPE_MALL or\
                Type == player.SLOT_TYPE_DRAGON_SOUL_INVENTORY or\
                Type == 777:

Ve işimiz bitti. Ticaret merkezini depo sorumlusu (9005) üzerinden açabilirsiniz. Kurulum sırasında bir sorunla karşılaşırsanız, bu videoyu kontrol edin ve neyin yanlış olduğunu bulabilirsiniz:



Ticaret evinin özelleştirilmesi

Her şey yolunda gidiyorsa, ticaret evini özelleştirmeye başlayabilirsiniz. Bazı yapılandırma seçenekleri / filtreler yapılı. Bir oyuncunun satış için çıkartabileceği maksimum öğe sayısı, satış maddeleri için minimum seviye vb. Sunucudaki igshop_settings.lua dosyasını açın ve yorumları okuyun.

Gördüğünüz gibi, bu ada sahip bir değişken var: igshopEnableTrade

Bu değişkenle, ihtiyacınız yoksa "ticaret sistemini" devre dışı bırakabilirsiniz. Bu özelliğe bağlı olan tüm düğmeler ve metinler, oynatıcılar için görüntülenmeyecektir.

Ticaret evini başka bir görevden açabilirsiniz, sadece yazın.

C++:
mb_igshop.OpenIgShop()

ÖNEMLİ!

"İsim Değişikliği Questi" ni değiştirmelisiniz, çünkü eğer bir oyuncunun ticaret alanında eşyaları varsa ve onun adını değiştirdiğinde, eşyaları kaybolur. Bu kontrolü İsim Değişikliği Questin'de bir yere ekleyin:

C++:
if not mb_igshop.can_change_name(pc.get_name()) then say("You can't change your name because") say("you have items in the tradehouse") return end

Konu daha önce açıldıysa özür dilerim, araştırdım ancak bulamadım. Ayrıca bu şu an geliştirilmiş ve son hali bilginiz olsun.

Eğer daha önce paylaşıldı ve açıldıysa da ve bu şekilde uptade'li haliyse lütfen bildirin. :)

Sistem @P3NG3R tarafından geliştirilmiş yanlış hatırlamıyorsam..

Paylaşım için teşekkürler.
 
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

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

Geri
Üst