@@ -16,7 +16,7 @@ public static class WorldExtensions
1616 public static int WorldToChunk ( int n )
1717 {
1818 int chunkPos = n / ChunkConstants . BlockEdgeWidthInSection ;
19- if ( chunkPos < 0 ) chunkPos -= 1 ;
19+ if ( n % ChunkConstants . BlockEdgeWidthInSection < 0 ) chunkPos -= 1 ;
2020 return chunkPos ;
2121 }
2222
@@ -42,11 +42,13 @@ public static int WorldToBlock(int n)
4242 /// <returns>方块类型</returns>
4343 public static Task < BlockState > GetBlockState ( this IWorld world , IGrainFactory grainFactory , int x , int y , int z )
4444 {
45- var chunkColumnKey = world . MakeChunkColumnKey ( WorldToChunk ( x ) , WorldToChunk ( z ) ) ;
45+ var xOffset = MakeRelativeBlockOffset ( x ) ;
46+ var zOffset = MakeRelativeBlockOffset ( z ) ;
47+ var chunkColumnKey = world . MakeChunkColumnKey ( xOffset . chunk , zOffset . chunk ) ;
4648 return grainFactory . GetGrain < IChunkColumn > ( chunkColumnKey ) . GetBlockState (
47- WorldToBlock ( x ) ,
49+ xOffset . block ,
4850 y ,
49- WorldToBlock ( z ) ) ;
51+ zOffset . block ) ;
5052 }
5153
5254 /// <summary>
@@ -58,11 +60,13 @@ public static Task<BlockState> GetBlockState(this IWorld world, IGrainFactory gr
5860 /// <returns>方块类型</returns>
5961 public static Task < BlockState > GetBlockState ( this IWorld world , IGrainFactory grainFactory , BlockWorldPos pos )
6062 {
61- var chunkColumnKey = world . MakeChunkColumnKey ( WorldToChunk ( pos . X ) , WorldToChunk ( pos . Z ) ) ;
63+ var xOffset = MakeRelativeBlockOffset ( pos . X ) ;
64+ var zOffset = MakeRelativeBlockOffset ( pos . Z ) ;
65+ var chunkColumnKey = world . MakeChunkColumnKey ( xOffset . chunk , zOffset . chunk ) ;
6266 return grainFactory . GetGrain < IChunkColumn > ( chunkColumnKey ) . GetBlockState (
63- WorldToBlock ( pos . X ) ,
67+ xOffset . block ,
6468 pos . Y ,
65- WorldToBlock ( pos . Z ) ) ;
69+ zOffset . block ) ;
6670 }
6771
6872 /// <summary>
@@ -76,11 +80,13 @@ public static Task<BlockState> GetBlockState(this IWorld world, IGrainFactory gr
7680 /// <param name="state">The state.</param>
7781 public static Task SetBlockState ( this IWorld world , IGrainFactory grainFactory , int x , int y , int z , BlockState state )
7882 {
79- var chunkColumnKey = world . MakeChunkColumnKey ( WorldToChunk ( x ) , WorldToChunk ( z ) ) ;
83+ var xOffset = MakeRelativeBlockOffset ( x ) ;
84+ var zOffset = MakeRelativeBlockOffset ( z ) ;
85+ var chunkColumnKey = world . MakeChunkColumnKey ( xOffset . chunk , zOffset . chunk ) ;
8086 return grainFactory . GetGrain < IChunkColumn > ( chunkColumnKey ) . SetBlockState (
81- WorldToBlock ( x ) ,
87+ xOffset . block ,
8288 y ,
83- WorldToBlock ( z ) ,
89+ zOffset . block ,
8490 state ) ;
8591 }
8692
@@ -93,24 +99,26 @@ public static Task SetBlockState(this IWorld world, IGrainFactory grainFactory,
9399 /// <param name="state">The state.</param>
94100 public static Task SetBlockState ( this IWorld world , IGrainFactory grainFactory , BlockWorldPos pos , BlockState state )
95101 {
96- var chunkColumnKey = world . MakeChunkColumnKey ( WorldToChunk ( pos . X ) , WorldToChunk ( pos . Z ) ) ;
102+ var xOffset = MakeRelativeBlockOffset ( pos . X ) ;
103+ var zOffset = MakeRelativeBlockOffset ( pos . Z ) ;
104+ var chunkColumnKey = world . MakeChunkColumnKey ( xOffset . chunk , zOffset . chunk ) ;
97105 return grainFactory . GetGrain < IChunkColumn > ( chunkColumnKey ) . SetBlockState (
98- WorldToBlock ( pos . X ) ,
106+ xOffset . block ,
99107 pos . Y ,
100- WorldToBlock ( pos . Z ) ,
108+ zOffset . block ,
101109 state ) ;
102110 }
103111
104112 public static async Task < int > GetHeight ( this IWorld world , IGrainFactory grainFactory , BlockWorldPos pos )
105113 {
106- var chunkColumnKey = world . MakeChunkColumnKey ( WorldToChunk ( pos . X ) , WorldToChunk ( pos . Z ) ) ;
114+ var xOffset = MakeRelativeBlockOffset ( pos . X ) ;
115+ var zOffset = MakeRelativeBlockOffset ( pos . Z ) ;
116+ var chunkColumnKey = world . MakeChunkColumnKey ( xOffset . chunk , zOffset . chunk ) ;
107117 var chunk = grainFactory . GetGrain < IChunkColumn > ( chunkColumnKey ) ;
108118 int y ;
109- int blockPosX = WorldToBlock ( pos . X ) ;
110- int blockPosZ = WorldToBlock ( pos . Z ) ;
111119 for ( y = 255 ; y >= 0 ; -- y )
112120 {
113- if ( await chunk . GetBlockState ( blockPosX , y , blockPosZ ) != BlockStates . Air ( ) )
121+ if ( await chunk . GetBlockState ( xOffset . block , y , zOffset . block ) != BlockStates . Air ( ) )
114122 {
115123 break ;
116124 }
@@ -124,7 +132,7 @@ public static (int chunkX, int chunkZ) GetChunk(this Position blockPosition)
124132 return ( MakeRelativeBlockOffset ( blockPosition . X ) . chunk , MakeRelativeBlockOffset ( blockPosition . Z ) . chunk ) ;
125133 }
126134
127- private static ( int chunk , int block ) MakeRelativeBlockOffset ( int value )
135+ public static ( int chunk , int block ) MakeRelativeBlockOffset ( int value )
128136 {
129137 var chunk = value / ChunkConstants . BlockEdgeWidthInSection ;
130138 var block = value % ChunkConstants . BlockEdgeWidthInSection ;
0 commit comments