40 private static Effect $_mBLINDNESS;
41 private static Effect $_mCONDUIT_POWER;
42 private static Effect $_mDARKNESS;
44 private static Effect $_mFIRE_RESISTANCE;
45 private static Effect $_mHASTE;
51 private static Effect $_mJUMP_BOOST;
53 private static Effect $_mMINING_FATIGUE;
54 private static Effect $_mNAUSEA;
55 private static Effect $_mNIGHT_VISION;
58 private static Effect $_mRESISTANCE;
62 private static Effect $_mSTRENGTH;
63 private static Effect $_mWATER_BREATHING;
64 private static Effect $_mWEAKNESS;
71 private static array $members;
73 private static bool $initialized =
false;
75 private function __construct(){
85 private static function unsafeAssign(\Closure $closure,
Effect $memberValue) :
void{
91 $closure($memberValue);
98 private static function getInitAssigners() : array{
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,
108 "hunger" => fn(
HungerEffect $v) => self::$_mHUNGER = $v,
112 "jump_boost" => fn(
Effect $v) => self::$_mJUMP_BOOST = $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,
119 "resistance" => fn(
Effect $v) => self::$_mRESISTANCE = $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,
130 private static function init() :
void{
133 if(self::$initialized){
134 throw new \LogicException(
"Circular dependency detected - use RegistrySource->registerDelayed() if the circular dependency can't be avoided");
136 self::$initialized =
true;
137 $assigners = self::getInitAssigners();
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])){
144 throw new \LogicException(
"Repeated registry source member \"$name\"");
146 self::$members[mb_strtoupper($name)] = $value;
147 $assigned[$name] =
true;
148 unset($assigners[$name]);
149 self::unsafeAssign($assigner, $value);
151 if(count($assigners) > 0){
152 throw new \LogicException(
"Missing values for registry members (code probably needs regenerating): " . implode(
", ", array_keys($assigners)));
161 if(!isset(self::$members)){ self::init(); }
162 return self::$members;
165 public static function ABSORPTION() : AbsorptionEffect{
166 if(!isset(self::$_mABSORPTION)){ self::init(); }
167 return self::$_mABSORPTION;
170 public static function BLINDNESS() : Effect{
171 if(!isset(self::$_mBLINDNESS)){ self::init(); }
172 return self::$_mBLINDNESS;
175 public static function CONDUIT_POWER() : Effect{
176 if(!isset(self::$_mCONDUIT_POWER)){ self::init(); }
177 return self::$_mCONDUIT_POWER;
180 public static function DARKNESS() : Effect{
181 if(!isset(self::$_mDARKNESS)){ self::init(); }
182 return self::$_mDARKNESS;
185 public static function FATAL_POISON() : PoisonEffect{
186 if(!isset(self::$_mFATAL_POISON)){ self::init(); }
187 return self::$_mFATAL_POISON;
190 public static function FIRE_RESISTANCE() : Effect{
191 if(!isset(self::$_mFIRE_RESISTANCE)){ self::init(); }
192 return self::$_mFIRE_RESISTANCE;
195 public static function HASTE() : Effect{
196 if(!isset(self::$_mHASTE)){ self::init(); }
197 return self::$_mHASTE;
200 public static function HEALTH_BOOST() : HealthBoostEffect{
201 if(!isset(self::$_mHEALTH_BOOST)){ self::init(); }
202 return self::$_mHEALTH_BOOST;
205 public static function HUNGER() : HungerEffect{
206 if(!isset(self::$_mHUNGER)){ self::init(); }
207 return self::$_mHUNGER;
210 public static function INSTANT_DAMAGE() : InstantDamageEffect{
211 if(!isset(self::$_mINSTANT_DAMAGE)){ self::init(); }
212 return self::$_mINSTANT_DAMAGE;
215 public static function INSTANT_HEALTH() : InstantHealthEffect{
216 if(!isset(self::$_mINSTANT_HEALTH)){ self::init(); }
217 return self::$_mINSTANT_HEALTH;
220 public static function INVISIBILITY() : InvisibilityEffect{
221 if(!isset(self::$_mINVISIBILITY)){ self::init(); }
222 return self::$_mINVISIBILITY;
225 public static function JUMP_BOOST() : Effect{
226 if(!isset(self::$_mJUMP_BOOST)){ self::init(); }
227 return self::$_mJUMP_BOOST;
230 public static function LEVITATION() : LevitationEffect{
231 if(!isset(self::$_mLEVITATION)){ self::init(); }
232 return self::$_mLEVITATION;
235 public static function MINING_FATIGUE() : Effect{
236 if(!isset(self::$_mMINING_FATIGUE)){ self::init(); }
237 return self::$_mMINING_FATIGUE;
240 public static function NAUSEA() : Effect{
241 if(!isset(self::$_mNAUSEA)){ self::init(); }
242 return self::$_mNAUSEA;
245 public static function NIGHT_VISION() : Effect{
246 if(!isset(self::$_mNIGHT_VISION)){ self::init(); }
247 return self::$_mNIGHT_VISION;
250 public static function POISON() : PoisonEffect{
251 if(!isset(self::$_mPOISON)){ self::init(); }
252 return self::$_mPOISON;
255 public static function REGENERATION() : RegenerationEffect{
256 if(!isset(self::$_mREGENERATION)){ self::init(); }
257 return self::$_mREGENERATION;
260 public static function RESISTANCE() : Effect{
261 if(!isset(self::$_mRESISTANCE)){ self::init(); }
262 return self::$_mRESISTANCE;
265 public static function SATURATION() : SaturationEffect{
266 if(!isset(self::$_mSATURATION)){ self::init(); }
267 return self::$_mSATURATION;
270 public static function SLOWNESS() : SlownessEffect{
271 if(!isset(self::$_mSLOWNESS)){ self::init(); }
272 return self::$_mSLOWNESS;
275 public static function SPEED() : SpeedEffect{
276 if(!isset(self::$_mSPEED)){ self::init(); }
277 return self::$_mSPEED;
280 public static function STRENGTH() : Effect{
281 if(!isset(self::$_mSTRENGTH)){ self::init(); }
282 return self::$_mSTRENGTH;
285 public static function WATER_BREATHING() : Effect{
286 if(!isset(self::$_mWATER_BREATHING)){ self::init(); }
287 return self::$_mWATER_BREATHING;
290 public static function WEAKNESS() : Effect{
291 if(!isset(self::$_mWEAKNESS)){ self::init(); }
292 return self::$_mWEAKNESS;
295 public static function WITHER() : WitherEffect{
296 if(!isset(self::$_mWITHER)){ self::init(); }
297 return self::$_mWITHER;