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) {