419 lines
18 KiB
C#
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()}";
|
|
}
|
|
}
|
|
}
|