Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
95.45% covered (success)
95.45%
21 / 22
50.00% covered (danger)
50.00%
1 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
MonstersDetectedEvent
95.45% covered (success)
95.45%
21 / 22
50.00% covered (danger)
50.00%
1 / 2
9
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 from
95.24% covered (success)
95.24%
20 / 21
0.00% covered (danger)
0.00%
0 / 1
8
1<?php
2
3declare(strict_types=1);
4
5namespace AqwSocketClient\Events;
6
7use AqwSocketClient\Enums\JsonMessageType;
8use AqwSocketClient\Interfaces\EventInterface;
9use AqwSocketClient\Interfaces\MessageInterface;
10use AqwSocketClient\Messages\JsonMessage;
11use AqwSocketClient\Objects\GameFileMetadata;
12use AqwSocketClient\Objects\Identifiers\MonsterIdentifier;
13use AqwSocketClient\Objects\Levels\MonsterLevel;
14use AqwSocketClient\Objects\Monster\Health;
15use AqwSocketClient\Objects\Monster\Monster;
16use AqwSocketClient\Objects\Names\MonsterName;
17use Override;
18use Psl\Dict;
19use Psl\Iter;
20
21final class MonstersDetectedEvent implements EventInterface
22{
23    /**
24     * @param Monster[] $monsters
25     */
26    public function __construct(
27        public readonly array $monsters,
28    ) {}
29
30    /**
31     * @return ?MonstersDetectedEvent
32     * @mago-ignore analyzer:mixed-argument,mixed-array-access,mixed-assignment,less-specific-nested-argument-type
33     */
34    #[Override]
35    public static function from(MessageInterface $message): ?EventInterface
36    {
37        if ($message instanceof JsonMessage && $message->type === JsonMessageType::JoinedArea) {
38            $data = $message->data;
39
40            if (!Iter\contains_key($data, 'mondef') || !Iter\contains_key($data, 'monBranch')) {
41                return null;
42            }
43            /** @var array{mondef: array, monBranch: array} $data */
44
45            $monBranchById = Dict\reindex($data['monBranch'], static fn($m) => $m['MonID']);
46
47            $monsters = [];
48            foreach ($data['mondef'] as $monDef) {
49                $monId = (int) $monDef['MonID'];
50
51                if (!Iter\contains_key($monBranchById, $monId)) {
52                    continue;
53                }
54
55                $monBranch = $monBranchById[$monId];
56
57                $identifier = new MonsterIdentifier($monId);
58                $name = new MonsterName($monDef['strMonName']);
59                $level = new MonsterLevel((int) $monDef['intLevel']);
60                $health = new Health((int) $monBranch['intHPMax']);
61
62                $fileMetadata = new GameFileMetadata($monDef['strLinkage'], $monDef['strMonFileName']);
63
64                $monsters[] = new Monster($identifier, $name, $level, $health, $fileMetadata);
65            }
66
67            if ($monsters === []) {
68                return null;
69            }
70
71            return new self($monsters);
72        }
73
74        return null;
75    }
76}