mirror of
https://github.com/islehorse/HISP.git
synced 2025-04-23 05:05:53 +12:00
Update
This commit is contained in:
parent
ed99d8328e
commit
d0b206f388
8 changed files with 746 additions and 245 deletions
|
@ -19,12 +19,20 @@ namespace Horse_Isle_Server
|
|||
public User LoggedinUser;
|
||||
|
||||
private Thread recvPackets;
|
||||
private Timer updateTimer;
|
||||
|
||||
|
||||
private void updateTimerTick(object state)
|
||||
{
|
||||
Logger.DebugPrint("Sending update packet to "+ LoggedinUser.Username);
|
||||
byte[] updatePacket = PacketBuilder.CreateUpdate();
|
||||
SendPacket(updatePacket);
|
||||
}
|
||||
public void Login(int id)
|
||||
{
|
||||
LoggedinUser = new User(id);
|
||||
LoggedIn = true;
|
||||
|
||||
|
||||
}
|
||||
private void receivePackets()
|
||||
{
|
||||
|
@ -99,6 +107,12 @@ namespace Horse_Isle_Server
|
|||
case PacketBuilder.PACKET_MOVE:
|
||||
Server.OnMovementPacket(this, Packet);
|
||||
break;
|
||||
case PacketBuilder.PACKET_PROFILE:
|
||||
Server.OnProfilePacket(this, Packet);
|
||||
break;
|
||||
case PacketBuilder.PACKET_UPDATE:
|
||||
Server.OnUpdatePacket(this, Packet);
|
||||
break;
|
||||
default:
|
||||
Logger.ErrorPrint("Unimplemented Packet: " + BitConverter.ToString(Packet).Replace('-', ' '));
|
||||
break;
|
||||
|
@ -109,15 +123,26 @@ namespace Horse_Isle_Server
|
|||
public void Disconnect()
|
||||
{
|
||||
Logger.DebugPrint(ClientSocket.RemoteEndPoint + " has Disconnected.");
|
||||
recvPackets.Abort();
|
||||
updateTimer.Dispose();
|
||||
LoggedIn = false;
|
||||
LoggedinUser = null;
|
||||
Server.ConnectedClients.Remove(this);
|
||||
ClientSocket.Close();
|
||||
ClientSocket.Dispose();
|
||||
}
|
||||
|
||||
public void SendPacket(byte[] PacketData)
|
||||
{
|
||||
ClientSocket.Send(PacketData);
|
||||
try
|
||||
{
|
||||
ClientSocket.Send(PacketData);
|
||||
}
|
||||
catch (SocketException e)
|
||||
{
|
||||
Logger.ErrorPrint("Socket exception occured: " + e.Message + " and so it was disconnected.");
|
||||
Disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
public Client(Socket clientSocket)
|
||||
|
@ -126,6 +151,7 @@ namespace Horse_Isle_Server
|
|||
RemoteIp = clientSocket.RemoteEndPoint.ToString();
|
||||
|
||||
Logger.DebugPrint("Client connected @ " + RemoteIp);
|
||||
updateTimer = new Timer(new TimerCallback(updateTimerTick), null, 60 * 1000, 60 * 1000);
|
||||
|
||||
recvPackets = new Thread(() =>
|
||||
{
|
||||
|
|
|
@ -21,30 +21,73 @@ namespace Horse_Isle_Server
|
|||
string jsonData = File.ReadAllText(ConfigReader.GameDataFile);
|
||||
dynamic gameData = JsonConvert.DeserializeObject(jsonData);
|
||||
|
||||
int totalIsles = gameData.isles.Count;
|
||||
// Register Towns
|
||||
int totalTowns = gameData.places.towns.Count;
|
||||
for (int i = 0; i < totalTowns; i++)
|
||||
{
|
||||
|
||||
World.Town town = new World.Town();
|
||||
town.StartX = gameData.places.towns[i].start_x;
|
||||
town.StartY = gameData.places.towns[i].start_y;
|
||||
town.EndX = gameData.places.towns[i].end_x;
|
||||
town.EndY = gameData.places.towns[i].end_y;
|
||||
town.Name = gameData.places.towns[i].name;
|
||||
|
||||
Logger.DebugPrint("Registered Town: " + town.Name + " X " + town.StartX + "-" + town.EndX + " Y " + town.StartY + "-" + town.EndY);
|
||||
World.Towns.Add(town);
|
||||
}
|
||||
|
||||
// Register Areas
|
||||
int totalAreas = gameData.places.towns.Count;
|
||||
for (int i = 0; i < totalAreas; i++)
|
||||
{
|
||||
|
||||
World.Area area = new World.Area();
|
||||
area.StartX = gameData.places.areas[i].start_x;
|
||||
area.StartY = gameData.places.areas[i].start_y;
|
||||
area.EndX = gameData.places.areas[i].end_x;
|
||||
area.EndY = gameData.places.areas[i].end_y;
|
||||
area.Name = gameData.places.areas[i].name;
|
||||
|
||||
Logger.DebugPrint("Registered Area: " + area.Name + " X " + area.StartX + "-" + area.EndX + " Y " + area.StartY + "-" + area.EndY);
|
||||
World.Areas.Add(area);
|
||||
}
|
||||
|
||||
// Register Isles
|
||||
int totalIsles = gameData.places.isles.Count;
|
||||
for(int i = 0; i < totalIsles; i++)
|
||||
{
|
||||
|
||||
World.Isle isle = new World.Isle();
|
||||
isle.StartX = gameData.isles[i].start_x;
|
||||
isle.StartY = gameData.isles[i].start_y;
|
||||
isle.EndX = gameData.isles[i].end_x;
|
||||
isle.EndY = gameData.isles[i].end_y;
|
||||
isle.Tileset = gameData.isles[i].tileset;
|
||||
isle.Name = gameData.isles[i].name;
|
||||
isle.StartX = gameData.places.isles[i].start_x;
|
||||
isle.StartY = gameData.places.isles[i].start_y;
|
||||
isle.EndX = gameData.places.isles[i].end_x;
|
||||
isle.EndY = gameData.places.isles[i].end_y;
|
||||
isle.Tileset = gameData.places.isles[i].tileset;
|
||||
isle.Name = gameData.places.isles[i].name;
|
||||
|
||||
Logger.DebugPrint("Registered Isle: " + isle.Name + " X " + isle.StartX + "-" + isle.EndX + " Y " + isle.StartY + "-" + isle.EndY + " tileset: " + isle.Tileset);
|
||||
World.Isles.Add(isle);
|
||||
}
|
||||
|
||||
|
||||
Messages.NewUserMessage = gameData.new_user.starting_message;
|
||||
Map.NewUserStartX = gameData.new_user.starting_x;
|
||||
Map.NewUserStartY = gameData.new_user.starting_y;
|
||||
|
||||
Messages.LoginFormat = gameData.messages.login_format;
|
||||
Messages.AreaMessage = gameData.messages.area_format;
|
||||
Messages.NothingMessage = gameData.messages.nothing_message;
|
||||
Messages.MotdFormat = gameData.messages.motd_format;
|
||||
Messages.ProfileSavedMessage = gameData.messages.profile_save;
|
||||
|
||||
Messages.IsleFormat = gameData.messages.meta.isle_format;
|
||||
Messages.TownFormat = gameData.messages.meta.town_format;
|
||||
Messages.AreaFormat = gameData.messages.meta.area_format;
|
||||
Messages.LocationFormat = gameData.messages.meta.location_format;
|
||||
|
||||
Messages.Sepeerator = gameData.messages.meta.seperator;
|
||||
|
||||
Messages.TileFormat = gameData.messages.meta.tile_format;
|
||||
Messages.NothingMessage = gameData.messages.meta.nothing_message;
|
||||
|
||||
JArray overlayTileDepth = gameData.tile_paramaters.overlay_tiles.tile_depth;
|
||||
JArray terrainTilePassibility = gameData.tile_paramaters.terrain_tiles.passibility;
|
||||
|
|
|
@ -9,12 +9,20 @@ namespace Horse_Isle_Server
|
|||
class Messages
|
||||
{
|
||||
public static string NewUserMessage;
|
||||
public static string AreaMessage;
|
||||
public static string NothingMessage;
|
||||
public static string LoginFormat;
|
||||
|
||||
public static string MotdFormat;
|
||||
|
||||
public static string ProfileSavedMessage;
|
||||
|
||||
public static string Sepeerator;
|
||||
|
||||
public static string IsleFormat;
|
||||
public static string TownFormat;
|
||||
public static string AreaFormat;
|
||||
public static string LocationFormat;
|
||||
|
||||
public static string TileFormat;
|
||||
public static string NothingMessage;
|
||||
public static string GetMOTD()
|
||||
{
|
||||
return MotdFormat.Replace("%MOTD%", ConfigReader.Motd);
|
||||
|
@ -26,13 +34,17 @@ namespace Horse_Isle_Server
|
|||
|
||||
public static string LocationData(int x, int y)
|
||||
{
|
||||
string locationString = "";
|
||||
string message = "";
|
||||
try
|
||||
{
|
||||
World.Isle isle = World.GetIsle(x, y);
|
||||
message = AreaMessage.Replace("%AREA%", isle.Name);
|
||||
}
|
||||
catch (Exception) { }
|
||||
if(World.InArea(x,y))
|
||||
locationString += AreaFormat.Replace("%AREA%", World.GetArea(x, y).Name);
|
||||
if (World.InTown(x, y))
|
||||
locationString += TownFormat.Replace("%TOWN%", World.GetTown(x, y).Name);
|
||||
if (World.InIsle(x, y))
|
||||
locationString += IsleFormat.Replace("%ISLE%", World.GetIsle(x, y).Name);
|
||||
|
||||
if(locationString != "")
|
||||
message += LocationFormat.Replace("%META%", locationString);
|
||||
|
||||
int[] itemIds = World.GetDroppedItems(x, y);
|
||||
if (itemIds.Length == 0)
|
||||
|
|
|
@ -12,7 +12,7 @@ namespace Horse_Isle_Server
|
|||
|
||||
public const byte PACKET_TERMINATOR = 0x00;
|
||||
public const byte PACKET_A_TERMINATOR = 0x0A;
|
||||
|
||||
|
||||
|
||||
public const byte PACKET_LOGIN = 0x7F;
|
||||
public const byte PACKET_CHAT = 0x14;
|
||||
|
@ -24,8 +24,16 @@ namespace Horse_Isle_Server
|
|||
public const byte PACKET_AREA_DEFS = 0x79;
|
||||
public const byte PACKET_ANNOUNCEMENT = 0x7E;
|
||||
public const byte PACKET_TILE_FLAGS = 0x75;
|
||||
public const byte PACKET_UPDATE = 0x7C;
|
||||
public const byte PACKET_PROFILE = 0x18;
|
||||
|
||||
public const byte VIEW_PROFILE = 0x14;
|
||||
public const byte SAVE_PROFILE = 0x15;
|
||||
|
||||
public const byte AREA_SEPERATOR = 0x5E;
|
||||
public const byte AREA_TOWN = 0x54;
|
||||
public const byte AREA_AREA = 0x41;
|
||||
public const byte AREA_ISLE = 0x49;
|
||||
|
||||
public const byte MOVE_UP = 0x14;
|
||||
public const byte MOVE_DOWN = 0x15;
|
||||
|
@ -65,6 +73,23 @@ namespace Horse_Isle_Server
|
|||
return Packet;
|
||||
}
|
||||
|
||||
public static byte[] CreateProfilePacket(string userProfile)
|
||||
{
|
||||
MemoryStream ms = new MemoryStream();
|
||||
|
||||
ms.WriteByte(PACKET_PROFILE);
|
||||
|
||||
byte[] strBytes = Encoding.UTF8.GetBytes(userProfile);
|
||||
ms.Write(strBytes, 0x00, strBytes.Length);
|
||||
|
||||
ms.WriteByte(PACKET_TERMINATOR);
|
||||
ms.Seek(0x00, SeekOrigin.Begin);
|
||||
byte[] Packet = ms.ToArray();
|
||||
ms.Dispose();
|
||||
|
||||
return Packet;
|
||||
}
|
||||
|
||||
public static byte[] CreateMovementPacket(int x, int y,int charId,int facing, int direction, bool walk)
|
||||
{
|
||||
// Header information
|
||||
|
@ -96,7 +121,6 @@ namespace Horse_Isle_Server
|
|||
int ystart = y - 4;
|
||||
int xstart = x - 6;
|
||||
|
||||
|
||||
if (direction == DIRECTION_UP)
|
||||
{
|
||||
for (int relx = 0; relx <= 12; relx++)
|
||||
|
@ -104,13 +128,19 @@ namespace Horse_Isle_Server
|
|||
int tileId = Map.GetTileId(xstart + relx, ystart, false);
|
||||
int otileId = Map.GetTileId(xstart + relx, ystart, true);
|
||||
|
||||
|
||||
if (tileId >= 190)
|
||||
{
|
||||
ms.WriteByte((byte)190);
|
||||
tileId -= 100;
|
||||
}
|
||||
ms.WriteByte((byte)tileId);
|
||||
if (tileId == 190)
|
||||
ms.WriteByte((byte)0x5B);
|
||||
|
||||
if (otileId >= 190)
|
||||
{
|
||||
ms.WriteByte((byte)190);
|
||||
otileId -= 100;
|
||||
}
|
||||
ms.WriteByte((byte)otileId);
|
||||
if (otileId == 190)
|
||||
ms.WriteByte((byte)0x5A);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -122,12 +152,20 @@ namespace Horse_Isle_Server
|
|||
int otileId = Map.GetTileId(xstart, ystart + rely, true);
|
||||
|
||||
|
||||
|
||||
if (tileId >= 190)
|
||||
{
|
||||
ms.WriteByte((byte)190);
|
||||
tileId -= 100;
|
||||
}
|
||||
ms.WriteByte((byte)tileId);
|
||||
if (tileId == 190)
|
||||
ms.WriteByte((byte)0x5B);
|
||||
|
||||
if (otileId >= 190)
|
||||
{
|
||||
ms.WriteByte((byte)190);
|
||||
otileId -= 100;
|
||||
}
|
||||
ms.WriteByte((byte)otileId);
|
||||
if (otileId == 190)
|
||||
ms.WriteByte((byte)0x5A);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -140,12 +178,19 @@ namespace Horse_Isle_Server
|
|||
int otileId = Map.GetTileId(xstart + 12, ystart + rely, true);
|
||||
|
||||
|
||||
if (tileId >= 190)
|
||||
{
|
||||
ms.WriteByte((byte)190);
|
||||
tileId -= 100;
|
||||
}
|
||||
ms.WriteByte((byte)tileId);
|
||||
if (tileId == 190)
|
||||
ms.WriteByte((byte)0x5B);
|
||||
|
||||
if (otileId >= 190)
|
||||
{
|
||||
ms.WriteByte((byte)190);
|
||||
otileId -= 100;
|
||||
}
|
||||
ms.WriteByte((byte)otileId);
|
||||
if (otileId == 190)
|
||||
ms.WriteByte((byte)0x5A);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -157,12 +202,19 @@ namespace Horse_Isle_Server
|
|||
int otileId = Map.GetTileId(xstart + relx, ystart + 9, true);
|
||||
|
||||
|
||||
if (tileId >= 190)
|
||||
{
|
||||
ms.WriteByte((byte)190);
|
||||
tileId -= 100;
|
||||
}
|
||||
ms.WriteByte((byte)tileId);
|
||||
if (tileId == 190)
|
||||
ms.WriteByte((byte)0x5B);
|
||||
|
||||
if (otileId >= 190)
|
||||
{
|
||||
ms.WriteByte((byte)190);
|
||||
otileId -= 100;
|
||||
}
|
||||
ms.WriteByte((byte)otileId);
|
||||
if (otileId == 190)
|
||||
ms.WriteByte((byte)0x5A);
|
||||
}
|
||||
}
|
||||
if (direction == DIRECTION_LOGIN)
|
||||
|
@ -174,14 +226,20 @@ namespace Horse_Isle_Server
|
|||
int tileId = Map.GetTileId(xstart + relx, ystart + rely, false);
|
||||
int otileId = Map.GetTileId(xstart + relx, ystart + rely, true);
|
||||
|
||||
|
||||
if(tileId >= 190)
|
||||
{
|
||||
ms.WriteByte((byte)190);
|
||||
tileId -= 100;
|
||||
}
|
||||
ms.WriteByte((byte)tileId);
|
||||
if (tileId == 190)
|
||||
ms.WriteByte((byte)0x5B);
|
||||
|
||||
if (otileId >= 190)
|
||||
{
|
||||
ms.WriteByte((byte)190);
|
||||
otileId -= 100;
|
||||
}
|
||||
ms.WriteByte((byte)otileId);
|
||||
if (otileId == 190)
|
||||
ms.WriteByte((byte)0x5A);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -193,8 +251,7 @@ namespace Horse_Isle_Server
|
|||
byte[] Packet = ms.ToArray();
|
||||
ms.Dispose();
|
||||
|
||||
Logger.DebugPrint(BitConverter.ToString(Packet).Replace('-', ' '));
|
||||
|
||||
//Logger.DebugPrint(BitConverter.ToString(Packet).Replace("-", " "));
|
||||
return Packet;
|
||||
}
|
||||
|
||||
|
@ -262,15 +319,82 @@ namespace Horse_Isle_Server
|
|||
return Packet;
|
||||
}
|
||||
|
||||
public static byte[] CreateIsleData(World.Isle[] isles)
|
||||
public static byte[] CreateUpdate()
|
||||
{
|
||||
MemoryStream ms = new MemoryStream();
|
||||
|
||||
ms.WriteByte(PACKET_UPDATE);
|
||||
ms.WriteByte(PACKET_TERMINATOR);
|
||||
|
||||
ms.Seek(0x00, SeekOrigin.Begin);
|
||||
byte[] Packet = ms.ToArray();
|
||||
ms.Dispose();
|
||||
|
||||
return Packet;
|
||||
}
|
||||
public static byte[] CreatePlaceData(World.Isle[] isles, World.Town[] towns, World.Area[] areas)
|
||||
{
|
||||
MemoryStream ms = new MemoryStream();
|
||||
ms.WriteByte(PACKET_AREA_DEFS);
|
||||
foreach(World.Isle isle in isles)
|
||||
|
||||
// Write Towns
|
||||
|
||||
foreach (World.Town town in towns)
|
||||
{
|
||||
byte[] strBytes = Encoding.UTF8.GetBytes(town.Name);
|
||||
|
||||
ms.WriteByte(AREA_SEPERATOR);
|
||||
ms.WriteByte(AREA_TOWN);
|
||||
|
||||
ms.WriteByte((byte)(((town.StartX - 4) / 64) + 20));
|
||||
ms.WriteByte((byte)(((town.StartX - 4) % 64) + 20));
|
||||
|
||||
ms.WriteByte((byte)(((town.EndX - 4) / 64) + 20));
|
||||
ms.WriteByte((byte)(((town.EndX - 4) % 64) + 20));
|
||||
|
||||
ms.WriteByte((byte)(((town.StartY - 1) / 64) + 20));
|
||||
ms.WriteByte((byte)(((town.StartY - 1) % 64) + 20));
|
||||
|
||||
ms.WriteByte((byte)(((town.EndY - 1) / 64) + 20));
|
||||
ms.WriteByte((byte)(((town.EndY - 1) % 64) + 20));
|
||||
|
||||
|
||||
ms.Write(strBytes, 0x00, strBytes.Length);
|
||||
}
|
||||
|
||||
// Write Areas
|
||||
|
||||
foreach (World.Area area in areas)
|
||||
{
|
||||
byte[] strBytes = Encoding.UTF8.GetBytes(area.Name);
|
||||
|
||||
ms.WriteByte(AREA_SEPERATOR);
|
||||
ms.WriteByte(AREA_AREA);
|
||||
|
||||
ms.WriteByte((byte)(((area.StartX - 4) / 64) + 20));
|
||||
ms.WriteByte((byte)(((area.StartX - 4) % 64) + 20));
|
||||
|
||||
ms.WriteByte((byte)(((area.EndX - 4) / 64) + 20));
|
||||
ms.WriteByte((byte)(((area.EndX - 4) % 64) + 20));
|
||||
|
||||
ms.WriteByte((byte)(((area.StartY - 1) / 64) + 20));
|
||||
ms.WriteByte((byte)(((area.StartY - 1) % 64) + 20));
|
||||
|
||||
ms.WriteByte((byte)(((area.EndY - 1) / 64) + 20));
|
||||
ms.WriteByte((byte)(((area.EndY - 1) % 64) + 20));
|
||||
|
||||
|
||||
ms.Write(strBytes, 0x00, strBytes.Length);
|
||||
}
|
||||
|
||||
// Write Isles
|
||||
|
||||
foreach (World.Isle isle in isles)
|
||||
{
|
||||
byte[] strBytes = Encoding.UTF8.GetBytes(isle.Name);
|
||||
|
||||
ms.WriteByte(AREA_SEPERATOR);
|
||||
ms.WriteByte(AREA_ISLE);
|
||||
|
||||
ms.WriteByte((byte)(((isle.StartX - 4) / 64) + 20));
|
||||
ms.WriteByte((byte)(((isle.StartX - 4) % 64) + 20));
|
||||
|
@ -394,49 +518,5 @@ namespace Horse_Isle_Server
|
|||
return CreateChat(formattedStr, CHAT_BOTTOM_RIGHT);
|
||||
}
|
||||
|
||||
public static byte[] CreateUserInfo(Client client)
|
||||
{
|
||||
MemoryStream ms = new MemoryStream();
|
||||
if(!client.LoggedIn)
|
||||
throw new Exception("Client is not logged in.");
|
||||
User user = client.LoggedinUser;
|
||||
|
||||
byte[] MovementPacket = CreateMovementPacket(user.X, user.Y, user.CharacterId, DIRECTION_DOWN, DIRECTION_LOGIN, true);
|
||||
ms.Write(MovementPacket, 0x00, MovementPacket.Length);
|
||||
|
||||
byte[] LoginMessage = CreateLoginMessage(user.Username);
|
||||
ms.Write(LoginMessage, 0x00, LoginMessage.Length);
|
||||
|
||||
World.Time time = World.GetGameTime();
|
||||
int timestamp = time.hours * 60;
|
||||
timestamp += time.minutes;
|
||||
|
||||
byte[] WorldData = CreateWorldData(timestamp, time.days, time.year, World.GetWeather());
|
||||
ms.Write(WorldData, 0x00, WorldData.Length);
|
||||
|
||||
byte[] SecCodePacket = CreateSecCode(user.SecCodeSeeds, user.SecCodeInc, user.Administrator, user.Moderator);
|
||||
ms.Write(SecCodePacket, 0x00, SecCodePacket.Length);
|
||||
|
||||
byte[] BaseStatsPacketData = CreateBaseStats(user.Money, Server.GetNumberOfPlayers(), user.MailBox.MailCount);
|
||||
ms.Write(BaseStatsPacketData, 0x00, BaseStatsPacketData.Length);
|
||||
|
||||
byte[] AreaMessage = CreateAreaMessage(user.X,user.Y);
|
||||
ms.Write(AreaMessage, 0x00, AreaMessage.Length);
|
||||
|
||||
byte[] IsleData = CreateIsleData(World.Isles.ToArray());
|
||||
ms.Write(IsleData, 0x00, IsleData.Length);
|
||||
|
||||
byte[] TileFlags = CreateTileOverlayFlags(Map.OverlayTileDepth);
|
||||
ms.Write(TileFlags, 0x00, TileFlags.Length);
|
||||
|
||||
byte[] MotdData = CreateMotd();
|
||||
ms.Write(MotdData, 0x00, MotdData.Length);
|
||||
|
||||
ms.Seek(0x00, SeekOrigin.Begin);
|
||||
byte[] Packet = ms.ToArray();
|
||||
ms.Dispose();
|
||||
|
||||
return Packet;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,27 +10,6 @@ namespace Horse_Isle_Server
|
|||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
/*
|
||||
Bitmap mbmp = new Bitmap("MapData.bmp");
|
||||
Bitmap bmp = new Bitmap("oMapData.bmp");
|
||||
Console.WriteLine(bmp.PixelFormat);
|
||||
Bitmap bbmp = new Bitmap(bmp.Width, bmp.Height, PixelFormat.Format24bppRgb);
|
||||
for(int x = 0; x < bmp.Width; x++)
|
||||
{
|
||||
for(int y = 0; y < bmp.Height; y++)
|
||||
{
|
||||
Color col = mbmp.GetPixel(x, y);
|
||||
Color col2 = bmp.GetPixel(x, y);
|
||||
|
||||
bbmp.SetPixel(x,y,Color.FromArgb(col2.B, 0, col.B));
|
||||
|
||||
}
|
||||
}
|
||||
bbmp.Save("MapData2.bmp", ImageFormat.Bmp);
|
||||
Console.WriteLine("image checked");
|
||||
*/
|
||||
|
||||
|
||||
|
||||
Directory.SetCurrentDirectory(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location));
|
||||
ConfigReader.OpenConfig();
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
|
@ -30,9 +31,112 @@ namespace Horse_Isle_Server
|
|||
Logger.ErrorPrint(sender.RemoteIp + " Requested user information when not logged in.");
|
||||
return;
|
||||
}
|
||||
Logger.DebugPrint(sender.LoggedinUser.Username + " Requesting user information.");
|
||||
byte[] userInfoPackets = PacketBuilder.CreateUserInfo(sender);
|
||||
sender.SendPacket(userInfoPackets);
|
||||
Logger.DebugPrint(sender.LoggedinUser.Username + " Requested user information.");
|
||||
MemoryStream ms = new MemoryStream();
|
||||
User user = sender.LoggedinUser;
|
||||
|
||||
byte[] MovementPacket = PacketBuilder.CreateMovementPacket(user.X, user.Y, user.CharacterId, PacketBuilder.DIRECTION_DOWN, PacketBuilder.DIRECTION_LOGIN, true);
|
||||
ms.Write(MovementPacket, 0x00, MovementPacket.Length);
|
||||
|
||||
byte[] LoginMessage = PacketBuilder.CreateLoginMessage(user.Username);
|
||||
ms.Write(LoginMessage, 0x00, LoginMessage.Length);
|
||||
|
||||
World.Time time = World.GetGameTime();
|
||||
int timestamp = time.hours * 60;
|
||||
timestamp += time.minutes;
|
||||
|
||||
byte[] WorldData = PacketBuilder.CreateWorldData(timestamp, time.days, time.year, World.GetWeather());
|
||||
ms.Write(WorldData, 0x00, WorldData.Length);
|
||||
|
||||
byte[] SecCodePacket = PacketBuilder.CreateSecCode(user.SecCodeSeeds, user.SecCodeInc, user.Administrator, user.Moderator);
|
||||
ms.Write(SecCodePacket, 0x00, SecCodePacket.Length);
|
||||
|
||||
byte[] BaseStatsPacketData = PacketBuilder.CreateBaseStats(user.Money, Server.GetNumberOfPlayers(), user.MailBox.MailCount);
|
||||
ms.Write(BaseStatsPacketData, 0x00, BaseStatsPacketData.Length);
|
||||
|
||||
byte[] AreaMessage = PacketBuilder.CreateAreaMessage(user.X, user.Y);
|
||||
ms.Write(AreaMessage, 0x00, AreaMessage.Length);
|
||||
|
||||
byte[] IsleData = PacketBuilder.CreatePlaceData(World.Isles.ToArray(), World.Towns.ToArray(), World.Areas.ToArray());
|
||||
ms.Write(IsleData, 0x00, IsleData.Length);
|
||||
|
||||
byte[] TileFlags = PacketBuilder.CreateTileOverlayFlags(Map.OverlayTileDepth);
|
||||
ms.Write(TileFlags, 0x00, TileFlags.Length);
|
||||
|
||||
byte[] MotdData = PacketBuilder.CreateMotd();
|
||||
ms.Write(MotdData, 0x00, MotdData.Length);
|
||||
|
||||
ms.Seek(0x00, SeekOrigin.Begin);
|
||||
byte[] Packet = ms.ToArray();
|
||||
ms.Dispose();
|
||||
|
||||
sender.SendPacket(Packet);
|
||||
}
|
||||
public static void OnUpdatePacket(Client sender, byte[] packet)
|
||||
{
|
||||
if (!sender.LoggedIn)
|
||||
{
|
||||
Logger.ErrorPrint(sender.RemoteIp + " Requested user information when not logged in.");
|
||||
return;
|
||||
}
|
||||
if (packet.Length < 2)
|
||||
{
|
||||
Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid Update Packet");
|
||||
return;
|
||||
}
|
||||
|
||||
if(packet[1] == PacketBuilder.PACKET_A_TERMINATOR)
|
||||
{
|
||||
Logger.DebugPrint(sender.LoggedinUser.Username + " Requested latest statistics (Money/Playercount/Mail)");
|
||||
byte[] packetResponse = PacketBuilder.CreateBaseStats(sender.LoggedinUser.Money, GetNumberOfPlayers(), sender.LoggedinUser.MailBox.MailCount);
|
||||
sender.SendPacket(packetResponse);
|
||||
}
|
||||
}
|
||||
public static void OnProfilePacket(Client sender, byte[] packet)
|
||||
{
|
||||
if (!sender.LoggedIn)
|
||||
{
|
||||
Logger.ErrorPrint(sender.RemoteIp + " Requested to change profile page when not logged in.");
|
||||
return;
|
||||
}
|
||||
if(packet.Length < 2)
|
||||
{
|
||||
Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid Profile Packet");
|
||||
return;
|
||||
}
|
||||
|
||||
byte method = packet[1];
|
||||
if(method == PacketBuilder.VIEW_PROFILE)
|
||||
{
|
||||
byte[] profilePacket = PacketBuilder.CreateProfilePacket(sender.LoggedinUser.ProfilePage);
|
||||
sender.SendPacket(profilePacket);
|
||||
}
|
||||
else if(method == PacketBuilder.SAVE_PROFILE)
|
||||
{
|
||||
|
||||
string packetStr = Encoding.UTF8.GetString(packet);
|
||||
if (packet.Length < 3 || !packetStr.Contains('|'))
|
||||
{
|
||||
Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid Profile SAVE Packet");
|
||||
return;
|
||||
}
|
||||
|
||||
int characterId = (packet[2] - 20) * 64 + (packet[3] - 20);
|
||||
|
||||
string profilePage = packetStr.Split('|')[1];
|
||||
profilePage = profilePage.Substring(0, profilePage.Length - 2);
|
||||
|
||||
sender.LoggedinUser.CharacterId = characterId;
|
||||
sender.LoggedinUser.ProfilePage = profilePage;
|
||||
|
||||
Logger.DebugPrint(sender.LoggedinUser.Username + " Changed to character id: " + characterId + " and set there Profile Description to '" + profilePage + "'");
|
||||
|
||||
byte[] chatPacket = PacketBuilder.CreateChat(Messages.ProfileSavedMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
|
||||
sender.SendPacket(chatPacket);
|
||||
|
||||
UpdateArea(sender);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static void OnMovementPacket(Client sender, byte[] packet)
|
||||
|
@ -104,10 +208,10 @@ namespace Horse_Isle_Server
|
|||
|
||||
}
|
||||
|
||||
UpdateArea(sender);
|
||||
|
||||
byte[] tileData = PacketBuilder.CreateAreaMessage(loggedInUser.X, loggedInUser.Y);
|
||||
sender.SendPacket(tileData);
|
||||
}
|
||||
|
||||
public static void OnLoginRequest(Client sender, byte[] packet)
|
||||
{
|
||||
Logger.DebugPrint("Login request received from: " + sender.RemoteIp);
|
||||
|
@ -154,6 +258,14 @@ namespace Horse_Isle_Server
|
|||
|
||||
}
|
||||
|
||||
public static void UpdateArea(Client forClient)
|
||||
{
|
||||
|
||||
byte[] areaData = PacketBuilder.CreateAreaMessage(forClient.LoggedinUser.X, forClient.LoggedinUser.Y);
|
||||
forClient.SendPacket(areaData);
|
||||
|
||||
}
|
||||
|
||||
public static int GetNumberOfPlayers()
|
||||
{
|
||||
int count = 0;
|
||||
|
|
|
@ -18,7 +18,24 @@ namespace Horse_Isle_Server
|
|||
public int Tileset;
|
||||
public string Name;
|
||||
}
|
||||
|
||||
public struct Town
|
||||
{
|
||||
public int StartX;
|
||||
public int EndX;
|
||||
public int StartY;
|
||||
public int EndY;
|
||||
public string Name;
|
||||
}
|
||||
public struct Area
|
||||
{
|
||||
public int StartX;
|
||||
public int EndX;
|
||||
public int StartY;
|
||||
public int EndY;
|
||||
public string Name;
|
||||
}
|
||||
|
||||
|
||||
public struct Time
|
||||
{
|
||||
public int minutes;
|
||||
|
@ -29,6 +46,8 @@ namespace Horse_Isle_Server
|
|||
public const int MINUTE = 4320;
|
||||
|
||||
public static List<Isle> Isles = new List<Isle>();
|
||||
public static List<Town> Towns = new List<Town>();
|
||||
public static List<Area> Areas = new List<Area>();
|
||||
public static Time GetGameTime()
|
||||
{
|
||||
int epoch = Database.GetServerCreationTime();
|
||||
|
@ -54,7 +73,45 @@ namespace Horse_Isle_Server
|
|||
return time;
|
||||
}
|
||||
|
||||
public static bool InArea(int x, int y)
|
||||
{
|
||||
try
|
||||
{
|
||||
GetArea(x, y);
|
||||
return true;
|
||||
}
|
||||
catch (KeyNotFoundException)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static bool InTown(int x, int y)
|
||||
{
|
||||
try
|
||||
{
|
||||
GetTown(x, y);
|
||||
return true;
|
||||
}
|
||||
catch (KeyNotFoundException)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static bool InIsle(int x, int y)
|
||||
{
|
||||
try
|
||||
{
|
||||
GetIsle(x, y);
|
||||
return true;
|
||||
}
|
||||
catch(KeyNotFoundException)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
public static Isle GetIsle(int x, int y)
|
||||
{
|
||||
foreach(Isle isle in Isles)
|
||||
|
@ -67,6 +124,33 @@ namespace Horse_Isle_Server
|
|||
}
|
||||
throw new KeyNotFoundException("x,y not in an isle!");
|
||||
}
|
||||
|
||||
public static Area GetArea(int x, int y)
|
||||
{
|
||||
foreach (Area area in Areas)
|
||||
{
|
||||
|
||||
if (area.StartX <= x && area.EndX >= x && area.StartY <= y && area.EndY >= y)
|
||||
{
|
||||
return area;
|
||||
}
|
||||
}
|
||||
throw new KeyNotFoundException("x,y not in an area!");
|
||||
}
|
||||
|
||||
public static Town GetTown(int x, int y)
|
||||
{
|
||||
foreach (Town town in Towns)
|
||||
{
|
||||
|
||||
if (town.StartX <= x && town.EndX >= x && town.StartY <= y && town.EndY >= y)
|
||||
{
|
||||
return town;
|
||||
}
|
||||
}
|
||||
throw new KeyNotFoundException("x,y not in a town!");
|
||||
}
|
||||
|
||||
public static int[] GetDroppedItems(int x, int y)
|
||||
{
|
||||
return new int[] { }; // Not implemented yet.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue