// Copyright 2018 RED Software, LLC. All Rights Reserved. using IgniteEngine; using IgniteEngine.Content.GameObjects; using IgniteEngine.Content.Tutorial; using System; using System.Collections.Generic; using IgniteEngine.IO; using IgniteEngine.Networking; using IgniteEngine.Protocols; namespace WorldManagerServer.Services { internal static class AvatarService { internal const string DEFAULT_GAME_SETTINGS = "1C 00 00 00 01 01 00 01 02 00 01 03 00 01 04 00 00 05 00 01 06 00 00 07 00 01 08 00 01 09 00 01 0A 00 01 0B 00 01 0C 00 00 0D 00 00 0E 00 00 0F 00 00 10 00 01 11 00 00 12 00 00 13 00 00 14 00 01 15 00 00 16 00 00 17 00 00 18 00 01 19 00 01 1A 00 01 1B 00 01"; internal const string DEFAULT_KEYMAP_SETTINGS = "5F 00 00 00 00 79 01 00 00 1B 02 00 00 43 03 00 00 49 04 00 00 4B 05 00 00 4C 06 00 00 46 07 00 00 48 08 00 00 56 09 00 00 0D 0A 00 11 4E 0B 00 11 47 0C 00 11 50 0D 00 11 57 0E 00 00 DE 0F 00 00 58 10 00 00 47 11 00 00 00 12 00 00 00 13 00 00 00 14 00 00 00 15 00 00 52 16 00 11 41 17 00 00 57 18 00 00 53 19 00 00 00 1A 00 00 41 1B 00 00 44 1C 00 00 5A 1D 00 00 20 1E 00 00 26 1F 00 00 28 20 00 00 25 21 00 00 27 22 00 00 24 23 00 00 54 24 00 00 51 25 00 00 45 26 00 00 F5 27 00 00 42 28 00 00 50 29 00 00 4D 2A 00 00 55 2B 00 10 5A 2C 00 00 00 2D 00 00 00 2E 00 00 23 2F 00 00 31 30 00 00 32 31 00 00 33 32 00 00 34 33 00 00 35 34 00 00 36 35 00 00 37 36 00 00 38 37 00 00 39 38 00 00 30 39 00 00 BD 3A 00 00 BB 3B 00 10 31 3C 00 10 32 3D 00 10 33 3E 00 10 34 3F 00 10 35 40 00 10 36 41 00 10 37 42 00 10 38 43 00 10 39 44 00 10 30 45 00 10 BD 46 00 10 BB 47 00 12 31 48 00 12 32 49 00 12 33 4A 00 12 34 4B 00 12 35 4C 00 12 36 4D 00 12 37 4E 00 12 38 4F 00 12 39 50 00 12 30 51 00 12 BD 52 00 12 BB 53 00 00 00 54 00 00 00 55 00 00 00 56 00 00 00 57 00 00 00 58 00 00 00 59 00 00 00 5A 00 00 00 5B 00 00 00 5C 00 00 00 5D 00 00 00 5E 00 00 00"; internal const string DEFAULT_SHORTCUTSIZE_SETTINGS = "05 00 03 18 00 00 05 00 0C 00 00 0C 01 00 0C 02 00 0C 03 00 0C 04 00 00"; internal const string DEFAULT_WINDOWPOS_SETTINGS = "40 F4 FD 1E AD 14 1D 77 98 9D 58 1D 68 9D 58 1D 98 9D 58 1D 00 00 00 00 00 00 00 00 00 00 72 00 40 1B 0F 23 7C 9D 58 1D 40 1B 0F 23 0C 00 0B 00 BD 08 00 00 7C 9D 58 1D 00 00 00 00 00 00 00 00 28 1B 0F 23 01 00 00 00 38 1B 0F 23 90 F4 FD 1E A3 E0 D4 77 40 1B 0F 23 00 00 00 00 01 00 00 00 38 1B 0F 23 DC F4 FD 1E CD 98 CE 75 00 00 72 00 00 00 00 00 DA 98 CE 75 F8 A7 DF 50 00 00 00 00 38 63 D9 10 01 00 00 00 00 00 00 00 01 00 00 00 38 63 D9 10 CC F4 FD 1E A4 F4 FD 1E DC CC 38 01 B4 F8 FD 1E D5 8C D0 75 C4 CB EC 3B 00 F5 FD 1E 06 E4 EE 74 00 00 00 00 00 00 00 00 8C D2 F6 0C 38 63 D9 10 51 53 F9 0C 00 00 00 00 FF FF FF FF 40 1B 0F 23 18 F5 FD 1E A5 BE A8 00 38 63 D9 10 00 00 00 00 FD FF FF FF 51 53 F9 0C B8 F5 FD 1E 0E 6A A3 00 9C E3 F6 0C 7F 06 00 00 14 00 00 00 88 D2 F6 0C 57 6A A3 00 14 F5 FD 1E DC CC 38 01 B4 F8 FD 1E D5 8C D0 75 C4 CB EC 3B 70 F5 FD 1E 06 E4 EE 74 00 00 00 00 00 00 00 00 53 53 F9 0C 38 63 D9 10 53 53 F9 0C 00 00 00 00 FF FF FF FF 98 83 0D 23 8C F5 FD 1E 51 B0 A8 00 9A 7A DC 50 B8 F5 FD 1E 7A FF A4 00 9C E3 F6 0C 94 F5 FD 1E 88 D2 F6 0C 8B FF A4 00 00 52 68 7C 2F DD 05 05 08 07 A6 00 8C 03 39 0D 72 42 00 00 00 00 00 00 C0 F5 FD 1E 04 1E A8 00"; internal static List LoadAll(int userNo) { var ret = new List(); using (var p_Char_GetListOfUserChar = new StoredProcedure("p_Char_GetListOfUserChar", Program.ODBC)) { p_Char_GetListOfUserChar.AddParameter("nUserNo", userNo); using (var reader = p_Char_GetListOfUserChar.RunReader()) { if (reader.HasRows) { while (reader.Read()) { var charNo = reader.GetInt32(0); if (!TryLoad(charNo, out var avatar)) { Debug.LogWarning($"Failed to load an avatar - CharNo: {charNo}"); continue; } ret.Add(avatar); } } } } return ret; } internal static bool TryLoad(int charNo, out Avatar avatar) { avatar = new Avatar {CharNo = charNo}; using (var p_Char_GetLoginData = new StoredProcedure("p_Char_GetLoginData", Program.ODBC)) { p_Char_GetLoginData.AddParameter("nCharNo", charNo); using (var reader = p_Char_GetLoginData.RunReader()) { if (!reader.HasRows) { return false; } while (reader.Read()) { avatar.Name = reader.GetString(0); avatar.Level = Convert.ToByte(reader.GetValue(1)); avatar.Slot = (byte) reader.GetValue(2); avatar.MapIndx = reader.GetString(3); avatar.IsDeleted = reader.GetBoolean(7); avatar.DeleteTime = reader.GetDateTime(8); avatar.Shape.Race = (byte) reader.GetValue(9); avatar.Shape.Class = (CharacterClass) (byte) reader.GetValue(10); avatar.Shape.Gender = (Gender) (byte) reader.GetValue(11); avatar.Shape.Hair = (byte) reader.GetValue(12); avatar.Shape.HairColor = (byte) reader.GetValue(13); avatar.Shape.Face = (byte) reader.GetValue(14); avatar.KQHandle = reader.GetInt32(15); avatar.KQMapIndx = reader.GetString(16); avatar.KQPosition = new Vector2(reader.GetInt32(17), reader.GetInt32(18)); avatar.KQDate = reader.GetDateTime(20); avatar.TutorialState = (TutorialState) reader.GetInt32(22); avatar.TutorialStep = reader.GetByte(23); } } } // load equipment return true; } internal static bool IsNameInUse(string name) { using (var p_Char_Find = new StoredProcedure("p_CharFind", Program.ODBC)) { p_Char_Find.AddParameter("sID", name, 40); p_Char_Find.AddOutput("nCharNo"); return p_Char_Find.Run().GetOutput("nCharNo") != 0; } } internal static bool Create(NetworkConnection connection, byte slot, string name, CharacterClass @class, Gender gender, byte hair, byte hairColor, byte face, out Avatar avatar) { var charNo = -1; avatar = null; using (var p_Char_Create = new StoredProcedure("p_Char_Create", Program.ODBC)) { p_Char_Create.AddParameter("nUserNo", connection.Account.UserNo); p_Char_Create.AddParameter("nCreateWorld", Program.Config.GetInt32("world_number")); p_Char_Create.AddParameter("nAdminLevel", 0); p_Char_Create.AddParameter("nSlotNo", slot); p_Char_Create.AddParameter("sID", name, 40); p_Char_Create.AddParameter("nRace", 1); p_Char_Create.AddParameter("nClass", (byte) @class); p_Char_Create.AddParameter("nGender", (byte) gender); p_Char_Create.AddParameter("nHairType", hair); p_Char_Create.AddParameter("nHairColor", hairColor); p_Char_Create.AddParameter("nFaceShape", face); p_Char_Create.AddOutput("nCharNo"); charNo = p_Char_Create.Run().GetOutput("nCharNo"); if (charNo <= -1) { return false; } } // Todo: default character data. return TryLoad(charNo, out avatar); } internal static bool Delete(NetworkConnection connection, Avatar avatar) { // Leave guild & guild academy. using (var p_Char_Delete = new StoredProcedure("p_Char_Delete", Program.ODBC)) { p_Char_Delete.AddParameter("nCharNo", avatar.CharNo); p_Char_Delete.AddOutput("nRet"); p_Char_Delete.Run(); } return true; } } }