最后更新时间:2025年5月29日
物品合成系统是一个混合架构的系统,同时支持传统的材料表模式和新的组系统模式:
result_item_id、coin_cost、level_required等字段unlock_condition等JSON字段存储复杂条件consume_group_id管理合成时需要消耗的材料和资源reward_group_id管理合成成功后获得的奖励condition_group_id管理解锁配方需要满足的条件| 字段名 | 类型 | 说明 | 使用状态 |
|---|---|---|---|
id |
int | 配方ID,主键 | ✅ 使用中 |
name |
varchar(255) | 配方名称 | ✅ 使用中 |
code |
varchar(100) | 配方编码(唯一) | ✅ 使用中 |
description |
text | 配方描述 | ✅ 使用中 |
consume_group_id |
int | 消耗组ID | ⚠️ 预留字段 |
reward_group_id |
int | 奖励组ID | ⚠️ 预留字段 |
condition_group_id |
int | 条件组ID | ⚠️ 预留字段 |
result_item_id |
int | 产出物品ID | ✅ 使用中 |
result_min_quantity |
int | 最小产出数量 | ✅ 使用中 |
result_max_quantity |
int | 最大产出数量 | ✅ 使用中 |
success_rate |
decimal(5,2) | 成功率(百分比) | ✅ 使用中 |
coin_cost |
json | 货币成本 | ✅ 使用中 |
level_required |
int | 所需等级 | ✅ 使用中 |
is_default_unlocked |
tinyint | 是否默认解锁 | ✅ 使用中 |
unlock_condition |
json | 解锁条件 | ✅ 使用中 |
cooldown_seconds |
int | 冷却时间(秒) | ✅ 使用中 |
category_id |
int | 配方分类ID | ✅ 使用中 |
sort_order |
int | 排序权重 | ✅ 使用中 |
is_active |
tinyint | 是否激活 | ✅ 使用中 |
| 字段名 | 类型 | 说明 |
|---|---|---|
id |
int | 记录ID,主键 |
recipe_id |
int | 配方ID |
item_id |
int | 材料物品ID |
quantity |
int | 所需数量 |
is_consumed |
tinyint | 是否消耗(0:不消耗, 1:消耗) |
| 字段名 | 类型 | 说明 |
|---|---|---|
id |
int | 记录ID,主键 |
user_id |
int | 用户ID |
recipe_id |
int | 配方ID |
is_unlocked |
tinyint | 是否已解锁 |
unlock_time |
timestamp | 解锁时间 |
last_craft_time |
timestamp | 最后合成时间 |
craft_count |
int | 合成次数 |
| 字段名 | 类型 | 说明 |
|---|---|---|
id |
int | 记录ID,主键 |
user_id |
int | 用户ID |
recipe_id |
int | 配方ID |
materials |
json | 消耗的材料 |
result_item_id |
int | 获得的物品ID |
result_instance_id |
int | 获得的单独属性物品ID |
result_quantity |
int | 获得的物品数量 |
is_success |
tinyint | 是否成功 |
craft_time |
timestamp | 合成时间 |
ip_address |
varchar(100) | 操作IP地址 |
device_info |
text | 设备信息 |
app/Module/GameItems/Services/CraftService.phpcraftItem() - 合成物品getUserAvailableRecipes() - 获取用户可合成配方列表unlockRecipe() - 解锁配方app/Module/GameItems/Logics/Recipe.php - 配方相关逻辑app/Module/GameItems/Logics/UserRecipe.php - 用户配方逻辑app/Module/GameItems/Logics/Item.php - 物品操作逻辑创建配方步骤:
item_recipes表中创建配方item_recipe_materials表中定义所需材料result_item_id等字段定义产出level_required、unlock_condition等字段配方验证流程:
is_active)level_required合成执行流程:
item_recipe_materials定义的材料coin_cost定义的货币success_rate判断是否成功result_item_id定义的物品item_craft_logs表中记录操作预留字段:
consume_group_id - 消耗组IDreward_group_id - 奖励组IDcondition_group_id - 条件组ID模型关系:
// ItemRecipe模型中已定义的关系
public function consumeGroup(): BelongsTo
public function rewardGroup(): BelongsTo
public function conditionGroup(): BelongsTo
使用方式:
// 检查条件组(代码中已预留)
if ($this->condition_group_id && $this->conditionGroup) {
$conditionService = app(\App\Module\Game\Services\ConditionService::class);
$conditionResult = $conditionService->checkConditionGroup($userId, $this->condition_group_id);
}
use App\Module\GameItems\Services\CraftService;
// 合成物品
$result = CraftService::craftItem(
userId: 1001,
recipeId: 1,
options: [
'quantity' => 1,
'ip_address' => '127.0.0.1',
'device_info' => 'Web Browser'
]
);
if ($result) {
echo "合成成功!";
// $result 包含合成结果信息
} else {
echo "合成失败!";
}
// 获取用户可合成的配方列表
$recipes = CraftService::getUserAvailableRecipes(
userId: 1001,
filters: [
'category_id' => 1 // 可选:按分类过滤
]
);
foreach ($recipes as $recipe) {
echo "配方:{$recipe->name},成功率:{$recipe->success_rate}%\n";
}
$recipe = ItemRecipe::find(1);
$canCraft = $recipe->canCraftByUser(1001);
if ($canCraft['can_craft']) {
echo "可以合成";
} else {
echo "不能合成:" . $canCraft['reason'];
}
木板制作配方:
-- 1. 创建配方
INSERT INTO item_recipes (
name, code, description,
result_item_id, result_min_quantity, result_max_quantity,
success_rate, level_required, is_default_unlocked,
cooldown_seconds, is_active
) VALUES (
'木板制作', 'craft_wooden_plank', '将木材制作成木板',
1002, 4, 4, -- 产出4个木板(物品ID 1002)
100.00, 1, 1, -- 100%成功率,1级解锁,默认解锁
0, 1 -- 无冷却,激活状态
);
-- 2. 添加材料需求
INSERT INTO item_recipe_materials (
recipe_id, item_id, quantity, is_consumed
) VALUES (
1, 1001, 1, 1 -- 需要1个木材(物品ID 1001),消耗
);
高级装备制作:
-- 1. 创建配方
INSERT INTO item_recipes (
name, code, description,
result_item_id, result_min_quantity, result_max_quantity,
success_rate, coin_cost, level_required, is_default_unlocked,
unlock_condition, cooldown_seconds, is_active
) VALUES (
'高级装备制作', 'craft_advanced_equipment', '制作高级装备',
2001, 1, 1, -- 产出1个高级装备
80.00, '{"gold": 100}', 20, 0, -- 80%成功率,消耗100金币,20级要求,非默认解锁
'{"skills": ["blacksmith"]}', 3600, 1 -- 需要铁匠技能,1小时冷却
);
-- 2. 添加材料需求
INSERT INTO item_recipe_materials (recipe_id, item_id, quantity, is_consumed) VALUES
(2, 1003, 5, 1), -- 5个铁锭
(2, 1004, 2, 1); -- 2个宝石
物品合成系统采用了智能的混合架构设计,既保持了传统材料表模式的稳定性和性能,又为未来的组系统升级预留了完整的扩展能力。这种设计体现了优秀的软件架构思维:
当前系统完全可以满足合成需求,同时具备了向更灵活的组系统架构演进的能力。