Remove MainMenuMode.StartGame() reflection call that expected "Choose Your Map" screen state. Clients never see this screen in multiplayer, causing null references. Now transitions directly to playing mode like save loading does. Fixes: NullReferenceException at MainMenuMode.StartGame() 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
92 lines
3.2 KiB
C#
92 lines
3.2 KiB
C#
using KCM.Enums;
|
|
using Riptide.Demos.Steam.PlayerHosted;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using UnityEngine;
|
|
|
|
namespace KCM.Packets.Lobby
|
|
{
|
|
public class StartGame : Packet
|
|
{
|
|
public override ushort packetId => (int)Enums.Packets.StartGame;
|
|
|
|
public void Start()
|
|
{
|
|
Main.helper.Log("Starting multiplayer game...");
|
|
|
|
try
|
|
{
|
|
// For multiplayer, we don't call MainMenuMode.StartGame() because:
|
|
// 1. Clients never go through the "Choose Your Map" screen
|
|
// 2. MainMenuMode.StartGame() expects that screen's state to be initialized
|
|
// 3. Calling it causes NullReferenceException
|
|
// Instead, we transition directly to playing mode like when loading saves
|
|
|
|
SpeedControlUI.inst.SetSpeed(0);
|
|
|
|
// Transition to playing mode
|
|
GameState.inst.SetNewMode(GameState.inst.playingMode);
|
|
|
|
SpeedControlUI.inst.SetSpeed(0);
|
|
|
|
Main.helper.Log("Successfully started multiplayer game");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Main.helper.Log("Error starting multiplayer game:");
|
|
Main.helper.Log(ex.Message.ToString());
|
|
Main.helper.Log(ex.ToString());
|
|
}
|
|
}
|
|
|
|
public override void HandlePacketClient()
|
|
{
|
|
Start();
|
|
}
|
|
|
|
public override void HandlePacketServer()
|
|
{
|
|
//Start();
|
|
|
|
|
|
/*AIBrainsContainer.PreStartAIConfig aiConfig = new AIBrainsContainer.PreStartAIConfig();
|
|
int count = 0;
|
|
for (int i = 0; i < RivalKingdomSettingsUI.inst.rivalItems.Length; i++)
|
|
{
|
|
RivalItemUI r = RivalKingdomSettingsUI.inst.rivalItems[i];
|
|
bool flag = r.Enabled && !r.Locked;
|
|
if (flag)
|
|
{
|
|
count++;
|
|
}
|
|
}
|
|
int idx = 0;
|
|
aiConfig.startData = new AIBrainsContainer.PreStartAIConfig.AIStartData[count];
|
|
for (int j = 0; j < RivalKingdomSettingsUI.inst.rivalItems.Length; j++)
|
|
{
|
|
RivalItemUI item = RivalKingdomSettingsUI.inst.rivalItems[j];
|
|
bool flag2 = item.Enabled && !item.Locked;
|
|
if (flag2)
|
|
{
|
|
aiConfig.startData[idx] = new AIBrainsContainer.PreStartAIConfig.AIStartData();
|
|
aiConfig.startData[idx].landmass = item.flag.landmass;
|
|
aiConfig.startData[idx].bioCode = item.bannerIdx;
|
|
aiConfig.startData[idx].personalityKey = PersonalityCollection.aiPersonalityKeys[0];
|
|
aiConfig.startData[idx].skillLevel = item.GetSkillLevel();
|
|
idx++;
|
|
}
|
|
}
|
|
AIBrainsContainer.inst.aiStartInfo = aiConfig;
|
|
bool isControllerActive = GamepadControl.inst.isControllerActive;
|
|
if (isControllerActive)
|
|
{
|
|
ConsoleCursorMenu.inst.PrepForGamepad();
|
|
}*/
|
|
}
|
|
}
|
|
}
|