原有的灾害去除系统存在以下问题:
fram_grass_rate(草宰概率)fram_weedicide_rate(除草概率)在 NumericAttributesCast 中添加了完整的灾害去除属性:
/**
* 除虫概率(百分比格式,100=100%)
*/
public int $fram_pesticide_rate = 0;
/**
* 解决干旱概率(百分比格式,100=100%)
*/
public int $fram_drought_rate = 0;
/**
* 除草概率(百分比格式,100=100%)
*/
public int $fram_weedicide_rate = 0;
位置:app/Module/Farm/Logics/DisasterRemovalLogic.php
核心功能:
Helper::check_tr())关键特性:
/**
* 使用物品去除灾害(带概率判断)
*/
public static function removeDisasterWithItem(
int $userId,
int $landId,
int $itemId,
int $disasterType,
string $sourceType
): array
所有灾害去除Handler(PesticideHandler、WeedicideHandler、WateringHandler)都采用相同的处理模式:
// 开启事务
DB::beginTransaction();
// 使用统一的灾害去除逻辑
$result = CropService::removeDisasterWithItem(
$userId,
$landId,
$userItemId,
DISASTER_TYPE::PEST->value, // 使用枚举替代魔法数字
'land_pesticide'
);
// 提交事务
DB::commit();
CropService::clearDisaster($userId, $landId, 2)DISASTER_TYPE::PEST->valueprivate function rollSuccess(int $successRate): bool
{
if ($successRate <= 0) {
return false; // 0%成功率必定失败
}
if ($successRate >= 100) {
return true; // 100%成功率必定成功
}
$randomNumber = mt_rand(1, 100);
return $randomNumber <= $successRate;
}
private const DISASTER_ITEM_ATTRIBUTES = [
DISASTER_TYPE::DROUGHT->value => 'fram_drought_rate', // 干旱 -> 浇水概率
DISASTER_TYPE::PEST->value => 'fram_pesticide_rate', // 虫害 -> 除虫概率
DISASTER_TYPE::WEED->value => 'fram_weedicide_rate', // 杂草 -> 除草概率
];
private const DISASTER_ACTION_NAMES = [
DISASTER_TYPE::DROUGHT->value => '浇水',
DISASTER_TYPE::PEST->value => '除虫',
DISASTER_TYPE::WEED->value => '除草',
];
Helper::check_tr() 确保事务已开启// 在逻辑层开始时检查事务状态
Helper::check_tr();
CropService::clearDisaster() 方法{
"numeric_attributes": {
"fram_pesticide_rate": 80, // 80%除虫成功率
"fram_drought_rate": 90, // 90%解决干旱成功率
"fram_weedicide_rate": 75 // 75%除草成功率
}
}
// 使用除虫剂
$result = CropService::removeDisasterWithItem(
$userId,
$landId,
$pesticideItemId,
DISASTER_TYPE::PEST->value,
'land_pesticide'
);
if ($result['success']) {
echo $result['message']; // "除虫成功"
echo "成功率: " . $result['success_rate'] . "%";
}
只需在以下位置添加配置:
DISASTER_TYPE 枚举DISASTER_ITEM_ATTRIBUTES 映射DISASTER_ACTION_NAMES 映射NumericAttributesCast 属性定义只需在物品的 numeric_attributes 中添加对应的概率属性即可。