A 服务器端 发布你世界实时网络地图的模组。分享
http://your_ip:port 任何人都可以观看—— 客户端无需模组。 仅限专用服务器。
一个分支源自 h0tw1r3/valheim-webmap 重建用于 英灵神殿 1.0(极北之地).

渲染尺寸 4096将每像素米数减半,渲染不再阻塞服务器。网页地图 目录中
Valheim专用服务器/BepInEx/plugins/WebMap.8080)并访问 http://你的IP:端口.更新后,请强制刷新页面(换挡+reload) 以清除缓存图层。
位于以下位置的观察器 http://your_ip:port 共五页——实时地图(含三维世界模式及两者间的电影式巡览)、世界专属页(其记录、地域与首领)、绘于生物群系图上的传送门图集(近观枢纽:基地平面图及各门位置,穿门即达彼端,所抵之门高亮)、用于绘制与分享路线的规划板,以及每位玩家的统计页,涵盖死亡与事迹,乃至各自烹饪、酿造与冶炼之物,并依据装备、食物与事迹判定职业(玩家专属页以三维视图呈现其形象,缓缓转动:在线时实时更新,离线后显示最后所见)——配有可切换各图层的图例,以及如谷歌地图般的图层卡片,内含图例预设与底图选择:渲染图或平面生物群系图集。侧边栏可通过栏中☰折叠,手机上为抽屉式,且该选择跨页保持。其来源是 网页地图/网页: site.css 是所有页面都从中汲取灵感的风格系统, 地图核心脚本 渲染核心, js/card.js 一名球员,按名单上的读法(用于球员页面和巡览),每个页面只保留自己的内容。我们自己的托管副本位于
瓦尔海姆 部署相同的文件,使用一个 站点配置.js 为我们的服务器命名的那个名字。
玩家只有在设置后才会出现 对其他玩家可见 在游戏内地图上(m)。
地图按钮中的 ▶,或以以下内容结尾的链接 #巡演,把世界当作一面敞开的屏幕来播放,大约二十个地点一循环,每一类都先轮一遍再重复,下一循环挑选这一循环没有选过的:谁在线、传送门枢纽和最孤独的大门、最大的建筑和每位建造者自己的作品(“鲁里克的堡垒”)、人们死去的地方、最新的死亡和最古老的坟墓、商贩、每一条船和每一辆车、最繁忙的厨房、各片土地、最高的山峰以及沿山脊线飞过的一道山脊、最大的湖泊、最长的河流、一处海湾及其从水面上飞过的海岸、一座码头或一片朝海眺望的海滩、玩家留下的标记和名字、世界自身的地点(Boss祭坛、墓室、巨魔洞穴、沉没墓穴、平原村庄、矮人前哨、被感染的矿洞、焦油坑、废墟、沉船、符文石、石圈、希尔德尔的藏身处),以及人们去往的地方、走遍整个世界的路径。每一个地点都通过地图上的图层飞到,该图层让它值得一看,并以适合其类型的缩放级别降落(建筑以规划缩放级别降落,缓缓平移),然后以3D视角观看,地面以适合其类型的移动方式走过:以其特有的俯仰角环绕、低空掠过、从一人高度向上摇到全景、从远处推近、从数公里高处斜看一片土地,或飞过一处聚落、沿着一道山脊或一片海岸——或以视线高度站立其中:在基地的庭院里缓慢转身、步行穿过聚落或沿着水边行走、从码头眺望大海、从山顶俯瞰,或绕过枢纽的大门,始终是视线向外看而非对着一面墙;一片远处的土地或一段海岸在低垂的阳光下观看,其余的在白天或临近黄昏时观看,之后视角回到服务器的时钟。字幕以一条与地点匹配的数字条来命名该地——枢纽的大门及其最远的一对、建筑的部件及其首席建造者的占比、谁在一片险恶之地死亡、一片土地的面积及走过占比、一个地点的类型和生物群系、一间厨房的餐食——每第三或第四个停靠点是世界的一个数字,在缓慢漂移中展现整个被走过的世界。偶尔地图会缓慢拉远而非直接切换。任何触碰都会结束它。关于玩家的停靠点——某人在线、最新的死亡、一座坟墓——会在侧边显示他们的卡片,如同玩家页面上的那一行所显示的:职业、五边形、四个数字,以及他们身旁旋转的维京人(手机只保留数字)。
当一个场景在播放时,3D视图正在构建下一个场景——它的地面、物体和模型,以及远景所需的环形结构——切换会等待周围的区块加载完成,必要时让当前地图多停留几秒,宁可在切换时留下一个仍在加载的场景标记在地图上,也不会切进一个半成品世界。只有正在展示和即将到来的场景会被保留,因此游览已经离开的世界就会被释放。
地图的一种模式,进入街景的方式是:将地图按钮顶部的小人拖到已走过的地方并放下(在手机上:点击它,然后点击地图),选择 3D
在“图层”卡片的“视图”下(你位于地图中间),或者 在3D中查看 在某个地点或图钉上。 #3d=<x>,<z> (世界米数; &look=<正北偏转度数> 可选)直接链接进入,哈希值会随你移动而跟随。你站在眼高位置,距地面1.8米,面向北方。拖动以环顾四周;滚轮或双指捏合缩放的是视线,而非距离; W A S D 或者箭矢行走(Shift 奔跑, Q E 转向);点击地面即走到那里。⇅ 在同一位置切换为环绕镜头并切回;☼ 固定光照(服务器时间,或你选择的时间)、阴影(手机上关闭)以及显示的内容。 地图 或 Esc 把地图放回去,以你站的位置为中心,再把标记放回
#在渲染器及其three.js只会在首次进入3D时加载,绝不会随地图一起加载。
地面是游戏自身的地形:生成器的高度按游戏的方式在每64米区域内混合,再加上玩家所做的所有地形改造,按图表中的生物群系着色,水位在30米。地面上矗立着你周围三个256米区块中的所有物体——建筑、树木、岩石、灌木、废墟、船只——每个都用游戏中的对应模型绘制,并按照世界中的位置、朝向和缩放进行放置;一块因采矿或建基地而被开采的岩石只显示仍然矗立的部分。世界中的地点也在那里:商人的营地、沼泽女巫的小屋、墓穴、洞穴和矮人入口、Boss祭坛、石圈和符文石,都按照游戏为自身生成的方式呈现。住在那里的人不会被绘制——哈尔多、希尔迪尔和沼泽女巫不在各自的营地里——而游戏留给随机的部分则按其更可能的结果绘制,因此一个地点可能在某个细节上与游戏中的不同。只有有人走过的区块才会被发送;其余区块保持黑暗,就像地图上一样。
地图上显示的在线玩家会以他们自己的形象绘制,和其他所有游戏一样:他们选择的身体、肤色和发色、发型和胡须,以及穿戴和手持的物品——头盔、胸甲、护腿、披风、腰带、每只手里的东西和背上的物品——面朝他们所朝向的方向,头顶显示名字。服务器不运行动画,所以他们都以游戏的待机姿势站立,停留在第一帧:没有行走、挥砍或坐下,披风按建模时的样子下垂,而不是随风飘动。如果素材库尚未导出某个玩家的部件,该玩家会以一个简朴的人形站立,直到导出完成为止。
拉远总览视角,视野会以摄像机为中心呈环状向外延伸至更远处:摄像机700米范围内,下方九个区块连同其中所有细节完整呈现;向外延伸至约摄像机距离(最远3公里)处,地面略微粗糙,仅显示远处可辨认的内容——两米宽或三米高的玩家棋子、大块岩石、树冠或锥形的树木;再向外延伸至五倍距离(最远16公里)处,仅保留地面,采样精度为8米或16米。从4公里高处俯瞰,我们副本中整个可行走世界为1,019个区块,精度16米,1,019次请求共575 KB,在桌面端模组加载耗时三秒。已探索遮罩决定请求哪些区块,获取按由近及远每次六个进行,不再被任何环需要的区块则释放(地面区块最多1,600个,物体最多120个)。在总览中, W A S D 或箭矢将环绕的光点带过大地, E 或 空格
举起它并 Q 或 Shift 独自降低它; Shift 用钥匙会更快。
光随钟转:正午时太阳北越四十五度,日之两端低垂而暖,故背光之坡落入阴翳,空气将远处染上天色,平视最浓,俯瞰则淡。视野随攀升而收窄,大地遂卧于更亮的天穹之下。
当扫描首次遇到预制体时,模组会在游戏线程中将其导出为 glTF 模型,在 每帧毫秒数 一帧。专用服务器无法读取大多数纹理,大约每八个网格中只有一个能读,因此后台线程会直接从游戏自身的资源文件中读取这些内容,每个游戏版本读取一次,然后重新导出需要这些资源的模型。日志里是这么写的:
WebMap:正在将模型导出到 .../map_data/models,扫描发现时即导出,每帧 6 毫秒 WebMap:正在从 .../valheim_server_Data 的游戏文件中提取 199 个纹理 WebMap:已在 5 秒内从 1 个文件中提取 199/199 个纹理 WebMap:有 446 个模型需要使用新提取的纹理重新导出 WebMap:模型导出完成:15 秒内完成 1001 个预制体;507 个带模型,39 个等待锁定网格,库 64.4 MB WebMap:正在从 .../valheim_server_Data 的游戏文件中提取 48 个网格 WebMap:已在 3 秒内从 1 个文件中提取 48/48 个网格 WebMap:有 45 个模型需要使用新提取的网格重新导出 WebMap:模型导出完成:0 秒内完成 45 个预制体;539 个带模型,7 个等待锁定网格,库 71.2 MB
那是我们桌面上的世界:从第一次扫描到最后一个模型,只需两分半钟。当有人第一次打开读取扫描的页面时,它就开始了,而重启只会导出新增的内容。
一个地点不是网络预制体:游戏将其预制体单独保存,每个游戏实例都从标记点生成它,因此模组在导出时加载它,导出后释放,而大型预制体则根据所需帧数分多帧导出,其文件在游戏线程之外写入。
在线玩家会按所见部分分块导出:每个身体模型,以及外观穿着的每件物品,如同挂在身体上一样(青铜胸甲@armor, 青铜剑@右手_附加)。该模组会在玩家骨骼的副本上播放游戏自带的待机动画片段一次,并保持该姿势;每个部件都包含玩家的骨架,身体和服装蒙皮到该骨架上,手持或挂载的物品作为其挂点下的节点,因此无论查看器将部件放在哪里,它们都会保持在一起。查看器会对皮肤和头发进行着色,并将身体的胸部和腿部涂装覆盖在皮肤本身上,因此一个部件就能服务于所有穿戴它的玩家。
一切都存在于 地图数据/模型/,除了世界自己的文件夹外,因为预制体在每个世界中都是相同的: index.json (导出的内容), 纹理.json (模型想要的东西),一个 <hash>.glb 每个预制体, tex_<name>.png 每纹理及 网格文件/*.bin 对于提取出的网格,在我们的世界中大约有73 MB——57 MB的模型、14 MB的纹理、2.4 MB的网格——并且它能在模组重启和更新后保留下来。模型和纹理会提供给3D视图;网格是游戏数据,永远不会离开服务器。删除该文件夹即可重新导出所有内容。
!标记 —你所在位置的一个点。 !将这段文本标记为置顶 给它贴上标签。!pin <类型> <文本> — 类型有 点, 火, 矿, 房屋, 洞穴.撤销钉选 — 移除你最近添加的标记。!deletePin <text> — 移除与该文本匹配的标记。若无文本,则移除你最近添加的未命名标记。不区分大小写。超出配置的限制后,玩家最早的标记将被移除。带登录的部署(见 徽章 在下方)允许成员在地图上进行相同操作:点击已走过的地方和 钉在此处,或者点击一个图钉来重新标记、重新输入、移动或删除它。
发送公告,将消息作为正文, X-公告令牌 秘密藏于
公告令牌 放在 DLL 旁边——而不是放在 BepInEx 配置里,因为配置在关闭时会被重写并丢弃它。没有令牌文件就意味着这条路径是关闭的。
设置 Discord机器人令牌 (从站点的设置页面,或配置文件中)获取,然后模组通过机器人API而不是webhook自行与Discord通信:
Discord日志频道 碰巧的是(Discord.告知,这些信息已由同一段代码记录到控制台)。加入、离开和死亡不受影响——它们仍通过现有的 Discord网络钩子.Discord聊天频道 设置和 聊天中继 开启(默认)时,游戏内聊天会发布到那里 名称:文本,而模组每三秒轮询一次频道以获取反向内容:人类的台词(机器人、网络钩子和模组自己的帖子会被跳过)会在游戏中以语音形式说出 [Discord] 名称:文本,按公会昵称,前提是该成员有昵称。重启后不会重放历史消息——轮询从它找到的最新消息开始——每次轮询最多朗读五条消息,因此 Discord 端的刷屏不会淹没服务器。服务器 并且这两个频道设置会在设置页面提供一个下拉菜单,而不是一个空白的ID字段(获取 /discord/guilds, GET /discord/channels?guild=,在同一个标记之后,并且
X-管理员 门作为 /设置);没有令牌,它们只是一个普通字段。内容 否则每条消息都会如此):应用页面,机器人 → 特权网关意图 → 消息内容意图。一个空 Discord机器人令牌 把三个全部关掉;这里什么都不碰 Discord 网络钩子.
标准的BepInEx配置,外加:
渲染尺寸 世界像素渲染范围,默认2048。相同区域为
纹理尺寸,只是更清晰:4096将每像素米数减半,一次性渲染约需一分钟,下载量也更大。叠加层仍保持在 纹理尺寸,额外的分辨率毫无用处。A 地图.png 尺寸错误的会在启动时重建。显示载具 — 报告船只和推车位于 /载具它们只会在已探索区域内被报告;关闭后则完全不会被报告。对于3D视图,在 [模型] (主机在重启时会重写配置,因此实际运行的是默认值):
导出模型 — 将每个预制体作为 glTF 模型导出到库中,默认开启。关闭后,3D 视图中只有地面,上面空无一物。提取纹理 — 从游戏文件中读取模型的纹理,默认开启。关闭:纯色。提取网格 —读取引擎锁定在游戏文件之外的网格,默认为开启。关闭:这些模型会以其尺寸的方块形式绘制。每帧毫秒数导出 —游戏线程每帧的毫秒数,导出可能需要的时间,默认6。最大纹理尺寸 ——提取纹理的最长边像素值,默认512。类别 — 发送的3D视图,属于 碎片,其他,岩石,灌木,树木,默认全部五个。| 路径 | 返还 |
|---|---|
/map, /map.jpg |
世界渲染图;这张JPEG大约只有其七分之一大小 |
雾 |
已探索面具(PNG) |
图表 |
世界如地图:每个像素为其生物群系的纯色,水域统一为蓝色,无地形起伏(PNG格式,每个世界生成一次) |
/structures, /建筑/属性 |
结构叠加层;按预制件类型计数及上一次扫描的消耗 |
/forest, /森林/属性 |
森林覆盖层,树木和树桩数量及密度百分位数 |
轨迹 |
玩家走过的位置:每个地图像素的计数,以淡蓝色带绘制;在有人走过后的首次扫描之前为503(PNG) |
功能 |
世界地理及其名称:大陆块、山脉(含山峰)、湖泊、海湾、河流(含河道)、生物群系区域; ?v= 从 功能 |
名称 |
提交 {"id","name"} 命名一个地点(空名称:返回世界自身的名称),或使用以下ID 中心@x,z,一个传送门枢纽矗立在那里;需要 X-Announce-Token, credits X-用户 |
/图钉 (发布) |
{"op":"add","x","z","type","text"}, 编辑 与以下任意 x, z, 类型, 文本,或 {"op":"delete","id"}:放置、更改或拿起图钉,只会在走过的地面上进行;回应 确定、编号、标记,400带 错误需求 X-Announce-Token; X用户 拥有一个新图钉,并记录每一次写入 |
/at |
?x=&z= 以世界米为单位:某步行地点的生物群系和高度及其所处位置,以及每种已步行区域的比例和其上所立之物;未步行地面返回404 |
/设置 |
获取 该模组的设置与网站上显示的一致; 提交 {"key","value"} 设置为1(空值:返回配置);需要 X-公告令牌 和 管理员:1,鸣谢 X用户 |
/discord/guilds |
机器人所在的公会, {"公会":[{"id","名称"}]},用于设置选择器;与以下相同的门槛: 设置 |
/discord/channels |
?guild= 公会的文字和公告频道, {"channels":[{"id","名称"}]};同一闸门 |
碎片 |
每放置一块 [预制体, x, z, 朝向, 亮度, 由] 照着预制件占地和颜色表,以及一个 玩家 列表: 点燃 是火把、火坑或壁炉的燃料, 1 当它燃烧时, 0 一旦出去, -1 在一块不会燃烧或未知的棋子上; 由 谁建造了它,一个索引指向 玩家 以属性所知晓的名字, -1 对于从未联机过的建造者(JSON格式,繁忙世界为几百KB) |
/地点 |
世界各地点——祭坛、地窖、洞穴、营地、废墟、残骸、符文石等等,以游戏的预制体名称为准——那些有人走过的地方: {"locations":[{"kind","x","z"}],"count"},每次清扫构建一次(JSON) |
/portals |
带有标签的传送门以及每个传送门所连接的对应传送门,按照游戏已建立的连接关系(JSON) |
/graves |
墓碑仍保留装备:所有者、位置、死亡后秒数(JSON) |
/载具 |
船只和推车,位置与类型 (JSON) |
/统计/玩家 |
每位玩家的统计:加入次数、死亡次数、聊天次数、移动距离(按生物群系,海洋按 海洋)、传送门跳跃、标记、站立物/传送门/飞船、坟墓、击杀、砍伐的树木、破碎的岩石,以及 装备:手持每种物品、身着每种重量的胸甲时各持续秒数,最后穿戴的套装,按种类对生物造成的打击; 厨房:烹饪和烧焦的菜肴、酿造的蜂蜜酒、采集的蜂蜜、冶炼的物品以及每种产品的数量;以及 看 和 偏航,玩家最后一次被看到的样子,作为 状态 将它们承载;在顶端,世界的 厨房 及其最繁忙的车站(JSON) |
/players, 徽章, /消息 |
实时状态(JSON) |
状态 |
一个文档中的所有小型JSON块——玩家、消息、标记、载具、传送门、坟墓、商人、最近500次死亡及其发生地点——外加每层的内容修订(雾效反转, 森林, 建筑, 碎片, 图表, 小径, 功能,以及用于3D视图 对象, 高度, 模型所以观众仅在画面发生变化时才获取图层;将修订版本作为参数传入。 ?v=. 时间 是游戏的时钟: {"日", "分数"},太阳在一天中所经过的比例(0.25日出,0.5正午,0.75日落)。地图上显示的一名玩家携带 偏航 (从北顺时针的度数)以及 看: 模型 (尸体), 皮肤 和 头发 (颜色,0..1), 槽位 (每个槽位中的预制体)以及 零件,先绘制身体部分的库零件 |
高度 |
?cx=&cz=[&step=],一个256米的区块(cx = floor(x / 256), 捷克语 同理):(256/步长 + 1)² 小端序 int16,世界高度以分米为单位, 步骤 相隔米数(1、2、4、8或16:每边257格递减至17;默认1,每一步在同一修订下各自缓存);第0行是南边缘(z = cz*256),第0列在西侧,两侧边缘都包含在内,因此相邻区块共享接缝。包含地形改造;水面高度为30米。无人涉足的区块返回404;该区块的地形改造修订版本位于 X-Rev |
/objects |
?cx=&cz=,区块中每个可见物体都作为 目标2,小端序: 目标,u32 数量,u32 预制体数量,i32 预制体哈希,然后是44字节的一个对象——u16 预制体索引,u8 标志(1 = 玩家建造,2 = 被开采掉的碎片),u8 填充,f32 x y z,f32 旋转四元数 x y z w,f32 缩放 x y z(Unity的坐标系,y向上,z向北)——然后是开采出的岩石:u32 数量,每块岩石对应 u32 对象索引,u16 位计数,位/8 字节,当第 i 个受击区域消失时,第 i 位被置位。(对象1,第一刀,在没有旗帜和表格的情况下也是如此;页面两者都读。)对于没人走过的区块返回404;其修订版本在 X-Rev |
/预制体 |
模型库的索引:每个预制体哈希对应的名称 n,类别 c,是否有模型 m 及其版本 v,边界 b,而对于植被则是树冠边界 k,叶纹理 呃 并着色 kc;对于一块被开采成碎块的岩石,其种类 啊 (5个矿石5,1个矿石)和 爸,按顺序每个glTF图元的击中区域(-1无,-2 MineRock的整块岩石模型);对于在线玩家的部位(类别 骨骼,作为一个造型的名称 部件胸部和腿部的颜料覆盖在皮肤上, 当前时间 和 lt (JSON) |
/models/<file> |
一个模型(<hash>.glb,哈希值为八位十六进制数字)或纹理(tex_<name>.png)从库中;可缓存一天, ETag 文件的时间 |
/announce |
POST,见上文 |
结构扫描会在游戏线程上遍历每一个ZDO,每帧处理几千个;遍历之后的所有操作都在线程池线程上运行。它仅在有人读取地图时运行:对任意图层或对由扫描供给的JSON发起请求会将其激活两分钟,扫描之间至少间隔一分钟,而空闲服务器则完全不执行扫描。 /配置, /players, 地图, /钉选 和 /消息 不要激活它,这样监视器探测这些时游戏会保持空闲。 /结构/属性 报告上一次扫描的情况——遍历的 ZDO 数量、游戏线程毫秒数、帧数、实际耗时、第二代回收次数——让开销可以被直接读取,而不是靠猜测。
聊天。 英灵神殿1.0将聊天信息分别发送给每个接收者,而非广播,因此在 处理路由RPC 只看到 ping 信号。不过它仍然会经过服务器:
路由RPC 呼叫 路由RPC 转发它,而这就是此模组观测聊天的地方。每收到一个接收者就会收到一次 shout,并根据发送者、方法和载荷进行去重。
上游反而注册了一个伪造的服务端玩家,让客户端将数据发送给服务器。 在1.0版本中,这完全阻止了任何人加入 服务器保持正常注册状态,但记录的连接尝试为零——所以它在这里已经没了。别把它加回来。
清扫仅在扇区列表之间产生结果。 在内部屈服 List<ZDO> 让游戏的移除操作在遍历过程中改变索引并跳过ZDO;两次产出之间的整个扇区是最小的安全步长。
公告 使用 消息提示界面的 显示消息 而不是聊天: 聊天 每条消息都取决于一个 关系管理器 针对发送者平台用户ID的权限检查,而服务器没有该ID,因此从服务器发送的聊天消息会被静默丢弃。
击杀、树木和岩石。 服务器不运行任何生物、树木或岩石——最近玩家的游戏才运行它们——所以它只统计经过它的东西:
一次攻击只有在传向另一名玩家的游戏时才会抵达服务器。独自待在一个区域内的玩家拥有周围的一切,而他们自己的攻击永远不会离开自己的游戏,因此当没有看到攻击时,就会归功于区域所有者:如果一只生物自己的记录将其列为攻击过它的玩家之一、一棵树在他们16米范围内被砍倒、一块岩石碎片在32米范围内。区域所有者一击杀死的生物可能不会被计入,因为它的记录可能在它倒下之前还未抵达服务器。
装备。 玩家的ZDO承载着其他所有游戏中所描绘的持有和穿戴物品,因此每秒钟,只要玩家存活且不在床上,服务器就会为以下项加一秒:
手 -- 每只手所持物品的所属类别,按物品自身的技能和类型排序: 弓, 弩, 员工, 护盾, 刀, 剑, 斧, 锤, 矛,
长柄武器, 锤, 锄头, 修仙者 (镰刀也是), 镐, 火把,
钓鱼, 工具 手中拿着其他任何东西(一个酒杯), 无 双手空着或武器收鞘时(拳套武器就是游戏自带的徒手状态)。剑和盾则各算一件。 双手 家族中数一数二的双持近战武器。护甲 -- 胸甲的重量,来自其移动惩罚: 光 无(皮革、巨魔、洛克、沼泽怪、阿斯克文), 中 最高3.5%(固定), 重 更多(青铜、铁、狼、软甲、甲壳、焰金:5%), 法师 任何加速以太(以太编织)的效果, 无 裸露。饮食 是秒数取决于铁栏后的食物倾向于什么: 丰盛的 (生命值为耐力值的一半再多一半), 快速 (另一边), 埃特尔 (其中四十或更多,一份伊特食物),
均衡, 无 (任何食物不超过三十个)。服务器永远看不到食物本身,只能看到它们设定的最大生命值,以及玩家站立不动时它们所恢复的耐力与以太,因此每种属性缓慢衰减的峰值就代表了其最大值; 食物 是最新的
生命值, 圣 和 艾特尔 高于基准的25和75。
磨损的 是最新套装: 右, 左 (收起的武器也算), 宝箱,
腿, 头盔, 肩膀以及两个后备槽位 右后 和 左返回,按预制体名称。 命中 是颜色,而非记录:只有当一次命中在传往另一位玩家游戏的过程中经过服务器时,才算命中一个生物,而绝不计算命中者自己游戏所运行的生物,后者在某个区域内独自存在时便是全部。每一个都是 近战, 远程 或 魔法 (一根法杖的),以及 背刺
当武器具有背刺加成且生物尚未警觉时,顶部显示计数。
厨房。 没有人的物品栏会传到服务器,但工作站会:所有带有烹饪站、发酵桶、蜂箱或熔炉组件的预制件(篝火、铁烹饪站、石炉;发酵桶;蜂箱;熔炉、高炉、窑、风车、纺车和埃特尔精炼厂)都会被扫描找到,或通过其上第一个被填满的槽位找到,并且每五秒读取一次其ZDO。玩家的 厨房 计数:
熟了 槽位被占用后,放置物品的人就很明确:站点所有者会广播每一个被占用的槽位,而非所有者的玩家会先通过服务器询问所有者,因此放置者身份一清二楚。 烧焦 相反,当它留在火上烧焦时(一道算作已烹饪的菜会移过去)。酿造 -- 酒桶被敲击时掉落的蜂蜜酒,归灌装它的人所有。蜂蜜 ——从蜂巢中取出的蜂蜜。冶炼 每个熔炉从队列中产出的物品:金属锭、煤炭、面粉、线、埃特,归属于装载相应矿石的人。菜肴 -- 按预制体名称排列的熟食、蜂蜜酒和冶炼物品。发酵罐的装填者、蜂巢的取用者和熔炉的装载者,是8米内最近的玩家。模组开始监视前已填满的槽位不计入任何人。文件本身的
厨房 掌控着世界 熟, 烧焦, 酿造, 蜂蜜 和 熔炼,无论是否计入,以及 站点,按预制体(类型) 并放置 (x, z),每个都有其
烹饪, 酿造, 熔炼 和 蜂蜜大锅和备餐台不留痕迹,所以面包和派只算烤炉的步骤。
site.css 整体效果在于:代币放在 :root (从最深到最浅的表面、墨水、强调色、地图自身的传送门、商人和坟墓色调、世界上的光环、半径、阴影、字体、栏和侧边栏宽度)、基础以及每个页面共享的组件—— .title .eyebrow .sub .note .section .foot, .card .well .glass .stat .dot,
.btn .chip .field .btnrow, .stage .mapctl .legend, 点 (聚光灯:一个人物、一行背景信息以及一张小图片,来自 地图核心.pic ——一个阵容条、一个份额环、带标签的条形图),
.cls .mini .radar .viking (一名玩家作为 js/card.js 绘制它们)、导航栏和侧边栏外壳。页面自身的 <style> 只承载那一页单独绘制的内容,不具名任何自己的颜色:每种颜色都是一个令牌,因此重新设计样式就是对 根 页面随之翻动。有两个例外是数据而非界面元素:森林色板的绿色,以及地图为群系命名时所用的生物群系墨水(名称样式 在 map-core.js)。
dotnet test WebMap.Tests # 模组的逻辑:构建模组,然后在 .NET 10 上加载 WebMap.dll node --test # map-core.js 的纯函数,从仓库根目录运行
最初的需求 库/ 设置为用于构建。 测试 说明每一层覆盖了什么,以及哪些还没有任何覆盖。CI 在每次推送和拉取请求时都会运行这两项。
工具/同源.py 网页地图/网页 http://你的IP:端口 8766 以模组的方式为查看器提供服务——页面来自磁盘,其他所有路径转发至服务器——并且,通过一个以以下参数启动的无头 Chrome --remote-debugging-port=9334 (以及,针对3D视图的WebGL, --use-angle=swiftshader --enable-unsafe-swiftshader),
node tools/check.mjs http://127.0.0.1:8766 9334 [/tmp/shots] 逐页检查:无一例外,标记和名称已绘制,点击名称会打开其位置卡片,名称弹出菜单,世界起始处的地面和物体以3D呈现,枢纽和拨号线路,每位玩家一张卡片,计划加载,导览在窗口调整大小后落位,已停止的保持停止,玩家的卡片在其中旋转直到消失。每项检查占一行,任何失败都返回非零退出码,并在指定目录时为每个页面截图。查看器变更在该检查通过后即告完成。
工具/bench.mjs http://127.0.0.1:8766 9334 平移和缩放同一Chrome上的地图,并打印每帧毫秒数:16.7是屏幕自身的刷新率,高于这个值就是卡顿。
./testserver.sh 运行与主机相同的镜像(indifferentbroccoli/valheim-server-docker在 podman 下。
./testserver.sh up # 首次运行会下载游戏,约10分钟 ./testserver.sh deploy # 构建,复制进去,重启 ./testserver.sh status # 容器 + 端点 ./testserver.sh logs
与……一起 通过IP加入 → 127.0.0.1:2456,密码 testpass123.
两件事值得知道:steamcmd 失败了 应用更新 与
缺少配置,大约每四次运行中有一次什么都没下载到——这是暂时性的,再运行一次即可。而在启用了 SELinux 的主机上,绑定挂载需要 :z 否则容器只会默默无视一切。
一个全新的世界空无一物,直到有玩家踏足其中——服务器只会在玩家周围构建区域——因此3D视图和扫描都需要一个真实的世界。复制一个进来吧(Valheim 1.0将世界保存为一个文件夹, 世界_本地/<名称>/)并以自己的名义运行它,以其
雾.png 所以同样的地面也算作已走过:
VALHEIM_TEST_WORLD=Mothership ./testserver.sh up podman cp Mothership valheim-test:/valheim-saves/worlds_local/ podman cp fog.png valheim-test:/valheim/BepInEx/plugins/WebMap/map_data/Mothership/fog.png podman exec valheim-test chown -R steam:steam /valheim-saves/worlds_local /valheim/BepInEx/plugins/WebMap/map_data podman restart valheim-test
如适用,MIT。

修改前置工具
2026-09-12 14:33:53
修改前置工具

史诗战利品
randyknapp2026-09-09 21:20:10
为英灵神殿添加战利品掉落、魔法物品和附魔。

制作 建造 熔炼 烹饪 燃料 从容器中取出
aedenthorn2025-06-30 08:34:14
让你在制作、建造、使用熔炉和窑炉、添加燃料、烹饪食物等时,可以使用附近容器中的资源。

种植一切
Advize2025-09-09 11:15:37
重写了bkeyes93的种植增强模组。允许你的种植者种植浆果丛、蓟、蒲公英、蘑菇、此前无法获取的树种以及其他装饰性植物。还包括许多其他杂项功能(详见

无限制传送门
frostedplaything4102023-09-02 17:39:40
无限制传送门是一个客户端模组,允许玩家通过传送门传送任何物品。该模组提供广泛的自定义选项,让玩家能够控制物品限制、移除限制,

农场格子
Sarcenzzz2023-06-14 11:38:34
允许所有通过种植器种下的植物自动对齐并放置在网格中,确保它们有足够的生长空间。

更好的UI
MKMasa2021-04-15 09:19:42
这个模组对游戏界面做了一些细微的调整。你可以编辑并选择想要启用的更新内容。

更好的射箭
Ishid42026-09-10 16:16:51
为弓术玩法添加了许多功能和改动,包括全新的箭袋系统、可回收的箭矢、更精准的瞄准以及逼真的箭矢物理效果。