diff --git a/DMCompiler/DMStandard/Defines.dm b/DMCompiler/DMStandard/Defines.dm index 03e8fa2db6..2fd5dcd819 100644 --- a/DMCompiler/DMStandard/Defines.dm +++ b/DMCompiler/DMStandard/Defines.dm @@ -197,6 +197,11 @@ #define SIDE_MAP 2 #define TILED_ICON_MAP 32768 +//world.movement_mode +#define LEGACY_MOVEMENT_MODE 0 +#define TILE_MOVEMENT_MODE 1 +#define PIXEL_MOVEMENT_MODE 2 + //generator() distributions #define UNIFORM_RAND 0 #define NORMAL_RAND 1 diff --git a/DMCompiler/DMStandard/Types/World.dm b/DMCompiler/DMStandard/Types/World.dm index 9a6d5cc177..b5b1b71e05 100644 --- a/DMCompiler/DMStandard/Types/World.dm +++ b/DMCompiler/DMStandard/Types/World.dm @@ -16,12 +16,14 @@ var/cpu = 0 as opendream_unimplemented var/fps = null var/tick_usage + var/loop_checks = 0 as opendream_unimplemented var/maxx = 0 var/maxy = 0 var/maxz = 0 var/icon_size = 32 var/view = 5 + var/movement_mode = LEGACY_MOVEMENT_MODE as opendream_unimplemented var/byond_version = DM_VERSION var/byond_build = DM_BUILD @@ -29,9 +31,10 @@ var/version = 0 as opendream_unimplemented var/address - var/port + var/port = 0 as opendream_compiletimereadonly var/internet_address = "127.0.0.1" as opendream_unimplemented - var/url + var/url as opendream_unimplemented + var/visibility = 0 as opendream_unimplemented var/status as opendream_unimplemented var/list/params = list() as opendream_unimplemented @@ -59,6 +62,9 @@ set opendream_unimplemented = TRUE proc/IsSubscribed(player, type) set opendream_unimplemented = TRUE + proc/IsBanned(key,address,computer_id,type) + set opendream_unimplemented = TRUE + return FALSE; proc/Reboot() set opendream_unimplemented = TRUE @@ -67,6 +73,8 @@ set opendream_unimplemented = TRUE proc/Export(Addr, File, Persist, Clients) + proc/Import() + set opendream_unimplemented = TRUE proc/SetScores() set opendream_unimplemented = TRUE diff --git a/OpenDreamRuntime/DreamManager.Connections.cs b/OpenDreamRuntime/DreamManager.Connections.cs index bce45723e5..75898e618c 100644 --- a/OpenDreamRuntime/DreamManager.Connections.cs +++ b/OpenDreamRuntime/DreamManager.Connections.cs @@ -5,6 +5,8 @@ using Robust.Server.Player; using Robust.Shared.Enums; using Robust.Shared.Network; +using System.Net; +using System.Net.Sockets; namespace OpenDreamRuntime { diff --git a/OpenDreamRuntime/IDreamManager.cs b/OpenDreamRuntime/IDreamManager.cs index 39cbdb0eb3..483884837d 100644 --- a/OpenDreamRuntime/IDreamManager.cs +++ b/OpenDreamRuntime/IDreamManager.cs @@ -1,4 +1,4 @@ -using OpenDreamRuntime.Objects; +using OpenDreamRuntime.Objects; using Robust.Server.Player; namespace OpenDreamRuntime { diff --git a/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectWorld.cs b/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectWorld.cs index 1f44bd74f1..dde677e1e2 100644 --- a/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectWorld.cs +++ b/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectWorld.cs @@ -4,6 +4,9 @@ using Robust.Shared; using Robust.Shared.Configuration; using Robust.Shared.Timing; +using Robust.Shared.Network; +using System.Net; +using System.Net.Sockets; namespace OpenDreamRuntime.Objects.MetaObjects { sealed class DreamMetaObjectWorld : IDreamMetaObject { @@ -11,6 +14,7 @@ sealed class DreamMetaObjectWorld : IDreamMetaObject { public IDreamMetaObject? ParentType { get; set; } [Dependency] private readonly IDreamManager _dreamManager = default!; + [Dependency] private readonly IServerNetManager _netManager = default!; [Dependency] private readonly DreamResourceManager _dreamRscMan = default!; [Dependency] private readonly IDreamMapManager _dreamMapManager = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; @@ -19,6 +23,35 @@ sealed class DreamMetaObjectWorld : IDreamMetaObject { private ViewRange _viewRange; private double TickLag => _gameTiming.TickPeriod.TotalMilliseconds / 100; + /// Determines whether we try to show IPv6 or IPv4 to the user during .address and .internet_address queries. + private bool DisplayIPv6 + { + get + { + var binds = _cfg.GetCVar(CVars.NetBindTo).Split(','); + foreach (var bindAddress in binds) + { + if (!IPAddress.TryParse(bindAddress.Trim(), out var address)) // EXTREMELY unlikely since RT does this same check on network startup + { + continue; + } + + if (address.AddressFamily == AddressFamily.InterNetworkV6) + { + return true; + } + } + return false; + } + } + /// Tries to return the address of the server, as it appears over the internet. May return null. + private IPAddress? InternetAddress + { + get + { + return null; //TODO: Implement this! + } + } public DreamMetaObjectWorld() { IoCManager.InjectDependencies(this); @@ -100,12 +133,30 @@ public DreamValue OnVariableGet(DreamObject dreamObject, string varName, DreamVa 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 "address": // By address they mean, the local address we have on the network, not on the internet. + var host = Dns.GetHostEntry(Dns.GetHostName()); + var ipType = DisplayIPv6 ? AddressFamily.InterNetworkV6 : AddressFamily.InterNetwork; + foreach (var ip in host.AddressList) + { + if (ip.AddressFamily == ipType) + { + return new DreamValue(ip.ToString()); + } + } + return DreamValue.Null; + case "port": + return new DreamValue(_netManager.Port); + case "url": + if (InternetAddress == null) + return DreamValue.Null; + return new(InternetAddress + ":" + _netManager.Port); // RIP "opendream://" + case "internet_address": + IPAddress? address = InternetAddress; + // We don't need to do any logic with DisplayIPv6 since whatever this address is, + // ought to be the address that the boolean's getter is searching for anyways. + if (address == null) + return DreamValue.Null; + return new(address.ToString()); 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) {