GameUserSkin.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <?php
  2. namespace App\Module\Game\Models;
  3. use UCore\ModelCore;
  4. use Illuminate\Database\Eloquent\Relations\BelongsTo;
  5. /**
  6. * 用户皮肤模型
  7. *
  8. * field start
  9. * @property int $id 主键
  10. * @property int $user_id 用户ID
  11. * @property int $current_skin_id 当前使用皮肤ID(1-4)
  12. * @property string $owned_skins 拥有的皮肤,逗号分隔,如"1,2,3"
  13. * @property \Carbon\Carbon $created_at 创建时间
  14. * @property \Carbon\Carbon $updated_at 更新时间
  15. * field end
  16. */
  17. class GameUserSkin extends ModelCore
  18. {
  19. /**
  20. * 与模型关联的表名
  21. *
  22. * @var string
  23. */
  24. protected $table = 'game_user_skins';
  25. // attrlist start
  26. protected $fillable = [
  27. 'id',
  28. 'user_id',
  29. 'current_skin_id',
  30. 'owned_skins',
  31. ];
  32. // attrlist end
  33. /**
  34. * 应该被转换为原生类型的属性
  35. *
  36. * @var array
  37. */
  38. protected $casts = [
  39. 'user_id' => 'integer',
  40. 'current_skin_id' => 'integer',
  41. 'owned_skins' => 'string',
  42. ];
  43. /**
  44. * 获取用户信息
  45. *
  46. * @return BelongsTo
  47. */
  48. public function user(): BelongsTo
  49. {
  50. return $this->belongsTo(\App\Module\User\Models\User::class, 'user_id', 'id');
  51. }
  52. /**
  53. * 获取拥有的皮肤数组
  54. *
  55. * @return array
  56. */
  57. public function getOwnedSkinsArrayAttribute(): array
  58. {
  59. if (empty($this->owned_skins)) {
  60. return [1]; // 默认拥有1号皮肤
  61. }
  62. return array_map('intval', explode(',', $this->owned_skins));
  63. }
  64. /**
  65. * 设置拥有的皮肤数组
  66. *
  67. * @param array $skins
  68. * @return void
  69. */
  70. public function setOwnedSkinsArray(array $skins): void
  71. {
  72. // 确保包含1号皮肤
  73. if (!in_array(1, $skins)) {
  74. $skins[] = 1;
  75. }
  76. // 去重并排序
  77. $skins = array_unique($skins);
  78. sort($skins);
  79. $this->owned_skins = implode(',', $skins);
  80. }
  81. /**
  82. * 检查是否拥有指定皮肤
  83. *
  84. * @param int $skinId
  85. * @return bool
  86. */
  87. public function hasSkin(int $skinId): bool
  88. {
  89. return in_array($skinId, $this->getOwnedSkinsArrayAttribute());
  90. }
  91. /**
  92. * 添加皮肤
  93. *
  94. * @param int $skinId
  95. * @return bool 是否成功添加(如果已拥有则返回false)
  96. */
  97. public function addSkin(int $skinId): bool
  98. {
  99. if ($this->hasSkin($skinId)) {
  100. return false; // 已经拥有
  101. }
  102. $skins = $this->getOwnedSkinsArrayAttribute();
  103. $skins[] = $skinId;
  104. $this->setOwnedSkinsArray($skins);
  105. return true;
  106. }
  107. /**
  108. * 切换当前皮肤
  109. *
  110. * @param int $skinId
  111. * @return bool 是否成功切换
  112. */
  113. public function changeSkin(int $skinId): bool
  114. {
  115. if (!$this->hasSkin($skinId)) {
  116. return false; // 不拥有该皮肤
  117. }
  118. $this->current_skin_id = $skinId;
  119. return true;
  120. }
  121. /**
  122. * 获取皮肤名称
  123. *
  124. * @param int $skinId
  125. * @return string
  126. */
  127. public static function getSkinName(int $skinId): string
  128. {
  129. $names = \App\Module\Game\Enums\SKIN::getValueDescription();
  130. return $names[$skinId] ?? '未知皮肤';
  131. }
  132. /**
  133. * 获取所有可用皮肤
  134. *
  135. * @return array
  136. */
  137. public static function getAllSkins(): array
  138. {
  139. return \App\Module\Game\Enums\SKIN::getValueDescription();
  140. }
  141. /**
  142. * 验证皮肤ID是否有效
  143. *
  144. * @param int $skinId
  145. * @return bool
  146. */
  147. public static function isValidSkinId(int $skinId): bool
  148. {
  149. return $skinId >= 1 && $skinId <= 4;
  150. }
  151. }