GenerateFarmSeedConfigJson.php 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <?php
  2. namespace App\Module\Farm\Commands;
  3. use App\Module\Farm\Models\FarmSeed;
  4. use App\Module\Farm\Models\FarmFruitGrowthCycle;
  5. use Illuminate\Console\Command;
  6. /**
  7. * 生成种子配置表JSON数据命令
  8. *
  9. * 该命令用于从数据库中的种子表和种子产出表生成JSON数据文件,供客户端使用。
  10. * 生成的JSON文件包含种子的基本信息,如种子ID、名称、类型、生长时间、产量范围、灾害抵抗等,
  11. * 以及种子的产出配置信息。该命令通常在种子配置数据更新后运行,以确保客户端获取最新的配置数据。
  12. */
  13. class GenerateFarmSeedConfigJson extends Command
  14. {
  15. /**
  16. * 命令名称
  17. *
  18. * @var string
  19. */
  20. protected $signature = 'farm:generate-seed-json';
  21. /**
  22. * 命令描述
  23. *
  24. * @var string
  25. */
  26. protected $description = '生成种子配置JSON文件';
  27. /**
  28. * 生成种子配置JSON数据
  29. *
  30. * @return array|bool 生成的数据或失败标志
  31. */
  32. public static function generateJson()
  33. {
  34. try {
  35. // 获取所有种子配置,预加载产出关联
  36. $seeds = FarmSeed::with('outputs')->orderBy('id')->get();
  37. // 准备JSON数据
  38. $jsonData = [
  39. 'generated_ts' => time(),
  40. 'seeds' => [],
  41. 'fruit_growth_cycles' => []
  42. ];
  43. // 获取所有果实生长周期配置
  44. $fruitGrowthCycles = FarmFruitGrowthCycle::all()->keyBy('fruit_item_id');
  45. // 处理果实生长周期数据
  46. foreach ($fruitGrowthCycles as $fruitItemId => $cycle) {
  47. $jsonData['fruit_growth_cycles'][$fruitItemId] = [
  48. 'sprout_time' => $cycle->sprout_time,
  49. 'growth_time' => $cycle->growth_time,
  50. 'fruit_time' => $cycle->fruit_time, // 添加果实期时间
  51. 'mature_time' => $cycle->mature_time,
  52. 'wither_time' => $cycle->wither_time,
  53. ];
  54. }
  55. // 处理种子基本数据和产出数据
  56. foreach ($seeds as $seed) {
  57. // 获取种子的所有产出物品ID
  58. $seedOutputs = [];
  59. foreach ($seed->outputs as $output) {
  60. $seedOutputs[] = $output->item_id;
  61. }
  62. $jsonData['seeds'][] = [
  63. 'id' => $seed->id,
  64. 'name' => $seed->name,
  65. 'type' => $seed->type,
  66. 'seed_time' => $seed->seed_time,
  67. 'min_output' => $seed->min_output,
  68. 'max_output' => $seed->max_output,
  69. 'disaster_min_output' => $seed->disaster_min_output ?? 0,
  70. 'disaster_max_output' => $seed->disaster_max_output ?? 0,
  71. 'item_id' => $seed->item_id,
  72. 'disaster_resistance' => $seed->disaster_resistance,
  73. 'display_attributes' => $seed->display_attributes,
  74. 'seed_outputs' => $seedOutputs, // 直接在种子属性中包含产出物品ID数组
  75. ];
  76. }
  77. return $jsonData;
  78. } catch (\Exception $e) {
  79. if (php_sapi_name() === 'cli') {
  80. echo "Error: Generate farm_seed.json failed: {$e->getMessage()}\n";
  81. }
  82. return false;
  83. }
  84. }
  85. /**
  86. * 执行命令
  87. *
  88. * @return int
  89. */
  90. public function handle()
  91. {
  92. $this->info('开始生成种子配置JSON文件...');
  93. try {
  94. // 通过缓存类生成JSON
  95. $result = \App\Module\Game\DCache\FarmSeedJsonConfig::getData([], true);
  96. if ($result !== false && is_array($result)) {
  97. $this->info('种子配置JSON文件生成成功');
  98. $this->info('共生成 ' . count($result['seeds'] ?? []) . ' 条种子数据');
  99. // 统计总的产出物品数量
  100. $totalOutputs = 0;
  101. foreach ($result['seeds'] as $seed) {
  102. $totalOutputs += count($seed['seed_outputs'] ?? []);
  103. }
  104. $this->info('共包含 ' . $totalOutputs . ' 个种子产出物品');
  105. $this->info('共包含 ' . count($result['fruit_growth_cycles'] ?? []) . ' 个果实生长周期配置');
  106. // 显示一些示例数据
  107. if (!empty($result['seeds'])) {
  108. $this->info('种子示例数据:');
  109. $firstSeed = $result['seeds'][0];
  110. $this->line(' ID: ' . $firstSeed['id'] . ', 名称: ' . $firstSeed['name']);
  111. $this->line(' 产出物品: [' . implode(', ', $firstSeed['seed_outputs'] ?? []) . ']');
  112. }
  113. return Command::SUCCESS;
  114. } else {
  115. $this->error('生成种子配置JSON文件失败');
  116. return Command::FAILURE;
  117. }
  118. } catch (\Exception $e) {
  119. $this->error('生成种子配置JSON文件失败: ' . $e->getMessage());
  120. return Command::FAILURE;
  121. }
  122. }
  123. }