PocketMine-MP 5.39.3 git-66148f13a91e4af6778ba9f200ca25ad8a04a584
Loading...
Searching...
No Matches
VanillaEffects.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\entity\effect;
25
26use function array_keys;
27use function count;
28use function implode;
29use function mb_strtoupper;
30
38final class VanillaEffects{
39 private static AbsorptionEffect $_mABSORPTION;
40 private static Effect $_mBLINDNESS;
41 private static Effect $_mCONDUIT_POWER;
42 private static Effect $_mDARKNESS;
43 private static PoisonEffect $_mFATAL_POISON;
44 private static Effect $_mFIRE_RESISTANCE;
45 private static Effect $_mHASTE;
46 private static HealthBoostEffect $_mHEALTH_BOOST;
47 private static HungerEffect $_mHUNGER;
48 private static InstantDamageEffect $_mINSTANT_DAMAGE;
49 private static InstantHealthEffect $_mINSTANT_HEALTH;
50 private static InvisibilityEffect $_mINVISIBILITY;
51 private static Effect $_mJUMP_BOOST;
52 private static LevitationEffect $_mLEVITATION;
53 private static Effect $_mMINING_FATIGUE;
54 private static Effect $_mNAUSEA;
55 private static Effect $_mNIGHT_VISION;
56 private static PoisonEffect $_mPOISON;
57 private static RegenerationEffect $_mREGENERATION;
58 private static Effect $_mRESISTANCE;
59 private static SaturationEffect $_mSATURATION;
60 private static SlownessEffect $_mSLOWNESS;
61 private static SpeedEffect $_mSPEED;
62 private static Effect $_mSTRENGTH;
63 private static Effect $_mWATER_BREATHING;
64 private static Effect $_mWEAKNESS;
65 private static WitherEffect $_mWITHER;
66
71 private static array $members;
72
73 private static bool $initialized = false;
74
75 private function __construct(){
76 //NOOP
77 }
78
85 private static function unsafeAssign(\Closure $closure, Effect $memberValue) : void{
91 $closure($memberValue);
92 }
93
98 private static function getInitAssigners() : array{
99 return [
100 "absorption" => fn(AbsorptionEffect $v) => self::$_mABSORPTION = $v,
101 "blindness" => fn(Effect $v) => self::$_mBLINDNESS = $v,
102 "conduit_power" => fn(Effect $v) => self::$_mCONDUIT_POWER = $v,
103 "darkness" => fn(Effect $v) => self::$_mDARKNESS = $v,
104 "fatal_poison" => fn(PoisonEffect $v) => self::$_mFATAL_POISON = $v,
105 "fire_resistance" => fn(Effect $v) => self::$_mFIRE_RESISTANCE = $v,
106 "haste" => fn(Effect $v) => self::$_mHASTE = $v,
107 "health_boost" => fn(HealthBoostEffect $v) => self::$_mHEALTH_BOOST = $v,
108 "hunger" => fn(HungerEffect $v) => self::$_mHUNGER = $v,
109 "instant_damage" => fn(InstantDamageEffect $v) => self::$_mINSTANT_DAMAGE = $v,
110 "instant_health" => fn(InstantHealthEffect $v) => self::$_mINSTANT_HEALTH = $v,
111 "invisibility" => fn(InvisibilityEffect $v) => self::$_mINVISIBILITY = $v,
112 "jump_boost" => fn(Effect $v) => self::$_mJUMP_BOOST = $v,
113 "levitation" => fn(LevitationEffect $v) => self::$_mLEVITATION = $v,
114 "mining_fatigue" => fn(Effect $v) => self::$_mMINING_FATIGUE = $v,
115 "nausea" => fn(Effect $v) => self::$_mNAUSEA = $v,
116 "night_vision" => fn(Effect $v) => self::$_mNIGHT_VISION = $v,
117 "poison" => fn(PoisonEffect $v) => self::$_mPOISON = $v,
118 "regeneration" => fn(RegenerationEffect $v) => self::$_mREGENERATION = $v,
119 "resistance" => fn(Effect $v) => self::$_mRESISTANCE = $v,
120 "saturation" => fn(SaturationEffect $v) => self::$_mSATURATION = $v,
121 "slowness" => fn(SlownessEffect $v) => self::$_mSLOWNESS = $v,
122 "speed" => fn(SpeedEffect $v) => self::$_mSPEED = $v,
123 "strength" => fn(Effect $v) => self::$_mSTRENGTH = $v,
124 "water_breathing" => fn(Effect $v) => self::$_mWATER_BREATHING = $v,
125 "weakness" => fn(Effect $v) => self::$_mWEAKNESS = $v,
126 "wither" => fn(WitherEffect $v) => self::$_mWITHER = $v,
127 ];
128 }
129
130 private static function init() : void{
131 //This nasty mess of closures allows us to suppress PHPStan type assignment errors in one place instead of
132 //on every single assignment. This will only run one time on first init, so it's fine for performance.
133 if(self::$initialized){
134 throw new \LogicException("Circular dependency detected - use RegistrySource->registerDelayed() if the circular dependency can't be avoided");
135 }
136 self::$initialized = true;
137 $assigners = self::getInitAssigners();
138 $assigned = [];
139 $source = new VanillaEffectsInputs();
140 foreach($source->getAllValues() as $name => $value){
141 $assigner = $assigners[$name] ?? throw new \LogicException("Unexpected source registry member \"$name\" (code probably needs regenerating)");
142 if(isset($assigned[$name])){
143 //this should be prevented by RegistrySource, but it doesn't hurt to have some redundancy
144 throw new \LogicException("Repeated registry source member \"$name\"");
145 }
146 self::$members[mb_strtoupper($name)] = $value;
147 $assigned[$name] = true;
148 unset($assigners[$name]);
149 self::unsafeAssign($assigner, $value);
150 }
151 if(count($assigners) > 0){
152 throw new \LogicException("Missing values for registry members (code probably needs regenerating): " . implode(", ", array_keys($assigners)));
153 }
154 }
155
160 public static function getAll() : array{
161 if(!isset(self::$members)){ self::init(); }
162 return self::$members;
163 }
164
165 public static function ABSORPTION() : AbsorptionEffect{
166 if(!isset(self::$_mABSORPTION)){ self::init(); }
167 return self::$_mABSORPTION;
168 }
169
170 public static function BLINDNESS() : Effect{
171 if(!isset(self::$_mBLINDNESS)){ self::init(); }
172 return self::$_mBLINDNESS;
173 }
174
175 public static function CONDUIT_POWER() : Effect{
176 if(!isset(self::$_mCONDUIT_POWER)){ self::init(); }
177 return self::$_mCONDUIT_POWER;
178 }
179
180 public static function DARKNESS() : Effect{
181 if(!isset(self::$_mDARKNESS)){ self::init(); }
182 return self::$_mDARKNESS;
183 }
184
185 public static function FATAL_POISON() : PoisonEffect{
186 if(!isset(self::$_mFATAL_POISON)){ self::init(); }
187 return self::$_mFATAL_POISON;
188 }
189
190 public static function FIRE_RESISTANCE() : Effect{
191 if(!isset(self::$_mFIRE_RESISTANCE)){ self::init(); }
192 return self::$_mFIRE_RESISTANCE;
193 }
194
195 public static function HASTE() : Effect{
196 if(!isset(self::$_mHASTE)){ self::init(); }
197 return self::$_mHASTE;
198 }
199
200 public static function HEALTH_BOOST() : HealthBoostEffect{
201 if(!isset(self::$_mHEALTH_BOOST)){ self::init(); }
202 return self::$_mHEALTH_BOOST;
203 }
204
205 public static function HUNGER() : HungerEffect{
206 if(!isset(self::$_mHUNGER)){ self::init(); }
207 return self::$_mHUNGER;
208 }
209
210 public static function INSTANT_DAMAGE() : InstantDamageEffect{
211 if(!isset(self::$_mINSTANT_DAMAGE)){ self::init(); }
212 return self::$_mINSTANT_DAMAGE;
213 }
214
215 public static function INSTANT_HEALTH() : InstantHealthEffect{
216 if(!isset(self::$_mINSTANT_HEALTH)){ self::init(); }
217 return self::$_mINSTANT_HEALTH;
218 }
219
220 public static function INVISIBILITY() : InvisibilityEffect{
221 if(!isset(self::$_mINVISIBILITY)){ self::init(); }
222 return self::$_mINVISIBILITY;
223 }
224
225 public static function JUMP_BOOST() : Effect{
226 if(!isset(self::$_mJUMP_BOOST)){ self::init(); }
227 return self::$_mJUMP_BOOST;
228 }
229
230 public static function LEVITATION() : LevitationEffect{
231 if(!isset(self::$_mLEVITATION)){ self::init(); }
232 return self::$_mLEVITATION;
233 }
234
235 public static function MINING_FATIGUE() : Effect{
236 if(!isset(self::$_mMINING_FATIGUE)){ self::init(); }
237 return self::$_mMINING_FATIGUE;
238 }
239
240 public static function NAUSEA() : Effect{
241 if(!isset(self::$_mNAUSEA)){ self::init(); }
242 return self::$_mNAUSEA;
243 }
244
245 public static function NIGHT_VISION() : Effect{
246 if(!isset(self::$_mNIGHT_VISION)){ self::init(); }
247 return self::$_mNIGHT_VISION;
248 }
249
250 public static function POISON() : PoisonEffect{
251 if(!isset(self::$_mPOISON)){ self::init(); }
252 return self::$_mPOISON;
253 }
254
255 public static function REGENERATION() : RegenerationEffect{
256 if(!isset(self::$_mREGENERATION)){ self::init(); }
257 return self::$_mREGENERATION;
258 }
259
260 public static function RESISTANCE() : Effect{
261 if(!isset(self::$_mRESISTANCE)){ self::init(); }
262 return self::$_mRESISTANCE;
263 }
264
265 public static function SATURATION() : SaturationEffect{
266 if(!isset(self::$_mSATURATION)){ self::init(); }
267 return self::$_mSATURATION;
268 }
269
270 public static function SLOWNESS() : SlownessEffect{
271 if(!isset(self::$_mSLOWNESS)){ self::init(); }
272 return self::$_mSLOWNESS;
273 }
274
275 public static function SPEED() : SpeedEffect{
276 if(!isset(self::$_mSPEED)){ self::init(); }
277 return self::$_mSPEED;
278 }
279
280 public static function STRENGTH() : Effect{
281 if(!isset(self::$_mSTRENGTH)){ self::init(); }
282 return self::$_mSTRENGTH;
283 }
284
285 public static function WATER_BREATHING() : Effect{
286 if(!isset(self::$_mWATER_BREATHING)){ self::init(); }
287 return self::$_mWATER_BREATHING;
288 }
289
290 public static function WEAKNESS() : Effect{
291 if(!isset(self::$_mWEAKNESS)){ self::init(); }
292 return self::$_mWEAKNESS;
293 }
294
295 public static function WITHER() : WitherEffect{
296 if(!isset(self::$_mWITHER)){ self::init(); }
297 return self::$_mWITHER;
298 }
299}