76 int cellValue =
Terrain.GetCellValue(point.
X + point2.
X, point.
Y + point2.
Y, point.
Z + point2.
Z);
78 for (
int k = 0; k < blockBehaviors.Length; k++) {
88 bool useInteractionBoxes,
90 Func<int, float, bool> action) {
108 int num8 = x < x2 ? 1 :
110 int num9 = y < y2 ? 1 :
112 int num10 = z < z2 ? 1 :
114 float num11 = MathF.Floor(x);
115 float num12 = num11 + 1f;
116 float num13 = (x > x2 ? x - num11 : num12 - x) / Math.Abs(x2 - x);
117 float num14 = MathF.Floor(y);
118 float num15 = num14 + 1f;
119 float num16 = (y > y2 ? y - num14 : num15 - y) / Math.Abs(y2 - y);
120 float num17 = MathF.Floor(z);
121 float num18 = num17 + 1f;
122 float num19 = (z > z2 ? z - num17 : num18 - z) / Math.Abs(z2 - z);
123 float num20 = 1f / Math.Abs(x2 - x);
124 float num21 = 1f / Math.Abs(y2 - y);
125 float num22 = 1f / Math.Abs(z2 - z);
128 int collisionBoxIndex = 0;
130 int cellValue =
Terrain.GetCellValue(num2, num3, num4);
131 int num24 =
Terrain.ExtractContents(cellValue);
136 .
Raycast(ray2,
this, cellValue, useInteractionBoxes, out
int nearestBoxIndex, out
BoundingBox nearestBox);
137 if (num25.HasValue ) {
139 collisionBoxIndex = nearestBoxIndex;
140 boundingBox = nearestBox;
144 && num23.Value <= num
145 && (action ==
null || action(cellValue, num23.Value))) {
148 float num26 =
float.MaxValue;
149 float num27 = MathF.Abs(vector.
X - boundingBox.
Min.
X);
154 num27 = MathF.Abs(vector.
X - boundingBox.
Max.
X);
159 num27 = MathF.Abs(vector.
Y - boundingBox.
Min.
Y);
164 num27 = MathF.Abs(vector.
Y - boundingBox.
Max.
Y);
169 num27 = MathF.Abs(vector.
Z - boundingBox.
Min.
Z);
174 num27 = MathF.Abs(vector.
Z - boundingBox.
Max.
Z);
181 value.Value = cellValue;
182 value.CellFace =
new CellFace { X = num2, Y = num3, Z = num4, Face = face };
183 value.CollisionBoxIndex = collisionBoxIndex;
184 value.Distance = num23.Value;
195 else if (num16 <= num13
229 bool useInteractionBoxes,
231 Func<int, float, bool> action) {
249 int num8 = x < x2 ? 1 :
251 int num9 = y < y2 ? 1 :
253 int num10 = z < z2 ? 1 :
255 float num11 = MathF.Floor(x);
256 float num12 = num11 + 1f;
257 float num13 = (x > x2 ? x - num11 : num12 - x) / Math.Abs(x2 - x);
258 float num14 = MathF.Floor(y);
259 float num15 = num14 + 1f;
260 float num16 = (y > y2 ? y - num14 : num15 - y) / Math.Abs(y2 - y);
261 float num17 = MathF.Floor(z);
262 float num18 = num17 + 1f;
263 float num19 = (z > z2 ? z - num17 : num18 - z) / Math.Abs(z2 - z);
264 float num20 = 1f / Math.Abs(x2 - x);
265 float num21 = 1f / Math.Abs(y2 - y);
266 float num22 = 1f / Math.Abs(z2 - z);
269 int collisionBoxIndex = 0;
272 int num24 =
Terrain.ExtractContents(cellValue);
277 .
Raycast(ray2,
null, cellValue, useInteractionBoxes, out
int nearestBoxIndex, out
BoundingBox nearestBox);
278 if (num25.HasValue ) {
280 collisionBoxIndex = nearestBoxIndex;
281 boundingBox = nearestBox;
285 && num23.Value <= num
286 && (action ==
null || action(cellValue, num23.Value))) {
289 float num26 =
float.MaxValue;
290 float num27 = MathF.Abs(vector.
X - boundingBox.
Min.
X);
295 num27 = MathF.Abs(vector.
X - boundingBox.
Max.
X);
300 num27 = MathF.Abs(vector.
Y - boundingBox.
Min.
Y);
305 num27 = MathF.Abs(vector.
Y - boundingBox.
Max.
Y);
310 num27 = MathF.Abs(vector.
Z - boundingBox.
Min.
Z);
315 num27 = MathF.Abs(vector.
Z - boundingBox.
Max.
Z);
322 value.Value = cellValue;
323 value.CellFace =
new CellFace { X = num2, Y = num3, Z = num4, Face = face };
324 value.CollisionBoxIndex = collisionBoxIndex;
325 value.Distance = num23.Value;
336 else if (num16 <= num13
355 public virtual void ChangeCell(
int x,
int y,
int z,
int value,
bool updateModificationCounter =
true,
MovingBlock movingBlock =
null) {
361 loader.TerrainChangeCell(
this, x, y, z, value, out
bool Skip);
370 if (!
Terrain.IsCellValid(x, y, z)) {
373 int cellValueFast =
Terrain.GetCellValueFast(x, y, z);
374 value =
Terrain.ReplaceLight(value, 0);
375 cellValueFast =
Terrain.ReplaceLight(cellValueFast, 0);
376 if (value == cellValueFast) {
379 Terrain.SetCellValueFast(x, y, z, value);
381 if (chunkAtCell !=
null) {
382 if (updateModificationCounter) {
391 catch (Exception e) {
392 Log.
Error($
"Block behavior on terrain change execute error: {e}");
397 int num =
Terrain.ExtractContents(oldValue);
398 int num2 =
Terrain.ExtractContents(newValue);
401 if (movingBlock?.MovingBlockSet !=
null) {
403 for (
int j = 0; j < blockBehaviors2.Length; j++) {
408 for (
int j = 0; j < blockBehaviors.Length; j++) {
415 for (
int i = 0; i < blockBehaviors.Length; i++) {
418 for (
int j = 0; j < blockBehaviors2.Length; j++) {
419 blockBehaviors2[j].
OnBlockAdded(newValue, oldValue, x, y, z);
423 for (
int k = 0; k < blockBehaviors2.Length; k++) {
435 bool noParticleSystem,
437 int cellValue =
Terrain.GetCellValue(x, y, z);
438 int num =
Terrain.ExtractContents(cellValue);
441 bool showDebris =
true;
447 if (dropValue.
Count > 0) {
450 for (
int j = 0; j < blockBehaviors.Length; j++) {
451 blockBehaviors[j].
OnItemHarvested(x, y, z, cellValue, ref dropValue, ref newValue);
453 if (dropValue.
Count > 0
469 ChangeCell(x, y, z, newValue,
true, movingBlock);
518 if (
string.CompareOrdinal(
SubsystemGameInfo.WorldSettings.OriginalSerializationVersion,
"2.1") <= 0) {
527 else if (
string.CompareOrdinal(
SubsystemGameInfo.WorldSettings.OriginalSerializationVersion,
"2.2") == 0) {
536 else if (
string.CompareOrdinal(
SubsystemGameInfo.WorldSettings.OriginalSerializationVersion,
"2.3") == 0) {
static void Error(object message)
virtual void GetDropValues(SubsystemTerrain subsystemTerrain, int oldValue, int newValue, int toolLevel, List< BlockDropValue > dropValues, out bool showDebris)
virtual BlockDebrisParticleSystem CreateDebrisParticleSystem(SubsystemTerrain subsystemTerrain, Vector3 position, int value, float strength)
virtual ? float Raycast(Ray3 ray, SubsystemTerrain subsystemTerrain, int value, bool useInteractionBoxes, out int nearestBoxIndex, out BoundingBox nearestBox)
IMovingBlockSet MovingBlockSet
virtual void OnItemHarvested(int x, int y, int z, int blockValue, ref BlockDropValue dropValue, ref int newBlockValue)
virtual void OnBlockStopMoving(int value, int oldValue, int x, int y, int z, MovingBlock movingBlock)
virtual void OnNeighborBlockChanged(int x, int y, int z, int neighborX, int neighborY, int neighborZ)
virtual void OnBlockAdded(int value, int oldValue, int x, int y, int z)
virtual void OnBlockModified(int value, int oldValue, int x, int y, int z)
virtual void OnBlockRemoved(int value, int newValue, int x, int y, int z)
virtual void OnBlockStartMoving(int value, int newValue, int x, int y, int z, MovingBlock movingBlock)
override void Load(ValuesDictionary valuesDictionary)
SubsystemGameWidgets m_subsystemViews
virtual TerrainSerializer23 TerrainSerializer
virtual SubsystemFurnitureBlockBehavior SubsystemFurnitureBlockBehavior
virtual void ChangeCell(int x, int y, int z, int value, bool updateModificationCounter=true, MovingBlock movingBlock=null)
static Point3[] m_neighborOffsets
virtual void Draw(Camera camera, int drawOrder)
virtual SubsystemGameInfo SubsystemGameInfo
virtual void Update(float dt)
static int[] m_drawOrders
Dictionary< Point3, bool > m_modifiedCells
SubsystemBlockBehaviors m_subsystemBlockBehaviors
SubsystemTimeOfDay m_subsystemTimeOfDay
static bool TerrainRenderingEnabled
virtual void DestroyCell(int toolLevel, int x, int y, int z, int newValue, bool noDrop, bool noParticleSystem, MovingBlock movingBlock=null)
virtual SubsystemAnimatedTextures SubsystemAnimatedTextures
virtual BlockGeometryGenerator BlockGeometryGenerator
virtual ITerrainContentsGenerator TerrainContentsGenerator
List< BlockDropValue > m_dropValues
virtual void ChangeCellToBehavior(int x, int y, int z, int oldValue, int newValue, MovingBlock movingBlock)
static ? TerrainRaycastResult Raycast(Terrain terrain, Vector3 start, Vector3 end, bool useInteractionBoxes, bool skipAirBlocks, Func< int, float, bool > action)
一个不依赖于SubsystemTerrain的射线检测方法 注意!由于此方法不依赖于SubsystemTerrain,故射线检测某些方块(如家具等)会异常或报错 请谨慎使用
SubsystemSky m_subsystemsky
SubsystemPickables m_subsystemPickables
SubsystemTime m_subsystemTime
virtual ? TerrainRaycastResult Raycast(Vector3 start, Vector3 end, bool useInteractionBoxes, bool skipAirBlocks, Func< int, float, bool > action)
static bool TerrainUpdaterEnabled
virtual TerrainRenderer TerrainRenderer
override void Save(ValuesDictionary valuesDictionary)
virtual SubsystemPalette SubsystemPalette
SubsystemParticles m_subsystemParticles
DynamicArray< Point3 > m_modifiedList
virtual void ProcessModifiedCells()
virtual TerrainUpdater TerrainUpdater
virtual int GetCellValue(int x, int y, int z)
ValuesDictionary ValuesDictionary
static void HookAction(string HookName, Func< ModLoader, bool > action)
执行Hook
static Vector3 Normalize(Vector3 v)
static float Distance(Vector3 v1, Vector3 v2)