tiggertoo.uk / DayZ Mods / TT Fishing / Server Manual
TT Fishing · Workshop 3788393106 · Server Manual

TT Fishing Server Manual

A config-driven overhaul of DayZ rod fishing, built on top of gebsfish: gear-driven catch quality, per-species lure preferences and feeding hours, seasonal salmon runs, rod wear, and craftable water-specialised rods. Every lever is a JSON value, hot-reloadable, and synced to clients automatically.

What it changes

Installation

Files the mod writes at boot

On every server start the mod exports two reference files beside its log:

File in $profile:TTFishing\What to do with it
ttfishing-types.xmlRecommended CE types: the fishing-junk pool (Wellies ×4, Pot) at 30-minute lifetimes, plus registration entries (nominal 0) for the eight craft-only rods. Copy into your mission and register — snippet below. The junk entries replace your db/types.xml entries for those classnames, so review the spawn values for your map.
gebs-fishingsettings-recommended.jsonThe tuned gebsfish settings this mod was balanced against: per-species rarity weights from real-world biology, fillet counts from real fish sizes, calmer predators. Copy over $profile:Gebs\fishingsettings.json to adopt.
<ce folder="CustomTypes/TTFishing">
    <file name="ttfishing-types.xml" type="types" />
</ce>

Without the rod types registered, the crafted rods are unknown to CE and their cleanup behaviour is undefined. This is the one step you must not skip if players can craft the rigged rods.

The gebs side: what the recommended settings encode

TT Fishing deliberately splits the work with gebsfish. gebs owns which fish exist — species, catch weights, meat counts, environments — through its own fishingsettings.json. TT Fishing owns how catching them behaves — quality, pacing, seasons, wear — layered on top. The exported gebs-fishingsettings-recommended.json is not arbitrary tuning; each field family was rebuilt from real-world data:

gebs fieldWhat we based it on
CatchProbability (1–25 per species)Real-world rarity. How common each species actually is to hook in its habitat — panfish like bluegill sit at the top weights, apex trophies like marlin at the bottom. This is the selection weight the engine draws from, so it directly sets how often each species turns up.
MeatMin / MeatMaxReal adult fish size. Fillet counts scale with what the species actually yields on a cleaning table: a bluegill gives one or two fillets, a chinook six-plus, a marlin a small feast. Combined with rarity-driven pricing this is why a rare large fish is a payday and a rare small one is a curiosity.
Environment (1 / 2 / 3)Real habitat. 1 = freshwater only, 2 = sea only, 3 = both. The four anadromous species — the salmons and steelhead — are Environment 3 in gebs (catchable in both waters), and it is exactly these that TT Fishing's RunMonths system migrates: gebs makes both waters possible, TT Fishing gates which water by month, so out of season they are sea fish and in the run they pack into fresh water, like the real animals.
PredatorSettings / PredatorsCalmed to occasional single-animal encounters (a few percent per catch or fillet) rather than routine pack attacks. Retune to taste; it is independent of everything above.

The same biology drove the TT-side species data: each species' CycleMult (how hard it fights the clock) and feeding Curve (day / dawn-dusk / night) come from how the real fish behaves, not from a spreadsheet's convenience. The two files are a matched set — if you adopt one and heavily rework the other, the “rare + hard = valuable” economics stop lining up.

Config.json reference

$profile:TTFishing\Config.json — written with code defaults on first boot. Hot-reloaded within ReloadPollSeconds of any edit; a file that fails to parse is refused and the running config kept. Every reload is re-broadcast to all connected clients.

KeyDefaultMeaning
DebugLogtruePer-catch composition lines in $profile:TTFishing\Log.txt. Feed for catch analysis; turn off once tuned if you want quiet logs.
ReloadPollSeconds30Hot-reload poll interval. 0 disables.
BaseQuality0.25Quality floor every catch starts from.
HatBonus / HatClassNames0.05 / geb hatsWorn-headgear bonus, matched by IsKindOf.
SignalCycleTarget5Soft cycle count to the guaranteed bite (vanilla's is ~19). Bypasses vanilla's clamps.
SignalDurationMin/Max0.8 / 1.2Bite-signal window, seconds.
CycleSecondsFastest/Slowest3 / 8Bite-cycle length bounds the curves stretch across.
MaxCatchSeconds80Hard ceiling on time-to-guaranteed-bite. 0 disables the ceiling.
JunkWeightScale0.1Multiplier on registered junk weights (floor 1 — junk never fully vanishes).
FishKnifeCutTimeMult0.5Fillet-recipe duration multiplier with a fish knife. 1.0 = vanilla speed.
FishKnifeWearMult0.5Knife damage multiplier per fillet with a fish knife.
FishKnifeClassNamesgeb_FishKnife_BaseWhat counts as a fish knife (IsKindOf).
Rods[]ClassName, Quality, optional QualitySea/QualityFresh (−1 = use flat), WearPerCastPercent. Matched by IsKindOf; exact classname wins, otherwise the last matching entry — order base → derived.
Attractors[]Label, ClassNames[] (hooks/lures/baits, IsKindOf), Value (quality for every fish), Bonus + BonusFish[] (extra for listed species, by spawned-item classname). Bait on the hook wins over the hook itself.
Species[]YieldType (spawned item classname, e.g. Carp, geb_SunFish), CycleMult (difficulty), Curve (day | crepuscular | night), RunMonths[] (anadromous only).
CurveDay/Crepuscular/Night24 floats eachBite-speed multiplier per hour; higher = faster bites. Cycle length = midpoint(fastest, slowest) × CycleMult ÷ curve[hour], clamped by the ceiling.

The quality budget

Quality clamps to 1.0 (maximum-size fish). Shipped budget: base 0.25 + gebs rod 0.15 + correct attractor 0.60 = exactly 1.0; a vanilla rod (0.10) reaches it with a hat (0.05). Rigged rods are 0.20 in their home water and 0.05 in the wrong one. Keep any retune summing to 1.0 for your intended “perfect setup”, and remember the improvised rod (0.0) is meant to cap short of it.

Client sync — do not skip this understanding

DayZ's fishing minigame runs in deterministic lockstep on client and server: both sides step the same state machine from a synced random stream, and the server judges the player's reaction against its own signal timing. Any config value that feeds selection or timing must therefore be identical on both sides — a mismatch makes every fish read as an empty catch.

The mod handles this for you: the server pushes its full config to every client at connect and after every hot reload. It is why config lives server-side only and there is nothing to distribute to clients.

Reading the debug log

$profile:TTFishing\Log.txt (rewritten each boot). The lines and what they answer:

LineMeaning
config loaded: 45 species…Boot parse succeeded; counts confirm your file was read.
config sync -> <player>That client received the running config at connect.
hot reload: new config installed / HOT RELOAD REFUSEDLive edit accepted (and re-broadcast) or rejected with the parse error; a refused reload keeps the previous config running.
quality <species> = base + gear + attractor -> NOne catch's full composition — the analysis feed for what players catch with which gear.
run gate: <species> month M … excludedThe seasonal filter removing an anadromous species from the wrong water.
rod wear N% -> <rod>Wear applied after a bite (landed or escaped).
fish knife <knife>: wear -4 -> -2Fillet-recipe knife damage after the fish-knife multiplier.

Economy notes