'integer', 'coin_return_rate' => 'float', 'is_active' => 'boolean', ]; /** * 获取关联的物品(如果有) * * @return BelongsTo */ public function item(): BelongsTo { return $this->belongsTo(Item::class, 'item_id'); } /** * 获取关联的分类(如果有) * * @return BelongsTo */ public function category(): BelongsTo { return $this->belongsTo(ItemCategory::class, 'category_id'); } /** * 获取分解结果 * * @return HasMany */ public function results(): HasMany { return $this->hasMany(ItemDismantleResult::class, 'rule_id'); } /** * 获取分解日志 * * @return HasMany */ public function dismantleLogs(): HasMany { return $this->hasMany(ItemDismantleLog::class, 'rule_id'); } /** * 计算分解返还的金币 * * @param int $itemPrice 物品价格 * @return int */ public function calculateCoinReturn(int $itemPrice): int { if ($this->coin_return_rate <= 0) { return 0; } return (int)($itemPrice * $this->coin_return_rate); } /** * 获取分解结果 * * @return array */ public function getDismantleResults(): array { $results = []; $dismantleResults = $this->results()->with('resultItem')->get(); foreach ($dismantleResults as $result) { // 根据概率决定是否获得该物品 if (mt_rand(1, 10000) <= $result->chance * 100) { // 计算数量 $quantity = $result->min_quantity; if ($result->max_quantity > $result->min_quantity) { $quantity = mt_rand($result->min_quantity, $result->max_quantity); } if ($quantity > 0) { $results[] = [ 'item_id' => $result->result_item_id, 'item_name' => $result->resultItem->name, 'quantity' => $quantity, ]; } } } return $results; } }