Advertisement
Guest User

Untitled

a guest
May 5th, 2017
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 13.07 KB | None | 0 0
  1. using System;
  2. using System.Collections;
  3. using System.Text;
  4. using System.Text.RegularExpressions;
  5. using System.Net.Sockets;
  6.  
  7. using Eternal.Database;
  8. using Eternal.Managers;
  9. using Eternal.Server.Packets;
  10. using Eternal.Server.Maps;
  11.  
  12. namespace Eternal.Server.Users
  13. {
  14.     public class User
  15.     {
  16.         #region Net
  17.         private int ConnectionID;
  18.         private Socket socket;
  19.         private byte[] buffer;
  20.         internal bool PingOK = true;
  21.         #endregion
  22.  
  23.         private bool disconnected;
  24.         private bool loggedin;
  25.  
  26.         #region Logged in
  27.         internal int ID;
  28.         internal string Name;
  29.         internal byte CharacterID;
  30.  
  31.         internal Map Map;
  32.         internal int ObjectID;
  33.         internal byte X, Y;
  34.         internal byte Direction;
  35.  
  36.         internal bool GM;
  37.         internal bool Hidden;
  38.         internal bool NoWall;
  39.         #endregion
  40.  
  41.         #region Properties
  42.         internal string IP { get { return socket.RemoteEndPoint.ToString().Split(':')[0]; } }
  43.         #endregion
  44.  
  45.         public User(int connectionId, Socket socket)
  46.         {
  47.             this.ConnectionID = connectionId;
  48.             this.socket = socket;
  49.             this.buffer = new byte[4096];
  50.  
  51.             socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(Receive), null);
  52.         }
  53.  
  54.         #region Net
  55.         internal void Disconnect()
  56.         {
  57.             if (disconnected)
  58.                 return;
  59.             disconnected = true;
  60.            
  61.             if (loggedin)
  62.             {
  63.                 Save();
  64.                 if (Map != null)
  65.                     Map.RemoveUser(this);
  66.                 UserManager.RemoveUser(this);
  67.             }
  68.             socket.Close();
  69.         }
  70.         internal void Send(PacketWriter pw)
  71.         {
  72.             if (!disconnected)
  73.                 socket.Send(pw.GetBuffer());
  74.         }
  75.         private void Receive(IAsyncResult a)
  76.         {
  77.             try
  78.             {
  79.                 int bytesReceived = socket.EndReceive(a);
  80.                 if (bytesReceived == 0)
  81.                 {
  82.                     Disconnect();
  83.                 }
  84.                 else if (bytesReceived > 0)
  85.                 {
  86.                     Handle(new PacketReader(buffer, 0, bytesReceived));
  87.                 }
  88.             }
  89.             catch { Disconnect(); }
  90.             if (!disconnected)
  91.                 socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(Receive), null);
  92.         }
  93.         #endregion
  94.         #region Handlers
  95.         private void Handle(PacketReader pr)
  96.         {
  97.             byte header = pr.ReadByte();
  98.             if (header == 0) // Ping
  99.             {
  100.                 PingOK = true;
  101.             }
  102.             else if (!loggedin) // Not logged in
  103.             {
  104.                 switch (header)
  105.                 {
  106.                     case 1: // Register
  107.                         {
  108.                             string username, password;
  109.                             username = pr.ReadString();
  110.                             password = pr.ReadString();
  111.  
  112.                             if (!Regex.Match(username, @"^[a-zA-Z0-9]{2,16}$").Success ||
  113.                                 !Regex.Match(password, @"^.{6,16}$").Success)
  114.                             {   // Hacking
  115.                                 Disconnect();
  116.                             }
  117.                             else if (UserManager.UserExists(username))
  118.                             {
  119.                                 Send(PacketCreator.RegisterFail());
  120.                             }
  121.                             else
  122.                             {
  123.                                 UserManager.CreateUser(username, password);
  124.                                 Send(PacketCreator.RegisterSuccess());
  125.  
  126.                                 Out.WriteLine("  User '{0}' was registered by {1}", username, IP);
  127.                             }
  128.                         }
  129.                         break;
  130.  
  131.                     case 3: // Login
  132.                         {
  133.                             string username, password;
  134.                             username = pr.ReadString();
  135.                             password = pr.ReadString();
  136.  
  137.                             if (!Regex.Match(username, @"^[a-zA-Z0-9]{2,16}$").Success ||
  138.                                 !Regex.Match(password, @"^.{6,16}$").Success)
  139.                             {   // Hacking
  140.                                 Disconnect();
  141.                             }
  142.                             else
  143.                             {
  144.                                 int id = UserManager.GetUserID(username, password);
  145.                                 if (id == -1)
  146.                                     Send(PacketCreator.LoginFail(0));
  147.                                 else if (UserManager.UserExists(id))
  148.                                     Send(PacketCreator.LoginFail(1));
  149.                                 else
  150.                                 {
  151.                                     // Success
  152.                                     this.ID = id;
  153.                                     this.loggedin = true;
  154.                                     UserManager.Login(this);
  155.                                     Send(PacketCreator.LoginSuccess(this));
  156.  
  157.                                     // Send world variables
  158.                                     if (WorldManager.ScrollingHeader != "")
  159.                                         Send(PacketCreator.ScrollingHeader(WorldManager.ScrollingHeader));
  160.  
  161.                                     Out.WriteLine("  {0} logged in", Name);
  162.                                 }
  163.                             }
  164.                         }
  165.                         break;
  166.                 }
  167.             }
  168.             else // Logged in
  169.             {
  170.                 switch (header)
  171.                 {
  172.                     case 10: // Chat
  173.                         string message = pr.ReadString();
  174.                         if (message[0] == '/')
  175.                         {
  176.                             try
  177.                             {
  178.                                 HandleCommand(message.Substring(1));
  179.                             }
  180.                             catch { }
  181.                         }
  182.                         else
  183.                         {
  184.                             Map.Send(PacketCreator.Chat(this, message.Trim()), this);
  185.                         }
  186.                         break;
  187.  
  188.                     case 20: // Get map objects
  189.                         Send(PacketCreator.AddMapObjects(this));
  190.                         break;
  191.  
  192.                     case 30: // Movement
  193.                         byte data = pr.ReadByte();
  194.                         bool move = (data & 128) > 0;
  195.                         byte dir = (byte)(data ^ (data & 128));
  196.                         if (dir > 3)
  197.                             return;
  198.                         this.Direction = dir;
  199.                         if (move)
  200.                         {
  201.                             if (Map.CanMove(this))
  202.                             {
  203.                                 Map.Send(PacketCreator.UserMovement(this, true), this);
  204.                                 switch (this.Direction)
  205.                                 {
  206.                                     case 0: this.Y++; break;
  207.                                     case 1: this.X--; break;
  208.                                     case 2: this.X++; break;
  209.                                     case 3: this.Y--; break;
  210.                                 }
  211.  
  212.                                 Map.Teleport teleport = Map.GetTeleport(this);
  213.                                 if (teleport.Map > -1)
  214.                                 {
  215.                                     Map newMap = MapManager.GetMap(teleport.Map);
  216.                                     if (newMap == null)
  217.                                         return;
  218.  
  219.                                     Map.RemoveUser(this);
  220.                                     Map = newMap;
  221.  
  222.                                     this.X = teleport.NextX;
  223.                                     this.Y = teleport.NextY;
  224.                                     this.Direction = teleport.NextDirection;
  225.                                     Map.AddUser(this);
  226.  
  227.                                     Send(PacketCreator.ChangeMap(this));
  228.                                 }
  229.                             }
  230.                             else
  231.                             {
  232.                                 Map.Send(PacketCreator.UserMovement(this, false), this);
  233.                                 Send(PacketCreator.ResetPosition(this));
  234.                             }
  235.                         }
  236.                         else
  237.                         {
  238.                             Map.Send(PacketCreator.UserMovement(this, false), this);
  239.                         }
  240.                         break;
  241.  
  242.                     case 31: // Attack
  243.                         Map.Send(PacketCreator.UserAttack(this));
  244.  
  245.                         if (!this.GM)
  246.                             return;
  247.  
  248.                         byte AttackX = X, AttackY = Y;
  249.                         switch (Direction)
  250.                         {
  251.                             case 0: AttackY++; break;
  252.                             case 1: AttackX--; break;
  253.                             case 2: AttackX++; break;
  254.                             case 3: AttackY--; break;
  255.                         }
  256.  
  257.                         /*Hashtable users = Map.Users;
  258.                         foreach (User user in users.Values)
  259.                         {
  260.                             if (user.X == AttackX && user.Y == AttackY)
  261.                                 Do Hit Events
  262.                         }*/
  263.                         break;
  264.  
  265.                     case 35: // Reset position
  266.                         Send(PacketCreator.ResetPosition(this));
  267.                         break;
  268.                 }
  269.             }
  270.         }
  271.         private void HandleCommand(string input)
  272.         {
  273.             string[] command = input.Trim().Split();
  274.             command[0] = command[0].ToLower();
  275.             if (this.GM)
  276.             {
  277.                 if (command[0] == "hide")
  278.                 {
  279.                     this.Hidden = true;
  280.                 }
  281.                 else if (command[0] == "header")
  282.                 {
  283.                     string header = "";
  284.                     if (command.Length > 1)
  285.                         header = String.Join(" ", command, 1, command.Length - 1);
  286.                     else
  287.                         header = "";
  288.                     UserManager.Send(PacketCreator.ScrollingHeader(header));
  289.                     WorldManager.ScrollingHeader = header;
  290.                 }
  291.                 else if (command[0] == "kick")
  292.                 {
  293.                     if (command.Length != 2)
  294.                         return;
  295.                     User user = UserManager.GetUser(command[1]);
  296.                     if (user != null && user != this)
  297.                         user.Disconnect();
  298.                 }
  299.                 else if (command[0] == "warphere")
  300.                 {
  301.                     if (command.Length != 2)
  302.                         return;
  303.  
  304.                     User user = UserManager.GetUser(command[1]);
  305.                     if (user != null && user != this)
  306.                     {
  307.                         user.Map.RemoveUser(user);
  308.                         user.Map = this.Map;
  309.                         user.X = this.X;
  310.                         user.Y = this.Y;
  311.                         user.Map.AddUser(user);
  312.                         user.Send(PacketCreator.ChangeMap(user));
  313.                     }
  314.                 }
  315.                 else if (command[0] == "warpto")
  316.                 {
  317.                     if (command.Length != 2)
  318.                         return;
  319.  
  320.                     User user = UserManager.GetUser(command[1]);
  321.                     if (user != null && user != this)
  322.                     {
  323.                         this.Map.RemoveUser(this);
  324.                         this.Map = user.Map;
  325.                         this.X = user.X;
  326.                         this.Y = user.Y;
  327.                         this.Map.AddUser(this);
  328.                         this.Send(PacketCreator.ChangeMap(this));
  329.                     }
  330.                 }
  331.                 else if (command[0] == "teleport")
  332.                 {
  333.                     if (command.Length != 3)
  334.                         return;
  335.                     byte x = byte.Parse(command[1]), y = byte.Parse(command[2]);
  336.                     if (x < 0 || y < 0 || x >= this.Map.Width || y >= this.Map.Height)
  337.                         return;
  338.                     this.X = x;
  339.                     this.Y = y;
  340.                     this.Send(PacketCreator.ResetPosition(this));
  341.                     this.Map.Send(PacketCreator.UserMovement(this, false));
  342.  
  343.                 }
  344.             }
  345.  
  346.  
  347.         }
  348.         #endregion
  349.  
  350.         internal void Save()
  351.         {
  352.             if (!loggedin)
  353.                 return;
  354.  
  355.             DB.ExecuteNonQuery("UPDATE users SET mapid={0}, x={1}, y={2} WHERE id={3}",
  356.                 Map.ID, X, Y, ID);
  357.         }
  358.     }
  359. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement