Notes
Description Just bringing back a missed feature that was available in an earlier version of the game. I started working on this in 1.06 as a proof of concept and a neat idea to bring back to the community, and had my own full system worked out. In 1.07 the developers at Bohemia Interactive started introducing a new back bones for notes in vanilla, so I dumped the majority of what I worked on for Notes, and picked up… (more)
Description Just bringing back a missed feature that was available in an earlier version of the game. I started working on this in 1.06 as a proof of concept and a neat idea to bring back to the community, and had my own full system worked out. In 1.07 the developers at Bohemia Interactive started introducing a new back bones for notes in vanilla, so I dumped the majority of what I worked on for Notes, and picked up the new vanilla implementation and made it better, so instability could possibly happen as official updates go on, but I'll try my best on staying on top and bringing a pleasing looking UI and unique features to this mod. I'm so excited to see how such a simple feature can spark ideas and interactability, post your ideas and experiences with notes below if you feel like sharing! Treasure hunts, trolling, stories, lore, you name it! Features - The ability to place notes or paper - Can read notes from hand or by targeting - Can write on paper while in inventory (crafting) or by targeting - Pen colors are now localized and descriptive to their color - Pen colors show up while writting and reading a note - Notes are logged server side in the server profile (name, steam64ID, and message) - When writting on paper, it is transformed into a WrittenNote (for persistency configuration) Planned Features - Journal/Notebook to store multiple notes in. - Pens will lose their durability when used. - Server configurability and admin permissions. - More pen colors? - Drawing (a big maybe, performance will have to be tested). - Admin notes, that can be spawned via init.c (static props, cannot be picked up). - Admin menu and options for ingame abuse control (blacklisting players, deleting notes, cords). Known Issues - Not fully localized (contact me if you'd like to help). - Notes/Paper don't place flush on surfaces (if anyone could help me out with making this better, please contact me!) - Same animation is used for reading/writting notes when a pen is in hand. - The UI scales to resolution, which means text can get out of line if viewing notes from someone who is using a different resolution. The UI was built for 1080p and up, any lower might result in cramming and text going off the UI. - Minor sync issues with notes/paper in community offline mode (singleplayer). I don't have time currently to fix these solvable issues, in admist to the current pandemic, but I will try to get them fixed sometime soon™ Special Thanks NiiRoZz - a bit of scripting help and singleplayer compatibility Steve aka Salutesh - motivation and ideas Bohemia Interactive - for the base scripting for notes (vanilla) Thank you all who participated in the initial poll and to those who donated prematurely! Usage & Terms This item is NOT authorized (strictly forbidden) for any of these conditions: - posting on Steam, except under the Steam account officialwardog. - hosting on any download server other than Notes' current workshop download. - hosting on any launcher for distribution other than Notes' current workshop download. - to be packaged in any form other than Notes' current workshop download. - to create derivative works. PERMISSION IS NOT GRANTED FOR THIS MOD TO BE INCLUDED IN A "SERVER PACK" or "MOD PACK" or "REPACK". Use a Collection if you want to include this mod on your server for your users. Monetization while using this mod is approved. Copyright 2019-2024 Wardog All rights reserved
No file I/O on hot paths, no timers created per event, no per-player-per-frame hooks.
7 chain breaks, all on specific classes the mod replaces wholesale — matters only if another mod patches the same classes.
less than 0.001% of each server frame at 100 players (0.001 ms/s). Counts hook dispatch and timers only, not what the hooks do inside. Methodology.
Structural load of the 328 scripted mods analyzed, lightest on the left. This mod's bar is lit; 22 others share it. Ranked list.
Event hooks carry 99.8% of this mod's structural load. 0.001 ms/s in all.
6 hooks · 0.0012 ms/s
| Event hooksrun when something happens: an inventory move, a hit, an action | 6 hooks | 0.0012 ms/s | 99.8% | ActionDeployObject.ActionCondition, ActionReadPaper.ActionCondition, ActionTakeItem.ActionCondition and 3 more |
Counts how often each hook is dispatched and how many timers stay alive, not what the code inside does. Some rates are order-of-magnitude estimates; the methodology lists which.
Chain breaks, by consequence
7 overrides that skip super(), ranked by how much they can affect. On any server a break replaces vanilla's behaviour on that method and silences every earlier-loaded mod hooking it.
InitNoteRead · InitNoteWrite
Only this class is affected. Matters only if another mod in your stack patches the same class.
1 class
NoteMenu2 locations
Scripts.pbo::5_Mission\GUI\NoteMenu.c:20Scripts.pbo::5_Mission\GUI\NoteMenu.c:41OnStartClient · OnStartServer
Only this class is affected. Matters only if another mod in your stack patches the same class.
1 class
ActionWritePaper2 locations
Scripts.pbo::4_World\Classes\UserActionsComponent\Actions\ActionWritePaper.c:37Scripts.pbo::4_World\Classes\UserActionsComponent\Actions\ActionWritePaper.c:46OnStateChange
Only these classes are affected. Matters only if another mod in your stack patches the same classes.
2 classes
ActionReadPaperCB, ActionWritePaperCB2 locations
Scripts.pbo::4_World\Classes\UserActionsComponent\Actions\ActionReadPaper.c:3Scripts.pbo::4_World\Classes\UserActionsComponent\Actions\ActionWritePaper.c:3OnRPC
Only this class is affected. Matters only if another mod in your stack patches the same class.
1 class
WrittenNoteData1 location
Scripts.pbo::4_World\Classes\WrittenNoteData.c:14Where this mod runs often
Hooks on per-frame and high-rate surfaces, with what their bodies call. Body work, not the hook itself, is what costs frame time.
Other findings
super() only on some paths · 2 · warning
- ActionDeployObject.SetupAnimation calls super.SetupAnimation() only on some paths — on the others the chain below this mod is dropped.
Scripts.pbo::4_World\Classes\UserActionsComponent\Actions\ActionDeployObject.c:13 - ActionTakeItem.ActionCondition vetoes early (returns false) on some paths and defers to super.ActionCondition() otherwise — composes safely with vanilla's and earlier mods' conditions.
Scripts.pbo::4_World\Classes\UserActionsComponent\Actions\ActionTakeItem.c:3
- ActionDeployObject.SetupAnimation calls super.SetupAnimation() only on some paths — on the others the chain below this mod is dropped.
Checks answered without super() · 2 · warning
- ActionReadPaper.ActionCondition returns its own answer without consulting super.ActionCondition() — vanilla's conditions on this check, and those of every earlier-loaded mod, no longer apply. Intended when a mod owns the rule outright; otherwise it is how another mod's restriction quietly stops working.
Scripts.pbo::4_World\Classes\UserActionsComponent\Actions\ActionReadPaper.c:22 - ActionWritePaper.ActionCondition returns its own answer without consulting super.ActionCondition() — vanilla's conditions on this check, and those of every earlier-loaded mod, no longer apply. Intended when a mod owns the rule outright; otherwise it is how another mod's restriction quietly stops working.
Scripts.pbo::4_World\Classes\UserActionsComponent\Actions\ActionWritePaper.c:29
- ActionReadPaper.ActionCondition returns its own answer without consulting super.ActionCondition() — vanilla's conditions on this check, and those of every earlier-loaded mod, no longer apply. Intended when a mod owns the rule outright; otherwise it is how another mod's restriction quietly stops working.
Which vanilla methods the mod hooks, which of them drop the chain, how often each hook fires, and which risky calls sit inside hot hooks.
How long hook bodies take, network cost, or engine-side load. Measured across live fleets, most server lag comes from the engine and world state, not mod script chains — a light footprint does not clear a mod of lag, and a heavy one does not convict it. Methodology.
Everything else
All 18 overrides
Surface is the dispatch tier the rubric can price (— = unpriced); server is whether the override exists on a dedicated server; super() shows whether the vanilla chain is preserved on a server.
| method | surface | server | super() | where |
|---|---|---|---|---|
ActionConstructor.RegisterActions |
— | yes | ✓ | Scripts.pbo::4_World\Classes\UserActionsComponent\ActionConstructor.c:3 |
ActionDeployObject.SetupAnimation |
— | yes | conditional | Scripts.pbo::4_World\Classes\UserActionsComponent\Actions\ActionDeployObject.c:13 |
ActionDeployObject.ActionCondition |
T2 | yes | ✓ | Scripts.pbo::4_World\Classes\UserActionsComponent\Actions\ActionDeployObject.c:24 |
ActionDeployObject.OnFinishProgressServer |
— | yes | ✓ | Scripts.pbo::4_World\Classes\UserActionsComponent\Actions\ActionDeployObject.c:35 |
ActionReadPaper.ActionCondition |
T2 | yes | ✗ none | Scripts.pbo::4_World\Classes\UserActionsComponent\Actions\ActionReadPaper.c:22 |
ActionReadPaperCB.OnStateChange |
— | yes | ✗ none | Scripts.pbo::4_World\Classes\UserActionsComponent\Actions\ActionReadPaper.c:3 |
ActionTakeItem.ActionCondition |
T2 | yes | conditional | Scripts.pbo::4_World\Classes\UserActionsComponent\Actions\ActionTakeItem.c:3 |
ActionWritePaper.ActionCondition |
T2 | yes | ✗ none | Scripts.pbo::4_World\Classes\UserActionsComponent\Actions\ActionWritePaper.c:29 |
ActionWritePaper.OnStartClient |
— | yes | ✗ none | Scripts.pbo::4_World\Classes\UserActionsComponent\Actions\ActionWritePaper.c:37 |
ActionWritePaper.OnStartServer |
— | yes | ✗ none | Scripts.pbo::4_World\Classes\UserActionsComponent\Actions\ActionWritePaper.c:46 |
ActionWritePaperCB.OnStateChange |
— | yes | ✗ none | Scripts.pbo::4_World\Classes\UserActionsComponent\Actions\ActionWritePaper.c:3 |
NoteMenu.Init |
— | yes | ✗ none | Scripts.pbo::5_Mission\GUI\NoteMenu.c:5 |
NoteMenu.OnHide |
— | yes | ✓ | Scripts.pbo::5_Mission\GUI\NoteMenu.c:13 |
NoteMenu.InitNoteRead |
— | yes | ✗ none | Scripts.pbo::5_Mission\GUI\NoteMenu.c:20 |
NoteMenu.InitNoteWrite |
— | yes | ✗ none | Scripts.pbo::5_Mission\GUI\NoteMenu.c:41 |
Paper.SetActions |
T2 | yes | ✓ | Scripts.pbo::4_World\Entities\ItemBase\Paper.c:3 |
PluginManager.Init |
— | yes | ✓ | Scripts.pbo::4_World\Plugins\PluginManager.c:3 |
WrittenNoteData.OnRPC |
T2 | yes | ✗ none | Scripts.pbo::4_World\Classes\WrittenNoteData.c:14 |
Dispatch surfaces and timers the grade prices
| surface | tier | rate (Hz) | rate source | ms/s |
|---|---|---|---|---|
ActionDeployObject.ActionCondition | T2 | 8.0 | placeholder | 0.0002 |
ActionReadPaper.ActionCondition | T2 | 8.0 | placeholder | 0.0002 |
ActionTakeItem.ActionCondition | T2 | 8.0 | placeholder | 0.0002 |
ActionWritePaper.ActionCondition | T2 | 8.0 | placeholder | 0.0002 |
WrittenNoteData.OnRPC | T2 | 8.0 | placeholder | 0.0002 |
Paper.SetActions | T2 | 8.0 | placeholder | 0.0002 |
Includes 0.001 ms/s from placeholder-rated surfaces.
Load-order constraints (CfgPatches)
What each PBO declares: its addon identity and the addons it requires to be loaded first (requiredAddons). A partial load-order signal from the mod's own metadata.
GUI.pbo
Notes_GUI— no requiredAddons
Gear.pbo
Notes_Gear— requiresDZ_Gear_Tools,DZ_Gear_Consumables
LanguageCore.pbo
Notes_LanguageCore— no requiredAddons
Scripts.pbo
Notes_Scripts— no requiredAddons
census 1.1 · findings 1.1 · hash fe381347d7c1646b