Files
caliverse_server/GameServer/Entity/Player/Helper/PlayerHelper.cs
2025-05-01 07:20:41 +09:00

446 lines
21 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Numerics;
using System.Text;
using System.Threading.Tasks;
using Amazon.DynamoDBv2.Model;
using Org.BouncyCastle.Tls.Crypto.Impl.BC;
using ServerCore; using ServerBase;
using ServerCommon;
using UGQDatabase.Models;
using MetaAssets;
using META_ID = System.UInt32;
namespace GameServer
{
internal static class PlayerHelper
{
public static GameActor toGameActor(this Player player)
{
var user_create_or_load_action = player.getEntityAction<UserCreateOrLoadAction>();
ArgumentNullException.ThrowIfNull(user_create_or_load_action);
var player_action = player.getEntityAction<PlayerAction>();
ArgumentNullException.ThrowIfNull(player_action);
var inventory_action = player.getEntityAction<InventoryActionBase>();
ArgumentNullException.ThrowIfNull(inventory_action);
var cloth_info = inventory_action.toClothInven4Client();
NullReferenceCheckHelper.throwIfNull(cloth_info, () => $"cloth_info is null !!!");
var location_action = player.getEntityAction<LocationAction>();
ArgumentNullException.ThrowIfNull(location_action);
var pos = location_action.getCurrentPos();
var buff_attribute = player.getOriginEntityAttribute<BuffAttribute>();
ArgumentNullException.ThrowIfNull(buff_attribute);
var account_attribute = player.getOriginEntityAttribute<AccountAttribute>();
ArgumentNullException.ThrowIfNull(account_attribute);
var user_attribute = player.getEntityAttribute<UserAttribute>();
ArgumentNullException.ThrowIfNull(user_attribute);
var item_tool_action = player.getEntityAction<ItemToolAction>();
ArgumentNullException.ThrowIfNull(item_tool_action);
GameActor game_actor = new();
game_actor.ActorGuid = player.getUserGuid();
game_actor.Name = player.getAccountId();
var selected_character = player_action.getSelectedCharacter();
if (null != selected_character)
{
var character_attribute = selected_character.getEntityAttribute<CharacterAttribute>();
ArgumentNullException.ThrowIfNull(character_attribute, $"character_attribute is null !!!");
game_actor.EntityStateInfo = character_attribute.StateInfo;
game_actor.AvatarInfo = selected_character.getOriginAppearanceProfile().toCharacterAppearanceProfile4Client();
}
else
{
game_actor.AvatarInfo = user_create_or_load_action.toSelectedCharacterAppearanceProfile4Client();
}
game_actor.ClothInfo = cloth_info.toClothInfoOfAnotherUser();
game_actor.Pos = pos;
game_actor.TattooInfoList.AddRange(inventory_action.toTattooInven4Client());
game_actor.BuffInfo = new();
game_actor.BuffInfo.Buff.AddRange(buff_attribute.toBuffData4Client());
game_actor.Usergroup = account_attribute.AuthAdminLevelType.ToString();
game_actor.Operator = (int)account_attribute.AuthAdminLevelType;
game_actor.DisplayName = player.getUserNickname();
game_actor.OccupiedAnchorGuid = user_attribute.OccupiedAnchorGuid;
game_actor.EquipInfo = item_tool_action.toToolAction4Client();
game_actor.State = (int)user_attribute.PlayerState;
game_actor.HostId = (int)player.getHostId();
return game_actor;
}
public static async Task<Result> checkRequirement(this Player player, int requirementMetaId)
{
var result = new Result();
var err_msg = string.Empty;
if (requirementMetaId == 0)
return result;
if (!MetaData.Instance._RequirementMetaTable.TryGetValue(requirementMetaId, out var requirement_meta_data))
{
err_msg = $"Failed to TryGetValue() !!! : requirementMetaId:{requirementMetaId}";
result.setFail(ServerErrorCode.RequirementMetaDataNotFound, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
foreach (var requireAttribute in requirement_meta_data.Attributes)
{
if (EnumHelper.tryParse<AttributeType>(requireAttribute.Type, out var attribute_enum) == false)
{
err_msg = $"Enum Pase Failed. AttributeType : {requireAttribute.Type}";
result.setFail(ServerErrorCode.BuffInvalidAttributeType, err_msg);
Log.getLogger().error(err_msg);
return result;
}
var ability_action = player.getEntityAction<AbilityAction>();
ArgumentNullException.ThrowIfNull(ability_action);
var attribute_value = ability_action.getAbility(attribute_enum);
if (attribute_value < requireAttribute.Value)
{
err_msg = $"Not Requirement Attribute Value:{requireAttribute.Value} : current:{attribute_value}";
result.setFail(ServerErrorCode.NotRequireAttributeValue, err_msg);
Log.getLogger().error(err_msg);
return result;
}
}
foreach (var requireItem in requirement_meta_data.Items)
{
var inventory_action = player.getEntityAction<InventoryActionBase>();
ArgumentNullException.ThrowIfNull(inventory_action);
switch (requireItem.Type)
{
case MetaAssets.ERequirementItemType.OWNS:
{
var item_count = inventory_action.getBagInven().getItemStackCountAllByMetaId((uint)requireItem.ID);
if (item_count < requireItem.Value)
{
err_msg = $"Not Requirement Item Owns ItemMetaId:{requireItem.ID} : value:{requireItem.Value} : currnet:{item_count}";
result.setFail(ServerErrorCode.NotRequireAttributeValue, err_msg);
Log.getLogger().error(err_msg);
return result;
}
}
break;
case MetaAssets.ERequirementItemType.EQUIP:
{
if (!MetaData.Instance._ItemTable.TryGetValue(requireItem.ID, out var item_meta_data))
{
err_msg = $"Failed to TryGetValue() !!! : itemMetaId:{requireItem.ID}";
result.setFail(ServerErrorCode.ItemMetaDataNotFound, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
if (item_meta_data.TypeLarge == EItemLargeType.TOOL)
{
var item_tool_action = player.getEntityAction<ItemToolAction>();
ArgumentNullException.ThrowIfNull(inventory_action);
var current_tool_item_meta_Id = item_tool_action.getCurrentToolItemMetaId();
if (current_tool_item_meta_Id != requireItem.ID)
{
err_msg = $"Not Requirement Item Equip ItemMetaId:{requireItem.ID} : currnet:{current_tool_item_meta_Id}";
result.setFail(ServerErrorCode.NotRequireAttributeValue, err_msg);
Log.getLogger().error(err_msg);
return result;
}
break;
}
var item_small_type = item_meta_data.TypeSmall;
var inven_rule = GameServerApp.getServerLogic().findRule<InventoryRule>();
if (null == inven_rule)
{
err_msg = $"Not found InventoryRule !!!";
result.setFail(ServerErrorCode.InventoryRuleNotFound, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
var equip_rule_bases = inven_rule.getEquipRuleBasesByItemLargeType(item_meta_data.TypeLarge);
if (null == equip_rule_bases)
{
err_msg = $"Not found EquipRuleBase !!! : ItemMetaId:{requireItem.ID}";
Log.getLogger().warn(err_msg);
continue;
}
foreach (var equip_rule in equip_rule_bases)
{
if (!inventory_action.getEquipInvens().TryGetValue(equip_rule.InvenEquipType, out var equip_inven_base))
{
err_msg = $"Not found EquipInven !!! : invenEquipType:{equip_rule.InvenEquipType}";
result.setFail(ServerErrorCode.EquipInvenNotFound, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
var inven_accessor = equip_inven_base as IWithInventoryAccessor;
ArgumentNullException.ThrowIfNull(inven_accessor, $"inven_accessor is null !!! - {player.toBasicString()}");
bool is_equiped = false;
foreach (var item_base in inven_accessor.getHasItemBases())
{
var item = item_base as Item;
ArgumentNullException.ThrowIfNull(item, $"item is null !!! - {player.toBasicString}");
var item_attribute = item.getOriginEntityAttribute<ItemAttributeBase>();
ArgumentNullException.ThrowIfNull(item_attribute, $"item_attribute is null !!! - {player.toBasicString}");
if (item_attribute.ItemMetaId == requireItem.ID)
{
is_equiped = true;
break;
}
}
if (false == is_equiped)
{
err_msg = $"Not found require Item !!! : ItemMetaId:{requireItem.ID} - InvenEquipType:{equip_rule.InvenEquipType}, {player.toBasicString()}";
result.setFail(ServerErrorCode.NotRequireAttributeValue, err_msg);
Log.getLogger().error(err_msg);
return result;
}
}
}
break;
case MetaAssets.ERequirementItemType.USE:
{
if (!MetaData.Instance._ItemTable.TryGetValue(requireItem.ID, out var item_meta_data))
{
err_msg = $"Failed to TryGetValue() !!! : itemMetaId:{requireItem.ID}";
result.setFail(ServerErrorCode.ItemMetaDataNotFound, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
(result, var deleted_items) = await inventory_action.tryDeleteItemByMetaId((META_ID)requireItem.ID, (ushort)requireItem.Value);
if (result.isFail())
{
err_msg = $"Failed to tryDeleteItemByMeta() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
}
break;
default:
{
err_msg = $"Requirement Item Type Error !!! : type:{requireItem.Type}";
result.setFail(ServerErrorCode.NotRequireAttributeValue, err_msg);
Log.getLogger().error(err_msg);
return result;
}
}
}
foreach (var requireQuest in requirement_meta_data.Quests)
{
var quest_id = requireQuest.Value;
switch (requireQuest.Type)
{
case MetaAssets.ERequirementQuestType.ING:
{
var quest_action = player.getEntityAction<QuestAction>();
ArgumentNullException.ThrowIfNull(quest_action);
(result, var quest_meta_all_base_info) = await QuestMetaManager.It.getQuestMeta(quest_id);
if (result.isFail()) return result;
var quest_base_info = quest_meta_all_base_info.m_quest_base_info;
NullReferenceCheckHelper.throwIfNull(quest_base_info, () => $"quest_base_info is null !!!");
if (!quest_action.checkHasQuest(quest_base_info.QuestType, quest_id))
{
err_msg = $"Not Requirement Quest Ing Value:{requireQuest.Value}";
result.setFail(ServerErrorCode.NotRequireAttributeValue, err_msg);
Log.getLogger().error(err_msg);
return result;
}
}
break;
case MetaAssets.ERequirementQuestType.COMPLETED:
{
var end_quest_action = player.getEntityAction<EndQuestAction>();
ArgumentNullException.ThrowIfNull(end_quest_action);
if (!end_quest_action.hasEndQuest(requireQuest.Value))
{
err_msg = $"Not Requirement Quest Complete Value:{requireQuest.Value}";
result.setFail(ServerErrorCode.NotRequireAttributeValue, err_msg);
Log.getLogger().error(err_msg);
return result;
}
}
break;
default:
{
err_msg = $"Not Require Attribute Value !!! : type:{requireQuest.Type}";
result.setFail(ServerErrorCode.NotRequireAttributeValue, err_msg);
Log.getLogger().error(err_msg);
return result;
}
}
}
return result;
}
public static Result checkInstanceAccess(this Player player, int instanceMetaId)
{
var result = new Result();
var err_msg = string.Empty;
if (!MetaData.Instance._IndunTable.TryGetValue(instanceMetaId, out var instance_meta_data))
{
err_msg = $"Failed to MetaData.TryGetValue() !!! : instanceMetaId:{instanceMetaId} - {player.toBasicString()}";
result.setFail(ServerErrorCode.InstanceMetaDataNotFound, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
switch (instance_meta_data.AccessType)
{
case MetaAssets.AccessType.Public:
break;
case MetaAssets.AccessType.Item:
{
var inventory_action = player.getEntityAction<InventoryActionBase>();
ArgumentNullException.ThrowIfNull(inventory_action, $"inventory_action is null !!! - {player.toBasicString()}");
// todo(sangyeob.kim) : 추후에 아이템 수량 변경 등이 필요한 경우 meta_data 에 AccessCount 항목이 필요함
var item_count = inventory_action.getItemStackCountAllByMetaId((uint)instance_meta_data.AccessId);
if (item_count < 1)
{
err_msg = $"Not Enough Instance Access Item !!! itemMetaId:{instance_meta_data.AccessId} - {player.toBasicString()}";
result.setFail(ServerErrorCode.NotExistInstanceTicket, err_msg);
// result.setFail(ServerErrorCode.InstanceAccessItemNotEnough, err_msg); // Todo(myounghwi) : 추후 에러코드 적용(클라와 이야기 필요)
Log.getLogger().error(err_msg);
return result;
}
}
break;
case MetaAssets.AccessType.Season:
{
var season_action = player.getEntityAction<SeasonPassAction>();
ArgumentNullException.ThrowIfNull(season_action, $"season_action is null !!! - {player.toBasicString()}");
if (season_action.isActivatedSeasonPass() == false)
{
err_msg = $"Not Season Period !!! - {player.toBasicString()}";
result.setFail(ServerErrorCode.SeasonPassNotAblePeriod, err_msg);
Log.getLogger().error(err_msg);
return result;
}
//AccessId가 0이면 시즌중이면 모두가 들어갈 수 있음. 1이면 시즌패스 구매자만 들어갈 수 있음.
if (instance_meta_data.AccessId == 0)
break;
var is_charged_season = season_action.isChargedSeasonPass();
if (false == is_charged_season)
{
err_msg = $"Not Charged SeasonPass Item !!! - {player.toBasicString()}";
result.setFail(ServerErrorCode.NotExistInstanceTicket, err_msg);
// result.setFail(ServerErrorCode.InstanceAccessSeasonPassNotCharged, err_msg); // Todo(myounghwi) : 추후 에러코드 적용(클라와 이야기 필요)
Log.getLogger().error(result.toBasicString());
return result;
}
}
break;
case MetaAssets.AccessType.Belong:
break;
default:
{
err_msg = $"AccessType Invalid !!! : type:{instance_meta_data.AccessType}, instanceMetaId:{instance_meta_data.Id} - {player.toBasicString()}";
result.setFail(ServerErrorCode.InstanceAccessTypeInvalid, err_msg);
Log.getLogger().error(err_msg);
return result;
}
}
return result;
}
public static async Task<Result> changeInstanceRoomIdAtLoginCache(this Player player, string instanceRoomId)
{
var result = new Result();
var err_msg = string.Empty;
var game_login_action = player.getEntityAction<GameLoginAction>();
ArgumentNullException.ThrowIfNull(game_login_action);
var login_cache_request = game_login_action.getLoginCacheRequest();
ArgumentNullException.ThrowIfNull(login_cache_request);
var login_cache = login_cache_request.getLoginCache();
ArgumentNullException.ThrowIfNull(login_cache);
login_cache.InstanceRoomId = instanceRoomId;
result = await login_cache_request.upsertLogin();
if (result.isFail())
{
err_msg = $"Failed to upsertLogin() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
return result;
}
}
}