mirror of
https://github.com/MikuLeaks/MikuSB.git
synced 2026-06-04 11:03:59 +00:00
Compare commits
4 Commits
79fad7df2e
...
v2.8
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
933ba097f9 | ||
|
|
c10d380e11 | ||
|
|
6c5d546026 | ||
|
|
9e518edb8e |
@@ -1,4 +1,5 @@
|
|||||||
using MikuSB.Data;
|
using MikuSB.Data;
|
||||||
|
using MikuSB.Database;
|
||||||
using MikuSB.Database.Inventory;
|
using MikuSB.Database.Inventory;
|
||||||
using MikuSB.Enums.Item;
|
using MikuSB.Enums.Item;
|
||||||
using MikuSB.Enums.Player;
|
using MikuSB.Enums.Player;
|
||||||
@@ -42,6 +43,7 @@ public class CommandGiveAll : ICommands
|
|||||||
weapons.Add(weapon);
|
weapons.Add(weapon);
|
||||||
}
|
}
|
||||||
if (weapons.Count > 0) await player.SendPacket(new PacketNtfCallScript(weapons));
|
if (weapons.Count > 0) await player.SendPacket(new PacketNtfCallScript(weapons));
|
||||||
|
DatabaseHelper.SaveDatabaseType(player.InventoryManager.InventoryData);
|
||||||
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems",
|
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems",
|
||||||
I18NManager.Translate("Word.Weapon"), weapons.Count.ToString()));
|
I18NManager.Translate("Word.Weapon"), weapons.Count.ToString()));
|
||||||
}
|
}
|
||||||
@@ -77,6 +79,7 @@ public class CommandGiveAll : ICommands
|
|||||||
supportCards.Add(supportCard);
|
supportCards.Add(supportCard);
|
||||||
}
|
}
|
||||||
if (supportCards.Count > 0) await player.SendPacket(new PacketNtfCallScript(supportCards));
|
if (supportCards.Count > 0) await player.SendPacket(new PacketNtfCallScript(supportCards));
|
||||||
|
DatabaseHelper.SaveDatabaseType(player.InventoryManager.InventoryData);
|
||||||
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems",
|
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems",
|
||||||
I18NManager.Translate("Word.SupportCard"), supportCards.Count.ToString()));
|
I18NManager.Translate("Word.SupportCard"), supportCards.Count.ToString()));
|
||||||
}
|
}
|
||||||
@@ -111,6 +114,7 @@ public class CommandGiveAll : ICommands
|
|||||||
weaponSkins.Add(weaponSkin);
|
weaponSkins.Add(weaponSkin);
|
||||||
}
|
}
|
||||||
if (weaponSkins.Count > 0) await player.SendPacket(new PacketNtfCallScript(weaponSkins));
|
if (weaponSkins.Count > 0) await player.SendPacket(new PacketNtfCallScript(weaponSkins));
|
||||||
|
DatabaseHelper.SaveDatabaseType(player.InventoryManager.InventoryData);
|
||||||
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems",
|
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems",
|
||||||
I18NManager.Translate("Word.WeaponSkin"), weaponSkins.Count.ToString()));
|
I18NManager.Translate("Word.WeaponSkin"), weaponSkins.Count.ToString()));
|
||||||
}
|
}
|
||||||
@@ -147,6 +151,7 @@ public class CommandGiveAll : ICommands
|
|||||||
profileItems.Add(profile);
|
profileItems.Add(profile);
|
||||||
}
|
}
|
||||||
if (profileItems.Count > 0) await player.SendPacket(new PacketNtfCallScript(profileItems));
|
if (profileItems.Count > 0) await player.SendPacket(new PacketNtfCallScript(profileItems));
|
||||||
|
DatabaseHelper.SaveDatabaseType(player.InventoryManager.InventoryData);
|
||||||
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems",
|
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems",
|
||||||
I18NManager.Translate("Word.Profile"), profileItems.Count.ToString()));
|
I18NManager.Translate("Word.Profile"), profileItems.Count.ToString()));
|
||||||
}
|
}
|
||||||
@@ -183,6 +188,7 @@ public class CommandGiveAll : ICommands
|
|||||||
skinPartItems.Add(skinPart);
|
skinPartItems.Add(skinPart);
|
||||||
}
|
}
|
||||||
if (skinPartItems.Count > 0) await player.SendPacket(new PacketNtfCallScript(skinPartItems));
|
if (skinPartItems.Count > 0) await player.SendPacket(new PacketNtfCallScript(skinPartItems));
|
||||||
|
DatabaseHelper.SaveDatabaseType(player.InventoryManager.InventoryData);
|
||||||
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems",
|
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems",
|
||||||
I18NManager.Translate("Word.SkinPart"), skinPartItems.Count.ToString()));
|
I18NManager.Translate("Word.SkinPart"), skinPartItems.Count.ToString()));
|
||||||
}
|
}
|
||||||
@@ -219,6 +225,7 @@ public class CommandGiveAll : ICommands
|
|||||||
callItems.Add(callItem);
|
callItems.Add(callItem);
|
||||||
}
|
}
|
||||||
if (callItems.Count > 0) await player.SendPacket(new PacketNtfCallScript(callItems));
|
if (callItems.Count > 0) await player.SendPacket(new PacketNtfCallScript(callItems));
|
||||||
|
DatabaseHelper.SaveDatabaseType(player.InventoryManager.InventoryData);
|
||||||
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems",
|
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems",
|
||||||
I18NManager.Translate("Word.CallItem"), callItems.Count.ToString()));
|
I18NManager.Translate("Word.CallItem"), callItems.Count.ToString()));
|
||||||
}
|
}
|
||||||
@@ -255,6 +262,7 @@ public class CommandGiveAll : ICommands
|
|||||||
weaponPartItems.Add(weaponPart);
|
weaponPartItems.Add(weaponPart);
|
||||||
}
|
}
|
||||||
if (weaponPartItems.Count > 0) await player.SendPacket(new PacketNtfCallScript(weaponPartItems));
|
if (weaponPartItems.Count > 0) await player.SendPacket(new PacketNtfCallScript(weaponPartItems));
|
||||||
|
DatabaseHelper.SaveDatabaseType(player.InventoryManager.InventoryData);
|
||||||
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems",
|
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems",
|
||||||
I18NManager.Translate("Word.WeaponPart"), weaponPartItems.Count.ToString()));
|
I18NManager.Translate("Word.WeaponPart"), weaponPartItems.Count.ToString()));
|
||||||
}
|
}
|
||||||
@@ -291,6 +299,7 @@ public class CommandGiveAll : ICommands
|
|||||||
skinItems.Add(skin);
|
skinItems.Add(skin);
|
||||||
}
|
}
|
||||||
if (skinItems.Count > 0) await player.SendPacket(new PacketNtfCallScript(skinItems));
|
if (skinItems.Count > 0) await player.SendPacket(new PacketNtfCallScript(skinItems));
|
||||||
|
DatabaseHelper.SaveDatabaseType(player.InventoryManager.InventoryData);
|
||||||
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems",
|
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems",
|
||||||
I18NManager.Translate("Word.Skin"), skinItems.Count.ToString()));
|
I18NManager.Translate("Word.Skin"), skinItems.Count.ToString()));
|
||||||
}
|
}
|
||||||
@@ -327,6 +336,7 @@ public class CommandGiveAll : ICommands
|
|||||||
furnitureItems.Add(furniture);
|
furnitureItems.Add(furniture);
|
||||||
}
|
}
|
||||||
if (furnitureItems.Count > 0) await player.SendPacket(new PacketNtfCallScript(furnitureItems));
|
if (furnitureItems.Count > 0) await player.SendPacket(new PacketNtfCallScript(furnitureItems));
|
||||||
|
DatabaseHelper.SaveDatabaseType(player.InventoryManager.InventoryData);
|
||||||
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems",
|
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems",
|
||||||
I18NManager.Translate("Word.Furniture"), furnitureItems.Count.ToString()));
|
I18NManager.Translate("Word.Furniture"), furnitureItems.Count.ToString()));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -214,6 +214,10 @@ public class PlayerInstance(PlayerGameData data)
|
|||||||
};
|
};
|
||||||
|
|
||||||
foreach (var chara in CharacterManager.CharacterData.Characters) proto.Items.Add(chara.ToProto());
|
foreach (var chara in CharacterManager.CharacterData.Characters) proto.Items.Add(chara.ToProto());
|
||||||
|
foreach (var item in InventoryManager.InventoryData.Items.Values) proto.Items.Add(item.ToProto());
|
||||||
|
foreach (var skin in InventoryManager.InventoryData.Skins.Values) proto.Items.Add(skin.ToProto());
|
||||||
|
foreach (var weapon in InventoryManager.InventoryData.Weapons.Values) proto.Items.Add(weapon.ToProto());
|
||||||
|
foreach (var card in InventoryManager.InventoryData.SupportCards.Values) proto.Items.Add(card.ToProto());
|
||||||
foreach (var x in Data.Attrs)
|
foreach (var x in Data.Attrs)
|
||||||
{
|
{
|
||||||
uint gid = x.Gid;
|
uint gid = x.Gid;
|
||||||
@@ -226,9 +230,7 @@ public class PlayerInstance(PlayerGameData data)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
//ToDo
|
proto.Attrs[ToPackedAttrKey(gid, sid)] = val;
|
||||||
//Temporary fix for login issues(need to handle LoginRsp properly with zlib.)
|
|
||||||
//proto.Attrs[ToPackedAttrKey(gid, sid)] = val;
|
|
||||||
proto.Attrs[ToShiftedAttrKey(gid, sid)] = val;
|
proto.Attrs[ToShiftedAttrKey(gid, sid)] = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -87,7 +87,6 @@ public class HandlerReqLogin : Handler
|
|||||||
await connection.Player.OnHeartBeat();
|
await connection.Player.OnHeartBeat();
|
||||||
await connection.SendPacket(new PacketNtfUpdateFriend(connection.Player!));
|
await connection.SendPacket(new PacketNtfUpdateFriend(connection.Player!));
|
||||||
ApplySavedGirlSkinTypes(connection.Player!);
|
ApplySavedGirlSkinTypes(connection.Player!);
|
||||||
await connection.SendPacket(new PacketNtfCallScript(connection.Player!.InventoryManager.InventoryData));
|
|
||||||
await SendGirlSkinTypeOnLogin(connection);
|
await SendGirlSkinTypeOnLogin(connection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ public class PacketRspLogin : BasePacket
|
|||||||
};
|
};
|
||||||
|
|
||||||
var bytes = Google.Protobuf.MessageExtensions.ToByteArray(proto);
|
var bytes = Google.Protobuf.MessageExtensions.ToByteArray(proto);
|
||||||
Logger.Info($"RspLogin proto size: {bytes.Length} bytes (limit: 65535)");
|
Logger.Info($"RspLogin proto size: {bytes.Length} bytes");
|
||||||
|
|
||||||
SetData(bytes);
|
SetData(bytes);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,7 +42,8 @@ dotnet build
|
|||||||
```
|
```
|
||||||
2. Set `GamePath` in `Config.json` to the path of your game executable.
|
2. Set `GamePath` in `Config.json` to the path of your game executable.
|
||||||
3. Start the server and run the `game` command.
|
3. Start the server and run the `game` command.
|
||||||
4. Enjoy.
|
4. Create an account in the server console.
|
||||||
|
5. Enjoy.
|
||||||
|
|
||||||
## Feature List
|
## Feature List
|
||||||
|
|
||||||
|
|||||||
@@ -42,7 +42,8 @@ dotnet build
|
|||||||
```
|
```
|
||||||
2. Config.json の`GamePath`にあなたのゲームの実行ファイルのパスを書き込みます
|
2. Config.json の`GamePath`にあなたのゲームの実行ファイルのパスを書き込みます
|
||||||
3. サーバーを起動し`game`コマンドを入力します
|
3. サーバーを起動し`game`コマンドを入力します
|
||||||
4. 楽しむ
|
4. サーバーコンソールでアカウントを作成する
|
||||||
|
5. 楽しむ
|
||||||
|
|
||||||
## 機能一覧
|
## 機能一覧
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ public class BasePacket
|
|||||||
public long Timestamp { get; set; }
|
public long Timestamp { get; set; }
|
||||||
public IMessage? Message { get; set; }
|
public IMessage? Message { get; set; }
|
||||||
public PacketFraming Framing { get; set; }
|
public PacketFraming Framing { get; set; }
|
||||||
|
public int UncompressedBodySize { get; set; }
|
||||||
|
|
||||||
public BasePacket(ushort cmdId)
|
public BasePacket(ushort cmdId)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
using MikuSB.Enums.Packet;
|
using MikuSB.Enums.Packet;
|
||||||
using MikuSB.Util;
|
using MikuSB.Util;
|
||||||
using System.Buffers.Binary;
|
using System.Buffers.Binary;
|
||||||
|
using System.IO.Compression;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
|
|
||||||
namespace MikuSB.TcpSharp
|
namespace MikuSB.TcpSharp
|
||||||
@@ -63,11 +64,11 @@ namespace MikuSB.TcpSharp
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte[] Encode(ushort packetId, byte[] payload, PacketFraming framing = PacketFraming.FourByteLittleEndianLength)
|
public byte[] Encode(ushort packetId, byte[] payload, PacketFraming framing = PacketFraming.FourByteLittleEndianLength, int uncompressedSize = 0)
|
||||||
{
|
{
|
||||||
return framing switch
|
return framing switch
|
||||||
{
|
{
|
||||||
PacketFraming.TwoByteBigEndianLength => EncodeTwoByteFrame(packetId, payload),
|
PacketFraming.TwoByteBigEndianLength => EncodeTwoByteFrame(packetId, payload, uncompressedSize),
|
||||||
PacketFraming.FourByteLittleEndianLength => EncodeFourByteFrame(packetId, payload),
|
PacketFraming.FourByteLittleEndianLength => EncodeFourByteFrame(packetId, payload),
|
||||||
_ => EncodeFourByteFrame(packetId, payload)
|
_ => EncodeFourByteFrame(packetId, payload)
|
||||||
};
|
};
|
||||||
@@ -220,8 +221,20 @@ namespace MikuSB.TcpSharp
|
|||||||
return payload;
|
return payload;
|
||||||
}
|
}
|
||||||
|
|
||||||
private byte[] EncodeTwoByteFrame(ushort packetId, byte[] payload)
|
private const int CompressionThreshold = 60000;
|
||||||
|
|
||||||
|
private static byte[] ZlibCompress(byte[] data)
|
||||||
{
|
{
|
||||||
|
using var ms = new MemoryStream();
|
||||||
|
using (var zlib = new ZLibStream(ms, CompressionLevel.Optimal, leaveOpen: true))
|
||||||
|
zlib.Write(data, 0, data.Length);
|
||||||
|
return ms.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
private byte[] EncodeTwoByteFrame(ushort packetId, byte[] payload, int uncompressedSize = 0)
|
||||||
|
{
|
||||||
|
if (payload.Length > CompressionThreshold)
|
||||||
|
payload = ZlibCompress(payload);
|
||||||
var wrappedPayload = WrapPayload(payload);
|
var wrappedPayload = WrapPayload(payload);
|
||||||
var buffer = new byte[HeaderSize4Byte + wrappedPayload.Length];
|
var buffer = new byte[HeaderSize4Byte + wrappedPayload.Length];
|
||||||
|
|
||||||
@@ -246,7 +259,9 @@ namespace MikuSB.TcpSharp
|
|||||||
const int wrapperHeaderSize = 35;
|
const int wrapperHeaderSize = 35;
|
||||||
var wrapped = new byte[wrapperHeaderSize + payload.Length];
|
var wrapped = new byte[wrapperHeaderSize + payload.Length];
|
||||||
BinaryPrimitives.WriteUInt16LittleEndian(wrapped.AsSpan(6, 2), (ushort)payload.Length);
|
BinaryPrimitives.WriteUInt16LittleEndian(wrapped.AsSpan(6, 2), (ushort)payload.Length);
|
||||||
wrapped[11] = 1;
|
if (payload.Length >= 2 && payload[0] == 0x78 &&
|
||||||
|
(payload[1] == 0x01 || payload[1] == 0x5E || payload[1] == 0x9C || payload[1] == 0xDA))
|
||||||
|
wrapped[10] = 2;
|
||||||
payload.CopyTo(wrapped.AsSpan(wrapperHeaderSize));
|
payload.CopyTo(wrapped.AsSpan(wrapperHeaderSize));
|
||||||
|
|
||||||
return wrapped;
|
return wrapped;
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
v=2.6
|
v=2.8
|
||||||
Reference in New Issue
Block a user