This commit is contained in:
SilicaAndPina 2020-10-18 19:12:50 +13:00
parent 5061e503fe
commit 48d1b9e100
531 changed files with 9271 additions and 167 deletions

View file

@ -70,6 +70,25 @@ namespace Horse_Isle_Server
World.Isles.Add(isle);
}
// Register Special Tiles
int totalSpecialTiles = gameData.places.special_tiles.Count;
for (int i = 0; i < totalSpecialTiles; i++)
{
World.SpecialTile specialTile = new World.SpecialTile();
specialTile.X = gameData.places.special_tiles[i].x;
specialTile.Y = gameData.places.special_tiles[i].y;
specialTile.Title = gameData.places.special_tiles[i].title;
specialTile.Description = gameData.places.special_tiles[i].description;
specialTile.Code = gameData.places.special_tiles[i].code;
specialTile.ExitX = gameData.places.special_tiles[i].exit_x;
specialTile.ExitY = gameData.places.special_tiles[i].exit_y;
specialTile.AutoplaySwf = gameData.places.special_tiles[i].autoplay_swf;
specialTile.TypeFlag = gameData.places.special_tiles[i].type_flag;
Logger.DebugPrint("Registered Special Tile: " + specialTile.Title + " X " + specialTile.X + " Y: " + specialTile.Y);
World.SpecialTiles.Add(specialTile);
}
// Register Filter Reasons
int totalReasons = gameData.messages.chat.reason_messages.Count;
@ -172,9 +191,19 @@ namespace Horse_Isle_Server
// Map Data
Map.OverlayTileDepth = gameData.tile_paramaters.overlay_tiles.tile_depth.ToObject<int[]>();
Map.OverlayTilesetPassibility = gameData.tile_paramaters.overlay_tiles.passibility.ToObject<bool[][]>();
Map.TerrainTilePassibility = gameData.tile_paramaters.terrain_tiles.passibility.ToObject<bool[]>();
Map.OverlayTilesetPassibility = gameData.tile_paramaters.overlay_tiles.passibility.ToObject<bool[]>();
List<Map.TerrainTile> terrainTiles = new List<Map.TerrainTile>();
int totalTerrainTiles = gameData.tile_paramaters.terrain_tiles.Count;
for(int i = 0; i < totalTerrainTiles; i++)
{
Map.TerrainTile tile = new Map.TerrainTile();
tile.Passable = gameData.tile_paramaters.terrain_tiles[i].passable;
tile.Type = gameData.tile_paramaters.terrain_tiles[i].passable;
terrainTiles.Add(tile);
}
Map.TerrainTiles = terrainTiles.ToArray();
// Disconnect Reasons
Messages.BanMessage = gameData.messages.disconnect.banned;

View file

@ -70,6 +70,7 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Action.cs" />
<Compile Include="Authentication.cs" />
<Compile Include="Chat.cs" />
<Compile Include="Client.cs" />
@ -83,6 +84,8 @@
<Compile Include="Mailbox.cs" />
<Compile Include="Map.cs" />
<Compile Include="Messages.cs" />
<Compile Include="ItemObject.cs" />
<Compile Include="Meta.cs" />
<Compile Include="PacketBuilder.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />

View file

@ -10,12 +10,19 @@ namespace Horse_Isle_Server
{
class Map
{
public struct TerrainTile
{
public bool Passable;
public string Type;
}
public static int[] OverlayTileDepth;
public static bool[] TerrainTilePassibility;
public static bool[][] OverlayTilesetPassibility;
public static TerrainTile[] TerrainTiles;
public static bool[] OverlayTilesetPassibility;
public static Bitmap MapData;
public static int NewUserStartX;
public static int NewUserStartY;
@ -35,7 +42,7 @@ namespace Horse_Isle_Server
int tileId = GetTileId(x, y, false);
int otileId = GetTileId(x, y, true);
bool terrainPassable = TerrainTilePassibility[tileId - 1];
bool terrainPassable = TerrainTiles[tileId - 1].Passable;
int tileset = 0;
if (otileId > 190)
@ -44,8 +51,10 @@ namespace Horse_Isle_Server
if (World.InIsle(x, y))
tileset = World.GetIsle(x, y).Tileset+1;
}
otileId = (otileId - 1) * (tileset+1);
bool overlayPassable = OverlayTilesetPassibility[tileset][otileId - 1];
bool overlayPassable = OverlayTilesetPassibility[otileId];
bool tilePassable = false;
if (terrainPassable || overlayPassable)
@ -54,7 +63,7 @@ namespace Horse_Isle_Server
tilePassable = false;
Logger.DebugPrint("Checking tile passibility for tileid: " + tileId + " and overlay tileid " + otileId + " on tileset " + tileset + " at " + x + "," + y);
Logger.DebugPrint("Checking tile passibility for tileid: " + tileId + " and overlay tileid " + otileId + " at " + x + "," + y);
return tilePassable;
}

View file

@ -187,88 +187,6 @@ namespace Horse_Isle_Server
{
return IdleKickMessageFormat.Replace("%KICK%", Server.IdleTimeout.ToString());
}
// Meta
private static string buildLocationString(int x, int y)
{
string locationString = "";
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 != "")
locationString = LocationFormat.Replace("%META%", locationString);
return locationString;
}
private static string buildNearbyString(int x, int y)
{
string playersNearby = "";
User[] nearbyUsers = Server.GetNearbyUsers(x, y, true, true);
if(nearbyUsers.Length > 1)
{
playersNearby += NearbyPlayers;
playersNearby += Seperator;
string usersWest = "";
string usersNorth = "";
string usersEast = "";
string usersSouth = "";
foreach (User nearbyUser in nearbyUsers)
{
if (nearbyUser.X < x)
{
usersWest += " " + nearbyUser.Username + " ";
}
else if(nearbyUser.X > x)
{
usersEast += " " + nearbyUser.Username + " ";
}
else if (nearbyUser.Y > y)
{
usersSouth += " " + nearbyUser.Username + " ";
}
else if (nearbyUser.Y < y)
{
usersNorth += " " + nearbyUser.Username + " ";
}
}
if(usersEast != "")
playersNearby += " " + East + usersEast + Seperator;
if (usersWest != "")
playersNearby += " " + West + usersWest + Seperator;
if (usersSouth != "")
playersNearby += " " + South + usersSouth + Seperator;
if (usersNorth != "")
playersNearby += " " + North + usersNorth + Seperator;
}
return playersNearby;
}
public static string BuildMetaInfo(int x, int y)
{
// You are in
string message = buildLocationString(x, y);
// Nearby
message += Seperator + buildNearbyString(x, y);
// Dropped Items
int[] itemIds = World.GetDroppedItems(x, y);
if (itemIds.Length == 0)
message += NothingMessage;
return message;
}
}
}

View file

@ -17,6 +17,7 @@ namespace Horse_Isle_Server
public const byte PACKET_USERINFO = 0x81;
public const byte PACKET_WORLD = 0x7A;
public const byte PACKET_BASE_STATS = 0x7B;
public const byte PACKET_SWF_MODULE = 0x2A;
public const byte PACKET_PLACE_INFO = 0x1E;
public const byte PACKET_AREA_DEFS = 0x79;
public const byte PACKET_ANNOUNCEMENT = 0x7E;
@ -44,6 +45,7 @@ namespace Horse_Isle_Server
public const byte MOVE_DOWN = 0x15;
public const byte MOVE_RIGHT = 0x16;
public const byte MOVE_LEFT = 0x17;
public const byte MOVE_ESCAPE = 0x18;
public const byte MOVE_EXIT = 0x10;
public const byte CHAT_BOTTOM_LEFT = 0x14;
@ -558,6 +560,20 @@ namespace Horse_Isle_Server
return Packet;
}
public static byte[] CreateSwfModulePacket(string swf)
{
MemoryStream ms = new MemoryStream();
ms.WriteByte(PACKET_SWF_MODULE);
byte[] strBytes = Encoding.UTF8.GetBytes(swf);
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[] CreateAnnouncement(string announcement)
{
MemoryStream ms = new MemoryStream();
@ -588,11 +604,6 @@ namespace Horse_Isle_Server
return Packet;
}
public static byte[] CreateAreaMessage(int x, int y)
{
string locationStr = Messages.BuildMetaInfo(x, y);
return CreatePlaceInfo(locationStr);
}
public static byte[] CreateMotd()
{
string formattedMotd = Messages.FormatMOTD();

View file

@ -68,8 +68,7 @@ namespace Horse_Isle_Server
byte[] BaseStatsPacketData = PacketBuilder.CreatePlayerData(user.Money, Server.GetNumberOfPlayers(), user.MailBox.MailCount);
sender.SendPacket(BaseStatsPacketData);
byte[] AreaMessage = PacketBuilder.CreateAreaMessage(user.X, user.Y);
sender.SendPacket(AreaMessage);
UpdateArea(sender);
foreach (Client client in ConnectedClients)
{
@ -223,7 +222,7 @@ namespace Horse_Isle_Server
sender.SendPacket(moveLeftResponse);
}
}
else if (movementDirection == PacketBuilder.MOVE_DOWN)
else if (movementDirection == PacketBuilder.MOVE_DOWN || movementDirection == PacketBuilder.MOVE_ESCAPE)
{
loggedInUser.Facing = PacketBuilder.DIRECTION_DOWN;
if (Map.CheckPassable(loggedInUser.X, loggedInUser.Y + 1))
@ -241,11 +240,7 @@ namespace Horse_Isle_Server
}
UpdateUserInfo(sender.LoggedinUser);
UpdateArea(sender);
foreach (User nearbyUser in Server.GetNearbyUsers(sender.LoggedinUser.X, sender.LoggedinUser.Y, false, false))
if(nearbyUser.Id != sender.LoggedinUser.Id)
UpdateArea(nearbyUser.LoggedinClient);
Update(sender);
}
public static void OnChatPacket(Client sender, byte[] packet)
@ -414,8 +409,26 @@ namespace Horse_Isle_Server
return;
}
byte[] areaData = PacketBuilder.CreateAreaMessage(forClient.LoggedinUser.X, forClient.LoggedinUser.Y);
forClient.SendPacket(areaData);
string LocationStr = "";
if (!World.InSpecialTile(forClient.LoggedinUser.X, forClient.LoggedinUser.Y))
{
LocationStr = Meta.BuildMetaInfo(forClient.LoggedinUser.X, forClient.LoggedinUser.Y);
}
else
{
World.SpecialTile specialTile = World.GetSpecialTile(forClient.LoggedinUser.X, forClient.LoggedinUser.Y);
if(specialTile.AutoplaySwf != null && specialTile.AutoplaySwf != "")
{
byte[] swfModulePacket = PacketBuilder.CreateSwfModulePacket(specialTile.AutoplaySwf);
forClient.SendPacket(swfModulePacket);
}
if(specialTile.Code != null)
if (!ProcessMapCode(forClient, specialTile.Code))
return;
LocationStr = Meta.BuildSpecialTileInfo(specialTile);
}
byte[] AreaMessage = PacketBuilder.CreatePlaceInfo(LocationStr);
forClient.SendPacket(AreaMessage);
}
@ -545,6 +558,60 @@ namespace Horse_Isle_Server
return count;
}
public static void Teleport(Client client, int newX, int newY)
{
if (!client.LoggedIn)
return;
Logger.DebugPrint("Teleporting: " + client.LoggedinUser.Username + " to: " + newX.ToString() + "," + newY.ToString());
client.LoggedinUser.X = newX;
client.LoggedinUser.Y = newY;
byte[] MovementPacket = PacketBuilder.CreateMovementPacket(client.LoggedinUser.X, client.LoggedinUser.Y, client.LoggedinUser.CharacterId, client.LoggedinUser.Facing, PacketBuilder.DIRECTION_TELEPORT, true);
client.SendPacket(MovementPacket);
Update(client);
}
public static void Update(Client client)
{
UpdateUserInfo(client.LoggedinUser);
UpdateArea(client);
foreach (User nearbyUser in Server.GetNearbyUsers(client.LoggedinUser.X, client.LoggedinUser.Y, false, false))
if (nearbyUser.Id != client.LoggedinUser.Id)
UpdateArea(nearbyUser.LoggedinClient);
}
public static bool ProcessMapCode(Client forClient, string mapCode)
{
if(mapCode.Contains('-'))
{
string[] codeInfo = mapCode.Split('-');
string command = codeInfo[0];
string paramaters = codeInfo[1];
if(command == "JUMP")
{
if(paramaters.Contains(','))
{
string[] args = paramaters.Split(',');
try
{
int newX = int.Parse(args[0]);
int newY = int.Parse(args[1]);
Teleport(forClient, newX, newY);
return false;
}
catch(Exception)
{
return true;
}
}
}
}
return true;
}
public static int GetNumberOfAdminsOnline()
{
int count = 0;

View file

@ -43,12 +43,27 @@ namespace Horse_Isle_Server
public int Years;
}
public struct SpecialTile
{
public int X;
public int Y;
public string Title;
public string Description;
public string Code;
public int ExitX;
public int ExitY;
public string AutoplaySwf;
public string TypeFlag;
}
public static Time ServerTime = new Time();
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 List<SpecialTile> SpecialTiles = new List<SpecialTile>();
public static void TickWorldClock()
{
ServerTime.Minutes += 1;
@ -107,6 +122,18 @@ namespace Horse_Isle_Server
}
}
public static bool InSpecialTile(int x, int y)
{
try
{
GetSpecialTile(x, y);
return true;
}
catch (KeyNotFoundException)
{
return false;
}
}
public static bool InIsle(int x, int y)
{
@ -120,6 +147,17 @@ namespace Horse_Isle_Server
return false;
}
}
public static SpecialTile GetSpecialTile(int x, int y)
{
foreach(SpecialTile specialTile in SpecialTiles)
{
if(specialTile.X == x && specialTile.Y == y)
{
return specialTile;
}
}
throw new KeyNotFoundException("x,y not in a special tile!");
}
public static Isle GetIsle(int x, int y)
{
foreach(Isle isle in Isles)