public static bool gotoPosition(this NPCProto proto, Vec3f position, float minDistance)
        {
            if (proto is NPC)
            {
                NPC p = (NPC)proto;
                if (p.NPCController == null)//set the position!
                {
                    if (proto.getAI().lastPosUpdate == 0)
                    {
                        proto.getAI().lastPosUpdate = DateTime.Now.Ticks;
                    }
                    else
                    {
                        long now  = DateTime.Now.Ticks;
                        long time = now - proto.getAI().lastPosUpdate;

                        float speed = (5 * 100) * (int)(time / 1000.0);

                        Vec3f direction = position - proto.Position;
                        if (direction.Length < speed)
                        {
                            proto.Position = position;
                        }
                        else
                        {
                            direction  = direction.normalise();
                            direction *= speed;

                            proto.Position = proto.Position + direction;
                        }
                        proto.getAI().lastPosUpdate = now;
                    }
                }
                else
                {
                    proto.getAI().lastPosUpdate = 0;
                }
            }

            if (proto.Position.getDistance(position) < minDistance)
            {
                return(true);
            }
            else
            {
                Vec3f p = position - proto.Position;
                p.Y = 0;
                proto.setDirection(p);
                proto.playAnimation(proto.getRunAnimation());
                return(false);
            }
        }
Beispiel #2
0
        public virtual void setDirectionFast(Vec3f dir)
        {
            if (dir.isNull())
            {
                return;
            }
            dir           = dir.normalise();
            vob.Direction = dir;

            if (!created)
            {
                return;
            }

            BitStream stream = Program.server.SendBitStream;

            stream.Reset();
            stream.Write((byte)RakNet.DefaultMessageIDTypes.ID_USER_PACKET_ENUM);
            stream.Write((byte)NetworkID.SetVobDirectionMessage);
            stream.Write(vob.ID);
            stream.Write(vob.Direction);
            Program.server.ServerInterface.Send(stream, PacketPriority.LOW_PRIORITY, PacketReliability.UNRELIABLE_SEQUENCED, (char)0, RakNet.RakNet.UNASSIGNED_SYSTEM_ADDRESS, true);
        }
        public static void setDirection(Vec3f dir)
        {
            if (playerVob == null)
            {
                return;
            }

            dir = dir.normalise();

            Process process = Process.ThisProcess();
            zCVob   vob     = playerVob;


            Vec3f zAxis = dir;
            Vec3f up    = new Vec3f(0.0f, 0.0f, 0.0f);

            if (Math.Abs(zAxis.Y) > 0.5)
            {
                if (zAxis.Y > 0)
                {
                    up.Z = -1.0f;
                }
                else
                {
                    up.Z = 1.0f;
                }
            }
            else if (Math.Abs(zAxis.X) < 0.0001 && Math.Abs(zAxis.Y) < 0.0001)
            {
                if (zAxis.Y > -0.0001)
                {
                    up.Y = 1.0f;
                }
                else
                {
                    up.Y = -1.0f;
                }
            }
            else
            {
                up.Y = 1.0f;
            }



            Vec3f xAxis = up.cross(zAxis).normalise();
            Vec3f yAxis = zAxis.cross(xAxis).normalise();

            Matrix4 trafo = vob.TrafoObjToWorld;

            trafo.set(12, 0);
            trafo.set(13, 0);
            trafo.set(14, 0);
            trafo.set(15, 1);

            trafo.set(0, xAxis.X);
            trafo.set(4, xAxis.Y);
            trafo.set(8, xAxis.Z);

            trafo.set(1, yAxis.X);
            trafo.set(5, yAxis.Y);
            trafo.set(9, yAxis.Z);

            trafo.set(2, zAxis.X);
            trafo.set(6, zAxis.Y);
            trafo.set(10, zAxis.Z);


            zVec3 p = vob.GetPosition();

            vob.SetPositionWorld(p);

            p.Dispose();
        }