30日1647-修复施肥后LastData缺失DataLand问题.md 2.5 KB

修复施肥后LastData缺失DataLand问题

任务描述

施肥后,作物状态发生了变化,但是返回的LastData中没有DataLand

问题分析

问题根因

GameServiceProvider中缺少了LandStatusChangedEvent事件的监听器注册,导致施肥操作触发的土地状态变更事件没有被正确处理。

预期流程

  1. FertilizerHandler调用CropService::useFertilizer
  2. CropLogic::useFertilizer触发LandStatusChangedEvent事件
  3. LandStatusChangedListener监听事件并调用LandTemp::handleLandStatusChanged
  4. LandTemp将土地变更数据存储到缓存中
  5. AppGameProtobufResponseListenerLandTemp获取变更数据并设置到LastData
  6. 前端收到包含更新土地信息的LastData

实际问题

第3步失败,因为事件监听器没有注册,导致LandStatusChangedEvent事件没有被处理。

修复方案

修改文件

app/Module/Game/Providers/GameServiceProvider.php

修改内容

  1. 添加导入

    use App\Module\Farm\Events\LandStatusChangedEvent;
    use App\Module\Game\Listeners\LandStatusChangedListener;
    
  2. 注册事件监听器

    // 注册土地状态变更事件监听器
    Event::listen(
    LandStatusChangedEvent::class,
    LandStatusChangedListener::class
    );
    

验证要点

确认事件触发

app/Module/Farm/Logics/CropLogic.phpuseFertilizer方法中(第401-406行):

// 触发土地状态变更事件,确保前端能够获取到土地状态变更
// 虽然土地状态没有实际变化,但我们需要通知前端作物状态已更新
event(new LandStatusChangedEvent(
    $userId,
    $landId,
    $land->status,  // 旧状态
    $land->status   // 新状态(实际上没有变化,但需要触发事件)
));

确认监听器存在

app/Module/Game/Listeners/LandStatusChangedListener.php存在且正确实现。

确认数据流转

AppGameProtobufResponseListener能够从LandTemp获取土地变更数据并设置到LastData

修复结果

施肥操作现在应该能够正确返回包含更新土地信息的LastData,前端可以收到作物状态变更后的完整土地数据。

任务状态

✅ 已完成

相关文件

  • app/Module/Game/Providers/GameServiceProvider.php - 添加事件监听器注册
  • app/Module/Farm/Logics/CropLogic.php - 确认事件触发
  • app/Module/Game/Listeners/LandStatusChangedListener.php - 事件监听器
  • app/Module/AppGame/Listeners/AppGameProtobufResponseListener.php - LastData处理