static void Postfix(ref GravityComponents __instance) { var data = __instance.GetDataList(); foreach (var newGrav in gravComponentState) { data[newGrav.Key] = newGrav.Value; } }
// TODO: Check for potential bug with 1-tile width water static void Prefix(ref GravityComponents __instance, float dt) { gravComponentState.Clear(); var data = __instance.GetDataList(); for (int i = 0; i < data.Count; i++) { GravityComponent grav = data[i]; if (!Helpers.ShouldFloat(grav.transform)) { continue; } ApplyXVelocityChanges(ref grav, dt); ApplyYVelocityChanges(ref grav, dt); Vector3 pos = grav.transform.GetPosition(); Vector3 newPosition = (Vector2)pos + grav.velocity * dt; // Resolve collisions CollisionResolver resolver = new CollisionResolver(grav, newPosition); resolver.ResolveCollisions(); // Apply the new gravity/position newPosition = resolver.bestPosition; newPosition.z = pos.z; grav = resolver.grav; grav.transform.SetPosition(newPosition); grav.elapsedTime += dt; gravComponentState.Add(i, grav); data[i] = NULL_COMPONENT; } }