internal static void HandleChatMessage(DataBuffer buffer) { var type = (Enumerations.MessageType)buffer.ReadByte(); var msg = buffer.ReadString(); SFML.Graphics.Color color = new SFML.Graphics.Color(0, 0, 0); if (!Data.InGame) return; switch (type) { case Enumerations.MessageType.System: color = new SFML.Graphics.Color(100, 100, 49); break; case Enumerations.MessageType.Error: color = new SFML.Graphics.Color(255, 0, 0); break; case Enumerations.MessageType.World: color = new SFML.Graphics.Color(0, 195, 255); break; case Enumerations.MessageType.Map: color = new SFML.Graphics.Color(0, 0, 0); break; case Enumerations.MessageType.Emote: color = new SFML.Graphics.Color(255, 59, 0); break; } Interface.GUI.Get<TGUI.ChatBox>("chat").AddLine(msg, color); }
internal static void HandleMapList(DataBuffer buffer) { var max = buffer.ReadInt32(); Program.FrmEditor.BeginInvoke((Action)(() => { Program.FrmEditor.ClearMaps(); })); for (var i = 1; i <= max; i++) { Program.FrmEditor.BeginInvoke((Action<Int32, String>)((num, name) => { Program.FrmEditor.AddMap(String.Format("{0}: {1}", num, name)); }), i, buffer.ReadString()); } }
internal static void HandleCreateCharacterData(DataBuffer buffer) { // get amount of classes. var classes = buffer.ReadInt32(); for (var i = 1; i < classes + 1; i++) { var c = new Class(); c.Name = buffer.ReadString(); c.MaleSprite = buffer.ReadInt32(); c.FemaleSprite = buffer.ReadInt32(); Data.Classes.Add(i, c); } Interface.ChangeUI(Interface.Windows.CharacterCreate); }
public static void HandleLogin(Int32 id, DataBuffer buffer) { // Handles a user's request to login. var username = buffer.ReadString().Trim(); var password = buffer.ReadString().Trim(); // Check if the user isn't sending too long/short data. if (username.Trim().Length < Data.Settings.MinUsernameChar || username.Trim().Length > Data.Settings.MaxUsernameChar || password.Trim().Length < Data.Settings.MinPasswordChar || password.Trim().Length > Data.Settings.MaxPasswordChar) { Send.AlertMessage(id, String.Format("Your username must be between {0} and {1} characters long. Your password must be between {2} and {3} characters long.", Data.Settings.MinUsernameChar, Data.Settings.MaxUsernameChar, Data.Settings.MinPasswordChar, Data.Settings.MaxPasswordChar)); return; } // Check if this account exists. if (!File.Exists(String.Format("{0}data files\\accounts\\{1}.xml", Data.AppPath, username.ToLower()))) { Send.AlertMessage(id, "Invalid Username/Password!"); return; } // Load our player! Data.LoadPlayer(id, username.ToLower()); // Compare their passwords! if (!Data.Players[id].ComparePassword(password)) { Send.AlertMessage(id, "Invalid Username/Password!"); Data.Players[id] = new Extensions.Database.Player(); return; } // Send our OK. Logger.Write(String.Format("ID: {0} has logged in as {1}", id, Data.Players[id].Username)); Send.LoginOK(id); // Disconnect anyone else logged into this account. var oldclient = 0; for (var i = 0; i < Data.Players.Count; i++) { var key = Data.Players.ElementAt(i).Key; if (Data.Players[key].Username.ToLower().Equals(username.ToLower()) && key != id) { oldclient = key; } } if (oldclient != 0) { Send.AlertMessage(oldclient, "Someone else has logged onto your account!"); Logger.Write(String.Format("ID: {0} conflicts with a login at ID: {1}, Disconnecting ID: {1}", id, oldclient)); Data.SavePlayer(oldclient); // NOTE: the user is still logged on until they get this message, we're saving their data on purpose. // Their data will now be saved twice, but we can safely load it. Data.LoadPlayer(id, username.ToLower()); // Now remove the old player from the world by force. Program.Server.DisconnectClient(oldclient); } // Check if they have at least one character. var haschars = false; foreach(var chr in Data.Players[id].Characters) { if (chr.Name.Length > 0) haschars = true; } // If we have characters, show character select. // Otherwise force the user to make a new character. if (haschars) { Send.SelectCharacterData(id); } else { Send.NewCharacterData(id); } }
internal static void HandleChatMessage(Int32 id, DataBuffer buffer) { var msg = buffer.ReadString(); if (msg[0] == '/') { var data = msg.ToLower().Split(' '); switch (data[0]) { case "/editmap": if (Data.Players[id].UserRank >= (Byte)Enumerations.Ranks.Developer) { Send.MapEditorData(id); } break; case "/w": Send.ChatMessageWorld(id, msg.Substring(2), Enumerations.MessageType.World); break; case "/me": case "/em": Send.ChatMessageMap(id, Data.Players[id].Characters[Data.TempPlayers[id].CurrentCharacter].Map, msg.Substring(3), Enumerations.MessageType.Emote); break; default: Send.ChatMessage(id, id, "Unknown command.", Enumerations.MessageType.Error); break; } } else { Send.ChatMessageMap(id, Data.Players[id].Characters[Data.TempPlayers[id].CurrentCharacter].Map, msg, Enumerations.MessageType.Map); } }
public static void HandleAddCharacter(Int32 id, DataBuffer buffer) { var legal = new Regex("^[a-zA-Z0-9]*$"); var name = buffer.ReadString().Trim(); var classn = buffer.ReadInt32(); var gender = buffer.ReadByte(); // Make sure this player exists. if (!Data.Players.ContainsKey(id)) return; // Make sure the name is at least X characters long. if (name.Length < Data.Settings.MinUsernameChar) { Send.AlertMessage(id, String.Format("Character name must be at least {0} characters in length.", Data.Settings.MinUsernameChar)); return; } // Make sure they only entered regular characters. if (!legal.IsMatch(name)) { Send.AlertMessage(id, "Invalid name, only letters and numbers are allowed in names."); return; } // Check if the name is already in use or not. if (Data.Characters.Contains(name)) { Send.AlertMessage(id, "A character with this name already exists!"); return; } // Check if there's a slot left to use! var slot = -1; for (var i = 0; slot < Data.Players[id].Characters.Length; i++) { if (Data.Players[id].Characters[i].Name.Length < 1) { slot = i; break; } } if (slot < 0) { Send.AlertMessage(id, "Unable to create character."); return; } // We've come this far, we can add this character! Data.Characters.Add(name); Data.Players[id].Characters[slot].Name = name; Data.Players[id].Characters[slot].Gender = (Byte)gender; Data.Players[id].Characters[slot].Class = classn; Data.Players[id].Characters[slot].Sprite = gender == (Int32)Enumerations.Gender.Male ? Data.Classes[classn].MaleSprite : Data.Classes[classn].FemaleSprite; Data.Players[id].Characters[slot].Level = 1; Data.Players[id].Characters[slot].Map = Data.Settings.StartMap; Data.Players[id].Characters[slot].X = Data.Settings.StartX; Data.Players[id].Characters[slot].Y = Data.Settings.StartY; Data.Players[id].Characters[slot].Direction = (Int32)Enumerations.Direction.Down; for (var i = 0; i < (Int32)Enumerations.Stats.Stat_Count; i++) { Data.Players[id].Characters[slot].Statistic[i] = Data.Classes[classn].Statistic[i]; } // Save our data! Data.SaveCharacterList(); Data.SavePlayer(id); // Notify our user! Logger.Write(String.Format("ID: {0} has created a character named '{1}'.", id, name)); HandleData.HandleUseCharacter(id, slot); }
public static void HandleNewAccount(Int32 id, DataBuffer buffer) { // Handles a user's request to register an account. var username = buffer.ReadString().Trim(); var password = buffer.ReadString().Trim(); var legal = new Regex("^[a-zA-Z0-9]*$"); // Check if the user isn't sending too long/short data. if (username.Trim().Length < Data.Settings.MinUsernameChar || username.Trim().Length > Data.Settings.MaxUsernameChar || password.Trim().Length < Data.Settings.MinPasswordChar || password.Trim().Length > Data.Settings.MaxPasswordChar) { Send.AlertMessage(id, String.Format("Your username must be between {0} and {1} characters long. Your password must be between {2} and {3} characters long.", Data.Settings.MinUsernameChar, Data.Settings.MaxUsernameChar, Data.Settings.MinPasswordChar, Data.Settings.MaxPasswordChar)); return; } // Check if the user isn't sending any unallowed characters. if (!legal.IsMatch(username)) { Send.AlertMessage(id, "Invalid username, only letters and numbers are allowed in names."); return; } // Check if this account already exists. if (File.Exists(String.Format("{0}data files\\accounts\\{1}.xml", Data.AppPath, username.ToLower()))) { Send.AlertMessage(id, "Sorry, that account name is already taken!"); return; } // Now we can finaly start creating the account! Data.Players[id].Username = username; Data.Players[id].SetPassword(password); // Always use this over setting the password directly! This hashes and salts it. // Save the player! Data.SavePlayer(id); Logger.Write(String.Format("ID: {0} has created a new account named '{1}'.", id, username)); // Send them our OK! Send.LoginOK(id); // Send our player the data required to create a new character! Send.NewCharacterData(id); }
internal static void HandleErrorMessage(DataBuffer buffer) { var message = buffer.ReadString(); Interface.ShowAlertbox("Error", message); Program.NetworkClient.Close(); }
internal static void HandleSelectCharacterData(DataBuffer buffer) { // Retrieve our data. for (var i = 0; i < Data.CharSelect.Length; i++) { Data.CharSelect[i] = new Character(); Data.CharSelect[i].Name = buffer.ReadString(); Data.CharSelect[i].Level = buffer.ReadInt32(); } // Move to the select screen. Interface.ChangeUI(Interface.Windows.CharacterSelect); }
internal static void HandleAlertMessage(DataBuffer buffer) { var message = buffer.ReadString(); Interface.ShowMessagebox("Error", message); }
internal static void HandlePlayerData(DataBuffer buffer) { var id = buffer.ReadInt32(); if (!Data.Players.ContainsKey(id)) { Data.Players.Add(id, new Character()); Data.TempPlayers.Add(id, new TempPlayer()); } Data.Players[id].Name = buffer.ReadString(); Data.Players[id].Gender = buffer.ReadByte(); Data.Players[id].Class = buffer.ReadInt32(); Data.Players[id].Level = buffer.ReadInt32(); Data.Players[id].Experience = buffer.ReadInt32(); Data.Players[id].Sprite = buffer.ReadInt32(); Data.Players[id].Map = buffer.ReadInt32(); Data.Players[id].X = buffer.ReadInt32(); Data.Players[id].Y = buffer.ReadInt32(); Data.Players[id].Direction = buffer.ReadByte(); for (var i = 0; i < (Int32)Enumerations.Stats.Stat_Count - 1; i++) { Data.Players[id].Statistic[i] = buffer.ReadInt32(); } }