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");
        }
Exemplo n.º 2
0
        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();
        }
Exemplo n.º 3
0
 public static double DistanceTo(this EntityPos aPos, Vec3d bPos)
 {
     return(Math.Sqrt(aPos.SquareDistanceTo(bPos)));
 }