Jump to content

MetinStone in shield/armor bug


Go to solution Solved by Eclipse Shade,

Recommended Posts

.gif
 

 as you see when i put a stone on both of them it says "cant attach this metin on this type of equipment"

I ve changed item proto stone wear type and socket in helmet and shield

also in constant cpp : 

const int aiArmorSocketQty[ARMOR_NUM_TYPES] =
{
#if defined(__ITEM_SOCKET5__)
    5, // ARMOR_BODY,
#else
    3, // ARMOR_BODY,
#endif
    3, // ARMOR_HEAD,
    3, // ARMOR_SHIELD,
    0, // ARMOR_WRIST,
    0, // ARMOR_FOOTS,
    0 // ARMOR_ACCESSORY
};


any idea ??? 

did i missed something? maybe in root? 

Link to comment
https://metin2.dev/topic/33755-metinstone-in-shieldarmor-bug/
Share on other sites

19 hours ago, mrscale said:

.gif
 

 as you see when i put a stone on both of them it says "cant attach this metin on this type of equipment"

I ve changed item proto stone wear type and socket in helmet and shield

also in constant cpp : 

const int aiArmorSocketQty[ARMOR_NUM_TYPES] =
{
#if defined(__ITEM_SOCKET5__)
    5, // ARMOR_BODY,
#else
    3, // ARMOR_BODY,
#endif
    3, // ARMOR_HEAD,
    3, // ARMOR_SHIELD,
    0, // ARMOR_WRIST,
    0, // ARMOR_FOOTS,
    0 // ARMOR_ACCESSORY
};


any idea ??? 

did i missed something? maybe in root? 

Hello, you should post all changes you made

as i remember this code you metioned are not even used in the source

you need modifity here, you only can put stones into armor and weapons  

 

      case ITEM_METIN:
            {
                LPITEM item2;

                if (!IsValidItemPosition(DestCell) || !(item2 = GetItem(DestCell)))
                    return false;

                if (item2->IsExchanging() || item2->IsEquipped()) // @fixme114
                    return false;

                if (item2->GetType() == ITEM_PICK) return false;
                if (item2->GetType() == ITEM_ROD) return false;

                int i;

                for (i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
                {
                    DWORD dwVnum;

                    if ((dwVnum = item2->GetSocket(i)) <= 2)
                        continue;

                    TItemTable * p = ITEM_MANAGER::instance().GetTable(dwVnum);

                    if (!p)
                        continue;

                    if (item->GetValue(5) == p->alValues[5])
                    {
                        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("같은 종류의 메틴석은 여러개 부착할 수 없습니다."));
                        return false;
                    }
                }

                if (item2->GetType() == ITEM_ARMOR)
                {
                    if (!IS_SET(item->GetWearFlag(), WEARABLE_BODY) || !IS_SET(item2->GetWearFlag(), WEARABLE_BODY))
                    {
                        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("이 메틴석은 장비에 부착할 수 없습니다."));
                        return false;
                    }
                }
                else if (item2->GetType() == ITEM_WEAPON)
                {
                    if (!IS_SET(item->GetWearFlag(), WEARABLE_WEAPON))
                    {
                        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("이 메틴석은 무기에 부착할 수 없습니다."));
                        return false;
                    }
                }
                else
                {
                    ChatPacket(CHAT_TYPE_INFO, LC_TEXT("부착할 수 있는 슬롯이 없습니다."));
                    return false;
                }

                for (i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
                    if (item2->GetSocket(i) >= 1 && item2->GetSocket(i) <= 2 && item2->GetSocket(i) >= item->GetValue(2))
                    {
#ifdef ENABLE_ADDSTONE_FAILURE
                        if (number(1, 100) <= 30)
#else
                        if (1)
#endif
                        {
                            ChatPacket(CHAT_TYPE_INFO, LC_TEXT("메틴석 부착에 성공하였습니다."));
                            item2->SetSocket(i, item->GetVnum());
                        }
                        else
                        {
                            ChatPacket(CHAT_TYPE_INFO, LC_TEXT("메틴석 부착에 실패하였습니다."));
                            item2->SetSocket(i, ITEM_BROKEN_METIN_VNUM);
                        }

                        LogManager::instance().ItemLog(this, item2, "SOCKET", item->GetName());
                        ITEM_MANAGER::instance().RemoveItem(item, "REMOVE (METIN)");
                        break;
                    }

                if (i == ITEM_SOCKET_MAX_NUM)
                    ChatPacket(CHAT_TYPE_INFO, LC_TEXT("부착할 수 있는 슬롯이 없습니다."));
            }
            break;


 

Edited by Eclipse Shade
  • Love 1
2 hours ago, Eclipse Shade said:

Hello, you should post all changes you made

as i remember this code you metioned are not even used in the source

you need modifity here, you only can put stones into armor and weapons  

 

      case ITEM_METIN:
            {
                LPITEM item2;

                if (!IsValidItemPosition(DestCell) || !(item2 = GetItem(DestCell)))
                    return false;

                if (item2->IsExchanging() || item2->IsEquipped()) // @fixme114
                    return false;

                if (item2->GetType() == ITEM_PICK) return false;
                if (item2->GetType() == ITEM_ROD) return false;

                int i;

                for (i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
                {
                    DWORD dwVnum;

                    if ((dwVnum = item2->GetSocket(i)) <= 2)
                        continue;

                    TItemTable * p = ITEM_MANAGER::instance().GetTable(dwVnum);

                    if (!p)
                        continue;

                    if (item->GetValue(5) == p->alValues[5])
                    {
                        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("같은 종류의 메틴석은 여러개 부착할 수 없습니다."));
                        return false;
                    }
                }

                if (item2->GetType() == ITEM_ARMOR)
                {
                    if (!IS_SET(item->GetWearFlag(), WEARABLE_BODY) || !IS_SET(item2->GetWearFlag(), WEARABLE_BODY))
                    {
                        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("이 메틴석은 장비에 부착할 수 없습니다."));
                        return false;
                    }
                }
                else if (item2->GetType() == ITEM_WEAPON)
                {
                    if (!IS_SET(item->GetWearFlag(), WEARABLE_WEAPON))
                    {
                        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("이 메틴석은 무기에 부착할 수 없습니다."));
                        return false;
                    }
                }
                else
                {
                    ChatPacket(CHAT_TYPE_INFO, LC_TEXT("부착할 수 있는 슬롯이 없습니다."));
                    return false;
                }

                for (i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
                    if (item2->GetSocket(i) >= 1 && item2->GetSocket(i) <= 2 && item2->GetSocket(i) >= item->GetValue(2))
                    {
#ifdef ENABLE_ADDSTONE_FAILURE
                        if (number(1, 100) <= 30)
#else
                        if (1)
#endif
                        {
                            ChatPacket(CHAT_TYPE_INFO, LC_TEXT("메틴석 부착에 성공하였습니다."));
                            item2->SetSocket(i, item->GetVnum());
                        }
                        else
                        {
                            ChatPacket(CHAT_TYPE_INFO, LC_TEXT("메틴석 부착에 실패하였습니다."));
                            item2->SetSocket(i, ITEM_BROKEN_METIN_VNUM);
                        }

                        LogManager::instance().ItemLog(this, item2, "SOCKET", item->GetName());
                        ITEM_MANAGER::instance().RemoveItem(item, "REMOVE (METIN)");
                        break;
                    }

                if (i == ITEM_SOCKET_MAX_NUM)
                    ChatPacket(CHAT_TYPE_INFO, LC_TEXT("부착할 수 있는 슬롯이 없습니다."));
            }
            break;


 

hi thnks for the answer the code that you showed me i-ve try to edit like this : 

	case ITEM_METIN:
	{
		LPITEM item2;

		if (!IsValidItemPosition(DestCell) || !(item2 = GetItem(DestCell)))
			return false;

		if (item2->IsExchanging())
			return false;

		if (item2->IsEquipped())
			return false;

		//< 2020.08.07.Owsap - Block item add metin sock.
		if (IS_SET(item2->GetAntiFlag(), ITEM_ANTIFLAG_APPLY))
		{
			ChatPacket(CHAT_TYPE_INFO, LC_TEXT("This Spirit Stone cannot be attached to this type of item."));
			return false;
		}
		//>

		if (item2->GetType() == ITEM_PICK) return false;
		if (item2->GetType() == ITEM_ROD) return false;

		int i;

		for (i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
		{
			DWORD dwVnum;

			if ((dwVnum = item2->GetSocket(i)) <= 2)
				continue;

			TItemTable* p = ITEM_MANAGER::instance().GetTable(dwVnum);

			if (!p)
				continue;

			if (item->GetValue(5) == p->alValues[5])
			{
				ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°°Àº Á¾·ùÀÇ ¸Þƾ¼®Àº ¿©·¯°³ ºÎÂøÇÒ ¼ö ¾ø½À´Ï´Ù."));
				return false;
			}
		}

		if (item2->GetType() == ITEM_ARMOR)
		{
			if (!IS_SET(item->GetWearFlag(), WEARABLE_BODY) || !IS_SET(item2->GetWearFlag(), WEARABLE_BODY))
			{
				ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÀÌ ¸Þƾ¼®Àº Àåºñ¿¡ ºÎÂøÇÒ ¼ö ¾ø½À´Ï´Ù."));
				return false;
			}
		}
		else if (item2->GetType() == ITEM_ARMOR)
		{
			if (!IS_SET(item->GetWearFlag(), WEARABLE_HEAD) || !IS_SET(item2->GetWearFlag(), WEARABLE_HEAD))
			{
				ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÀÌ ¸Þƾ¼®Àº Àåºñ¿¡ ºÎÂøÇÒ ¼ö ¾ø½À´Ï´Ù."));
				return false;
			}
		}
		else if (item2->GetType() == ITEM_ARMOR)
		{
			if (!IS_SET(item->GetWearFlag(), WEARABLE_SHIELD) || !IS_SET(item2->GetWearFlag(), WEARABLE_SHIELD))
			{
				ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÀÌ ¸Þƾ¼®Àº Àåºñ¿¡ ºÎÂøÇÒ ¼ö ¾ø½À´Ï´Ù."));
				return false;
			}
		}
		else if (item2->GetType() == ITEM_WEAPON)
		{
			if (!IS_SET(item->GetWearFlag(), WEARABLE_WEAPON))
			{
				ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÀÌ ¸Þƾ¼®Àº ¹«±â¿¡ ºÎÂøÇÒ ¼ö ¾ø½À´Ï´Ù."));
				return false;
			}
		}
		else
		{
			ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ºÎÂøÇÒ ¼ö ÀÖ´Â ½½·ÔÀÌ ¾ø½À´Ï´Ù."));
			return false;
		}

		for (i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
			if (item2->GetSocket(i) >= 1 && item2->GetSocket(i) <= 2 && item2->GetSocket(i) >= item->GetValue(2))
			{
				// ¼® È®·ü
				if (number(1, 100) <= 30 || g_bNeverFailMetin == true)
				{
					ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸Þƾ¼® ºÎÂø¿¡ ¼º°øÇÏ¿´½À´Ï´Ù."));
					item2->SetSocket(i, item->GetVnum());
				}
				else
				{
					ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸Þƾ¼® ºÎÂø¿¡ ½ÇÆÐÇÏ¿´½À´Ï´Ù."));
					item2->SetSocket(i, ITEM_BROKEN_METIN_VNUM);
				}

				LogManager::instance().ItemLog(this, item2, "SOCKET", item->GetName());
				item->SetCount(item->GetCount() - 1);
				break;
			}

		if (i == ITEM_SOCKET_MAX_NUM)
			ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ºÎÂøÇÒ ¼ö ÀÖ´Â ½½·ÔÀÌ ¾ø½À´Ï´Ù."));
	}
	break;

i did it wrong??? cus is not working

  • Solution
10 minutes ago, mrscale said:

hi thnks for the answer the code that you showed me i-ve try to edit like this : 

	case ITEM_METIN:
	{
		LPITEM item2;

		if (!IsValidItemPosition(DestCell) || !(item2 = GetItem(DestCell)))
			return false;

		if (item2->IsExchanging())
			return false;

		if (item2->IsEquipped())
			return false;

		//< 2020.08.07.Owsap - Block item add metin sock.
		if (IS_SET(item2->GetAntiFlag(), ITEM_ANTIFLAG_APPLY))
		{
			ChatPacket(CHAT_TYPE_INFO, LC_TEXT("This Spirit Stone cannot be attached to this type of item."));
			return false;
		}
		//>

		if (item2->GetType() == ITEM_PICK) return false;
		if (item2->GetType() == ITEM_ROD) return false;

		int i;

		for (i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
		{
			DWORD dwVnum;

			if ((dwVnum = item2->GetSocket(i)) <= 2)
				continue;

			TItemTable* p = ITEM_MANAGER::instance().GetTable(dwVnum);

			if (!p)
				continue;

			if (item->GetValue(5) == p->alValues[5])
			{
				ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°°Àº Á¾·ùÀÇ ¸Þƾ¼®Àº ¿©·¯°³ ºÎÂøÇÒ ¼ö ¾ø½À´Ï´Ù."));
				return false;
			}
		}

		if (item2->GetType() == ITEM_ARMOR)
		{
			if (!IS_SET(item->GetWearFlag(), WEARABLE_BODY) || !IS_SET(item2->GetWearFlag(), WEARABLE_BODY))
			{
				ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÀÌ ¸Þƾ¼®Àº Àåºñ¿¡ ºÎÂøÇÒ ¼ö ¾ø½À´Ï´Ù."));
				return false;
			}
		}
		else if (item2->GetType() == ITEM_ARMOR)
		{
			if (!IS_SET(item->GetWearFlag(), WEARABLE_HEAD) || !IS_SET(item2->GetWearFlag(), WEARABLE_HEAD))
			{
				ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÀÌ ¸Þƾ¼®Àº Àåºñ¿¡ ºÎÂøÇÒ ¼ö ¾ø½À´Ï´Ù."));
				return false;
			}
		}
		else if (item2->GetType() == ITEM_ARMOR)
		{
			if (!IS_SET(item->GetWearFlag(), WEARABLE_SHIELD) || !IS_SET(item2->GetWearFlag(), WEARABLE_SHIELD))
			{
				ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÀÌ ¸Þƾ¼®Àº Àåºñ¿¡ ºÎÂøÇÒ ¼ö ¾ø½À´Ï´Ù."));
				return false;
			}
		}
		else if (item2->GetType() == ITEM_WEAPON)
		{
			if (!IS_SET(item->GetWearFlag(), WEARABLE_WEAPON))
			{
				ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÀÌ ¸Þƾ¼®Àº ¹«±â¿¡ ºÎÂøÇÒ ¼ö ¾ø½À´Ï´Ù."));
				return false;
			}
		}
		else
		{
			ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ºÎÂøÇÒ ¼ö ÀÖ´Â ½½·ÔÀÌ ¾ø½À´Ï´Ù."));
			return false;
		}

		for (i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
			if (item2->GetSocket(i) >= 1 && item2->GetSocket(i) <= 2 && item2->GetSocket(i) >= item->GetValue(2))
			{
				// ¼® È®·ü
				if (number(1, 100) <= 30 || g_bNeverFailMetin == true)
				{
					ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸Þƾ¼® ºÎÂø¿¡ ¼º°øÇÏ¿´½À´Ï´Ù."));
					item2->SetSocket(i, item->GetVnum());
				}
				else
				{
					ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸Þƾ¼® ºÎÂø¿¡ ½ÇÆÐÇÏ¿´½À´Ï´Ù."));
					item2->SetSocket(i, ITEM_BROKEN_METIN_VNUM);
				}

				LogManager::instance().ItemLog(this, item2, "SOCKET", item->GetName());
				item->SetCount(item->GetCount() - 1);
				break;
			}

		if (i == ITEM_SOCKET_MAX_NUM)
			ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ºÎÂøÇÒ ¼ö ÀÖ´Â ½½·ÔÀÌ ¾ø½À´Ï´Ù."));
	}
	break;

i did it wrong??? cus is not working

this is wrong, you should also remove this
```
        //< 2020.08.07.Owsap - Block item add metin sock.
        if (IS_SET(item2->GetAntiFlag(), ITEM_ANTIFLAG_APPLY))
        {
            ChatPacket(CHAT_TYPE_INFO, LC_TEXT("This Spirit Stone cannot be attached to this type of item."));
            return false;
        }
        //>
```
once you remove it or comment the code above
or set different antiflag than ITEM_ANTIFLAG_APPLY

NOTE: if you want put the same stone with the same id and wearflag on both shield, armor , head you need do this in different way
try this if you want specific stone for each wearflag:

				if (item2->GetType() == ITEM_ARMOR)
				{
					if ((!IS_SET(item->GetWearFlag(), WEARABLE_BODY) && !IS_SET(item->GetWearFlag(), WEARABLE_SHIELD && !IS_SET(item->GetWearFlag(), WEARABLE_HEAD)) || (!IS_SET(item2->GetWearFlag(), WEARABLE_BODY) && !IS_SET(item2->GetWearFlag(), WEARABLE_SHIELD && !IS_SET(item2->GetWearFlag(), WEARABLE_HEAD)))
					{
						ChatPacket(CHAT_TYPE_INFO, LC_TEXT("이 메틴석은 장비에 부착할 수 없습니다."));
						return false;
					}
				}
Edited by Eclipse Shade
  • Love 1

Don't use any images from : imgur, turkmmop, freakgamers, inforge, hizliresim... Or your content will be deleted without notice...
Use : https://metin2.download/media/add/

Please use https://metin2.download/ when uploading files smaller than 100MB, otherwise the approval will take longer due to manual upload.

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.