03ec3a9fbb
一、钓鱼全局开关
- 钓鱼纳入 GameConfig(game_key=fishing),游戏管理页可一键开关
- cast() 接口加开关校验,关闭时返回 403 友好提示
- GameConfigSeeder 新增 fishing 配置(含4个参数)
二、钓鱼事件数据库化
- 新建 fishing_events 表(emoji/name/message/exp/jjb/weight/is_active/sort)
- FishingEvent 模型含 rollOne() 加权随机方法
- FishingEventSeeder 填充7条初始事件(经验降低、金币提升)
- FishingController::randomFishResult() 改为读数据库事件
三、钓鱼参数迁移至 GameConfig
- fishing_cost/wait_min/wait_max/cooldown 改为 GameConfig::param() 读取
- 保留 Sysparam fallback 兼容旧数据
四、后台管理页面
- 新建 FishingEventController(CRUD + AJAX toggle)
- 新建 admin/fishing/index.blade.php(事件列表+概率显示+编辑弹窗)
- 侧边栏「游戏管理」下方新增「🎣 钓鱼事件」入口
- 游戏管理视图 gameParamLabels 新增钓鱼参数标签
90 lines
2.0 KiB
PHP
90 lines
2.0 KiB
PHP
<?php
|
|
|
|
/**
|
|
* 文件功能:钓鱼事件模型
|
|
*
|
|
* 对应 fishing_events 表,每条记录是一个钓鱼随机奖惩事件。
|
|
* 概率由 weight(权重)字段决定,权重越大被选中概率越高。
|
|
*
|
|
* @author ChatRoom Laravel
|
|
*
|
|
* @version 1.0.0
|
|
*/
|
|
|
|
namespace App\Models;
|
|
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
|
|
class FishingEvent extends Model
|
|
{
|
|
/**
|
|
* 可批量赋值字段
|
|
*
|
|
* @var array<int, string>
|
|
*/
|
|
protected $fillable = [
|
|
'emoji',
|
|
'name',
|
|
'message',
|
|
'exp',
|
|
'jjb',
|
|
'weight',
|
|
'is_active',
|
|
'sort',
|
|
];
|
|
|
|
/**
|
|
* 字段类型转换
|
|
*
|
|
* @return array<string, string>
|
|
*/
|
|
protected function casts(): array
|
|
{
|
|
return [
|
|
'exp' => 'integer',
|
|
'jjb' => 'integer',
|
|
'weight' => 'integer',
|
|
'is_active' => 'boolean',
|
|
'sort' => 'integer',
|
|
];
|
|
}
|
|
|
|
/**
|
|
* 作用域:只查询已启用的事件
|
|
*/
|
|
public function scopeActive(Builder $query): Builder
|
|
{
|
|
return $query->where('is_active', true);
|
|
}
|
|
|
|
/**
|
|
* 根据权重随机抽取一个激活的钓鱼事件
|
|
*
|
|
* 实现加权随机:权重越大,被选中概率越高。
|
|
* 若无任何激活事件,返回 null。
|
|
*/
|
|
public static function rollOne(): ?static
|
|
{
|
|
$events = static::active()->orderBy('sort')->get();
|
|
if ($events->isEmpty()) {
|
|
return null;
|
|
}
|
|
|
|
// 计算总权重后加权随机
|
|
$totalWeight = $events->sum('weight');
|
|
$roll = random_int(1, max($totalWeight, 1));
|
|
$cumulative = 0;
|
|
|
|
foreach ($events as $event) {
|
|
$cumulative += $event->weight;
|
|
if ($roll <= $cumulative) {
|
|
return $event;
|
|
}
|
|
}
|
|
|
|
// 兜底:返回最后一个
|
|
return $events->last();
|
|
}
|
|
}
|