神灵buff系统为农场模块提供临时增益机制,玩家可以通过多种方式获得和开启神灵加持。本文档详细说明了神灵buff的开启方式和相关代码实现。
系统定义了四种神灵加持类型:
| 类型ID | 名称 | 效果 | 物品ID |
|---|---|---|---|
| 1 | 丰收之神 | 确保收获时获得最高产量 | 3001 |
| 2 | 雨露之神 | 防止干旱灾害 | 3002 |
| 3 | 屠草之神 | 防止杂草灾害 | 3003 |
| 4 | 拭虫之神 | 防止虫害灾害 | 3004 |
路由: god/open
Handler: App\Module\AppGame\Handler\God\OpenHandler
请求类型: RequestGodOpen
响应类型: ResponseGodOpen
参数验证
$godId = $data->getGodId(); // 神像ID (1-4)
检查神像类型有效性
if (!in_array($godId, [
BUFF_TYPE::HARVEST_GOD->value, // 1
BUFF_TYPE::RAIN_GOD->value, // 2
BUFF_TYPE::WEED_KILLER_GOD->value, // 3
BUFF_TYPE::PEST_CLEANER_GOD->value // 4
])) {
throw new LogicException("无效的神像类型");
}
检查是否已有有效加持
$existingBuff = BuffService::getActiveUserBuff($userId, $godId);
if ($existingBuff) {
throw new LogicException("该神像已激活,有效期至:" . $existingBuff->expire_time);
}
检查用户背包中的神像物品
$godItemId = 3000 + $godId; // 神像物品ID为3001-3004
$userItems = ItemService::getUserItems($userId, ['item_id' => $godItemId]);
if ($userItems->isEmpty()) {
throw new LogicException("您没有该神像物品");
}
消耗神像物品并激活加持
// 消耗神像物品
ItemService::consumeItem($userId, $godItemId, null, 1, [
'source_type' => 'god_activate',
'source_id' => $godId,
'details' => [
'god_id' => $godId,
'god_name' => BUFF_TYPE::getName($godId)
]
]);
// 激活神像加持(默认24小时)
$durationHours = 24;
$buff = BuffService::activateBuff($userId, $godId, $durationHours);
OpenHandler.php (第67-89行):
// 查找用户背包中的神像物品
$godItemId = 3000 + $godId; // 假设神像物品ID为3001-3004,对应神像类型1-4
$userItems = ItemService::getUserItems($userId, ['item_id' => $godItemId]);
if ($userItems->isEmpty()) {
throw new LogicException("您没有该神像物品");
}
// 开始事务
DB::beginTransaction();
// 消耗神像物品
ItemService::consumeItem($userId, $godItemId, null, 1, [
'source_type' => 'god_activate',
'source_id' => $godId,
'details' => [
'god_id' => $godId,
'god_name' => BUFF_TYPE::getName($godId)
]
]);
// 激活神像加持(默认24小时)
$durationHours = 24;
$buff = BuffService::activateBuff($userId, $godId, $durationHours);
通过任务系统可以直接奖励神灵buff:
相关代码: app/Module/Task/Services/TaskRewardGroupService.php
通过商店系统购买神像物品:
相关代码: app/Module/AppGame/Handler/Shop/BuyHandler.php
通过开启宝箱获得神像物品:
相关代码: app/Module/AppGame/Handler/Item/OpenBoxHandler.php
通过服务层直接激活:
// 直接激活神灵buff
$buff = BuffService::activateBuff($userId, $buffType, $durationHours);
文件: app/Module/Farm/Services/BuffService.php
主要方法:
activateBuff(): 激活神灵加持getUserBuffs(): 获取用户所有神灵加持getActiveBuffs(): 获取用户有效神灵加持getActiveUserBuff(): 获取用户指定类型的有效神灵加持文件: app/Module/Farm/Logics/BuffLogic.php
核心激活逻辑:
public function activateBuff(int $userId, int $buffType, int $durationHours): ?FarmGodBuff
{
// 检查buff类型是否有效
// 获取或创建buff记录
// 设置过期时间
// 触发buff激活事件
// 返回buff对象
}
文件: app/Module/Farm/Models/FarmGodBuff.php
数据库表结构:
id: 主键IDuser_id: 用户IDbuff_type: buff类型(1-4)expire_time: 过期时间created_at: 创建时间updated_at: 更新时间用户请求神像激活
↓
OpenHandler 验证参数
↓
检查用户是否已有有效buff
↓
检查用户背包中的神像物品
↓
开始数据库事务
↓
ItemService 消耗神像物品
↓
BuffService 激活神灵buff
↓
BuffLogic 处理激活逻辑
↓
FarmGodBuff 保存到数据库
↓
触发 BuffActivatedEvent 事件
↓
提交事务并返回响应
↓
客户端收到激活成功消息
// 激活神像的请求
{
"god_id": 1 // 1=丰收之神, 2=雨露之神, 3=屠草之神, 4=拭虫之神
}
// 成功响应
{
"code": 0,
"msg": "神像激活成功",
"last_data": {
"gods": [
{
"id": 1,
"status": true,
"vaid_time": 1716537600 // 过期时间戳
}
]
}
}
BuffActivatedEvent 事件