public bool SetIntersectLocation(BoundingBox bbox, PlayerLocation location) { Ray ray = new Ray(location.ToVector3() - Velocity, Velocity.Normalize()); double? distance = ray.Intersects(bbox); if (distance != null) { double dist = (double) distance - 0.1; Vector3 pos = ray.Position + (ray.Direction*dist); KnownPosition.X = (float) pos.X; KnownPosition.Y = (float) pos.Y; KnownPosition.Z = (float) pos.Z; return true; } return false; }
private bool CheckBlockCollide(PlayerLocation location) { var bbox = GetBoundingBox(); var pos = location.ToVector3(); var coords = new BlockCoordinates( (int) Math.Floor(KnownPosition.X), (int) Math.Floor((bbox.Max.Y + bbox.Min.Y)/2.0), (int) Math.Floor(KnownPosition.Z)); Dictionary<double, Block> blocks = new Dictionary<double, Block>(); for (int x = -1; x < 2; x++) { for (int z = -1; z < 2; z++) { for (int y = -1; y < 2; y++) { Block block = Level.GetBlock(coords.X + x, coords.Y + y, coords.Z + z); if (block is Air) continue; BoundingBox blockbox = block.GetBoundingBox() + 0.3; if (blockbox.Intersects(GetBoundingBox())) { //if (!blockbox.Contains(KnownPosition.ToVector3())) continue; if (block is FlowingLava || block is StationaryLava) { HealthManager.Ignite(1200); continue; } if (!block.IsSolid) continue; blockbox = block.GetBoundingBox(); var midPoint = blockbox.Min + 0.5; blocks.Add((pos - Velocity).DistanceTo(midPoint), block); } } } } if (blocks.Count == 0) return false; var firstBlock = blocks.OrderBy(pair => pair.Key).First().Value; BoundingBox boundingBox = firstBlock.GetBoundingBox(); if (!SetIntersectLocation(boundingBox, KnownPosition)) { // No real hit return false; } // Use to debug hits, makes visual impressions (can be used for paintball too) var substBlock = new Stone {Coordinates = firstBlock.Coordinates}; Level.SetBlock(substBlock); // End debug block Velocity = Vector3.Zero; return true; }