Initial commit: Ananta CBT 4229938 private server with all fixes

This commit is contained in:
CAtlas0784 committed 2026-09-15 18:13:46 +07:00
commit c84135c357
286 files changed
+2214315

No files matched your search

File diff suppressed because it is too large. Load diff
@@ -0,0 +1,39 @@
using Ananta.SDK.Serialization;
namespace Ananta.Server.RpcTypes.Client4229938.Methods.Game;
[UxContract]
internal sealed class BaseActivityInfo
{
public uint CfgId;
public uint StartTime;
public uint EndTime;
}
[UxContract]
internal sealed class ActivityData
{
public uint CfgId;
public bool ShowRedPoint;
public bool IsOutOfDate;
}
[UxContract(Inline = true)]
internal struct AwardActivityItem
{
public BaseActivityInfo BaseActivityInfo;
public ActivityData ActivityData;
}
[UxContract(Inline = true)]
internal sealed class SyncAllActivities
{
[UxCollection(Count = UxCountEncoding.Int7, ItemObjectEncoding = UxObjectEncoding.Struct)]
public List<AwardActivityItem> activities = [];
}
[UxContract(Inline = true)]
internal sealed class AskActivityCancelRedPointArgs
{
public uint id;
}
@@ -0,0 +1,49 @@
using Ananta.SDK.Serialization;
namespace Ananta.Server.RpcTypes.Client4229938.Methods.Game;
[UxContract(Inline = true)]
internal sealed class AskSwitchFightStyle
{
public uint spiritId;
public uint fightStyleTypeId;
public uint fightStyleId;
}
[UxContract(Inline = true)]
internal sealed class AskSetWeaponFightStyle
{
public ulong weaponInstanceId;
public uint fightStyleId;
}
[UxContract(Inline = true)]
internal sealed class SyncWeaponFightStyleChange
{
public ulong weaponInstanceId;
public uint fightStyleId;
}
[UxContract(Inline = true)]
internal sealed class AskLoadWeaponToSlot
{
public uint spiritId;
public ulong weaponId;
public int slotIndex;
}
[UxContract(Inline = true)]
internal sealed class AskDepositSpiritWeapon
{
public uint spiritId;
public int slotIndex;
}
[UxContract(Inline = true)]
internal sealed class AskExchangeWeaponSlot
{
public uint fromSpirit;
public int fromIndex;
public uint toSpirit;
public int toIndex;
}
@@ -0,0 +1,10 @@
using Ananta.SDK.Serialization;
namespace Ananta.Server.RpcTypes.Client4229938.Methods.Game;
[UxContract]
internal sealed class SpriteToken4229938
{
public string Token = string.Empty;
public ulong ExpireTimeStamp;
}
@@ -0,0 +1,264 @@
using Ananta.SDK.Serialization;
using Auto = Ananta.Server.RpcTypes.Client4229938.Auto;
using SceneMethods = Ananta.Server.RpcTypes.Client4229938.Methods.GameScene;
namespace Ananta.Server.RpcTypes.Client4229938.Methods.Game;
[UxContract(Inline = true)]
internal sealed class AskSetSpiritFashionsWithSource
{
public uint spiritOrInstanceId;
public short source;
public SpiritWearFashionsInfo spiritWearFashionsInfo = new();
}
[UxContract(Inline = true)]
internal sealed class AskSetSpiritFashions
{
public uint spiritId;
public SpiritWearFashionsInfo spiritWearFashionsInfo = new();
}
[UxContract(Inline = true)]
internal sealed class SyncSetSpiritFashions
{
public uint spiritId;
public short source;
public SpiritWearFashionsInfo spiritWearFashionsInfo = new();
}
[UxContract]
internal sealed class SpiritWearFashionsInfo
{
public uint FunctionSuitId;
public WearSourceInfo WearSourceInfo;
public bool IsTryWear;
[UxCollection(Count = UxCountEncoding.Int32)]
public List<WearFashionInfo> WearFashionInfoList = [];
[UxCollection(Count = UxCountEncoding.Int32)]
public List<WearFashionEditInfo>? WearFashionEditInfoList = [];
public byte HiddenParts;
public byte EditedHiddenParts;
}
[UxContract(Inline = true)]
internal struct WearSourceInfo
{
public short Source;
public uint SourceId;
}
[UxContract]
internal sealed class WearFashionInfo
{
public uint FashionId;
}
[UxContract]
internal sealed class WearFashionEditInfo
{
public uint FashionId;
public float Scale;
public SceneMethods.UxVector3 Rotation;
public SceneMethods.UxVector3 Offset;
}
[UxContract(Inline = true)]
internal sealed class AskOpenOrCloseFashionPanel
{
public bool isOpen;
public int reason;
}
[UxContract(Inline = true)]
internal sealed class AskModifySpiritWearFashionsOnlyWearWithSource
{
public uint spiritOrInstanceId;
public short source;
[UxCollection(Count = UxCountEncoding.Int32)]
public List<uint> unwearFashionIdList = [];
[UxCollection(Count = UxCountEncoding.Int32)]
public List<WearFashionInfo> wearFashionInfoList = [];
}
[UxContract(Inline = true)]
internal sealed class ModifySpiritWearFashionsOnlyWearResponse
{
[UxCollection(Count = UxCountEncoding.Int32)]
public List<uint> unwearFashionIdList = [];
[UxCollection(Count = UxCountEncoding.Int32)]
public List<WearFashionInfo> wearFashionInfoList = [];
}
[UxContract(Inline = true)]
internal sealed class AskModifySpiritWearFashionsOnlyWear
{
public uint spiritId;
[UxCollection(Count = UxCountEncoding.Int32)]
public List<uint> unwearFashionIdList = [];
[UxCollection(Count = UxCountEncoding.Int32)]
public List<WearFashionInfo> wearFashionInfoList = [];
}
[UxContract(Inline = true)]
internal sealed class AskModifySpiritWearFashionsWithSource
{
public uint spiritOrInstanceId;
public short source;
[UxCollection(Count = UxCountEncoding.Int32)]
public List<uint> unwearFashionIdList = [];
[UxCollection(Count = UxCountEncoding.Int32)]
public List<WearFashionInfo> wearFashionInfoList = [];
[UxCollection(Count = UxCountEncoding.Int32)]
public List<uint> uneditWearFashionIdList = [];
[UxCollection(Count = UxCountEncoding.Int32)]
public List<WearFashionEditInfo> editWearFashionEditInfoList = [];
}
[UxContract(Inline = true)]
internal sealed class ModifySpiritWearFashionResult
{
[UxCollection(Count = UxCountEncoding.Int32)]
public List<uint> R0 = [];
[UxCollection(Count = UxCountEncoding.Int32)]
public List<WearFashionInfo> R1 = [];
[UxCollection(Count = UxCountEncoding.Int32)]
public List<uint> R2 = [];
[UxCollection(Count = UxCountEncoding.Int32)]
public List<WearFashionEditInfo> R3 = [];
}
[UxContract(Inline = true)]
internal sealed class AskModifySpiritWearFashionEditInfosWithSource
{
public uint spiritOrInstanceId;
public short source;
[UxCollection(Count = UxCountEncoding.Int32)]
public List<uint> uneditWearFashionIdList = [];
[UxCollection(Count = UxCountEncoding.Int32)]
public List<WearFashionEditInfo> editWearFashionEditInfoList = [];
}
[UxContract(Inline = true)]
internal sealed class ModifySpiritWearFashionEditInfosResponse
{
[UxCollection(Count = UxCountEncoding.Int32)]
public List<uint> uneditWearFashionIdList = [];
[UxCollection(Count = UxCountEncoding.Int32)]
public List<WearFashionEditInfo> editWearFashionEditInfoList = [];
}
[UxContract(Inline = true)]
internal sealed class AskModifySpiritWearFashionEditInfos
{
public uint spiritId;
[UxCollection(Count = UxCountEncoding.Int32)]
public List<uint> uneditWearFashionIdList = [];
[UxCollection(Count = UxCountEncoding.Int32)]
public List<WearFashionEditInfo> editWearFashionEditInfoList = [];
}
[UxContract(Inline = true)]
internal sealed class AskSetSpiritWearFashionHiddenPartsWithSource
{
public uint spiritOrInstanceId;
public short source;
public byte hiddenParts;
}
[UxContract(Inline = true)]
internal sealed class AskSetSpiritWearFashionHiddenParts
{
public uint spiritId;
public byte hiddenParts;
}
[UxContract(Inline = true)]
internal sealed class AskUnlockFashionColoringSlot
{
public uint fashionId;
public byte unlockSlotCount;
}
[UxContract(Inline = true)]
internal sealed class AskUnlockFashionSuitSlot
{
public uint spiritId;
public byte unlockSlotCount;
}
[UxContract(Inline = true)]
internal sealed class AskFavoriteFashions
{
[UxCollection(Count = UxCountEncoding.Int32)]
public List<uint> unfavoriteFashionIdList = [];
[UxCollection(Count = UxCountEncoding.Int32)]
public List<uint> favoriteFashionIdList = [];
}
[UxContract(Inline = true)]
internal sealed class AskFavoriteFashionSuits
{
[UxCollection(Count = UxCountEncoding.Int32)]
public List<uint> unfavoriteFashionSuitIdList = [];
[UxCollection(Count = UxCountEncoding.Int32)]
public List<uint> favoriteFashionSuitIdList = [];
}
[UxContract(Inline = true)]
internal sealed class AskReadFashions
{
[UxCollection(Count = UxCountEncoding.Int32)]
public List<uint> fashionIdList = [];
}
[UxContract(Inline = true)]
internal sealed class AskReadFashionSuits
{
[UxCollection(Count = UxCountEncoding.Int32)]
public List<uint> fashionSuitIdList = [];
}
[UxContract(Inline = true)]
internal sealed class AskSetSpiritFashionVariantPreference
{
public uint spiritId;
public uint mainFashionId;
public uint variantFashionId;
}
/// <summary>Server -> client SyncPlayerAllSpirits: top-level List7Bit&lt;SpiritInfo&gt;.</summary>
[UxContract(Inline = true)]
internal sealed class SyncPlayerAllSpirits
{
[UxCollection(Count = UxCountEncoding.Int7, ItemObjectEncoding = UxObjectEncoding.Complex)]
public List<Auto.SpiritInfo> spirits = [];
}
[UxContract]
internal sealed class SpiritViewData
{
public Auto.SpiritInfo SpiritInfo = new();
}
/// <summary>
/// Incremental roster hydration. The build's handler ignores reason and adds/replaces one view entry,
/// avoiding a single oversized SyncPlayerAllSpirits payload with every character loadout embedded.
/// </summary>
[UxContract(Inline = true)]
internal sealed class SyncPlayerAddNewSpirit
{
public SpiritViewData spirit = new();
public int reason;
}
/// <summary>Return body of AskAllSpiritPanelData: top-level List7Bit&lt;SpiritPanelData&gt;.</summary>
[UxContract(Inline = true)]
internal sealed class AskAllSpiritPanelDataResult
{
[UxCollection(Count = UxCountEncoding.Int7, ItemObjectEncoding = UxObjectEncoding.Complex)]
public List<Auto.SpiritPanelData> spirits = [];
}
@@ -0,0 +1,43 @@
using Ananta.SDK.Serialization;
using Ananta.Server.RpcTypes.Client4229938.Auto;
namespace Ananta.Server.RpcTypes.Client4229938.Methods.Game;
[UxContract(Inline = true)]
internal sealed class AskDrawGachaArgs
{
public uint gachaPoolId;
public uint drawCount;
public bool isAutoExchange;
}
[UxContract(Inline = true)]
internal struct GachaDrawDetail
{
public uint PoolContentId;
public bool IsGrandPrize;
public bool IsConverted;
public bool IsNew;
}
[UxContract(Inline = true)]
internal sealed class SyncGachaDrawInfo
{
[UxCollection(Count = UxCountEncoding.Int7, ItemObjectEncoding = UxObjectEncoding.Struct)]
public List<GachaDrawDetail> drawDetails = [];
public bool isGrandPrizeWithAllFillers;
}
[UxContract(Inline = true)]
internal sealed class AskClaimGachaMilestoneArgs
{
public uint groupId;
public uint milestoneCount;
}
[UxContract(Inline = true)]
internal sealed class AskGachaDrawRecordsArgs
{
public uint poolId;
public uint pageIndex;
}
@@ -0,0 +1,18 @@
using Ananta.SDK.Serialization;
using Auto = Ananta.Server.RpcTypes.Client4229938.Auto;
namespace Ananta.Server.RpcTypes.Client4229938.Methods.Game;
/// <summary>Exact build-4229938 backpack delta used for separate firearm ammunition.</summary>
[UxContract(Inline = true)]
internal sealed class SyncBackpackItemChanged4229938
{
[UxCollection(Count = UxCountEncoding.Int7, ItemObjectEncoding = UxObjectEncoding.Complex)]
public List<Auto.PlayerPackItem> addItemList = [];
[UxCollection(Count = UxCountEncoding.Int7, ItemObjectEncoding = UxObjectEncoding.Complex)]
public List<Auto.PlayerPackItem> updateItemList = [];
[UxCollection(Count = UxCountEncoding.Int7, ItemObjectEncoding = UxObjectEncoding.Complex)]
public List<Auto.PlayerPackItem> deleteItemList = [];
}
@@ -0,0 +1,24 @@
using System.Collections.Generic;
using Ananta.SDK.Serialization;
namespace Ananta.Server.RpcTypes.Client4229938.Methods.Game;
/// <summary>
/// Metro/Train runtime data structures for CBT 4229938.
/// Matching ReadMetroClientInfo and ReadMetroCarriageGadgetInfos from GameAssembly.
/// </summary>
[UxContract]
public sealed class MetroClientInfo
{
public int Id { get; set; }
public uint LineId { get; set; }
public float ElapsedTime { get; set; }
public bool IsFinalTrain { get; set; }
}
[UxContract]
public sealed class MetroCarriageGadgetInfos
{
public List<ulong> InnerGadgetIds { get; set; } = [];
public List<ulong> OuterGadgetIds { get; set; } = [];
}
@@ -0,0 +1,17 @@
using Ananta.SDK.Serialization;
namespace Ananta.Server.RpcTypes.Client4229938.Methods.Game;
/// <summary>Client clock sample sent by both GetServerTime and GetServerTimeGame.</summary>
[UxContract(Inline = true)]
internal sealed class GetServerTime
{
public double clientUnixTime;
}
[UxContract(Inline = true)]
internal sealed class ServerTime
{
public double clientUnixTime;
public double serverUnixTime;
}
@@ -0,0 +1,126 @@
using Ananta.SDK.Serialization;
namespace Ananta.Server.RpcTypes.Client4229938.Methods.Game;
/// <summary>
/// Time/weather wire contracts for client 4229938.
/// S2C shapes from lua (SyncPlayerWeather reader) and the proto dump
/// (SyncPlayerCurrentTime request + RaidTimeAndWeatherChangeReason enum, Gm=0);
/// C2S arg shapes from ClientToGameDelegate.lua serializers.
/// </summary>
[UxContract(Inline = true)]
internal sealed class SyncPlayerCurrentTime4229938
{
public uint realTime;
public uint raidDaySeconds;
public bool fix;
public bool isPause;
public uint transitionSecond;
public int reason;
public int nodeId;
}
/// <summary>Server notify: SyncPlayerWeather (68712141). lua reader: 3× u32, no marker.</summary>
[UxContract(Inline = true)]
internal sealed class SyncPlayerWeather4229938
{
public uint weatherTypeId;
public uint nextWeatherTypeId;
public uint transitionSecond;
}
/// <summary>Client invoke: AskPassingTime (63465040) / GmPassingTime (65392342).</summary>
[UxContract(Inline = true)]
internal sealed class PassingTimeArgs4229938
{
public uint hour;
public uint minute;
}
/// <summary>Client invoke: GmSetTime (65373939).</summary>
[UxContract(Inline = true)]
internal sealed class GmSetTimeArgs4229938
{
public uint hour;
public uint minute;
public uint transition;
}
/// <summary>Client invoke: GmFixRaidTime (65145300).</summary>
[UxContract(Inline = true)]
internal sealed class GmFixRaidTimeArgs4229938
{
public uint hour;
public uint minute;
public bool clear;
}
/// <summary>Personal time slot (WritePersonalTimeSetting order).</summary>
[UxContract]
internal sealed class PersonalTimeSetting4229938
{
public string Label = string.Empty;
public uint Hour;
public uint Minute;
}
/// <summary>Client invoke: ChangePersonalTimeSetting (63153182).</summary>
[UxContract(Inline = true)]
internal sealed class ChangePersonalTimeSettingArgs4229938
{
public int index;
public PersonalTimeSetting4229938? info;
}
/// <summary>Client invoke: GmSetWeather (65142873).</summary>
[UxContract(Inline = true)]
internal sealed class GmSetWeatherArgs4229938
{
public uint weatherId;
}
/// <summary>Client invoke: GmSetWeatherParam (65715648).</summary>
[UxContract(Inline = true)]
internal sealed class GmSetWeatherParamArgs4229938
{
public uint weatherParamId;
}
/// <summary>Server return: AskTimePanelInfo (63323227).</summary>
[UxContract]
internal sealed class TimePanelInfo4229938
{
[UxCollection(Count = UxCountEncoding.Int7, ItemObjectEncoding = UxObjectEncoding.Complex)]
public List<PersonalTimeSetting4229938> PersonalTimeSettings = new();
}
/// <summary>Client invoke: AddPersonalTimeSetting (63617533).</summary>
[UxContract(Inline = true)]
internal sealed class AddPersonalTimeSettingArgs4229938
{
public PersonalTimeSetting4229938? info;
}
/// <summary>Client invoke: AskSetMobileSkinPart (63575641).</summary>
[UxContract(Inline = true)]
internal sealed class AskSetMobileSkinPartArgs4229938
{
public uint wallpaper;
public uint decoration;
public uint pendant;
}
/// <summary>Client invoke: AskInstallMobileApp (63567675).</summary>
[UxContract(Inline = true)]
internal sealed class AskInstallMobileAppArgs4229938
{
public uint appId;
}
/// <summary>Client invoke: AskCancelInteractionActionRedPoint (63584158).</summary>
[UxContract(Inline = true)]
internal sealed class AskCancelInteractionActionRedPointArgs4229938
{
public uint actionId;
}
@@ -0,0 +1,56 @@
using Ananta.SDK.Serialization;
namespace Ananta.Server.RpcTypes.Client4229938.Methods.GameScene;
[UxContract(Inline = true)]
internal sealed class BuffViewData
{
public uint InstanceId;
public uint Id;
public ulong ReleaserId;
public double ExpireTime;
public uint Tier = 1;
public bool Permanent = true;
public ulong DestructibleId;
}
[UxContract(Inline = true)]
internal sealed class SyncUnitBuffList
{
public ulong entityId;
public List<BuffViewData> buffs = [];
}
[UxContract(Inline = true)]
internal sealed class SyncUnitAddBuff
{
public ulong entityId;
public BuffViewData buff = new();
}
[UxContract(Inline = true)]
internal sealed class SyncUnitRemoveBuff
{
public ulong entityId;
public uint buffInstanceId;
}
[UxContract(Inline = true)]
internal sealed class AskAddClientBuff
{
public ulong unitId;
public uint buffId;
}
[UxContract(Inline = true)]
internal sealed class AskRemoveClientBuff
{
public ulong unitId;
public uint buffId;
}
[UxContract(Inline = true)]
internal sealed class AskFeiSuoSuccess
{
public int feiSuoId;
}
@@ -0,0 +1,258 @@
using Ananta.SDK.Serialization;
using Auto = Ananta.Server.RpcTypes.Client4229938.Auto;
namespace Ananta.Server.RpcTypes.Client4229938.Methods.GameScene;
[UxContract(Inline = true)]
internal sealed class SyncUnitHp { public ulong unitId; public float hp; }
[UxContract(Inline = true)]
internal sealed class SyncAttachBattleModule { public ulong unitId; }
[UxContract(Inline = true)]
internal sealed class SyncFightResource { public ulong unitId; public uint resourceId; public float value; }
[UxContract(Inline = true)]
internal sealed class SyncFightResourceFreeState { public ulong unitId; public uint resourceId; public bool isFree; }
[UxContract(Inline = true)]
internal sealed class SyncSpiritLastUsedWeapon { public uint templateId; public ulong weaponInstanceId; }
[UxContract(Inline = true)]
internal sealed class SyncSpiritUnitUrbanAttrs
{
public ulong unitId;
public List<int> abilities = [];
}
[UxContract(Inline = true)]
internal sealed class SyncUnitAttrs
{
public ulong unitId;
[UxCollection(Count = UxCountEncoding.Int32)]
public Dictionary<uint, float> attrs = [];
}
[UxContract]
internal sealed class PlayerFightStyleUnlockChangeInfo
{
public PlayerInfoFightStyle playerInfoFightStyle = new();
[UxCollection(Count = UxCountEncoding.Int7)]
public Dictionary<uint, bool> addOrUpdateUnlockInfo = [];
}
[UxContract]
internal sealed class PlayerInfoFightStyle
{
[UxCollection(Count = UxCountEncoding.Int32)]
public Dictionary<uint, bool> fightStyles = [];
}
[UxContract]
internal sealed class SpiritFightTypeChangeAction
{
public uint templateId;
public SpiritFightStyleInfo fullInfo = new();
[UxCollection(Count = UxCountEncoding.Int7)]
public Dictionary<uint, uint> addOrUpdateInfo = [];
}
[UxContract]
internal sealed class SpiritFightStyleInfo
{
[UxCollection(Count = UxCountEncoding.Int32)]
public Dictionary<uint, uint> fightStyleInfo = [];
}
[UxContract(Inline = true)]
internal sealed class SyncPlayerAllSkillChargeData
{
public ulong unitId;
[UxCollection(Count = UxCountEncoding.Int7)]
public Dictionary<uint, ChargeData> charges = [];
}
[UxContract]
internal sealed class ChargeData
{
public uint current;
public float readyRatio;
public float period;
public uint max;
public double timestamp;
}
[UxContract]
internal sealed class SpiritSwitchWeaponAction
{
public ulong spiritUid;
public ulong weaponInstanceId;
public byte reason;
}
/// <summary>
/// Scene weapon snapshot used by SyncSpiritWeaponDetail. Unlike the persistent WeaponData stored in
/// PlayerInfo, WeaponDetail has five scene-source fields in front of the common weapon payload.
/// </summary>
[UxContract]
internal sealed class WeaponDetail
{
public int SourceAgentSpoonId;
public ulong SourceAgentId;
public ulong SourceSceneItemId;
public bool IsLocked;
public ulong SourceSceneItemTaskUId;
public uint TemplateId;
public int Durability;
public ulong InstanceId;
public uint EventId;
public double ReceivedTimeStamp;
public uint OperatorFlags;
public string? SpecialLabel;
public Auto.WeaponDataFlags WeaponFlags = new();
public float SceneItemHp;
public int StackCount;
public Auto.WeaponBulletDatas BulletDatas = new();
[UxCollection(Count = UxCountEncoding.Int32, ItemObjectEncoding = UxObjectEncoding.Complex)]
public List<Auto.WeaponDecorationDatas> Decorations = [];
public uint FightStyleId;
public int MagazineAmmo;
public ulong BindPid;
public bool IsPlayerLocked;
// Exact 4229938 RPCSerializeAuto.lua tail. Omitting these four fields shifts the next
// WeaponDetail in SpiritWeaponDetail and eventually makes the client deserialize BulletDatas as null.
[UxCollection(Count = UxCountEncoding.Int32, ItemObjectEncoding = UxObjectEncoding.Complex)]
public List<Auto.WeaponEnchantSlot> EnchantSlots = [];
public uint NonDirectionalEnchantCount;
public uint DirectionalEnchantCountSinceLastNonDir;
public uint LockedDirectionalEnhancementId;
}
[UxContract]
internal sealed class WeaponWheelData
{
public uint WheelId;
public uint EventId;
[UxCollection(Count = UxCountEncoding.Int7, ItemObjectEncoding = UxObjectEncoding.Complex)]
public List<WeaponDetail?> WeaponSlots = [];
public int LockMaxSlotCounts;
}
/// <summary>
/// Atomic client WeaponManager hydration. The client must receive this before a switch action:
/// SyncSpiritSwitchWeaponAction only selects an instance already present in CurrWeaponSlots.
/// </summary>
[UxContract]
internal sealed class SpiritWeaponDetail
{
public uint SpiritTid;
public ulong SpiritUid;
public ulong CurrentWeaponUid;
[UxCollection(Count = UxCountEncoding.Int7, ItemObjectEncoding = UxObjectEncoding.Complex)]
public List<WeaponDetail?> WeaponSlots = [];
public WeaponDetail? CurrentTempWeapon;
public WeaponWheelData? TempWeaponSlots;
[UxCollection(Count = UxCountEncoding.Int7, ValueObjectEncoding = UxObjectEncoding.Complex)]
public Dictionary<int, WeaponDetail> VirtualWeaponSlots = [];
}
// Client -> GameScene AskSwitchWeapon(int index), zero-based.
[UxContract(Inline = true)]
internal sealed class AskSwitchWeapon { public int index; }
[UxContract(Inline = true)]
internal sealed class SyncBreakSkill { public ulong unitId; }
// Client -> GameScene AskUseSkill / AskClientUseCommonSkill.
[UxContract(Inline = true)]
internal sealed class AskUseSkill
{
public SkillUseData data = new();
}
[UxContract]
internal sealed class SkillUseData
{
public ulong Releaser;
public UxVector3 Location;
public float Facing;
public ulong TargetId;
public int UnitPartIndex;
public ulong TargetDestructibleId;
public ulong AttachDestructibleId;
public uint SkillId;
public int SkillInstanceId;
}
[UxContract(Inline = true)]
internal sealed class ReportSkillEnd
{
public ulong unitId;
public int skillId;
public uint newSkillId;
public bool isBreak;
}
[UxContract(Inline = true)]
internal sealed class AskMultipleSkillHit2
{
public SkillHitData skillHitData = new();
}
[UxContract]
internal sealed class SkillHitData
{
public ulong ReleaserId;
public int Id;
public uint SkillId;
public int TriggerIndex;
public ulong TriggerInstanceId;
public int Stage;
public ulong HitTarget;
public ulong AttachedDestructibleId;
public UxVector3 ClientHitPosition;
public UxVector3 ClientHitPosNormalDir;
public byte SkillHitType;
public int HitMaterial;
public UxVector3 HitCenter;
public uint StiffId;
public float StiffTime;
public uint HurtEffectId;
public float FirmHurt;
public int ShieldDefendIndex;
public uint ShieldId;
public bool IsBackHit;
public bool IsReflected;
public float HitDistance;
public bool IsBehindBarrier;
}
[UxContract(Inline = true)]
internal sealed class AskSkillUseWeaponDurability
{
public int skillid;
public int triggerindex;
}
[UxContract(Inline = true)]
internal sealed class AskWeaponEquipBullets
{
public ulong weaponinstanceid;
public uint bulletid;
}
[UxContract]
internal sealed class SpiritWeaponDurabilityChangedAction
{
public uint SpiritTid;
public ulong SpiritUid;
public ulong WeaponInstanceId;
public int Durability;
public int MagazineAmmo;
public uint CurrentBulletId;
public int StackCount;
}
@@ -0,0 +1,71 @@
using Ananta.SDK.Serialization;
namespace Ananta.Server.RpcTypes.Client4229938.Methods.GameScene;
/// <summary>
/// Client -&gt; GameSceneGM GmSpawnVehicle(uint32 templateid, UXVector3 position, float facing,
/// uint32 suitid, bool loadownvehicle, string spoonname).
/// From ClientToGameSceneGMDelegate.lua (build 4229938). Returns u64 entity id.
/// </summary>
[UxContract(Inline = true)]
internal sealed class GmSpawnVehicle
{
public uint TemplateId;
public UxVector3 Position;
public float Facing;
public uint SuitId;
public bool LoadOwnVehicle;
public string SpoonName = string.Empty;
}
/// <summary>
/// Client -&gt; GameSceneGM GmAddEnemyWithPosition(uint32 enemyid, byte camp-enum92,
/// UXVector3 position, uint32 navtagtype, bool outsideaoimove). Returns u64 entity id.
/// </summary>
[UxContract(Inline = true)]
internal sealed class GmAddEnemyWithPosition
{
public uint EnemyId;
public byte Camp;
public UxVector3 Position;
public uint NavTagType;
public bool OutsideAoiMove;
}
/// <summary>
/// Client -&gt; GameSceneGM GmAddEnemy(uint32 enemyid, byte camp-enum92, string treename,
/// uint32 navtagtype, bool outsideaoimove). Returns u64 entity id.
/// </summary>
[UxContract(Inline = true)]
internal sealed class GmAddEnemy
{
public uint EnemyId;
public byte Camp;
public string TreeName = string.Empty;
public uint NavTagType;
public bool OutsideAoiMove;
}
/// <summary>
/// Client -&gt; GameSceneGM GmAddEnemyByPlayer(uint32 enemyid, byte camp-enum92).
/// Returns u64 entity id.
/// </summary>
[UxContract(Inline = true)]
internal sealed class GmAddEnemyByPlayer
{
public uint EnemyId;
public byte Camp;
}
/// <summary>
/// Client -&gt; GameSceneGM GmTeleportXYZ(float x, float y, float z, float facing).
/// Returns void.
/// </summary>
[UxContract(Inline = true)]
internal sealed class GmTeleportXYZ
{
public float X;
public float Y;
public float Z;
public float Facing;
}
@@ -0,0 +1,375 @@
using Ananta.SDK.Serialization;
namespace Ananta.Server.RpcTypes.Client4229938.Methods.GameScene;
/// <summary>
/// Client -&gt; GameScene AskSummonVehicle(uint32 vehicleconfigid, UXVector3 position, float facingdirection).
/// From ClientToGameSceneDelegate.lua (build 4229938).
/// </summary>
[UxContract(Inline = true)]
internal sealed class AskSummonVehicle
{
public uint VehicleConfigId;
public UxVector3 Position;
public float FacingDirection;
}
/// <summary>
/// Server -&gt; client SummonVehicleResult: inline struct { ulong VehicleEntityId; ulong TaskToken; }
/// (RPCDeserializeAuto reader 674, read via Base.ReadStruct).
/// </summary>
[UxContract(Inline = true)]
internal sealed class SummonVehicleResult
{
public ulong VehicleEntityId;
public ulong TaskToken;
}
/// <summary>VehicleClientPart: struct reader 1618 { uint Type; uint ConfigId; }.</summary>
[UxContract(Inline = true)]
internal struct VehicleClientPart
{
public uint Type;
public uint ConfigId;
}
/// <summary>
/// PlayerVehicleClientDetail: complex reader 434
/// { uint Id; List7Bit&lt;struct VehicleClientPart&gt; Parts; uint SuitId; bool IsPersistent; }.
/// </summary>
[UxContract]
internal sealed class PlayerVehicleClientDetail
{
public uint Id;
[UxCollection(Count = UxCountEncoding.Int7, ItemObjectEncoding = UxObjectEncoding.Struct)]
public List<VehicleClientPart> Parts = [];
public uint SuitId;
public bool IsPersistent;
}
/// <summary>
/// Server -&gt; client SyncLogicVehicleEnter: full world-vehicle spawn (reader: complex).
/// Field order verified against IL2CPP metadata (UX.Game.LogicVehicleClientInfo,
/// 11 fields) and Lua Auto.WriteLogicVehicleClientInfo (RPCSerializeAuto.lua).
/// </summary>
[UxContract]
internal sealed class SyncLogicVehicleEnter
{
public ulong EntityId;
public uint VehicleConfigId;
/// <summary>UX.Game.VehicleCreateSourceType as byte (Invalid=0, Task=1, Summon=2, ...).</summary>
public byte CreateSourceType;
[UxCollection(Count = UxCountEncoding.Int7, ItemObjectEncoding = UxObjectEncoding.Struct)]
public List<VehicleClientPart> Parts = [];
public uint SuitId;
public string LicensePlate = string.Empty;
public bool Interactable;
public int MoveToken;
public UxVector3 Position;
public UxVector3 EulerAngles;
public string? VehicleSpoonName;
}
/// <summary>
/// Raid vehicle seat entry (IL2CPP UX.Game.RaidVehicleSeatInfo + V2 wire):
/// { u64 EntityId; byte SeatIndex; byte SeatState; bool DestroyRelated }.
/// </summary>
[UxContract]
internal sealed class RaidVehicleSeatInfo
{
public ulong EntityId;
public byte SeatIndex;
public byte SeatState;
public bool DestroyRelated;
}
/// <summary>
/// Server -&gt; client SyncSpawnVehicle payload (V2 field order, verified against
/// IL2CPP UX.Game.VehicleClientInfo typedef): the notify that materializes the car.
/// </summary>
[UxContract]
internal sealed class VehicleClientInfo
{
public ulong ControllerPid;
public byte CreateSourceType;
public ulong EntityId;
public uint VehicleConfigId;
[UxCollection(Count = UxCountEncoding.Int7, ItemObjectEncoding = UxObjectEncoding.Struct)]
public List<VehicleClientPart> Parts = [];
public uint SuitId;
public UxVector3 Position;
public float Facing;
public UxVector3 EulerAngles;
public float Velocity;
public bool IsStatic;
public int DeformStatus;
[UxCollection(Count = UxCountEncoding.Int7, ItemObjectEncoding = UxObjectEncoding.Complex)]
public List<RaidVehicleSeatInfo> SeatInfos = [];
public int SpoonId;
public bool IsDynamicGo;
public ulong VehicleEnemyId;
public bool DisableNavigation;
public bool Interactable;
public int MoveToken;
public string LicensePlate = string.Empty;
}
/// <summary>
/// Server -&gt; client SyncDestroyVehicle(entityId, destroyType, distance, dynamicGoId).
/// Signature from IL2CPP metadata (UX.Game.IGameSceneToClient).
/// </summary>
[UxContract(Inline = true)]
internal sealed class DestroyVehicle
{
public ulong VehicleEntityId;
public byte VehicleDestroyType;
public int Distance;
public int DynamicGoId;
}
/// <summary>
/// Return body of AskGetUnlockedVehicles: top-level List7Bit&lt;PlayerVehicleClientDetail&gt;
/// (midToReturnMessageReader[63272881]: ReadList7Bit + ReadComplex reader 434).
/// </summary>
[UxContract(Inline = true)]
internal sealed class AskGetUnlockedVehiclesResult
{
[UxCollection(Count = UxCountEncoding.Int7, ItemObjectEncoding = UxObjectEncoding.Complex)]
public List<PlayerVehicleClientDetail> Vehicles = [];
}
/// <summary>
/// Server -&gt; client SyncTeleportVehicle(entityId, position, rotation, velocity, reset, moveToken).
/// Signature from IL2CPP metadata (UX.Game.IGameSceneToClient): all primitives/inline.
/// </summary>
[UxContract(Inline = true)]
internal sealed class SyncTeleportVehicle
{
public ulong EntityId;
public UxVector3 Position;
public UxVector3 Rotation;
public float Velocity;
public bool Reset;
public int MoveToken;
}
/// <summary>Server -&gt; client SyncRemoveVehicle(entityId). Signature from IL2CPP metadata.</summary>
[UxContract(Inline = true)]
internal sealed class SyncRemoveVehicle
{
public ulong EntityId;
}
/// <summary>
/// Client -&gt; GameScene AskVehicleMove payload: complex RaidVehicleSyncData
/// { u64 Id; struct UXVector3 Position; f32 facingDirection;
/// struct UXVector3 EulerAngles; struct UXVector3 Velocity;
/// List7Bit&lt;byte&gt; Bits; i32 MoveToken }.
/// (ClientToGameSceneDelegate AskVehicleMove + Auto.WriteRaidVehicleSyncData.)
/// Server only tracks Position/facing for the debug panel; simulation stays client-side.
/// </summary>
[UxContract]
internal sealed class RaidVehicleSyncData
{
public ulong Id;
public UxVector3 Position;
public float FacingDirection;
public UxVector3 EulerAngles;
public UxVector3 Velocity;
[UxCollection(Count = UxCountEncoding.Int7)]
public List<byte> Bits = [];
public int MoveToken;
}
/// <summary>
/// Server -&gt; client SyncAetherAIInitDatas: vehicle-AI subsystem init (mirrors V2).
/// Lists stay empty on a private server; the header alone unblocks DriveManager.
/// </summary>
[UxContract]
internal sealed class AetherAIInitData
{
public uint RaidId;
public bool HasZoneGraph;
public int ZoneStorageDataHandle;
[UxCollection(Count = UxCountEncoding.Int7, ItemObjectEncoding = UxObjectEncoding.Complex)]
public List<AetherInitStub> Intersections = [];
[UxCollection(Count = UxCountEncoding.Int7, ItemObjectEncoding = UxObjectEncoding.Complex)]
public List<AetherInitStub> Vehicles = [];
[UxCollection(Count = UxCountEncoding.Int7, ItemObjectEncoding = UxObjectEncoding.Complex)]
public List<AetherInitStub> StaticVehicles = [];
}
/// <summary>Never serialized (all Aether init lists are empty); satisfies the serializer.</summary>
[UxContract]
internal sealed class AetherInitStub
{
}
/// <summary>
/// Server -> client SyncChangeVehicleInteractable(ulong vehicleInstanceId, bool interactable).
/// Inline struct (no complex marker). From RPCDeserializeAuto reader for 68943521.
/// </summary>
[UxContract(Inline = true)]
internal sealed class SyncChangeVehicleInteractable
{
public ulong VehicleInstanceId;
public bool Interactable;
}
/// <summary>
/// Server -> client SyncChangeVehicleController(ulong vehicleInstanceId, ulong controllerPid).
/// Inline struct. Mirrors V2 (verified against client drive lifecycle).
/// </summary>
[UxContract(Inline = true)]
internal sealed class SyncChangeVehicleController
{
public ulong VehicleInstanceId;
public ulong ControllerPid;
}
/// <summary>Boarding ext info: WriteBoardingExtInfo field order (V2-verified vs Lua).</summary>
[UxContract]
internal sealed class BoardingExtInfo
{
public UxVector3 PositionOffset;
public UxVector3 RotationOffset;
public bool CanBeEjected;
public bool UseSpecificAction;
public uint ActionGroup;
public uint ActionId;
}
/// <summary>
/// Server -> client SyncUnitVehicleStatus payload: WriteNewClientBoardingInfo order
/// { u64 EntityId; byte Status; u64 VehicleUId; byte SeatIndex; ExtInfo? }.
/// Status: 0=none, 2=enter-start, 3=enter-phase2, 4=seated, 5=exit-start.
/// </summary>
[UxContract]
internal sealed class NewClientBoardingInfo
{
public ulong EntityId;
public byte Status;
public ulong VehicleUId;
public byte SeatIndex;
public BoardingExtInfo? ExtInfo;
}
/// <summary>Server -> client SyncPlayerMoveToDriveSeat(pid, vehicleEntityId). Inline.</summary>
[UxContract(Inline = true)]
internal sealed class SyncPlayerMoveToDriveSeat
{
public ulong Pid;
public ulong VehicleEntityId;
}
/// <summary>Server -> client SyncPlayerExitVehicle(vehicleEntityId, force, stopBeforeLeave). Inline.</summary>
[UxContract(Inline = true)]
internal sealed class SyncPlayerExitVehicle
{
public ulong VehicleEntityId;
public bool Force;
public bool StopBeforeLeave;
}
/// <summary>
/// Drive-state struct shared by client notifies and server enter/exit notifies
/// (SyncPlayerStartEnterOrExitVehicl / SyncPlayerVehicleStateChange /
/// SyncPlayerFinishEnterOrExitVehic). V2-verified order; SeatIndex is int.
/// </summary>
[UxContract(Inline = true)]
internal sealed class PlayerVehicleDriveStateInfo
{
public ulong Pid;
public bool EnterOrLeave;
public ulong VehicleEntityId;
public int SeatIndex;
public bool IfForce;
public int OpenDoorTypeId;
public int OpenDoorActionSpeed;
public int OpenDoorActionClipLength;
}
/// <summary>Client -> server AskClaimVehicleSeat(vehicleEntityId, seatIndices). Inline.</summary>
[UxContract(Inline = true)]
internal sealed class AskClaimVehicleSeatArgs
{
public ulong VehicleEntityId;
[UxCollection(Count = UxCountEncoding.Int7)]
public List<byte> SeatIndices = [];
}
/// <summary>Client -> GameScene AskVehicleStartAutonomousDriving(bool hasvalidtargetposition, UXVector3 targetposition).</summary>
[UxContract(Inline = true)]
internal sealed class AskVehicleStartAutonomousDrivingArgs
{
public bool HasValidTargetPosition;
public UxVector3 TargetPosition;
}
/// <summary>Client -> GameScene AskVehicleChangeAutonomousDrivingTarget(UXVector3 targetposition).</summary>
[UxContract(Inline = true)]
internal sealed class AskVehicleChangeAutonomousDrivingTargetArgs
{
public UxVector3 TargetPosition;
}
/// <summary>Server -> client SyncVehicleAutonomousDrivingState(ulong vehicleEntityId, bool isStart).</summary>
[UxContract(Inline = true)]
internal sealed class SyncVehicleAutonomousDrivingState
{
public ulong VehicleEntityId;
public bool IsStart;
}
/// <summary>Server -> client SyncPlayerAutonomousDrivingState(bool isInOverrideMode, bool isAutoDrivingBlocked, bool isImmersiveModeBlocked).</summary>
[UxContract(Inline = true)]
internal sealed class SyncPlayerAutonomousDrivingState
{
public bool IsInOverrideMode;
public bool IsAutoDrivingBlocked;
public bool IsImmersiveModeBlocked;
}
/// <summary>Client -> GameScene AskVehicleNavigationPathPoints</summary>
[UxContract(Inline = true)]
internal sealed class AskVehicleNavigationPathPointsArgs
{
public uint NavReqId;
public UxVector3 TargetPosition;
public bool IgnoreDirection;
public bool IgnoreAlley;
public bool NeedCenterPoints;
public bool UseNavmeshConnect;
public uint NavigationProfile;
}
/// <summary>Server -> client VehicleNavigationPathPointsResult (reader 677).</summary>
[UxContract]
internal sealed class VehicleNavigationPathPointsResult
{
public uint NavReqId;
[UxCollection(Count = UxCountEncoding.Int7, ItemObjectEncoding = UxObjectEncoding.Struct)]
public List<UxVector3> Points = [];
[UxCollection(Count = UxCountEncoding.Int7, ItemObjectEncoding = UxObjectEncoding.Struct)]
public List<UxVector3> CenterPoints = [];
}
/// <summary>Server -> client SyncCurrentTask (64450155).</summary>
[UxContract(Inline = true)]
internal sealed class SyncCurrentTaskInfo
{
public byte Type;
public uint TaskId;
public uint EventId;
public bool FirstTime;
public byte Reason;
}
/// <summary>Server -> client SyncSceneFogMapAllUnlock (64915741).</summary>
[UxContract(Inline = true)]
internal sealed class SyncSceneFogMapAllUnlockInfo
{
public uint SceneId;
public bool Unlocked;
}
@@ -0,0 +1,348 @@
using Ananta.SDK.Serialization;
namespace Ananta.Server.RpcTypes.Client4229938.Methods.GameScene;
[UxContract(Inline = true)]
internal struct UxVector3
{
public float X;
public float Y;
public float Z;
public UxVector3(float x, float y, float z) { X = x; Y = y; Z = z; }
}
[UxContract(Inline = true)]
internal sealed class SyncLogicAgentEnter { public ulong agentId; }
[UxContract(Inline = true)]
internal sealed class SyncLogicAgentLeave { public ulong agentId; }
[UxContract(Inline = true)]
internal sealed class SyncManagedLogicAgent
{
public ulong agentId;
public ulong pid;
public byte moveId;
}
[UxContract(Inline = true)]
internal sealed class SyncPlayerCurrentSpirit
{
public ulong playerPid;
public uint templateId;
public ulong spiritId;
public bool isAgentSwitch;
}
[UxContract(Inline = true)]
internal sealed class SyncSwitchSpiritConfigId
{
// 4229938 IGameSceneToClient.SyncSwitchSpiritConfigId(uint, UXVector3, List<ulong>).
// The third field is mandatory even when the switch has no spawned helper agents.
public uint configId;
public UxVector3 position;
[UxCollection(Count = UxCountEncoding.Int7)]
public List<ulong> spawnedAgentIds = [];
}
/// <summary>PreSwitchSpiritData is an inline struct: there is no leading complex marker.</summary>
[UxContract(Inline = true)]
internal sealed class SyncPreSwitchSpirit
{
public uint configId;
public uint newTemplateId;
public UxVector3 position;
}
[UxContract(Inline = true)]
internal sealed class SyncSceneLoadCompleted { public ulong sceneId; }
[UxContract(Inline = true)]
internal sealed class SyncGamePause { public bool pause; }
[UxContract(Inline = true)]
internal sealed class AskSetGamePause
{
public bool value;
public byte reason;
}
/// <summary>Client -> GameScene AskSwitchSpirit(uint spiritId).</summary>
[UxContract(Inline = true)]
internal sealed class AskSwitchSpirit
{
public uint spiritId;
}
[UxContract(Inline = true)]
internal sealed class AskSwitchSpiritComplete
{
public uint switchSpiritId;
}
[UxContract(Inline = true)]
internal sealed class SyncEntityActionGroup
{
public ulong unitId;
public uint actionGroupId;
}
[UxContract(Inline = true)]
internal sealed class SyncChangeSkill
{
public ulong spiritId;
public uint skillId;
public float duration;
}
[UxContract(Inline = true)]
internal sealed class SyncUnitStates
{
public ulong unitId;
public List<uint>? states = [];
public uint effectFreezeState;
}
[UxContract(Inline = true)]
internal sealed class SyncRemoveUnitState
{
public ulong unitId;
public uint state;
public byte reason = 1;
public uint sourceId;
}
[UxContract(Inline = true)]
internal sealed class SyncPlayerLoadRate
{
public ulong playerPid;
public double rate;
}
[UxContract(Inline = true)]
internal sealed class SyncUnitPositionP
{
public ulong unitId;
public UxVector3 position;
public float facing;
public byte moveId;
public byte setPositionType;
}
[UxContract(Inline = true)]
internal sealed class SyncAllSpiritCombatPower
{
[UxCollection(Count = UxCountEncoding.Int7)]
public Dictionary<uint, float> combatPower = [];
}
// Client -> GameScene loading barrier messages.
[UxContract(Inline = true)]
internal sealed class AskLoadSceneCompleted
{
public ulong sceneId;
public ulong sessionId;
}
[UxContract(Inline = true)]
internal sealed class AskLoadGameResCompleted
{
public ulong sceneId;
}
[UxContract(Inline = true)]
internal sealed class AskLoadingFinished
{
public ulong sceneId;
public ulong sessionId;
}
// Client -> GameScene movement report: List7Bit<LogicAgentSyncData>.
[UxContract(Inline = true)]
internal sealed class AskReportLogicAgentSyncData
{
public List<LogicAgentSyncData> list = [];
}
[UxContract(Inline = true)]
internal sealed class LogicAgentSyncData
{
public ulong AgentId;
public UxVector3 Position;
public UxVector3 Rotation;
}
// Client movement contracts from RPCSerializeAuto.lua (build 4229938).
[UxContract(Inline = true)]
internal struct SimpleMoveActionData
{
public ulong UnitId;
public UxVector3 Pos;
public UxVector3 Rot;
public byte MoveId;
}
[UxContract]
internal sealed class MoveActionGroundData
{
public byte MoveGroundType;
public ulong MoveGroundId;
public byte MetaInfo;
public UxVector3 LocalPos;
}
[UxContract(Inline = true)]
internal struct SimpleMoveActionDataWithGround
{
public ulong UnitId;
public UxVector3 Pos;
public UxVector3 Rot;
public byte MoveId;
public MoveActionGroundData? GroundData;
}
[UxContract(Inline = true)]
internal struct MoveActionData
{
public ulong UnitId;
public UxVector3 Pos;
public UxVector3 Rot;
public byte MoveId;
public byte MoveTime;
public bool IsCritical;
[UxCollection(Count = UxCountEncoding.Int7)] public List<byte>? ActionData;
[UxCollection(Count = UxCountEncoding.Int7)] public List<byte>? EffectData;
}
[UxContract(Inline = true)]
internal struct MoveActionDataWithGround
{
public ulong UnitId;
public UxVector3 Pos;
public UxVector3 Rot;
public byte MoveId;
public byte MoveTime;
public MoveActionGroundData? GroundData;
public bool IsCritical;
[UxCollection(Count = UxCountEncoding.Int7)] public List<byte>? ActionData;
[UxCollection(Count = UxCountEncoding.Int7)] public List<byte>? EffectData;
}
[UxContract(Inline = true)]
internal sealed class AskUnitMoveActionSimple
{
[UxCollection(Count = UxCountEncoding.Int7, ItemObjectEncoding = UxObjectEncoding.Struct)]
public List<SimpleMoveActionData> actions = [];
}
[UxContract(Inline = true)]
internal sealed class AskUnitMoveActionSimpleWithGround
{
[UxCollection(Count = UxCountEncoding.Int7, ItemObjectEncoding = UxObjectEncoding.Struct)]
public List<SimpleMoveActionDataWithGround> actions = [];
}
[UxContract(Inline = true)]
internal sealed class AskUnitMoveAction
{
[UxCollection(Count = UxCountEncoding.Int7, ItemObjectEncoding = UxObjectEncoding.Struct)]
public List<MoveActionData> actions = [];
public uint clientLocalTime;
}
[UxContract(Inline = true)]
internal sealed class AskUnitMoveActionWithGround
{
[UxCollection(Count = UxCountEncoding.Int7, ItemObjectEncoding = UxObjectEncoding.Struct)]
public List<MoveActionDataWithGround> actions = [];
public uint clientLocalTime;
}
// Full SyncUnitPositionAndFacing tuple. The last two complex values are always null on our path;
// keeping named null-only placeholders documents the 4229938 wire instead of writing marker bytes by hand.
[UxContract]
internal sealed class MoveGroundInfoNullOnly { }
[UxContract]
internal sealed class LoadingInfoNullOnly { }
[UxContract(Inline = true)]
internal sealed class SyncUnitPositionAndFacing
{
public ulong unitId;
public UxVector3 position;
public float facing;
public byte moveId;
public bool continueMove;
public byte setPositionType;
public MoveGroundInfoNullOnly? moveGroundInfo;
public LoadingInfoNullOnly? loadingInfo;
}
// Teleport & Scene Switch contracts (build 4229938).
[UxContract]
internal sealed class PreTeleportOption
{
public uint configId;
public ulong teleportId;
public bool ForceClear;
public uint TimeLineDration;
public UxVector3 position;
public float facing;
public string beforeResName = string.Empty;
public bool customBeforeTrans;
public UxVector3 beforePosition;
public UxVector3 beforeRot;
public string loadingResName = string.Empty;
public string afterResName = string.Empty;
public bool customAfterTrans;
public UxVector3 afterPosition;
public UxVector3 afterRot;
public string extParams = string.Empty;
}
[UxContract(Inline = true)]
internal sealed class AskTeleportArgs
{
public PreTeleportOption option = new();
}
[UxContract(Inline = true)]
internal sealed class AskPlayerChangePositionByScenePortalArgs
{
public uint bonfireuniqueid;
}
[UxContract]
internal sealed class TeleportOption
{
public ulong teleportId;
public UxVector3 Position;
public float Facing;
public bool IsSwitchScene;
public bool WaitTaskResource;
public uint MapEntranceId;
}
[UxContract(Inline = true)]
internal sealed class SyncTeleport
{
public TeleportOption option = new();
}
[UxContract(Inline = true)]
internal sealed class SyncPreTeleportOption
{
public PreTeleportOption option = new();
}
[UxContract(Inline = true)]
internal sealed class AskPublicSwitchToPublicSceneArgs
{
public uint raidid;
public bool delay;
public uint mapentranceid;
}
@@ -0,0 +1,58 @@
using Ananta.SDK.Serialization;
namespace Ananta.Server.RpcTypes.Client4229938.Methods.LoginGate;
[UxContract(Inline = true)]
internal sealed class PatchCheckResult
{
public int patchVersion;
public List<uint> patches = [];
}
[UxContract]
internal sealed class CheckAccountResult
{
// Field set and order must match the 4229938 client CheckAccountResult
// (UX.Game, dump TypeDefIndex 32261): the reflection serializer emits
// fields by declaration order and the client rejects the response unless
// its `code` field lands on the wire position it expects (it must read 200).
public string unisdk_login_json = string.Empty;
public string Token = string.Empty;
public string UserName = string.Empty;
public int Aid;
public bool NeedRealNameTip;
public bool NeedRoleEnter;
public bool RealNameVerified;
public int HostId;
public int code;
public int subcode;
public string msg = string.Empty;
}
[UxContract(Inline = true)]
internal sealed class EnterGameResult
{
public int aid;
public ulong playerPid;
public GateServerInfo gate = new();
}
[UxContract]
internal sealed class GateServerInfo
{
public int aid;
public ulong playerPid;
public string host = string.Empty;
public int port;
public string loginToken = string.Empty;
public int serverId;
public string accountId = string.Empty;
}
[UxContract]
internal sealed class GameServerInfo
{
public string host = string.Empty;
public int port;
public string gameToken = string.Empty;
}
@@ -0,0 +1,4 @@
namespace Ananta.Server.RpcTypes.Client4229938;
/// <summary>Small server-side vector used by gameplay state. RPC vectors live in Methods/GameScene/WorldMethods.cs.</summary>
internal readonly record struct Vec3(float X, float Y, float Z);