using System; using System.Collections.Generic; using System.Linq; using System.Numerics; using System.Text; using System.Threading.Tasks; using ServerCore; using ServerBase; using SESSION_ID = System.Int32; using WORLD_ID = System.UInt32; using META_ID = System.UInt32; using ENTITY_GUID = System.String; using ACCOUNT_ID = System.String; using OWNER_GUID = System.String; using USER_GUID = System.String; using CHARACTER_GUID = System.String; using ITEM_GUID = System.String; using StackExchange.Redis; using Amazon.S3.Model; using ServerControlCenter; namespace ServerCommon { public abstract class ItemBase : EntityBase { public ItemBase(EntityBase parent) : base(EntityType.Item, parent) { } public async Task createByItemMeta(META_ID toCreateItemMetaId, UInt16 toCreateCount) { var err_msg = string.Empty; var parent = getRootParent(); NullReferenceCheckHelper.throwIfNull(parent, () => $"parent is null !!!"); var result = await onInit(); if(result.isFail()) { return result; } var item_attribute = getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(item_attribute, () => $"item_attribute is null !!! - {parent.toBasicString()}"); if (!MetaData.Instance._ItemTable.TryGetValue((int)toCreateItemMetaId, out var found_item_meta_data)) { err_msg = $"Not found meta of Item !!! : toCreateItemMetaId:{toCreateItemMetaId} - {getRootParent().toBasicString()}"; result.setFail(ServerErrorCode.ItemMetaDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return result; } if (toCreateCount <= 0) { err_msg = $"Invalid Param !!! : 0 < toCreateCount:{toCreateCount} - toCreateItemMetaId:{toCreateItemMetaId}, {getRootParent().toBasicString()}"; result.setFail(ServerErrorCode.FunctionInvalidParam, err_msg); Log.getLogger().error(result.toBasicString()); return result; } if (MetaAssets.EItemLargeType.TATTOO == found_item_meta_data.TypeLarge) { item_attribute.Level = 1; result = fillupMakeAttributeIds(found_item_meta_data, out var attribute_Ids); if(result.isFail()) { err_msg = $"Failed to fillupAttributeIds() !!! : {result.toBasicString()}, {getRootParent().toBasicString()}"; Log.getLogger().error(err_msg); return result; } item_attribute.Attributes = attribute_Ids; } item_attribute.ItemMetaId = toCreateItemMetaId; item_attribute.ItemStackCount = (UInt16)Math.Min(found_item_meta_data.StackMaxCount, toCreateCount); item_attribute.newEntityAttribute(); return result; } public async Task createByItemDoc(ItemDoc itemDoc, bool isWriteToDb = false) { var err_msg = string.Empty; var parent = getRootParent(); NullReferenceCheckHelper.throwIfNull(parent, () => $"parent is null !!!"); var result = await onInit(); if(result.isFail()) { return result; } var item_doc_attrib = itemDoc.getAttrib(); NullReferenceCheckHelper.throwIfNull(item_doc_attrib, () => $"item_doc_attrib is null !!! - {parent.toBasicString()}"); if (!MetaData.Instance._ItemTable.TryGetValue((int)item_doc_attrib.ItemMetaId, out var found_item_meta_data)) { err_msg = $"Not found meta of Item !!! : itemMetaId:{item_doc_attrib.ItemMetaId} - {getRootParent().toBasicString()}"; result.setFail(ServerErrorCode.ItemMetaDataNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return result; } if ( item_doc_attrib.ItemStackCount < 0 || found_item_meta_data.StackMaxCount < item_doc_attrib.ItemStackCount ) { err_msg = $"Invalid ItemStackCount !!! : 0 < item.StackCount:{item_doc_attrib.ItemStackCount} <= itemMeta.StackMaxCount;{found_item_meta_data.StackMaxCount}, itemMetaId:{item_doc_attrib.ItemMetaId} - {parent.toBasicString()}"; result.setFail(ServerErrorCode.ItemStackCountInvalid, err_msg); Log.getLogger().error(result.toBasicString()); return result; } var item_attribute = getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(item_attribute, () => $"item_attribute is null !!! - {parent.toBasicString()}"); if (false == item_attribute.copyEntityAttributeFromDoc(itemDoc)) { err_msg = $"Failed to copyEntityAttributeFromDoc() !!!, to:{item_attribute.getTypeName()}, from:{itemDoc.getTypeName()} - {toBasicString()}, {parent.toBasicString()}"; result.setFail(ServerErrorCode.DynamoDbDocCopyToEntityAttributeFailed, err_msg); Log.getLogger().error(result.toBasicString()); return result; } if(true == isWriteToDb) { if(item_doc_attrib.ItemGuid.isNullOrWhiteSpace()) { err_msg = $"item_doc_attrib.ItemGuid.isNullOrWhiteSpace() is false !!!, to:{item_attribute.getTypeName()}, from:{itemDoc.getTypeName()} - {toBasicString()}, {parent.toBasicString()}"; result.setFail(ServerErrorCode.EntityGuidInvalid, err_msg); Log.getLogger().error(result.toBasicString()); return result; } item_attribute.newEntityAttributeWithItemGuid(item_doc_attrib.ItemGuid); } return result; } public Result fillupMakeAttributeIds(MetaAssets.ItemMetaData itemdata, out List selectedAttributeIds) { var result = new Result(); var err_msg = string.Empty; var parent = getRootParent(); NullReferenceCheckHelper.throwIfNull(parent, () => $"parent is null !!!"); selectedAttributeIds = new List(); if (false == MetaData.Instance._AttributeDefinitionMetaTable.TryGetValue(itemdata.DefaultAttribute, out var found_attribute_defined_data)) { err_msg = $"Not found DefaultAttribute of Item in AttributeDefinitionMeta !!! : defaultAttribute:{itemdata.DefaultAttribute} - itemMetaId:{itemdata.ItemId}, {parent.toBasicString()}"; result.setFail(ServerErrorCode.ItemDefaultAttributeNotFoundInMeta, err_msg); Log.getLogger().error(result.toBasicString()); return result; } selectedAttributeIds.Add((UInt16)found_attribute_defined_data.ID); var item_attribute = getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(item_attribute, () => $"item_attribute is null !!! - {parent.toBasicString()}"); var item_level = item_attribute.Level; if (false == MetaData.Instance._ItemLevelEnchantMetaTable.TryGetValue(item_level, out var found_item_level_enchant_data)) { err_msg = $"Not found ItemLevelEnchant of Item in ItemLevelEnchantMeta !!! : itemLevel:{item_level} - itemMetaId:{itemdata.ItemId}, {parent.toBasicString()}"; result.setFail(ServerErrorCode.ItemLevelEnchantNotFoundInMeta, err_msg); Log.getLogger().error(result.toBasicString()); return result; } var found_enchant_data = found_item_level_enchant_data.GetConsumeItem(itemdata.Rarity); if(found_enchant_data == null) { err_msg = $"Not found Enchant of Item in EnchantData in ItemLevelEnchant !!! : itemRarity:{itemdata.Rarity} - itemMetaId:{itemdata.ItemId}, {parent.toBasicString()}"; result.setFail(ServerErrorCode.ItemEnchantNotFoundInMeta, err_msg); Log.getLogger().error(result.toBasicString()); return result; } if (false == MetaData.Instance._AttributeRandomGroupMetaTable.TryGetValue(itemdata.AttributeRandomGroupID, out var found_attribute_random_groups)) { err_msg = $"Not found AttributeRandomGroup of Item in AttributeRandomGroupMeta !!! : itemAttributeRandomGroupId:{itemdata.AttributeRandomGroupID} - itemMetaId:{itemdata.ItemId}, {parent.toBasicString()}"; result.setFail(ServerErrorCode.ItemAttributeRandomGroupNotFoundInMeta, err_msg); Log.getLogger().error(result.toBasicString()); return result; } var total_weight = found_attribute_random_groups.TotalWeight; if (total_weight == 0 && 1 < found_enchant_data.AttributeValues.Count) { err_msg = $"Invalid TotalWeight of AttributeRandomGroup of Item !!! : 0 < TotalWeight:{total_weight}, EnchantAttributeValuesCount:{found_enchant_data.AttributeValues.Count}" + $" - ItemAttributeRadomGroupId:{itemdata.AttributeRandomGroupID}, itemMetaId:{itemdata.ItemId}, {parent.toBasicString()}"; result.setFail(ServerErrorCode.ItemAttributeRandomGroupTotalWeightInvalid, err_msg); Log.getLogger().error(result.toBasicString()); return result; } var random_attribute_ids = new List(); var attribute_definition_meta = MetaData.Instance._AttributeDefinitionMetaTable; while (random_attribute_ids.Count < found_enchant_data.AttributeValues.Count - 1) { if(0 == total_weight) { err_msg = $"Not selected AttributeId by Random !!!" + $" - ItemAttributeRadomGroupId:{itemdata.AttributeRandomGroupID}, itemMetaId:{itemdata.ItemId}, {parent.toBasicString()}"; break; } var count = 0; var random_number = RandomHelper.next(0, total_weight); foreach (var random_group in found_attribute_random_groups.attributeRandomGroupDatas) { if (false == attribute_definition_meta.TryGetValue(random_group.Attribute, out var found_random_attribute_data)) { err_msg = $"Not found RandomAttribute in AttributeDefinitionMeta !!! : AttributeOfRandomGroup:{random_group.Attribute}" + $" - ItemAttributeRadomGroupId:{itemdata.AttributeRandomGroupID}, itemMetaId:{itemdata.ItemId}, {parent.toBasicString()}"; result.setFail(ServerErrorCode.ItemDefaultAttributeNotFoundInMeta, err_msg); Log.getLogger().error(result.toBasicString()); return result; } var is_found_random_attribute = false; foreach (var select_attribute_id in random_attribute_ids) { if (found_random_attribute_data.ID == select_attribute_id) { is_found_random_attribute = true; break; } } if (is_found_random_attribute == true) { continue; } count += random_group.Weight; if (count > random_number) { random_attribute_ids.Add((UInt16)found_random_attribute_data.ID); total_weight -= random_group.Weight; break; } } } selectedAttributeIds.AddRange(random_attribute_ids); return result; } public async Task<(Result, Int16)> fillupChangeAttributeIds() { await Task.CompletedTask; var result = new Result(); var err_msg = string.Empty; var parent = getRootParent(); NullReferenceCheckHelper.throwIfNull(parent, () => $"parent is null !!!"); var item_attribute = getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(item_attribute, () => $"item_attribute is null !!! - {parent.toBasicString()}"); var item_meta = getItemMeta(); NullReferenceCheckHelper.throwIfNull(item_meta, () => $"item_meta is null !!! - {parent.toBasicString()}"); if (!MetaData.Instance._AttributeRandomGroupMetaTable.TryGetValue(item_meta.AttributeRandomGroupID, out var randomGroupList)) { err_msg = $"Not found AttributeRandomGroupID !!! : AttributeRandomGroupId:{item_meta.AttributeRandomGroupID} - itemMetaId:{item_meta.ItemId}, {getRootParent().toBasicString()}"; result.setFail(ServerErrorCode.ItemAttributeRandomGroupNotFoundInMeta, err_msg); Log.getLogger().error(result.toBasicString()); return (result, 0); } int total_weight = randomGroupList.TotalWeight; var attrivute_ids = item_attribute.Attributes; foreach (var attribute_data in randomGroupList.attributeRandomGroupDatas) { for (int i = 0; i < attrivute_ids.Count; ++i) { if (attribute_data.Key == attrivute_ids[i]) { total_weight -= attribute_data.Weight; break; } } } var count = 0; var random_number = RandomHelper.next(0, total_weight); foreach (var attribute_data in randomGroupList.attributeRandomGroupDatas) { var break_check = false; for (int i = 0; i < attrivute_ids.Count; ++i) { if (attribute_data.Key == attrivute_ids[i]) { break_check = true; break; } } if (break_check == true) { continue; } count += attribute_data.Weight; if (count > random_number) { var change_item_attribute_id = (Int16)attribute_data.Key; return (result, change_item_attribute_id); } } err_msg = $"Not selected Attriubte Id !!! - {this.toBasicString()}, {getRootParent().toBasicString()}"; result.setFail(ServerErrorCode.ItemAttributeChangeNotSelected, err_msg); return (result, 0); } public override (Result, META_ID) onGetMetaIdOfEntityAlertTriggerType(EntityAlertTriggerType alertType) { var parent = getRootParent(); NullReferenceCheckHelper.throwIfNull(parent, () => $"parent is null !!!"); var result = new Result(); return (result, getItemMetaId()); } public override OWNER_GUID onGetGuidOfOwnerEntityType() { var item_attribute_base = getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(item_attribute_base, () => $"item_attribute_base is null !!! - {toBasicString()}"); return item_attribute_base.ItemGuid; } public override OwnerEntityType onGetOwnerEntityType() { return OwnerEntityType.Item; } public UInt16 getItemStackCount() { var attr = getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(attr, () => $"ItemAttributeBase is null !!"); return attr.ItemStackCount; } public virtual MetaAssets.ItemMetaData? getItemMeta() { var parent = getRootParent(); NullReferenceCheckHelper.throwIfNull(parent, () => $"parent is null !!!"); var item_attribute = getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(item_attribute, () => $"item_attribute is null !!! - {parent.toBasicString()}"); if (!MetaData.Instance._ItemTable.TryGetValue((int)item_attribute.ItemMetaId, out var found_item_meta_data)) { var err_msg = $"Not found meta of Item !!! : itemMetaId:{item_attribute.ItemMetaId} - {parent.toBasicString()}"; Log.getLogger().error(err_msg); return null; } return found_item_meta_data; } public META_ID getItemMetaId() { var parent = getRootParent(); NullReferenceCheckHelper.throwIfNull(parent, () => $"parent is null !!!"); var item_attribute = getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(item_attribute, () => $"item_attribute is null !!! - {parent.toBasicString()}"); return item_attribute.ItemMetaId; } public override string toBasicString() { return $"{this.getTypeName()}, ItemGuid:{getOriginEntityAttribute()?.ItemGuid}, ItemMetaId:{getOriginEntityAttribute()?.ItemMetaId}, ItemStackCount:{getOriginEntityAttribute()?.ItemStackCount}"; } public override string toSummaryString() { return $"{this.getTypeName()}, {getOriginEntityAttribute()?.toBasicString()}"; } } }