Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion DMCompiler/DMStandard/Types/Image.dm
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@
var/x
var/y
var/z
var/list/vis_contents = list() as opendream_unimplemented
var/list/vis_contents

var/dir
var/icon
Expand Down
14 changes: 7 additions & 7 deletions OpenDreamRuntime/Objects/Types/DreamList.cs
Original file line number Diff line number Diff line change
Expand Up @@ -977,19 +977,19 @@ private ImmutableAppearance[] GetOverlaysArray(ImmutableAppearance appearance) =
}
}

// atom.vis_contents list
// Operates on an atom's appearance
// atom or image vis_contents list
// Operates on an object's appearance
public sealed class DreamVisContentsList : DreamList {
private readonly PvsOverrideSystem? _pvsOverrideSystem;

private readonly List<DreamObjectAtom> _visContents = new();
private readonly DreamObject _atom;
private readonly DreamObject _owner; // atom or image

public DreamVisContentsList(DreamObjectDefinition listDef, PvsOverrideSystem? pvsOverrideSystem, DreamObject atom) : base(listDef, 0) {
IoCManager.InjectDependencies(this);

_pvsOverrideSystem = pvsOverrideSystem;
_atom = atom;
_owner = atom;
}

public override List<DreamValue> GetValues() {
Expand All @@ -1006,7 +1006,7 @@ public override void Cut(int start = 1, int end = 0) {
if (end == 0 || end > count) end = count;

_visContents.RemoveRange(start - 1, end - start);
AtomManager.UpdateAppearance(_atom, appearance => {
AtomManager.UpdateAppearance(_owner, appearance => {
appearance.VisContents.RemoveRange(start - 1, end - start);
});
}
Expand Down Expand Up @@ -1048,7 +1048,7 @@ public override void AddValue(DreamValue value) {
if (entity != EntityUid.Invalid)
_pvsOverrideSystem?.AddGlobalOverride(entity);

AtomManager.UpdateAppearance(_atom, appearance => {
AtomManager.UpdateAppearance(_owner, appearance => {
// Add even an invalid UID to keep this and _visContents in sync
appearance.VisContents.Add(EntityManager.GetNetEntity(entity));
});
Expand All @@ -1059,7 +1059,7 @@ public override void RemoveValue(DreamValue value) {
return;

_visContents.Remove(movable);
AtomManager.UpdateAppearance(_atom, appearance => {
AtomManager.UpdateAppearance(_owner, appearance => {
appearance.VisContents.Remove(EntityManager.GetNetEntity(movable.Entity));
});
}
Expand Down
24 changes: 24 additions & 0 deletions OpenDreamRuntime/Objects/Types/DreamObjectImage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ public sealed class DreamObjectImage : DreamObject {
private DreamObject? _loc;
private DreamList _overlays;
private DreamList _underlays;
private readonly DreamList _visContents;
private readonly DreamList _filters;
public readonly bool IsMutableAppearance;
public MutableAppearance? MutableAppearance;
Expand All @@ -31,11 +32,13 @@ public DreamObjectImage(DreamObjectDefinition objectDefinition) : base(objectDef
// /mutable_appearance.overlays and /mutable_appearance.underlays are normal lists
_overlays = ObjectTree.CreateList();
_underlays = ObjectTree.CreateList();
_visContents = ObjectTree.CreateList();
_filters = ObjectTree.CreateList();
IsMutableAppearance = true;
} else {
_overlays = new DreamOverlaysList(ObjectTree.List.ObjectDefinition, this, AppearanceSystem, false);
_underlays = new DreamOverlaysList(ObjectTree.List.ObjectDefinition, this, AppearanceSystem, true);
_visContents = new DreamVisContentsList(ObjectTree.List.ObjectDefinition, PvsOverrideSystem, this);
_filters = new DreamFilterList(ObjectTree.List.ObjectDefinition, this);
IsMutableAppearance = false;
Entity = EntityManager.SpawnEntity(null, new MapCoordinates(0, 0, MapId.Nullspace)); //spawning an entity in nullspace means it never actually gets sent to any clients until it's placed on the map, or it gets a PVS override
Expand Down Expand Up @@ -97,6 +100,10 @@ protected override bool TryGetVar(string varName, out DreamValue value) {
_underlays.IncRef();
value = new(_underlays);
return true;
case "vis_contents":
_visContents.IncRef();
value = new(_visContents);
return true;
case "filters":
_filters.IncRef();
value = new(_filters);
Expand Down Expand Up @@ -203,6 +210,22 @@ protected override void SetVar(string varName, DreamValue value) {

break;
}
case "vis_contents": {
value.TryGetValueAsDreamList(out var valueList);

_visContents.Cut();

if (valueList != null) {
// TODO: This should postpone UpdateAppearance until after everything is added
foreach (DreamValue visContentValue in valueList.EnumerateValues()) {
_visContents.AddValue(visContentValue);
}
} else if (!value.IsNull) {
_visContents.AddValue(value);
}

break;
}
case "filters": {
value.TryGetValueAsDreamList(out var valueList);

Expand Down Expand Up @@ -271,6 +294,7 @@ protected override void HandleDeletion() {
MutableAppearance?.Dispose();
_overlays.DecRef();
_underlays.DecRef();
_visContents.DecRef();
_filters.DecRef();
base.HandleDeletion();
}
Expand Down
Loading