diff --git a/app/Http/Controllers/PlayerController.php b/app/Http/Controllers/PlayerController.php index c130d7fd..057ecb2c 100644 --- a/app/Http/Controllers/PlayerController.php +++ b/app/Http/Controllers/PlayerController.php @@ -196,6 +196,9 @@ class PlayerController extends Controller Filter $filter, Player $player ) { + /** @var User */ + $user = auth()->user(); + foreach (['skin', 'cape'] as $type) { $tid = $request->input($type); @@ -206,10 +209,14 @@ class PlayerController extends Controller if ($tid) { $texture = Texture::find($tid); - if (!$texture) { + if (empty($texture)) { return json(trans('skinlib.non-existent'), 1); } + if ($user->closet()->where('texture_tid', $tid)->doesntExist()) { + return json(trans('user.closet.remove.non-existent'), 1); + } + $dispatcher->dispatch('player.texture.updating', [$player, $texture]); $field = "tid_$type"; diff --git a/resources/misc/changelogs/en/5.1.0.md b/resources/misc/changelogs/en/5.1.0.md index 8e3a4513..93211835 100644 --- a/resources/misc/changelogs/en/5.1.0.md +++ b/resources/misc/changelogs/en/5.1.0.md @@ -12,3 +12,4 @@ - Fixed duplication of private textures. - Fixed that previews and avatars cannot be indivdually cached by image format. - Fixed that message for private textures doesn't match with HTTP status code. +- Fixed that texture isn't checked if it's existed in closet when being applied to player. diff --git a/resources/misc/changelogs/zh_CN/5.1.0.md b/resources/misc/changelogs/zh_CN/5.1.0.md index 93467163..9c7b06af 100644 --- a/resources/misc/changelogs/zh_CN/5.1.0.md +++ b/resources/misc/changelogs/zh_CN/5.1.0.md @@ -12,3 +12,4 @@ - 修复私有材质的重复问题 - 修复预览图和头像不能根据图像格式来单独缓存的问题 - 修复针对私有材质的错误消息不与 HTTP 状态码相符的问题 +- 修复应用材质到角色时未检查材质是否在衣柜中的问题 diff --git a/tests/HttpTest/ControllersTest/PlayerControllerTest.php b/tests/HttpTest/ControllersTest/PlayerControllerTest.php index d278e54d..dec16127 100644 --- a/tests/HttpTest/ControllersTest/PlayerControllerTest.php +++ b/tests/HttpTest/ControllersTest/PlayerControllerTest.php @@ -317,7 +317,7 @@ class PlayerControllerTest extends TestCase $player = factory(Player::class)->create(); $user = $player->user; $skin = factory(Texture::class)->create(); - $cape = factory(Texture::class)->states('cape')->create(); + $cape = factory(Texture::class)->state('cape')->create(); // rejected $filter = Fakes\Filter::fake(); @@ -333,15 +333,26 @@ class PlayerControllerTest extends TestCase ->assertJson(['code' => 1, 'message' => 'rejected']); $filter->remove('can_set_texture'); - // Set a not-existed texture + // set a not-existed texture $this->putJson(route('user.player.set', ['player' => $player]), ['skin' => -1]) ->assertJson([ 'code' => 1, 'message' => trans('skinlib.non-existent'), ]); - // Set for "skin" type + // set a private texture + $private = factory(Texture::class)->state('private')->create(); + $this->putJson( + route('user.player.set', ['player' => $player]), + ['skin' => $private->tid] + )->assertJson([ + 'code' => 1, + 'message' => trans('user.closet.remove.non-existent'), + ]); + + // set for "skin" type Event::fake(); + $user->closet()->attach($skin->tid, ['item_name' => $skin->name]); $this->putJson( route('user.player.set', ['player' => $player]), ['skin' => $skin->tid] @@ -370,8 +381,9 @@ class PlayerControllerTest extends TestCase } ); - // Set for "cape" type + // set for "cape" type Event::fake(); + $user->closet()->attach($cape->tid, ['item_name' => $cape->name]); $this->putJson( route('user.player.set', ['player' => $player]), ['cape' => $cape->tid]