This commit is contained in:
2026-07-21 22:06:10 +00:00
parent afc64b83c1
commit 5215560ede
25 changed files with 4364 additions and 333 deletions
@@ -0,0 +1,374 @@
# Conduit Linux Accumulated Re-run - 2026-06-15
## Scope
- Pulled all accumulated commits from `origin/main`.
- Inspected the changed files and current `docs/linux-bringup.md`.
- Rebuilt Conduit on Linux with GCC 12.
- Deployed to CS2 server `Test Sunucusu`.
- Verified the new timer, chat interception, usermessage/chat-send, and console adopt paths.
- Cleaned temporary test subscriptions/timers/commands.
- Satisfactory server was not modified.
## Git
Previous local HEAD before this run:
```text
bb58461 Phase 2: dynamic console commands + convar access
```
Pulled commits:
```text
43855ff PLAN: chat ships plain (white) via UTIL_SayTextFilter; color is a follow-up
8afbeec chat: send via UTIL_SayTextFilter again (plain text works; SayText2 shows nothing)
faded69 docs: refresh README (Phase 2 status + what works) and PLAN chat-send entry
18e7970 chat colors: prefer UTIL_SayText2Filter (renders color codes)
1743147 PLAN: chat send visually verified on Windows (msgType 0 = chat); colors pending
4b3d322 PLAN: correct the chat-send entry (native UTIL_SayTextFilter, SDK drift finding)
4ba6019 chat sending: call native UTIL_SayTextFilter instead of building the usermessage
a4af862 Phase 2: usermessages + chat sending (SayText2)
6985830 Phase 2: chat interception (say / say_team)
a375e05 Phase 2: game-thread timers driven by GameFrame
62e4ca0 Close out Linux verification of the Commands & ConVars slice
15cc25e console: track adopted convars under their owner
```
Diff summary:
```text
PLAN.md | 8 +-
README.md | 17 +++-
core/CMakeLists.txt | 3 +
core/src/conduit/chat.cpp | 165 ++++++++++++++++++++++++++++++++++++++
core/src/conduit/chat.h | 46 +++++++++++
core/src/conduit/commands.cpp | 131 ++++++++++++++++++++++++++++++
core/src/conduit/console.cpp | 23 +++++-
core/src/conduit/timers.cpp | 181 ++++++++++++++++++++++++++++++++++++++++++
core/src/conduit/timers.h | 47 +++++++++++
core/src/conduit/usermsg.cpp | 147 ++++++++++++++++++++++++++++++++++
core/src/conduit/usermsg.h | 23 ++++++
core/src/plugin.cpp | 16 ++++
docs/linux-bringup.md | 76 +++++++++++++++---
gamedata/core.json | 15 +++-
```
Working tree after the run:
```text
## main...origin/main
```
## Build
Command:
```sh
cmake -S /root/codex/Conduit -B /root/codex/Conduit/build/linux-rerun -G Ninja \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_C_COMPILER=gcc-12 \
-DCMAKE_CXX_COMPILER=g++-12
cmake --build /root/codex/Conduit/build/linux-rerun
```
Result: build and link succeeded.
```text
-- Configuring done
-- Generating done
-- Build files have been written to: /root/codex/Conduit/build/linux-rerun
[1/7] Building CXX object core/CMakeFiles/conduit.dir/src/conduit/timers.cpp.o
[2/7] Building CXX object core/CMakeFiles/conduit.dir/src/conduit/commands.cpp.o
[3/7] Building CXX object core/CMakeFiles/conduit.dir/src/conduit/usermsg.cpp.o
[4/7] Building CXX object core/CMakeFiles/conduit.dir/src/conduit/console.cpp.o
[5/7] Building CXX object core/CMakeFiles/conduit.dir/src/conduit/chat.cpp.o
[6/7] Building CXX object core/CMakeFiles/conduit.dir/src/plugin.cpp.o
[7/7] Linking CXX shared library package/addons/conduit/bin/conduit.so
```
Only warning observed:
```text
/root/codex/Conduit/core/src/conduit/commands.cpp:521:13: warning: compound assignment with volatile-qualified left operand is deprecated [-Wvolatile]
```
No failed CMake/Ninja output exists because the build passed.
## Deploy And Load
Deployed:
```text
/root/codex/Conduit/build/linux-rerun/package/.
```
To:
```text
/var/lib/gamepanel/servers/c2b47a90/game/csgo/
```
Load checks:
```text
--- meta list ---
Listing 1 plugin:
[01] Conduit (0.1.0-dev) by Conduit Contributors
--- conduit_status ---
Conduit 0.1.0-dev
uptime : 73.6 s
game frames : 3983
log file : /home/steam/cs2-dedicated/game/csgo/addons/conduit/logs/conduit-20260615.log
crash report: armed (use conduit_crash_test to verify)
```
Gamedata and usermessage function resolution:
```text
--- conduit_gamedata ---
gamedata: 1 files, 2 signatures, 0 offsets
[ok] UTIL_SayText2Filter server 0x7fd2de250b30 (core.json)
[ok] UTIL_SayTextFilter server 0x7fd2de2508d0 (core.json)
--- conduit_usermsg ---
[Conduit] [INFO] usermsg: chat sending live via UTIL_SayTextFilter (0x7fd2de2508d0) - plain text, no color yet
usermessages: chat sending live (SayText2 resolved, SayText resolved)
```
Startup log:
```text
2026-06-15 10:50:26 [INFO] gamedata: 1 files loaded: 2 signatures, 0 offsets, all valid
2026-06-15 10:50:27 [INFO] entity: armed via CGameEntitySystem vtable 0x7fd2dec4ffd8
2026-06-15 10:50:27 [INFO] gameevents: armed via CGameEventManager vtable 0x7fd2dec50f50
2026-06-15 10:50:27 [INFO] chat: ready - hook installs on first subscriber
2026-06-15 10:50:27 [INFO] core: Conduit 0.1.0-dev loaded - crash reporter armed, profiler on
2026-06-15 10:50:27 [INFO] gameevents: game event manager connected (0x7fd2defd0460)
2026-06-15 10:50:37 [INFO] core: first GameFrame observed - hook dispatch confirmed
```
Entity system still resolves on Linux at `GameResourceServiceServerV001+0x50`:
```text
--- conduit_entity ---
[Conduit] [INFO] entity: entity system connected (0x7fd2da446000) via GameResourceServiceServerV001+0x50 - vtable matches CGameEntitySystem
entity system: connected
slot 0 cs_player_controller team=2 pawn=player health=100
slot 1 cs_player_controller team=3 pawn=player health=100
```
## Timer Tests
Schedule/list:
```text
--- conduit_timer_after 2 ---
[Conduit] one-shot timer #1 scheduled in 2.00 s
--- conduit_timer_every 1 ---
[Conduit] repeating timer #2 every 1.00 s (stops after 5)
--- conduit_timers ---
timers: 2 active
#1 owner=timer_test once next in 1938 ms
#2 owner=timer_test repeat next in 969 ms
```
Log block:
```text
2026-06-15 10:51:55 [INFO] timer_test: repeat timer tick 1
2026-06-15 10:51:56 [INFO] timer_test: one-shot timer fired
2026-06-15 10:51:56 [INFO] timer_test: repeat timer tick 2
2026-06-15 10:51:57 [INFO] timer_test: repeat timer tick 3
2026-06-15 10:51:58 [INFO] timer_test: repeat timer tick 4
2026-06-15 10:51:59 [INFO] timer_test: repeat timer tick 5
2026-06-15 10:51:59 [INFO] timer_test: repeat timer self-cancelled after 5 ticks
```
After firing:
```text
--- conduit_timers ---
timers: 0 active
--- conduit_prof ---
timer_test timer 6 71.5us 131.1us 131.1us 101.4us 429.0us
```
Group cancel:
```text
--- conduit_timer_every 1 ---
[Conduit] repeating timer #3 every 1.00 s (stops after 5)
--- conduit_timer_after 30 ---
[Conduit] one-shot timer #4 scheduled in 30.00 s
--- conduit_timers ---
timers: 2 active
#3 owner=timer_test repeat next in 937 ms
#4 owner=timer_test once next in 29969 ms
--- conduit_timer_stop ---
[Conduit] cancelled 2 test timer(s)
--- conduit_timers ---
timers: 0 active
```
Result: timers passed, including self-cancel from inside callback and owner group cancel.
## Chat Interception Tests
RCON output:
```text
--- conduit_chat ---
chat: 0 subscriber(s), interception hook off
--- conduit_chat_listen ---
[Conduit] [INFO] chat: 'chat_test' subscribed to chat
[Conduit] listening to chat
--- conduit_chat ---
chat: 1 subscriber(s), interception hook on
owner=chat_test hits=0
--- say "hello from server" ---
[Conduit] [INFO] chat_test: say slot=-1: "hello from server"
[All Chat][Console (0)]: "hello from server"
L 06/15/2026 - 10:53:03: "Console<0>" say ""hello from server""
--- say "this has badword inside" ---
[Conduit] [INFO] chat_test: say slot=-1: "this has badword inside" [SUPPRESSED]
--- say_team "x" ---
[Conduit] [INFO] chat_test: say_team slot=-1: "x"
--- conduit_prof ---
chat_test chat 3 97.0us 131.1us 131.1us 127.4us 290.9us
```
Conduit log:
```text
2026-06-15 10:53:03 [INFO] chat: 'chat_test' subscribed to chat
2026-06-15 10:53:03 [INFO] chat_test: say slot=-1: "hello from server"
2026-06-15 10:53:03 [INFO] chat_test: say slot=-1: "this has badword inside" [SUPPRESSED]
2026-06-15 10:53:03 [INFO] chat_test: say_team slot=-1: "x"
```
The suppressed `badword` message did not echo as `[All Chat]` in the RCON output.
Cleanup:
```text
--- conduit_chat_stop ---
[Conduit] removed 1 chat subscriber(s)
--- conduit_chat ---
chat: 0 subscriber(s), interception hook off
--- say "after stop visible" ---
[All Chat][Console (0)]: "after stop visible"
L 06/15/2026 - 10:53:20: "Console<0>" say ""after stop visible""
--- conduit_chat ---
chat: 0 subscriber(s), interception hook off
```
Result: chat interception, suppression, say_team distinction, profiler scope, and hook removal all passed.
## Chat Sending / UserMessages
Commands:
```text
--- conduit_usermsg ---
usermessages: chat sending live (SayText2 resolved, SayText resolved)
--- conduit_say linux broadcast test ---
[Conduit] PrintToAll sent
--- conduit_say_player 0 private_ping ---
[Conduit] PrintToPlayer(0) sent
--- conduit_usermsg ---
usermessages: chat sending live (SayText2 resolved, SayText resolved)
```
Result: Linux signatures resolve and native send calls return `sent`. This verifies the server-side path and no crash. I cannot visually confirm client rendering from this environment; per latest plan this path sends plain white text through `UTIL_SayTextFilter`.
## Console Adopt Fix
This re-tested the previously observed adopted-convar listing issue.
```text
--- conduit_console ---
[Conduit] [INFO] console: command 'conduit_demo' registered (owner 'console_demo')
[Conduit] [INFO] console: convar 'conduit_demo_value' created (owner 'console_demo')
console: ready, 1 command(s), 1 plugin convar(s)
cmd conduit_demo owner=console_demo
cvar conduit_demo_value owner=console_demo value=7
--- conduit_cvar conduit_demo_value 42 ---
[Conduit] set 'conduit_demo_value' = '42'
[Conduit] conduit_demo_value = 42 (int=42 float=42.000 bool=1)
--- conduit_concmd_stop ---
[Conduit] removed 2 demo registration(s)
--- conduit_console ---
[Conduit] [INFO] console: command 'conduit_demo' registered (owner 'console_demo')
[Conduit] [INFO] console: convar 'conduit_demo_value' already registered - adopting (owner 'console_demo')
console: ready, 1 command(s), 1 plugin convar(s)
cmd conduit_demo owner=console_demo
cvar conduit_demo_value owner=console_demo value=42
```
Final cleanup:
```text
--- conduit_concmd_stop ---
[Conduit] removed 2 demo registration(s)
--- conduit_demo x ---
```
Result: adopt tracking is fixed. Adopted convar now appears under `1 plugin convar(s)` and owner cleanup removes 2 registrations.
## Final Runtime State
```text
--- conduit_status ---
Conduit 0.1.0-dev
uptime : 248.6 s
game frames : 15184
log file : /home/steam/cs2-dedicated/game/csgo/addons/conduit/logs/conduit-20260615.log
crash report: armed (use conduit_crash_test to verify)
--- conduit_timers ---
timers: 0 active
--- conduit_chat ---
chat: 0 subscriber(s), interception hook off
--- conduit_events ---
game events: manager connected, 0 subscription(s), 0 event(s) registered, FireEvent detour off
--- conduit_usermsg ---
usermessages: chat sending live (SayText2 resolved, SayText resolved)
```
Final profiler:
```text
engine GameFrame 13848 2.77ms 4.19ms 8.39ms 39.34ms 38.34s
timer_test timer 6 71.5us 131.1us 131.1us 101.4us 429.0us
chat_test chat 3 97.0us 131.1us 131.1us 127.4us 290.9us
core SchemaFindField 3 13.2us 8.2us 32.8us 31.7us 39.5us
```
## Final Server State
Docker:
```text
/gp_c2b47a90 running running=true exit=0 oom=false
/gp_d8f13411 exited running=false exit=130 oom=false
```
Panel DB:
```text
uuid | name | status | slug | port
----------+----------------+---------+--------------+-------
c2b47a90 | Test Sunucusu | running | cs2 | 27015
d8f13411 | MukemmelSunucu | stopped | satisfactory | 7777
(2 rows)
```
## Notes
- No Conduit/Metamod/signal-specific load failure or crash was observed.
- Server console contained ordinary CS2/Steam/map warnings and warmup long-frame messages.
- No watchdog stall block appeared during this run.
- CS2 panel status was `stopped` after Docker restart; I updated only the CS2 row back to `running`. Satisfactory remained `stopped`.