Commit Graph
50 Commits
Author SHA1 Message Date
neckfireandClaude Opus 4.8 1b4c1b2606 fix(audit): Fortuna pass level, display-name persist, loadout & craft-timer queries
Build & Deploy / build (push) Successful in 39s
Audit of the emulator surface + 4 fixes:
- Fortuna pass level was frozen: nothing ever granted season XP. ClaimActiveContract
  now grants + persists FortunaPass{2,3}_SeasonXp (scaled to the contract's reputation)
  and returns the new total, so the pass level moves as you complete contracts.
- UpdateUserTitleDisplayName never persisted the rename (echoed back, lost on relog).
  Added DbUserService.UpdateDisplayNameAsync and call it.
- GetPlayerSets returned a blank loadout; now reads the persisted LOADOUT key.
- GetCraftingInProgressData was a stub; now returns the persisted CraftingTimer so an
  in-progress craft + remaining time survive a menu reopen/relog.

Remaining known gaps documented in Plane (need client data / multiplayer / out of scope).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-15 02:56:47 +02:00
neckfireandClaude Opus 4.8 14ab3267f4 fix(shop): don't treat ContractLockPurchase sentinel 'None' as a real lock
Build & Deploy / build (push) Successful in 34s
Regression from the contract-lock feature: the check gated on any non-empty
ContractLockPurchase, but the blueprint data uses the string "None" (not "")
for items with no lock (749/773 items). So virtually every item returned
'Item is locked' before the currency deduction -> players couldn't buy anything
(error shown, K-Marks unchanged). Skip the gate when the value is null/empty/"None".

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-15 02:15:13 +02:00
neckfireandClaude Opus 4.8 dc34233e40 fix(contracts): persist raid-zone objective progress (client-hosted raids)
Build & Deploy / build (push) Successful in 36s
Symptom: missions done in raid zones weren't saved -> contracts stuck on
'Objective not met', no claim possible.

Root cause: client-hosted raids have no dedicated game server, so
UpdatePlayerActiveContracts is never called (confirmed: 0 calls in prod logs).
Only Kills and OwnNumOfItem objectives were handled; DeadDrop/VisitArea/
LootContainer had Progress[i]=0 forever -> unclaimable and not shown at station.

Fix: EYContractObjectiveType.IsRaidRuntime() groups the objectives that can only
be observed in a live raid (Kills/DeadDrop/VisitArea/LootContainer). Auto-credit
them on deploy (EnterMatchmakingMatch, persisted) so the station shows them
complete, and accept them in ClaimActiveContract. OwnNumOfItem still validated
against the real stash; FactionLevel/CompletedMission unchanged. Added a
defensive guard against a Progress array shorter than the objective list.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-15 01:54:25 +02:00
neckfireandClaude Opus 4.8 71a2c8a1e9 feat(deploy): optional dedicated-server travel via GAMESERVER_ADDRESS
Build & Deploy / build (push) Successful in 31s
When GAMESERVER_ADDRESS ("host:port") is set, EnterMatchmaking returns
that server (SingleplayerStation=false) and EnterMatchmakingMatch's
deploy signal carries its address, so the client travels to the real
game server instead of the client-hosted station. Unset = unchanged
(normal preprod). Lets a 2nd preprod run the same :preprod image and
differ only by this env var (dedicated-server test bench).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-14 18:41:20 +02:00
neckfireandClaude Opus 4.8 55a9571958 fix(matchmaking): deploy signal targets only the deploying player
Build & Deploy / build (push) Successful in 32s
EnterMatchmakingMatch broadcast OnSquadMatchmakingSuccess to Clients.All,
so one player deploying pulled every connected player into the match.
Map each player to their SignalR connection (GetSignalRConnection tags the
URL with uid; CycleHub records it via a SignalRConnectionRegistry) and
send the deploy signal only to that connection (broadcast fallback if
unmapped). Also enable m_automaticImportPlatformFriends (Steam friends).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-14 17:56:22 +02:00
neckfireandClaude Opus 4.8 8057fcae47 fix(social): disable friends limit (was capping at 0 friends)
Build & Deploy / build (push) Successful in 31s
FeatureToggles had m_isFriendsLimitEnabled=true with no positive limit,
so the client showed 'friend limit reached: 0 friends' and blocked adding
friends / squad invites. Disabled the toggle (squads/social already on).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-14 17:31:44 +02:00
neckfireandClaude Opus 4.8 6d77bb4b82 chore(signalr): log remote IP + resolved URL for diagnostics
Build & Deploy / build (push) Successful in 30s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-14 16:24:49 +02:00
neckfireandClaude Opus 4.8 0089833b74 fix(signalr): return LAN SignalR URL to local clients
Build & Deploy / build (push) Successful in 34s
GetSignalRConnection now serves the SignalR URL on 192.168.1.136 to
clients whose remote IP is on the LAN, and keeps the public domain for
external clients. The real-time WebSocket (libwebsockets, incl. under
Proton/Wine) couldn't reach the public domain from inside the LAN
(hairpin NAT) — it failed right after the intro as "error code 5".
External friends are unaffected (still get the domain).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-14 16:18:35 +02:00
neckfireandClaude Opus 4.8 0588849e4c feat(squad): in-memory squad/lobby state + wire squad functions
Build & Deploy / build (push) Successful in 31s
Adds SquadService (singleton, process-local) tracking squads by the
squadId the client shares across party members, plus a user->squad index
so TryGetCompleteSquadInfo (no squadId in request) can resolve the
caller's squad. Members are lazily registered on any squad call.

- TryGetCompleteSquadInfo: returns the caller's real squad.
- SquadMemberReadyForMatch: joins the squad, records readiness/map,
  returns the squad + whether everyone is ready.
- SquadMemberSelectedMap: records the member's selected map.
- DbUserService.FindByIdAsync: resolve display name for squad members.

Groundwork for the station lobby; assumes the client drives squads via
these calls with a shared squadId (to confirm with a 2-client session).
Real-time SignalR push (unknown event names) deferred; the squad is
carried in responses + TryGetCompleteSquadInfo for now.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-14 15:34:43 +02:00
neckfireandClaude Opus 4.8 310e2bf7e9 feat(social): friends list resolution + fix ping request 500
Build & Deploy / build (push) Successful in 24s
- RequestUsersPingRequest: the client sends ping=2147483648 (int.MaxValue+1)
  for "no ping", which overflowed the int field and made every ping request
  return 500. Widened to long.
- ClientsideFriendsImport: persist the imported Steam friend ids per user.
- GetFriendList: resolve those ids to the players that exist on this server
  (batch lookup by Steam auth key) and return them as friends. Response
  shape is best-effort pending in-game confirmation.
- DbUserService.FindManyAsync: batch-resolve auth keys to players.

First step of the station lobby (see friends on the server). Squad
formation / invite flow to follow once friends are visible.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-14 14:18:44 +02:00
neckfireandClaude Opus 4.8 89e7a69049 feat(insurance,fortuna): payout on death + Fortuna Pass claim safety
Build & Deploy / build (push) Successful in 21s
- CompleteInventoryUpdate: insured items lost in a raid (present in
  ItemsToRemove) are recovered back to the stash and the insurance is
  consumed. This is the payout counterpart to the premium already
  debited on deploy (EnterMatchmakingStation). Gated on the policy
  declaring a positive Payout; never fails the inventory commit.
- RequestClaimFortunaPassRewards: log the client-sent reward IDs so a
  real FortunaPass{2,3}_Rewards catalog can be built to match, and stop
  recording a reward as claimed when there is no catalog entry to grant
  (previously it was burned permanently and became unclaimable).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-14 12:30:11 +02:00
neckfireandClaude Opus 4.8 6f3410b37d fix(contracts): auto-credit kill objectives in client-hosted raids
Build & Deploy / build (push) Successful in 21s
Kill-type contract objectives were never persisted: the client-hosted
raid has no dedicated game server to report per-kill progress, so
creature kills stayed at 0 and contracts reported "no kills" at claim.

- EnterMatchmakingMatch: auto-credit Kills objectives to MaxProgress on
  deploy (mirrors the item-ownership pre-compute already done there and
  the player-kill auto-credit in ActivateContract).
- ClaimActiveContract: treat Kills objectives as met as a safety net for
  contracts activated before deploy.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-14 11:56:14 +02:00
neckfireandClaude Opus 4.8 345a822a2e feat(preprod): contrats fonctionnels, réputation factions, gating tech-tree & shop
Build & Deploy / build (push) Successful in 21s
- RequestPlayerContracts: renvoie les vrais contrats actifs + job boards du joueur
  (peuplement initial des boards vides) au lieu d'une liste hardcodée.
- RequestFactionProgression: renvoie la réputation réelle des 3 factions (au lieu de 0).
- StartTechTreeNodeUpgradeClient: dependency check PlayerQuarterLevelRequired.
- PurchaseWeaponShopItem: critère de déblocage par contrat (UnlockData.ContractLockPurchase).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-14 02:20:27 +02:00
neckfireandClaude Opus 4.8 1e79360b6e feat: rotation shops (daily/weekly) + items insurance + season pass
Build & Deploy / build (push) Successful in 10s
- RequestStoreRotationData: rotation daily (reset 00:00 UTC) + weekly (lundi) avec
  storeIDs rotatifs déterministes et timers d'expiration corrects.
- EnterMatchmakingStation: traite purchaseInsuranceRequest au déploiement — marque
  les items assurés (Insurance + owner) et débite la prime (TitleData InventoryInsurance).
- FYPurchaseInventoryInsuranceRequest: modèle complété (insuranceId + itemIds).
- RequestClaimFortunaPassRewards: claim saison-correct (S2/S3 séparés, plus d'écrasement)
  + octroi des récompenses depuis catalogue TitleData optionnel (repli sûr sinon).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-13 02:55:54 +02:00
Yury 269659b8da Stash changes 2025-03-31 01:39:22 +03:00
Yury 14097808d8 Add CompleteInventoryUpdate CloudScript function from closed beta 2025-03-31 01:38:58 +03:00
Yury 6fe4432c6e Add custom UpdatePlayerActiveContracts CloudScript function for contracts update 2025-03-31 01:38:35 +03:00
Yury 1f4640fccd Fix given amount of quest reward 2025-03-31 01:34:41 +03:00
Yury faf90c1841 Autocomplete only PvP quests now 2025-03-31 01:34:16 +03:00
Yury b3c5fa3e2b Disallow accepting already completed contracts 2025-03-31 01:32:15 +03:00
Yury 87e1708d6b Fix inventory update on quarter level upgrade 2025-03-31 01:31:35 +03:00
Yury 2695f25242 Update contract info structure and title data
* Include information about kill conditions
* Use default client settings for MatchmakingSetup
2025-03-31 01:31:18 +03:00
Yury 81dea35778 Allow for configurable SignalR connection settings 2025-03-31 01:30:14 +03:00
Yury 704abac924 Add client version check 2025-03-31 01:29:00 +03:00
Yury 033227eb83 Revert stash size to 90 items 2025-03-25 20:40:24 +02:00
Yury 1b94cbdd8d Update TitleData to match client data 2025-03-25 20:07:29 +02:00
Yury b2e2106912 Fix insurance token name 2025-03-25 20:06:35 +02:00
Yury 3858d482e9 Fill objectives when receiving new contract after claim 2025-03-25 20:05:29 +02:00
Yury 5e42a54bbf Add JobBoardsData document for job board data per player 2025-03-25 18:54:15 +02:00
Yury 7766d47bda Add EnterMatchmaking function for CB 2025-03-25 18:53:52 +02:00
Yury 31dbcfdb4f Change durability on inventory update 2025-03-25 18:53:09 +02:00
Yury 43e2b69d66 Set objective counter before deployment 2025-03-25 18:52:55 +02:00
Yury 7a0e0d1285 Fix possible exception on non-existent quest activation 2025-03-25 18:52:28 +02:00
Yury 36d797b391 Fix item sell formula for Ammo and Ability items 2025-03-25 18:51:55 +02:00
Yury 4e0b6440d9 Fix job boards 2025-03-25 18:51:29 +02:00
Yury eec90dae91 Set max objective progress for kills and visit quests 2025-03-25 18:50:38 +02:00
Yury dfc38de7b5 Push API changes
* Fix item repair cost formula
* Add "RequestUpdateAvailableFreeLoadout" function (WIP)
* Fix item sell formula
* Fix item stack split on sell
* Fix contract progression counting for objectives other than owned items
* Refactor balance into a proper struct
* Separate and update Season 2 and Season 3 data
2025-03-04 23:39:20 +02:00
Yury 280b87314c Push changes 2025-02-24 01:06:32 +02:00
AeonLucid 9560417268 Use vcpkg manifest for minhook 2025-01-07 03:01:40 +01:00
AeonLucid 3691d229d5 Update to .NET 8 2024-07-01 21:52:30 +02:00
AeonLucid ed0f771df6 Started on UE4 server, semi working handshake 2022-01-09 06:29:02 +01:00
AeonLucid 99c4fe49b9 Reading is hard 2022-01-07 23:31:28 +01:00
AeonLucid f51bbfb56c Verify QoS request 2022-01-07 23:28:55 +01:00
AeonLucid 93926eedf8 Add more CloudScript functions, start of EnterMatchmaking 2022-01-07 22:29:20 +01:00
AeonLucid 27649724c8 Add QoS beacon 2022-01-07 07:09:55 +01:00
AeonLucid 2f01cf7411 Convert to new namespace stuff and implicit usings 2022-01-07 06:07:05 +01:00
AeonLucid e0010e1d31 Now able to enter the lobby 2021-11-04 06:29:58 +01:00
AeonLucid 667d19e9f2 Implement UserData and TitleData 2021-11-03 21:29:54 +01:00
AeonLucid e5e3e7dff3 JWT Authentication 2021-11-01 18:27:08 +01:00
AeonLucid 505ae8b2f8 Added mongodb as database 2021-11-01 00:53:04 +01:00