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.
BoostDrop
Server-authoritative per-player boosts with optimized damage contribution attribution, runtime policy sync, temporary grants and admin tools.
CHANGELOG
Changelog
2.1.1
- Fixed Windows build failure caused by a missing
BoostDrop.Modelsimport inGroundPickupService. - Fixed nullable warnings in Jotunn configuration synchronization and
GameObjectresult handling. - Hardened
build-boostdrop.ps1: nativedotnet restore/buildfailures now stop immediately instead of continuing toCopy-Itemand reporting a misleading missing-DLL error. - No gameplay-rule change from 2.1.0; this is a build/validation fix for the P0-P2 refactor.
2.1.0
- Refactored damage attribution into a dynamic
Dictionary-based contribution ledger designed for 30+ players without fixed contributor slots. - Damage attribution now accepts only a real
Playerresolved directly fromHitData; network owner, nearby players and local-player guessing are never used as combat attribution. - Added effective-damage correction from target HP before/after the hit when a compatible health accessor is available; overkill is clamped to remaining health.
- Removed per-hit ZDO writes. Contributions stay in RAM and are persisted through compact, budgeted checkpoints (350 ms cadence, bounded targets per pass).
- Added checkpoint migration handling so network ownership changes do not decide reward identity.
- Non-player final damage keeps the reward vanilla, including targets that already carried a checkpoint from a previous owner.
- Separated contribution data from player policy data. Config/YAML/grant reloads no longer erase an in-progress boss/resource contribution ledger.
- Added
EffectivePolicyCacheso group/YAML/grant resolution is not performed in the damage hot path. - Added
RuntimeIdentityDirectorythat keeps peer UID, runtime player ID and platform user ID separate. - Added initial runtime-policy snapshots plus compact per-player deltas for joins/grants/revokes/disconnects.
- Fixed reconnect/stale identity collisions and policy-cache removal for disconnected peers.
- Reworked Pickable/PickableItem attribution to use the routed RPC sender rather than current ZDO owner/local player.
- Reworked loose ground pickup with a one-time processed marker to prevent drop/pickup multiplication exploits.
- Reworked chest loot to use a persistent ZDO processed marker instead of an unbounded static
HashSet. - Reworked
DropBoostContextinto a generation-token reward context with exception finalizers, preventing leaked nested contexts after Harmony failures. - Added watcher restart/debounce/retry behavior and last-known-good YAML preservation.
- Suppressed watcher echoes caused by BoostDrop's own grant-file writes, avoiding redundant full reload/snapshot traffic.
- Removed the unimplemented Building placeholder category.
- Renamed Farming behavior internally to PlantGrowth; legacy YAML
farmingremains supported for compatibility. - Added
boostdrop perfcounters for contribution tracking, checkpointing, policy cache and policy network traffic without per-hit logging. - Updated source/build/package metadata to 2.1.0 and included the 256x256 BoostDrop icon.
2.0.4
- Replaced last-hit/network-owner creature attribution with a cumulative damage contribution ledger. The highest-damage Player receives the reward policy.
- Strict vanilla fallback: if the current damage attacker is not a real
Player, BoostDrop does not attribute that hit; a non-player killing hit leaves the resulting reward vanilla. - Mining/wood damage paths now use the same contribution model for
MineRock,MineRock5,TreeBase,TreeLogand supportedDestructibletargets. - ZDO/network ownership is never used as reward ownership. Nearby players can own the network object without stealing another player's multiplier.
- Added a resolved runtime policy directory so a client that currently owns a world object can apply the winning remote player's policy without any per-hit BoostDrop RPC. Raw permissions/grants YAML remains server-only.
- Damage totals are checkpointed compactly in the target ZDO so ownership migration does not erase earlier contributors; ZDO owner is transport/state only, never reward identity.
- Runtime
Player.GetPlayerID()is reported during the existing policy request only as a lookup key; the server still resolves the effective policy from the authenticated peer identity. Contributor name is persisted once per target/player as a fallback. - Hot-path optimization: O(1) dictionary updates per eligible hit, leader maintained incrementally, no player scans/YAML reads/RPCs/log strings per hit, no per-entity
Update. - Contribution cleanup is global, incremental (128 targets/minute tick), 10-minute stale timeout and an 8192-target safety cap.
- Runtime policy changes/grants invalidate in-memory policy caches; persisted damage totals remain attached to the target and are re-evaluated with the current policy.
- Build helper defaults to
F:\SteamLibrary\steamapps\common\Valheim dedicated server;BUILD-2.0.4.batuses that script default instead of overriding it.
2.0.3
- Fixed live configuration updates becoming inconsistent until a server restart. Runtime policy refresh is now delayed until Jotunn configuration synchronization completes.
- Reworked YAML hot reload to wait for a quiet filesystem window, retry partial saves, preserve last-known-good permissions/grants on parse failures, and restart watchers when paths/settings change.
- Fixed dedicated-server player attribution: routed peer UID is resolved to the correct platform ID/name instead of falling back to an unrelated
Playerobject. - Fixed per-player multipliers leaking/collapsing so players with different x values are evaluated independently.
- Fixed
PickableandPickableItemon Valheim 1.0.x by resolvingRPC_Picksender identity directly on the authoritative instance. - Prevented double multiplication of Pickable extra drops.
- Item/mob overrides are now evaluated even when the category base multiplier is x1.
- Added deterministic context cleanup across config/network lifecycle changes and Harmony exception finalizers so failed patched methods cannot poison the next event.
- Build helper now defaults to
C:\\ValheimServer, removes the stale machine-specific active props file, and no longer contains the accidental trailing/initoken.
2.0.2
- Valheim 1.0.7 network compatibility: removed BoostDrop's dependency on
Jotunn.Entities.CustomRPCfor policy/admin traffic. - Personalized policy request/push now uses Valheim's native
ZRoutedRpc.Register<ZPackage>andInvokeRoutedRPCdirectly. - Admin GUI request/response now also uses native
ZRoutedRpc. - No BoostDrop network path uses
ZRoutedRpc.Everybody; every packet is addressed to the concrete server/client peer UID. - RPC registration is bound to the current
ZRoutedRpcinstance and automatically re-registers after reconnect/world changes. - Preserved the privacy boundary: clients receive only their own resolved effective policy, never the permissions/grants YAML.
- Preserved server-side admin validation and sender validation for policy/admin responses.
- Fixes the runtime failure
MissingFieldException: Field not found: .ZRoutedRpc.Everybodyoriginating from Jotunn 2.29.2CustomRPC.SendPackageon Valheim 1.0.7.
2.0.1
- Fixed dedicated-server online player resolution. Grants/checks/policy sync now resolve connected users from
ZNetPeerinstead of requiring a remotePlayerGameObject on the server. - Steam/platform identity is read from the peer socket host identity used by Valheim's admin/ban lists; name-based fallback remains available.
- Grant/Update and Revoke immediately push the recalculated personalized policy to the connected target peer.
- Initial client policy requests no longer fail when the dedicated server has no instantiated remote Player object.
- Client no longer compares SteamID64 policy identity against
Player.GetPlayerID()(they are not the same identity domain). - Added verbose policy-send logging when
EnableLogging=true.
Build tooling fix (2026-09-04)
- Linux build discovers
Jotunn.dllrecursively underBepInEx/plugins. - Linux build passes the real Valheim/BepInEx/Jotunn paths to MSBuild, overriding stale Windows
BuildLocal.props. - Project paths use cross-platform separators and include Unity UI support modules when present.
2.0.0
- Refeito o modelo de rede para cliente + servidor com autoridade do servidor.
- Jötunn passou a ser dependência obrigatória.
- Config funcional usa Jötunn ConfigSync/admin-only; servidor prevalece sobre clientes comuns.
- Removido o antigo sync do YAML completo (
BoostDrop_SyncPermissions). BoostDrop_permissions.yamlagora é estritamente privado do servidor.- Novo
BoostDrop_grants.yaml, também privado do servidor, para permissões temporárias. - Cliente recebe somente sua própria política efetiva já resolvida, em memória.
- RPC de política aceita dados apenas do peer real do servidor.
- RPC de administração aceita ações apenas de peers que o servidor confirma em
adminlist.txt. - Nova GUI admin em F8 com grant/update, revoke, check, list, reload e cleanup.
- Novos comandos
boostdrop grant/revoke/check/list/reload/cleanup/gui/mee aliases com ponto. - Grants temporários aceitam
30m,12h,7d,2w, número puro em dias,permanente data ISO/UTC. - Multiplicadores agora suportam decimais com arredondamento probabilístico da fração.
- Nova categoria
mobdrop, com override por mob e por item. - Mantidas
mining,wood,fishingepickable. - Removidos hooks genéricos de
ItemDrop/pickup para impedir exploit de jogar stack no chão e multiplicar ao pegar novamente. - Refeito o watcher de YAML para executar reload/sync na thread principal.
- YAML
untilinválido falha fechado: regra não fica ativa/permanente por erro de digitação. - Preservada compatibilidade com
userIds,players,playerDetails,groups,categories,itemseuntilda 1.x. - YamlDotNet local é usada no build quando disponível, com fallback para NuGet.
1.2.1
- Fix crítico: servidor dedicado + PlayFab — pedras/árvores pertencem ao cliente (ZDO owner);
DropTable.GetDropListcorre no cliente, não no servidor. Boost passa a aplicar também no cliente remoto (Player.m_localPlayer). - Comandos
boostdrop.checkpassam a escrever noLogOutput.log(além do chat).
1.2.0
- Fix: servidor dedicado + PlayFab — resolução do jogador via
HitData.m_attacker,GetConnectedPeers, nome do peer e fallback com 1 jogador online. - Fix:
Destructible.RPC_Damagepassa a propagar osender.
1.1.0
- Categorias mineração, lenha, pesca e colheita.
- YAML expandido com grupos,
playerDetails, itens euntil. - Reload automático e comandos básicos.
1.0.0
- Versão inicial: boost por jogador em mineração e lenha.
2.0.0 buildfix2
- Fixed compilation against the stock Valheim 0.221.12 dedicated-server assemblies (non-publicized).
- Replaced private
CharacterDrop.m_characteraccess withGetComponent<Character>()/ parent lookup. - Replaced private
ZRoutedRpc.GetServerPeerID()access with publicZNet.GetServerPeer()?.m_uidresolution. - Tightened nullable handling in drop/config/grant parsing paths.