Files
K-C-Multiplayer/Packets/Lobby/WorldSeed.cs
devbeni c4eb7e944d Fix map synchronization between host and clients
Problem: Clients received WorldSeed packet before ServerSettings,
causing world generation with wrong mapSize/mapBias/mapRivers
parameters. Same seed but different parameters = different maps.

Solution: Include all map parameters directly in WorldSeed packet:
- WorldSize (map size)
- WorldType (map bias - continents/islands/etc)
- WorldRivers (river/lake density)

Now packet order doesn't matter - WorldSeed has everything needed
for identical world generation across all clients.

Changes:
- WorldSeed.cs: Add map parameters, set before Generate()
- ClientConnected.cs: Send full world params to joining clients
- ServerLobbyScript.cs: Send full params on new world generation
- Added [WORLD SYNC] debug logging

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-14 21:00:15 +01:00

61 lines
1.9 KiB
C#

using KCM.Packets.Handlers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
namespace KCM.Packets.Lobby
{
public class WorldSeed : Packet
{
public override ushort packetId => (int)Enums.Packets.WorldSeed;
public int Seed { get; set; }
// Map parameters to ensure correct generation
public World.MapSize WorldSize { get; set; }
public World.MapBias WorldType { get; set; }
public World.MapRiverLakes WorldRivers { get; set; }
public override void HandlePacketServer()
{
//SetWorldSeed();
}
public override void HandlePacketClient()
{
SetWorldSeed();
}
public void SetWorldSeed()
{
try
{
// Set map parameters BEFORE generating to ensure correct world
World.inst.mapSize = WorldSize;
World.inst.mapBias = WorldType;
World.inst.mapRiverLakes = WorldRivers;
Main.helper.Log($"[WORLD SYNC] Generating world - Seed: {Seed}, Size: {WorldSize}, Type: {WorldType}, Rivers: {WorldRivers}");
foreach (var player in Main.kCPlayers.Values)
player.inst.Reset();
World.inst.Generate(Seed);
Vector3 center = World.inst.GetCellData(World.inst.GridWidth / 2, World.inst.GridHeight / 2).Center;
Cam.inst.SetTrackingPos(center);
Main.helper.Log("[WORLD SYNC] World generation complete");
}
catch (Exception e)
{
Main.helper.Log("Set world seed packet error");
Main.helper.Log(e.Message);
Main.helper.Log(e.StackTrace);
Main.helper.Log(e.ToString());
}
}
}
}