Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections;
- using System.Text;
- using System.Text.RegularExpressions;
- using System.Net.Sockets;
- using Eternal.Database;
- using Eternal.Managers;
- using Eternal.Server.Packets;
- using Eternal.Server.Maps;
- namespace Eternal.Server.Users
- {
- public class User
- {
- #region Net
- private int ConnectionID;
- private Socket socket;
- private byte[] buffer;
- internal bool PingOK = true;
- #endregion
- private bool disconnected;
- private bool loggedin;
- #region Logged in
- internal int ID;
- internal string Name;
- internal byte CharacterID;
- internal Map Map;
- internal int ObjectID;
- internal byte X, Y;
- internal byte Direction;
- internal bool GM;
- internal bool Hidden;
- internal bool NoWall;
- #endregion
- #region Properties
- internal string IP { get { return socket.RemoteEndPoint.ToString().Split(':')[0]; } }
- #endregion
- public User(int connectionId, Socket socket)
- {
- this.ConnectionID = connectionId;
- this.socket = socket;
- this.buffer = new byte[4096];
- socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(Receive), null);
- }
- #region Net
- internal void Disconnect()
- {
- if (disconnected)
- return;
- disconnected = true;
- if (loggedin)
- {
- Save();
- if (Map != null)
- Map.RemoveUser(this);
- UserManager.RemoveUser(this);
- }
- socket.Close();
- }
- internal void Send(PacketWriter pw)
- {
- if (!disconnected)
- socket.Send(pw.GetBuffer());
- }
- private void Receive(IAsyncResult a)
- {
- try
- {
- int bytesReceived = socket.EndReceive(a);
- if (bytesReceived == 0)
- {
- Disconnect();
- }
- else if (bytesReceived > 0)
- {
- Handle(new PacketReader(buffer, 0, bytesReceived));
- }
- }
- catch { Disconnect(); }
- if (!disconnected)
- socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(Receive), null);
- }
- #endregion
- #region Handlers
- private void Handle(PacketReader pr)
- {
- byte header = pr.ReadByte();
- if (header == 0) // Ping
- {
- PingOK = true;
- }
- else if (!loggedin) // Not logged in
- {
- switch (header)
- {
- case 1: // Register
- {
- string username, password;
- username = pr.ReadString();
- password = pr.ReadString();
- if (!Regex.Match(username, @"^[a-zA-Z0-9]{2,16}$").Success ||
- !Regex.Match(password, @"^.{6,16}$").Success)
- { // Hacking
- Disconnect();
- }
- else if (UserManager.UserExists(username))
- {
- Send(PacketCreator.RegisterFail());
- }
- else
- {
- UserManager.CreateUser(username, password);
- Send(PacketCreator.RegisterSuccess());
- Out.WriteLine(" User '{0}' was registered by {1}", username, IP);
- }
- }
- break;
- case 3: // Login
- {
- string username, password;
- username = pr.ReadString();
- password = pr.ReadString();
- if (!Regex.Match(username, @"^[a-zA-Z0-9]{2,16}$").Success ||
- !Regex.Match(password, @"^.{6,16}$").Success)
- { // Hacking
- Disconnect();
- }
- else
- {
- int id = UserManager.GetUserID(username, password);
- if (id == -1)
- Send(PacketCreator.LoginFail(0));
- else if (UserManager.UserExists(id))
- Send(PacketCreator.LoginFail(1));
- else
- {
- // Success
- this.ID = id;
- this.loggedin = true;
- UserManager.Login(this);
- Send(PacketCreator.LoginSuccess(this));
- // Send world variables
- if (WorldManager.ScrollingHeader != "")
- Send(PacketCreator.ScrollingHeader(WorldManager.ScrollingHeader));
- Out.WriteLine(" {0} logged in", Name);
- }
- }
- }
- break;
- }
- }
- else // Logged in
- {
- switch (header)
- {
- case 10: // Chat
- string message = pr.ReadString();
- if (message[0] == '/')
- {
- try
- {
- HandleCommand(message.Substring(1));
- }
- catch { }
- }
- else
- {
- Map.Send(PacketCreator.Chat(this, message.Trim()), this);
- }
- break;
- case 20: // Get map objects
- Send(PacketCreator.AddMapObjects(this));
- break;
- case 30: // Movement
- byte data = pr.ReadByte();
- bool move = (data & 128) > 0;
- byte dir = (byte)(data ^ (data & 128));
- if (dir > 3)
- return;
- this.Direction = dir;
- if (move)
- {
- if (Map.CanMove(this))
- {
- Map.Send(PacketCreator.UserMovement(this, true), this);
- switch (this.Direction)
- {
- case 0: this.Y++; break;
- case 1: this.X--; break;
- case 2: this.X++; break;
- case 3: this.Y--; break;
- }
- Map.Teleport teleport = Map.GetTeleport(this);
- if (teleport.Map > -1)
- {
- Map newMap = MapManager.GetMap(teleport.Map);
- if (newMap == null)
- return;
- Map.RemoveUser(this);
- Map = newMap;
- this.X = teleport.NextX;
- this.Y = teleport.NextY;
- this.Direction = teleport.NextDirection;
- Map.AddUser(this);
- Send(PacketCreator.ChangeMap(this));
- }
- }
- else
- {
- Map.Send(PacketCreator.UserMovement(this, false), this);
- Send(PacketCreator.ResetPosition(this));
- }
- }
- else
- {
- Map.Send(PacketCreator.UserMovement(this, false), this);
- }
- break;
- case 31: // Attack
- Map.Send(PacketCreator.UserAttack(this));
- if (!this.GM)
- return;
- byte AttackX = X, AttackY = Y;
- switch (Direction)
- {
- case 0: AttackY++; break;
- case 1: AttackX--; break;
- case 2: AttackX++; break;
- case 3: AttackY--; break;
- }
- /*Hashtable users = Map.Users;
- foreach (User user in users.Values)
- {
- if (user.X == AttackX && user.Y == AttackY)
- Do Hit Events
- }*/
- break;
- case 35: // Reset position
- Send(PacketCreator.ResetPosition(this));
- break;
- }
- }
- }
- private void HandleCommand(string input)
- {
- string[] command = input.Trim().Split();
- command[0] = command[0].ToLower();
- if (this.GM)
- {
- if (command[0] == "hide")
- {
- this.Hidden = true;
- }
- else if (command[0] == "header")
- {
- string header = "";
- if (command.Length > 1)
- header = String.Join(" ", command, 1, command.Length - 1);
- else
- header = "";
- UserManager.Send(PacketCreator.ScrollingHeader(header));
- WorldManager.ScrollingHeader = header;
- }
- else if (command[0] == "kick")
- {
- if (command.Length != 2)
- return;
- User user = UserManager.GetUser(command[1]);
- if (user != null && user != this)
- user.Disconnect();
- }
- else if (command[0] == "warphere")
- {
- if (command.Length != 2)
- return;
- User user = UserManager.GetUser(command[1]);
- if (user != null && user != this)
- {
- user.Map.RemoveUser(user);
- user.Map = this.Map;
- user.X = this.X;
- user.Y = this.Y;
- user.Map.AddUser(user);
- user.Send(PacketCreator.ChangeMap(user));
- }
- }
- else if (command[0] == "warpto")
- {
- if (command.Length != 2)
- return;
- User user = UserManager.GetUser(command[1]);
- if (user != null && user != this)
- {
- this.Map.RemoveUser(this);
- this.Map = user.Map;
- this.X = user.X;
- this.Y = user.Y;
- this.Map.AddUser(this);
- this.Send(PacketCreator.ChangeMap(this));
- }
- }
- else if (command[0] == "teleport")
- {
- if (command.Length != 3)
- return;
- byte x = byte.Parse(command[1]), y = byte.Parse(command[2]);
- if (x < 0 || y < 0 || x >= this.Map.Width || y >= this.Map.Height)
- return;
- this.X = x;
- this.Y = y;
- this.Send(PacketCreator.ResetPosition(this));
- this.Map.Send(PacketCreator.UserMovement(this, false));
- }
- }
- }
- #endregion
- internal void Save()
- {
- if (!loggedin)
- return;
- DB.ExecuteNonQuery("UPDATE users SET mapid={0}, x={1}, y={2} WHERE id={3}",
- Map.ID, X, Y, ID);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement