Slice 2 (WIP): class carrier (GoInGameRequest.ClassId) + Warrior cone archetype

The per-player class travels on GoInGameRequest.ClassId (client reads a ClassSelection
singleton); GoInGameServerSystem seeds the class at spawn via ClassTraits (AbilityRef +
permanent trait StatModifiers on a reserved ClassSourceId; CharacterStatsRef stays Default
so the DRG-asymmetry deltas ride the replicated OwnerSendType.All buffer). AbilityFireSystem
gains the aim-directed Cone archetype: cooldown predicted both worlds, server-only cone
damage to living enemies (same-tick, SourceTick-stamped, like the melee cleave). 345/345.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-18 00:30:20 -07:00
parent d9d67c4e78
commit a7fdd6f71d
9 changed files with 127 additions and 9 deletions
@@ -36,8 +36,9 @@ namespace ProjectM.Client
{
ecb.AddComponent<NetworkStreamInGame>(connection);
byte classId = SystemAPI.HasSingleton<ClassSelection>() ? SystemAPI.GetSingleton<ClassSelection>().ClassId : (byte)0;
var request = ecb.CreateEntity();
ecb.AddComponent<GoInGameRequest>(request);
ecb.AddComponent(request, new GoInGameRequest { ClassId = classId }); // Slice 2: carry the chosen class
ecb.AddComponent(request, new SendRpcCommandRequest { TargetConnection = connection });
}