Skip to content

Schedule I 0.4.7 open beta: three startup patch failures and the removed members behind them #305

Description

@madjagstudios

Heads up before the beta hits main: I put S1API 3.2.0 on the 0.4.7 open beta (Steam build 25404402, game 0.4.7f5) and diffed the game assemblies against 0.4.6f13 (build 24705572). Three patches fail at startup, and a good chunk of the wrapped surface moved underneath. Details below, all from a first-launch log plus a symbol diff of the two builds. Happy to share the full 148-row member cross-reference if it helps.

Environment

  • MelonLoader 0.7.3, S1APILoader 2.5.0, S1API 3.2.0 (stable @ 7dc810c), S1MAPI 2.0.0 (no errors)
  • Main menu only, no save loaded. Il2CppAssemblyGenerator: 885 methods and 3 fields not restored, 1,226 unstrip failures
  • Diff: 52,297 to 55,139 symbols; 5,870 added, 3,028 removed, 468 with relationship changes

What fails at startup

1. NPCPatches.NPCHealth_Awake_Prefix throws on every NPC awake (S1API/Internal/Patches/NPCPatches.cs around line 2479)

System.MissingMethodException: Method not found: 'Void Il2CppScheduleOne.NPCs.NPCHealth.set_npc(Il2CppScheduleOne.NPCs.NPC)'.
   at S1API.Internal.Patches.NPCPatches.NPCHealth_Awake_Prefix(NPCHealth __instance)

NPCHealth.npc (public field) is gone; it is now a private _npc. The health model also changed: Start(), AfflictedWithLethalEffect, REVIVE_DAYS, and set_Health(float) are removed; SetHealthData(NPCs.Framework.Health), ResetToDefault(), an onTakeDamage event, set_MaxHealth, and a SyncVar-backed _currentHealth are added. This is the loud one since it fires per spawn.

2. AvatarAccessoryPatches+AvatarApplyAccessorySettingsPatch.TargetMethod() returns null (AvatarAccessoryPatches.cs lines 34-37)

Avatar.ApplyAccessorySettings(AvatarSettings) no longer exists, and neither does the rest of the AvatarSettings-driven surface on Avatar: every Apply*Settings, LoadAvatarSettings, LoadNakedSettings, CurrentSettings, appliedAccessories, onSettingsLoaded, GetMugshot. AvatarFramework.MugshotGenerator and the whole AvatarFramework.Customization namespace are removed. Replacement is the new ScheduleOne.Avatar namespace: Avatar.Appearance (AvatarAppearance), AvatarObjectLibrary, Avatar.Tools.MugshotGenerator.GenerateMugshot(NakedAppearance, Outfit, Action<Texture2D>), NakedAppearanceLoader, OutfitLoader, BasicAvatarSettingsConverter. AvatarSettings survives as a shim with EquivalentNakedAppearance and EquivalentOutfit; Accessory gained AvatarObjectEquivalent. There is no single method to retarget this patch to.

3. CustomProductManifestPlayerPatches.RequestPlayerDataPrefix has no target (CustomProductManifestPatches.cs line 55, the nameof(Player.RequestPlayerData))

Player.RequestPlayerData(string), ReceivePlayerData(...), and both Load(PlayerData...) overloads are removed. Added: RequestPlayerData_Server(string, bool), SetPlayerData_Client(NetworkConnection, FullPlayerData), SetPlayerNameAndId_Client/_Server, SetPlayerLoaded_Server, OnLocalPlayerLoaded(), CurrentAppearance (PlayerAppearance), and a new PlayerScripts.FullPlayerData type replacing the PlayerData plus loose strings shape.

Other removals under wrapped surfaces (not hit in a main-menu session)

Type Removed Added
GameTime.TimeManager onSleepStart, onSleepEnd, IsSleepInProgress, HostSleepDone, WakeTime, StartSleep(), CheckSleepStart(), SetTimeAndSync, SkipForwardToTime new GameTime.SleepController with OnSleepStart/OnSleepEnd events and EPhase; ISleepEvent; SetTime_Server, SkipToTimeAndSync, Normalized24HourTime. CurrentTime, ElapsedDays, GetMinutesFrom24HourTime unchanged. UI.SleepCanvas removed.
NPCs.NPCMovement public Agent, agentCurrentPath, agentCurrentSpeed, WalkSpeed, RunSpeed, MoveSpeedMultiplier, UpdateSpeed(), WarpToNavMesh(), walkResultCallback; nested NPCSpeedController.SpeedControl private _agent, _currentPath, SpeedController property, DefaultWalkSpeed, SetAgentSpeed, SetAgentAvoidancePriority, AgentDesiredVelocity, NavMeshAreaMask; new NPCs.SpeedControl, NPCSpeedPresets
NPCs.NPC SendTextMessage(string), CreateMessageConversation() AssignConversationMessage(MSGConversation), CreateAndAssignDefaultMessageConversation(), CreateMessageConversationWhenLocalPlayerExists(), UnassignConversationMessage(), Gender
Messaging.MSGConversation Sendables field private _sendables, SendPlayerMessage(SendableMessage, int, bool), GetSenderIcon(). currentResponses unchanged. IMessageEntity and ResponseCallback types removed; MessageContactInfo added
Dialogue DialogueContainer type Dialogue.Conversation
Clothing ClothingUtility (+ ClothingSlotData, ColorData), EClothingApplicationType ClothingConfiguration, ClothingSettings
UI.CharacterCreator.* whole namespace new top-level CharacterCreator namespace
Persistence.LoadManager 138 symbols removed, 140 added needs its own read
Quests Quest_TheDeepEnd none

Removed types S1API still references by name: CharacterCreator, MugshotGenerator, ClothingUtility and its nested data types, EClothingApplicationType, DialogueContainer, NPCSpeedController.SpeedControl.

Verified unchanged: NPCManager.NPCRegistry, NPC.Avatar, NPC.SetVisible, Player.IsRagdolled, PlayerMovement.Teleport, CallManager.QueueCall, Phone.IsOpen, Business.OwnedBusinesses, Property.LoadingDocks, Property.EmployeeCapacity, Employee.IsAnyWorkInProgress, CurfewManager.OnUncappedMinPass, the Player arrest RPC, and all the employee work behaviour types.

New surfaces that might be worth wrapping

  • SpecialCustomers.* (26 types): SpecialCustomerManager, SpecialCustomerLeader, SpecialCustomerCamp, SpecialCustomerGroupPOI, group save data, activities, and the queuecustomergroup console command
  • Map.NPCEnterableBuilding: OnNPCEnteredBuilding, OnNPCExitedBuilding, GetOccupants()
  • GameTime.SleepController phases and events
  • Avatar.AvatarObjectLibrary and the Avatar.Creation editors (the patch notes say user-created cosmetics build on these later)
  • New behaviours: ComputerBehaviour, ConversationBehaviour, DancingBehaviour, GuitarBehaviour, MoveToAndActBehaviour, PhoneBehaviour, SittingBehaviour, RevingBehaviour, ProtestingBehaviour

Repro

Switch to the beta branch in Steam, launch with MelonLoader and S1API 3.2.0, reach the main menu, read MelonLoader/Latest.log. The two HarmonyInit failures show during S1API init; the set_npc exception appears as soon as NPC prefabs awake.

Diffs were produced offline with S1Atlas (https://github.com/madjagstudios/S1Atlas) against a local install; no game content redistributed. The beta branch of this repo (3.1.0-beta.9, July) predates all of this, so nothing there covers it yet.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions