public override void OnGameTick(float deltaTime) { if (entity.State == EnumEntityState.Inactive) { return; } Vec3d pos = entity.LocalPos.XYZ; pushVector.Set(0, 0, 0); Vec3d p = new Vec3d(); entity.World.GetEntitiesAround(pos, 10, 5, (e) => { EntityPos epos = e.LocalPos; double distanceSq = epos.SquareDistanceTo(pos); if (e != entity && distanceSq < touchDistance * touchDistance && e.HasBehavior("repulseagents") && e.IsInteractable) { p.Set(pos.X - epos.X, pos.Y - epos.Y, pos.Z - epos.Z); p.Normalize().Mul(1 - GameMath.Sqrt(distanceSq) / touchDistance); pushVector.Add(p.X, p.Y, p.Z); } return(false); }); pushVector.X = GameMath.Clamp(pushVector.X, -3, 3); pushVector.Y = GameMath.Clamp(pushVector.Y, -3, 3); pushVector.Z = GameMath.Clamp(pushVector.Z, -3, 3); entity.LocalPos.Motion.Add(pushVector.X / 15, pushVector.Y / 30, pushVector.Z / 15); entity.World.FrameProfiler.Mark("entity-repulse"); }
private void RenderRecipeOutLine() { if (recipeOutlineMeshRef == null || api.HideGuis) { return; } IRenderAPI rpi = api.Render; IClientWorldAccessor worldAccess = api.World; EntityPos plrPos = worldAccess.Player.Entity.Pos; Vec3d camPos = worldAccess.Player.Entity.CameraPos; ModelMat.Set(rpi.CameraMatrixOriginf).Translate(pos.X - camPos.X, pos.Y - camPos.Y, pos.Z - camPos.Z); outLineColorMul.A = 1 - GameMath.Clamp((float)Math.Sqrt(plrPos.SquareDistanceTo(pos.X, pos.Y, pos.Z)) / 5 - 1f, 0, 1); rpi.LineWidth = 2; rpi.GLEnableDepthTest(); rpi.GlToggleBlend(true); IShaderProgram prog = rpi.GetEngineShader(EnumShaderProgram.Wireframe); prog.Use(); prog.UniformMatrix("projectionMatrix", rpi.CurrentProjectionMatrix); prog.UniformMatrix("modelViewMatrix", ModelMat.Values); prog.Uniform("colorIn", outLineColorMul); rpi.RenderMesh(recipeOutlineMeshRef); prog.Stop(); }
public static double DistanceTo(this EntityPos aPos, Vec3d bPos) { return(Math.Sqrt(aPos.SquareDistanceTo(bPos))); }