Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
BotanicPupPatch
PUP FPS crystal-wall clustering exclusion plus existing collision/support guards, optional FGN handoff support and default-off logging.
By Botaniclas
| Date uploaded | a week ago |
| Version | 1.5.0 |
| Download link | Botaniclas-BotanicPupPatch-1.5.0.zip |
| Downloads | 28 |
| Dependency string | Botaniclas-BotanicPupPatch-1.5.0 |
This mod requires the following mods to function
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.2351PUP82-PUP_FPS
A smart building combiner for massive Valheim bases with single-player and client-server multiplayer support. Controls: [ combine, ] restore, \ highlight, F8 emergency restore.
Preferred version: 1.0.34README
BotanicPupPatch 1.5.0
Ein Zusatzmod für PUP FPS 1.0.33: Cart-Guard, Guard für Tiere/Monster und bisheriger Statikfix in einer DLL. Optionale Unterstützung für Besitzerwechsel mit FiresGhettoNetworking. Version 1.5.0 schließt normale Kristallwände vom Clustern aus. Die bisherigen Guards und Optimierungen aus 1.2.0 bleiben erhalten; eigene Logs sind standardmäßig aus. PUP FPS bleibt erforderlich.
Kristallwände: Ausschluss und bestehende Cluster
Die beiden erfolglosen Renderexperimente aus 1.3.0 und 1.4.0 sind vollständig
entfernt. Das native Prefab crystal_wall_1x1 wird stattdessen vor dem
Clustern aus PUPs Kandidatenlisten entfernt. Die Wand bleibt als normales
Valheim-Bauteil mit eigenen Renderern, LODs, Material, Kollision und Statik bestehen.
Es werden keine Materialien, Kameras oder Reflection-Probes verändert.
Der Ausschluss greift sowohl bei lokaler Clusterauswahl und Multiplayer- Administratoranfragen als auch bei PUPs separater Dedicated-Server-Auswahl. Er verwendet den nativen ZDO-Prefab-Hash; Anzeigenamen und veränderte Materialien beeinflussen ihn nicht. Andere Prefabs und zusätzliche modded Kristallvarianten werden nicht pauschal ausgeschlossen.
Bereits gespeicherte Cluster behalten ihren bisherigen Inhalt. Ein Neustart allein entfernt enthaltene Kristallwände nicht. Nach Installation auf Server und allen Clients betroffene Zellen einmal mit PUP selbst zurücksetzen:
- Als Serveradministrator an den betroffenen Cluster gehen.
- PUPs
]drücken: nächste geclusterte Zelle wiederherstellen. - Abschlussmeldung abwarten. Bei gemeldeten fehlenden Records zuerst die Wiederherstellung klären; nicht direkt weiter clustern.
- In der wiederhergestellten Zelle mit
[erneut clustern. Kristallwände bleiben jetzt draußen; andere unterstützte Bauteile werden wieder geclustert. - Für weitere betroffene Zellen wiederholen.
Das sind PUPs native Tasten RightBracket / LeftBracket. Bei Problemen mit
deutschem Layout zum Bedienen kurz auf englisches Tastaturlayout wechseln.
Der Zusatzmod startet keine automatische Welt-/Cache-Migration. PUP-Cache und
Restoredaten während bestehender Cluster nicht löschen. Normale Kristallwände
kosten wieder ihre ursprüngliche Render-/Instance-Arbeit; andere Cluster bleiben
optimiert. Der neue Filter läuft ausschließlich während der Kandidatenauswahl,
linear und ohne zusätzliche Ergebnislisten, laufenden Frame-Scan oder Timer.
Installation
- Spiel und Dedicated Server beenden.
- Alte
PupCartGuard.dllentfernen. VorigeBotanicPupPatch.dllersetzen; nur eine Kopie des Zusatzmods behalten. - ZIP wie SmartContainersIgnore im Modmanager lokal importieren. Manuell:
DLL nach
BepInEx/plugins/BotanicPupPatch/kopieren. - Für vollständigen Dedicated-Schutz auf Server mit PUP und auf allen simulierenden Clients dieselbe Version installieren.
- Neu starten. Eigene Start-, Status-, Warn- und Fehlerlogs sind standardmäßig aus.
Benötigt: BepInExPack Valheim 5.4.2351 und PUP FPS 1.0.33. FGN-Unterstützung wurde gegen das lokale FiresGhettoNetworking 1.5.28 geprüft (Assembly-Version 1.4.67.0). FGN ist eine weiche BepInEx-Abhängigkeit für die Ladefolge; keine Pflichtabhängigkeit des ZIPs. Seine DLL bleibt unverändert.
Originale PUP-DLL und bisherige Support-Test-DLL werden erkannt. Eine bereits korrigierte DLL kann bleiben; der Statikzweig wird nicht erneut invertiert. Andere PUP-Binaries werden abgewiesen und der Zusatzmod bleibt inaktiv; mit aktivierter Diagnose erscheint der Grund. Keine separate Cart-DLL nötig.
Schutz
- Carts: Chassis und vorhandene Rad-Rigidbodies werden bei ausstehender PUP-Kollision vorübergehend mit Constraints gesperrt.
- Tiere/Monster: Character-Rigidbody wird ebenso gehalten. PUPs gemeinsame Vorbereitung liefert währenddessen false, sodass Bewegung und AI pausieren und PUP keine zweite kinematische Sperre setzt. Gezähmte Tiere eingeschlossen; Spieler bleiben vom neuen Guard ausgenommen.
- FGN-Übergaben: Vor bevorstehender lokaler Mob-Übernahme werden aktuelle
Physikposition und die von FGN verwendete ZDO-Zielposition geprüft. Nach FGN
und nativem
ZSyncTransform.CustomFixedUpdateerfolgt ein Nachcheck der tatsächlichen Rigidbody-Position, auch bei übersprungener nativer Methode. Fehlende Kollision hält den Körper vor der nächsten normalen Unity-Physiksimulation. FGN darf weiterhin Besitz und Position abgleichen. - Freigabe: Aktuelle Clusterdaten, passende Cache-Version und PUPs exakte Kollisionsvorbereitung müssen vorliegen. Keine Freigabe nach bloßem Timer. Vor Empfang des Multiplayer-Manifests kann auch außerhalb später bekannter Clustergebiete kurz gehalten werden.
- Statik: Falsch geprüfter
m_noSupportWear-Zweig wird im Arbeitsspeicher korrigiert. PUP kann seine vorhandene Kollisions-/Support-Neuberechnung für Bauteile ausführen, die bei fehlender Unterstützung Schaden nehmen. Keine Heilung, Unzerstörbarkeit oder allgemeine Abschaltung der Statik.
Guard arbeitet im Multiplayer. Die Statikzweig-Korrektur bleibt wie der frühere DLL-Patch auch im Singleplayer vorhanden. Keine neuen Netzwerkpakete, ZDO-Schreibvorgänge, Besitzübernahmen, Positionskorrekturen oder Änderungen an Gravitation/isKinematic. PUP kann temporäre Kollisionsproxies erzeugen.
Optimierung ohne zusätzliche Warteintervalle
Es wurde keine zusätzliche Drosselung wartender Collider eingeführt:
- Metadaten werden bei jedem Guard-Aufruf aktuell gelesen. Neue Manifeste, Records, Cache-IDs und Restore-Zustände wirken bereits beim nächsten Aufruf, auch wenn sie sich während desselben Physikschritts ändern.
- Feldzugriffe verwenden einmalig erzeugte, direkte Read-only Getter.
Laufende Abfragen benötigen keine
FieldInfo.GetValue-Aufrufe. - Dictionary-Abfragen bleiben typisiert. Die bisherigen explizit geboxten Zellschlüssel und doppelten Contains-/Indexer-Zugriffe entfallen.
- Bereits erfolgreiche Vorbereitung nutzt weiterhin maximal 0,1 Sekunden Kollisionslease. Wiederverwendung verlängert diese Frist nicht. PUPs kürzeste Actor-Retention beträgt 2 Sekunden; regelmäßiges Erneuern bleibt erforderlich.
- Aktuelle Position und zukünftige FGN-Zielposition haben getrennte Leases. Eine unveränderte, erfolgreich vorbereitete FGN-Zielposition wird nicht bei jedem doppelten Aufruf erneut vollständig vorbereitet. Zieländerungen, Besitzer-/Welt-/Revisionswechsel oder lokale Sync-Sprünge prüfen sofort neu.
- Auch eine wiederverwendete FGN-Ziellease prüft PUPs aktuelle Support-/Restore- Zustände in den benachbarten 3×3 Zellen. Änderungen lösen sofort vollständige Vorbereitung aus; synchron vervollständigbare Collider können im selben Aufruf freigegeben werden. Fehlgeschlagene Vorbereitung wird nicht als Ergebnis gecacht.
- Radius und Abdeckung bleiben erhalten. Bei Mobs entfällt die bisherige Collider-Bounds-Suche beim Anlegen, deren Ergebnis dort ungenutzt blieb.
- Bei ausgeschalteter Diagnose werden laufende Logtexte nicht aufgebaut.
Bewegung ab einem Meter verlässt die gepufferte aktuelle Abdeckung und erzwingt Vorbereitung. Für FGN-Zielpositionen wird schon jede Änderung neu geprüft. Vollständige Besitzer-ID wird verfolgt, einschließlich A zu B auf einem dritten Client. Direkter lokaler Sync-Sprung über einen Millimeter invalidiert die Lease; gewöhnliche entfernte Interpolation erzeugt keine zusätzliche volle Vorbereitung. Andere Netzwerkobjekte werden nicht nach Guards durchsucht. Kein Guard pro Bauteil.
Technischer Hintergrund: HarmonyX führt alle Prefixes aus. Deshalb wird PUPs gemeinsame Mob-Vorbereitung abgefangen; Sync-Postfix nach FGN.
Logs
Konfigurationsdatei: BepInEx/config/botanic.pup.patch.cfg.
[Diagnostics]
EnableLogs = false
Standardmäßig keine eigenen Start-, HOLD-/RELEASE-, Besitzerwechsel-, Warn- oder
Fehlerlogs. BepInEx, PUP und FGN haben ihre eigenen Logeinstellungen.
Für Fehlersuche optional EnableLogs = true setzen; bei Bedarf neu starten.
Dann erscheinen auch OWNER CHANGE, SYNC RECHECK und FGN destination pending.
Warnung nach zehn Sekunden Hold, danach alle 30 Sekunden.
Bei internem Fehler werden eigene Sperren freigegeben und der Zusatzmod deaktiviert;
bei ausgeschalteten Logs geschieht dies ohne eigene Fehlermeldung.
Prüfung und Dedicated-Test
Build und 180 automatisierte Assertions bestanden: bisherige 164 Guard-
Prüfungen und 16 neue Prüfungen der Kristallauswahl einschließlich tatsächlicher
Harmony-Postfix-Aufrufkette auf isolierten Client-/Dedicated-Fixtures.
Die Hashfunktion stammt aus der installierten assembly_utils.dll.
Isolierter .NET-Test von
100.000 Metadatenprüfungen: bisher 53,5 ms / 14.400.000 Bytes Allokationen,
optimiert 12,3 ms / 0 Bytes nach Aufwärmen. Das misst den untersuchten Abfragepfad,
keine Valheim-Framerate und keine Unity-/Server-Gesamtlast.
Echter Unity-/Dedicated-Ablauf noch nicht bestätigt. Mit Weltkopie testen: Cart, gezähmtes Tier, wildes Monster und ausschließlich am Cluster abgestützte Bauteile. Mehrmals einloggen, weit weg und zurückgehen, zweiten Spieler beitreten lassen. Danach normale Bewegung, AI und Statik prüfen. Wirklich frei schwebende Bauteile müssen weiterhin Schaden nehmen.
Für FGN Balance Creature Ownership eingeschaltet lassen. Zwei Spieler in
Reichweite eines wilden Monsters verwenden und tatsächliche Übergabe auslösen.
Optional Diagnose anschalten: Erst OWNER CHANGE bestätigt den Übergabefall.
Gezähmte Tiere und Carts verteilt FGNs zusätzlicher Mob-Balancer nicht; sie
behalten den allgemeinen Guard und Netzwerk-Sync-Schutz.
Bereits falsche Netzwerkpositionen werden nicht nach oben zurückgesetzt; verlorene Objekte werden nicht rekonstruiert. Der jeweilige Simulationsbesitzer muss den Patch installiert haben. Andere FGN-Versionen sind nicht pauschal blockiert, aber nicht als geprüft einzustufen.
Paket und Rückweg
Struktur wie SmartContainersIgnore-1.3.0.zip:
BotanicPupPatch.dll
README.md
manifest.json
icon.png
Entfernen: Spiel/Server beenden und Zusatz-DLL löschen. Keine neuen Weltdaten bleiben zurück. Eine vorher veränderte PUP-DLL wird dadurch nicht zurückgesetzt; für deren ursprüngliches Verhalten PUP FPS 1.0.33 original installieren.