ProtobufConverter.php 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. <?php
  2. namespace App\Module\Game\Services;
  3. use App\Module\Game\Dtos\ConsumeGroupDto;
  4. use App\Module\Game\Dtos\ConsumeItemDto;
  5. use App\Module\Game\Dtos\RewardGroupDto;
  6. use App\Module\Game\Dtos\RewardItemDto;
  7. use App\Module\Game\Enums\CONSUME_TYPE;
  8. use App\Module\Game\Enums\REWARD_TYPE;
  9. use Uraus\Kku\Common\Deduct;
  10. use Uraus\Kku\Common\DeductCoin;
  11. use Uraus\Kku\Common\DeductItem;
  12. use Uraus\Kku\Common\Reward;
  13. use Uraus\Kku\Common\RewardCoin;
  14. use Uraus\Kku\Common\RewardItem;
  15. use Uraus\Kku\Common\RewardGod;
  16. use Uraus\Kku\Common\RewardPets;
  17. use Uraus\Kku\Common\RewardPetPowers;
  18. use Uraus\Kku\Common\RewardSkin;
  19. /**
  20. * Protobuf转换器
  21. *
  22. * 负责将DTO对象转换为Protobuf对象
  23. */
  24. class ProtobufConverter
  25. {
  26. /**
  27. * 将消耗组DTO转换为Protobuf Deduct对象
  28. *
  29. * @param ConsumeGroupDto $consumeGroupDto 消耗组DTO
  30. * @return Deduct Protobuf Deduct对象
  31. */
  32. public static function convertConsumeGroupToDeduct(ConsumeGroupDto $consumeGroupDto): Deduct
  33. {
  34. $deduct = new Deduct();
  35. $coins = [];
  36. $items = [];
  37. foreach ($consumeGroupDto->items as $item) {
  38. switch ($item->consumeType) {
  39. case CONSUME_TYPE::ITEM->value:
  40. $deductItem = new DeductItem();
  41. $deductItem->setItemId($item->targetId);
  42. $deductItem->setInstanceId(0); // 默认为0,表示不指定实例
  43. $deductItem->setQuantity($item->quantity);
  44. $items[] = $deductItem;
  45. break;
  46. case CONSUME_TYPE::CURRENCY->value:
  47. case CONSUME_TYPE::FUND_CONFIG->value:
  48. case CONSUME_TYPE::FUND_CONFIGS->value:
  49. $deductCoin = new DeductCoin();
  50. $deductCoin->setType($item->targetId);
  51. $deductCoin->setQuantity($item->quantity);
  52. $coins[] = $deductCoin;
  53. break;
  54. }
  55. }
  56. $deduct->setCoins($coins);
  57. $deduct->setItems($items);
  58. return $deduct;
  59. }
  60. /**
  61. * 将奖励组DTO转换为Protobuf Reward对象
  62. *
  63. * @param RewardGroupDto $rewardGroupDto 奖励组DTO
  64. * @return Reward Protobuf Reward对象
  65. */
  66. public static function convertRewardGroupToReward(RewardGroupDto $rewardGroupDto): Reward
  67. {
  68. $reward = new Reward();
  69. $coins = [];
  70. $items = [];
  71. $gods = [];
  72. $pets = [];
  73. $petPowers = [];
  74. $skins = [];
  75. foreach ($rewardGroupDto->items as $item) {
  76. switch ($item->rewardType) {
  77. case REWARD_TYPE::ITEM->value:
  78. $rewardItem = new RewardItem();
  79. $rewardItem->setItemId($item->targetId);
  80. $rewardItem->setInstanceId(0); // 默认为0
  81. $rewardItem->setQuantity($item->quantity);
  82. // 设置随机数量范围(用于奖励预览)
  83. if ($item->minQuantity !== null && $item->maxQuantity !== null) {
  84. $rewardItem->setMinQuantity($item->minQuantity);
  85. $rewardItem->setMaxQuantity($item->maxQuantity);
  86. } else {
  87. $rewardItem->setMinQuantity($item->quantity);
  88. $rewardItem->setMaxQuantity($item->quantity);
  89. }
  90. $items[] = $rewardItem;
  91. break;
  92. case REWARD_TYPE::CURRENCY->value:
  93. case REWARD_TYPE::FUND_CONFIG->value:
  94. $rewardCoin = new RewardCoin();
  95. $rewardCoin->setType($item->targetId);
  96. $rewardCoin->setQuantity($item->quantity);
  97. $coins[] = $rewardCoin;
  98. break;
  99. case REWARD_TYPE::FARM_SHRINE->value:
  100. $rewardGod = new RewardGod();
  101. $rewardGod->setType($item->targetId);
  102. // 将小时转换为秒
  103. $durationHours = $item->param2 > 0 ? $item->param2 : 24; // 默认24小时
  104. $rewardGod->setDiff($durationHours * 3600); // 转换为秒
  105. $rewardGod->setQuantity($item->quantity);
  106. $gods[] = $rewardGod;
  107. break;
  108. case REWARD_TYPE::PET->value:
  109. $rewardPet = new RewardPets();
  110. $rewardPet->setPetType($item->targetId);
  111. $rewardPet->setQuantity($item->quantity);
  112. $pets[] = $rewardPet;
  113. break;
  114. case REWARD_TYPE::PET_POWER->value:
  115. $rewardPetPower = new RewardPetPowers();
  116. $rewardPetPower->setPetId($item->targetId);
  117. $rewardPetPower->setQuantity($item->quantity);
  118. $petPowers[] = $rewardPetPower;
  119. break;
  120. case REWARD_TYPE::SKIN->value:
  121. $rewardSkin = new RewardSkin();
  122. $rewardSkin->setId($item->targetId);
  123. $rewardSkin->setQuantity($item->quantity);
  124. $skins[] = $rewardSkin;
  125. break;
  126. }
  127. }
  128. $reward->setCoins($coins);
  129. $reward->setItems($items);
  130. $reward->setGods($gods);
  131. $reward->setPets($pets);
  132. $reward->setPetPowers($petPowers);
  133. $reward->setSkins($skins);
  134. return $reward;
  135. }
  136. /**
  137. * 将单个消耗项DTO转换为对应的Protobuf对象
  138. *
  139. * @param ConsumeItemDto $consumeItemDto 消耗项DTO
  140. * @return DeductCoin|DeductItem|null 对应的Protobuf对象
  141. */
  142. public static function convertConsumeItemToProtobuf(ConsumeItemDto $consumeItemDto)
  143. {
  144. switch ($consumeItemDto->consumeType) {
  145. case CONSUME_TYPE::ITEM->value:
  146. $deductItem = new DeductItem();
  147. $deductItem->setItemId($consumeItemDto->targetId);
  148. $deductItem->setInstanceId(0);
  149. $deductItem->setQuantity($consumeItemDto->quantity);
  150. return $deductItem;
  151. case CONSUME_TYPE::CURRENCY->value:
  152. case CONSUME_TYPE::FUND_CONFIG->value:
  153. case CONSUME_TYPE::FUND_CONFIGS->value:
  154. $deductCoin = new DeductCoin();
  155. $deductCoin->setType($consumeItemDto->targetId);
  156. $deductCoin->setQuantity($consumeItemDto->quantity);
  157. return $deductCoin;
  158. default:
  159. return null;
  160. }
  161. }
  162. /**
  163. * 将单个奖励项DTO转换为对应的Protobuf对象
  164. *
  165. * @param RewardItemDto $rewardItemDto 奖励项DTO
  166. * @return RewardCoin|RewardItem|RewardGod|RewardPets|RewardPetPowers|RewardSkin|null 对应的Protobuf对象
  167. */
  168. public static function convertRewardItemToProtobuf(RewardItemDto $rewardItemDto)
  169. {
  170. switch ($rewardItemDto->rewardType) {
  171. case REWARD_TYPE::ITEM->value:
  172. $rewardItem = new RewardItem();
  173. $rewardItem->setItemId($rewardItemDto->targetId);
  174. $rewardItem->setInstanceId(0);
  175. $rewardItem->setQuantity($rewardItemDto->quantity);
  176. if ($rewardItemDto->minQuantity !== null && $rewardItemDto->maxQuantity !== null) {
  177. $rewardItem->setMinQuantity($rewardItemDto->minQuantity);
  178. $rewardItem->setMaxQuantity($rewardItemDto->maxQuantity);
  179. } else {
  180. $rewardItem->setMinQuantity($rewardItemDto->quantity);
  181. $rewardItem->setMaxQuantity($rewardItemDto->quantity);
  182. }
  183. return $rewardItem;
  184. case REWARD_TYPE::CURRENCY->value:
  185. case REWARD_TYPE::FUND_CONFIG->value:
  186. $rewardCoin = new RewardCoin();
  187. $rewardCoin->setType($rewardItemDto->targetId);
  188. $rewardCoin->setQuantity($rewardItemDto->quantity);
  189. return $rewardCoin;
  190. case REWARD_TYPE::FARM_SHRINE->value:
  191. $rewardGod = new RewardGod();
  192. $rewardGod->setType($rewardItemDto->targetId);
  193. // 将小时转换为秒
  194. $durationHours = $rewardItemDto->param2 > 0 ? $rewardItemDto->param2 : 24; // 默认24小时
  195. $rewardGod->setDiff($durationHours * 3600); // 转换为秒
  196. $rewardGod->setQuantity($rewardItemDto->quantity);
  197. return $rewardGod;
  198. case REWARD_TYPE::PET->value:
  199. $rewardPet = new RewardPets();
  200. $rewardPet->setPetType($rewardItemDto->targetId);
  201. $rewardPet->setQuantity($rewardItemDto->quantity);
  202. return $rewardPet;
  203. case REWARD_TYPE::PET_POWER->value:
  204. $rewardPetPower = new RewardPetPowers();
  205. $rewardPetPower->setPetId($rewardItemDto->targetId);
  206. $rewardPetPower->setQuantity($rewardItemDto->quantity);
  207. return $rewardPetPower;
  208. case REWARD_TYPE::SKIN->value:
  209. $rewardSkin = new RewardSkin();
  210. $rewardSkin->setId($rewardItemDto->targetId);
  211. $rewardSkin->setQuantity($rewardItemDto->quantity);
  212. return $rewardSkin;
  213. default:
  214. return null;
  215. }
  216. }
  217. }