Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ StepConveyorBelt()

static void Terraria.Collision.StepConveyorBelt ( Entity entity,
float gravDir )
inlinestatic

Definition at line 3378 of file Collision.cs.

3379 {
3380 Player player = null;
3381 if (entity is Player)
3382 {
3383 player = (Player)entity;
3384 if (Math.Abs(player.gfxOffY) > 2f || player.grapCount > 0 || player.pulley)
3385 {
3386 return;
3387 }
3388 entity.height -= 5;
3389 entity.position.Y += 5f;
3390 }
3391 int num = 0;
3392 int num2 = 0;
3393 bool flag = false;
3394 int num3 = (int)entity.position.Y + entity.height;
3395 entity.Hitbox.Inflate(2, 2);
3396 _ = entity.TopLeft;
3397 _ = entity.TopRight;
3398 _ = entity.BottomLeft;
3399 _ = entity.BottomRight;
3402 GetEntityEdgeTiles(cacheForConveyorBelts, entity, left: false, right: false);
3403 Vector2 vector = new Vector2(0.0001f);
3404 Vector2 lineStart = default(Vector2);
3405 Vector2 lineStart2 = default(Vector2);
3406 Vector2 lineEnd = default(Vector2);
3407 Vector2 lineEnd2 = default(Vector2);
3408 for (int i = 0; i < cacheForConveyorBelts.Count; i++)
3409 {
3410 Point point = cacheForConveyorBelts[i];
3411 if (!WorldGen.InWorld(point.X, point.Y) || (player != null && player.onTrack && point.Y < num3))
3412 {
3413 continue;
3414 }
3415 Tile tile = Main.tile[point.X, point.Y];
3416 if (tile == null || !tile.active() || !tile.nactive())
3417 {
3418 continue;
3419 }
3420 int num4 = TileID.Sets.ConveyorDirection[tile.type];
3421 if (num4 == 0)
3422 {
3423 continue;
3424 }
3425 lineStart.X = (lineStart2.X = point.X * 16);
3426 lineEnd.X = (lineEnd2.X = point.X * 16 + 16);
3427 switch (tile.slope())
3428 {
3429 case 1:
3430 lineStart2.Y = point.Y * 16;
3431 lineEnd2.Y = (lineEnd.Y = (lineStart.Y = point.Y * 16 + 16));
3432 break;
3433 case 2:
3434 lineEnd2.Y = point.Y * 16;
3435 lineStart2.Y = (lineEnd.Y = (lineStart.Y = point.Y * 16 + 16));
3436 break;
3437 case 3:
3438 lineEnd.Y = (lineStart2.Y = (lineEnd2.Y = point.Y * 16));
3439 lineStart.Y = point.Y * 16 + 16;
3440 break;
3441 case 4:
3442 lineStart.Y = (lineStart2.Y = (lineEnd2.Y = point.Y * 16));
3443 lineEnd.Y = point.Y * 16 + 16;
3444 break;
3445 default:
3446 if (tile.halfBrick())
3447 {
3448 lineStart2.Y = (lineEnd2.Y = point.Y * 16 + 8);
3449 }
3450 else
3451 {
3452 lineStart2.Y = (lineEnd2.Y = point.Y * 16);
3453 }
3454 lineStart.Y = (lineEnd.Y = point.Y * 16 + 16);
3455 break;
3456 }
3457 int num5 = 0;
3458 if (!TileID.Sets.Platforms[tile.type] && CheckAABBvLineCollision2(entity.position - vector, entity.Size + vector * 2f, lineStart, lineEnd))
3459 {
3460 num5--;
3461 }
3462 if (CheckAABBvLineCollision2(entity.position - vector, entity.Size + vector * 2f, lineStart2, lineEnd2))
3463 {
3464 num5++;
3465 }
3466 if (num5 != 0)
3467 {
3468 flag = true;
3469 num += num4 * num5 * (int)gravDir;
3470 if (tile.leftSlope())
3471 {
3472 num2 += (int)gravDir * -num4;
3473 }
3474 if (tile.rightSlope())
3475 {
3476 num2 -= (int)gravDir * -num4;
3477 }
3478 }
3479 }
3480 if (entity is Player)
3481 {
3482 entity.height += 5;
3483 entity.position.Y -= 5f;
3484 }
3485 if (flag && num != 0)
3486 {
3487 num = Math.Sign(num);
3488 num2 = Math.Sign(num2);
3489 Vector2 velocity = Vector2.Normalize(new Vector2((float)num * gravDir, num2)) * 2.5f;
3490 Vector2 vector2 = TileCollision(entity.position, velocity, entity.width, entity.height, fallThrough: false, fall2: false, (int)gravDir);
3491 entity.position += vector2;
3492 vector2 = TileCollision(Velocity: new Vector2(0f, 2.5f * gravDir), Position: entity.position, Width: entity.width, Height: entity.height, fallThrough: false, fall2: false, gravDir: (int)gravDir);
3493 entity.position += vector2;
3494 }
3495 }
static double Abs(double value)
static int Sign(decimal value)
Definition Math.cs:1202
static Vector2 TileCollision(Vector2 Position, Vector2 Velocity, int Width, int Height, bool fallThrough=false, bool fall2=false, int gravDir=1)
static bool CheckAABBvLineCollision2(Vector2 aabbPosition, Vector2 aabbDimensions, Vector2 lineStart, Vector2 lineEnd)
Definition Collision.cs:236
static List< Point > _cacheForConveyorBelts
Definition Collision.cs:38
static void GetEntityEdgeTiles(List< Point > p, Entity entity, bool left=true, bool right=true, bool up=true, bool down=true)
static bool[] Platforms
Definition TileID.cs:163
static int[] ConveyorDirection
Definition TileID.cs:177

References Terraria.Collision._cacheForConveyorBelts, System.Math.Abs(), Terraria.Tile.active(), Terraria.Entity.BottomLeft, Terraria.Entity.BottomRight, Terraria.Collision.CheckAABBvLineCollision2(), System.Collections.Generic.Dictionary< TKey, TValue >.Clear(), Terraria.ID.TileID.Sets.ConveyorDirection, System.Collections.Generic.Dictionary< TKey, TValue >.Count, Terraria.Collision.GetEntityEdgeTiles(), Terraria.Player.gfxOffY, Terraria.Tile.halfBrick(), Terraria.Entity.height, Terraria.Entity.Hitbox, Microsoft.Xna.Framework.Rectangle.Inflate(), Terraria.WorldGen.InWorld(), Terraria.Tile.leftSlope(), Terraria.Tile.nactive(), Microsoft.Xna.Framework.Vector2.Normalize(), Terraria.Player.onTrack, Terraria.ID.TileID.Sets.Platforms, Terraria.Entity.position, Terraria.Player.pulley, Terraria.Tile.rightSlope(), System.Math.Sign(), Terraria.Entity.Size, Terraria.Tile.slope(), Terraria.Main.tile, Terraria.Collision.TileCollision(), Terraria.Entity.TopLeft, Terraria.Entity.TopRight, Terraria.Tile.type, Terraria.Entity.width, Microsoft.Xna.Framework.Point.X, Microsoft.Xna.Framework.Point.Y, and Microsoft.Xna.Framework.Vector2.Y.

Referenced by Terraria.Player.DryCollision(), Terraria.Item.MoveInWorld(), Terraria.Player.Update(), and Terraria.NPC.UpdateCollision().