PocketMine-MP 5.39.2 git-7ad037014ecec1ddc7a9bba215beb03e659ea931
Loading...
Searching...
No Matches
VanillaEnchantments.php
1<?php
2
3/*
4 *
5 * ____ _ _ __ __ _ __ __ ____
6 * | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
7 * | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
8 * | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
9 * |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
10 *
11 * This program is free software: you can redistribute it and/or modify
12 * it under the terms of the GNU Lesser General Public License as published by
13 * the Free Software Foundation, either version 3 of the License, or
14 * (at your option) any later version.
15 *
16 * @author PocketMine Team
17 * @link http://www.pocketmine.net/
18 *
19 *
20 */
21
22declare(strict_types=1);
23
24namespace pocketmine\item\enchantment;
25
26use function array_keys;
27use function count;
28use function implode;
29use function mb_strtoupper;
30
39 private static Enchantment $_mAQUA_AFFINITY;
40 private static ProtectionEnchantment $_mBLAST_PROTECTION;
41 private static Enchantment $_mEFFICIENCY;
42 private static ProtectionEnchantment $_mFEATHER_FALLING;
43 private static FireAspectEnchantment $_mFIRE_ASPECT;
44 private static ProtectionEnchantment $_mFIRE_PROTECTION;
45 private static Enchantment $_mFLAME;
46 private static Enchantment $_mFORTUNE;
47 private static Enchantment $_mFROST_WALKER;
48 private static Enchantment $_mINFINITY;
49 private static KnockbackEnchantment $_mKNOCKBACK;
50 private static Enchantment $_mMENDING;
51 private static Enchantment $_mPOWER;
52 private static ProtectionEnchantment $_mPROJECTILE_PROTECTION;
53 private static ProtectionEnchantment $_mPROTECTION;
54 private static Enchantment $_mPUNCH;
55 private static Enchantment $_mRESPIRATION;
56 private static SharpnessEnchantment $_mSHARPNESS;
57 private static Enchantment $_mSILK_TOUCH;
58 private static Enchantment $_mSWIFT_SNEAK;
59 private static Enchantment $_mTHORNS;
60 private static Enchantment $_mUNBREAKING;
61 private static Enchantment $_mVANISHING;
62
67 private static array $members;
68
69 private static bool $initialized = false;
70
71 private function __construct(){
72 //NOOP
73 }
74
81 private static function unsafeAssign(\Closure $closure, Enchantment $memberValue) : void{
87 $closure($memberValue);
88 }
89
94 private static function getInitAssigners() : array{
95 return [
96 "AQUA_AFFINITY" => fn(Enchantment $v) => self::$_mAQUA_AFFINITY = $v,
97 "BLAST_PROTECTION" => fn(ProtectionEnchantment $v) => self::$_mBLAST_PROTECTION = $v,
98 "EFFICIENCY" => fn(Enchantment $v) => self::$_mEFFICIENCY = $v,
99 "FEATHER_FALLING" => fn(ProtectionEnchantment $v) => self::$_mFEATHER_FALLING = $v,
100 "FIRE_ASPECT" => fn(FireAspectEnchantment $v) => self::$_mFIRE_ASPECT = $v,
101 "FIRE_PROTECTION" => fn(ProtectionEnchantment $v) => self::$_mFIRE_PROTECTION = $v,
102 "FLAME" => fn(Enchantment $v) => self::$_mFLAME = $v,
103 "FORTUNE" => fn(Enchantment $v) => self::$_mFORTUNE = $v,
104 "FROST_WALKER" => fn(Enchantment $v) => self::$_mFROST_WALKER = $v,
105 "INFINITY" => fn(Enchantment $v) => self::$_mINFINITY = $v,
106 "KNOCKBACK" => fn(KnockbackEnchantment $v) => self::$_mKNOCKBACK = $v,
107 "MENDING" => fn(Enchantment $v) => self::$_mMENDING = $v,
108 "POWER" => fn(Enchantment $v) => self::$_mPOWER = $v,
109 "PROJECTILE_PROTECTION" => fn(ProtectionEnchantment $v) => self::$_mPROJECTILE_PROTECTION = $v,
110 "PROTECTION" => fn(ProtectionEnchantment $v) => self::$_mPROTECTION = $v,
111 "PUNCH" => fn(Enchantment $v) => self::$_mPUNCH = $v,
112 "RESPIRATION" => fn(Enchantment $v) => self::$_mRESPIRATION = $v,
113 "SHARPNESS" => fn(SharpnessEnchantment $v) => self::$_mSHARPNESS = $v,
114 "SILK_TOUCH" => fn(Enchantment $v) => self::$_mSILK_TOUCH = $v,
115 "SWIFT_SNEAK" => fn(Enchantment $v) => self::$_mSWIFT_SNEAK = $v,
116 "THORNS" => fn(Enchantment $v) => self::$_mTHORNS = $v,
117 "UNBREAKING" => fn(Enchantment $v) => self::$_mUNBREAKING = $v,
118 "VANISHING" => fn(Enchantment $v) => self::$_mVANISHING = $v,
119 ];
120 }
121
122 private static function init() : void{
123 //This nasty mess of closures allows us to suppress PHPStan type assignment errors in one place instead of
124 //on every single assignment. This will only run one time on first init, so it's fine for performance.
125 if(self::$initialized){
126 throw new \LogicException("Circular dependency detected - use RegistrySource->registerDelayed() if the circular dependency can't be avoided");
127 }
128 self::$initialized = true;
129 $assigners = self::getInitAssigners();
130 $assigned = [];
131 $source = new VanillaEnchantmentsInputs();
132 foreach($source->getAllValues() as $name => $value){
133 $assigner = $assigners[$name] ?? throw new \LogicException("Unexpected source registry member \"$name\" (code probably needs regenerating)");
134 if(isset($assigned[$name])){
135 //this should be prevented by RegistrySource, but it doesn't hurt to have some redundancy
136 throw new \LogicException("Repeated registry source member \"$name\"");
137 }
138 self::$members[mb_strtoupper($name)] = $value;
139 $assigned[$name] = true;
140 unset($assigners[$name]);
141 self::unsafeAssign($assigner, $value);
142 }
143 if(count($assigners) > 0){
144 throw new \LogicException("Missing values for registry members (code probably needs regenerating): " . implode(", ", array_keys($assigners)));
145 }
146 }
147
152 public static function getAll() : array{
153 if(!isset(self::$members)){ self::init(); }
154 return self::$members;
155 }
156
157 public static function AQUA_AFFINITY() : Enchantment{
158 if(!isset(self::$_mAQUA_AFFINITY)){ self::init(); }
159 return self::$_mAQUA_AFFINITY;
160 }
161
162 public static function BLAST_PROTECTION() : ProtectionEnchantment{
163 if(!isset(self::$_mBLAST_PROTECTION)){ self::init(); }
164 return self::$_mBLAST_PROTECTION;
165 }
166
167 public static function EFFICIENCY() : Enchantment{
168 if(!isset(self::$_mEFFICIENCY)){ self::init(); }
169 return self::$_mEFFICIENCY;
170 }
171
172 public static function FEATHER_FALLING() : ProtectionEnchantment{
173 if(!isset(self::$_mFEATHER_FALLING)){ self::init(); }
174 return self::$_mFEATHER_FALLING;
175 }
176
177 public static function FIRE_ASPECT() : FireAspectEnchantment{
178 if(!isset(self::$_mFIRE_ASPECT)){ self::init(); }
179 return self::$_mFIRE_ASPECT;
180 }
181
182 public static function FIRE_PROTECTION() : ProtectionEnchantment{
183 if(!isset(self::$_mFIRE_PROTECTION)){ self::init(); }
184 return self::$_mFIRE_PROTECTION;
185 }
186
187 public static function FLAME() : Enchantment{
188 if(!isset(self::$_mFLAME)){ self::init(); }
189 return self::$_mFLAME;
190 }
191
192 public static function FORTUNE() : Enchantment{
193 if(!isset(self::$_mFORTUNE)){ self::init(); }
194 return self::$_mFORTUNE;
195 }
196
197 public static function FROST_WALKER() : Enchantment{
198 if(!isset(self::$_mFROST_WALKER)){ self::init(); }
199 return self::$_mFROST_WALKER;
200 }
201
202 public static function INFINITY() : Enchantment{
203 if(!isset(self::$_mINFINITY)){ self::init(); }
204 return self::$_mINFINITY;
205 }
206
207 public static function KNOCKBACK() : KnockbackEnchantment{
208 if(!isset(self::$_mKNOCKBACK)){ self::init(); }
209 return self::$_mKNOCKBACK;
210 }
211
212 public static function MENDING() : Enchantment{
213 if(!isset(self::$_mMENDING)){ self::init(); }
214 return self::$_mMENDING;
215 }
216
217 public static function POWER() : Enchantment{
218 if(!isset(self::$_mPOWER)){ self::init(); }
219 return self::$_mPOWER;
220 }
221
222 public static function PROJECTILE_PROTECTION() : ProtectionEnchantment{
223 if(!isset(self::$_mPROJECTILE_PROTECTION)){ self::init(); }
224 return self::$_mPROJECTILE_PROTECTION;
225 }
226
227 public static function PROTECTION() : ProtectionEnchantment{
228 if(!isset(self::$_mPROTECTION)){ self::init(); }
229 return self::$_mPROTECTION;
230 }
231
232 public static function PUNCH() : Enchantment{
233 if(!isset(self::$_mPUNCH)){ self::init(); }
234 return self::$_mPUNCH;
235 }
236
237 public static function RESPIRATION() : Enchantment{
238 if(!isset(self::$_mRESPIRATION)){ self::init(); }
239 return self::$_mRESPIRATION;
240 }
241
242 public static function SHARPNESS() : SharpnessEnchantment{
243 if(!isset(self::$_mSHARPNESS)){ self::init(); }
244 return self::$_mSHARPNESS;
245 }
246
247 public static function SILK_TOUCH() : Enchantment{
248 if(!isset(self::$_mSILK_TOUCH)){ self::init(); }
249 return self::$_mSILK_TOUCH;
250 }
251
252 public static function SWIFT_SNEAK() : Enchantment{
253 if(!isset(self::$_mSWIFT_SNEAK)){ self::init(); }
254 return self::$_mSWIFT_SNEAK;
255 }
256
257 public static function THORNS() : Enchantment{
258 if(!isset(self::$_mTHORNS)){ self::init(); }
259 return self::$_mTHORNS;
260 }
261
262 public static function UNBREAKING() : Enchantment{
263 if(!isset(self::$_mUNBREAKING)){ self::init(); }
264 return self::$_mUNBREAKING;
265 }
266
267 public static function VANISHING() : Enchantment{
268 if(!isset(self::$_mVANISHING)){ self::init(); }
269 return self::$_mVANISHING;
270 }
271}