Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
54 / 54
100.00% covered (success)
100.00%
2 / 2
CRAP
100.00% covered (success)
100.00%
1 / 1
QuestLoadedEvent
100.00% covered (success)
100.00%
54 / 54
100.00% covered (success)
100.00%
2 / 2
18
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 from
100.00% covered (success)
100.00%
53 / 53
100.00% covered (success)
100.00%
1 / 1
17
1<?php
2
3declare(strict_types=1);
4
5namespace AqwSocketClient\Events;
6
7use AqwSocketClient\Enums\JsonMessageType;
8use AqwSocketClient\Enums\Tag;
9use AqwSocketClient\Interfaces\EventInterface;
10use AqwSocketClient\Interfaces\MessageInterface;
11use AqwSocketClient\Messages\JsonMessage;
12use AqwSocketClient\Objects\Faction;
13use AqwSocketClient\Objects\Identifiers\ClassIdentifier;
14use AqwSocketClient\Objects\Identifiers\FactionIdentifier;
15use AqwSocketClient\Objects\Identifiers\ItemIdentifier;
16use AqwSocketClient\Objects\Identifiers\QuestIdentifier;
17use AqwSocketClient\Objects\Levels\PlayerLevel;
18use AqwSocketClient\Objects\Levels\Rank;
19use AqwSocketClient\Objects\Names\FactionName;
20use AqwSocketClient\Objects\Names\QuestName;
21use AqwSocketClient\Objects\Quest\ClassRankRequirement;
22use AqwSocketClient\Objects\Quest\ExperienceReward;
23use AqwSocketClient\Objects\Quest\GoldReward;
24use AqwSocketClient\Objects\Quest\ItemReward;
25use AqwSocketClient\Objects\Quest\LevelRequirement;
26use AqwSocketClient\Objects\Quest\Quest;
27use AqwSocketClient\Objects\Quest\QuestDescription;
28use AqwSocketClient\Objects\Quest\QuestTurnInItem;
29use AqwSocketClient\Objects\Quest\ReputationRequirement;
30use AqwSocketClient\Objects\Quest\ReputationReward;
31use Override;
32
33/** @mago-ignore lint:cyclomatic-complexity */
34final class QuestLoadedEvent implements EventInterface
35{
36    public function __construct(
37        public readonly Quest $quest,
38    ) {}
39
40    /**
41     * @return ?QuestLoadedEvent
42     * @mago-ignore analyzer:mixed-argument,mixed-array-access,mixed-assignment,mixed-operand,invalid-iterator,less-specific-nested-argument-type
43     * @mago-ignore lint:halstead
44     */
45    #[Override]
46    public static function from(MessageInterface $message): ?EventInterface
47    {
48        if (!($message instanceof JsonMessage && $message->type === JsonMessageType::QuestsLoaded)) {
49            return null;
50        }
51
52        $rawQuests = $message->data['quests'] ?? [];
53
54        if ($rawQuests === []) {
55            return null;
56        }
57
58        $q = reset($rawQuests);
59        $questId = key($rawQuests);
60
61        $faction = new Faction(new FactionIdentifier((int) $q['FactionID']), new FactionName($q['sFaction']));
62
63        $rewards = [];
64        if (($q['iExp'] ?? 0) > 0) {
65            $rewards[] = new ExperienceReward((int) $q['iExp']);
66        }
67        if (($q['iGold'] ?? 0) > 0) {
68            $rewards[] = new GoldReward((int) $q['iGold']);
69        }
70        if (($q['iRep'] ?? 0) > 0) {
71            $rewards[] = new ReputationReward((int) $q['iRep'], $faction);
72        }
73        foreach ($q['reward'] ?? [] as $r) {
74            $rewards[] = new ItemReward(new ItemIdentifier((int) $r['ItemID']), (int) $r['iRate'], (int) $r['iQty']);
75        }
76
77        $turnInItems = [];
78        foreach ($q['turnin'] ?? [] as $t) {
79            $turnInItems[] = new QuestTurnInItem(new ItemIdentifier((int) $t['ItemID']), (int) $t['iQty']);
80        }
81
82        $tags = [];
83        if ($q['bOnce'] ?? false) {
84            $tags[] = Tag::OneTime;
85        }
86        if ($q['bUpg'] ?? false) {
87            $tags[] = Tag::MemberOnly;
88        }
89        if ($q['bStaff'] ?? false) {
90            $tags[] = Tag::StaffOnly;
91        }
92        if ($q['bGuild'] ?? false) {
93            $tags[] = Tag::GuildQuest;
94        }
95
96        $requirements = [];
97        if (($q['iLvl'] ?? 0) > 0) {
98            $requirements[] = new LevelRequirement(new PlayerLevel((int) $q['iLvl']));
99        }
100        if (($q['iReqRep'] ?? 0) > 0) {
101            $requirements[] = new ReputationRequirement(
102                new FactionIdentifier((int) $q['FactionID']),
103                new Rank((int) $q['iReqRep']),
104            );
105        }
106        if (($q['iReqCP'] ?? 0) > 0) {
107            $requirements[] = new ClassRankRequirement(
108                new ClassIdentifier((int) $q['iClass']),
109                new Rank((int) $q['iReqCP']),
110            );
111        }
112
113        return new self(
114            new Quest(
115                new QuestIdentifier((int) $questId),
116                new QuestName($q['sName']),
117                new QuestDescription($q['sDesc'], $q['sEndText'] !== '' ? $q['sEndText'] : null),
118                $requirements,
119                $rewards,
120                $turnInItems,
121                $tags,
122            ),
123        );
124    }
125}