Премини към съдържанието

    Препоръчан отговор


    Значи имам следния проблем, когато сложа предмета върху итема на героя ми, ми вади това съобщение "This item has skill already " , така това е защото предмета вече има тази опция и ето тук идва проблема. След като ми покаже това съобщение, предмета ми изчезва, виждам го нали в играта, но ако влезна на ново в играта предмета е изчезнал, а би трябвало след като покаже това съобщение и дори пак да пробвам да сложа предмета върху итема ми, пак трябва да ми даде това съобщение. Ако вече итема ми няма тази опция да го добави и да премахне предмета тогава. Защо така се получава?

     

    else if (SourceItem->m_Type == ITEMGET(14,50)) // Jewel of Skill
        {
            int btSuccessRate = GetPrivateProfileInt("Skill","JewelOfSkill",100,New_Jewels);
            //BYTE btSuccessRate = 100; // Success rate (Max: 100)
    
            if (ItemAttrTable[TargetItem->m_Type].SkillType == 0)
            {
                GCServerMsgStringSend("Jewel of Skill is not applicable to this item !", aIndex, 1);
    
                return;
            }
    
            if (TargetItem->m_Option1 == 1)
            {
                GCServerMsgStringSend("This item has skill already !", aIndex, 1);
    
                return;
            }
    
            gObjInventoryDeleteItem(aIndex, lpMsg->inventoryPos);
            GCInventoryItemDeleteSend(aIndex, lpMsg->inventoryPos, 1);
    
            if ((rand() % 100) < btSuccessRate)
            {
                TargetItem->m_Option1 = 1;
                GCInventoryItemOneSend(aIndex, lpMsg->inventoryTarget);
    
                //LogAddTimeDateFunc("[%s][%s] Used Jewel of Skill [Item:%s][Serial:%d]", ObjTable[aIndex].AccountID, ObjTable[aIndex].Name, ItemAttrTable[TargetItem->m_Type].Name, TargetItem->m_Number);
            }
    
            return;
        }
    

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове

    Zealar    270

    Кой итем изчезва много объркано си го написал.

     

    Също така сигурен ли си че това съобщение е точно от тука пробвай да го смениш като добавиш някоя цифра.

    Или нещо такова

                GCServerMsgStringSend("This item has skill already########## !", aIndex, 1);

    Интересното е че че ако ти вади точно това съобщения трябва да ползва и "return" следователно всичкия код по-долу за изтриване не би трябвало да се изпълни.

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове
    Zealar    270

    Следователно итема не се изтрива в кода който е показан а преди това. Случайно итема да е консумираш на ползване, примерно като енчант за оръжие?

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове

    Предмета е Jewel of Skill (камък) , който като го сложа на оръжие което няма никви опции трябва да му добави +Skill опция, обаче ако предмета вече има +Skill дава съобщението и след което този Jewel (камък) се бъгва , изчезва , но все още стои визуално в сандъкът ми, обаче ако влезна на ново в играта, е изчезнал

     

    А когато цъкна камъка върху оръжието и покаже това съобщение, трябва да си остави камъка и ако пак реша да го сложа веднага отново върху предмета трябва пак да ми покаже това съобщение


    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове
    Zealar    270

    Ясно просто който е писал кода е направил да се извиква изтриването на по ранен стадии без да проверява дали изобщо се е сложил правилно. Трябва да провериш целият път на консумацията проблема не е в кода който е показан.

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове

    това е целия файл

     
    void NewJewelsRecv(PMSG_USE_ITEM_RECV *lpMsg, int aIndex)
    {
    OBJECTSTRUCT *ObjTable = (OBJECTSTRUCT*)OBJECT_BASE;
    ITEM_ATTRIBUTE *ItemAttrTable = (ITEM_ATTRIBUTE*)ITEMATTR_BASE;
     
    CItem *SourceItem = &ObjTable[aIndex].pInventory[lpMsg->inventoryPos];
    CItem *TargetItem = &ObjTable[aIndex].pInventory[lpMsg->inventoryTarget];
     
    if (SourceItem->m_Type == ITEMGET(14,45)) // Jewel of Exelent 
    {
    int btSuccessRate = GetPrivateProfileInt("Excelent","JewelOfExcelent",1,New_Jewels);
    int btMaxExcOptions = GetPrivateProfileInt("Excelent","MaxOptions",6,New_Jewels);
    //BYTE btSuccessRate   = 100; // Success rate (Max: 100)
    //BYTE btMaxExcOptions = 4;   // Max Excellent Options (Max: 6)
     
    if ((TargetItem->m_Type >= ITEMGET(12,7) && TargetItem->m_Type <= ITEMGET(12,35)) ||
    (TargetItem->m_Type >= ITEMGET(12,44) && TargetItem->m_Type <= ITEMGET(13,29)) || 
    TargetItem->m_Type >= ITEMGET(13,31))
    {
    GCServerMsgStringSend("Jewel of Exelent is not applicable to this item !", aIndex, 1);
     
    return;
    }
     
    if (TargetItem->m_Type == ITEMGET(4,7) || TargetItem->m_Type == ITEMGET(4,15) || 
    TargetItem->m_Type == ITEMGET(12,0) || TargetItem->m_Type == ITEMGET(12,1) || 
    TargetItem->m_Type == ITEMGET(12,2) || TargetItem->m_Type == ITEMGET(12,41))
    {
    GCServerMsgStringSend("Jewel of Exelent is not applicable to this item !", aIndex, 1);
     
    return;
    }
     
    if (TargetItem->m_Type == ITEMGET(0,26) || TargetItem->m_Type == ITEMGET(0,27) || 
    TargetItem->m_Type == ITEMGET(0,28) || TargetItem->m_Type == ITEMGET(2,16) || 
    TargetItem->m_Type == ITEMGET(2,17) || TargetItem->m_Type == ITEMGET(4,23) || 
    TargetItem->m_Type == ITEMGET(5,30) || TargetItem->m_Type == ITEMGET(5,31) || 
    TargetItem->m_Type == ITEMGET(6,17) || TargetItem->m_Type == ITEMGET(6,18) || 
    TargetItem->m_Type == ITEMGET(6,19) || TargetItem->m_Type == ITEMGET(6,20) || 
    TargetItem->m_Type == ITEMGET(7,45) || TargetItem->m_Type == ITEMGET(7,46) || 
    TargetItem->m_Type == ITEMGET(7,49) || TargetItem->m_Type == ITEMGET(7,50) || 
    TargetItem->m_Type == ITEMGET(7,51) || TargetItem->m_Type == ITEMGET(7,52) || 
    TargetItem->m_Type == ITEMGET(8,45) || TargetItem->m_Type == ITEMGET(8,46) || 
    TargetItem->m_Type == ITEMGET(8,47) || TargetItem->m_Type == ITEMGET(8,48) || 
    TargetItem->m_Type == ITEMGET(8,49) || TargetItem->m_Type == ITEMGET(8,50) || 
    TargetItem->m_Type == ITEMGET(8,51) || TargetItem->m_Type == ITEMGET(8,52) || 
    TargetItem->m_Type == ITEMGET(9,45) || TargetItem->m_Type == ITEMGET(9,46) || 
    TargetItem->m_Type == ITEMGET(9,47) || TargetItem->m_Type == ITEMGET(9,48) || 
    TargetItem->m_Type == ITEMGET(9,49) || TargetItem->m_Type == ITEMGET(9,50) || 
    TargetItem->m_Type == ITEMGET(9,51) || TargetItem->m_Type == ITEMGET(9,52) || 
    TargetItem->m_Type == ITEMGET(10,45) || TargetItem->m_Type == ITEMGET(10,46) || 
    TargetItem->m_Type == ITEMGET(10,47) || TargetItem->m_Type == ITEMGET(10,48) || 
    TargetItem->m_Type == ITEMGET(10,49) || TargetItem->m_Type == ITEMGET(10,50) || 
    TargetItem->m_Type == ITEMGET(10,51) || TargetItem->m_Type == ITEMGET(10,52) || 
    TargetItem->m_Type == ITEMGET(11,45) || TargetItem->m_Type == ITEMGET(11,46) || 
    TargetItem->m_Type == ITEMGET(11,47) || TargetItem->m_Type == ITEMGET(11,48) || 
    TargetItem->m_Type == ITEMGET(11,49) || TargetItem->m_Type == ITEMGET(11,50) || 
    TargetItem->m_Type == ITEMGET(11,51) || TargetItem->m_Type == ITEMGET(11,52))
    {
    GCServerMsgStringSend("Jewel of Exelent is not applicable to this item !", aIndex, 1);
     
    return;
    }
     
    if (TargetItem->m_SetOption != 0)
    {
    GCServerMsgStringSend("Jewel of Exelent is not applicable to this item !", aIndex, 1);
     
    return;
    }
     
    /**/
    int ExcellentCount = 0;
     
    for(int i = 0; i < 6;i++)
    {
    if((TargetItem->m_NewOption >> i) & 1)
    {
    ExcellentCount++;
    }
    }
     
    if (ExcellentCount >= 6) // Passed OK
    {
     
    GCServerMsgStringSend("This item has excellent options already !", aIndex, 1);
     
    return;
    }
     
    gObjInventoryDeleteItem(aIndex, lpMsg->inventoryPos);
    GCInventoryItemDeleteSend(aIndex, lpMsg->inventoryPos, 1);
     
    if ((rand() % 100) < btSuccessRate)
    {
    TargetItem->m_NewOption = GetRandomExcOption(btMaxExcOptions, FALSE);
    GCInventoryItemOneSend(aIndex, lpMsg->inventoryTarget);
     
    //Log.Add("[%d][%d] Used Jewel of Exelent [Item:%d][Serial:%d][New Options:%d]", ObjTable[aIndex].AccountID, ObjTable[aIndex].Name, ItemAttrTable[TargetItem->m_Type].Name, TargetItem->m_Number, TargetItem->m_NewOption);
    }
     
    return;
    }
     
    if (SourceItem->m_Type == ITEMGET(14,46)) // Jewel of Level
    {
    int btSuccessRate = GetPrivateProfileInt("Level","JewelOfLevel",100,New_Jewels);
    int btMinLevel = GetPrivateProfileInt("Level","MinLevel",9,New_Jewels);
    int btMaxLevel = GetPrivateProfileInt("Level","MaxLevel",13,New_Jewels);
    //BYTE btSuccessRate = 100; // Success rate (Max: 100)
    //BYTE btMinLevel    = 9;   // Min Level (Min: 0)
    //BYTE btMaxLevel    = 13;  // Max Level (Max: 13)
     
    if ((TargetItem->m_Type >= ITEMGET(12,7) && TargetItem->m_Type <= ITEMGET(12,35)) ||
    (TargetItem->m_Type >= ITEMGET(12,44) && TargetItem->m_Type <= ITEMGET(13,29)) || 
    TargetItem->m_Type >= ITEMGET(13,31))
    {
    GCServerMsgStringSend("Jewel of Divinity is not applicable to this item !", aIndex, 1);
     
    return;
    }
     
    if (TargetItem->m_Type == ITEMGET(4,7) || TargetItem->m_Type == ITEMGET(4,15) || 
    TargetItem->m_Type == ITEMGET(12,0) || TargetItem->m_Type == ITEMGET(12,1) || 
    TargetItem->m_Type == ITEMGET(12,2) || TargetItem->m_Type == ITEMGET(12,41))
    {
    GCServerMsgStringSend("Jewel of Divinity is not applicable to this item !", aIndex, 1);
     
    return;
    }
     
    if (TargetItem->m_Level < btMinLevel || TargetItem->m_Level >= btMaxLevel)
    {
    CHAR szBuffer[100];
     
    sprintf_s(szBuffer, "Use to increment item level from +%d to +%d !", btMinLevel, btMaxLevel);
    GCServerMsgStringSend(szBuffer, aIndex, 1);
     
    return;
    }
     
    gObjInventoryDeleteItem(aIndex, lpMsg->inventoryPos);
    GCInventoryItemDeleteSend(aIndex, lpMsg->inventoryPos, 1);
     
    if ((rand() % 100) < btSuccessRate)
    {
    TargetItem->m_Level++;
    GCInventoryItemOneSend(aIndex, lpMsg->inventoryTarget);
     
    //LogAddTimeDateFunc("[%s][%s] Used Jewel of Divinity [Item:%s][Serial:%d][Level:%d]", ObjTable[aIndex].AccountID, ObjTable[aIndex].Name, ItemAttrTable[TargetItem->m_Type].Name, TargetItem->m_Number, TargetItem->m_Level);
    }
     
    return;
    }
     
    if (SourceItem->m_Type == ITEMGET(14,48)) // Jewel of Luck
    {
    int btSuccessRate = GetPrivateProfileInt("Luck","JewelOfLuck",100,New_Jewels);
    //BYTE btSuccessRate = 100; // Success rate (Max: 100)
     
    if ((TargetItem->m_Type >= ITEMGET(12,7) && TargetItem->m_Type <= ITEMGET(12,35)) || 
    (TargetItem->m_Type >= ITEMGET(12,44) && TargetItem->m_Type <= ITEMGET(13,29)) || 
    TargetItem->m_Type >= ITEMGET(13,31))
    {
    GCServerMsgStringSend("Jewel of Luck is not applicable to this item !", aIndex, 1);
     
    return;
    }
     
    if (TargetItem->m_Type == ITEMGET(4,7) || TargetItem->m_Type == ITEMGET(4,15))
    {
    GCServerMsgStringSend("Jewel of Luck is not applicable to this item !", aIndex, 1);
     
    return;
    }
     
    if (TargetItem->m_Option2 == 1)
    {
    GCServerMsgStringSend("This item has luck already !", aIndex, 1);
     
    return;
    }
     
    gObjInventoryDeleteItem(aIndex, lpMsg->inventoryPos);
    GCInventoryItemDeleteSend(aIndex, lpMsg->inventoryPos, 1);
     
    if ((rand() % 100) < btSuccessRate)
    {
    TargetItem->m_Option2 = 1;
    GCInventoryItemOneSend(aIndex, lpMsg->inventoryTarget);
     
    //LogAddTimeDateFunc("[%s][%s] Used Jewel of Luck [Item:%s][Serial:%d]", ObjTable[aIndex].AccountID, ObjTable[aIndex].Name, ItemAttrTable[TargetItem->m_Type].Name, TargetItem->m_Number);
    }
     
    return;
    }
     
    if (SourceItem->m_Type == ITEMGET(14,49)) // Jewel of Assembly
    {
    int btSuccessRate = GetPrivateProfileInt("Options","JewelOfOptions",100,New_Jewels);
    int btMaxExcOptions = GetPrivateProfileInt("Options","MaxOptions",100,New_Jewels);
    //BYTE btSuccessRate   = 100; // Success rate (Max: 100)
    //BYTE btMaxExcOptions = 3;   // Max Excellent Options (Max: 6)
     
    if (TargetItem->m_Type != ITEMGET(13,8) && TargetItem->m_Type != ITEMGET(13,9) && 
    TargetItem->m_Type != ITEMGET(13,12) && TargetItem->m_Type != ITEMGET(13,13) && 
    TargetItem->m_Type != ITEMGET(13,21) && TargetItem->m_Type != ITEMGET(13,22) && 
    TargetItem->m_Type != ITEMGET(13,23) && TargetItem->m_Type != ITEMGET(13,24) && 
    TargetItem->m_Type != ITEMGET(13,25) && TargetItem->m_Type != ITEMGET(13,26) && 
    TargetItem->m_Type != ITEMGET(13,27) && TargetItem->m_Type != ITEMGET(13,28))
    {
    GCServerMsgStringSend("Jewel of Assembly is not applicable to this item !", aIndex, 1);
     
    return;
    }
     
    if (TargetItem->m_SetOption != 0)
    {
    GCServerMsgStringSend("Jewel of Assembly is not applicable to this item !", aIndex, 1);
     
    return;
    }
     
    if (TargetItem->m_NewOption != 0) // Here?
    {
    GCServerMsgStringSend("This item has excellent options already !", aIndex, 1);
     
    return;
    }
     
    gObjInventoryDeleteItem(aIndex, lpMsg->inventoryPos);
    GCInventoryItemDeleteSend(aIndex, lpMsg->inventoryPos, 1);
     
    if ((rand() % 100) < btSuccessRate)
    {
     
    TargetItem->m_NewOption = GetRandomExcOption(btMaxExcOptions, FALSE);
    GCInventoryItemOneSend(aIndex, lpMsg->inventoryTarget);
     
    //LogAddTimeDateFunc("[%s][%s] Used Jewel of Assembly [Item:%s][Serial:%d][Options:%d]", ObjTable[aIndex].AccountID, ObjTable[aIndex].Name, ItemAttrTable[TargetItem->m_Type].Name, TargetItem->m_Number, btOptions);
    }
     
    return;
    }
     
    if (SourceItem->m_Type == ITEMGET(14,50)) // Jewel of Skill
    {
    int btSuccessRate = GetPrivateProfileInt("Skill","JewelOfSkill",100,New_Jewels);
    //BYTE btSuccessRate = 100; // Success rate (Max: 100)
     
    if (ItemAttrTable[TargetItem->m_Type].SkillType == 0)
    {
    GCServerMsgStringSend("Jewel of Skill is not applicable to this item !", aIndex, 1);
     
    return;
    }
     
    if (TargetItem->m_Option1 == 1)
    {
    GCServerMsgStringSend("This item has skill already !", aIndex, 1);
     
    return;
    }
    else
    {
     if ((rand() % 100) < btSuccessRate)
     {
    TargetItem->m_Option1 = 1;
    GCInventoryItemOneSend(aIndex, lpMsg->inventoryTarget);
    ItemClear(aIndex,lpMsg->inventoryPos);
    gObjInventoryDeleteItem(aIndex, lpMsg->inventoryPos);
       GCInventoryItemDeleteSend(aIndex, lpMsg->inventoryPos, 1);
    //LogAddTimeDateFunc("[%s][%s] Used Jewel of Skill [Item:%s][Serial:%d]", ObjTable[aIndex].AccountID, ObjTable[aIndex].Name, ItemAttrTable[TargetItem->m_Type].Name, TargetItem->m_Number);
     }
    }
     
    return;
    }
     
    return;
    }
    

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове
    Zealar    270

    Не виждам проблем тука явно се търка още преди това.

    Пробвай да изчистиш метода с други думи да не прави нищо още в началото.

    Или махни целия код или сложи някакъв return И пробвай какво става дали пак изчезва предмета. Ако изчезва следователно се търка на други място най-вероятно след извикването на тоя метод но не и в него. Ако не изчезва ще оглеждаме по-подробно къде може би е проблема.

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове

    ще го пробвам сега


    Няма нищо, слагам камъкът върху предмета, не дава нищо защото няма код, но като влезна на ново в играта камъкът го няма

    void NewJewelsRecv(PMSG_USE_ITEM_RECV *lpMsg, int aIndex)
    {
    return;
    }
    
    
    Редактирано от Георги Петев (преглед на промените)

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове
    Zealar    270

    Както си и мислих итема се изтърква на грешно място обаче начина по-който бива изтрит не отговаря на правилният и по тоя начин на клиента не се изпраща списък с новият ивентар. Поради тази причина камака изчезва чак след релог или нещо което упдейтва ивентара.

    Следователно търси къде се вика "NewJewelsRecv" и оглеждаш наоколо дали няма изтриване. Другия начин е да повториш теста с ретърна да видиш дали след викането на тоя метод или преди него се търка итема. Така малко по-малко ще намериш от къде идва проблема.

    Ако имаш въпроси питай.

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове

    Регистрирайте се или влезете в профила си за да коментирате

    Трябва да имате регистрация за да може да коментирате това

    Регистрирайте се

    Създайте нова регистрация в нашия форум. Лесно е!

    Нова регистрация

    Вход

    Имате регистрация? Влезте от тук.

    Вход


    ×

    Информация

    Този сайт използва бисквитки (cookies), за най-доброто потребителско изживяване. С използването му, вие приемате нашите Условия за ползване.