Files
caliverse_server/GameServer/Contents/Craft/Action/CraftRecipeAction.cs
2025-05-01 07:20:41 +09:00

120 lines
3.9 KiB
C#

using Amazon.S3.Model.Internal.MarshallTransformations;
using ServerCommon;
using ServerCore; using ServerBase;
using System.Collections.Concurrent;
using META_ID = System.UInt32;
namespace GameServer
{
public class CraftRecipeAction : EntityActionBase
{
private ConcurrentDictionary<META_ID, CraftRecipe> m_Recipes = new();
public CraftRecipeAction(Player owner)
: base(owner)
{
}
public override Task<Result> onInit()
{
var result = new Result();
return Task.FromResult(result);
}
public override void onClear()
{
m_Recipes.Clear();
}
public List<META_ID> getRecipeMetaIds()
{
var recipe_meta_ids = new List<META_ID>();
foreach (var recipe in m_Recipes.Values)
{
var recipe_attribute = recipe.getEntityAttribute<CraftRecipeAttribute>();
NullReferenceCheckHelper.throwIfNull(recipe_attribute, () => $"recipe_attribute is null !!!");
recipe_meta_ids.Add(recipe_attribute.CraftMetaId);
}
return recipe_meta_ids;
}
public async Task<Result> AddRecipeFromDocs(List<CraftRecipeDoc> recipeDocs)
{
var result = new Result();
var err_msg = string.Empty;
var player = getOwner() as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
foreach (var recipe_doc in recipeDocs)
{
(result, var recipe) = await CraftRecipe.createRecipeFromDoc(player, recipe_doc);
if (result.isFail() || recipe == null)
{
err_msg = $"Failed to createRecipeFromDoc() !!! : {result.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
var recipe_attribute = recipe.getEntityAttribute<CraftRecipeAttribute>();
NullReferenceCheckHelper.throwIfNull(recipe_attribute, () => $"recipe_attribute is null !!! - {player.toBasicString()}");
if (m_Recipes.TryAdd(recipe_attribute.CraftMetaId, recipe) == false)
{
err_msg = $"Failed to get recipe attribute : {nameof(CraftRecipeAttribute)}";
result.setFail(ServerErrorCode.EntityAttributeIsNull, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
}
return result;
}
public async Task<Result> RegisterRecipe(META_ID craft_meta_id)
{
var result = new Result();
var err_msg = string.Empty;
var player = getOwner() as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
if (HasRecipe(craft_meta_id) == true)
{
err_msg = $"Already Registered Recipe Failed. !!! - {getOwner().toBasicString()}";
result.setFail(ServerErrorCode.CraftingRecipeIsAlreadyRegister, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
(result, var craft_recipe) = await CraftRecipe.createRecipe(player, craft_meta_id);
if (result.isFail() || craft_recipe == null)
{
err_msg = $"Create Craft Recipe Failed. !!! - {getOwner().toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
m_Recipes.TryAdd(craft_meta_id, craft_recipe);
return result;
}
public bool HasRecipe(META_ID craft_meta_id)
{
if(m_Recipes.TryGetValue(craft_meta_id, out var result) == false)
{
return false;
}
return true;
}
}
}