Update NPCShopUIManager.cs

This commit is contained in:
HungDK
2026-04-06 16:03:41 +07:00
parent f96f8fe45a
commit 4d751188bf
@@ -391,47 +391,45 @@ public class NPCShopUIManager : AUIDialog
// Initialize buy array with at least one option
shopItem.buy = new GShopBuyOption[4]; // GShopItem supports up to 4 buy options
// Get item name and price based on type
string itemName = "Unknown";
int shopPrice = 0;
switch (itemDataType)
// Resolve display name/price in a type-agnostic way.
// Some element types come back as DATA_TYPE values we don't special-case here (arrows, flyswords, fashion, etc).
string itemName = EC_IvtrItemUtils.Instance.ResolveItemName(unchecked((int)good.id));
if (string.IsNullOrWhiteSpace(itemName))
itemName = $"Item_{good.id}";
static int ExtractInt(object data, params string[] fieldOrPropNames)
{
case DATA_TYPE.DT_WEAPON_ESSENCE:
var weaponEssence = (WEAPON_ESSENCE)itemData;
itemName = weaponEssence.Name;
shopPrice = weaponEssence.shop_price;
break;
case DATA_TYPE.DT_ARMOR_ESSENCE:
var armorEssence = (ARMOR_ESSENCE)itemData;
itemName = armorEssence.Name;
shopPrice = armorEssence.shop_price;
break;
case DATA_TYPE.DT_MEDICINE_ESSENCE:
var medicineEssence = (MEDICINE_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(medicineEssence.name);
shopPrice = medicineEssence.shop_price;
break;
case DATA_TYPE.DT_DECORATION_ESSENCE:
var decorationEssence = (DECORATION_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(decorationEssence.name);
shopPrice = decorationEssence.shop_price;
break;
case DATA_TYPE.DT_STONE_ESSENCE:
var stoneEssence = (STONE_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(stoneEssence.name);
shopPrice = stoneEssence.shop_price;
break;
case DATA_TYPE.DT_MATERIAL_ESSENCE:
var materialEssence = (MATERIAL_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(materialEssence.name);
shopPrice = materialEssence.shop_price;
break;
default:
itemName = $"Item_{good.id}";
break;
if (data == null || fieldOrPropNames == null || fieldOrPropNames.Length == 0)
return 0;
var t = data.GetType();
for (int i = 0; i < fieldOrPropNames.Length; i++)
{
string name = fieldOrPropNames[i];
if (string.IsNullOrEmpty(name))
continue;
var field = t.GetField(name, System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.IgnoreCase);
if (field != null && field.FieldType == typeof(int))
{
try { return (int)field.GetValue(data); } catch { }
}
var prop = t.GetProperty(name, System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.IgnoreCase);
if (prop != null && prop.PropertyType == typeof(int) && prop.CanRead)
{
try { return (int)prop.GetValue(data); } catch { }
}
}
return 0;
}
// Prefer shop_price; fall back to base price if that's all we have.
int shopPrice = ExtractInt(itemData, "shop_price");
if (shopPrice <= 0)
shopPrice = ExtractInt(itemData, "price");
shopItem.name = itemName;
// Set price from contribution cost or shop price