Skip to content

Commit d0049ff

Browse files
Merge pull request #533 from starfi5h/pr-bugfix0.8.3
2 parents 23e833e + 41fdcc8 commit d0049ff

File tree

16 files changed

+191
-148
lines changed

16 files changed

+191
-148
lines changed

.github/scripts/thunderstore_bundle.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,8 @@ function generateManifest() {
123123
BEPINEX_DEPENDENCY,
124124
`nebula-${apiPluginInfo.name}-${apiPluginInfo.version}`,
125125
"PhantomGamers-IlLine-1.0.0",
126-
"CommonAPI-CommonAPI-1.2.2",
127-
"starfi5h-BulletTime-1.2.0",
126+
"CommonAPI-CommonAPI-1.4.5",
127+
"starfi5h-BulletTime-1.2.1",
128128
],
129129
website_url: "https://github.com/hubastard/nebula"
130130
};

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,12 @@
33
0.8.4:
44

55
- @kremnev8: add two new events to Nebula API
6+
- @starfish: fixed issue where client would sometimes be unable to load in while using GalacticScale
7+
- @starfish: custom planet and star names now show up in lobby (not while GalacticScale is active)
8+
- @starfi5h: show correct resource amount in UIPlanetDetail
9+
- @starfi5h: show custom planet and star names in lobby screen
10+
- @starfi5h: the selected starting planet name will now show on the lobby screen
11+
- @starfi5h: fixed issue where the nametag on the minimap wouldn't show up for a client that rejoined
612

713
0.8.3:
814

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
<PackageReference Include="BepInEx.Core" Version="5.*" PrivateAssets="all" />
5151
<PackageReference Include="UnityEngine.Modules" Version="2018.4.12" IncludeAssets="compile" PrivateAssets="all" />
5252
<PackageReference Include="DysonSphereProgram.GameLibs" Version="*-*" IncludeAssets="compile" PrivateAssets="all" />
53-
<PackageReference Include="DysonSphereProgram.Modding.CommonAPI" Version="1.4.1" IncludeAssets="compile" PrivateAssets="all"
53+
<PackageReference Include="DysonSphereProgram.Modding.CommonAPI" Version="1.4.5" IncludeAssets="compile" PrivateAssets="all"
5454
Condition=" '$(MSBuildProjectName)' != 'NebulaAPI' " />
5555

5656
</ItemGroup>
Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,16 @@
1-
using System.Collections.Generic;
2-
using System.Linq;
3-
4-
namespace NebulaModel.Packets.Planet
1+
namespace NebulaModel.Packets.Planet
52
{
63
public class PlanetDataResponse
74
{
8-
public int[] PlanetDataIDs { get; set; }
9-
public byte[] PlanetDataBytes { get; set; }
10-
public int[] PlanetDataBytesLengths { get; set; }
5+
public int PlanetDataID { get; set; }
6+
public byte[] PlanetDataByte { get; set; }
117

128
public PlanetDataResponse() { }
139

14-
public PlanetDataResponse(Dictionary<int, byte[]> planetData)
10+
public PlanetDataResponse(int planetId, byte[] planetData)
1511
{
16-
PlanetDataIDs = planetData.Keys.ToArray();
17-
18-
// Can't use a jagged array because LNL serializer says no, so flattening and separate offset array it is
19-
// TODO: Possibly register a type with the serializer instead of doing this manually
20-
PlanetDataBytes = planetData.Values.SelectMany(x => x).ToArray();
21-
PlanetDataBytesLengths = planetData.Values.Select(x => x.Length).ToArray();
12+
PlanetDataID = planetId;
13+
PlanetDataByte = planetData;
2214
}
2315
}
2416
}

NebulaModel/Packets/Universe/NameInputPacket.cs

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,53 @@
1-
namespace NebulaModel.Packets.Universe
1+
using NebulaAPI;
2+
using System.Collections.Generic;
3+
4+
namespace NebulaModel.Packets.Universe
25
{
36
// Packet for name input for Planets and Stars
47
public class NameInputPacket
58
{
6-
public string Name { get; set; }
7-
public int PlanetId { get; set; }
8-
public int StarId { get; set; }
9+
public string[] Names { get; set; }
10+
public int[] PlanetIds { get; set; }
11+
public int[] StarIds { get; set; }
912
public int AuthorId { get; set; }
1013

1114
public NameInputPacket() { }
1215
public NameInputPacket(string name, int starId, int planetId, int authorId)
1316
{
14-
Name = name;
15-
StarId = starId;
16-
PlanetId = planetId;
17+
Names = new string[1] { name };
18+
StarIds = new int[1] { starId };
19+
PlanetIds = new int[1] { planetId };
20+
AuthorId = authorId;
21+
}
22+
23+
public NameInputPacket(in GalaxyData galaxy, int authorId)
24+
{
25+
List<string> names = new List<string>();
26+
List<int> starIds = new List<int>();
27+
List<int> planetIds = new List<int>();
28+
29+
foreach (StarData s in galaxy.stars)
30+
{
31+
if (!string.IsNullOrEmpty(s.overrideName))
32+
{
33+
names.Add(s.overrideName);
34+
starIds.Add(s.id);
35+
planetIds.Add(NebulaModAPI.PLANET_NONE);
36+
}
37+
foreach (PlanetData p in s.planets)
38+
{
39+
if (!string.IsNullOrEmpty(p.overrideName))
40+
{
41+
names.Add(p.overrideName);
42+
starIds.Add(NebulaModAPI.STAR_NONE);
43+
planetIds.Add(p.id);
44+
}
45+
}
46+
}
47+
48+
Names = names.ToArray();
49+
StarIds = starIds.ToArray();
50+
PlanetIds = planetIds.ToArray();
1751
AuthorId = authorId;
1852
}
1953
}

NebulaNetwork/PacketProcessors/Planet/PlanetDataRequestProcessor.cs

Lines changed: 10 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using NebulaModel.Networking;
55
using NebulaModel.Packets;
66
using NebulaModel.Packets.Planet;
7-
using System.Collections.Generic;
87

98
namespace NebulaNetwork.PacketProcessors.Planet
109
{
@@ -17,17 +16,16 @@ public override void ProcessPacket(PlanetDataRequest packet, NebulaConnection co
1716
{
1817
return;
1918
}
20-
21-
Dictionary<int, byte[]> planetDataToReturn = new Dictionary<int, byte[]>();
22-
19+
2320
foreach (int planetId in packet.PlanetIDs)
2421
{
2522
ThreadingHelper.Instance.StartAsyncInvoke(() =>
2623
{
27-
PlanetCompute(planetId, planetDataToReturn);
28-
return () => Callback(conn, planetDataToReturn, packet.PlanetIDs.Length);
24+
byte[] data = PlanetCompute(planetId);
25+
// use callback to run in mainthread
26+
return () => conn.SendPacket(new PlanetDataResponse(planetId, data));
2927
});
30-
}
28+
}
3129
}
3230

3331
public static void OnActivePlanetLoaded(PlanetData planet)
@@ -36,7 +34,7 @@ public static void OnActivePlanetLoaded(PlanetData planet)
3634
planet.onLoaded -= OnActivePlanetLoaded;
3735
}
3836

39-
private static void PlanetCompute(int planetId, Dictionary<int, byte[]> planetDataToReturn)
37+
private static byte[] PlanetCompute(int planetId)
4038
{
4139
PlanetData planet = GameMain.galaxy.PlanetById(planetId);
4240
HighStopwatch highStopwatch = new HighStopwatch();
@@ -69,27 +67,14 @@ private static void PlanetCompute(int planetId, Dictionary<int, byte[]> planetDa
6967
}
7068
}
7169

70+
byte[] data;
7271
using (BinaryUtils.Writer writer = new BinaryUtils.Writer())
7372
{
7473
planet.ExportRuntime(writer.BinaryWriter);
75-
lock (planetDataToReturn)
76-
{
77-
planetDataToReturn.Add(planetId, writer.CloseAndGetBytes());
78-
}
79-
}
80-
Log.Info($"Returning terrain for {planet.name}, time:{highStopwatch.duration:F5} s");
81-
}
82-
83-
private static void Callback(NebulaConnection conn, Dictionary<int, byte[]> planetDataToReturn, int count)
84-
{
85-
lock (planetDataToReturn)
86-
{
87-
if (planetDataToReturn.Count == count)
88-
{
89-
conn.SendPacket(new PlanetDataResponse(planetDataToReturn));
90-
planetDataToReturn.Clear();
91-
}
74+
data = writer.CloseAndGetBytes();
9275
}
76+
Log.Info($"Returning terrain for {planet.name} (id:{planet.id} time:{highStopwatch.duration:F4}s)");
77+
return data;
9378
}
9479
}
9580
}

NebulaNetwork/PacketProcessors/Planet/PlanetDataResponseProcessor.cs

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using NebulaModel.Packets;
55
using NebulaModel.Packets.Planet;
66
using NebulaWorld;
7-
using System.Linq;
87

98
namespace NebulaNetwork.PacketProcessors.Planet
109
{
@@ -18,36 +17,37 @@ public override void ProcessPacket(PlanetDataResponse packet, NebulaConnection c
1817
return;
1918
}
2019

21-
// We have to track the offset we are currently at in the flattened jagged array as we decode
22-
int currentOffset = 0;
2320

24-
for (int i = 0; i < packet.PlanetDataIDs.Length; i++)
25-
{
26-
PlanetData planet = null;
21+
PlanetData planet = null;
2722

28-
if (Multiplayer.Session.IsInLobby)
29-
{
30-
planet = UIRoot.instance.galaxySelect.starmap._galaxyData.PlanetById(packet.PlanetDataIDs[i]);
31-
}
32-
else
33-
{
34-
planet = GameMain.galaxy.PlanetById(packet.PlanetDataIDs[i]);
35-
}
23+
if (Multiplayer.Session.IsInLobby)
24+
{
25+
planet = UIRoot.instance.galaxySelect.starmap._galaxyData.PlanetById(packet.PlanetDataID);
26+
}
27+
else
28+
{
29+
planet = GameMain.galaxy.PlanetById(packet.PlanetDataID);
30+
}
3631

37-
Log.Info($"Parsing {packet.PlanetDataBytesLengths[i]} bytes of data for planet {planet.name} (ID: {planet.id})");
38-
byte[] planetData = packet.PlanetDataBytes.Skip(currentOffset).Take(packet.PlanetDataBytesLengths[i]).ToArray();
32+
Log.Info($"Parsing {packet.PlanetDataByte.Length} bytes of data for planet {planet.name} (ID: {planet.id})");
3933

40-
using (BinaryUtils.Reader reader = new BinaryUtils.Reader(planetData))
41-
{
42-
planet.ImportRuntime(reader.BinaryReader);
43-
}
34+
using (BinaryUtils.Reader reader = new BinaryUtils.Reader(packet.PlanetDataByte))
35+
{
36+
planet.ImportRuntime(reader.BinaryReader);
37+
}
4438

39+
if (Multiplayer.Session.IsInLobby)
40+
{
41+
// Pretend planet is loaded to make planetDetail show resources
42+
planet.loaded = true;
43+
UIRoot.instance.uiGame.planetDetail.RefreshDynamicProperties();
44+
}
45+
else
46+
{
4547
lock (PlanetModelingManager.genPlanetReqList)
4648
{
4749
PlanetModelingManager.genPlanetReqList.Enqueue(planet);
4850
}
49-
50-
currentOffset += packet.PlanetDataBytesLengths[i];
5151
}
5252
}
5353
}

NebulaNetwork/PacketProcessors/Session/LobbyRequestProcessor.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using NebulaModel.Packets;
77
using NebulaModel.Packets.Players;
88
using NebulaModel.Packets.Session;
9+
using NebulaModel.Packets.Universe;
910
using NebulaModel.Utils;
1011
using NebulaWorld;
1112
using System.Collections.Generic;
@@ -133,7 +134,19 @@ public override void ProcessPacket(LobbyRequest packet, NebulaConnection conn)
133134
{
134135
if (savedPlayerData.TryGetValue(clientCertHash, out IPlayerData value))
135136
{
136-
player.LoadUserData(value);
137+
using (playerManager.GetConnectedPlayers(out Dictionary<INebulaConnection, INebulaPlayer> connectedPlayers))
138+
{
139+
IPlayerData playerData = value;
140+
foreach (INebulaPlayer connectedPlayer in connectedPlayers.Values)
141+
{
142+
if (connectedPlayer.Data == playerData)
143+
{
144+
playerData = value.CreateCopyWithoutMechaData();
145+
Log.Warn($"Copy playerData for duplicated player{playerData.PlayerId} {playerData.Username}");
146+
}
147+
}
148+
player.LoadUserData(playerData);
149+
}
137150
}
138151
else
139152
{
@@ -223,6 +236,9 @@ public override void ProcessPacket(LobbyRequest packet, NebulaConnection conn)
223236
player.SendPacket(new LobbyResponse(galaxySelect.gameDesc.galaxyAlgo, galaxySelect.gameDesc.galaxySeed, galaxySelect.gameDesc.starCount, galaxySelect.gameDesc.resourceMultiplier, p.CloseAndGetBytes(), count));
224237
}
225238
}
239+
240+
// Send overriden Planet and Star names
241+
player.SendPacket(new NameInputPacket(GameMain.galaxy, Multiplayer.Session.LocalPlayer.Id));
226242
}
227243
}
228244
}

NebulaNetwork/PacketProcessors/Session/SyncCompleteProcessor.cs

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -62,21 +62,7 @@ public override void ProcessPacket(SyncComplete packet, NebulaConnection conn)
6262
}
6363

6464
// Load overriden Planet and Star names
65-
foreach (StarData s in GameMain.galaxy.stars)
66-
{
67-
if (!string.IsNullOrEmpty(s.overrideName))
68-
{
69-
player.SendPacket(new NameInputPacket(s.overrideName, s.id, NebulaModAPI.PLANET_NONE, Multiplayer.Session.LocalPlayer.Id));
70-
}
71-
72-
foreach (PlanetData p in s.planets)
73-
{
74-
if (!string.IsNullOrEmpty(p.overrideName))
75-
{
76-
player.SendPacket(new NameInputPacket(p.overrideName, NebulaModAPI.STAR_NONE, p.id, Multiplayer.Session.LocalPlayer.Id));
77-
}
78-
}
79-
}
65+
player.SendPacket(new NameInputPacket(GameMain.galaxy, Multiplayer.Session.LocalPlayer.Id));
8066

8167
// Since the player is now connected, we can safely spawn his player model
8268
Multiplayer.Session.World.SpawnRemotePlayerModel(player.Data);

NebulaNetwork/PacketProcessors/Universe/NameInputProcessor.cs

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using NebulaAPI;
2+
using NebulaModel.Logger;
23
using NebulaModel.Networking;
34
using NebulaModel.Packets;
45
using NebulaModel.Packets.Universe;
@@ -21,37 +22,46 @@ public NameInputProcessor()
2122

2223
public override void ProcessPacket(NameInputPacket packet, NebulaConnection conn)
2324
{
24-
bool valid = true;
2525
if (IsHost)
2626
{
2727
INebulaPlayer player = playerManager.GetPlayer(conn);
2828
if (player != null)
2929
{
3030
playerManager.SendPacketToOtherPlayers(packet, player);
3131
}
32-
else
33-
{
34-
valid = false;
35-
}
3632
}
3733

38-
if (valid)
34+
using (Multiplayer.Session.Factories.IsIncomingRequest.On())
3935
{
40-
using (Multiplayer.Session.Factories.IsIncomingRequest.On())
36+
// If in lobby, apply change to UI galaxy
37+
GalaxyData galaxyData = Multiplayer.Session.IsInLobby ? UIRoot.instance.galaxySelect.starmap.galaxyData : GameMain.galaxy;
38+
if (galaxyData == null)
4139
{
42-
if (packet.StarId != NebulaModAPI.STAR_NONE)
40+
return;
41+
}
42+
43+
for (int i = 0; i < packet.Names.Length; i++)
44+
{
45+
if (packet.StarIds[i] != NebulaModAPI.STAR_NONE)
4346
{
44-
StarData star = GameMain.galaxy.StarById(packet.StarId);
45-
star.overrideName = packet.Name;
47+
StarData star = galaxyData.StarById(packet.StarIds[i]);
48+
star.overrideName = packet.Names[i];
4649
star.NotifyOnDisplayNameChange();
50+
Log.Debug($"star{star.id}: {star.name} -> {star.overrideName}");
4751
}
4852
else
4953
{
50-
PlanetData planet = GameMain.galaxy.PlanetById(packet.PlanetId);
51-
planet.overrideName = packet.Name;
54+
PlanetData planet = galaxyData.PlanetById(packet.PlanetIds[i]);
55+
planet.overrideName = packet.Names[i];
5256
planet.NotifyOnDisplayNameChange();
57+
Log.Debug($"planet{planet.id}: {planet.name} -> {planet.overrideName}");
5358
}
54-
GameMain.galaxy.NotifyAstroNameChange();
59+
}
60+
galaxyData.NotifyAstroNameChange();
61+
if (Multiplayer.Session.IsInLobby)
62+
{
63+
// Refresh star name in lobby
64+
UIRoot.instance.galaxySelect.starmap.OnGalaxyDataReset();
5565
}
5666
}
5767
}

0 commit comments

Comments
 (0)