diff --git a/Arrowgene.Ddon.GameServer/Characters/ClanManager.cs b/Arrowgene.Ddon.GameServer/Characters/ClanManager.cs index 11c6e289..40230353 100644 --- a/Arrowgene.Ddon.GameServer/Characters/ClanManager.cs +++ b/Arrowgene.Ddon.GameServer/Characters/ClanManager.cs @@ -418,8 +418,13 @@ public List MemberList(uint clanId) public (uint ClanId, CDataClanMemberInfo MemberInfo) ClanMembership(uint characterId) { - var clanId = Server.Database.SelectClanMembershipByCharacterId(characterId); - var membership = Server.Database.GetClanMember(characterId); + uint clanId = 0; + CDataClanMemberInfo membership = new(); + Server.Database.ExecuteInTransaction(conn => + { + clanId = Server.Database.SelectClanMembershipByCharacterId(characterId, conn); + membership = Server.Database.GetClanMember(characterId, conn); + }); return (clanId, membership); } @@ -427,6 +432,8 @@ public List MemberList(uint clanId) public void SendToClan(uint clanId, T packet) where T : class, IPacketStructure, new() { + if (clanId == 0) return; + foreach (var client in Server.ClientLookup.GetAll()) { if (client.Character != null && client.Character.ClanId == clanId) @@ -436,9 +443,15 @@ public void SendToClan(uint clanId, T packet) } } + // Will likely need this later for clan searching. + private static bool ClanSearchBitmaskMatch(uint searchParam, uint match) + { + return (searchParam & match) == match; + } + private static int BitsToInt(IEnumerable bitindices) { - return bitindices.Aggregate(0, (sum, val) => sum + 2 ^ (val)); + return bitindices.Aggregate(0, (sum, val) => sum + (1 << val)); } private static List IntToBits(int input) diff --git a/Arrowgene.Ddon.GameServer/Chat/ChatManager.cs b/Arrowgene.Ddon.GameServer/Chat/ChatManager.cs index b3e8a763..a8ddf350 100644 --- a/Arrowgene.Ddon.GameServer/Chat/ChatManager.cs +++ b/Arrowgene.Ddon.GameServer/Chat/ChatManager.cs @@ -143,6 +143,12 @@ private void Deliver(GameClient client, ChatResponse response) } break; case LobbyChatMsgType.Clan: + if (client.Character.ClanId == 0) + { + response.Recipients.Add(client); + break; + } + response.Recipients.AddRange(_server.ClientLookup.GetAll().Where( x => x.Character != null && client.Character != null diff --git a/Arrowgene.Ddon.GameServer/Handler/ClanClanGetHistoryHandler.cs b/Arrowgene.Ddon.GameServer/Handler/ClanClanGetHistoryHandler.cs index 3051dadd..76e29657 100644 --- a/Arrowgene.Ddon.GameServer/Handler/ClanClanGetHistoryHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/ClanClanGetHistoryHandler.cs @@ -14,6 +14,7 @@ public ClanClanGetHistoryHandler(DdonGameServer server) : base(server) public override S2CClanClanGetHistoryRes Handle(GameClient client, C2SClanClanGetHistoryReq request) { + // TODO: Implement. return new S2CClanClanGetHistoryRes(); } } diff --git a/Arrowgene.Ddon.GameServer/Handler/ClanClanGetJoinRequestedListHandler.cs b/Arrowgene.Ddon.GameServer/Handler/ClanClanGetJoinRequestedListHandler.cs index cb0b0e62..d7730fc8 100644 --- a/Arrowgene.Ddon.GameServer/Handler/ClanClanGetJoinRequestedListHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/ClanClanGetJoinRequestedListHandler.cs @@ -14,6 +14,8 @@ public ClanClanGetJoinRequestedListHandler(DdonGameServer server) : base(server) public override S2CClanClanGetJoinRequestedListRes Handle(GameClient client, C2SClanClanGetJoinRequestedListReq request) { + // TODO: Implement. + // client.Send(InGameDump.Dump_69); return new(); } } diff --git a/Arrowgene.Ddon.GameServer/Handler/ClanClanGetMyJoinRequestListHandler.cs b/Arrowgene.Ddon.GameServer/Handler/ClanClanGetMyJoinRequestListHandler.cs index 34ea131f..f4cf798d 100644 --- a/Arrowgene.Ddon.GameServer/Handler/ClanClanGetMyJoinRequestListHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/ClanClanGetMyJoinRequestListHandler.cs @@ -14,6 +14,7 @@ public ClanClanGetMyJoinRequestListHandler(DdonGameServer server) : base(server) public override S2CClanClanGetMyJoinRequestListRes Handle(GameClient client, C2SClanClanGetMyJoinRequestListReq request) { + // TODO: Implement. return new S2CClanClanGetMyJoinRequestListRes(); } } diff --git a/Arrowgene.Ddon.GameServer/Handler/ClanClanScoutEntryGetInviteListHandler.cs b/Arrowgene.Ddon.GameServer/Handler/ClanClanScoutEntryGetInviteListHandler.cs index d6c0fa01..a39cfa71 100644 --- a/Arrowgene.Ddon.GameServer/Handler/ClanClanScoutEntryGetInviteListHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/ClanClanScoutEntryGetInviteListHandler.cs @@ -14,6 +14,7 @@ public ClanClanScoutEntryGetInviteListHandler(DdonGameServer server) : base(serv public override S2CClanClanScoutEntryGetInviteListRes Handle(GameClient client, C2SClanClanScoutEntryGetInviteListReq request) { + // TODO: Implement. return new(); } } diff --git a/Arrowgene.Ddon.GameServer/Handler/ClanClanScoutEntryGetInvitedListHandler.cs b/Arrowgene.Ddon.GameServer/Handler/ClanClanScoutEntryGetInvitedListHandler.cs index 951946f1..40b2e480 100644 --- a/Arrowgene.Ddon.GameServer/Handler/ClanClanScoutEntryGetInvitedListHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/ClanClanScoutEntryGetInvitedListHandler.cs @@ -14,6 +14,7 @@ public ClanClanScoutEntryGetInvitedListHandler(DdonGameServer server) : base(ser public override S2CClanClanScoutEntryGetInvitedListRes Handle(GameClient client, C2SClanClanScoutEntryGetInvitedListReq request) { + // TODO: Implement. return new S2CClanClanScoutEntryGetInvitedListRes(); } } diff --git a/Arrowgene.Ddon.GameServer/Handler/ClanClanScoutEntrySearchHandler.cs b/Arrowgene.Ddon.GameServer/Handler/ClanClanScoutEntrySearchHandler.cs index 39004ecb..e40dd2de 100644 --- a/Arrowgene.Ddon.GameServer/Handler/ClanClanScoutEntrySearchHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/ClanClanScoutEntrySearchHandler.cs @@ -14,6 +14,7 @@ public ClanClanScoutEntrySearchHandler(DdonGameServer server) : base(server) public override S2CClanClanScoutEntrySearchRes Handle(GameClient client, C2SClanClanScoutEntrySearchReq request) { + // TODO: Implement. return new S2CClanClanScoutEntrySearchRes(); } } diff --git a/Arrowgene.Ddon.GameServer/Handler/ClanClanSearchHandler.cs b/Arrowgene.Ddon.GameServer/Handler/ClanClanSearchHandler.cs index 65cb49e7..7c853b1a 100644 --- a/Arrowgene.Ddon.GameServer/Handler/ClanClanSearchHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/ClanClanSearchHandler.cs @@ -14,6 +14,7 @@ public ClanClanSearchHandler(DdonGameServer server) : base(server) public override S2CClanClanSearchRes Handle(GameClient client, C2SClanClanSearchReq request) { + // TODO: Implement. return new S2CClanClanSearchRes(); } } diff --git a/Arrowgene.Ddon.GameServer/Handler/ClanClanSettingUpdateHandler.cs b/Arrowgene.Ddon.GameServer/Handler/ClanClanSettingUpdateHandler.cs index d49e926e..09ecdae1 100644 --- a/Arrowgene.Ddon.GameServer/Handler/ClanClanSettingUpdateHandler.cs +++ b/Arrowgene.Ddon.GameServer/Handler/ClanClanSettingUpdateHandler.cs @@ -15,6 +15,7 @@ public ClanClanSettingUpdateHandler(DdonGameServer server) : base(server) public override S2CClanClanSettingUpdateRes Handle(GameClient client, C2SClanClanSettingUpdateReq request) { + // TODO: Figure out what fires this and implement. return new S2CClanClanSettingUpdateRes() { IsMemberNotice = false diff --git a/Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs b/Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs index bf401202..11c99420 100644 --- a/Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs +++ b/Arrowgene.Ddon.Shared/Entity/EntitySerializer.cs @@ -90,6 +90,11 @@ static EntitySerializer() Create(new CDataClanShopConciergeItem.Serializer()); Create(new CDataClanShopFunctionInfo.Serializer()); Create(new CDataClanShopFunctionItem.Serializer()); + Create(new CDataClanConciergeInfo.Serializer()); + Create(new CDataClanConciergeNpc.Serializer()); + Create(new CDataClanPartnerPawnInfo.Serializer()); + Create(new CDataClanShopLineupName.Serializer()); + Create(new CDataClanValueInfo.Serializer()); Create(new CDataClearTimePointBonus.Serializer()); Create(new CDataCommonU8.Serializer()); @@ -253,6 +258,8 @@ static EntitySerializer() Create(new CDataPartyMemberMinimum.Serializer()); Create(new CDataPartyPlayerContext.Serializer()); Create(new CDataPartyQuestProgressInfo.Serializer()); + + Create(new CDataPawnExpeditionInfo.Serializer()); Create(new CDataPawnCraftData.Serializer()); Create(new CDataPawnCraftSkill.Serializer()); Create(new CDataPawnEquipInfo.Serializer()); @@ -268,6 +275,7 @@ static EntitySerializer() Create(new CDataPawnTrainingPreparationInfoToAdvice.Serializer()); Create(new CDataPawnSearchParameter.Serializer()); Create(new CDataRegisterdPawnList.Serializer()); + Create(new CDataPlayPointDataSerializer()); Create(new CDataPresetAbilityParam.Serializer()); Create(new CDataPriorityQuest.Serializer()); diff --git a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CClanClanBaseGetInfoRes.cs b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CClanClanBaseGetInfoRes.cs index 9556f1cb..4abd59dd 100644 --- a/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CClanClanBaseGetInfoRes.cs +++ b/Arrowgene.Ddon.Shared/Entity/PacketStructure/S2CClanClanBaseGetInfoRes.cs @@ -1,29 +1,57 @@ using Arrowgene.Buffers; +using Arrowgene.Ddon.Shared.Entity.Structure; using Arrowgene.Ddon.Shared.Network; +using System.Collections.Generic; namespace Arrowgene.Ddon.Shared.Entity.PacketStructure { public class S2CClanClanBaseGetInfoRes : ServerResponse { public override PacketId Id => PacketId.S2C_CLAN_CLAN_BASE_GET_INFO_RES; + + public List FunctionReleaseIds { get; set; } + public List DungeonReleaseIds { get; set; } + public CDataPawnExpeditionInfo PawnExpeditionInfo { get; set; } + public CDataClanPartnerPawnInfo PartnerPawnInfo { get; set; } + public CDataClanConciergeInfo ConciergeInfo { get; set; } + public List ShopLineupNameList { get; set; } + public List ClanValueInfoList { get; set; } public class Serializer : PacketEntitySerializer { public override void Write(IBuffer buffer, S2CClanClanBaseGetInfoRes obj) { +#if false + WriteByteArray(buffer, BaseData); +#endif + WriteServerResponse(buffer, obj); - WriteByteArray(buffer, obj.BaseData); + WriteEntityList(buffer, obj.FunctionReleaseIds); + WriteEntityList(buffer, obj.DungeonReleaseIds); + WriteEntity(buffer, obj.PawnExpeditionInfo); + WriteEntity(buffer, obj.PartnerPawnInfo); + WriteEntity(buffer, obj.ConciergeInfo); + WriteEntityList(buffer, obj.ShopLineupNameList); + WriteEntityList(buffer, obj.ClanValueInfoList); } public override S2CClanClanBaseGetInfoRes Read(IBuffer buffer) { S2CClanClanBaseGetInfoRes obj = new S2CClanClanBaseGetInfoRes(); ReadServerResponse(buffer, obj); + + obj.FunctionReleaseIds = ReadEntityList(buffer); + obj.DungeonReleaseIds = ReadEntityList(buffer); + obj.PawnExpeditionInfo = ReadEntity(buffer); + obj.PartnerPawnInfo = ReadEntity(buffer); + obj.ConciergeInfo = ReadEntity(buffer); + obj.ShopLineupNameList = ReadEntityList(buffer); + obj.ClanValueInfoList = ReadEntityList(buffer); return obj; } } - private readonly byte[] BaseData = + private readonly byte[] BaseData = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, @@ -174,6 +202,5 @@ public override S2CClanClanBaseGetInfoRes Read(IBuffer buffer) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xCF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x8B, 0x00, 0x00, 0x00, 0x00, 0x3C }; - } } diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataClanConciergeInfo.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataClanConciergeInfo.cs new file mode 100644 index 00000000..92adb21d --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataClanConciergeInfo.cs @@ -0,0 +1,34 @@ +using Arrowgene.Buffers; +using System.Collections.Generic; + +namespace Arrowgene.Ddon.Shared.Entity.Structure +{ + public class CDataClanConciergeInfo + { + public CDataClanConciergeInfo() + { + ClanConciergeNpcList = new(); + } + + public uint NpcId { get; set; } + public List ClanConciergeNpcList { get; set; } + + + public class Serializer : EntitySerializer + { + public override void Write(IBuffer buffer, CDataClanConciergeInfo obj) + { + WriteUInt32(buffer, obj.NpcId); + WriteEntityList(buffer, obj.ClanConciergeNpcList); + } + + public override CDataClanConciergeInfo Read(IBuffer buffer) + { + CDataClanConciergeInfo obj = new CDataClanConciergeInfo(); + obj.NpcId = ReadUInt32(buffer); + obj.ClanConciergeNpcList = ReadEntityList(buffer); + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataClanConciergeNpc.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataClanConciergeNpc.cs new file mode 100644 index 00000000..86c33806 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataClanConciergeNpc.cs @@ -0,0 +1,33 @@ +using Arrowgene.Buffers; + +namespace Arrowgene.Ddon.Shared.Entity.Structure +{ + public class CDataClanConciergeNpc + { + public uint NpcId { get; set; } + public uint Price { get; set; } + public bool IsInit { get; set; } + public uint SortId { get; set; } + + public class Serializer : EntitySerializer + { + public override void Write(IBuffer buffer, CDataClanConciergeNpc obj) + { + WriteUInt32(buffer, obj.NpcId); + WriteUInt32(buffer, obj.Price); + WriteBool(buffer, obj.IsInit); + WriteUInt32(buffer, obj.SortId); + } + + public override CDataClanConciergeNpc Read(IBuffer buffer) + { + CDataClanConciergeNpc obj = new CDataClanConciergeNpc(); + obj.NpcId = ReadUInt32(buffer); + obj.Price = ReadUInt32(buffer); + obj.IsInit = ReadBool(buffer); + obj.SortId = ReadUInt32(buffer); + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataClanPartnerPawnInfo.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataClanPartnerPawnInfo.cs new file mode 100644 index 00000000..5ee701df --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataClanPartnerPawnInfo.cs @@ -0,0 +1,34 @@ +using Arrowgene.Buffers; +using System.Collections.Generic; + +namespace Arrowgene.Ddon.Shared.Entity.Structure +{ + public class CDataClanPartnerPawnInfo + { + public CDataClanPartnerPawnInfo() + { + MyPartnerPawnList = new(); + MemberPartnerPawnList = new(); + } + + public List MyPartnerPawnList { get; set; } + public List MemberPartnerPawnList { get; set; } + + public class Serializer : EntitySerializer + { + public override void Write(IBuffer buffer, CDataClanPartnerPawnInfo obj) + { + WriteEntityList(buffer, obj.MyPartnerPawnList); + WriteEntityList(buffer, obj.MemberPartnerPawnList); + } + + public override CDataClanPartnerPawnInfo Read(IBuffer buffer) + { + CDataClanPartnerPawnInfo obj = new CDataClanPartnerPawnInfo(); + obj.MyPartnerPawnList = ReadEntityList(buffer); + obj.MemberPartnerPawnList = ReadEntityList(buffer); + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataClanShopLineupName.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataClanShopLineupName.cs new file mode 100644 index 00000000..f66f6714 --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataClanShopLineupName.cs @@ -0,0 +1,32 @@ +using Arrowgene.Buffers; + +namespace Arrowgene.Ddon.Shared.Entity.Structure +{ + public class CDataClanShopLineupName + { + public CDataClanShopLineupName() + { + Name = string.Empty; + } + + public uint LineupID { get; set; } + public string Name { get; set; } + + public class Serializer : EntitySerializer + { + public override void Write(IBuffer buffer, CDataClanShopLineupName obj) + { + WriteUInt32(buffer, obj.LineupID); + WriteMtString(buffer, obj.Name); + } + + public override CDataClanShopLineupName Read(IBuffer buffer) + { + CDataClanShopLineupName obj = new CDataClanShopLineupName(); + obj.LineupID = ReadUInt32(buffer); + obj.Name = ReadMtString(buffer); + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataClanValueInfo.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataClanValueInfo.cs new file mode 100644 index 00000000..b9f8025a --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataClanValueInfo.cs @@ -0,0 +1,27 @@ +using Arrowgene.Buffers; + +namespace Arrowgene.Ddon.Shared.Entity.Structure +{ + public class CDataClanValueInfo + { + public byte Type { get; set; } + public uint Value { get; set; } + + public class Serializer : EntitySerializer + { + public override void Write(IBuffer buffer, CDataClanValueInfo obj) + { + WriteByte(buffer, obj.Type); + WriteUInt32(buffer, obj.Value); + } + + public override CDataClanValueInfo Read(IBuffer buffer) + { + CDataClanValueInfo obj = new CDataClanValueInfo(); + obj.Type = ReadByte(buffer); + obj.Value = ReadUInt32(buffer); + return obj; + } + } + } +} diff --git a/Arrowgene.Ddon.Shared/Entity/Structure/CDataPawnExpeditionInfo.cs b/Arrowgene.Ddon.Shared/Entity/Structure/CDataPawnExpeditionInfo.cs new file mode 100644 index 00000000..00475adb --- /dev/null +++ b/Arrowgene.Ddon.Shared/Entity/Structure/CDataPawnExpeditionInfo.cs @@ -0,0 +1,31 @@ +using Arrowgene.Buffers; + +namespace Arrowgene.Ddon.Shared.Entity.Structure +{ + public class CDataPawnExpeditionInfo + { + public byte SallyStatus { get; set; } + public byte GoldenSallyPrice { get; set; } + public byte ChargeSallyPrice { get; set; } + + public class Serializer : EntitySerializer + { + public override void Write(IBuffer buffer, CDataPawnExpeditionInfo obj) + { + WriteByte(buffer, obj.SallyStatus); + WriteByte(buffer, obj.GoldenSallyPrice); + WriteByte(buffer, obj.ChargeSallyPrice); + + } + + public override CDataPawnExpeditionInfo Read(IBuffer buffer) + { + CDataPawnExpeditionInfo obj = new CDataPawnExpeditionInfo(); + obj.SallyStatus = ReadByte(buffer); + obj.GoldenSallyPrice = ReadByte(buffer); + obj.ChargeSallyPrice = ReadByte(buffer); + return obj; + } + } + } +}