| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- <?php
- namespace App\Module\AppGame\Proto;
- use Uraus\Kku\Common\DataLand;
- /**
- * 作物信息DTO转换为Protobuf数据对象
- */
- class CropInfoDto
- {
- /**
- * 将Farm模块的CropInfoDto填充到Protobuf的DataLand对象中
- *
- * 注意:此方法不创建新的DataLand对象,而是填充现有对象的作物相关字段
- *
- * @param \App\Module\Farm\Dtos\CropInfoDto $cropInfoDto
- * @param DataLand $dataLand 要填充的DataLand对象
- * @return DataLand
- */
- public static function fillDataLand(\App\Module\Farm\Dtos\CropInfoDto $cropInfoDto, DataLand $dataLand): DataLand
- {
- // 设置作物ID
- $dataLand->setPlantId($cropInfoDto->id);
- // 设置种子物品ID(需要从种子配置中获取对应的物品ID)
- $seedItemId = self::getSeedItemId($cropInfoDto->seedId);
- $dataLand->setSeedId($seedItemId);
- // 设置果实ID(发芽期确定的最终产出果实ID)
- if ($cropInfoDto->finalOutputItemId) {
- $dataLand->setFruitId($cropInfoDto->finalOutputItemId);
- }
- // 设置种植时间
- if (!empty($cropInfoDto->plantTime)) {
- // 如果plantTime是字符串格式的日期时间,转换为时间戳
- if (is_string($cropInfoDto->plantTime)) {
- $plantTime = strtotime($cropInfoDto->plantTime);
- $dataLand->setSeedPlantingTimes($plantTime);
- }
- // 如果已经是时间戳,直接使用
- else if (is_numeric($cropInfoDto->plantTime)) {
- $dataLand->setSeedPlantingTimes($cropInfoDto->plantTime);
- }
- }
- // 当前阶段开始时间
- if (!empty($cropInfoDto->stageStartTime)) {
- // 如果 stageStartTime 是字符串格式的日期时间,转换为时间戳
- if (is_string($cropInfoDto->stageStartTime)) {
- $stageStartTime = strtotime($cropInfoDto->stageEndTime);
- $dataLand->setStageNextTimes($stageStartTime);
- }
- // 如果已经是时间戳,直接使用
- else if (is_numeric($cropInfoDto->stageStartTime)) {
- $dataLand->setStageNextTimes($cropInfoDto->stageStartTime);
- }
- }
- // 下一个阶段的时间
- if (!empty($cropInfoDto->stageEndTime)) {
- // 如果stageEndTime是字符串格式的日期时间,转换为时间戳
- if (is_string($cropInfoDto->stageEndTime)) {
- $stageEndTime = strtotime($cropInfoDto->stageEndTime);
- $dataLand->setStageNextTimes($stageEndTime);
- }
- // 如果已经是时间戳,直接使用
- else if (is_numeric($cropInfoDto->stageEndTime)) {
- $dataLand->setStageNextTimes($cropInfoDto->stageEndTime);
- }
- }
- // 设置种子状态,这里需要将Farm模块的生长阶段映射到Proto的种子状态
- // 假设我们有一个映射关系,这里简单地直接使用生长阶段值
- $dataLand->setSeedStatus($cropInfoDto->growthStage);
- // 处理灾害信息
- DisasterConverter::processDisasters($dataLand, $cropInfoDto->disasters ?? []);
- // 检查是否可以施肥
- $dataLand->setCanFertilization(!$cropInfoDto->fertilized);
- return $dataLand;
- }
- /**
- * 根据种子配置ID获取对应的物品ID
- *
- * @param int $seedId 种子配置ID
- * @return int 物品ID
- */
- private static function getSeedItemId(int $seedId): int
- {
- try {
- $seed = \App\Module\Farm\Models\FarmSeed::find($seedId);
- return $seed ? $seed->item_id : 0;
- } catch (\Exception $e) {
- \Illuminate\Support\Facades\Log::error('获取种子物品ID失败', [
- 'seed_id' => $seedId,
- 'error' => $e->getMessage()
- ]);
- return 0;
- }
- }
- }
|