PocketMine-MP 5.39.3 git-21ae710729750cd637333d673bbbbbc598fc659e
Loading...
Searching...
No Matches
VanillaArmorMaterials.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;
25
26use function array_keys;
27use function count;
28use function implode;
29use function mb_strtoupper;
30
39 private static ArmorMaterial $_mCHAINMAIL;
40 private static ArmorMaterial $_mCOPPER;
41 private static ArmorMaterial $_mDIAMOND;
42 private static ArmorMaterial $_mGOLD;
43 private static ArmorMaterial $_mIRON;
44 private static ArmorMaterial $_mLEATHER;
45 private static ArmorMaterial $_mNETHERITE;
46 private static ArmorMaterial $_mTURTLE;
47
52 private static array $members;
53
54 private static bool $initialized = false;
55
56 private function __construct(){
57 //NOOP
58 }
59
66 private static function unsafeAssign(\Closure $closure, ArmorMaterial $memberValue) : void{
72 $closure($memberValue);
73 }
74
79 private static function getInitAssigners() : array{
80 return [
81 "chainmail" => fn(ArmorMaterial $v) => self::$_mCHAINMAIL = $v,
82 "copper" => fn(ArmorMaterial $v) => self::$_mCOPPER = $v,
83 "diamond" => fn(ArmorMaterial $v) => self::$_mDIAMOND = $v,
84 "gold" => fn(ArmorMaterial $v) => self::$_mGOLD = $v,
85 "iron" => fn(ArmorMaterial $v) => self::$_mIRON = $v,
86 "leather" => fn(ArmorMaterial $v) => self::$_mLEATHER = $v,
87 "netherite" => fn(ArmorMaterial $v) => self::$_mNETHERITE = $v,
88 "turtle" => fn(ArmorMaterial $v) => self::$_mTURTLE = $v,
89 ];
90 }
91
92 private static function init() : void{
93 //This nasty mess of closures allows us to suppress PHPStan type assignment errors in one place instead of
94 //on every single assignment. This will only run one time on first init, so it's fine for performance.
95 if(self::$initialized){
96 throw new \LogicException("Circular dependency detected - use RegistrySource->registerDelayed() if the circular dependency can't be avoided");
97 }
98 self::$initialized = true;
99 $assigners = self::getInitAssigners();
100 $assigned = [];
101 $source = new VanillaArmorMaterialsInputs();
102 foreach($source->getAllValues() as $name => $value){
103 $assigner = $assigners[$name] ?? throw new \LogicException("Unexpected source registry member \"$name\" (code probably needs regenerating)");
104 if(isset($assigned[$name])){
105 //this should be prevented by RegistrySource, but it doesn't hurt to have some redundancy
106 throw new \LogicException("Repeated registry source member \"$name\"");
107 }
108 self::$members[mb_strtoupper($name)] = $value;
109 $assigned[$name] = true;
110 unset($assigners[$name]);
111 self::unsafeAssign($assigner, $value);
112 }
113 if(count($assigners) > 0){
114 throw new \LogicException("Missing values for registry members (code probably needs regenerating): " . implode(", ", array_keys($assigners)));
115 }
116 }
117
122 public static function getAll() : array{
123 if(!isset(self::$members)){ self::init(); }
124 return self::$members;
125 }
126
127 public static function CHAINMAIL() : ArmorMaterial{
128 if(!isset(self::$_mCHAINMAIL)){ self::init(); }
129 return self::$_mCHAINMAIL;
130 }
131
132 public static function COPPER() : ArmorMaterial{
133 if(!isset(self::$_mCOPPER)){ self::init(); }
134 return self::$_mCOPPER;
135 }
136
137 public static function DIAMOND() : ArmorMaterial{
138 if(!isset(self::$_mDIAMOND)){ self::init(); }
139 return self::$_mDIAMOND;
140 }
141
142 public static function GOLD() : ArmorMaterial{
143 if(!isset(self::$_mGOLD)){ self::init(); }
144 return self::$_mGOLD;
145 }
146
147 public static function IRON() : ArmorMaterial{
148 if(!isset(self::$_mIRON)){ self::init(); }
149 return self::$_mIRON;
150 }
151
152 public static function LEATHER() : ArmorMaterial{
153 if(!isset(self::$_mLEATHER)){ self::init(); }
154 return self::$_mLEATHER;
155 }
156
157 public static function NETHERITE() : ArmorMaterial{
158 if(!isset(self::$_mNETHERITE)){ self::init(); }
159 return self::$_mNETHERITE;
160 }
161
162 public static function TURTLE() : ArmorMaterial{
163 if(!isset(self::$_mTURTLE)){ self::init(); }
164 return self::$_mTURTLE;
165 }
166}