1
+ <?php
2
+ /**
3
+ * Copyright 2021-2022 SpiceX
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ declare (strict_types=1 );
18
+ namespace rxffa \spicex \rxffa ;
19
+
20
+ use pocketmine \entity \EntityDataHelper ;
21
+ use pocketmine \entity \EntityFactory ;
22
+ use pocketmine \event \entity \EntityTeleportEvent ;
23
+ use pocketmine \event \Listener ;
24
+ use pocketmine \event \player \PlayerQuitEvent ;
25
+ use pocketmine \item \enchantment \EnchantmentInstance ;
26
+ use pocketmine \item \enchantment \VanillaEnchantments ;
27
+ use pocketmine \item \ItemFactory ;
28
+ use pocketmine \item \ItemIds ;
29
+ use pocketmine \nbt \tag \CompoundTag ;
30
+ use pocketmine \player \Player ;
31
+ use pocketmine \plugin \PluginBase ;
32
+ use pocketmine \world \World ;
33
+ use rxffa \spicex \rxffa \command \FFACommand ;
34
+ use rxffa \spicex \rxffa \event \PlayerGameJoinEvent ;
35
+ use rxffa \spicex \rxffa \event \PlayerGameQuitEvent ;
36
+ use rxffa \spicex \rxffa \listener \GameListener ;
37
+ use rxffa \spicex \rxffa \model \GameModel ;
38
+ use rxffa \spicex \rxffa \model \TopsModel ;
39
+ use rxffa \spicex \rxffa \provider \YamlDataProvider ;
40
+ use rxffa \spicex \rxffa \scoreboard \ScoreboardFactory ;
41
+ use rxffa \spicex \rxffa \session \SessionFactory ;
42
+ use rxffa \spicex \rxffa \util \Messages ;
43
+
44
+ /**
45
+ * Class RXFFA
46
+ * @package rxffa\spicex\rxffa
47
+ */
48
+ class RXFFA extends PluginBase implements Listener
49
+ {
50
+ /** @var RXFFA */
51
+ private static RXFFA $ instance ;
52
+ /** @var YamlDataProvider */
53
+ private YamlDataProvider $ yamlProvider ;
54
+
55
+ public function onEnable (): void
56
+ {
57
+ self ::$ instance = $ this ;
58
+ $ this ->yamlProvider = new YamlDataProvider ($ this );
59
+ $ this ->getServer ()->getPluginManager ()->registerEvents (new GameListener ($ this ), $ this );
60
+ $ this ->getServer ()->getPluginManager ()->registerEvents ($ this , $ this );
61
+ $ this ->getServer ()->getCommandMap ()->register ('ffa ' , new FFACommand ($ this ), 'ffa ' );
62
+ EntityFactory::getInstance ()->register (GameModel::class, function (World $ world , CompoundTag $ nbt ): GameModel {
63
+ return new GameModel (EntityDataHelper::parseLocation ($ nbt , $ world ), GameModel::parseSkinNBT ($ nbt ), $ nbt );
64
+ }, ['GameModel ' ]);
65
+ EntityFactory::getInstance ()->register (TopsModel::class, function (World $ world , CompoundTag $ nbt ): TopsModel {
66
+ return new TopsModel (EntityDataHelper::parseLocation ($ nbt , $ world ), TopsModel::parseSkinNBT ($ nbt ), $ nbt );
67
+ }, ['TopsModel ' ]);
68
+ ScoreboardFactory::init ();
69
+ }
70
+
71
+ public function onDisable (): void
72
+ {
73
+ $ this ->saveSessions ();
74
+ }
75
+
76
+ /**
77
+ * @param Player $player
78
+ */
79
+ public function joinGame (Player $ player ): void
80
+ {
81
+ SessionFactory::createSession ($ player );
82
+ ScoreboardFactory::createScoreboard ($ player );
83
+ $ arena = $ this ->getServer ()->getWorldManager ()->getWorldByName ($ this ->yamlProvider ->getArena ());
84
+ $ items = [
85
+ ItemFactory::getInstance ()->get (ItemIds::DIAMOND_SWORD )->addEnchantment (new EnchantmentInstance (VanillaEnchantments::SHARPNESS ())),
86
+ ItemFactory::getInstance ()->get (ItemIds::STEAK , 0 , 32 ),
87
+ ItemFactory::getInstance ()->get (ItemIds::GOLDEN_APPLE , 0 , 3 ),
88
+ ItemFactory::getInstance ()->get (ItemIds::BOW , 0 , 1 ),
89
+ ItemFactory::getInstance ()->get (ItemIds::ARROW , 0 , 16 ),
90
+ ];
91
+ $ helmet = ItemFactory::getInstance ()->get (ItemIds::DIAMOND_HELMET )->addEnchantment (new EnchantmentInstance (VanillaEnchantments::PROTECTION (), 2 ));
92
+ $ chestplate = ItemFactory::getInstance ()->get (ItemIds::DIAMOND_CHESTPLATE )->addEnchantment (new EnchantmentInstance (VanillaEnchantments::PROTECTION (), 2 ));
93
+ $ leggings = ItemFactory::getInstance ()->get (ItemIds::DIAMOND_LEGGINGS )->addEnchantment (new EnchantmentInstance (VanillaEnchantments::PROTECTION (), 2 ));
94
+ $ boots = ItemFactory::getInstance ()->get (ItemIds::DIAMOND_BOOTS )->addEnchantment (new EnchantmentInstance (VanillaEnchantments::PROTECTION (), 2 ));
95
+
96
+ // clearly teleport
97
+ $ player ->getEffects ()->clear ();
98
+ $ player ->getArmorInventory ()->clearAll ();
99
+ $ player ->getInventory ()->clearAll ();
100
+ $ player ->getCursorInventory ()->clearAll ();
101
+ $ player ->getHungerManager ()->setEnabled (true );
102
+ $ player ->getHungerManager ()->setFood (20.0 );
103
+ $ player ->setHealth (20.0 );
104
+ $ player ->teleport ($ arena ->getSafeSpawn ());
105
+
106
+ // items equiment
107
+ foreach ($ items as $ item ) {
108
+ $ player ->getInventory ()->addItem ($ item );
109
+ }
110
+
111
+ // armor equipment
112
+ $ player ->getArmorInventory ()->setHelmet ($ helmet );
113
+ $ player ->getArmorInventory ()->setChestplate ($ chestplate );
114
+ $ player ->getArmorInventory ()->setLeggings ($ leggings );
115
+ $ player ->getArmorInventory ()->setBoots ($ boots );
116
+
117
+ // extras
118
+ $ player ->sendTitle (Messages::JOIN_GAME_TITLE , Messages::JOIN_GAME_SUBTITLE );
119
+ }
120
+
121
+ /**
122
+ * @param Player $player
123
+ * @return bool
124
+ */
125
+ public function exitGame (Player $ player ): bool
126
+ {
127
+ ScoreboardFactory::removeSecoreboard ($ player );
128
+ $ player ->getEffects ()->clear ();
129
+ $ player ->getArmorInventory ()->clearAll ();
130
+ $ player ->getInventory ()->clearAll ();
131
+ $ player ->getCursorInventory ()->clearAll ();
132
+ $ player ->getHungerManager ()->setEnabled (false );
133
+ $ player ->getHungerManager ()->setFood (20.0 );
134
+ $ player ->setHealth (20.0 );
135
+ $ player ->teleport ($ this ->getServer ()->getWorldManager ()->getDefaultWorld ()->getSafeSpawn ());
136
+ $ player ->sendMessage (Messages::EXIT_MESSAGE );
137
+ return true ;
138
+ }
139
+
140
+ final protected function saveSessions ()
141
+ {
142
+ foreach (SessionFactory::getSessions () as $ session ) {
143
+ $ session ->save ();
144
+ }
145
+ }
146
+
147
+ /**
148
+ * @param EntityTeleportEvent $event
149
+ */
150
+ public function onEntityTeleportEvent (EntityTeleportEvent $ event ): void
151
+ {
152
+ $ to = $ event ->getTo ()->getWorld ()->getFolderName ();
153
+ $ from = $ event ->getFrom ()->getWorld ()->getFolderName ();
154
+ $ entity = $ event ->getEntity ();
155
+ $ arena = $ this ->yamlProvider ->getArena ();
156
+ if (!$ entity instanceof Player) return ;
157
+ if ($ from === $ arena ){
158
+ SessionFactory::removeSession ($ entity );
159
+ }
160
+ $ event = match ($ to ) {
161
+ $ arena => new PlayerGameJoinEvent ($ entity , $ this ),
162
+ default => ($ from === $ arena ) ? new PlayerGameQuitEvent ($ entity , $ this ) : null ,
163
+ };
164
+ if (!$ event ?->isCancelled()) {
165
+ $ event ?->call();
166
+ }
167
+ }
168
+
169
+ /**
170
+ * @param PlayerQuitEvent $event
171
+ */
172
+ public function onPlayerQuitEvent (PlayerQuitEvent $ event ): void
173
+ {
174
+ $ player = $ event ->getPlayer ();
175
+ $ session = SessionFactory::getSession ($ player );
176
+ $ event = $ session != null ? new PlayerGameQuitEvent ($ player , $ this ) : null ;
177
+ if (!$ event ?->isCancelled()) {
178
+ SessionFactory::removeSession ($ player );
179
+ ScoreboardFactory::removeSecoreboard ($ player );
180
+ $ event ?->call();
181
+ $ session ?->save();
182
+ }
183
+ }
184
+
185
+ /**
186
+ * @return RXFFA
187
+ */
188
+ public static function getInstance (): RXFFA
189
+ {
190
+ return self ::$ instance ;
191
+ }
192
+
193
+ /**
194
+ * @return YamlDataProvider
195
+ */
196
+ public function getYamlProvider (): YamlDataProvider
197
+ {
198
+ return $ this ->yamlProvider ;
199
+ }
200
+
201
+ }
0 commit comments