CropInfoDto.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. <?php
  2. namespace App\Module\AppGame\Proto;
  3. use Uraus\Kku\Common\DataLand;
  4. /**
  5. * 作物信息DTO转换为Protobuf数据对象
  6. */
  7. class CropInfoDto
  8. {
  9. /**
  10. * 将Farm模块的CropInfoDto填充到Protobuf的DataLand对象中
  11. *
  12. * 注意:此方法不创建新的DataLand对象,而是填充现有对象的作物相关字段
  13. *
  14. * @param \App\Module\Farm\Dtos\CropInfoDto $cropInfoDto
  15. * @param DataLand $dataLand 要填充的DataLand对象
  16. * @return DataLand
  17. */
  18. public static function fillDataLand(\App\Module\Farm\Dtos\CropInfoDto $cropInfoDto, DataLand $dataLand): DataLand
  19. {
  20. // 设置作物ID
  21. $dataLand->setPlantId($cropInfoDto->id);
  22. // 设置种子物品ID(需要从种子配置中获取对应的物品ID)
  23. $seedItemId = self::getSeedItemId($cropInfoDto->seedId);
  24. $dataLand->setSeedId($seedItemId);
  25. // 设置果实ID(发芽期确定的最终产出果实ID)
  26. if ($cropInfoDto->finalOutputItemId) {
  27. $dataLand->setFruitId($cropInfoDto->finalOutputItemId);
  28. }
  29. // 设置种植时间
  30. if (!empty($cropInfoDto->plantTime)) {
  31. // 如果plantTime是字符串格式的日期时间,转换为时间戳
  32. if (is_string($cropInfoDto->plantTime)) {
  33. $plantTime = strtotime($cropInfoDto->plantTime);
  34. $dataLand->setSeedPlantingTimes($plantTime);
  35. }
  36. // 如果已经是时间戳,直接使用
  37. else if (is_numeric($cropInfoDto->plantTime)) {
  38. $dataLand->setSeedPlantingTimes($cropInfoDto->plantTime);
  39. }
  40. }
  41. // 当前阶段开始时间
  42. if (!empty($cropInfoDto->stageStartTime)) {
  43. // 如果 stageStartTime 是字符串格式的日期时间,转换为时间戳
  44. if (is_string($cropInfoDto->stageStartTime)) {
  45. $stageStartTime = strtotime($cropInfoDto->stageEndTime);
  46. $dataLand->setStageNextTimes($stageStartTime);
  47. }
  48. // 如果已经是时间戳,直接使用
  49. else if (is_numeric($cropInfoDto->stageStartTime)) {
  50. $dataLand->setStageNextTimes($cropInfoDto->stageStartTime);
  51. }
  52. }
  53. // 下一个阶段的时间
  54. if (!empty($cropInfoDto->stageEndTime)) {
  55. // 如果stageEndTime是字符串格式的日期时间,转换为时间戳
  56. if (is_string($cropInfoDto->stageEndTime)) {
  57. $stageEndTime = strtotime($cropInfoDto->stageEndTime);
  58. $dataLand->setStageNextTimes($stageEndTime);
  59. }
  60. // 如果已经是时间戳,直接使用
  61. else if (is_numeric($cropInfoDto->stageEndTime)) {
  62. $dataLand->setStageNextTimes($cropInfoDto->stageEndTime);
  63. }
  64. }
  65. // 设置种子状态,这里需要将Farm模块的生长阶段映射到Proto的种子状态
  66. // 假设我们有一个映射关系,这里简单地直接使用生长阶段值
  67. $dataLand->setSeedStatus($cropInfoDto->growthStage);
  68. // 处理灾害信息
  69. DisasterConverter::processDisasters($dataLand, $cropInfoDto->disasters ?? []);
  70. // 检查是否可以施肥
  71. $dataLand->setCanFertilization(!$cropInfoDto->fertilized);
  72. return $dataLand;
  73. }
  74. /**
  75. * 根据种子配置ID获取对应的物品ID
  76. *
  77. * @param int $seedId 种子配置ID
  78. * @return int 物品ID
  79. */
  80. private static function getSeedItemId(int $seedId): int
  81. {
  82. try {
  83. $seed = \App\Module\Farm\Models\FarmSeed::find($seedId);
  84. return $seed ? $seed->item_id : 0;
  85. } catch (\Exception $e) {
  86. \Illuminate\Support\Facades\Log::error('获取种子物品ID失败', [
  87. 'seed_id' => $seedId,
  88. 'error' => $e->getMessage()
  89. ]);
  90. return 0;
  91. }
  92. }
  93. }