'integer',
'reward_group_id' => 'integer',
'condition_group_id' => 'integer',
'display_attributes' => \App\Module\GameItems\Casts\RecipeDisplayAttributesCast::class,
'success_rate' => 'float',
'cooldown_seconds' => 'integer',
'category_id' => 'integer',
'sort_order' => 'integer',
'is_active' => 'boolean',
];
/**
* 获取消耗组
*
* @return BelongsTo
*/
public function consumeGroup(): BelongsTo
{
return $this->belongsTo(\App\Module\Game\Models\GameConsumeGroup::class, 'consume_group_id');
}
/**
* 获取奖励组
*
* @return BelongsTo
*/
public function rewardGroup(): BelongsTo
{
return $this->belongsTo(\App\Module\Game\Models\GameRewardGroup::class, 'reward_group_id');
}
/**
* 获取条件组
*
* @return BelongsTo
*/
public function conditionGroup(): BelongsTo
{
return $this->belongsTo(\App\Module\Game\Models\GameConditionGroup::class, 'condition_group_id');
}
/**
* 获取用户配方解锁状态
*
* @return HasMany
*/
public function userRecipes(): HasMany
{
return $this->hasMany(ItemUserRecipe::class, 'recipe_id');
}
/**
* 获取合成记录
*
* @return HasMany
*/
public function craftLogs(): HasMany
{
return $this->hasMany(ItemCraftLog::class, 'recipe_id');
}
/**
* 检查用户是否已解锁该配方
*
* @param int $userId 用户ID
* @return bool
*/
public function isUnlockedByUser(int $userId): bool
{
$userRecipe = $this->userRecipes()
->where('user_id', $userId)
->first();
return $userRecipe && $userRecipe->is_unlocked;
}
/**
* 格式化消耗组详情用于显示
*
* @return string
*/
public function formatConsumeDetails(): string
{
if (!$this->consumeGroup) {
return '无消耗组';
}
return $this->consumeGroup->formatConsumeDetails();
}
/**
* 格式化奖励组详情用于显示
*
* @return string
*/
public function formatRewardDetails(): string
{
if (!$this->rewardGroup) {
return '无奖励组';
}
return $this->rewardGroup->formatRewardDetails();
}
/**
* 格式化条件组详情用于显示
*
* @return string
*/
public function formatConditionDetails(): string
{
if (!$this->conditionGroup) {
return '无条件组';
}
return $this->conditionGroup->formatConditionDetails();
}
/**
* 检查用户是否可以合成该配方
*
* @param int $userId 用户ID
* @return array 检查结果,包含是否可合成和原因
*/
public function canCraftByUser(int $userId): array
{
// 检查配方是否激活
if (!$this->is_active) {
return [
'can_craft' => false,
'reason' => '配方未激活',
];
}
// 检查条件组(如果设置了条件组)
if ($this->condition_group_id && $this->conditionGroup) {
$conditionService = app(\App\Module\Game\Services\ConditionService::class);
$conditionResult = $conditionService->checkCondition($userId, $this->condition_group_id);
if (!$conditionResult['success']) {
return [
'can_craft' => false,
'reason' => '条件不满足: ' . $conditionResult['message'],
];
}
}
// 检查消耗组是否满足
if ($this->consume_group_id && $this->consumeGroup) {
$consumeService = app(\App\Module\Game\Services\ConsumeService::class);
$consumeResult = $consumeService->checkConsume($userId, $this->consume_group_id);
if (!$consumeResult->success) {
return [
'can_craft' => false,
'reason' => '材料不足: ' . $consumeResult->message,
];
}
}
return [
'can_craft' => true,
];
}
}