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

◆ Step()

static BallStepResult Terraria.Physics.BallCollision.Step ( PhysicsProperties physicsProperties,
Entity entity,
ref float entityAngularVelocity,
IBallContactListener listener )
inlinestatic

Definition at line 24 of file BallCollision.cs.

25 {
26 Vector2 position = entity.position;
27 Vector2 velocity = entity.velocity;
28 Vector2 size = entity.Size;
29 float num = entityAngularVelocity;
30 float num2 = size.X * 0.5f;
31 num *= physicsProperties.Drag;
32 velocity *= physicsProperties.Drag;
33 float num3 = velocity.Length();
34 if (num3 > 1000f)
35 {
36 velocity = 1000f * Vector2.Normalize(velocity);
37 num3 = 1000f;
38 }
39 int num4 = Math.Max(1, (int)Math.Ceiling(num3 / 2f));
40 float num5 = 1f / (float)num4;
41 velocity *= num5;
42 num *= num5;
43 float num6 = physicsProperties.Gravity / (float)(num4 * num4);
44 bool flag = false;
45 for (int i = 0; i < num4; i++)
46 {
47 velocity.Y += num6;
48 if (CheckForPassThrough(position + size * 0.5f, out var type, out var contactTile))
49 {
50 if (type == BallPassThroughType.Tile && Main.tileSolid[contactTile.type] && !Main.tileSolidTop[contactTile.type])
51 {
52 velocity *= 0f;
53 num *= 0f;
54 flag = true;
55 }
56 else
57 {
58 BallPassThroughEvent passThrough = new BallPassThroughEvent(num5, contactTile, entity, type);
59 listener.OnPassThrough(physicsProperties, ref position, ref velocity, ref num, ref passThrough);
60 }
61 }
62 position += velocity;
63 if (!IsBallInWorld(position, size))
64 {
65 return BallStepResult.OutOfBounds();
66 }
67 if (GetClosestEdgeToCircle(position, size, velocity, out var collisionPoint, out contactTile))
68 {
69 Vector2 vector = Vector2.Normalize(position + size * 0.5f - collisionPoint);
70 position = collisionPoint + vector * (num2 + 0.0001f) - size * 0.5f;
71 BallCollisionEvent collision = new BallCollisionEvent(num5, vector, collisionPoint, contactTile, entity);
72 flag = true;
73 velocity = Vector2.Reflect(velocity, collision.Normal);
74 listener.OnCollision(physicsProperties, ref position, ref velocity, ref collision);
75 num = (collision.Normal.X * velocity.Y - collision.Normal.Y * velocity.X) / num2;
76 }
77 }
78 velocity /= num5;
79 num /= num5;
80 BallStepResult result = BallStepResult.Moving();
81 if (flag && velocity.X > -0.01f && velocity.X < 0.01f && velocity.Y <= 0f && velocity.Y > 0f - physicsProperties.Gravity)
82 {
83 result = BallStepResult.Resting();
84 }
85 entity.position = position;
86 entity.velocity = velocity;
87 entityAngularVelocity = num;
88 return result;
89 }
static double Ceiling(double a)
static byte Max(byte val1, byte val2)
Definition Math.cs:738
static bool IsBallInWorld(Vector2 position, Vector2 size)
static bool CheckForPassThrough(Vector2 center, out BallPassThroughType type, out Tile contactTile)
static bool GetClosestEdgeToCircle(Vector2 position, Vector2 size, Vector2 velocity, out Vector2 collisionPoint, out Tile collisionTile)
static Vector2 Reflect(Vector2 vector, Vector2 normal)
Definition Vector2.cs:157

References System.Math.Ceiling(), Terraria.Physics.BallCollision.CheckForPassThrough(), Terraria.Physics.PhysicsProperties.Drag, Terraria.Physics.BallCollision.GetClosestEdgeToCircle(), Terraria.Physics.PhysicsProperties.Gravity, Terraria.Physics.BallCollision.IsBallInWorld(), Microsoft.Xna.Framework.Vector2.Length(), System.Math.Max(), Terraria.Physics.BallStepResult.Moving(), Microsoft.Xna.Framework.Vector2.Normalize(), Terraria.Physics.IBallContactListener.OnCollision(), Terraria.Physics.IBallContactListener.OnPassThrough(), Terraria.Physics.BallStepResult.OutOfBounds(), Terraria.Entity.position, Microsoft.Xna.Framework.Vector2.Reflect(), Terraria.Physics.BallStepResult.Resting(), Terraria.Entity.Size, Terraria.Main.tileSolid, Terraria.Main.tileSolidTop, System.type, Terraria.Entity.velocity, Microsoft.Xna.Framework.Vector2.X, and Microsoft.Xna.Framework.Vector2.Y.

Referenced by Terraria.GameContent.Golf.GolfHelper.StepGolfBall().