This is the guild arsenals system... its a few more complex and bigger than the SubClass one... but let's go ;D
create those enums & classes
Code:
public class Arsenal_State { public Arsenal_ID ID; public bool Unlocked; public ulong Donation; public byte Potency; public Dictionary<uint, Arsenal_Client> Inscribed; public Arsenal_State() { Inscribed = new Dictionary<uint, Arsenal_Client>(); } } public class Arsenal_Client { public Struct.ItemInfo Item; public string Name; public uint UID; public uint iUID; } public enum Arsenal_ID : byte { None = 0, Headgear = 8, Armor = 1, Weapon = 2, Ring = 3, Boots = 4, Necklace = 5, Fan = 6, Tower = 7, }
Code:
public static byte[] ArsenalInscribedPage(Entities.Character Client, byte[] Data, States.Arsenal_ID ID) { byte[] Buffer = null; States.Arsenal_Client[] Inscribed = null; uint Page = (byte)(BitConverter.ToUInt32(Data, 12) / 8); Again: try { Inscribed = new States.Arsenal_Client[Client.Syndicate.Arsenal.Arsenals[ID].Inscribed.Count + 1]; Client.Syndicate.Arsenal.Arsenals[ID].Inscribed.Values.CopyTo(Inscribed, 1); } catch { goto Again; } int Position = 44; int count = Inscribed.Length; if (count > 8) count = 8; Buffer = new byte[84 + (count * 40) + 8]; for (int i = 0; i < 20; i++) Buffer[i] = Data[i]; Writer.WriteUInt16((ushort)(Buffer.Length - 8), 0, Buffer); Writer.WriteUInt32((uint)Inscribed.Length, 20, Buffer); Writer.WriteUInt32((uint)Client.Syndicate.Arsenal.Arsenals[ID].Donation, 36, Buffer); Writer.WriteUInt32((uint)Inscribed.Length, 40, Buffer); for (uint i = BitConverter.ToUInt32(Data, 8); i <= BitConverter.ToUInt32(Data, 12); i++) { if (Inscribed.Length <= 0) break; if (i >= Inscribed.Length) break; if (Inscribed[i] == null) continue; States.Arsenal_Client ac = Inscribed[i]; Structs.Struct.ItemInfo Item = ac.Item; Writer.WriteUInt32(Item.UID, Position, Buffer); Position += 4; Writer.WriteUInt32((uint)i, Position, Buffer); Position += 4; Writer.WriteString(ac.Name, Position, Buffer); Position += 16; Writer.WriteUInt32(Item.ID, Position, Buffer); Position += 4; Writer.WriteByte((byte)(Item.ID % 10), Position, Buffer); Position++; Writer.WriteByte(Item.Plus, Position, Buffer); Position++; Writer.WriteByte(Item.Soc1, Position, Buffer); Position++; Writer.WriteByte(Item.Soc2, Position, Buffer); Position++; Writer.WriteByte((byte)Item.Potency, Position, Buffer); Position++; Writer.WriteByte(0, Position, Buffer); Position++; Writer.WriteByte(0, Position, Buffer); Position++; Writer.WriteByte(0, Position, Buffer); Position++; Writer.WriteUInt32(0, Position, Buffer); Position += 4; } Writer.WriteString(Server.MainKey, (Buffer.Length - 8), Buffer); return Buffer; } public static byte[] GuildArsenal(Entities.Character Client) { byte[] Buffer = new byte[244 + 8]; Writer.WriteUInt16(244, 0, Buffer); Writer.WriteUInt16(2201, 2, Buffer); if (Client.Syndicate == null) { Writer.WriteString(Server.MainKey, (Buffer.Length - 8), Buffer); return Buffer; } #region Default Writer.WriteUInt32(Client.Syndicate.Arsenal.BattlePower, 8, Buffer);//Total Battle Power Writer.WriteUInt32((uint)Client.Arsenal_Donation, 12, Buffer);//My Donation Writer.WriteUInt32(0, 16, Buffer);//Shared Battle Power Writer.WriteByte(8, 20, Buffer); if (Client.Syndicate.Arsenal.Arsenals.ContainsKey(States.Arsenal_ID.Headgear)) { Writer.WriteByte(Client.Syndicate.Arsenal.Arsenals[States.Arsenal_ID.Headgear].Potency, 28, Buffer);//Potency Writer.WriteUInt64(Client.Syndicate.Arsenal.Arsenals[States.Arsenal_ID.Headgear].Donation, 36, Buffer);//Donation Writer.WriteByte(1, 44, Buffer);//Allowed } Writer.WriteByte(1, 48, Buffer); if (Client.Syndicate.Arsenal.Arsenals.ContainsKey(States.Arsenal_ID.Armor)) { Writer.WriteByte(Client.Syndicate.Arsenal.Arsenals[States.Arsenal_ID.Armor].Potency, 52, Buffer);//Potency Writer.WriteUInt64(Client.Syndicate.Arsenal.Arsenals[States.Arsenal_ID.Armor].Donation, 60, Buffer);//Donation Writer.WriteByte(1, 68, Buffer);//Allowed } Writer.WriteByte(2, 72, Buffer); if (Client.Syndicate.Arsenal.Arsenals.ContainsKey(States.Arsenal_ID.Weapon)) { Writer.WriteByte(Client.Syndicate.Arsenal.Arsenals[States.Arsenal_ID.Weapon].Potency, 76, Buffer);//Potency Writer.WriteUInt64(Client.Syndicate.Arsenal.Arsenals[States.Arsenal_ID.Weapon].Donation, 84, Buffer);//Donation Writer.WriteByte(1, 92, Buffer);//Allowed } Writer.WriteByte(3, 96, Buffer); if (Client.Syndicate.Arsenal.Arsenals.ContainsKey(States.Arsenal_ID.Ring)) { Writer.WriteByte(Client.Syndicate.Arsenal.Arsenals[States.Arsenal_ID.Ring].Potency, 102, Buffer);//Potency Writer.WriteUInt64(Client.Syndicate.Arsenal.Arsenals[States.Arsenal_ID.Ring].Donation, 108, Buffer);//Donation Writer.WriteByte(1, 116, Buffer);//Allowed } Writer.WriteByte(4, 120, Buffer); if (Client.Syndicate.Arsenal.Arsenals.ContainsKey(States.Arsenal_ID.Boots)) { Writer.WriteByte(Client.Syndicate.Arsenal.Arsenals[States.Arsenal_ID.Boots].Potency, 124, Buffer);//Potency Writer.WriteUInt64(Client.Syndicate.Arsenal.Arsenals[States.Arsenal_ID.Boots].Donation, 132, Buffer);//Donation Writer.WriteByte(1, 140, Buffer);//Allowed } Writer.WriteByte(5, 144, Buffer); if (Client.Syndicate.Arsenal.Arsenals.ContainsKey(States.Arsenal_ID.Necklace)) { Writer.WriteByte(Client.Syndicate.Arsenal.Arsenals[States.Arsenal_ID.Necklace].Potency, 148, Buffer);//Potency Writer.WriteUInt64(Client.Syndicate.Arsenal.Arsenals[States.Arsenal_ID.Necklace].Donation, 156, Buffer);//Donation Writer.WriteByte(1, 164, Buffer);//Allowed } Writer.WriteByte(6, 168, Buffer); if (Client.Syndicate.Arsenal.Arsenals.ContainsKey(States.Arsenal_ID.Fan)) { Writer.WriteByte(Client.Syndicate.Arsenal.Arsenals[States.Arsenal_ID.Fan].Potency, 172, Buffer);//Potency Writer.WriteUInt64(Client.Syndicate.Arsenal.Arsenals[States.Arsenal_ID.Fan].Donation, 180, Buffer);//Donation Writer.WriteByte(1, 188, Buffer);//Allowed } Writer.WriteByte(7, 192, Buffer); if (Client.Syndicate.Arsenal.Arsenals.ContainsKey(States.Arsenal_ID.Tower)) { Writer.WriteByte(Client.Syndicate.Arsenal.Arsenals[States.Arsenal_ID.Tower].Potency, 196, Buffer);//Potency Writer.WriteUInt64(Client.Syndicate.Arsenal.Arsenals[States.Arsenal_ID.Tower].Donation, 204, Buffer);//Donation Writer.WriteByte(1, 212, Buffer);//Allowed } #endregion Writer.WriteString(Server.MainKey, (Buffer.Length - 8), Buffer); return Buffer; }
Code:
public class Arsenal { ushort gOwner = 0; Struct.Syndicate Syn { get { return Server.Syndicates[gOwner]; } } public Dictionary<Arsenal_ID, Arsenal_State> Arsenals = null; public byte BattlePower; public Arsenal(ushort g_owner) { gOwner = g_owner; Arsenals = new Dictionary<Arsenal_ID, Arsenal_State>(); } public void InscribeItem(Entities.Character Client, Struct.ItemInfo Item, Arsenal_ID ID) { Arsenal_State _Arsenal = null; if (Arsenals.TryGetValue(ID, out _Arsenal)) { if (!_Arsenal.Inscribed.ContainsKey(Item.UID)) { Item.Inscribed = true; Item.Mode = Struct.ItemMode.Update; Item.Send(Client.Owner); Item.Mode = Struct.ItemMode.Default; lock (_Arsenal.Inscribed) _Arsenal.Inscribed.Add(Item.UID, new Arsenal_Client() { iUID = Item.UID, Item = Item, UID = Client.UID, Name = Client.Name }); Arsenals[ID].Donation += GetDonation(Item); Client.Arsenal_Donation += GetDonation(Item); Database.UpdateItem(Item, Client); Database.UpdateArsenal(Arsenals[ID].Donation, ID); Database.CreateArsenalItem(Client.UID, Client.Name, Item.UID, Client.Syn_ID, ID); } } } public void RemoveItem(Entities.Character Client, Struct.ItemInfo Item, Arsenal_ID ID) { Arsenal_State _Arsenal = null; if (Arsenals.TryGetValue(ID, out _Arsenal)) { if (!_Arsenal.Inscribed.ContainsKey(Item.UID)) { lock (_Arsenal.Inscribed) _Arsenal.Inscribed.Remove(Item.UID); Item.Inscribed = false; Item.Mode = Struct.ItemMode.Update; Item.Send(Client.Owner); Item.Mode = Struct.ItemMode.Default; Arsenals[ID].Donation -= GetDonation(Item); Client.Arsenal_Donation -= GetDonation(Item); Database.UpdateArsenal(Arsenals[ID].Donation, ID); Database.UpdateItem(Item, Client); Database.DeleteArsenalItem(Client.UID, Item.UID, ID); } } } public void UnlockArsenal(Entities.Character Client, Arsenal_ID ID) { if (Client.Syn_Rank != Struct.GuildRank.Leader) return; if (Arsenals.ContainsKey(ID)) return; if (Syn.Fund < getUnlockValue()) return; if (ID == Arsenal_ID.None) ID = Arsenal_ID.Headgear; Syn.Fund -= getUnlockValue(); Arsenals.Add(ID, new Arsenal_State() { ID = ID, Unlocked = true }); Client.Owner.Send(ConquerPacket.GuildArsenal(Client)); Database.CreateArsenal(Syn.ID, ID); Database.UpdateGuild(Syn); } public uint getUnlockValue() { switch (Arsenals.Count) { case 0: case 1: return 5000000; case 2: case 3: case 4: return 10000000; case 5: case 6: return 15000000; case 7: return 20000000; } return 0; } public uint GetDonation(Struct.ItemInfo Item) { uint Return = 0; int id = (int)(Item.ID % 10); switch (id) { case 8: Return = 1000; break; case 9: Return = 16660; break; } if (Item.Soc1 > 0 && Item.Soc2 == 0) Return += 33330; if (Item.Soc1 > 0 && Item.Soc2 > 0) Return += 133330; switch (Item.Plus) { case 1: Return += 90; break; case 2: Return += 490; break; case 3: Return += 1350; break; case 4: Return += 4070; break; case 5: Return += 12340; break; case 6: Return += 37030; break; case 7: Return += 111110; break; case 8: Return += 333330; break; case 9: Return += 1000000; break; case 10: Return += 1033330; break; case 11: Return += 1101230; break; case 12: Return += 1212340; break; default: break; } return Return; } }
Code:
#region Arsenal [2201][2202][2203] case 2202: { if (Data[16] == 0) Data[16] = 8; CSocket.Send(ConquerPacket.ArsenalInscribedPage(CSocket.Client, Data, (Arsenal_ID)Data[16])); break; } case 2203: { CSocket.Send(ConquerPacket.GuildArsenal(CSocket.Client)); byte pType = Data[4]; byte i_type = Data[8]; uint i_Uid = BitConverter.ToUInt32(Data, 12); if (i_type == 0) i_type = 8; switch (pType) { case 0: { CSocket.Client.Syndicate.Arsenal.UnlockArsenal(CSocket.Client, (Arsenal_ID)i_type); break; } case 1: { Struct.ItemInfo Item = null; if (CSocket.Client.Inventory.TryGetValue(i_Uid, out Item)) CSocket.Client.Syndicate.Arsenal.InscribeItem(CSocket.Client, Item, (Arsenal_ID)i_type); break; } case 2://Uninscribe { States.Arsenal_Client ac = null; if (CSocket.Client.Syndicate.Arsenal.Arsenals[(Arsenal_ID)i_type].Inscribed.TryGetValue(i_Uid, out ac)) CSocket.Client.Syndicate.Arsenal.RemoveItem(CSocket.Client, ac.Item, (Arsenal_ID)i_type); break; } case 4: { CSocket.Send(ConquerPacket.GuildArsenal(CSocket.Client)); break; } } break; } #endregion
Code:
public static void UpdateArsenal(ulong Donation, States.Arsenal_ID id) { MySqlCommand Command = new MySqlCommand(MySqlCommandType.UPDATE); Command.Update("pt_arsenal") .Set("arsenal_donation", Donation.ToString()) .Where("arsenal_id", (byte)id) .Execute(); } public static void CreateArsenalItem(uint uid, string name, uint i_uid, ushort sid, States.Arsenal_ID aid) { MySqlCommand Command = new MySqlCommand(MySqlCommandType.INSERT); Command.Insert("pt_arsenal_inscribed") .Insert("uid", uid) .Insert("name", name) .Insert("iten_id", i_uid) .Insert("iten_atype", (byte)aid) .Insert("syn_id", sid) .Execute(); } public static void DeleteArsenalItem(uint uid, uint i_uid, States.Arsenal_ID aid) { MySqlCommand Command = new MySqlCommand(MySqlCommandType.DELETE); Command.Delete("pt_arsenal_inscribed", "uid", uid).And("iten_id", i_uid).Execute(); } public static void CreateArsenal(uint s_id, States.Arsenal_ID id) { MySqlCommand Command = new MySqlCommand(MySqlCommandType.INSERT); Command.Insert("pt_arsenal") .Insert("syn_id", s_id) .Insert("arsenal_id", (byte)id) .Insert("arsenal_unlocked", 1) .Execute(); } public static void DeleteArsenal(uint s_id, States.Arsenal_ID id) { MySqlCommand Command = new MySqlCommand(MySqlCommandType.DELETE); Command.Delete("pt_arsenal", "syn_id", s_id).And("arsenal_id", (byte)id).Execute(); } public static void LoadArsenal(Struct.Syndicate Syn) { Syn.Arsenal = new States.Arsenal(Syn.ID); MySqlCommand Command = new MySqlCommand(MySqlCommandType.SELECT); Command.Select("pt_arsenal").Where("syn_id",Syn.ID).Execute(); MySqlReader Reader = new MySqlReader(Command); while (Reader.Read()) { States.Arsenal_State Arsenal = new States.Arsenal_State(); Arsenal.ID = (States.Arsenal_ID)Reader.ReadByte("arsenal_id"); Arsenal.Unlocked = (Reader.ReadByte("arsenal_unlocked") == 1); Arsenal.Donation = Reader.ReadUInt32("arsenal_donation"); if (!Syn.Arsenal.Arsenals.ContainsKey(Arsenal.ID)) Syn.Arsenal.Arsenals.Add(Arsenal.ID, Arsenal); } if (Syn.Arsenal.Arsenals.Count > 0) { Command = new MySqlCommand(MySqlCommandType.SELECT); Command.Select("pt_arsenal_inscribed").Where("syn_id", Syn.ID).Execute(); Reader = new MySqlReader(Command); while (Reader.Read()) { uint OWNER = Reader.ReadUInt32("uid"); string Name = Reader.ReadString("name"); uint UID = Reader.ReadUInt32("iten_id"); States.Arsenal_ID ID = (States.Arsenal_ID)Reader.ReadByte("iten_atype"); if (Syn.Arsenal.Arsenals.ContainsKey(ID)) { if (!Syn.Arsenal.Arsenals[ID].Inscribed.ContainsKey(UID)) { Syn.Arsenal.Arsenals[ID].Inscribed.Add(UID, new States.Arsenal_Client() { UID = OWNER, Name = Name, iUID = UID }); } } } foreach (States.Arsenal_State astate in Syn.Arsenal.Arsenals.Values) { foreach (States.Arsenal_Client ac in astate.Inscribed.Values) { if (ac.Item == null) { ac.Item = GetItem(ac.iUID); } } } } }
Cya good luck!