초기커밋
This commit is contained in:
297
GameServer/Entity/Character/Action/CharacterAction.cs
Normal file
297
GameServer/Entity/Character/Action/CharacterAction.cs
Normal file
@@ -0,0 +1,297 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
using static ClientToGameMessage.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 ITEM_GUID = System.String;
|
||||
using ANCHOR_META_GUID = System.String;
|
||||
|
||||
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
public class CharacterAction : EntityActionBase
|
||||
{
|
||||
public CharacterAction(Character owner)
|
||||
: base(owner)
|
||||
{
|
||||
}
|
||||
public override async Task<Result> onInit()
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
|
||||
var result = new Result();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public override void onClear()
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
public void setStateInfo(EntityStateType stateType, ANCHOR_META_GUID anchorMetaGuid, META_ID metaId)
|
||||
{
|
||||
var owner = getOwner();
|
||||
|
||||
var character_attribute = owner.getEntityAttribute<CharacterAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(character_attribute, () => $"character_attribute is null !!!");
|
||||
|
||||
character_attribute.StateInfo.StateType = stateType;
|
||||
character_attribute.StateInfo.MetaIdOfStateType = (Int32)metaId;
|
||||
character_attribute.StateInfo.AnchorMetaGuid = anchorMetaGuid;
|
||||
}
|
||||
|
||||
public async Task<Result> tryUpdateApperanceProfile(AvatarInfo? avatarInfo, ClothInfo? clothInfo)
|
||||
{
|
||||
var character = getOwner() as Character;
|
||||
NullReferenceCheckHelper.throwIfNull(character, () => $"character is null !!!");
|
||||
|
||||
var player = character.getRootParent() as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
||||
|
||||
var user_create_or_load_action = player.getEntityAction<UserCreateOrLoadAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(user_create_or_load_action, () => $"user_create_or_load_action is null !!!");
|
||||
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
if (null == avatarInfo)
|
||||
{
|
||||
err_msg = $"AvatarInfo is null !!! - {character.toBasicString()}";
|
||||
result.setFail(ServerErrorCode.FunctionParamNull, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
if(true == isCompletedApprearance())
|
||||
{
|
||||
var character_attribute = character.getEntityAttribute<CharacterAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(character_attribute, () => $"character_attribute is null !!!");
|
||||
var appearance_profile = character_attribute.AppearanceProfileValue;
|
||||
NullReferenceCheckHelper.throwIfNull(appearance_profile, () => $"appearance_profile is null !!!");
|
||||
|
||||
err_msg = $"Already Customizing Completed !!! : currCustomizing:{appearance_profile.CustomValues} - {character.toBasicString()}";
|
||||
result.setFail(ServerErrorCode.CharacterCustomizingAlreadyCompleted, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// 1. 캐릭터 외형 정보를 갱신 한다.
|
||||
updateAppearanceProfile(avatarInfo);
|
||||
|
||||
var item_cloth_action = player.getEntityAction<ItemClothAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(item_cloth_action, () => $"server_logic is null !!!");
|
||||
|
||||
// 2. 테스트 유저가 아닌 경우 캐릭터 의상 정보를 갱신 한다.
|
||||
if (user_create_or_load_action.isTestUser() == false)
|
||||
{
|
||||
result = await item_cloth_action.tryApplyClothsByMetaId(clothInfo);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to tryApplyClothsByMetaId() !!! : {result.toBasicString()} - {character.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
NullReferenceCheckHelper.throwIfNull(server_logic, () => $"server_logic is null !!! - {player.toBasicString()}");
|
||||
|
||||
var batch = new QueryBatchEx<QueryRunnerWithDocument>( player, LogActionType.CharacterAppearanceUpdate
|
||||
, server_logic.getDynamoDbClient()
|
||||
, true);
|
||||
{
|
||||
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
|
||||
batch.addQuery(new QueryFinal(), async (_query) =>
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
|
||||
var query_batch = _query.getQueryBatch();
|
||||
NullReferenceCheckHelper.throwIfNull(query_batch, () => $"query_batch is null !!! - {player.toBasicString()}");
|
||||
var log_action = query_batch.getLogAction();
|
||||
NullReferenceCheckHelper.throwIfNull(log_action, () => $"log_action is null !!! - {player.toBasicString()}");
|
||||
|
||||
var character_attribute = character.getEntityAttribute<CharacterAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(character_attribute, () => $"character_attribute is null !!! - {player.toBasicString()}");
|
||||
|
||||
var character_log_info = new CharacterLogInfo();
|
||||
|
||||
(var result, var update_character_log_info) = await character_attribute.toCharacterLogInfo();
|
||||
NullReferenceCheckHelper.throwIfNull(update_character_log_info, () => $"update_character_log_info is null !!!");
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to toCharacterLogInfo() !!! : {result.toBasicString()} - {toBasicString()}, {player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
}
|
||||
else
|
||||
{
|
||||
character_log_info.setInfo(update_character_log_info);
|
||||
|
||||
// 비즈니스 로그 추가
|
||||
query_batch.appendBusinessLog(new CharacterBusinessLog(log_action, character_log_info));
|
||||
}
|
||||
|
||||
return QueryBatchBase.QueryResultType.Success;
|
||||
});
|
||||
}
|
||||
|
||||
result = await QueryHelper.sendQueryAndBusinessLog(batch);
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private void updateAppearanceProfile(AvatarInfo avatarInfo)
|
||||
{
|
||||
var owner = getOwner();
|
||||
NullReferenceCheckHelper.throwIfNull(owner, () => $"server_logic is null !!!");
|
||||
|
||||
if (null == avatarInfo)
|
||||
{
|
||||
var err_msg = $"AvatarInfo is null !!! - {owner.toBasicString()}";
|
||||
Log.getLogger().info(err_msg);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
var character = owner as Character;
|
||||
NullReferenceCheckHelper.throwIfNull(character, () => $"character is null !!!");
|
||||
var character_attribute = character.getEntityAttribute<CharacterAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(character_attribute, () => $"character_attribute is null !!!");
|
||||
var appearance_profile = character_attribute.AppearanceProfileValue;
|
||||
NullReferenceCheckHelper.throwIfNull(appearance_profile, () => $"appearance_profile is null !!!");
|
||||
|
||||
if (null == avatarInfo.AppearCustomize)
|
||||
{
|
||||
var err_msg = $"avatarInfo.AppearCustomize is null !!! - {owner.toBasicString()}";
|
||||
Log.getLogger().info(err_msg);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
var appearance_customize = avatarInfo.AppearCustomize;
|
||||
|
||||
appearance_profile.BasicStyle = (UInt32)appearance_customize.BasicStyle;
|
||||
appearance_profile.BodyShape = (UInt32)appearance_customize.BodyShape;
|
||||
appearance_profile.HairStyle = (UInt32)appearance_customize.HairStyle;
|
||||
appearance_profile.CustomValues = appearance_customize.CustomValues.Select(x => x).ToList();
|
||||
appearance_profile.IsCustomCompleted = true;
|
||||
|
||||
character_attribute.modifiedEntityAttribute();
|
||||
}
|
||||
|
||||
public bool isCompletedApprearance()
|
||||
{
|
||||
var character = getOwner() as Character;
|
||||
NullReferenceCheckHelper.throwIfNull(character, () => $"character is null !!!");
|
||||
|
||||
var character_attribute = character.getEntityAttribute<CharacterAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(character_attribute, () => $"character_attribute is null !!!");
|
||||
|
||||
var appearance_profile = character_attribute.AppearanceProfileValue;
|
||||
NullReferenceCheckHelper.throwIfNull(appearance_profile, () => $"appearance_profile is null !!!");
|
||||
|
||||
return appearance_profile.IsCustomCompleted;
|
||||
}
|
||||
|
||||
public void broadcastCharacterInfo()
|
||||
{
|
||||
var character = getOwner() as Character;
|
||||
NullReferenceCheckHelper.throwIfNull(character, () => $"appearanccharactere_profile is null !!!");
|
||||
|
||||
var player = character.getRootParent() as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
||||
|
||||
var game_zone_action = player.getEntityAction<GameZoneAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(game_zone_action, () => $"game_zone_action is null !!!");
|
||||
|
||||
|
||||
var curr_join_map = game_zone_action.getLinkedToMap();
|
||||
if (null == curr_join_map)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
ClientToGame to_client_msg = new();
|
||||
to_client_msg.Message = new();
|
||||
|
||||
// GS2C_NTF_PLAYER_MODIFY, 본 코드가 C/S 연동 테스트 확인 되면 ClientToGameMessage.Types.ActorModify 패킷 및 코드는 제거 해야 한다. - kangms
|
||||
to_client_msg.Message.NtfPlayerModify = new GS2C_NTF_PLAYER_MODIFY();
|
||||
|
||||
var character_attribute = character.getEntityAttribute<CharacterAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(character_attribute, () => $"character_attribute is null !!!");
|
||||
|
||||
var inventory_action = player.getEntityAction<InventoryActionBase>();
|
||||
NullReferenceCheckHelper.throwIfNull(inventory_action, () => $"inventory_action is null !!!");
|
||||
|
||||
to_client_msg.Message.NtfPlayerModify.ToModifyPlayerGuid = player.getUserGuid(); // 클라이언트는 USER_GUID를 사용 한다.
|
||||
to_client_msg.Message.NtfPlayerModify.AvatarInfo = character_attribute.AppearanceProfileValue.toCharacterAppearanceProfile4Client();
|
||||
var cloth_info = inventory_action.toClothInven4Client();
|
||||
NullReferenceCheckHelper.throwIfNull(cloth_info, () => $"cloth_info is null !!!");
|
||||
|
||||
to_client_msg.Message.NtfPlayerModify.ClothInfo = cloth_info.toClothInfoOfAnotherUser();
|
||||
to_client_msg.Message.NtfPlayerModify.EntityStateInfo = character_attribute.StateInfo;
|
||||
|
||||
curr_join_map.Broadcast(player, to_client_msg);
|
||||
}
|
||||
|
||||
public void CheatResetCompletedApprearance()
|
||||
{
|
||||
var character = getOwner() as Character;
|
||||
NullReferenceCheckHelper.throwIfNull(character, () => $"character is null !!!");
|
||||
|
||||
var character_attribute = character.getEntityAttribute<CharacterAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(character_attribute, () => $"character_attribute is null !!!");
|
||||
|
||||
var appearance_profile = character_attribute.AppearanceProfileValue;
|
||||
NullReferenceCheckHelper.throwIfNull(appearance_profile, () => $"appearance_profile is null !!!");
|
||||
|
||||
appearance_profile.IsCustomCompleted = false;
|
||||
character_attribute.modifiedEntityAttribute();
|
||||
}
|
||||
|
||||
public bool isFarming()
|
||||
{
|
||||
var character = getOwner() as Character;
|
||||
NullReferenceCheckHelper.throwIfNull(character, () => $"character is null !!!");
|
||||
|
||||
var character_attribute = character.getEntityAttribute<CharacterAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(character_attribute, () => $"character_attribute is null !!!");
|
||||
|
||||
var err_msg = string.Empty;
|
||||
|
||||
if(EntityStateType.UsingByFarming == character_attribute.StateInfo.StateType)
|
||||
{
|
||||
err_msg = $"Character state is Farming !!! : currState:{character_attribute.StateInfo.StateType} - {character.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
84
GameServer/Entity/Character/Character.cs
Normal file
84
GameServer/Entity/Character/Character.cs
Normal file
@@ -0,0 +1,84 @@
|
||||
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 ITEM_GUID = System.String;
|
||||
|
||||
|
||||
namespace GameServer
|
||||
{
|
||||
public class Character : EntityBase
|
||||
{
|
||||
public Character(Player parent)
|
||||
: base(EntityType.Character, parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override async Task<Result> onInit()
|
||||
{
|
||||
var direct_parent = getDirectParent();
|
||||
NullReferenceCheckHelper.throwIfNull(direct_parent, () => $"direct_parent is null !!!");
|
||||
|
||||
addEntityAttribute(new CharacterAttribute(this, direct_parent));
|
||||
|
||||
addEntityAction(new CharacterAction(this));
|
||||
|
||||
addEntityAction(new CharacterAppearanceCustomizeAction(this));
|
||||
|
||||
return await base.onInit();
|
||||
}
|
||||
|
||||
public async Task<Result> createByCharacterBaseDoc(CharacterBaseDoc characterBaseDoc)
|
||||
{
|
||||
var err_msg = string.Empty;
|
||||
var result = new Result();
|
||||
|
||||
var character_attribute = getEntityAttribute<CharacterAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(character_attribute, () => $"character_attribute is null !!!");
|
||||
|
||||
result = await ServerBase.DataCopyHelper.copyEntityAttributeFromDocs(character_attribute, new List<DynamoDbDocBase>() { characterBaseDoc });
|
||||
if( result.isFail() )
|
||||
{
|
||||
err_msg = $"Failed to copyEntityAttributeFromDocs() !!!, to:{character_attribute.getTypeName()}, from:{this.getTypeName()} - {toBasicString()}, {getRootParent().toBasicString()}";
|
||||
result.setFail(ServerErrorCode.DynamoDbDocCopyToEntityAttributeFailed, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public CharacterAttribute.AppearanceProfile getOriginAppearanceProfile()
|
||||
{
|
||||
var character_attribute = getOriginEntityAttribute<CharacterAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(character_attribute, () => $"character_attribute is null !!!");
|
||||
|
||||
return character_attribute.AppearanceProfileValue;
|
||||
}
|
||||
|
||||
public override string toSummaryString()
|
||||
{
|
||||
return $"{this.getTypeName()} - {getRootParent().toBasicString()}";
|
||||
}
|
||||
|
||||
public override string toBasicString()
|
||||
{
|
||||
return $"{this.getTypeName()} - {getRootParent().toBasicString()}";
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user