22
33import com .fasterxml .jackson .databind .ObjectMapper ;
44import com .viaversion .viaversion .api .Via ;
5- import com .viaversion .viaversion .api .protocol .Protocol ;
6- import com .viaversion .viaversion .api .protocol .ProtocolPathEntry ;
5+ import com .viaversion .viaversion .api .protocol .*;
76import com .viaversion .viaversion .api .protocol .version .ProtocolVersion ;
87import com .viaversion .viabackwards .api .BackwardsProtocol ;
98import com .viaversion .viabackwards .api .data .BackwardsMappingData ;
109import org .bukkit .Bukkit ;
1110import org .bukkit .block .Block ;
1211import org .bukkit .plugin .java .JavaPlugin ;
1312import org .bukkit .scheduler .BukkitRunnable ;
14- import org .bukkit .block .data .BlockData ;
15-
16- import java .io .File ;
17- import java .io .IOException ;
18- import java .io .InputStream ;
19- import java .util .Collections ;
20- import java .util .LinkedHashMap ;
21- import java .util .List ;
22- import java .util .Map ;
13+ import org .bukkit .block .data .BlockData ;
14+ import java .io .*;
15+ import java .util .*;
2316import java .util .logging .Level ;
17+ import it .unimi .dsi .fastutil .objects .*;
2418
2519public class ViaBlockIds {
26- private final JavaPlugin plugin ;
27- private final String serverVersion ;
28- private final File mappingsFile ;
29- private Map <String , int []> legacyMap = new LinkedHashMap <>();
20+ private final JavaPlugin p ;
21+ private final String sv ;
22+ private final File mf ;
23+ private Object2ObjectOpenHashMap <String , int []> lm = new Object2ObjectOpenHashMap <>();
3024
31- public ViaBlockIds (JavaPlugin plugin ) {
32- this . plugin = plugin ;
33- this . serverVersion = getServerMinecraftVersion ();
34- this . mappingsFile = new File (plugin .getDataFolder (), serverVersion + "-mappings.json" );
25+ public ViaBlockIds (JavaPlugin pl ) {
26+ p = pl ;
27+ sv = gsmv ();
28+ mf = new File (pl .getDataFolder (), sv + "-mappings.json" );
3529
36- Bukkit .getLogger ().info ("[TuffX] Server Minecraft Version: " + serverVersion );
30+ Bukkit .getLogger ().info ("[TuffX] Server Minecraft Version: " + sv );
3731
3832 new BukkitRunnable () {
3933 @ Override
4034 public void run () {
41- initializeMappings ();
35+ im ();
4236 }
43- }.runTaskLater (plugin , 1L );
37+ }.runTaskLater (pl , 1L );
4438 }
4539
46- private void initializeMappings () {
40+ private void im () {
4741 if (Via .getAPI () == null ) {
4842 Bukkit .getLogger ().severe ("[TuffX] ViaVersion API not found! Is ViaVersion installed?" );
4943 return ;
5044 }
5145
52- if (!mappingsFile .exists ()) {
46+ if (!mf .exists ()) {
5347 Bukkit .getLogger ().info ("[TuffX] Mapping file not found, generating..." );
54- if (!plugin .getDataFolder ().exists ()) {
55- plugin .getDataFolder ().mkdirs ();
48+ if (!p .getDataFolder ().exists ()) {
49+ p .getDataFolder ().mkdirs ();
5650 }
57- generateAndSaveMappings ( mappingsFile );
51+ gasm ( mf );
5852 } else {
59- Bukkit .getLogger ().info ("[TuffX] Loading mappings from " + mappingsFile .getName ());
60- loadMappings ( mappingsFile );
53+ Bukkit .getLogger ().info ("[TuffX] Loading mappings from " + mf .getName ());
54+ lm ( mf );
6155 }
6256 }
6357
64- public int [] toLegacy (String blockStateKey ) {
65- return legacyMap .getOrDefault (blockStateKey , new int []{1 , 0 });
58+ private static final int [] DEFAULT_LEGACY = {1 , 0 };
59+
60+ public int [] toLegacy (String k ) {
61+ int [] result = lm .get (k );
62+ return result != null ? result : DEFAULT_LEGACY ;
6663 }
6764
68- public int [] toLegacy (Block block ) {
69- String blockKey = block .getBlockData ().getAsString ().replace ("minecraft:" , "" );
70- return legacyMap .getOrDefault (blockKey , new int []{1 , 0 });
65+ public int [] toLegacy (Block b ) {
66+ String k = b .getBlockData ().getAsString ();
67+ if (k .startsWith ("minecraft:" )) {
68+ k = k .substring (10 );
69+ }
70+ int [] result = lm .get (k );
71+ return result != null ? result : DEFAULT_LEGACY ;
7172 }
7273
73- public int [] toLegacy (BlockData blockData ) {
74- String blockKey = blockData .getAsString ().replace ("minecraft:" , "" );
75- return toLegacy (blockKey );
74+ public int [] toLegacy (BlockData bd ) {
75+ String k = bd .getAsString ();
76+ if (k .startsWith ("minecraft:" )) {
77+ k = k .substring (10 );
78+ }
79+ int [] result = lm .get (k );
80+ return result != null ? result : DEFAULT_LEGACY ;
7681 }
7782
78- private String getServerMinecraftVersion () {
79- String versionString = Bukkit .getServer ().getVersion ();
80- int mcIndex = versionString .indexOf ("MC: " );
81- if (mcIndex != -1 ) {
82- int endIndex = versionString .indexOf (')' , mcIndex );
83- return endIndex != -1 ? versionString .substring (mcIndex + 4 , endIndex ) : versionString .substring (mcIndex + 4 );
83+ private String gsmv () {
84+ String vs = Bukkit .getServer ().getVersion ();
85+ int mi = vs .indexOf ("MC: " );
86+ if (mi != -1 ) {
87+ int ei = vs .indexOf (')' , mi );
88+ return ei != -1 ? vs .substring (mi + 4 , ei ) : vs .substring (mi + 4 );
8489 }
8590 Bukkit .getLogger ().warning ("[TuffX] Could not detect Minecraft version. Defaulting to 1.21." );
8691 return "1.21" ;
8792 }
8893
89- private InputStream findMappingFile () {
90- String [] versionParts = serverVersion .split ("\\ ." );
94+ private InputStream fmf () {
95+ String [] vp = sv .split ("\\ ." );
9196
92- int major , minor , patch ;
97+ int maj , min , pat ;
9398
9499 try {
95- major = Integer .parseInt (versionParts [0 ]);
96- minor = Integer .parseInt (versionParts [1 ]);
97- patch = versionParts .length > 2 ? Integer .parseInt (versionParts [2 ]) : 0 ;
100+ maj = Integer .parseInt (vp [0 ]);
101+ min = Integer .parseInt (vp [1 ]);
102+ pat = vp .length > 2 ? Integer .parseInt (vp [2 ]) : 0 ;
98103 } catch (NumberFormatException | ArrayIndexOutOfBoundsException e ) {
99- Bukkit .getLogger ().severe ("[TuffX] Could not parse server version string: " + serverVersion );
100- return plugin .getResource ("mapping-" + serverVersion + ".json" );
104+ Bukkit .getLogger ().severe ("[TuffX] Could not parse server version string: " + sv );
105+ return p .getResource ("mapping-" + sv + ".json" );
101106 }
102107
103- Bukkit .getLogger ().info ("[TuffX] Searching for mappings, starting from " + serverVersion + " and going down." );
108+ Bukkit .getLogger ().info ("[TuffX] Searching for mappings, starting from " + sv + " and going down." );
104109
105- for (int m = minor ; m >= 16 ; m --) {
106- int startPatch = (m == minor ) ? patch : 9 ;
110+ for (int m = min ; m >= 16 ; m --) {
111+ int sp = (m == min ) ? pat : 9 ;
107112
108- for (int p = startPatch ; p >= 0 ; p --) {
109- String versionToTest = major + "." + m + "." + p ;
110- String filename = "mapping-" + versionToTest + ".json" ;
113+ for (int pt = sp ; pt >= 0 ; pt --) {
114+ String vtt = maj + "." + m + "." + pt ;
115+ String fn = "mapping-" + vtt + ".json" ;
111116
112- InputStream is = plugin .getResource (filename );
117+ InputStream is = p .getResource (fn );
113118
114119 if (is != null ) {
115- if (!versionToTest .equals (serverVersion )) {
116- Bukkit .getLogger ().info ("[TuffX] Using fallback mapping file: " + filename );
120+ if (!vtt .equals (sv )) {
121+ Bukkit .getLogger ().info ("[TuffX] Using fallback mapping file: " + fn );
117122 } else {
118- Bukkit .getLogger ().info ("[TuffX] Found exact mapping file: " + filename );
123+ Bukkit .getLogger ().info ("[TuffX] Found exact mapping file: " + fn );
119124 }
120125 return is ;
121126 }
122127 }
123128
124- String minorVersionFilename = "mapping-" + major + "." + m + ".json" ;
125- InputStream is = plugin .getResource (minorVersionFilename );
129+ String mvfn = "mapping-" + maj + "." + m + ".json" ;
130+ InputStream is = p .getResource (mvfn );
126131 if (is != null ) {
127- Bukkit .getLogger ().info ("[TuffX] Using fallback mapping file: " + minorVersionFilename );
132+ Bukkit .getLogger ().info ("[TuffX] Using fallback mapping file: " + mvfn );
128133 return is ;
129134 }
130135 }
131136
132- Bukkit .getLogger ().severe ("[TuffX] Could not find any suitable mapping file after checking all versions down to " + major + ".16.0" );
137+ Bukkit .getLogger ().severe ("[TuffX] Could not find any suitable mapping file after checking all versions down to " + maj + ".16.0" );
133138 return null ;
134139 }
135140
136- private void generateAndSaveMappings (File file ) {
137- try (InputStream is = findMappingFile ()) {
141+ private void gasm (File f ) {
142+ try (InputStream is = fmf ()) {
138143 if (is == null ) {
139- Bukkit .getLogger ().severe ("[TuffX] Failed to find mapping-" + serverVersion + ".json in plugin resources!" );
144+ Bukkit .getLogger ().severe ("[TuffX] Failed to find mapping-" + sv + ".json in plugin resources!" );
140145 return ;
141146 }
142147
143- ObjectMapper mapper = new ObjectMapper ();
144- Map <String , Object > root = mapper .readValue (is , Map .class );
145- List <String > states = (List <String >) root .get ("blockstates" );
148+ ObjectMapper m = new ObjectMapper ();
149+ @ SuppressWarnings ("unchecked" )
150+ Map <String , Object > r = m .readValue (is , Map .class );
151+ @ SuppressWarnings ("unchecked" )
152+ List <String > s = (List <String >) r .get ("blockstates" );
146153
147- if (states == null ) {
154+ if (s == null ) {
148155 Bukkit .getLogger ().severe ("[TuffX] 'blockstates' key not found in JSON." );
149156 return ;
150157 }
151158
152- Map <String , int []> newLegacyMap = new LinkedHashMap <>();
153- Bukkit .getLogger ().info ("[TuffX] Generating legacy mappings for " + states .size () + " block states..." );
154-
155- for (int i = 0 ; i < states .size (); i ++) {
156- String key = states .get (i ).replace ("minecraft:" , "" );
157- int [] legacy ;
158- legacy = convertToLegacy (i );
159+ Object2ObjectOpenHashMap <String , int []> nlm = new Object2ObjectOpenHashMap <>();
160+ Bukkit .getLogger ().info ("[TuffX] Generating legacy mappings for " + s .size () + " block states..." );
159161
160- newLegacyMap .put (key , legacy );
162+ for (int i = 0 ; i < s .size (); i ++) {
163+ String k = s .get (i ).replace ("minecraft:" , "" );
164+ int [] l = ctl (i );
165+ nlm .put (k , l );
161166 }
162167
163- this . legacyMap = newLegacyMap ;
168+ lm = nlm ;
164169
165- Map <String , Object > output = new LinkedHashMap <>();
166- output .put ("blockstates" , this . legacyMap );
170+ Map <String , Object > o = new Object2ObjectOpenHashMap <>();
171+ o .put ("blockstates" , lm );
167172
168- file .getParentFile ().mkdirs ();
169- mapper .writerWithDefaultPrettyPrinter ().writeValue (file , output );
170- Bukkit .getLogger ().info ("[TuffX] Successfully wrote mappings to " + file .getName ());
173+ f .getParentFile ().mkdirs ();
174+ m .writerWithDefaultPrettyPrinter ().writeValue (f , o );
175+ Bukkit .getLogger ().info ("[TuffX] Successfully wrote mappings to " + f .getName ());
171176
172177 } catch (Exception e ) {
173178 Bukkit .getLogger ().log (Level .SEVERE , "[TuffX] Error generating legacy mappings." , e );
174179 }
175180 }
176181
177- private void loadMappings (File file ) {
182+ private void lm (File f ) {
178183 try {
179- ObjectMapper mapper = new ObjectMapper ();
180- Map <String , Object > root = mapper .readValue (file , Map .class );
181- Map <String , List <Integer >> rawMap = (Map <String , List <Integer >>) root .get ("blockstates" );
184+ ObjectMapper m = new ObjectMapper ();
185+ @ SuppressWarnings ("unchecked" )
186+ Map <String , Object > r = m .readValue (f , Map .class );
187+ @ SuppressWarnings ("unchecked" )
188+ Map <String , List <Integer >> rm = (Map <String , List <Integer >>) r .get ("blockstates" );
182189
183- if (rawMap == null ) {
190+ if (rm == null ) {
184191 Bukkit .getLogger ().severe ("[TuffX] Invalid format in mappings file. Regenerating..." );
185- generateAndSaveMappings ( file );
192+ gasm ( f );
186193 return ;
187194 }
188195
189- legacyMap = new LinkedHashMap <>();
190- for (Map .Entry <String , List <Integer >> entry : rawMap .entrySet ()) {
191- List <Integer > legacyList = entry .getValue ();
192- if (legacyList != null && legacyList .size () == 2 ) {
193- legacyMap .put (entry .getKey (), new int []{legacyList .get (0 ), legacyList .get (1 )});
196+ lm = new Object2ObjectOpenHashMap <>();
197+ for (Map .Entry <String , List <Integer >> e : rm .entrySet ()) {
198+ List <Integer > ll = e .getValue ();
199+ if (ll != null && ll .size () == 2 ) {
200+ lm .put (e .getKey (), new int []{ll .get (0 ), ll .get (1 )});
194201 }
195202 }
196- Bukkit .getLogger ().info ("[TuffX] Loaded " + legacyMap .size () + " legacy mappings." );
203+ Bukkit .getLogger ().info ("[TuffX] Loaded " + lm .size () + " legacy mappings." );
197204 } catch (IOException e ) {
198205 Bukkit .getLogger ().log (Level .SEVERE , "[TuffX] Failed to load mappings file." , e );
199206 }
200207 }
201208
202- public int [] convertToLegacy (int modernBlockStateId ) {
203- ProtocolVersion serverProtocol = Via .getAPI ().getServerVersion ().highestSupportedProtocolVersion ();
204- ProtocolVersion clientProtocol = ProtocolVersion .v1_12_2 ;
209+ public int [] ctl (int mbsi ) {
210+ ProtocolVersion sp = Via .getAPI ().getServerVersion ().highestSupportedProtocolVersion ();
211+ ProtocolVersion cp = ProtocolVersion .v1_12_2 ;
205212
206- List <ProtocolPathEntry > path = Via .getManager ()
213+ List <ProtocolPathEntry > pt = Via .getManager ()
207214 .getProtocolManager ()
208215 .getProtocolPath (
209- clientProtocol .getVersion (),
210- serverProtocol .getVersion ()
216+ cp .getVersion (),
217+ sp .getVersion ()
211218 );
212219
213- if (path == null ) {
220+ if (pt == null ) {
214221 Bukkit .getLogger ().warning ("[TuffX] Protocol path is null!" );
215222 return new int []{1 , 0 };
216223 }
217224
218- int currentStateId = modernBlockStateId ;
225+ int csi = mbsi ;
219226
220- for (int i = path .size () - 1 ; i >= 0 ; i --) {
221- ProtocolPathEntry entry = path .get (i );
222- Protocol protocol = entry .protocol ();
227+ for (int i = pt .size () - 1 ; i >= 0 ; i --) {
228+ ProtocolPathEntry e = pt .get (i );
229+ Protocol pr = e .protocol ();
223230
224- if (protocol instanceof BackwardsProtocol ) {
225- BackwardsMappingData mappingData = ((BackwardsProtocol ) protocol ).getMappingData ();
226- if (mappingData != null && mappingData .getBlockStateMappings () != null ) {
227- int newid = mappingData .getBlockStateMappings ().getNewId (currentStateId );
231+ if (pr instanceof BackwardsProtocol ) {
232+ BackwardsMappingData md = ((BackwardsProtocol ) pr ).getMappingData ();
233+ if (md != null && md .getBlockStateMappings () != null ) {
234+ int ni = md .getBlockStateMappings ().getNewId (csi );
228235
229- if (newid != -1 ) {
230- currentStateId = newid ;
236+ if (ni != -1 ) {
237+ csi = ni ;
231238 }
232239 }
233240 }
234241 }
235242
236- int blockId = currentStateId >> 4 ;
237- int meta = currentStateId & 0xF ;
243+ int bi = csi >> 4 ;
244+ int mt = csi & 0xF ;
238245
239- return new int []{blockId , meta };
246+ return new int []{bi , mt };
240247 }
241- }
248+ }
0 commit comments