コード例 #1
0
    public override bool OnClientCommand(Game game, ClientCommandArgs args)
    {
        if (args.command == "cam")
        {
            IntRef   argumentsLength = new IntRef();
            string[] arguments       = p.StringSplit(args.arguments, " ", argumentsLength);
            if (p.StringTrim(args.arguments) == "")
            {
                m.DisplayNotification("&6AutoCamera help.");
                m.DisplayNotification("&6.cam p&f - add a point to path");
                m.DisplayNotification("&6.cam start [real seconds]&f - play the path");
                m.DisplayNotification("&6.cam rec [real seconds] [video seconds]&f - play and record to .avi file");
                m.DisplayNotification("&6.cam stop&f - stop playing and recording");
                m.DisplayNotification("&6.cam clear&f - remove all points from path");
                m.DisplayNotification("&6.cam save&f - copy path points to clipboard");
                m.DisplayNotification("&6.cam load [points]&f - load path points");
                return(true);
            }
            if (arguments[0] == "p")
            {
                m.DisplayNotification("Point defined.");
                CameraPoint point = new CameraPoint();
                point.positionGlX    = m.GetLocalPositionX();
                point.positionGlY    = m.GetLocalPositionY();
                point.positionGlZ    = m.GetLocalPositionZ();
                point.orientationGlX = m.GetLocalOrientationX();
                point.orientationGlY = m.GetLocalOrientationY();
                point.orientationGlZ = m.GetLocalOrientationZ();
                cameraPoints[cameraPointsCount++] = point;
            }
            if (arguments[0] == "start" || arguments[0] == "play" || arguments[0] == "rec")
            {
                if (!m.IsFreemoveAllowed())
                {
                    m.DisplayNotification("Free move not allowed.");
                    return(true);
                }
                if (cameraPointsCount == 0)
                {
                    m.DisplayNotification("No points defined. Enter points with \".cam p\" command.");
                    return(true);
                }
                playingSpeed = 1;
                float totalRecTime = -1;
                if (arguments[0] == "rec")
                {
                    if (argumentsLength.value >= 3)
                    {
                        // video time
                        totalRecTime = p.FloatParse(arguments[2]);
                    }
                    avi = m.AviWriterCreate();
                    avi.Open(p.StringFormat("{0}.avi", p.Timestamp()), framerate, m.GetWindowWidth(), m.GetWindowHeight());
                }
                if (argumentsLength.value >= 2)
                {
                    // play time
                    float totalTime = p.FloatParse(arguments[1]);
                    playingSpeed = TotalDistance() / totalTime;

                    if (totalRecTime == -1)
                    {
                        recspeed = 10;
                    }
                    else
                    {
                        recspeed = totalTime / totalRecTime;
                    }
                }
                playingTime          = 0;
                firstFrameDone       = false;
                previousPositionX    = m.GetLocalPositionX();
                previousPositionY    = m.GetLocalPositionY();
                previousPositionZ    = m.GetLocalPositionZ();
                previousOrientationX = m.GetLocalOrientationX();
                previousOrientationY = m.GetLocalOrientationY();
                previousOrientationZ = m.GetLocalOrientationZ();
                m.ShowGui(0);
                previousFreemove = m.GetFreemove();
                m.SetFreemove(FreemoveLevelEnum.Noclip);
                m.EnableCameraControl(false);
            }
            if (arguments[0] == "stop")
            {
                m.DisplayNotification("Camera stopped.");
                Stop();
            }
            if (arguments[0] == "clear")
            {
                m.DisplayNotification("Camera points cleared.");
                cameraPointsCount = 0;
                Stop();
            }
            if (arguments[0] == "save")
            {
                string s = "1,";
                for (int i = 0; i < cameraPointsCount; i++)
                {
                    CameraPoint point = cameraPoints[i];
                    s = p.StringFormat2("{0}{1},", s, p.IntToString(p.FloatToInt(point.positionGlX * 100)));
                    s = p.StringFormat2("{0}{1},", s, p.IntToString(p.FloatToInt(point.positionGlY * 100)));
                    s = p.StringFormat2("{0}{1},", s, p.IntToString(p.FloatToInt(point.positionGlZ * 100)));
                    s = p.StringFormat2("{0}{1},", s, p.IntToString(p.FloatToInt(point.orientationGlX * 1000)));
                    s = p.StringFormat2("{0}{1},", s, p.IntToString(p.FloatToInt(point.orientationGlY * 1000)));
                    s = p.StringFormat2("{0}{1}", s, p.IntToString(p.FloatToInt(point.orientationGlZ * 1000)));
                    if (i != cameraPointsCount - 1)
                    {
                        s = p.StringFormat("{0},", s);
                    }
                }
                p.ClipboardSetText(s);
                m.DisplayNotification("Camera points copied to clipboard.");
            }
            if (arguments[0] == "load")
            {
                IntRef   pointsLength = new IntRef();
                string[] points       = p.StringSplit(arguments[1], ",", pointsLength);
                int      n            = (pointsLength.value - 1) / 6;
                cameraPointsCount = 0;
                for (int i = 0; i < n; i++)
                {
                    CameraPoint point = new CameraPoint();
                    point.positionGlX    = one * p.IntParse(points[1 + i * 6 + 0]) / 100;
                    point.positionGlY    = one * p.IntParse(points[1 + i * 6 + 1]) / 100;
                    point.positionGlZ    = one * p.IntParse(points[1 + i * 6 + 2]) / 100;
                    point.orientationGlX = one * p.IntParse(points[1 + i * 6 + 3]) / 1000;
                    point.orientationGlY = one * p.IntParse(points[1 + i * 6 + 4]) / 1000;
                    point.orientationGlZ = one * p.IntParse(points[1 + i * 6 + 5]) / 1000;
                    cameraPoints[cameraPointsCount++] = point;
                }
                m.DisplayNotification(p.StringFormat("Camera points loaded: {0}", p.IntToString(n)));
            }
            return(true);
        }
        return(false);
    }