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); } }
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(); }