You are viewing a potentially older version of this package. View all versions.
Wubarrk-TortalPortal-1.3.0 icon

TortalPortal

Total Portal Control System for Valheim. Pick destinations from a map UI listing biome, distance, and owner. Features destination photos, PIN locks, tame teleportation, travel filters, and a procedural runic gateway.

Date uploaded 2 weeks ago
Version 1.3.0
Download link Wubarrk-TortalPortal-1.3.0.zip
Downloads 207
Dependency string Wubarrk-TortalPortal-1.3.0

This mod requires the following mods to function

denikson-BepInExPack_Valheim-5.4.2333 icon
denikson-BepInExPack_Valheim

BepInEx pack for Valheim. Preconfigured with the correct entry point for mods and preferred defaults for the community.

Preferred version: 5.4.2333

README

๐ŸŒ€ TortalPortal

TortalPortal โ€” a runic gateway standing between two carved stones

Valheim Mod Multiplayer Compatible Framework Interface Version

"The old way was to carve a name into the stone and hope another bore the same. A tally of runes, scratched and rescratched, and still you stepped through blind. Better to know the road before you walk it, Viking."

TortalPortal is a complete overhaul of Valheim's portal network. Vanilla's tag-pairing is gone โ€” walk up to any portal and a framed window opens listing every portal in the world, with the great map beside it marking your chosen destination. Each portal keeps a photograph of where it comes out โ€” under that destination's own sky and weather, not yours โ€” so you see the country you are stepping into before you commit to it. An experimental live view of the same place can be switched on if you want it moving.

๐Ÿ“œ Contents

๐Ÿ”— Check out my other mod Mists of Avalor? The open beta is live on Hexium.


โš”๏ธ Features

๐Ÿ—บ๏ธ Every Portal in the Realm, Listed

Step into range and the destination window opens: every portal in the world, sorted by name, each showing its lock state, its biome, how far it is from you, and who raised it. Search by name to cut a long list down. Selecting a destination pins it on the Large Minimap, which opens alongside the window, so you always see the route in context rather than guessing from a tag.

The list is built by the server, which is the only machine that holds the whole world, and handed to each player as they log in โ€” so it is complete from the first portal you touch. Install it on a world that has been running for months and the startup scan finds every gate already standing in it; you do not have to go and visit them first.

Every portal is marked on the great map while the window is open, labelled with its name โ€” the map centres clear of the window rather than behind it, so you are looking at the country around your destination instead of the back of a frame. The marks are never saved and vanish when the window closes; your own pins are your own business.

The markers are live: click one to select that portal, click the chosen one again to travel โ€” pick your destination off the country itself rather than out of a list. The one you've chosen is picked out from the rest โ€” 30% larger and drawn in red โ€” so there is never any doubt which gate you are about to step through, while every other marker stays exactly the size and colour of a normal pin.

Walk away and the window closes itself. Arrive somewhere and it stays shut, so you are never greeted by a menu the instant you land โ€” step off and walk back to bring it up again.

๐Ÿ“ธ See Exactly Where You're Going

Every portal quietly photographs its own destination when you raise it, on a wide-angle lens standing out in front of the gate, and stores the shot on the portal itself so every player on the server sees it. A background pass keeps the images current as the world changes around them, and portals that have never been photographed โ€” every gate on a world that predates the mod โ€” are shot first, so an established server fills its album in as people move about it.

The list shows each shot as a thumbnail โ€” and clicking it opens the photograph full screen at your resolution, the portal's name across the top, captioned with the biome and coordinates. Arrows on either side (or the keyboard's arrow keys) flip through every portal's picture like an album without leaving the frame. Read the terrain, spot the tar pit, notice the Fuling camp, then decide.

No portal waits for a visitor. Valheim only builds the world around players, so a gate nobody has stepped near could never be photographed โ€” until now. The camera quietly anchors one unphotographed portal at a time, streams in a small patch of world around it out where nobody is, waits for the terrain to genuinely finish, takes the shot, and lets it all unload seconds later. Works on hosted worlds and dedicated servers alike; an established server fills its whole album on its own, horizon and all.

๐Ÿ”ฎ Watch Through the Gate โ€” experimental, off by default

โš—๏ธ This one is not finished, and it ships switched off. Turn it on with EnableLivePreviews. It works, and it is the best way to see where a gate goes โ€” but there is a faint shimmer in the image and a warm-up of several seconds on a large or distant destination. It is here for anyone who wants it rather than held back until perfect. The stored photograph is the finished feature, and everything below about photographs is fully supported.

Open a portal's picture full-size and the photograph gives way to a live view of the destination โ€” real weather, real time of day, swaying trees, rendered by your own game through the same anchor the camera uses. Right-drag looks around, the wheel zooms (30ยฐโ€“100ยฐ). The still stands in while the far world streams in (a pulsing amber GOING LIVE badge on the frame, then a red LIVE), and closing the album unloads everything within seconds โ€” the feed's lifecycle is a deadman switch, so there is no exit path that leaves a camera running.

Understand what it actually does before switching it on: this is not a video. Your game builds the destination and holds it standing while you watch โ€” terrain, trees, buildings and creatures all genuinely there, sized by AnchorZoneRing โ€” and on a dedicated server all of it crosses the wire to you first. It is by far the most expensive thing this mod does.

And the destination gets its own sky. Valheim keeps one sky, one sun, one set of weather and one field of grass, and welds the lot to wherever you are standing โ€” so a camera in the Ashlands would otherwise show real Ashlands ground under your weather, with no ash falling and no ashen sky. Every anchored view now borrows the destination's own fog, sun, ambient light, weather and grass for the fraction of a second it is drawing, and hands your own view straight back. Ash falls in the Ashlands. It rains in the swamp at night. Turn it off with AnchoredEnvironment if you'd rather have the frames.

๐Ÿ”ฑ Favorites

Click the small heart on any row - it turns gold: starred. Favorites sort to the top โ€” and once you have some, the window opens as a slender strip of just your favorites, one click to travel, with an arrow that expands to the full list when you want the whole realm. The gates you use fifty times a day cost one click; everything else is one more. Favorites are stored on your own machine, per world, and renaming a portal keeps its star.

And you can star the gate you're standing at. The destination list leaves out your current portal โ€” you can't travel to where you already are โ€” which used to make your home base the one gate you couldn't favourite without walking to another portal first. The configuration window now carries its own Favorite toggle beside the PIN lock, so it's one click at the gate itself. It applies on Save, so Cancel discards it like everything else in that window.

๐Ÿ”’ Lock Your Gates

Walk up to a portal you built and press E to open its configuration panel: set its name, choose its map icon, and toggle a PIN lock in one place. Anyone else selecting that destination must enter the PIN before the gate will take them.

Quick-launching a locked favorite (or clicking its map marker) gets the quick PIN window: the map closes, a small window opens with the keyboard already sitting in the field โ€” type the PIN, hit Enter, and you are away. Wrong PIN says so on screen and clears the field for another try; Esc puts you back exactly where you were.

๐ŸŽฏ Every Gate Its Own Mark

Portal markers don't have to be vanilla's icons. By default every marker is TortalPortal's own rune pin โ€” a glyph generated at runtime, sat on a dark disc inside a coloured ring so it reads as a deliberate mark rather than debris on a busy map โ€” coloured by PinColour. PortalPinIcon swaps that for any of vanilla's five familiar icons, or for your own artwork.

Eight hand-drawn icons ship in the box โ€” a boar with meat for eyes, a crowned neck, a party longship, a rainbow mead, a surprised greydwarf, a deathsquito on a sword, a troll sign and a wacky viking helmet โ€” and each portal picks its own from a grid in the configuration window. Your mine wears a pickaxe, your swamp outpost a skull, your capital its own crest. A glance at the map tells you what each gate is, not merely that it exists.

And the artwork travels. Drop your own PNGs into a folder on the server and every player downloads the ones they don't already have โ€” once, cached by content โ€” so a gate you mark with your own crest looks the same to everyone at the table with nothing for them to install and no modpack to rebuild. Add a file, run tortal_pinreload, and it is on everybody's map at their next login. The icons that ship with the mod are never sent, because everyone already has them.

The choice lives on the portal itself and travels in the destination index, so even portals nobody has ever visited are drawn with their proper marker. Full walkthrough: ๐Ÿ–ผ๏ธ Give Your Portals Their Own Map Icons.

๐Ÿบ Bring the Pack (and Ride It Through)

Your loyal companions travel with you. Any tamed creature following you steps through at your side (TameFollowRadius sets how wide a circle is gathered).

Riding? Stay in the saddle. Teleport while mounted and the beast comes with you โ€” you are lifted out of the saddle for the trip, it is sent through beside the exit, and you are seated again the moment you land. Built against the game's mount interface rather than any one saddle, so custom saddle items and modded mounts (OdinMounts and friends) ride through exactly like a Lox. Ships and carts stay where you left them; only a tamed creature qualifies.

๐Ÿšง Decide What Travels

Admins get a dual filtering system beyond vanilla's flat metal ban. Populate the whitelist to create an exclusive "these may pass" list, and use the blacklist to further restrict specific items โ€” or switch the whole thing to BypassAll and let everything through. All of it is server-synced, so the rules are the server's, not each client's.

๐Ÿ–ผ๏ธ A Frame Worth Looking At

Both portal windows are set in an ornate gilt frame: polished double rails, acanthus scrollwork mitring every corner, and a palmette crest struck into the top and bottom edges. It is drawn on a dark leather panel with gold-edged insets, and the destination list reads as a proper set of cards rather than a wall of text.

None of it is a shipped image. Every rail, flourish and crest is generated in code at runtime, lit by a single consistent light โ€” the interface carries no textures, no shaders and no asset bundles, and cannot ever show you a missing-texture pink square. (The only files the mod installs are the eight map icons, and those are plain PNGs you can open, edit or delete.)

If the text is too small or too large for your display, UITextScale moves it between 0.6ร— and 3ร—, UIFontSizeDelta adds up to +24 flat points on top, and the rows, fields, buttons and windows all grow with it so nothing clips. Changes apply immediately. The metal itself is yours too: UIGoldColour re-skins the entire frame โ€” silver, bronze, verdigris โ€” from one dial, live.

โœจ The Runic Gateway

Vanilla's portal effects are gone entirely โ€” every last flare โ€” and in their place stands a runic gateway: small Elder Futhark glyphs drawn in off the edges of the opening, swirling around the gate's own axis and spiralling slowly inward, each one taking its own shade from a band either side of your chosen colour so the gateway shimmers through a range rather than glowing one flat tone. Around them stand two counter-rotating rune circles, a magic circle scribed across the threshold, slow embers rising through the site, and a swirling rune trail โ€” an unseen point orbiting the pillars, weaving up and down, drawing a continuous glowing ribbon strung with runes behind it.

And it breathes with your approach. The gateway sits fully dormant โ€” nothing drawn, nothing simulated โ€” beyond VFXWakeDistance, and from there it does not switch on: it builds, strengthening the closer you come and bleeding gently away behind you as you leave. Walking off does not snap it shut; emission simply falls away and the runes already in the air drift out on their own, the way a flier's trail dissolves behind them. Any player drives it, so a friend walking up lights the gate for you too.

Two dials, and they move independently: VFXIntensity is how much gateway there is โ€” density, rune spacing, ring thickness โ€” while VFXBrightness is purely how hard it burns. Dim it to a smoulder without thinning it, or thicken it without the glare. VFXColour paints the lot, and every one of these applies live to portals already standing.

The gateway measures each portal's own arch and centres itself in it, so wood, stone and black marble portals all read correctly โ€” and so will any portal a future update or another mod adds.

๐Ÿ‘‘ Admin Supremacy

A built-in bypass lets admins ignore PIN locks, item filters and portal placement limits entirely.


๐Ÿ— Instructions

A start-to-finish guide to actually using the thing:

  1. Place a portal โ€” the game snaps a hidden high-resolution photo of its destination for the preview system.
  2. Configure it โ€” walk up and press E. Set its name, pick the icon it shows on the map, and toggle a PIN lock (see Give Your Portals Their Own Map Icons).
  3. Travel โ€” walk into the portal's range. Pick a destination from the list โ€” or click its marker on the map, and click it again to go.
  4. Look before you leap โ€” click a destination's thumbnail (or hit Teleport with the picture open) to see it full screen. Arrow keys or the on-screen arrows flip through every portal's picture like an album; give it a moment on a photo and it goes LIVE โ€” a real-time window onto the destination you can look around with a right-drag and zoom with the wheel.
  5. Locked gates โ€” launching a PIN-locked portal from a favorite or a map marker opens the quick PIN window with the keyboard already in the field: type it, hit Enter, go. A wrong PIN clears itself for another try.
  6. Favorites โ€” the heart on a row stars it, gold means starred. With favorites set, the window opens as a one-click launcher strip; ยป expands to the full list.
  7. Riding โ€” stay in the saddle and hit Teleport; you and the mount arrive together and you are re-seated automatically.
  8. On arrival โ€” the menu stays shut so you can get on with it. Step away and walk back to bring it up again.
  9. Typing โ€” the destination window focuses its filter box as it opens, so you can just start typing a name. While any of the mod's fields has the keyboard your character stands still and hotkeys hold their peace. Escape hands it back without closing the window.

๐Ÿ› ๏ธ How-To

๐Ÿ–ผ๏ธ Give Your Portals Their Own Map Icons

Eight icons are installed already. You can add any number of your own and give each portal its own.

1. Mark a portal

  1. Open its configuration window. Two ways in, and the button is the reliable one: with the destination window open, click Configure in the top row, just left of Close. (Pressing E at the gate does the same thing, but only when no text field has the keyboard โ€” Valheim gates its Use key behind Player.TakeInput(), so a focused search box quietly swallows the keypress.)
  2. Use the Map icon grid โ€” โ€” means no icon of its own, and the portal falls back to whatever your PortalPinIcon setting says. Click any other cell to choose it. If there are more icons than fit in the two rows, the last cell reads +N โ–ธ and opens a scrolling panel with all of them.
  3. Hit Save. The choice is stored on the portal, so every player sees that marker โ€” including players who have never been anywhere near the gate.

2. Add your own artwork

  1. Make or find your PNGs โ€” transparency is respected, so a clean glyph or crest on a transparent background reads best.
  2. Drop them into the TortalPortalPins folder beside TortalPortal.dll, alongside the eight that came with the mod.
  3. The filename is the icon's name, so Mine.png shows up as Mine. Underscores read as spaces in the picker, so deep_mine.png shows as deep mine โ€” but the filename is what is actually stored, so renaming a file later un-marks every portal using it. Name them once and leave them.
  4. Restart the game โ€” your own folder is read at startup. (Icons arriving from a server need no restart.)

๐Ÿ’ก Your portal's name and its icon are completely separate. A gate called Bonemass Camp can wear troll_sign; two gates both called Home can wear different icons; a gate you happen to name troll_sign gets no icon from it. Rename a portal and it keeps its marker; change its marker and it keeps its name.

๐Ÿ’ก About image size. Vanilla draws every map marker into a fixed square box โ€” 48 px on the great map, 32 px on the minimap โ€” so an image of any resolution is scaled into that box and can never spill across your map. Size doesn't hurt what you see; it hurts what you pay. A 4096ร—4096 PNG holds roughly 64 MB of video memory to draw something 48 pixels across, and the mod will say so in the log. The eight shipped icons are 48ร—48, which is exactly the box โ€” that is the sweet spot. Anything a server shares is capped at 256ร—256 and 96 KB. Non-square images are letterboxed to fit rather than stretched, but square fills the marker best.

๐Ÿ’ก Want one of these as your own default marker? Set PortalPinIcon = Custom and put the icon's name in DefaultPinIcon โ€” troll_sign, say. That is the marker every portal wears until it picks one of its own. It works for icons the server sent you as well as your own files, which is why it is a name rather than a filename: there is no file of yours to point at.

๐Ÿ’ก Upgrading from a single icon? The old single-file TortalPortalPin.png beside the plugin still works exactly as it always has โ€” leave DefaultPinIcon empty and PortalPinIcon = Custom keeps using it. Nothing needs moving.

๐Ÿ’ก The gate you're standing at is marked too, labelled (here). It isn't in the destination list โ€” you can't travel to where you already are โ€” but it is on the map, so an icon you just set on your home base shows up straight away.

๐Ÿ“ก Share Icons From Your Server

Your players do not need your PNGs. The server can hand them out.

  1. Drop your PNGs into the TortalPortalPins folder beside the server's TortalPortal.dll โ€” the same folder name clients use, because a dedicated server installs the same package.
  2. Run tortal_pinreload from any admin's console (or restart the server). It rescans the folder and tells every connected client what it now has.
  3. That's it. Each client quietly downloads only the icons it is missing, one at a time, and caches them by content โ€” so the download happens once per machine, ever, even across different servers and different worlds.

What that buys you: mark a gate with your guild's crest and everyone sees the crest, with nothing to install, no modpack rebuild and no version bump. A player who joins with a bare install still gets the full set.

  • Icons everyone already has are never sent. The eight that ship with the mod, and anything a player already put in their own folder, are matched by content and skipped.
  • Same name, different picture? The server's copy wins, so everyone at the table is looking at the same thing. Your own file is left untouched on disk and the log says once which one it used.
  • Limits. 256ร—256, 96 KB and 64 icons per world. Oversized files are named in the server log and simply not offered.
  • Don't want any of it? ShareIconsFromServer = false and every player sees only what is on their own disk.

๐ŸŒฑ Seed a World with Portals

Two console commands ship with the mod โ€” the same ones every 1.2.0 feature was shaken down with. Both are cheat commands: enable devcommands in the console first, which on a server means being on its adminlist.

  • tortal_scatter [count] [radius] โ€” raises portals at random spots across the world. Default 25 within 2 000 m; up to 500 at a time, radius up to 10 000 m. Spots are spread evenly across the disc rather than crowding the middle, each gate is named for its biome and registered in the index like any hand-built portal, and every 5th one is PIN-locked with 1234 so locks have test subjects too.
  • tortal_scatterclear โ€” removes every portal tortal_scatter raised and nothing else: scattered gates carry a marker, hand-built portals are never touched. Run from a client it sweeps what is loaded around you and asks the server to sweep the whole world (admin-gated), reporting the total back to your console.

Together with remote snapshots this is a world-seeding tool: scatter a network across the map on day one โ€” tortal_scatter 100 10000 covers the whole world โ€” and the camera walks it on its own, portal by portal, until the server opens with a fully photographed network no player has ever visited. Keep the gates, or tortal_scatterclear when you have placed your own.


โš™๏ธ Configuration

Settings live in wubarrk.TortalPortal.cfg.

Your settings survive updates. The file carries a layout version, and when the mod changes shape it is backed up beside itself and every value is carried over โ€” a whitelist you spent an evening on does not evaporate because a setting moved sections. If something genuinely no longer exists, it is named in the log with its value and the path of the backup rather than vanishing quietly.

Server-Synced (Admin Controlled)

Setting What it does
FilterMode Vanilla (default), WhitelistBlacklist, or BypassAll.
WhitelistItems Comma-separated, empty by default. Any item here bypasses vanilla portal restrictions (e.g. adding Bronze lets you teleport with Bronze, but Iron remains blocked).
BlacklistItems Comma-separated, empty by default. Any item here is explicitly blocked, even if it normally would be allowed.
MaxPortalsPerPlayer Limit how many portals each player can construct. Unlimited by default โ€” 0 or any negative number means no cap at all. Set a positive number to enforce one.
AdminBypass Default on. Lets admins ignore portal limits, PIN locks and item filters.
AllowTames Default on. Whether tamed creatures follow you through.
TameFollowRadius 2โ€“30 metres, default 10. How far around you following tames are gathered when you travel.
AllowMountedTeleport Default on. Teleporting while riding brings the mount and re-seats you on arrival โ€” vanilla saddles, custom saddle items and modded mounts alike. Off means dismount and walk through.
MenuOpenDistance 0.1โ€“5 metres, default 1.25. How close you must be before the destination window and map open by themselves. The window is something you go and get rather than something that meets you on the path โ€” but 0.8 m meant standing practically inside the gate, which read as the mod being unresponsive. Measured horizontally, so a raised platform adds no phantom distance. The portal's visuals keep their own range regardless.
EnableCustomVFX Default on. Replaces vanilla portal particles with the runic gateway.
EnablePortalCameraShot Default on. Whether placing a portal captures a preview snapshot.
SnapshotRefreshIntervalMinutes Default 5. How often already-photographed portals are re-shot, so a rebuilt or burnt-out destination stops showing the old view. 0 disables refreshes; portals with no picture are still filled in regardless.
EnableRemoteSnapshots Default on. The camera walks the world on its own: portals nobody is near are briefly anchored, photographed and unloaded again โ€” including over a dedicated server. Off means only portals loaded around players are photographed, as before 1.2.0.
EnableLivePreviews EXPERIMENTAL โ€” default OFF. Opening a photograph full-size streams a live view of the destination. Works, but unfinished: a faint shimmer, and several seconds of warm-up on a large or distant destination. Also the most expensive thing the mod does โ€” it builds and holds the far world while you watch. Off means the album shows stills only.
AnchoredSpawning Default off, and read this before turning it on. Lets wildlife appear at a destination while somebody is watching it live. Valheim only makes creatures where a player stands, which is why a far gate can be fully loaded, correctly lit and still look like nowhere anybody lives. The creatures are real โ€” written into the world, simulated by whoever is watching, and still there after the view closes โ€” so browsing a lot of gates can seed a lot of neighbourhoods. This is the one setting here that changes the world rather than a picture of it. Never done by the unattended background photographer.
AnchoredEnvironment Default on. Gives a far-off portal its own sky. Valheim keeps one sky, one sun, one set of weather and one field of grass, all welded to wherever you are standing โ€” without this a camera in the Ashlands shows real Ashlands ground under your weather. On, the anchored camera borrows the destination's own fog, sun, ambient light, weather particles and grass for the fraction of a second it draws, and your own view is handed straight back. Off returns to photographs and feeds wearing your local weather.
CameraResolution Dropdown: Res480p / Res720p / Res900p / Res1080p (default). What the portal camera renders at โ€” stored snapshots and live feed both. Stored pictures travel to every player, so higher resolutions cost real bandwidth; existing photographs keep the size they were taken at.
AnchorZoneRing 1โ€“2, default 2. How much world a far shot loads: 1 = 3ร—3 zones (192 m), 2 = 5ร—5 (320 m). A 3ร—3 block puts the horizon barely past the gate, and a destination photograph exists to show you the country you are stepping into. Hard-capped at 2 โ€” a wider ring is a guaranteed hitch on any hardware.
AnchorSettleBudgetSeconds 10โ€“120, default 40. How long a far shot may wait for the destination to settle before the attempt is skipped and retried a later lap. Also where the live preview stops waiting for perfection and goes live with what is standing.
AnchorSettleRadius 30โ€“300 m, default 100. How far around the portal terrain must be finished rebuilding before a scene counts as settled.
PortalIndexRefreshSeconds 5โ€“300, default 10. How often the server rescans the world and republishes the destination list โ€” how quickly a new portal, rename or demolition reaches everyone. Only sent when something actually changed.
ShareIconsFromServer Default on. Offers the server's own map icons to every player, who each download only what they are missing and cache it by content. Icons a client already has โ€” including the eight that ship with the mod โ€” are never sent. Off means every player sees only the icons on their own disk. See ๐Ÿ“ก Share Icons From Your Server.

Local to Your Game

(Not synced โ€” set these however you like.)

Setting What it does
UITextScale 0.6โ€“3.0, default 1.05. Scales all portal UI text and the layout around it. Applies immediately, no restart.
UIFontSizeDelta -6โ€“+24 points added flat to every text size, after the scale. Default +6. Fatty shares this theme and this setting โ€” match the numbers and the two mods' windows read identically.
MenuCloseMargin 0โ€“5 metres, default 1. How much further out than MenuOpenDistance you must retreat before an open window closes itself โ€” the hysteresis that stops it strobing on the boundary.
ShowDestinationPreviews Default on. Off drops the photograph panel and narrows the window. Snapshots are still captured and shared either way.
OpenFavoritesView Default on. When you have favorites, the window opens as the slim favorites strip; the ยป arrow expands it regardless.
FocusSearchOnOpen Default off. Puts the text cursor straight in the search box as the window opens. Off because the window opens while you are still walking, and a focused field swallows WASD as typing.
VFXOrbHeightOffset Default 0. Metres to nudge the rune orb up or down inside the gate. The orb auto-centres on each portal's arch, so this is only for fine-tuning.
VFXWakeDistance 2โ€“50 metres, default 25. How close a player must be before the dormant gateway wakes โ€” far enough that a gate is already alive as it comes into view and builds as you walk in.
VFXIntensity 0.1โ€“3, default 0.64. How much gateway there is: particle density, ring thickness, rune spacing in the swirl.
VFXBrightness 0.1โ€“3, default 0.35. How brightly it burns, with no effect on how much of it there is. The materials are additive, so this climbs fast. Applies live.
VFXSwirlDensity 0.25โ€“3, default 3. How thickly the runes trailing off the gateway are laid along their ribbon โ€” higher packs them tighter along the same path. Independent of VFXIntensity. Applies live.
VFXTintPortalFrame Default off. Tints the portal piece's own glowing panel and gate light to VFXColour, so the gate and the gateway read as one object instead of an orange portal wearing a coloured light show. Only emissive surfaces are touched; timber, stone and metal keep their own materials. Off because vanilla's warm light against cool runes is a look in its own right. Applies live.
VFXColour The gateway's colour โ€” veil, rings, sigil, motes and swirl all draw from it. Colour picker in ConfigurationManager. Default warm gold #FFD24C.
PinColour The Rune map pin's colour. Vanilla icons and custom PNGs bring their own. Default hard green #12FF21.
UIGoldColour The window frames' metal. Shadow and highlight derive from it โ€” silver, bronze or verdigris is one change, applied live. Default antique gold #CC9E42.
ShowPortalPinsOnMap Default on. Marks every listed portal on the large map while the destination window is open. Never saved, removed when the window closes.
PortalPinIcon Default Rune โ€” TortalPortal's own glyph-in-a-ring. Also vanilla's five icons, or Custom to use whichever icon DefaultPinIcon names. This is the fallback for portals that haven't picked an icon of their own, and for icons you can't draw yet. See ๐Ÿ–ผ๏ธ Give Your Portals Their Own Map Icons.
DefaultPinIcon Empty by default. Which icon PortalPinIcon = Custom should draw. In ConfigurationManager this is a dropdown of every PNG in your TortalPortalPins folder โ€” pick one, no typing. You can also type the name of an icon the server sent you, since those have no file here for the list to find. Empty falls back to a TortalPortalPin.png beside the plugin if you have one, then to the Rune pin. Anything unresolvable is named in the log along with every icon you do have.
EnableDebugLogging Default off. Verbose logging for UI, icon and teleport events.

๐Ÿ“ฆ Dependencies

โš ๏ธ Requires: BepInEx



License to Modify: User may alter, translate, or create derivative works based on the original material, provided two conditions are met: 1) A request to alter the work is made and approved by the original author (waived in the case of simple translations), and 2) Full attribution is given to the original author along with a link to the original work (if still available). All changes should be clearly marked or noted as modified from the original source.

Modification or reuse of the work does not grant the user any right to imply official endorsement or sponsorship by the original creator.

The permission granted herein is non-exclusive, and the original creator retains all rights, title, and interest in the original work.

CHANGELOG

Changelog - TortalPortal

[1.4.0]

โ›” The floor rises to 1.4.0

  • Breaking: MinimumRequiredVersion is now 1.4.0. Anyone on 1.3.x is turned away at the handshake with a clear version message instead of being let in. The wire would not have demanded it on its own โ€” the creator IDs added below ride in an appended block an older client reads straight past โ€” but the portal cap would be enforced differently on either side of the table: a 1.4.0 client is held to the whole-world count, while a 1.3.x client beside it counts only what is loaded around it and can still walk somewhere quiet and keep building. One rule that binds some players and not others is worse than a version message, so the floor makes it a version message. Everyone updates together.

๐Ÿงฑ The toll for a gate that was never raised

  • Fixed: Reaching the portal limit took your materials anyway. The cap did its job โ€” it refused the portal, said so on screen, and no gate appeared โ€” and the game charged you the wood and the surtling cores regardless. The refusal was simply written in the wrong place. Player.PlacePiece reads like the method that places a piece, and it is, but it returns void: instantiating is all it does. What decides whether the player pays is the method above it, TryPlacePiece, whose bool gates the entire tail โ€” ConsumeResources, stamina, tool durability, build skill, the build effect, and vanilla's own "Placed portal_wood" line in the log. Refusing the instantiate step left every one of those running, which is why the only thing missing was the portal. The cap now refuses TryPlacePiece itself, the one "no" the game reads as nothing happened.

๐Ÿ”ข The cap can no longer be walked around

  • Fixed: Counting a player's portals only ever counted the ones near them. The tally came from the client's own ZDOMan, and on a dedicated server a client is only ever sent the portals inside its active area โ€” so a player at their limit could walk somewhere empty, where the count read zero, and keep building. The tally is now the union of the server's published index, which is the whole world and so knows about a gate raised a thousand metres away and never revisited, and the client's local objects, which are the only thing current enough to include a portal placed four seconds ago. Neither source is complete on its own; together they are. Anyone who slipped past the cap while it was only half-counting will find themselves at it now.

๐Ÿท๏ธ Portals learn who built them

  • Fixed: The "Owner" row has been blank since 1.0.0. Not sometimes โ€” always, on every world, for every portal any player has ever placed. Vanilla writes a piece's creator name in exactly one place, PrivateArea.Setup, which is wards; the null-conditional call that does it skips straight over anything without a ward component, and portals have none. What a portal does carry is its creator's numeric ID, which is permanent but is not a name โ€” the name lives only on the client whose profile it is, and the server was never told it.
  • Added: Each client now tells the server its own name once on arrival, and the server keeps the pairing in BepInEx/config/TortalPortal/playernames.json. A world's entire back catalogue of portals gains its owners' names as those players next log in. Nothing about this is trusted with anything that matters: it decides a label, never a limit.

๐Ÿ“‹ Who is at their limit, without counting by hand

  • Added: A live per-player portal count on disk, at BepInEx/config/TortalPortal/portals/barrkbot_portals.json, rewritten every PortalExportIntervalSeconds (default 60). Every owner, their current count, whether they are at or over the cap, and whether they are online โ€” with at_cap and over_cap written out rather than left for the reader to work out, because a number both sides calculate is a number that eventually disagrees.
  • Retroactive from the first write. The count comes from every portal ZDO in the world, so a server that has been running for a year reports its whole history immediately; nothing had to be built while this was installed. A player who is logged in and owns nothing still gets a row, so "we have no record of them" stays distinguishable from "they have none", and an owner whose name has not been learned yet exports under their real ID with "name": null rather than being quietly left out.
  • Written to a temporary file and swapped into place, never written where it sits, so anything reading it on its own schedule can never catch it half-finished.
  • Added: EnablePortalExport (server-synced, default on). Off means no folder, no file, and no name collection at all โ€” the claim is never even sent.

๐Ÿ—บ๏ธ The map keeps your gates on it

  • Changed: Portal markers no longer vanish the moment you close the window. They were added when the destination list opened and removed as it closed, which meant the one time you could see where your portals were was the one time you were already standing at one. Every portal on the server is now marked permanently, drawn from the server's index, so the map is a map of the network whether or not anyone is looking through a gate. The destination window still marks its own while it is open โ€” it stands the permanent set down for the duration so nothing is ever drawn twice โ€” and none of these markers can reach your saved pin list. PortalPinsOnMap remains the off switch.

๐Ÿ”ง Under the hood

  • The published portal index now carries each portal's creator ID, appended after the icon block so a 1.3.1 client reads what it understands, stops where it always stopped, and never learns the extra bytes are there. Mixed tables keep working.
  • The project builds on Linux. The post-build step was two cmd builtins and failed outright anywhere else.

[1.3.1]

โ›” The floor rises to 1.3.0

  • Breaking: MinimumRequiredVersion is now 1.3.0. Clients on 1.2.x are turned away at the handshake with a clear version message instead of being let in to play a different mod โ€” 1.3.0 is where the shipped icon set and the server-streamed icon catalogue landed, and a mixed table below it reads different maps for the same world. Everyone updates together.

๐ŸŽฅ The live view works more than once

  • Fixed: One live view per visit. The first portal you opened went live; every one after it sat on its stored photograph saying "warming" until you left the portal system and came back โ€” which bought you exactly one more. The cause was a wrong belief about Unity itself: the feed's entire cleanup lived in a try/finally inside its coroutine, on the assumption that StopCoroutine runs the finally. It does not โ€” stopping a coroutine only unschedules it, and a finally never entered never runs. So paging to the next portal (or clicking another row, or the window closing) stopped the feed without dropping its anchor, and every later feed queued politely, forever, behind an anchor whose owner no longer existed. Leaving and returning "fixed" it only because the background photographer eventually took a far shot and its own natural cleanup swept the leak. Teardown is now called explicitly by everything that stops a feed, is safe to run twice, and โ€” belt and braces โ€” a starting feed that finds the anchor held for hundreds of frames with nobody standing down now clears the leak itself and says so in the log, instead of waiting on a corpse.
  • Fixed: The shimmer. The fine, permanent vibration across the live image was temporal antialiasing doing exactly what it is designed to do with no way to finish the job: TAA nudges the camera a sub-pixel every frame and relies on re-projecting the previous frame to cancel the nudge out โ€” and a hand-rendered camera read back at its own cadence never gives it a previous frame that matches, so the jitter shows instead of cancelling. A photograph never shimmered because a single frame is the jitter, uncancelled and invisible. The feed's own profile copy now swaps TAA for FXAA โ€” smoothing that finishes inside one frame, which is the only kind of frame this camera has โ€” and turns off the animated film grain, which was a second, fainter crawl on top. The live camera also stops inheriting whatever jittered projection matrix the player's camera happened to be holding at the moment it was built (that latch also quietly disconnected the zoom wheel from reality).

๐Ÿ— The destination is somebody's home now

  • Changed: AnchoredSpawning is ON by default. Shipped off in 1.3.0 out of caution, which meant the flagship view โ€” a live window onto somewhere else โ€” opened onto a world standing perfectly still. A destination is supposed to look inhabited. The setting's description still says plainly what it costs (the creatures are real, written to the world, and remain after you look away), and off is one click for any admin who wants glances to change nothing. Still server-synced, still live-view-only โ€” the unattended background photographer never spawns anything.
  • Fixed: Even switched on, wildlife almost never actually appeared. Valheim's zone spawner waits ten seconds after it wakes before its first attempt โ€” and the anchored zone's spawner is created fresh every time you open a view, so that clock restarted on every glance. Anyone holding a feed open for less than ten seconds (that is: nearly everyone) never saw a single spawn attempt, no matter how correctly everything else worked. The anchor now drives the spawner directly, once a second, while a view is actually live. Only the warm-up is skipped, never the rules: every spawn still runs vanilla's full checks, and vanilla's own per-spawner clocks on the zone still cap how much can spawn โ€” the pump cannot spawn faster than standing there would.

[1.3.0]

โญ Favorites survive logging out

  • Fixed: Starred portals came back unstarred the next session. Stars were filed under each portal's object id, and Valheim reassigns every one of those the moment a world is read off disk โ€” ZDO.Load opens by handing the object a brand new id. So the ids were perfectly stable all session and pointed at nothing the next time you logged in. The file on disk was intact the whole time; every key in it had simply been orphaned.
  • Favorites are now filed by the portal's position, which is the thing that genuinely does not change. Renaming a gate keeps its star, as it should. Demolishing and rebuilding somewhere else loses it, which is honest โ€” that is a different portal.
  • Stars saved in the old format cannot be recovered โ€” the ids they named stopped existing โ€” so they are dropped once, with a line in the log saying so rather than silently. Star them one more time and it will be the last time.

๐ŸŒ Destinations that look like the place you are going

  • Added: A far-off portal is drawn under its own sky. Valheim keeps one sky, one sun, one set of weather and one field of grass, builds them once and welds the whole kit to wherever you are standing โ€” so a camera in the Ashlands photographed real Ashlands ground lit by the sun over your head, in whatever weather you happened to be having: no ash rain, no ashen sky, no ground foliage. No amount of extra world loading could have fixed that, which is why loading more never helped. The anchored camera now gets the destination's own fog, sun, ambient light, weather and grass for the fraction of a second it is drawing, chosen by the same seeded roll vanilla uses โ€” so it is the weather a player standing there would actually be having. Your own view never sees any of it.
  • Added: AnchoredEnvironment (server-synced, default on) turns that off and returns to pictures wearing your local weather.
  • Fixed: The far horizon was never requested at all. The anchor asked Valheim for objects using a near ring and a distant ring, and passed zero for the distant one โ€” and zero there does not mean "a modest distance", it means the loop that fetches them never runs. Everything close to the camera arrived perfectly and everything behind it was never asked for, which is why a destination could be fully loaded, correctly lit and correctly weathered and still read as an empty stage set. On a dedicated server it cost twice over, since the server's send path was passing zero as well.
  • Added: AnchoredSpawning (server-synced, default off) โ€” wildlife at the destination. Valheim only makes creatures where a player is, not merely where the world is loaded, so the anchored camera now counts as a presence and the destination's own spawners run normally. Read the setting's description before enabling it: the creatures are real, they are written into the world, and they are still there after you look away. It is the one setting in this mod that changes the world rather than a picture of it. Only a live view ever does this โ€” never the unattended background photographer.

๐ŸŽฅ Live view โ€” experimental, and now off by default

  • Changed: EnableLivePreviews ships off. Watching a destination live works and is genuinely the best way to see where a gate goes, but it is not finished โ€” there is a faint shimmer in the image and a warm-up of several seconds on a large or distant destination. It is left in, working, for anyone who wants to switch it on, rather than held back until perfect or shipped on by default in a state that would be judged as the mod's normal quality. The stored photograph is the shipped feature, and it is finished.
  • Fixed: the live feed and the stored photograph were two different rendering pipelines, and every difference between them showed up as a feed that did not look like the still it replaced. There is one pipeline now โ€” the feed is the snapshot path, minus the file, on a timer.
  • Fixed: auto-exposure was bleaching the feed about a second after it opened. Post-processing's eye adaptation is history-driven, so a camera fired once for a photograph never adapts, while one that keeps rendering does โ€” the destination's sky was correct and then washed out in front of you. The feed gets its own copy of the game's profile with auto-exposure off; yours is untouched.
  • Fixed: a feed that lost its borrowed sky to a background photo pass never got it back, and spent the rest of the session under your local weather with nothing in the log to say why. The background walk now stands aside for a live view, and the view restores its own sky if it ever finds it missing.
  • Fixed: the feed used to wait for a perfect settle, including a distant-terrain bake, before opening โ€” correct for a permanent photograph, but it left a live view sitting on a stale still for ten or fifteen seconds looking broken. It opens once there is ground under the camera and finishes loading on screen, which is what looking out of a window is like. A camera that failed to build once also used to end the feed permanently and silently; it retries now.

โš™๏ธ Settings

  • Every setting was audited for whether it is actually connected to anything. All of them are.
  • AnchorZoneRing and EnableLivePreviews now say what they really cost. Neither is a picture-quality dial: they govern how much genuine world your machine builds and holds somewhere you are not standing โ€” terrain, trees, buildings, containers, creatures โ€” and on a dedicated server all of it crosses the wire first. Both descriptions now say so plainly, including which one to turn down first if the game stutters.

๐ŸŽจ Eight icons in the box โ€” the mod ships artwork for the first time

  • Added: Eight hand-drawn map icons install with the mod โ€” boar_meat_eyes, crowned_neck, party_longship, rainbow_mead, surprised_greydwarf, sword_deathsquito, troll_sign and wacky_viking_helmet. They land in the TortalPortalPins folder beside the plugin, so the per-portal icon picker has something in it the moment you install rather than being an empty control pointing at a folder you have to go and create.
  • All eight are 48ร—48 โ€” exactly the box vanilla draws a great-map marker into โ€” so they are pixel-perfect with no scaling, and the whole set is under 25 KB.
  • Because every install has the same eight files, a gate marked troll_sign reads as a troll sign for everyone, with nothing sent over the wire at all.
  • Note for the record: this is the first version to install any asset file. The interface is still drawn entirely in code โ€” no textures, no shaders, no asset bundles โ€” but the "adds no asset files to your install" line from 1.2.0 is no longer literally true, and the README no longer says it. The icons are plain PNGs you can open, edit or delete.

๐Ÿ“ก The server can hand out artwork

  • Added: Icons now travel. Drop PNGs into the TortalPortalPins folder beside the server's plugin and every client downloads the ones it does not already have โ€” once, cached by content hash โ€” so a gate marked with your own crest looks the same to everybody at the table with nothing for them to install and no modpack to rebuild. A player joining with a bare install still gets the full set.
  • Added: tortal_pinreload โ€” an admin console command that rescans the server's icon folder and republishes without a restart. Add a file, run it, and it is on everybody's map at their next login. Admin-gated against the server's own adminlist and reports the count back to your console, exactly as tortal_scatterclear does.
  • Added: ShareIconsFromServer (server-synced, default on). Off means every player sees only the icons on their own disk.
  • Nothing is re-sent that a client already has. The catalogue names each icon by content hash, and a client that holds identical bytes โ€” the shipped eight, or anything it put in its own folder โ€” matches them locally and downloads nothing. A server full of stock icons costs zero bandwidth.
  • Same name, different picture? The server's copy wins, because the alternative is two players looking at the same portal and seeing different things โ€” which is the exact problem the feature exists to solve. Your own file is untouched on disk, and the log says once which one was used and why.
  • The server never decodes an image. A dedicated server is headless, and running a PNG decoder over bytes that arrived from the network is precisely the thing not to do โ€” dimensions are read arithmetically out of the IHDR header instead, and no pixel is ever touched. Transfers are capped at 256ร—256, 96 KB and 64 icons per world, move in 16 KB chunks one frame apart so they never sit on the socket gameplay is using, and are verified against their hash before anything is written to disk.
  • Nothing breaks on a mixed table. The catalogue is a new synced value and the transfers are new RPCs, so a 1.2.x client simply never registers either, ignores the catalogue and draws its own marker. The minimum required version stays 1.2.0 โ€” no forced update.

๐Ÿ–ผ๏ธ A grid instead of arrows

  • Changed: The portal configuration window's Map icon row is now a grid of clickable icons rather than < > arrows. Cycling was fine for the handful of icons that existed when nothing could be shared; it is not fine for a modpack's worth. Two rows are always shown inline, and anything past that puts a +N โ–ธ cell in the last slot which opens a scrolling panel with the whole library โ€” so the window is the same shape whether you have three icons or sixty.
  • The current pick is highlighted, an icon still arriving from the server is labelled (arriving from the server...) rather than being lumped in with (not installed here), and underscores read as spaces in the picker (deep_mine.png shows as deep mine) โ€” the filename is still what gets stored.
  • Added: A marker whose picture arrives while the map is already open updates in place, without closing and reopening the window.

๐Ÿ› Fixes

  • Fixed: The destination window's button into the portal configuration screen still read "Name & PIN", which described two of that window's three jobs โ€” so the way to set a map icon was a button that never mentioned icons. It reads "Configure" now, after the window it opens, which cannot go stale again. (Found the honest way: by not being able to find the icon picker on the test server.)
  • Fixed: An icon request the server never answered was never retried. The catalogue arrives on ConfigSync's login handshake, which can beat the routed-RPC channel being ready, so the very first fetch of a session could vanish into that gap โ€” and the hash stayed marked "already asked for" until the next login. On the dedicated rig this showed up as seven of eight icons arriving and the alphabetically-first one silently never doing so. Requests now carry a timestamp and are re-asked if nothing comes back, and the client waits for a peer before asking at all.
  • Fixed: PortalPinIcon = Custom with no TortalPortalPin.png installed used to fall back to whichever icon sorted first alphabetically. Harmless while nobody had a library โ€” and a real problem the moment eight icons ship, because everyone running Custom would have silently woken up to a boar with meat for eyes on every unmarked portal. Custom now means that one file and nothing else, falling back to the rune pin when it is absent. No install can quietly repoint your default at somebody else's artwork.
  • Fixed: The icon library's state is now torn down when you leave a world. It was per-server state living in statics with nothing ever clearing it, so an icon one server sent you would have gone on overriding your own file on the next server, and in single player, until the game was restarted.
  • Changed: The icon cache lives under BepInEx's config folder rather than the plugin folder, because a mod manager owns the plugin directory and rewrites it on every update โ€” and a cache thrown away on each update is not a cache.

[1.2.2]

๐Ÿ–ผ๏ธ Every portal can wear its own mark

  • Added: A library of custom map icons instead of one. Drop as many PNGs as you like into a TortalPortalPins folder beside the plugin and every one of them becomes available โ€” a modpack can ship a whole set rather than picking a single icon for the entire world.
  • Added: Each portal chooses its own. The portal configuration window (E on a gate you built) gains a Map icon picker โ€” arrows cycle through every installed icon with a live preview of the marker beside the name. Your mine wears a pickaxe, your swamp outpost a skull, your capital its own crest. The choice is stored on the portal itself, so everyone on the server sees it, and it rides the destination index โ€” meaning portals you have never been near are drawn with their proper marker too.
  • Graceful when an icon is missing: a portal marked with an icon you do not have installed simply falls back to your own PortalPinIcon setting rather than vanishing or drawing a blank. Two players running different modpacks each see a sensible map. The picker keeps the name it does not recognise rather than silently clearing somebody else's choice, and labels it (not installed here).
  • Nothing breaks on a mixed table. The icons are appended to the portal index after the part older builds read, so a 1.2.0/1.2.1 client reads the destination list exactly as before, stops where it always stopped, and never sees the extra data. The minimum required version stays 1.2.0 โ€” no forced update, and no reason for one.
  • The original single-file TortalPortalPin.png beside the plugin still works untouched and still wins the name if a library file matches it, so an install that has used PortalPinIcon = Custom for a year keeps exactly the icon it has always had.

๐Ÿ” Honest answers about custom icon files

  • Fixed: A non-square icon was stretched to fill the marker, because vanilla sizes every pin as a square (48 px on the great map, 32 px on the minimap) on the reasonable assumption that its own icons are square. Custom images are now letterboxed to fit instead of distorted. Square is still what fills the marker best.
  • Changed: Icon files are loaded without a system-memory copy now that they are only ever drawn, halving what each one costs to keep.
  • Added: An oversized icon says so in the log. "Any size works" is true โ€” vanilla forces the marker box, so a huge PNG cannot spill across your map โ€” but a 4096ร—4096 file spends about 64 MB of video memory drawing something 48 pixels across. Anything past 256ร—256 now names itself, its dimensions and its cost, once.
  • Fixed: Saving the portal configuration window on a gate you did not build (as an admin) could be silently discarded, because a write to a ZDO this game does not own is dropped at the next sync. Ownership is claimed before the write, as the snapshot camera already did.
  • Restored: Selecting PortalPinIcon = Custom with no PNG installed anywhere says so in the log again, once per session, instead of quietly drawing the rune pin as though the setting had done nothing.

[1.2.1]

๐Ÿ“– The manual catches up to the mod

  • Changed: The README was rewritten top to bottom โ€” reordered around Features, Instructions and How-To sections, with a table of contents, and checked line by line against the shipped code rather than against memory. It had gone stale enough to be visibly wrong in two places: VFXBrightness's documented default (0.64) hadn't followed the gold retune down to its real value (0.35), and the selected map marker was still described as drawn "twice the size," a leftover from before 1.1.2 replaced that with the actual current behaviour (30% larger, and red).
  • Added: A dedicated step-by-step walkthrough for assigning a custom map pin icon (TortalPortalPin.png) โ€” previously just one line in a config table, now its own How-To section with the session-caching caveat (the file is read once per launch) spelled out.
  • Added: Default hex values for VFXColour, PinColour and UIGoldColour in the config reference, and the missing default (10) for PortalIndexRefreshSeconds.
  • No code changed and nothing about the mod's behaviour is different โ€” every fact below still describes v1.2.0. This version exists only so the corrected README ships under its own number instead of silently overwriting the 1.2.0 listing.

[1.2.0]

โš ๏ธ Every client must match the server again

  • Changed: The minimum required version rises from 1.1.2 to 1.2.0. The far photographs and live previews below run through a server RPC that older builds never registered, so a 1.1.2 client at a 1.2.0 table would keep a silently dead album โ€” photos never refresh, previews never go live, and nothing errors. The floor exists to turn exactly that into a clear version-mismatch message at the door instead. Update every client alongside the server.

The album goes live

  • Added: Open a portal's picture full-size and the stored photograph gives way to a live view of the destination โ€” real weather, real time of day, swaying trees, rendered by your own game through the same anchor the background camera uses. The still stands in while the far world streams in (going live... in the footer, then LIVE), and closing the album unloads it all within seconds. Works on hosted worlds and dedicated servers alike; nothing new crosses the wire.
  • Added: EnableLivePreviews (synced, default on) โ€” the server's word is final. The feed's lifecycle is a deadman switch: any way of leaving the album โ€” closing it, the window, the world, or a UI error โ€” starves the feed of its keep-alive and it tears itself down within half a second. There is no exit path to forget.
  • Added: The live view answers the mouse โ€” right-drag looks around the destination, the wheel zooms (30ยฐโ€“100ยฐ). Each portal opens on its photograph's own framing.
  • The background camera and the live view share the one anchor politely: the walk waits while you watch, the view waits out a mid-flight shot.

The dials come off the faceplate

All server-synced โ€” the server's values are the law of the table โ€” and every one is read through a clamped, NaN-proof accessor, so a hand-poisoned config file degrades to the shipped default rather than to a frozen loop or a 49-zone hitch.

  • CameraResolution (dropdown: 480p / 720p / 900p / 1080p) โ€” what the portal camera renders at, stored snapshots and live feed both. Stored pictures travel to every player, so higher resolutions cost real bandwidth; existing photographs keep the size they were taken at.
  • AnchorZoneRing (1โ€“2, default 1) โ€” how much world the far camera loads: 1 = 3ร—3 zones (192 m), 2 = 5ร—5 (320 m). Hard-capped at 2; a wider ring is a guaranteed hitch on any hardware.
  • AnchorSettleBudgetSeconds (10โ€“120, default 40) โ€” how long a far shot may wait for the destination to settle before the attempt is skipped. Raising it trades patience for coverage of enormous bases. Also where the live preview stops waiting for perfection and goes live with what is standing.
  • AnchorSettleRadius (30โ€“300 m, default 100) โ€” how far around the portal terrain must be finished rebuilding before a scene counts as settled.
  • The server refuses sector subscriptions outright when EnableRemoteSnapshots is off, and refuses NaN/Infinity anchor positions โ€” a client with a doctored config gets silence, not sectors.

The camera walks the world on its own

  • Added: Remote snapshots โ€” portals nobody visits finally get their photograph. Until now a destination picture could only be taken where a player happened to be standing, because the world simply does not exist anywhere else: Valheim builds terrain and objects only around players. The hosting player's game now quietly anchors one never-photographed portal at a time โ€” out where nobody is โ€” streams in a 3ร—3-zone patch of world around it, takes the shot, and lets it all unload again seconds later. One portal per backfill tick, round-robin so a slow-loading one cannot starve the rest, and the loading is spread thin enough that the host should never feel it.
  • Added: EnableRemoteSnapshots (synced, default on), governing both editions of the walk below.
  • Added: Dedicated servers are covered too. The server itself draws nothing and cannot take a photograph โ€” so the players do it for it. A client picks a never-photographed portal from the destination index it already holds, pulls that portal's data with the game's own single-object request, and asks the server โ€” through a new, renewal-driven sector subscription โ€” to briefly send the world around it, exactly as if the player were standing there. The zone streams in, the shot is taken, the picture lands back on the portal for everyone, and the far world unloads seconds later. A client that crashes mid-shoot costs the server nothing: subscriptions expire on their own within 15 seconds unless renewed.
  • Portals loaded around players are photographed exactly as before; the anchor pass only ever touches portals nobody is near.
  • Graceful on a mixed setup: against a server still running pre-1.2 (which does not know the subscription), a client burns three quiet timeouts, logs one clear warning, and stops for the session โ€” the walk-near-it rule simply applies as before.
  • Fixed: Far shots on dedicated servers could photograph a half-loaded scene โ€” missing terrain, bald ground where trees hadn't arrived. The readiness test judged only the objects that had arrived so far, so mid-stream an incomplete area read as complete. The camera now waits until the area is genuinely settled โ€” no new objects arriving for a sustained stretch, everything instanced, and no terrain mesh still building โ€” and if it never settles within the budget it skips the shot entirely: a missing photograph heals itself on a later lap, while a photograph of missing terrain would have stood forever.
  • Changed: The backfill shutter ticks ~16% faster (10.5 s, from 12.5 s), and snapshots are saved at JPG quality 85 (from 75) โ€” noticeably cleaner skies and foliage for roughly a third more bytes per picture. Resolution ships at 1280ร—720 and is now a dial โ€” see CameraResolution above.
  • Fixed: Far shots of never-visited wilderness came back treeless โ€” complete terrain, no foliage. Not a loading-time problem: vegetation only comes into existence when a zone is first generated, and nobody had ever generated those zones, so there were no trees to send no matter how long the camera waited. The server now ghost-generates the subscribed zones on demand โ€” the same mechanism it already runs around every player โ€” so the trees exist, arrive, and are stood up before the shutter fires. (Grass is the one thing far photos still lack: the engine only sprinkles grass around the player's camera. Trees, bushes and rocks are all real objects and all present.)
  • Fixed: tortal_scatterclear from a client only removed the portals loaded around that client and told you to run it on the host โ€” unhelpful advice on a dedicated server. The command now also asks the server to sweep the whole world (admin-gated against the server's adminlist) and reports the count back to your console.
  • Added: The far pass narrates itself in the log โ€” one line when it anchors a portal, one when the photograph lands (with elapsed seconds), one when it skips. A silent success was indistinguishable from a pass that never ran.
  • Fixed: Far photographs had a black void past the loaded area โ€” brutal from any mountaintop. The distant mountains and coastlines you see in normal play are a low-detail terrain carpet the engine keeps wrapped around the player's camera; the snapshot camera, kilometres away, had none. Each far shot now raises its own temporary copy of that carpet pinned to the anchor, waits for it to bake, photographs a proper horizon, and tears it down with everything else. The player's own horizon is never touched.
  • Fixed: A portal unloaded in the single frame between being chosen for a photograph and the shutter firing crashed the capture (harmlessly, but with an error in the log). Seen once in a 100-portal scatter test; the shot is now skipped and retaken next pass.

Seed a world with portals

The commands every 1.2.0 feature above was shaken down with turn out to be a world-building tool in their own right, so they are documented ones now. Both are cheat commands: enable devcommands in the console first, which on a server means being on its adminlist.

  • tortal_scatter [count] [radius] โ€” raises portals at random spots across the world (default 25 within 2 000 m; up to 500, radius up to 10 000 m). Spots are spread evenly across the disc rather than crowding the middle, each gate is named for its biome and registered in the index like any hand-built portal, and every 5th one is PIN-locked with 1234 so lock testing has subjects too. Paired with remote snapshots this seeds a world: scatter a network across the map on day one and the camera walks it on its own, so the server opens with a fully photographed portal network no player has ever visited.
  • tortal_scatterclear โ€” removes every portal tortal_scatter raised and nothing else; scattered gates carry a marker, and hand-built portals are never touched. Run from a client it sweeps what is loaded around you and asks the server to sweep the whole world (admin-gated against the server's adminlist), reporting the total back to your console.

The gateway goes gold

Settled by eye in-game, like 1.1.2's tuning round. Existing config files keep their own values โ€” these are the defaults.

  • VFXColour 89FFACFF mint โ†’ FFD24CFF warm gold. The greens always argued with vanilla's own warm light in the arch; gold agrees with it, so the gateway and the piece read as one object without needing VFXTintPortalFrame.
  • VFXBrightness 0.64 โ†’ 0.35 โ€” the warm colour carries more apparent light than the mint did at the same value, and glared where the green had merely glowed.
  • PinColour stays hard green: a small mark on a busy map wants to shout, which is the opposite of what the gateway wants.

Housekeeping

  • Removed: a dormant 1.0.0-era visual loader that was superseded by the procedural gateway before it ever shipped, yet still registered a patch on every launch. Nothing called it and nothing changes in play โ€” but it was the one piece of code implying a dependency on anything, and now the technical report's opening line ("no bundles, no dependencies") is true to the letter.

[1.1.2]

โš ๏ธ Every client must now match the server

  • Changed: The minimum required version is raised from 1.0.1 to 1.1.2 โ€” a server running this build refuses any client on an older one, rather than letting it in to behave differently. It had been pinned to the version that introduced the portal index, on the reasoning that an older client only missed features it did not have; that holds for the wire format but not for the experience, since 1.1.x changed what clicking a map marker does, when the destination window opens and whether it captures the keyboard. A mixed table produces two players describing different behaviour and neither of them wrong, which is far harder to diagnose than a refused connection. Update every client alongside the server.

The map is yours again

  • Fixed: Click-n-go had stopped working. Clicking a portal marker selected it and swung the map round to centre on that portal โ€” which dragged the marker out from under your cursor, so the second click landed on empty map somewhere else and never travelled. Selecting from the map no longer recentres it; selecting from the list still does, which is where that behaviour was always wanted.
  • Fixed: The double-click that trails every successful click-n-go could open vanilla's pin-name box over your arrival. It is now refused for a moment after a marker click is acted on.
  • Fixed: The destination window took the keyboard the instant it opened, so the rest of your walk up to the portal was typed into the search box instead of moving you. The search box is no longer focused automatically โ€” click it when you want it. FocusSearchOnOpen (local, default off) puts the old behaviour back.

Marking the chosen destination

  • Changed: Portal markers are all the same size now. The selected one used vanilla's m_doubleSize, which is a boolean โ€” the only sizes on offer were normal and twice normal, which is why some markers looked oddly large.
  • Added: The selected portal's marker is 30% larger and red, name label included, so which portal you are about to step to is unmistakable at a glance. Everything else stays a normal pin.

Tuned defaults

A fresh install now starts on the settings this build was actually played on, rather than the ones it was designed with. Every one of these is still a dial โ€” nothing is locked, and an existing config file keeps whatever it already holds.

  • VFXIntensity 1 โ†’ 0.64 and VFXBrightness 1 โ†’ 0.64: fewer and dimmer particles in the gate itself. The materials are additive, so the old numbers glared against snow and daylight.
  • VFXSwirlDensity โ†’ 3 (top of the range): the trailing ribbon is packed tight. Together with the above, the gateway reads as a fine-drawn thing leaving a dense wake rather than a bright cloud leaving a thin one.
  • VFXWakeDistance 8 โ†’ 25 metres: a gate is already alive as it comes into view and builds as you walk in, instead of appearing beside you.
  • VFXColour โ†’ 89FFACFF, a paler mint green โ€” at the lower brightness the old deeper green fell away to black at the edges of the swirl. PinColour โ†’ 12FF21FF, hard and saturated, because a small mark on a busy map wants to shout where the gateway does not.
  • MenuOpenDistance โ†’ 0.8 m, SnapshotRefreshIntervalMinutes 30 โ†’ 5, UITextScale โ†’ 1.05, UIFontSizeDelta +2 โ†’ +6.
  • VFXTintPortalFrame ships off. It works, but matching the gate's own light to the runes is a matter of taste rather than a fix โ€” vanilla's warm arch against cool runes is a look in its own right.

The gateway

  • Added: VFXTintPortalFrame (local, default off) โ€” the portal piece's own glow is tinted to VFXColour. The orange light in the arch was vanilla's colour, not the mod's, so a green gateway sat in an orange gate. Only genuinely emissive surfaces are repainted (the shader's emission keyword, not merely a stale colour value), and only the hue is taken from the dial โ€” a faint glow stays faint. The timber, stone and metalwork keep their own materials. Reversible: turn it off, or turn off EnableCustomVFX, and the vanilla colours come straight back.
  • Added: VFXSwirlDensity (local, 0.25โ€“3, default 3) โ€” how thickly the runes trailing off the gateway are laid along their ribbon, independent of VFXIntensity. The particle ceiling scales with it, so a high setting does not simply cut the tail off partway along.

Interface

  • Changed: MenuOpenDistance now defaults to 0.8 m rather than 2.5. The window is something you walk into the gate to get, not something that meets you on the path.
  • Changed: The destination snapshot backfill scans 20% more often (every 12.5 s rather than 15 s). Worth knowing what that cannot fix: only portals actually loaded around a player can be photographed at all, so a portal nobody has visited still waits for somebody to walk near it.

Existing config files keep the values they already hold โ€” BepInEx only writes a default into a file that has never seen the setting. The values above are defaults; change them by hand or delete the file to take the new ones.

[1.1.1]

The map is now part of the interface

  • Fixed: Clicks on the destination window fell straight through it onto the map behind โ€” toggling pins, starting drags, opening vanilla's pin-name box, and a middle-click through the window pinged the whole server. The window is IMGUI and the map is not, and the two input systems had never been introduced. While the cursor is over any of the mod's windows, the map's mouse handling now stands down entirely.
  • Fixed: The scroll wheel zoomed the map while it scrolled the portal list. It now does whichever one the cursor is actually over.
  • Added: Click-n-go. The portal markers on the great map are now live: click one to select that portal (exactly as if you had clicked its row), click the selected one again to travel. Double-clicking near a portal marker no longer opens vanilla's pin-name box in your face.

Favorites

  • Added: Every row in the destination list carries a small heart โ€” click it and it turns gold: that portal is starred. Favorites sort to the top of the list.
  • Added: The favorites strip: when you have favorites, the destination window opens as a slender list of just them, one click to travel, with an arrow (ยป) that expands to the full window and one (ยซ) that folds it back. OpenFavoritesView (local, default on) controls whether it opens folded.
  • Added: A PIN-locked portal launched from the strip or a map marker gets the quick PIN window: the map closes, a small window opens with the keyboard already in the field, Enter fires the PIN โ€” right and you are away, wrong and the screen says so and the field clears for another try. Esc cancels back to where you were. (The full window keeps its inline PIN row.)
  • Favorites are yours alone โ€” stored on your machine, per world, keyed to the portal itself so renaming keeps the star. Nothing about them crosses the wire.

Riding through

  • Added: Teleport while mounted and your mount comes with you โ€” you are lifted out of the saddle, the beast is sent through beside the exit, and once you land you are seated again automatically. The remount goes through the saddle's own request, so on a busy server the server still arbitrates the seat, and whatever rules the saddle enforces still apply.
  • Deliberately built against the game's mount interface rather than the vanilla saddle class, so custom saddle items and modded mounts (OdinMounts and the like) ride through too. Ships, carts and turrets are never dragged through โ€” only a tamed creature qualifies.
  • Added: AllowMountedTeleport (server-synced, default on) turns the whole behaviour off for a server that wants dismount-and-walk.
  • Added: TameFollowRadius (server-synced, 2โ€“30 m, default 10): how far around you following tames are collected when you travel โ€” previously a hard-coded 10 m.

The gateway breathes โ€” and swirls

  • Changed: The runic gateway is dormant until someone approaches, like vanilla's unlit stone: no rings, no runes, no motes, and no rendering cost, beyond VFXWakeDistance (local, 2โ€“50 m, default 8).
  • Changed: โ€ฆand it no longer reads as a switch. Strength now follows how close the nearest player actually is, so the gate builds as you walk up and bleeds away behind you as you leave โ€” emission falls off and the runes already in the air drift out on their own lifetimes, the way a flier's trail dissolves behind them rather than being cut off mid-air. Any player drives it, so a friend walking up lights the gate for you too.
  • Changed: The veil is rebuilt. It was a wall of large glyphs drifting straight up the doorway, which read as a sprite sheet scrolling behind a frame. Now small runes are drawn in off the edges of the opening, swirling about the gate's own axis and spiralling slowly inward โ€” and each takes its own shade from a band either side of VFXColour, so the gateway shimmers through a range instead of glowing one flat tone.
  • Added: A fifth layer: a swirling rune trail circling the whole structure โ€” an unseen point orbits the pillars weaving up and down, drawing a continuous soft-glow ribbon strung with rune glyphs behind it, the same trail technique as Wings of the Valkyrie's wingtips. It lazes around a quiet gate and whips around a charged one.
  • Changed: The last vanilla portal visual โ€” the blue "target found" flare โ€” is gone while the custom VFX is on; the swirl and the rings carry that job now.
  • Fixed: EnableCustomVFX off did nothing until you reloaded the world โ€” and it half could not have worked, because the code that switched vanilla's effects off kept no record of what it had touched and so had no way back. It now records the strip per portal and undoes it exactly, and turning the setting either way re-applies to every portal already standing, live.
  • Added: VFXIntensity (local, 0.1โ€“3, default 1) and VFXBrightness (local, 0.1โ€“3, default 1), and they move independently: intensity is how much gateway there is โ€” density, ring thickness, rune spacing โ€” while brightness is only how hard it burns. Previously one number did both, so anyone who wanted a dimmer gate got a thinner one too. VFXColour and VFXOrbHeightOffset now also apply live rather than on reload.

Map markers

  • Changed: The portal markers default to TortalPortal's own rune pin โ€” a green glyph in a ring, generated at runtime like all of the mod's art. PortalPinIcon still offers vanilla's five icons, plus Custom: drop a TortalPortalPin.png beside the plugin DLL (ship it in a modpack to give a whole server one look) and the markers use it, falling back to the rune pin if the file is missing.

Interface

  • Added: The full-screen photograph is now an album: arrows on either side (and the keyboard's arrow keys) flip through every portal's picture without leaving the lightbox, the portal's name across the top of each. A picture still on its way from the server shows its frame while it loads.
  • Added: ShowDestinationPreviews (local, default on). Turn it off and the destination window drops the photograph panel and narrows โ€” snapshots are still captured and shared either way, so turning it back on costs nothing.
  • Added: MenuCloseMargin (local, 0โ€“5 m, default 1): the extra distance beyond MenuOpenDistance you must retreat before an open window closes itself โ€” the hysteresis that stops it strobing on the boundary, previously hard-coded.
  • Changed: MenuOpenDistance now runs 0.1โ€“5 m โ€” at the bottom of the dial you must be standing in the gate itself before the window opens.
  • Fixed: โ€ฆand any setting below 1 m never opened the window at all, however close you stood. The range was measured as a full 3-D distance from your feet to the portal's proximity point, which sits above the ground, leaving a permanent vertical gap of about a metre that no sub-1 m threshold could ever beat. It is now measured horizontally, which is also what the setting reads as meaning.
  • Fixed: The hidden camera that photographs a portal's destination was left enabled โ€” the flag was cleared before copying the game camera's settings, and the copy handed it straight back โ€” so for one frame a second live camera rendered the player's view. Cleared after the copy now.
  • Changed: More headroom on the text dials: UITextScale now reaches 3ร— and UIFontSizeDelta +24, for displays where +2 was still squinting territory.

Colours

  • Added: A 5 - Colours section, all local, all live: VFXColour (the whole gateway โ€” veil, rings, sigil, motes, swirl), PinColour (the rune map pin), and UIGoldColour (the window frames' metal โ€” shadow and highlight tones derive from it, so silver or verdigris is one change).

For testing a build

  • Added: Two console commands, behind devcommands like vanilla's own world-editing commands.
    • tortal_scatter [count] [radius] raises test portals at random spots across the world โ€” default 25 within 2000 m, on dry land, spread at least 64 m apart, each named for the biome it landed in and credited to you, with every fifth one PIN-locked (1234) so the locked-portal paths have something to be tested against.
    • tortal_scatterclear removes every portal raised that way and leaves real ones alone โ€” each one is marked when it is raised, so cleaning up never has to guess.
  • They raise the real portal prefab rather than a hand-built record, so a scattered portal is a genuine portal in every respect: it survives a world reload, replicates, photographs itself and can be walked through.

Compatibility

  • Minimum required version stays at 1.0.1 โ€” the portal index format is unchanged. The two new synced settings simply never reach an older client, which cannot ride a mount through anyway.

[1.0.3]

Interface

  • Fixed: The name and PIN window took several attempts to open. 1.0.2 gave the destination window's filter box the keyboard as soon as it appeared, and Valheim gates its own Use key behind "is anything typing right now" โ€” so E was being swallowed before it ever reached the portal. Whether it worked came down to whether the filter box happened to hold focus at that instant, which is why it looked intermittent. There is now a Name & PIN button in the destination window, so the way in is a button you can see rather than a keypress racing the focus. E still opens it directly when no window is up.
  • Fixed: Messages like "Incorrect PIN!" appeared in the centre of the screen โ€” behind the destination window, which covers the left half of it. They now shift to the clear side, using the same measurement the map already centres by, so the message and the map agree on which half you can see. Worked out from the HUD's own canvas scale, so it holds at any resolution and UI scale, and the message goes straight back to where vanilla puts it as soon as the window closes.
  • Added: UIFontSizeDelta โ€” a flat point offset on every bit of text in the portal windows, applied on top of UITextScale. Defaults to +2 to match Fatty, which shares this exact theme and ships the same +2; set both mods to the same number and their windows read at one size. The title and footer bands grow with it so nothing clips.

Under the hood

  • The "who may rename this portal" test (its builder, plus server admins) is now one shared check rather than two copies, so the button and E can never disagree about it.
  • Opening the configuration window from the destination window tears down the map markers and preview properly, instead of leaving portal markers stranded on the small minimap.

Compatibility

  • Minimum required version stays at 1.0.1 โ€” the portal index format is unchanged, and everything above is client-side, so a 1.0.1 client works against a 1.0.3 server.

[1.0.2]

Interface

  • Fixed: The configuration window opened with the mouse still locked to the camera and invisible, so the name and PIN fields could be looked at but not clicked. Valheim frees the cursor only for windows it knows by name โ€” the map, the inventory, the store โ€” and ours were not on that list. They are now, both of them. (The destination window got away with it only because it opens the large map.)
  • Fixed: The configuration window is a modal opened deliberately with E, so it now holds the keyboard and the mouse outright rather than letting them half-reach the game underneath.
  • Added: The destination window focuses its filter box the moment it opens, and clears the previous search. Walk up, start typing. Escape still hands the keyboard back without closing the window.

Map

  • Added: Every portal in the list is now marked on the large map, labelled with its name, with the selected one drawn at double size โ€” vanilla marks nothing for a portal, so a list of names was the only clue where any of them were. The markers are never saved and are removed when the window closes, so they cannot silt up your own pin list. ShowPortalPinsOnMap turns them off; PortalPinIcon picks which of vanilla's five pin icons to use.
  • Fixed: Selecting a destination centred the map on it โ€” squarely behind the destination window, which covers the left half of the screen. The map now centres clear of the window, so the selection lands in the middle of the part you can actually see. Worked out from the map's own zoom and aspect, so it holds at any resolution, UI scale or zoom level.

Compatibility

  • Minimum required version stays at 1.0.1 โ€” the portal index format is unchanged, so a 1.0.1 client works against a 1.0.2 server.

[1.0.1]

Multiplayer

  • Fixed: The destination list was empty on servers. A client is only ever sent the world data around itself, so scanning locally for portals found the one or two underfoot and nothing else โ€” worst of all on an established world where every portal was somewhere the player had not yet stood. The server now builds the portal index and publishes it, and a joining player receives the whole thing during login.
  • Added: Startup backfill. The server scans the entire world for portals when it comes up, so a world that had portals long before this mod was installed lists all of them immediately, with no need to visit them first.
  • Added: New portals, renames, PIN changes and demolitions are picked up by a repeating rescan and republished only when something actually changed. PortalIndexRefreshSeconds (5โ€“300, default 10) controls the window.
  • Changed: A destination's photograph and PIN are now fetched from the server the moment you select its row, rather than being broadcast to every player. Portals you have never visited show their preview as soon as it arrives.

Previews

  • Fixed: Portals on a dedicated server were never photographed. Snapshots are camera renders and a dedicated server draws nothing, so the capture pass โ€” which only ran server-side โ€” could never produce an image. It now runs on players, who photograph the portals loaded around them; between everyone playing, the network fills itself in.
  • Added: Portals with no photograph are captured first, so an existing world backfills its previews as people move about it.
  • Fixed: Snapshots taken of somebody else's portal were silently discarded. Ownership of the portal is now claimed before the image is written.

Configuration

  • Added: Config migration. BepInEx binds settings by section and key, so the moment one is renamed or moved the old line is orphaned and stripped on the next save โ€” an admin updates the mod and their filter lists are simply gone. The config file now carries a layout version; on an update it is backed up beside itself and every value is carried to its new home. Settings that keep their name were always safe and still are.
  • Added: Anything in an old config that no longer exists anywhere is named in the log with its value, alongside the path of the backup, rather than disappearing quietly.
  • Added: MenuOpenDistance (1โ€“10 m, default 2.5). Vanilla's portal activation range is 5 m, which threw the destination window up while you were still walking in. The portal's own glow and connection effect keep their full range.
  • Clarified: MaxPortalsPerPlayer is unlimited out of the box โ€” 0 (the default) or any negative number disables the limit entirely.

Interface

  • Fixed: The destination window did not open if another player stood closer to the portal than you did. Range is now measured from your own character rather than from whoever the game considers nearest.
  • Fixed: Typing in the search, PIN and portal name fields also drove the character โ€” naming a portal walked you into the sea, and letters bound to hotkeys fired mid-word. Focusing one of the mod's text fields now suppresses gameplay input the same way the game's own chat box does, releasing it on Escape or when the window closes.

Compatibility

  • Changed: Minimum required version raised to 1.0.1. A 1.0.0 client has no portal index and would show an empty destination window against a 1.0.1 server.

[1.0.0] - Initial Release

Travel

  • Added: Custom portal destination window replacing vanilla tag pairing โ€” every portal in the world, listed with its lock state, biome, distance and owner, with name search.
  • Added: Selecting a destination pins it on the Large Minimap, opened alongside the window.
  • Added: The window opens on approach and closes when you walk away. Arriving through a portal leaves the destination's menu shut until you step out of range and return.

Previews

  • Added: Portal camera snapshots, captured on placement and stored on the portal's ZDO so every player on the server sees them. Wide-angle, framed from in front of the gate looking out at the destination.
  • Added: Background refresh pass keeps snapshots current as the world changes.
  • Added: Click a thumbnail to open the photograph full screen at your resolution, captioned with biome and coordinates.

Interface

  • Added: Ornate gilt frame chrome โ€” polished double rails, acanthus corner scrollwork, palmette crests โ€” generated procedurally at runtime. The mod ships no textures, shaders or asset bundles.
  • Added: UITextScale (0.6โ€“2.0) scales all portal UI text and the surrounding layout. Applies immediately; local to each player, not server-synced.

Security

  • Added: PIN locking for portals, set from a per-portal configuration panel opened with E.
  • Added: Admin bypass for PIN locks, item filters and placement limits.

Rules

  • Added: ServerSync configuration for whitelist, blacklist and bypass item filtering modes.
  • Added: Per-player portal placement limits.

Effects

  • Added: Green runic gateway VFX replacing vanilla portal particles โ€” rune veil, counter-rotating rune circles, ground sigil and rising embers, all generated in code.
  • Added: The gateway measures each portal's own arch and centres itself in it, so wood, stone and black marble portals are all placed correctly.
  • Added: VFXOrbHeightOffset for manual fine-tuning. Local, not server-synced.

Companions

  • Added: Tames (wolves, boars, lox, etc.) teleport with players automatically.