초기커밋

This commit is contained in:
2025-05-01 07:20:41 +09:00
commit 98bb2e3c5c
2747 changed files with 646947 additions and 0 deletions

View File

@@ -0,0 +1,948 @@
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
using static ClientToGameRes.Types;
using static ServerMessage.Types;
using SESSION_ID = System.Int32;
using WORLD_META_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 UGC_NPC_META_GUID = System.String;
using ITEM_GUID = System.String;
using INSTANCE_GUID = System.String;
namespace GameServer;
public class UgcNpcAction : EntityActionBase
{
private Map? m_map_nullable;
private bool m_is_counting_as_add_connected_user = false;
public UgcNpcAction(UgcNpc owner)
: base(owner)
{
}
public override async Task<Result> onInit()
{
return await Task.FromResult(new Result());
}
public override void onClear()
{
}
public async Task<Result> createByUgcNpcDocWithMaster(UgcNpcDoc ugcNpcDoc, Player master)
{
var owner = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
ArgumentNullReferenceCheckHelper.throwIfNull(master, () => $"master is null !!! - {owner.toBasicString()}");
var err_msg = string.Empty;
var result = new Result();
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}");
result = await ServerBase.DataCopyHelper.copyEntityAttributeFromDocs(ugc_npc_attribute, new List<DynamoDbDocBase>() { ugcNpcDoc });
if (result.isFail())
{
err_msg = $"Failed to copyEntityAttributeFromDocs() !!!, to:{ugc_npc_attribute.getTypeName()}, from:{ugcNpcDoc.getTypeName()} : {result.toBasicString()} - {owner.toBasicString()}, {master.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
result = await ensureUgcNpcBasicDocs();
if (result.isFail())
{
err_msg = $"Failed to ensureUgcNpcBasicDoc() !!! : {result.toBasicString()} - {owner.toBasicString()}, {master.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
return result;
}
private async Task<Result> ensureUgcNpcBasicDocs()
{
var owner = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var result = new Result();
var err_msg = string.Empty;
var server_logic = GameServerApp.getServerLogic();
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}");
var dynamo_db_client = server_logic.getDynamoDbClient();
{
// UgcNpcNicknameRegistryDoc이 등록이 안되어 있는 경우 등록 한다. - kangms
var ugc_npc_nickname_registry_doc = new UgcNpcNicknameRegistryDoc(OwnerEntityType.User, ugc_npc_attribute.OwnerGuid, ugc_npc_attribute.Nickname, ugc_npc_attribute.UgcNpcMetaGuid);
var ugc_npc_nickname_registry_query_config = dynamo_db_client.makeQueryConfigForReadByPKSK(ugc_npc_nickname_registry_doc.getPK(), ugc_npc_nickname_registry_doc.getSK());
(var query_result, var ugc_npc_nickname_registry_docs) = await dynamo_db_client.simpleQueryDocTypesWithQueryOperationConfig<UgcNpcNicknameRegistryDoc>(ugc_npc_nickname_registry_query_config);
if (ugc_npc_nickname_registry_docs.Count == 0)
{
query_result = await ugc_npc_nickname_registry_doc.newDoc4Query();
if(query_result.isFail())
{
err_msg = $"Failed to newDoc4Query() !!!, {ugc_npc_nickname_registry_doc.toDocTypePKSK()}"
+ $" : {query_result.toBasicString()} - {owner.toBasicString()}";
Log.getLogger().error(err_msg);
return query_result;
}
query_result = await dynamo_db_client.simpleUpsertDocumentWithDocType(ugc_npc_nickname_registry_doc);
if (query_result.isFail())
{
err_msg = $"Failed to simpleUpsertDocumentWithDocType() !!!, {ugc_npc_nickname_registry_doc.toDocTypePKSK()}"
+ $" : {query_result.toBasicString()} - {owner.toBasicString()}";
Log.getLogger().error(err_msg);
return query_result;
}
}
}
{
// UgcNpcLikeSelecteeCountDoc 등록이 안되어 있는 경우 등록 한다. - kangms
var selectee_count_doc = new UgcNpcLikeSelecteeCountDoc(OwnerEntityType.UgcNpc, ugc_npc_attribute.UgcNpcMetaGuid);
var selectee_count_query_config = dynamo_db_client.makeQueryConfigForReadByPKSK(selectee_count_doc.getPK(), selectee_count_doc.getSK());
(var query_result, var npc_like_selectee_count_docs) = await dynamo_db_client.simpleQueryDocTypesWithQueryOperationConfig<UgcNpcLikeSelecteeCountDoc>(selectee_count_query_config);
if (npc_like_selectee_count_docs.Count == 0)
{
query_result = await selectee_count_doc.newDoc4Query();
if (query_result.isFail())
{
err_msg = $"Failed to newDoc4Query() !!!, {selectee_count_doc.toDocTypePKSK()}"
+ $" : {query_result.toBasicString()} - {owner.toBasicString()}";
Log.getLogger().error(err_msg);
return query_result;
}
query_result = await dynamo_db_client.simpleUpsertDocumentWithDocType(selectee_count_doc);
if (query_result.isFail())
{
err_msg = $"Failed to simpleUpsertDocumentWithDocType() !!!, {selectee_count_doc.toDocTypePKSK()}"
+ $" : {query_result.toBasicString()} - {owner.toBasicString()}";
Log.getLogger().error(err_msg);
return query_result;
}
}
}
return result;
}
public async Task<Result> createByUgcNpcDoc(UgcNpcDoc ugcNpcDoc)
{
var owner = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var err_msg = string.Empty;
var result = new Result();
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}");
result = await ServerBase.DataCopyHelper.copyEntityAttributeFromDocs(ugc_npc_attribute, new List<DynamoDbDocBase>() { ugcNpcDoc });
if (result.isFail())
{
err_msg = $"Failed to copyEntityAttributeFromDocs() !!!, to:{ugc_npc_attribute.getTypeName()}, from:{ugcNpcDoc.getTypeName()} - {owner.toBasicStringWithMaster()}";
result.setFail(ServerErrorCode.DynamoDbDocCopyToEntityAttributeFailed, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
return result;
}
public async Task<(Result, ItemDoc?)> createItemDocByTransferOwnerFromUserItem(UserItemAttribute userItemAttribute)
{
var owner = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
ArgumentNullReferenceCheckHelper.throwIfNull(userItemAttribute, () => $"userItemAttribute is null !!! - {owner.toBasicStringWithMaster()}");
var err_msg = string.Empty;
var result = new Result();
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicString()}");
var item_doc = new ItemDoc(OwnerEntityType.UgcNpc, ugc_npc_attribute.UgcNpcMetaGuid, userItemAttribute.ItemGuid);
result = await ServerBase.DataCopyHelper.copyDocFromEntityAttributes(item_doc, new List<EntityAttributeBase>() { userItemAttribute });
if (result.isFail())
{
err_msg = $"Failed to copyDocFromEntityAttributes() !!!, to:{item_doc.getTypeName()}, from:{userItemAttribute.getTypeName()} - {owner.toBasicStringWithMaster()}";
result.setFail(ServerErrorCode.EntityAttributeCopyToDynamoDbDocFailed, err_msg);
Log.getLogger().error(result.toBasicString());
return (result, null);
}
return (result, item_doc);
}
public async Task<Result> tryTakableItemFromUser( List<ITEM_GUID> materialItemGuids, Dictionary<Int32, BoolType> tattooSlotVisibles
, Dictionary<InvenEquipType, HashSet<Int16>> reservedSlotTypes
, Player master )
{
await Task.CompletedTask;
var ugc_npc = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(ugc_npc, () => $"ugc_npc is null !!!");
ArgumentNullReferenceCheckHelper.throwIfNull(master, () => $"master is null !!!");
ArgumentNullReferenceCheckHelper.throwIfNull(materialItemGuids, () => $"materialItems is null !!! - {master.toBasicString()}");
ArgumentNullReferenceCheckHelper.throwIfNull(tattooSlotVisibles, () => $"tattooSlotVisibles is null !!! - {master.toBasicString()}");
var result = new Result();
var err_msg = string.Empty;
var user_inventory_action = master.getEntityAction<UserInventoryAction>();
NullReferenceCheckHelper.throwIfNull(user_inventory_action, () => $"user_inventory_action is null !!! - {master.toBasicString()}");
var ugc_npc_inventory_action = ugc_npc.getEntityAction<UgcNpcInventoryAction>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_inventory_action, () => $"ugc_npc_inventory_action is null !!! - {master.toBasicString()}");
//=====================================================================================
// 1. 재료 아이템 소유 관계 변경 : User => UgcNpc
//=====================================================================================
foreach (var material_item_guid in materialItemGuids)
{
var found_item = user_inventory_action.tryGetItemByItemGuid(material_item_guid);
NullReferenceCheckHelper.throwIfNull(found_item, () => $"found_item is null !!! - {master.toBasicString()}");
var item_meta = found_item.getItemMeta();
NullReferenceCheckHelper.throwIfNull(item_meta, () => $"item_meta is null !!! - {master.toBasicString()}");
var backup_item_attribute = found_item.getClonedEntityAttribute<UserItemAttribute>();
NullReferenceCheckHelper.throwIfNull(backup_item_attribute, () => $"backup_item_attribute is null !!! - {master.toBasicString()}");
(result, var deleted_item) = await user_inventory_action.tryDeleteItemByGuid(material_item_guid);
if (result.isFail())
{
return result;
}
(result, ItemDoc? to_create_item_doc_of_ugc_npc) = await backup_item_attribute.changeOwnerAndCreateItemDoc(OwnerEntityType.UgcNpc, ugc_npc.getUgcNpcMetaGuid());
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(to_create_item_doc_of_ugc_npc, () => $"to_create_item_doc_of_ugc_npc is null !!! - {master.toBasicString()}");
(result, var equipable_slot) = ugc_npc_inventory_action.getEquipableSlotOfEquipInven(item_meta, reservedSlotTypes);
if (result.isFail())
{
return result;
}
(result, _) = await ugc_npc_inventory_action.tryTakableToBagWithEquip(to_create_item_doc_of_ugc_npc, equipable_slot);
if (result.isFail())
{
return result;
}
}
//=====================================================================================
// 2. 타투 아이템 보이기/안보이기 설정
//=====================================================================================
var tattoo_inven = ugc_npc_inventory_action.getEquipInvens()[InvenEquipType.Tattoo] as TattooEquipInven;
NullReferenceCheckHelper.throwIfNull(tattoo_inven, () => $"tattoo_inven is null !!! - {master.toBasicString()}");
foreach (var each in tattooSlotVisibles)
{
var slot_index = each.Key;
var slot_visible = each.Value;
if (false == InvenEquipType.Tattoo.isEquipableTattooSlotType((TattooSlotType)slot_index, ugc_npc.getEntityType()))
{
err_msg = $"Not found TattooSlotType !!! : slotType:{slot_index} - {toBasicString()}, {master.toBasicString()}";
result.setFail(ServerErrorCode.TattooEquipRuleTattooSlotTypeNotFound, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
var custom_defined_ui_action = ugc_npc.getEntityAction<CustomDefinedUiAction>();
NullReferenceCheckHelper.throwIfNull(custom_defined_ui_action, () => $"custom_defined_ui_action is null !!! - {toBasicString()}, {master.toBasicString()}");
var tattoo_slot = (TattooSlotType)slot_index;
result = await custom_defined_ui_action.setTattooVisible(tattoo_slot, (slot_visible == BoolType.True ? true : false));
if(result.isFail())
{
return result;
}
}
return result;
}
public async Task<Result> tryRegisterCharacterWithAiChatServer(Player master)
{
var owner = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
ArgumentNullReferenceCheckHelper.throwIfNull(master, () => $"master is null !!! - {owner.toBasicString()}");
var server_logic = GameServerApp.getServerLogic();
var result = new Result();
var err_msg = string.Empty;
var ai_chat_action = master.getEntityAction<AIChatAction>();
NullReferenceCheckHelper.throwIfNull(ai_chat_action, () => $"ai_chat_action is null !!! - {master.toBasicString()}");
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}");
if(true == ugc_npc_attribute.IsRegisteredAiChatServer)
{
err_msg = $"Already registered UgcNpc to AiChatServer !!! : ugcNpcMetaGuid:{ugc_npc_attribute.UgcNpcMetaGuid}, ugcNpcNickname:{ugc_npc_attribute.Nickname}, "
+ $" - {owner?.toBasicStringWithMaster()}";
Log.getLogger().error(err_msg);
return result;
}
result = await ai_chat_action.registerCharacter(toRegisterInfoWithAiChatServer());
if (result.isFail())
{
err_msg = $"Failed to AiChatAction.registerCharacter() !!!, {result.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
ugc_npc_attribute.IsRegisteredAiChatServer = true;
ugc_npc_attribute.modifiedEntityAttribute();
(result, var ugc_npc_doc) = await ugc_npc_attribute.toDocBase();
if (result.isFail() || null == ugc_npc_doc)
{
return result;
}
var dynamo_db_client = server_logic.getDynamoDbClient();
NullReferenceCheckHelper.throwIfNull(dynamo_db_client, () => $"dynamo_db_client is null !!! - {owner?.toBasicStringWithMaster()}");
result = await dynamo_db_client.simpleUpdateDocumentWithDocType(ugc_npc_doc);
if (result.isFail())
{
err_msg = $"Failed to DynamoDbClient.simpleUpdateDocumentWithDocType() !!! : {result.toBasicString()} - {owner.toBasicStringWithMaster()}";
Log.getLogger().error(err_msg);
return result;
}
return result;
}
public async Task<Result> tryUpdateCharacterWithAiChatServer(Player master)
{
var owner = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
ArgumentNullReferenceCheckHelper.throwIfNull(master, () => $"master is null !!! - {owner.toBasicString()}");
var server_logic = GameServerApp.getServerLogic();
var result = new Result();
var err_msg = string.Empty;
var ugc_npc_action = owner.getEntityAction<UgcNpcAction>();
ArgumentNullException.ThrowIfNull(ugc_npc_action, $"ugc_npc_action is null !!! - {owner.toBasicStringWithMaster()}");
var ai_chat_action = master.getEntityAction<AIChatAction>();
NullReferenceCheckHelper.throwIfNull(ai_chat_action, () => $"ai_chat_action is null !!! - {master.toBasicString()}");
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}");
if (false == ugc_npc_attribute.IsRegisteredAiChatServer)
{
err_msg = $"Not registered UgcNpc at AiChatServer !!! : ugcNpcMetaGuid:{ugc_npc_attribute.UgcNpcMetaGuid}, ugcNpcNickname:{ugc_npc_attribute.Nickname}, "
+ $" - {owner.toBasicStringWithMaster()}";
Log.getLogger().error(err_msg);
result = await ai_chat_action.registerCharacter(ugc_npc_action.toRegisterInfoWithAiChatServer());
if (result.isFail())
{
err_msg = $"Failed to AiChatAction.registerCharacter() !!!, {result.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
}
result = await ai_chat_action.updateCharacter(ugc_npc_action.toRegisterInfoWithAiChatServer());
if (result.isFail())
{
err_msg = $"Failed to AiChatAction.updateCharacter() !!!, {result.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
ugc_npc_attribute.IsRegisteredAiChatServer = true;
ugc_npc_attribute.modifiedEntityAttribute();
(result, var ugc_npc_doc) = await ugc_npc_attribute.toDocBase();
if (result.isFail() || null == ugc_npc_doc)
{
return result;
}
var dynamo_db_client = server_logic.getDynamoDbClient();
NullReferenceCheckHelper.throwIfNull(dynamo_db_client, () => $"dynamo_db_client is null !!! - {owner?.toBasicStringWithMaster()}");
result = await dynamo_db_client.simpleUpdateDocumentWithDocType(ugc_npc_doc);
if (result.isFail())
{
err_msg = $"Failed to DynamoDbClient.simpleUpdateDocumentWithDocType() !!! : {result.toBasicString()} - {owner.toBasicStringWithMaster()}";
Log.getLogger().error(err_msg);
return result;
}
return result;
}
public async Task<(Result, UgcNpc?)> tryDelete()
{
var owner = getOwner();
var result = new Result();
// UgcNpcDoc 제거 하기
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}");
ugc_npc_attribute.deleteEntityAttribute();
// 보유중인 모든 ItemDoc 제거 하기
var ugc_npc_inventory_action = owner.getEntityAction<UgcNpcInventoryAction>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_inventory_action, () => $"ugc_npc_inventory_action is null !!! - {owner.toBasicStringWithMaster()}");
var bag_inven = ugc_npc_inventory_action.getBagInven();
NullReferenceCheckHelper.throwIfNull(bag_inven, () => $"bag_inven is null !!! - {owner.toBasicStringWithMaster()}");
(result, _) = await ugc_npc_inventory_action.tryDeleteItemAll();
if(result.isFail())
{
return (result, null);
}
return (result, owner as UgcNpc);
}
public bool isEqualUgcNpc(string toCheckUgcNpcNickname)
{
var owner = getOwner();
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}");
if (ugc_npc_attribute.Nickname == toCheckUgcNpcNickname)
{
return true;
}
return false;
}
public bool isLocatedUgcNpc()
{
var owner = getOwner();
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}");
if(EntityStateType.None == ugc_npc_attribute.State)
{
return false;
}
return true;
}
public async Task<Result> tryLocateInGameZone(Map toLocateMap, INSTANCE_GUID instanceGuid = "")
{
var ugc_npc = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(ugc_npc, () => $"ugc_npc is null !!!");
var result = new Result();
var err_msg = string.Empty;
if (true == isLinkedToMap())
{
var curr_map = getLinkedToMap();
NullReferenceCheckHelper.throwIfNull(curr_map, () => $"curr_map is null !!! - {ugc_npc.toBasicStringWithMaster()}");
err_msg = $"Entity is linked to Map !!! : currMap:{curr_map.toBasicString()} - InstanceGuid:{instanceGuid}, {ugc_npc.toBasicStringWithMaster()}";
result.setFail(ServerErrorCode.EntityLinkedToMap, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
var linked_map = setLinkToMap(toLocateMap);
result = await linked_map.tryLocateUgcNpc(ugc_npc);
if(result.isFail())
{
return result;
}
var ugc_npc_attribute = ugc_npc.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {ugc_npc.toBasicStringWithMaster()}");
ugc_npc_attribute.LocatedInstanceGuid = instanceGuid;
ugc_npc_attribute.LocatedInstanceMetaId = (UInt32)linked_map.MapMId;
return result;
}
public async Task<Result> tryRemoveInGameZone()
{
var ugc_npc = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(ugc_npc, () => $"ugc_npc is null !!!");
var result = new Result();
var err_msg = string.Empty;
if (false == isLinkedToMap())
{
err_msg = $"Enity not linked to Map !!! - {ugc_npc.toBasicStringWithMaster()}";
result.setFail(ServerErrorCode.EntityNotLinkedToMap, err_msg);
return result;
}
var linked_to_map = getLinkedToMap();
NullReferenceCheckHelper.throwIfNull(linked_to_map, () => $"linked_to_map is null !!! - {ugc_npc.toBasicStringWithMaster()}");
result = await linked_to_map.tryRemoveUgcNpc(ugc_npc);
if(result.isFail())
{
return result;
}
unlinkToMap();
var ugc_npc_attribute = ugc_npc.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {ugc_npc.toBasicStringWithMaster()}");
ugc_npc_attribute.LocatedInstanceGuid = string.Empty;
ugc_npc_attribute.LocatedInstanceMetaId = 0;
return result;
}
public bool isLinkedToMap()
{
if (null != m_map_nullable)
{
return true;
}
return false;
}
private void unlinkToMap()
{
m_map_nullable = null;
}
private Map setLinkToMap(Map toLinkMap)
{
var owner = getOwner();
m_map_nullable = toLinkMap;
return m_map_nullable;
}
public Map? getLinkedToMap()
{
return m_map_nullable;
}
public void modifyStateInfo(EntityStateType entityStateType, EntityPos currPos, string anchorMetaGuid = "", META_ID metaId = 0, bool isApplyDb = true)
{
var owner = getOwner();
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicString()}");
ugc_npc_attribute.State = entityStateType;
ugc_npc_attribute.AnchorMetaGuid = anchorMetaGuid;
ugc_npc_attribute.MetaIdOfEntityStateType = metaId;
ugc_npc_attribute.setCurrentPos(currPos);
if (true == isApplyDb)
{
ugc_npc_attribute.modifiedEntityAttribute();
}
}
public void resetPos(bool isApplyDb = true)
{
var owner = getOwner();
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicString()}");
ugc_npc_attribute.State = EntityStateType.None;
ugc_npc_attribute.AnchorMetaGuid = string.Empty;
ugc_npc_attribute.MetaIdOfEntityStateType = 0;
ugc_npc_attribute.setCurrentPos(new EntityPos());
ugc_npc_attribute.LocatedInstanceGuid = string.Empty;
ugc_npc_attribute.LocatedInstanceMetaId = 0;
if (true == isApplyDb)
{
ugc_npc_attribute.modifiedEntityAttribute();
}
}
public void updateUgcNpcCompact(GS2MQS_NTF_BEACON_COMPACT_SYNC ugcNpcCompactSync)
{
var owner = getOwner();
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
ArgumentNullReferenceCheckHelper.throwIfNull(ugcNpcCompactSync, () => $"ugcNpcCompactSync is null !!! - {owner.toBasicString()}");
var ugc_npc_compact = ugcNpcCompactSync.UgcNpcCompact;
ArgumentNullReferenceCheckHelper.throwIfNull(ugc_npc_compact, () => $"ugc_npc_compact is null !!! - {owner.toBasicString()}");
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicString()}");
var ugc_npc_attribute_origin = owner.getOriginEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute_origin, () => $"ugc_npc_attribute_origin is null !!! - {owner.toBasicString()}");
var entity_state_info = ugc_npc_compact.EntityStateInfo;
NullReferenceCheckHelper.throwIfNull(entity_state_info, () => $"entity_state_info is null !!! - {owner.toBasicString()}");
var state_type = ugc_npc_compact.EntityStateInfo.StateType;
var anchor_meta_guid = ugc_npc_compact.EntityStateInfo.AnchorMetaGuid;
var meta_id = (UInt32)ugc_npc_compact.EntityStateInfo.MetaIdOfStateType;
var curr_pos = EntityStateType.None == state_type ? new EntityPos() : ugc_npc_attribute.getCurrentPos();
modifyStateInfo(ugc_npc_compact.EntityStateInfo.StateType, curr_pos, anchor_meta_guid, meta_id, false);
var located_instance_context = ugc_npc_compact.LocatedInstanceContext;
NullReferenceCheckHelper.throwIfNull(located_instance_context, () => $"located_instance_context is null !!! - {owner.toBasicString()}");
ugc_npc_attribute.LocatedInstanceGuid = ugcNpcCompactSync.LocatedInstanceGuid;
ugc_npc_attribute.LocatedInstanceMetaId = (UInt32)located_instance_context.LocatedinstanceMetaId;
ugc_npc_attribute_origin.onMerge(ugc_npc_attribute);
}
public EntityPos makeToLocatePosition( System.Numerics.Vector3 basePos, System.Numerics.Vector3 baseRotation
, System.Numerics.Vector3 deltaPos, float deltaAngle )
{
// X축, Y축 Z축에 대한 회전을 순차적으로 적용
var rotated_vector = MapHelper.applyRotation(deltaPos, baseRotation);
var rotated_vector_with_unreal = new System.Numerics.Vector3(rotated_vector.Y, rotated_vector.X, rotated_vector.Z);
// 새로운 위치 계산
var new_position = basePos + rotated_vector_with_unreal;
EntityPos current_pos = new EntityPos();
current_pos.X = new_position.X;
current_pos.Y = new_position.Y;
current_pos.Z = new_position.Z;
current_pos.FacingAngle = baseRotation.Y + deltaAngle;
return current_pos;
}
public EntityPos makeToLocatePosition( System.Numerics.Vector3 basePos, double pitch, double yaw, double roll
, System.Numerics.Vector3 deltaPos, double deltaAngle )
{
// X축, Y축 Z축 <=> Pitch, Yaw, Roll 적용
//var euler_vector = MapHelper.applyRotationFromYawPitchRoll(deltaPos, (float)yaw, (float)pitch, (float)roll);
//var rotated_vector_with_unreal = new System.Numerics.Vector3(euler_vector.Y, euler_vector.X, euler_vector.Z);
var euler_vector = MapHelper.applyRotationFromYawPitchRoll(deltaPos, (float)pitch, (float)roll, (float)yaw);
var rotated_vector_with_unreal = euler_vector;
// 새로운 위치 계산
var new_position = basePos + rotated_vector_with_unreal;
EntityPos current_pos = new EntityPos();
current_pos.X = new_position.X;
current_pos.Y = new_position.Y;
current_pos.Z = new_position.Z;
current_pos.FacingAngle = (float)(yaw + deltaAngle);
return current_pos;
}
public EntityStateType getCurrentEntityStateType()
{
var owner = getOwner();
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicString()}");
return ugc_npc_attribute.State;
}
public AIChatRegisterCharacter toRegisterInfoWithAiChatServer()
{
var owner = getOwner();
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}");
EGenderType gender = EGenderType.MALE;
if (MetaData.Instance._ItemTable.TryGetValue((int)ugc_npc_attribute.BodyItemMetaId, out var item_meta_data) == true)
{
gender = item_meta_data.Gender;
if(gender == EGenderType.ALL)
gender = EGenderType.MALE;
}
var to_register_ai_chat_server = new AIChatRegisterCharacter();
to_register_ai_chat_server.guid = ugc_npc_attribute.UgcNpcMetaGuid;
to_register_ai_chat_server.ownerUserGuid = ugc_npc_attribute.OwnerGuid;
to_register_ai_chat_server.lang = ugc_npc_attribute.LanguageType.ToString().ToLower();
to_register_ai_chat_server.name = ugc_npc_attribute.Nickname;
to_register_ai_chat_server.persona = UgcNpcHelper.toPersonaWithJsonString(ugc_npc_attribute.WorldScenario, ugc_npc_attribute.Description);
to_register_ai_chat_server.firstMes = ugc_npc_attribute.Greeting;
to_register_ai_chat_server.shortDesc = ugc_npc_attribute.Introduction;
to_register_ai_chat_server.tags = ugc_npc_attribute.HashTagMetaIds;
to_register_ai_chat_server.isOfficial = false;
to_register_ai_chat_server.socialActionConfig = UgcNpcHelper.toSocialActionConfigWithAIChatServer( ugc_npc_attribute.DefaultSocialActionMetaId, ugc_npc_attribute.HabitSocialActionMetaIds );
to_register_ai_chat_server.attributes.gender = (int)gender;
return to_register_ai_chat_server;
}
public bool isCountingAsAddConnectedUser() => m_is_counting_as_add_connected_user;
public void setCountingAsConnectedUser(bool isCounting) => m_is_counting_as_add_connected_user = isCounting;
public EntityPos getCurrentPos()
{
var owner = getOwner();
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}");
return ugc_npc_attribute.getCurrentPos();
}
public UgcNpcEntity toUgcNpcEntity()
{
var owner = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}");
var ugc_npc_entity = new UgcNpcEntity();
ugc_npc_entity.EntityInstantGuid = owner.getUgcNpcMetaGuid();
ugc_npc_entity.CurrentPos = ugc_npc_attribute.getCurrentPos().toPos();
ugc_npc_entity.UgcNpcAppearance = toUgcNpcAppearancec();
return ugc_npc_entity;
}
public UgcNpcSummary toUgcNpcSummary()
{
var owner = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}");
var ability_action = owner.getEntityAction<AbilityAction>();
NullReferenceCheckHelper.throwIfNull(ability_action, () => $"ability_action is null !!! - {owner.toBasicStringWithMaster()}");
var ugc_npc_beacon_shop_action = owner.getEntityAction<UgcNpcBeaconShopAction>();
var ugc_summary = new UgcNpcSummary();
ugc_summary.UgcNpcMetaGuid = ugc_npc_attribute.UgcNpcMetaGuid;
ugc_summary.OwnerUserGuid = ugc_npc_attribute.OwnerGuid;
ugc_summary.Title = ugc_npc_attribute.Title;
ugc_summary.Nickname = ugc_npc_attribute.Nickname;
ugc_summary.Greeting = ugc_npc_attribute.Greeting;
ugc_summary.Introduction = ugc_npc_attribute.Introduction;
ugc_summary.Abilities = ability_action.toAbilityInfo();
ugc_summary.BodyItemMetaId = (Int32)ugc_npc_attribute.BodyItemMetaId;
ugc_summary.HashTagMetaIds.Add(ugc_npc_attribute.HashTagMetaIds.Select<META_ID, Int32>(x => (Int32)x).ToList());
ugc_summary.Description = ugc_npc_attribute.Description;
ugc_summary.WorldScenario = ugc_npc_attribute.WorldScenario;
ugc_summary.DefaultSocialActionId = (Int32)ugc_npc_attribute.DefaultSocialActionMetaId;
ugc_summary.HabitSocialActionIds.AddRange(ugc_npc_attribute.HabitSocialActionMetaIds.ConvertAll<Int32>(Convert.ToInt32));
ugc_summary.DialogueSocialActionIds.AddRange(ugc_npc_attribute.DialogueSocialActionMetaIds.ConvertAll<Int32>(Convert.ToInt32));
var entity_state_info = new EntityStateInfo();
entity_state_info.StateType = ugc_npc_attribute.State;
entity_state_info.AnchorMetaGuid = ugc_npc_attribute.AnchorMetaGuid;
entity_state_info.MetaIdOfStateType = (Int32)ugc_npc_attribute.MetaIdOfEntityStateType;
ugc_summary.EntityStateInfo = entity_state_info;
var located_instance_context = new LocatedInstanceContext();
ugc_summary.LocatedInstanceContext = located_instance_context;
located_instance_context.LocatedinstanceMetaId = (Int32)ugc_npc_attribute.LocatedInstanceMetaId;
var appearance_customize_action = owner.getEntityAction<BeaconAppearanceCustomizeAction>();
NullReferenceCheckHelper.throwIfNull(appearance_customize_action, () => $"appearance_customize_action is null !!! - {owner.toBasicStringWithMaster()}");
ugc_summary.AppearCustomize = appearance_customize_action.toAppearanceCustomization();
var ugc_npc_origin_doc = ugc_npc_attribute.getOriginDocBase<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_origin_doc, () => $"ugc_npc_origin_doc is null !!! - {owner.toBasicStringWithMaster()}");
ugc_summary.CreatedTime = ugc_npc_origin_doc.getCreatedDateTime().ProcessedTime.ToTimestamp();
ugc_summary.HasBeaconShopItem = ugc_npc_beacon_shop_action.hasBeaconShopItem() == true ? BoolType.True : BoolType.False;
ugc_summary.HasReceivePayment = BoolType.False;
var masterEntity = owner.onGetMasterEntity();
if (masterEntity != null)
{
var beacon_shop_action = masterEntity.getEntityAction<BeaconShopAction>();
if (beacon_shop_action != null)
ugc_summary.HasReceivePayment = beacon_shop_action.hasBeaconShopSoldRecord(ugc_summary.UgcNpcMetaGuid) == true ? BoolType.True : BoolType.False;
}
return ugc_summary;
}
public UgcNpcInteraction toUgcNpcInteraction(BoolType isCheckLikeFlag)
{
var owner = getOwner();
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}");
var ugc_npc_interaction = new UgcNpcInteraction();
ugc_npc_interaction.UgcNpcMetaGuid = ugc_npc_attribute.UgcNpcMetaGuid;
ugc_npc_interaction.OwnerUserGuid = ugc_npc_attribute.OwnerGuid;
ugc_npc_interaction.IsCheckLikeFlag = isCheckLikeFlag;
return ugc_npc_interaction;
}
public UgcNpcAppearance toUgcNpcAppearancec()
{
var owner = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}");
var ability_action = owner.getEntityAction<AbilityAction>();
NullReferenceCheckHelper.throwIfNull(ability_action, () => $"ability_action is null !!! - {owner.toBasicStringWithMaster()}");
var ugc_npc_beacon_shop_action = owner.getEntityAction<UgcNpcBeaconShopAction>();
var ugc_npc_appearance = new UgcNpcAppearance();
ugc_npc_appearance.UgcNpcMetaGuid = ugc_npc_attribute.UgcNpcMetaGuid;
ugc_npc_appearance.OwnerUserGuid = ugc_npc_attribute.OwnerGuid;
ugc_npc_appearance.BodyItemMetaId = (Int32)ugc_npc_attribute.BodyItemMetaId;
ugc_npc_appearance.Title = ugc_npc_attribute.Title;
ugc_npc_appearance.Nickname = ugc_npc_attribute.Nickname;
ugc_npc_appearance.Abilities = ability_action.toAbilityInfo();
ugc_npc_appearance.HasItems = toUgcNpcItems();
ugc_npc_appearance.DefaultSocialActionId = (Int32)ugc_npc_attribute.DefaultSocialActionMetaId;
ugc_npc_appearance.HabitSocialActionIds.AddRange(ugc_npc_attribute.HabitSocialActionMetaIds.Select<META_ID, Int32>(x => (Int32)x).ToList());
ugc_npc_appearance.DialogueSocialActionIds.AddRange(ugc_npc_attribute.DialogueSocialActionMetaIds.Select<META_ID, Int32>(x => (Int32)x).ToList());
var appearance_customize_action = owner.getEntityAction<BeaconAppearanceCustomizeAction>();
NullReferenceCheckHelper.throwIfNull(appearance_customize_action, () => $"appearance_customize_action is null !!! - {owner.toBasicStringWithMaster()}");
ugc_npc_appearance.AppearCustomize = appearance_customize_action.toAppearanceCustomization();
var entity_state_info = new EntityStateInfo();
entity_state_info.StateType = ugc_npc_attribute.State;
entity_state_info.AnchorMetaGuid = ugc_npc_attribute.AnchorMetaGuid;
entity_state_info.MetaIdOfStateType = (Int32)ugc_npc_attribute.MetaIdOfEntityStateType;
ugc_npc_appearance.EntityStateInfo = entity_state_info;
ugc_npc_appearance.HasBeaconShopItem = ugc_npc_beacon_shop_action.hasBeaconShopItem() == true ? BoolType.True : BoolType.False;
return ugc_npc_appearance;
}
public UgcNpcCompact toUgcNpcCompact()
{
var owner = getOwner();
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var ugc_npc_attribute = owner.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!! - {owner.toBasicStringWithMaster()}");
var ability_action = owner.getEntityAction<AbilityAction>();
NullReferenceCheckHelper.throwIfNull(ability_action, () => $"ability_action is null !!! - {owner.toBasicStringWithMaster()}");
var ugc_npc_compact = new UgcNpcCompact();
ugc_npc_compact.UgcNpcMetaGuid = ugc_npc_attribute.UgcNpcMetaGuid;
ugc_npc_compact.OwnerUserGuid = ugc_npc_attribute.OwnerGuid;
ugc_npc_compact.Title = ugc_npc_attribute.Title;
ugc_npc_compact.Nickname = ugc_npc_attribute.Nickname;
ugc_npc_compact.BodyItemMetaId = (Int32)ugc_npc_attribute.BodyItemMetaId;
var entity_state_info = new EntityStateInfo();
entity_state_info.StateType = ugc_npc_attribute.State;
entity_state_info.AnchorMetaGuid = ugc_npc_attribute.AnchorMetaGuid;
entity_state_info.MetaIdOfStateType = (Int32)ugc_npc_attribute.MetaIdOfEntityStateType;
ugc_npc_compact.EntityStateInfo = entity_state_info;
var located_instance_context = new LocatedInstanceContext();
ugc_npc_compact.LocatedInstanceContext = located_instance_context;
located_instance_context.LocatedinstanceMetaId = (Int32)ugc_npc_attribute.LocatedInstanceMetaId;
var ugc_npc_origin_doc = ugc_npc_attribute.getOriginDocBase<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_origin_doc, () => $"ugc_npc_origin_doc is null !!! - {owner.toBasicStringWithMaster()}");
ugc_npc_compact.CreatedTime = ugc_npc_origin_doc.getCreatedDateTime().ProcessedTime.ToTimestamp();
return ugc_npc_compact;
}
public UgcNpcItems toUgcNpcItems()
{
var owner = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var ugc_npc_inventory_action = owner.getEntityAction<UgcNpcInventoryAction>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_inventory_action, () => $"ugc_npc_inventory_action is null !!! - {owner.toBasicStringWithMaster()}");
var ugc_npc_items = new UgcNpcItems();
ugc_npc_items.HasItems.Add(ugc_npc_inventory_action.toItemAll4Client().toMapField());
ugc_npc_items.HasTattooInfos.Add(ugc_npc_inventory_action.toTattooAll4Client().toMapField());
return ugc_npc_items;
}
}

View File

@@ -0,0 +1,185 @@
using System.Collections.Concurrent;
using ServerCommon;
using ServerCore; using ServerBase;
using ITEM_GUID = System.String;
using Newtonsoft.Json;
namespace GameServer
{
public class UgcNpcBeaconShopAction : EntityActionBase
{
private bool m_isUpdateBeaconShopItem = false;
private ConcurrentDictionary<ITEM_GUID, BeaconShopItem> m_beaconShopItems = new ConcurrentDictionary<ITEM_GUID, BeaconShopItem>();
public UgcNpcBeaconShopAction(UgcNpc owner)
: base(owner)
{
}
public override async Task<Result> onInit()
{
return await Task.FromResult(new Result());
}
public override void onClear()
{
}
public async Task<Result> ReloadBeaconShopInventoryFromDb()
{
var result = new Result();
var err_msg = string.Empty;
var ugc_npc = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(ugc_npc, () => $"ugc_npc is null !!! - {toBasicString()}");
if (m_isUpdateBeaconShopItem == false)
{
return result;
}
var server_logic = GameServerApp.getServerLogic();
NullReferenceCheckHelper.throwIfNull(server_logic, () => $"server_logic is null !!! - {toBasicString()}");
var dbClient = server_logic.getDynamoDbClient();
var ugcNpcMetaGuid = ugc_npc.getUgcNpcMetaGuid();
if (ugcNpcMetaGuid == string.Empty)
{
result.setFail(ServerErrorCode.BeaconShopFailedReloadBeaconShopInven);
return result;
}
(result, var make_primary_key) = await DynamoDBDocBaseHelper.makePrimaryKey<BeaconShopItemDoc>(ugcNpcMetaGuid);
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(make_primary_key, () => $"make_primary_key is null !!! - {toBasicString()}");
var beacon_shop_item_query_config = dbClient.makeQueryConfigForReadByPKOnly(make_primary_key.PK);
(var beacon_shop_item_result, var beacon_shop_item_read_docs) = await dbClient.simpleQueryDocTypesWithQueryOperationConfig<BeaconShopItemDoc>(beacon_shop_item_query_config);
if (beacon_shop_item_result.isFail() || beacon_shop_item_read_docs == null)
{
result.setFail(ServerErrorCode.BeaconShopFailedReloadBeaconShopInven);
return result;
}
m_beaconShopItems.Clear();
foreach (var read_doc in beacon_shop_item_read_docs)
{
var beacon_shop_item_attrib = read_doc.getAttrib<BeaconShopItemAttrib>();
NullReferenceCheckHelper.throwIfNull(beacon_shop_item_attrib, () => $"beacon_shop_item_attrib is null !!! - {toBasicString()}");
if(beacon_shop_item_attrib.ItemStackCount == 0)
{
await dbClient.simpleDeleteDocumentWithDocType(read_doc);
continue;
}
(result, var beaconShopItem) = await BeaconShopItem.createBeaconShopFromDoc(ugc_npc, read_doc);
if (result.isFail() || beaconShopItem == null)
{
return result;
}
var beacon_shop_item_attribute = beaconShopItem.getEntityAttribute<BeaconShopItemAttribute>();
NullReferenceCheckHelper.throwIfNull(beacon_shop_item_attribute, () => $"beacon_shop_item_attribute is null !!! - {toBasicString()}");
m_beaconShopItems.TryAdd(beacon_shop_item_attribute.ItemGuid, beaconShopItem);
}
m_isUpdateBeaconShopItem = false;
return result;
}
public async Task<Result> addBeaconShopItem(BeaconShopItemDoc beaconShopItemDoc)
{
var result = new Result();
var err_msg = string.Empty;
var ugc_npc = getOwner() as UgcNpc;
NullReferenceCheckHelper.throwIfNull(ugc_npc, () => $"ugc_npc is null !!! - {toBasicString()}");
var beacon_shop_item_attrib = beaconShopItemDoc.getAttrib<BeaconShopItemAttrib>();
NullReferenceCheckHelper.throwIfNull(beacon_shop_item_attrib, () => $"beacon_shop_item_attrib is null !!! - {toBasicString()}");
if (beacon_shop_item_attrib.ItemStackCount == 0)
{
var server_logic = GameServerApp.getServerLogic();
NullReferenceCheckHelper.throwIfNull(server_logic, () => $"server_logic is null !!! - {toBasicString()}");
var dbClient = server_logic.getDynamoDbClient();
await dbClient.simpleDeleteDocumentWithDocType(beaconShopItemDoc);
return result;
}
if (m_beaconShopItems.TryGetValue(beacon_shop_item_attrib.ItemGuid, out var beaconShopItem) == true)
{
err_msg = $"Found duplicated Item from BeaconShopItemDoc !!! : duplicatedItem:{beaconShopItem.toBasicString()} - {beaconShopItemDoc.toBasicString()}, {toBasicString()}";
result.setFail(ServerErrorCode.ItemDocLoadDuplicatedItem, err_msg);
return result;
}
(result, var new_beacon_shop_item) = await BeaconShopItem.createBeaconShopFromDoc(ugc_npc, beaconShopItemDoc);
if (result.isFail() || new_beacon_shop_item == null)
{
err_msg = $"Failed to create Item !!! : {result.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
m_beaconShopItems.TryAdd(beacon_shop_item_attrib.ItemGuid, new_beacon_shop_item);
return result;
}
public void addBeaconShopItem(ITEM_GUID itemGuid, BeaconShopItem beaconShopItem)
{
m_beaconShopItems.TryAdd(itemGuid, beaconShopItem);
}
public void removeBeaconShopItem(ITEM_GUID itemGuid)
{
m_beaconShopItems.TryRemove(itemGuid, out var beaconShopItem);
writeBeaconShopItemLog("removeBeaconShopItem");
}
public List<BeaconShopItem> getHasBeaconShopItem()
{
return m_beaconShopItems.Select(x => x.Value).ToList();
}
public BeaconShopItem? getBeaconShopItem(ITEM_GUID itemGuid)
{
if (m_beaconShopItems.TryGetValue(itemGuid, out var beaconShopItem) == false)
{
writeBeaconShopItemLog("Failed getBeaconShopItem");
return null;
}
return beaconShopItem;
}
public void writeBeaconShopItemLog(string function)
{
var item_list = string.Empty;
foreach (var item in m_beaconShopItems.Values)
{
var str = JsonConvert.SerializeObject(item.getEntityAttribute<BeaconShopItemAttribute>());
item_list += $"{str},";
}
Log.getLogger().Debug($"BeaconShop - {function}, Selling items : {item_list}");
}
public bool hasBeaconShopItem()
{
return m_beaconShopItems.Count > 0 ? true : false;
}
public void setUpdateBeaconShopItem()
{
m_isUpdateBeaconShopItem = true;
}
}
}

View File

@@ -0,0 +1,177 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ServerCore; using ServerBase;
using ServerCommon;
using SESSION_ID = System.Int32;
using WORLD_META_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 UGC_NPC_META_GUID = System.String;
using ITEM_GUID = System.String;
using MASTER_GUID = System.String;
using static ClientToGameReq.Types;
using Amazon.S3.Model;
using System.Collections.Concurrent;
namespace GameServer
{
public class UgcNpc : EntityBase, IMergeWithInventory
{
public UgcNpc(MASTER_GUID masterGuid)
: base(EntityType.UgcNpc, masterGuid)
{ }
public override async Task<Result> onInit()
{
addEntityAttribute(new UgcNpcAttribute(this));
addEntityAttribute(new AppearanceCustomizeAttribute(this));
addEntityAttribute(new BeaconShopProfileAttribute(this));
addEntityAction(new UgcNpcAction(this));
addEntityAction(new UgcNpcEditAction(this));
addEntityAction(new AbilityAction(this));
addEntityAction(new UgcNpcInventoryAction(this));
addEntityAction(new ItemClothAction(this));
addEntityAction(new ItemTattooAction(this));
addEntityAction(new BeaconAppearanceCustomizeAction(this));
addEntityAction(new CustomDefinedUiAction(this));
// 현재 GameZoneAction은 Player를 위한 로직으로 작성되어 있다.
// 추후 인던 관련 설계가 리펙토링되면 GameZoneAction 역시 계층화 되어야 한다. - kangms
addEntityAction(new GameZoneAction(this));
addEntityAction(new FarmingAction(this));
addEntityAction(new UgcNpcBeaconShopAction(this));
return await base.onInit();
}
public async Task<Result> onMerge(List<ReservedSlotOnInven> reservedSlotOnInvens, TransactionRunner transactionRunner)
{
var result = new Result();
var ugc_inventory_action = getEntityAction<UgcNpcInventoryAction>();
NullReferenceCheckHelper.throwIfNull(ugc_inventory_action, () => $"ugc_inventory_action is null !!! - {toBasicStringWithMaster()}");
ArgumentNullReferenceCheckHelper.throwIfNull(transactionRunner, () => $"transactionRunner is null !!! - {toBasicStringWithMaster()}");
result = await ugc_inventory_action.onMergeInventory(reservedSlotOnInvens, transactionRunner);
if (result.isFail())
{
return result;
}
return result;
}
public override EntityBase? onGetMasterEntity()
{
if(false == hasMasterGuid())
{
return null;
}
var err_msg = string.Empty;
var master_guid = getMasterGuid();
var server_logc = GameServerApp.getServerLogic();
var player_manager = server_logc.getPlayerManager();
if(false == player_manager.tryGetUserByPrimaryKey(master_guid, out var found_player))
{
return null;
}
return found_player;
}
public override TAction getEntityAction<TAction>()
{
TAction? to_cast_entity_atcion;
if (typeof(TAction) == typeof(InventoryActionBase))
{
to_cast_entity_atcion = base.getEntityAction<UgcNpcInventoryAction>() as TAction;
NullReferenceCheckHelper.throwIfNull(to_cast_entity_atcion, () => $"to_cast_action is null !!!");
return to_cast_entity_atcion;
}
to_cast_entity_atcion = base.getEntityAction<TAction>();
NullReferenceCheckHelper.throwIfNull(to_cast_entity_atcion, () => $"to_cast_entity_atcion is null !!!");
return to_cast_entity_atcion;
}
public override Type onGetAvailableItemAttributeType()
{
return typeof(UgcNpcItemAttribute);
}
public override OWNER_GUID onGetGuidOfOwnerEntityType()
{
return getMasterGuid();
}
public override OwnerEntityType onGetOwnerEntityType()
{
return OwnerEntityType.User;
}
public override string onGetDbGuid()
{
return getUgcNpcMetaGuid();
}
public UGC_NPC_META_GUID getUgcNpcMetaGuid()
{
return getEntityAttributeWithReadOnly<UgcNpcAttribute>()?.UgcNpcMetaGuid ?? string.Empty;
}
public override string toStateString()
{
return $"beaconState:{getEntityAttributeWithReadOnly<UgcNpcAttribute>()?.State}"
+ $", metaIdOfEntityStateType:{getOriginEntityAttribute<UgcNpcAttribute>()?.MetaIdOfEntityStateType}"
+ $", locatedInstanceGuid:{getOriginEntityAttribute<UgcNpcAttribute>()?.LocatedInstanceGuid}"
+ $", LocatedInstanceMetaId:{getOriginEntityAttribute<UgcNpcAttribute>()?.LocatedInstanceMetaId}";
}
public override string toSummaryString()
{
return $"beaconState:{getOriginEntityAttribute<UgcNpcAttribute>()?.State}"
+ $", anchorMetaGuid:{getOriginEntityAttribute<UgcNpcAttribute>()?.AnchorMetaGuid}"
+ $", metaIdOfEntityStateType:{getOriginEntityAttribute<UgcNpcAttribute>()?.MetaIdOfEntityStateType}"
+ $", locatedInstanceGuid:{getOriginEntityAttribute<UgcNpcAttribute>()?.LocatedInstanceGuid}"
+ $", LocatedInstanceMetaId:{getOriginEntityAttribute<UgcNpcAttribute>()?.LocatedInstanceMetaId}"
+ $", MasterGuid:{getMasterGuid()}, SummonedCount:{getSummenedEntityGuids().Count}";
}
public override string toBasicString()
{
return $"beaconNickname:{getOriginEntityAttribute<UgcNpcAttribute>()?.Nickname}"
+ $", ugcNpcMetaGuid:{getOriginEntityAttribute<UgcNpcAttribute>()?.UgcNpcMetaGuid}"
+ $", ownerGuid:{getOriginEntityAttribute<UgcNpcAttribute>()?.OwnerGuid}"
+ $", ownerEntityType:{getOriginEntityAttribute<UgcNpcAttribute>()?.OwnerEntityType}"
+ $", {base.toBasicString()}";
}
}
}