Пример #1
0
        public static DreamValue NativeProc_Insert(DreamObject instance, DreamObject usr, DreamProcArguments arguments)
        {
            int       index = arguments.GetArgument(0, "Index").GetValueAsInteger(); //1-indexed
            DreamList list  = (DreamList)instance;

            if (arguments.OrderedArguments.Count < 2)
            {
                throw new Exception("No value given to insert");
            }

            for (int i = 1; i < arguments.OrderedArguments.Count; i++)
            {
                DreamValue item = arguments.OrderedArguments[i];

                if (item.TryGetValueAsDreamList(out DreamList valueList))
                {
                    foreach (DreamValue value in valueList.GetValues())
                    {
                        list.Insert(index++, value);
                    }
                }
                else
                {
                    list.Insert(index++, item);
                }
            }

            return(new DreamValue(index));
        }
Пример #2
0
        public DMProcState(DMProc proc, DreamThread thread, int maxStackSize, DreamObject instance, DreamObject usr, DreamProcArguments arguments)
            : base(thread)
        {
            _proc           = proc;
            _stack          = _stackPool.Rent(maxStackSize);
            Instance        = instance;
            Usr             = usr;
            ArgumentCount   = Math.Max(arguments.ArgumentCount, proc.ArgumentNames?.Count ?? 0);
            _localVariables = _dreamValuePool.Rent(256);

            //TODO: Positional arguments must precede all named arguments, this needs to be enforced somehow
            //Positional arguments
            for (int i = 0; i < ArgumentCount; i++)
            {
                _localVariables[i] = (i < arguments.OrderedArguments.Count) ? arguments.OrderedArguments[i] : DreamValue.Null;
            }

            //Named arguments
            foreach ((string argumentName, DreamValue argumentValue) in arguments.NamedArguments)
            {
                int argumentIndex = proc.ArgumentNames?.IndexOf(argumentName) ?? -1;
                if (argumentIndex == -1)
                {
                    throw new Exception($"Invalid argument name \"{argumentName}\"");
                }

                _localVariables[argumentIndex] = argumentValue;
            }
        }
Пример #3
0
        public override void OnObjectCreated(DreamObject dreamObject, DreamProcArguments creationArguments)
        {
            base.OnObjectCreated(dreamObject, creationArguments);

            _dreamManager.WorldContentsList = dreamObject.GetVariable("contents").GetValueAsDreamList();

            DreamValue log = dreamObject.ObjectDefinition.Variables["log"];

            dreamObject.SetVariable("log", log);

            DreamValue fps = dreamObject.ObjectDefinition.Variables["fps"];

            if (fps.Value != null)
            {
                _cfg.SetCVar(CVars.NetTickrate, fps.GetValueAsInteger());
            }

            DreamValue view = dreamObject.ObjectDefinition.Variables["view"];

            if (view.TryGetValueAsString(out string viewString))
            {
                _viewRange = new ViewRange(viewString);
            }
            else
            {
                _viewRange = new ViewRange(view.GetValueAsInteger());
            }
        }
Пример #4
0
        private DreamProcArguments ConstructClickArguments(DreamObject atom, EntityClickedEvent e)
        {
            NameValueCollection paramsBuilder = HttpUtility.ParseQueryString(String.Empty);

            if (e.Shift)
            {
                paramsBuilder.Add("shift", "1");
            }
            if (e.Ctrl)
            {
                paramsBuilder.Add("ctrl", "1");
            }
            if (e.Alt)
            {
                paramsBuilder.Add("alt", "1");
            }
            //TODO: "icon-x", "icon-y", "screen-loc"

            return(new DreamProcArguments(new() {
                new DreamValue(atom),
                DreamValue.Null,
                DreamValue.Null,
                new DreamValue(paramsBuilder.ToString())
            }));
        }
Пример #5
0
        public void OnObjectCreated(DreamObject dreamObject, DreamProcArguments creationArguments)
        {
            ParentType?.OnObjectCreated(dreamObject, creationArguments);

            _dreamManager.WorldContentsList = dreamObject.GetVariable("contents").GetValueAsDreamList();

            DreamValue log = dreamObject.ObjectDefinition.Variables["log"];

            dreamObject.SetVariable("log", log);

            DreamValue fps = dreamObject.ObjectDefinition.Variables["fps"];

            if (fps.TryGetValueAsInteger(out var fpsValue))
            {
                _cfg.SetCVar(CVars.NetTickrate, fpsValue);
            }

            DreamValue view = dreamObject.ObjectDefinition.Variables["view"];

            if (view.TryGetValueAsString(out string viewString))
            {
                _viewRange = new ViewRange(viewString);
            }
            else
            {
                if (!view.TryGetValueAsInteger(out var viewInt))
                {
                    Logger.Warning("world.view did not contain a valid value. A default of 5 is being used.");
                    viewInt = 5;
                }

                _viewRange = new ViewRange(viewInt);
            }
        }
Пример #6
0
        public override void OnVariableSet(DreamObject dreamObject, string variableName, DreamValue variableValue, DreamValue oldVariableValue)
        {
            base.OnVariableSet(dreamObject, variableName, variableValue, oldVariableValue);

            if (variableName == "key" || variableName == "ckey")
            {
                DreamConnection newClientConnection = Program.DreamServer.GetConnectionFromCKey(variableValue.GetValueAsString());

                newClientConnection.MobDreamObject = dreamObject;
            }
            else if (variableName == "client" && variableValue != oldVariableValue)
            {
                DreamObject newClient = variableValue.GetValueAsDreamObject();
                DreamObject oldClient = oldVariableValue.GetValueAsDreamObject();

                if (newClient != null)
                {
                    Program.ClientToConnection[newClient].MobDreamObject = dreamObject;
                }
                else if (oldClient != null)
                {
                    Program.ClientToConnection[oldClient].MobDreamObject = null;
                }
            }
        }
Пример #7
0
        public void OnVariableSet(DreamObject dreamObject, string varName, DreamValue value, DreamValue oldValue)
        {
            ParentType?.OnVariableSet(dreamObject, varName, value, oldValue);

            switch (varName)
            {
            case "fps":
                if (!value.TryGetValueAsInteger(out var fps))
                {
                    fps = 10;
                }

                _cfg.SetCVar(CVars.NetTickrate, fps);
                break;

            case "maxz":
                value.TryGetValueAsInteger(out var maxz);

                _dreamMapManager.SetZLevels(maxz);
                break;

            case "log":
                if (value.TryGetValueAsString(out var logStr))
                {
                    dreamObject.SetVariableValue("log", new DreamValue(_dreamRscMan.LoadResource(logStr)));
                }
                else if (!value.TryGetValueAsDreamResource(out _))
                {
                    dreamObject.SetVariableValue("log", new DreamValue(new ConsoleOutputResource()));
                }
                break;
            }
        }
Пример #8
0
        public override DreamValue OnVariableGet(DreamObject dreamObject, string variableName, DreamValue variableValue)
        {
            if (variableName == "key" || variableName == "ckey")
            {
                DreamObject clientObject = dreamObject.GetVariable("client").GetValueAsDreamObject();

                if (clientObject != null && clientObject.IsSubtypeOf(DreamPath.Client))
                {
                    return(clientObject.GetVariable(variableName));
                }
                else
                {
                    return(DreamValue.Null);
                }
            }
            else if (variableName == "client")
            {
                DreamConnection connection = Program.DreamServer.GetConnectionFromMob(dreamObject);

                if (connection != null && connection.ClientDreamObject != null)
                {
                    return(new DreamValue(connection.ClientDreamObject));
                }
                else
                {
                    return(DreamValue.Null);
                }
            }
            else
            {
                return(base.OnVariableGet(dreamObject, variableName, variableValue));
            }
        }
Пример #9
0
        public override void OnVariableSet(DreamObject dreamObject, string variableName, DreamValue variableValue, DreamValue oldVariableValue)
        {
            base.OnVariableSet(dreamObject, variableName, variableValue, oldVariableValue);

            if (variableName == "key" || variableName == "ckey")
            {
                if (_playerManager.TryGetSessionByUsername(variableValue.GetValueAsString(), out var session))
                {
                    var connection = _dreamManager.GetConnectionBySession(session);

                    connection.MobDreamObject = dreamObject;
                }
            }
            else if (variableName == "see_invisible")
            {
                //TODO
            }
            else if (variableName == "client" && variableValue != oldVariableValue)
            {
                var newClient = variableValue.GetValueAsDreamObject();
                var oldClient = oldVariableValue.GetValueAsDreamObject();

                if (newClient != null)
                {
                    _dreamManager.GetConnectionFromClient(newClient).MobDreamObject = dreamObject;
                }
                else if (oldClient != null)
                {
                    _dreamManager.GetConnectionFromClient(oldClient).MobDreamObject = null;
                }
            }
        }
Пример #10
0
        public static DreamListVars Create(DreamObject dreamObject)
        {
            var list = new DreamListVars(dreamObject);

            list.InitSpawn(new DreamProcArguments(null));
            return(list);
        }
Пример #11
0
        public DMProcState(DMProc proc, DreamThread thread, int maxStackSize, DreamObject instance, DreamObject usr, DreamProcArguments arguments)
            : base(thread)
        {
            _proc          = proc;
            _stack         = _stackPool.Rent(maxStackSize);
            Instance       = instance;
            Usr            = usr;
            Arguments      = arguments;
            LocalVariables = _dreamValuePool.Rent(256);

            // args -> locals
            for (int i = 0; i < proc.ArgumentNames.Count; i++)
            {
                string argumentName = proc.ArgumentNames[i];

                if (Arguments.NamedArguments.TryGetValue(argumentName, out DreamValue argumentValue))
                {
                    LocalVariables[i] = argumentValue;
                }
                else if (i < Arguments.OrderedArguments.Count)
                {
                    LocalVariables[i] = Arguments.OrderedArguments[i];
                }
                else
                {
                    LocalVariables[i] = DreamValue.Null;
                }
            }
        }
Пример #12
0
 public InitDreamObjectState(DreamThread thread, DreamObject dreamObject, DreamObject usr, DreamProcArguments arguments)
     : base(thread)
 {
     _dreamObject = dreamObject;
     _usr         = usr;
     _arguments   = arguments;
 }
Пример #13
0
        public void AddAtomCreation(DreamObject atom, ServerIconAppearance appearance)
        {
            AtomType atomType = AtomType.Atom;

            if (atom.IsSubtypeOf(DreamPath.Area))
            {
                atomType = AtomType.Area;
            }
            else if (atom.IsSubtypeOf(DreamPath.Turf))
            {
                atomType = AtomType.Turf;
            }
            else if (atom.IsSubtypeOf(DreamPath.Mob))
            {
                atomType = AtomType.Movable;
            }
            else if (atom.IsSubtypeOf(DreamPath.Obj))
            {
                atomType = AtomType.Movable;
            }

            lock (_dreamStateManagerLock) {
                _currentDeltaState.AddAtomCreation(DreamMetaObjectAtom.AtomIDs[atom], atomType, appearance.GetID());
            }
        }
Пример #14
0
        public override DreamValue OperatorOutput(DreamValue a, DreamValue b)
        {
            DreamObject     client     = a.GetValueAsDreamObjectOfType(DreamPath.Mob).GetVariable("client").GetValueAsDreamObjectOfType(DreamPath.Client);
            DreamConnection connection = Program.ClientToConnection[client];

            connection.OutputDreamValue(b);
            return(new DreamValue(0));
        }
Пример #15
0
        public override void OnObjectDeleted(DreamObject dreamObject)
        {
            base.OnObjectDeleted(dreamObject);

            lock (Mobs) {
                Mobs.Remove(dreamObject);
            }
        }
Пример #16
0
 public InitDreamObjectState(DreamThread thread, DreamObject dreamObject, DreamObject usr, DreamProcArguments arguments)
     : base(thread)
 {
     IoCManager.InjectDependencies(this);
     _dreamObject = dreamObject;
     _usr         = usr;
     _arguments   = arguments;
 }
Пример #17
0
        public override DreamValue OperatorOutput(DreamValue a, DreamValue b)
        {
            DreamObject     client     = a.GetValueAsDreamObjectOfType(DreamPath.Mob).GetVariable("client").GetValueAsDreamObjectOfType(DreamPath.Client);
            DreamConnection connection = _dreamManager.GetConnectionFromClient(client);

            connection.OutputDreamValue(b);
            return(new DreamValue(0));
        }
Пример #18
0
        public override void OnObjectCreated(DreamObject dreamObject, DreamProcArguments creationArguments)
        {
            base.OnObjectCreated(dreamObject, creationArguments);

            ContentsList = dreamObject.GetVariable("contents").GetValueAsDreamList();

            //New() is not called here
        }
Пример #19
0
        // Execute this proc. This will behave as if the proc has `set waitfor = 0`
        public DreamValue Spawn(DreamObject src, DreamProcArguments arguments, DreamObject usr = null)
        {
            var context = new DreamThread();
            var state   = CreateState(context, src, usr, arguments);

            context.PushProcState(state);
            return(context.Resume());
        }
Пример #20
0
 public State(NativeProc proc, DreamThread thread, DreamObject src, DreamObject usr, DreamProcArguments arguments)
     : base(thread)
 {
     _proc     = proc;
     Src       = src;
     Usr       = usr;
     Arguments = arguments;
 }
Пример #21
0
        public override void OnObjectCreated(DreamObject dreamObject, DreamProcArguments creationArguments)
        {
            base.OnObjectCreated(dreamObject, creationArguments);

            lock (Mobs) {
                Mobs.Add(dreamObject);
            }
        }
Пример #22
0
        public override DreamValue OnVariableGet(DreamObject dreamObject, string variableName, DreamValue variableValue)
        {
            switch (variableName)
            {
            case "tick_lag":
                return(new DreamValue(_gameTiming.TickPeriod.TotalMilliseconds / 100));

            case "fps":
                return(new DreamValue(_gameTiming.TickRate));

            case "timeofday":
                return(new DreamValue((int)DateTime.UtcNow.TimeOfDay.TotalMilliseconds / 100));

            case "time":
                return(new DreamValue(_gameTiming.CurTime.TotalMilliseconds / 100));

            case "realtime":
                return(new DreamValue((DateTime.Now - new DateTime(2000, 1, 1)).Milliseconds / 100));

            case "tick_usage": {
                var tickUsage = (_gameTiming.RealTime - _gameTiming.LastTick) / _gameTiming.TickPeriod;
                return(new DreamValue(tickUsage * 100));
            }

            case "maxx":
                return(new DreamValue(_dreamMapManager.Size.X));

            case "maxy":
                return(new DreamValue(_dreamMapManager.Size.Y));

            case "maxz":
                return(new DreamValue(_dreamMapManager.Levels));

            //case "address":
            //    return new(Runtime.Server.Address.ToString());
            //case "port":
            //    return new(Runtime.Server.Port);
            //case "url":
            //    return new("opendream://" + Runtime.Server.Address + ":" + Runtime.Server.Port);
            case "system_type": {
                //system_type value should match the defines in Defines.dm
                if (Environment.OSVersion.Platform is PlatformID.Unix or PlatformID.MacOSX or PlatformID.Other)
                {
                    return(new DreamValue(0));
                }
                //Windows
                return(new DreamValue(1));
            }

            case "view": {
                //Number if square & centerable, string representation otherwise
                return(new DreamValue((_viewRange.IsSquare && _viewRange.IsCenterable) ? _viewRange.Width : _viewRange.ToString()));
            }

            default:
                return(base.OnVariableGet(dreamObject, variableName, variableValue));
            }
        }
Пример #23
0
        public override void OnVariableSet(DreamObject dreamObject, string variableName, DreamValue variableValue, DreamValue oldVariableValue)
        {
            base.OnVariableSet(dreamObject, variableName, variableValue, oldVariableValue);

            if (variableName == "fps")
            {
                dreamObject.SetVariable("tick_lag", new DreamValue(10.0 / variableValue.GetValueAsInteger()));
            }
        }
Пример #24
0
        public static DreamValue NativeProc_Find(DreamObject instance, DreamObject usr, DreamProcArguments arguments)
        {
            DreamValue element = arguments.GetArgument(0, "Elem");
            int        start   = arguments.GetArgument(1, "Start").GetValueAsInteger(); //1-indexed
            int        end     = arguments.GetArgument(2, "End").GetValueAsInteger();   //1-indexed
            DreamList  list    = (DreamList)instance;

            return(new(list.FindValue(element, start, end)));
        }
Пример #25
0
        public static DreamValue NativeProc_Cut(DreamObject instance, DreamObject usr, DreamProcArguments arguments)
        {
            int       start = arguments.GetArgument(0, "Start").GetValueAsInteger(); //1-indexed
            int       end   = arguments.GetArgument(1, "End").GetValueAsInteger();   //1-indexed
            DreamList list  = (DreamList)instance;

            list.Cut(start, end);
            return(DreamValue.Null);
        }
Пример #26
0
        public static DreamValue NativeProc_Copy(DreamObject instance, DreamObject usr, DreamProcArguments arguments)
        {
            int       start    = arguments.GetArgument(0, "Start").GetValueAsInteger(); //1-indexed
            int       end      = arguments.GetArgument(1, "End").GetValueAsInteger();   //1-indexed
            DreamList list     = (DreamList)instance;
            DreamList listCopy = list.CreateCopy(start, end);

            return(new DreamValue(listCopy));
        }
Пример #27
0
        public static DreamValue NativeProc_Swap(DreamObject instance, DreamObject usr, DreamProcArguments arguments)
        {
            DreamList list   = (DreamList)instance;
            int       index1 = arguments.GetArgument(0, "Index1").GetValueAsInteger();
            int       index2 = arguments.GetArgument(1, "Index2").GetValueAsInteger();

            list.Swap(index1, index2);
            return(DreamValue.Null);
        }
Пример #28
0
 public State(AsyncNativeProc proc, Func <State, Task <DreamValue> > taskFunc, DreamThread thread, DreamObject src, DreamObject usr, DreamProcArguments arguments)
     : base(thread)
 {
     _proc     = proc;
     _taskFunc = taskFunc;
     Src       = src;
     Usr       = usr;
     Arguments = arguments;
 }
Пример #29
0
        public void OnObjectCreated(DreamObject dreamObject, DreamProcArguments creationArguments)
        {
            if (!dreamObject.IsSubtypeOf(DreamPath.Atom)) // Atoms are in world.contents
            {
                _dreamManager.Datums.Add(dreamObject);
            }

            ParentType?.OnObjectCreated(dreamObject, creationArguments);
        }
Пример #30
0
        public override void OnObjectCreated(DreamObject dreamObject, DreamProcArguments creationArguments)
        {
            base.OnObjectCreated(dreamObject, creationArguments);

            if (creationArguments.GetArgument(0, "Size").TryGetValueAsInteger(out int size))
            {
                ((DreamList)dreamObject).Resize(size);
            }
        }