get(); return view('admin.game-configs.index', compact('games')); } /** * 切换游戏开启/关闭状态。 */ public function toggle(GameConfig $gameConfig): JsonResponse { $gameConfig->update(['enabled' => ! $gameConfig->enabled]); $gameConfig->clearCache(); return response()->json([ 'ok' => true, 'enabled' => $gameConfig->enabled, 'message' => $gameConfig->enabled ? "「{$gameConfig->name}」已开启" : "「{$gameConfig->name}」已关闭", ]); } /** * 保存游戏核心参数。 * * 接收前端提交的 params JSON 对象并合并至现有配置。 */ public function updateParams(Request $request, GameConfig $gameConfig): RedirectResponse { $request->validate([ 'params' => 'required|array', ]); // 合并参数,保留已有键,只更新传入的键 $current = $gameConfig->params ?? []; $updated = array_merge($current, $request->input('params')); $gameConfig->update(['params' => $updated]); $gameConfig->clearCache(); return back()->with('success', "「{$gameConfig->name}」参数已保存!"); } /** * 管理员手动投放神秘箱子。 * * 立即分发 DropMysteryBoxJob 到队列,由 Horizon 执行箱子投放和公屏广播。 */ public function dropMysteryBox(Request $request): JsonResponse { if (! \App\Models\GameConfig::isEnabled('mystery_box')) { return response()->json(['ok' => false, 'message' => '神秘箱子功能未开放,请先开启。']); } $boxType = $request->input('box_type', 'normal'); if (! in_array($boxType, ['normal', 'rare', 'trap'], true)) { return response()->json(['ok' => false, 'message' => '无效的箱子类型。']); } // 检查是否有正在开放的箱子(避免同时多个) if (\App\Models\MysteryBox::currentOpenBox()) { return response()->json(['ok' => false, 'message' => '当前已有一个神秘箱子正在等待领取,请等它结束后再投放。']); } \App\Jobs\DropMysteryBoxJob::dispatch($boxType, 1, null, (int) auth()->id()); $typeNames = ['normal' => '普通箱', 'rare' => '稀有箱', 'trap' => '黑化箱']; return response()->json([ 'ok' => true, 'message' => "✅ 已投放「{$typeNames[$boxType]}」到 #1 房间,暗号将实时发送到公屏!", ]); } }