Премини към съдържанието
Последвайте Kaldata.com в Google Новини за да научавате първи най-интересните новини! ×
  • Добре дошли!

    Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

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

     

Грешка в кода


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

Значи имам следния проблем, когато сложа предмета върху итема на героя ми, ми вади това съобщение "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;
    }
Линк към коментара
Сподели в други сайтове

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

 

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

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

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

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

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

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

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

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

 

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

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

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

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

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

 
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;
}
Линк към коментара
Сподели в други сайтове

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

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

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

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

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


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

void NewJewelsRecv(PMSG_USE_ITEM_RECV *lpMsg, int aIndex)
{
return;
}

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

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

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

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

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

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

×
×
  • Добави ново...