GenerateFarmSeedConfigJson.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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. 'sprout_time' => $seed->sprout_time ?? 0, // 种子级别的发芽期时间
  68. 'growth_time' => $seed->growth_time ?? 0, // 种子级别的生长期时间
  69. 'fruit_time' => $seed->fruit_time ?? 0, // 种子级别的果实期时间
  70. 'mature_time' => $seed->mature_time ?? 0, // 种子级别的成熟期时间
  71. 'wither_time' => $seed->wither_time ?? 0, // 种子级别的枯萎期时间
  72. 'min_output' => $seed->min_output,
  73. 'max_output' => $seed->max_output,
  74. 'disaster_min_output' => $seed->disaster_min_output ?? 0,
  75. 'disaster_max_output' => $seed->disaster_max_output ?? 0,
  76. 'item_id' => $seed->item_id,
  77. 'disaster_resistance' => $seed->disaster_resistance,
  78. 'display_attributes' => $seed->display_attributes,
  79. 'seed_outputs' => $seedOutputs, // 直接在种子属性中包含产出物品ID数组
  80. ];
  81. }
  82. return $jsonData;
  83. } catch (\Exception $e) {
  84. if (php_sapi_name() === 'cli') {
  85. echo "Error: Generate farm_seed.json failed: {$e->getMessage()}\n";
  86. }
  87. return false;
  88. }
  89. }
  90. /**
  91. * 执行命令
  92. *
  93. * @return int
  94. */
  95. public function handle()
  96. {
  97. $this->info('开始生成种子配置JSON文件...');
  98. try {
  99. // 通过缓存类生成JSON
  100. $result = \App\Module\Game\DCache\FarmSeedJsonConfig::getData([], true);
  101. if ($result !== false && is_array($result)) {
  102. $this->info('种子配置JSON文件生成成功');
  103. $this->info('共生成 ' . count($result['seeds'] ?? []) . ' 条种子数据');
  104. // 统计总的产出物品数量
  105. $totalOutputs = 0;
  106. foreach ($result['seeds'] as $seed) {
  107. $totalOutputs += count($seed['seed_outputs'] ?? []);
  108. }
  109. $this->info('共包含 ' . $totalOutputs . ' 个种子产出物品');
  110. $this->info('共包含 ' . count($result['fruit_growth_cycles'] ?? []) . ' 个果实生长周期配置');
  111. // 显示一些示例数据
  112. if (!empty($result['seeds'])) {
  113. $this->info('种子示例数据:');
  114. $firstSeed = $result['seeds'][0];
  115. $this->line(' ID: ' . $firstSeed['id'] . ', 名称: ' . $firstSeed['name']);
  116. $this->line(' 产出物品: [' . implode(', ', $firstSeed['seed_outputs'] ?? []) . ']');
  117. }
  118. return Command::SUCCESS;
  119. } else {
  120. $this->error('生成种子配置JSON文件失败');
  121. return Command::FAILURE;
  122. }
  123. } catch (\Exception $e) {
  124. $this->error('生成种子配置JSON文件失败: ' . $e->getMessage());
  125. return Command::FAILURE;
  126. }
  127. }
  128. }