Files
2025-05-01 07:20:41 +09:00

419 lines
18 KiB
C#

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<Result> 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<ItemAttributeBase>();
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<Result> 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<ItemAttrib>();
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<ItemAttributeBase>();
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<UInt16> selectedAttributeIds)
{
var result = new Result();
var err_msg = string.Empty;
var parent = getRootParent();
NullReferenceCheckHelper.throwIfNull(parent, () => $"parent is null !!!");
selectedAttributeIds = new List<UInt16>();
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<ItemAttributeBase>();
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<UInt16>();
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<ItemAttributeBase>();
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<ItemAttributeBase>();
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<ItemAttributeBase>();
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<ItemAttributeBase>();
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<ItemAttributeBase>();
NullReferenceCheckHelper.throwIfNull(item_attribute, () => $"item_attribute is null !!! - {parent.toBasicString()}");
return item_attribute.ItemMetaId;
}
public override string toBasicString()
{
return $"{this.getTypeName()}, ItemGuid:{getOriginEntityAttribute<ItemAttributeBase>()?.ItemGuid}, ItemMetaId:{getOriginEntityAttribute<ItemAttributeBase>()?.ItemMetaId}, ItemStackCount:{getOriginEntityAttribute<ItemAttributeBase>()?.ItemStackCount}";
}
public override string toSummaryString()
{
return $"{this.getTypeName()}, {getOriginEntityAttribute<ItemAttributeBase>()?.toBasicString()}";
}
}
}