Skip to content

Commit 07359fc

Browse files
jstzwjsunnycase
authored andcommitted
Add different position types (#49)
* Add different position types * Add more methods * fix error
1 parent d6c1c34 commit 07359fc

File tree

1 file changed

+26
-18
lines changed

1 file changed

+26
-18
lines changed

src/MineCase.Server.Interfaces/World/WorldExtensions.cs

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)