@@ -129,16 +129,18 @@ public void run() {
129129 private void processAndSendChunk (final Player player , final Chunk chunk ) {
130130 if (chunk == null || !player .isOnline ()) return ;
131131
132- final ChunkSnapshot snapshot = chunk . getChunkSnapshot ( true , false , false );
132+ final Map < BlockData , int []> conversionCache = new HashMap <>( );
133133
134134 new BukkitRunnable () {
135135 @ Override
136136 public void run () {
137+ final ChunkSnapshot snapshot = chunk .getChunkSnapshot (true , false , false );
138+
137139 for (int sectionY = -4 ; sectionY < 0 ; sectionY ++) {
138140 if (!player .isOnline ()) break ;
139141
140142 try {
141- byte [] payload = createSectionPayload (snapshot , chunk .getX (), chunk .getZ (), sectionY );
143+ byte [] payload = createSectionPayload (snapshot , chunk .getX (), chunk .getZ (), sectionY , conversionCache );
142144 if (payload != null ) {
143145 player .sendPluginMessage (TuffX .this , CHANNEL , payload );
144146 }
@@ -164,27 +166,29 @@ private byte[] createWelcomePayload(String message, int someNumber) {
164166 } catch (IOException e ) { return null ; }
165167 }
166168
167- private byte [] createSectionPayload (ChunkSnapshot snapshot , int cx , int cz , int sectionY ) throws IOException {
169+ private byte [] createSectionPayload (ChunkSnapshot snapshot , int cx , int cz , int sectionY , Map < BlockData , int []> cache ) throws IOException {
168170 try (ByteArrayOutputStream bout = new ByteArrayOutputStream (8200 ); DataOutputStream out = new DataOutputStream (bout )) {
169171 out .writeUTF ("chunk_data" );
170172 out .writeInt (cx ); out .writeInt (cz ); out .writeInt (sectionY );
171173 boolean hasNonAirBlock = false ;
172174 int baseY = sectionY * 16 ;
173175 for (int y = 0 ; y < 16 ; y ++) for (int z = 0 ; z < 16 ; z ++) for (int x = 0 ; x < 16 ; x ++) {
174176 int worldY = baseY + y ;
175- String blockKey = snapshot .getBlockData (x , worldY , z ).getAsString ().replace ("minecraft:" , "" );
176- int [] legacyData = viablockids .toLegacy (blockKey );
177+ BlockData blockData = snapshot .getBlockData (x , worldY , z );
178+
179+ int [] legacyData = cache .computeIfAbsent (blockData , viablockids ::toLegacy );
180+
177181 if (legacyData [0 ] != 0 ) hasNonAirBlock = true ;
178182 out .writeShort ((short ) ((legacyData [1 ] << 12 ) | (legacyData [0 ] & 0xFFF )));
179183 }
180184 return hasNonAirBlock ? bout .toByteArray () : null ;
181185 }
182186 }
183187
184- // @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
185- // public void onBlockBreak(BlockBreakEvent event) { if (event.getBlock().getY() < 0) sendBlockUpdateToNearby(event.getBlock().getLocation(), Material.AIR.createBlockData()); }
186- // @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
187- // public void onBlockPlace(BlockPlaceEvent event) { if (event.getBlock().getY() < 0) sendBlockUpdateToNearby(event.getBlock().getLocation(), event.getBlock().getBlockData()); }
188+ @ EventHandler (priority = EventPriority .MONITOR , ignoreCancelled = true )
189+ public void onBlockBreak (BlockBreakEvent event ) { if (event .getBlock ().getY () < 0 ) sendBlockUpdateToNearby (event .getBlock ().getLocation (), Material .AIR .createBlockData ()); }
190+ @ EventHandler (priority = EventPriority .MONITOR , ignoreCancelled = true )
191+ public void onBlockPlace (BlockPlaceEvent event ) { if (event .getBlock ().getY () < 0 ) sendBlockUpdateToNearby (event .getBlock ().getLocation (), event .getBlock ().getBlockData ()); }
188192 @ EventHandler (priority = EventPriority .MONITOR , ignoreCancelled = true )
189193 public void onBlockPhysics (BlockPhysicsEvent event ) { if (event .getBlock ().getY () < 0 ) sendBlockUpdateToNearby (event .getBlock ().getLocation (), event .getBlock ().getBlockData ()); }
190194
0 commit comments