mirror of
https://github.com/islehorse/HISP.git
synced 2025-04-10 07:05:41 +12:00
All multirooms implemented!
This commit is contained in:
parent
2b59ba1be9
commit
e9dc4157b0
6 changed files with 151 additions and 47 deletions
|
@ -307,27 +307,20 @@ namespace HISP.Game
|
||||||
{
|
{
|
||||||
|
|
||||||
string message = Messages.MultiroomPlayersParticipating;
|
string message = Messages.MultiroomPlayersParticipating;
|
||||||
if(id != null) // Special type
|
|
||||||
|
Multiroom room = Multiroom.GetMultiroom(user.X, user.Y);
|
||||||
|
room.Join(user);
|
||||||
|
|
||||||
|
foreach (User userOnTile in room.JoinedUsers)
|
||||||
{
|
{
|
||||||
foreach (User userOnTile in GameServer.GetUsersOnSpecialTileCode("MULTIROOM-" + id))
|
if (userOnTile.Id == user.Id)
|
||||||
{
|
continue;
|
||||||
if (userOnTile.Id == user.Id)
|
|
||||||
continue;
|
message += Messages.FormatMultiroomParticipent(userOnTile.Username);
|
||||||
message += Messages.FormatMultiroomParticipent(userOnTile.Username);
|
|
||||||
}
|
|
||||||
message += Messages.R1;
|
|
||||||
}
|
|
||||||
else if(id == null) // Generic
|
|
||||||
{
|
|
||||||
foreach (User userOnTile in GameServer.GetUsersAt(user.X, user.Y, true, true))
|
|
||||||
{
|
|
||||||
if (userOnTile.Id == user.Id)
|
|
||||||
continue;
|
|
||||||
message += Messages.FormatMultiroomParticipent(userOnTile.Username);
|
|
||||||
}
|
|
||||||
message += Messages.R1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message += Messages.R1;
|
||||||
|
|
||||||
if(id == null) // Generic
|
if(id == null) // Generic
|
||||||
{
|
{
|
||||||
// Do nothing
|
// Do nothing
|
||||||
|
|
91
Horse Isle Server/HorseIsleServer/Game/Multiroom.cs
Normal file
91
Horse Isle Server/HorseIsleServer/Game/Multiroom.cs
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
using HISP.Player;
|
||||||
|
using HISP.Server;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace HISP.Game
|
||||||
|
{
|
||||||
|
public class Multiroom
|
||||||
|
{
|
||||||
|
public static List<Multiroom> Multirooms = new List<Multiroom>();
|
||||||
|
public static Multiroom GetMultiroom(int x, int y)
|
||||||
|
{
|
||||||
|
foreach (Multiroom multiroom in Multirooms)
|
||||||
|
if(multiroom.x == x && multiroom.y == y)
|
||||||
|
return multiroom;
|
||||||
|
|
||||||
|
throw new KeyNotFoundException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool IsMultiRoomAt(int x, int y)
|
||||||
|
{
|
||||||
|
foreach (Multiroom multiroom in Multirooms)
|
||||||
|
if (multiroom.x == x && multiroom.y == y)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void LeaveAllMultirooms(User user)
|
||||||
|
{
|
||||||
|
foreach (Multiroom room in Multirooms)
|
||||||
|
room.Leave(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void CreateMultirooms()
|
||||||
|
{
|
||||||
|
Logger.InfoPrint("Creating Multirooms...");
|
||||||
|
foreach(World.SpecialTile tile in World.SpecialTiles)
|
||||||
|
{
|
||||||
|
if (tile.Code != null)
|
||||||
|
{
|
||||||
|
if (tile.Code.StartsWith("MULTIROOM"))
|
||||||
|
{
|
||||||
|
Logger.DebugPrint("Created Multiroom @ " + tile.X.ToString() + "," + tile.Y.ToString());
|
||||||
|
new Multiroom(tile.X, tile.Y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Multiroom(int x, int y)
|
||||||
|
{
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
|
||||||
|
Multirooms.Add(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int x;
|
||||||
|
public int y;
|
||||||
|
|
||||||
|
public List<User> JoinedUsers = new List<User>();
|
||||||
|
|
||||||
|
public void Join(User user)
|
||||||
|
{
|
||||||
|
if (!JoinedUsers.Contains(user))
|
||||||
|
{
|
||||||
|
Logger.DebugPrint(user.Username + " Joined multiroom @ " + x.ToString() + "," + y.ToString());
|
||||||
|
JoinedUsers.Add(user);
|
||||||
|
|
||||||
|
foreach (User joinedUser in JoinedUsers)
|
||||||
|
if (joinedUser.Id != user.Id)
|
||||||
|
GameServer.UpdateArea(joinedUser.LoggedinClient);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Leave(User user)
|
||||||
|
{
|
||||||
|
|
||||||
|
if(JoinedUsers.Contains(user))
|
||||||
|
{
|
||||||
|
Logger.DebugPrint(user.Username + " Left multiroom @ " + x.ToString() + "," + y.ToString());
|
||||||
|
JoinedUsers.Remove(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (User joinedUser in JoinedUsers)
|
||||||
|
GameServer.UpdateArea(joinedUser.LoggedinClient);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,9 +1,5 @@
|
||||||
using HISP.Server;
|
using HISP.Server;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace HISP.Game.SwfModules
|
namespace HISP.Game.SwfModules
|
||||||
{
|
{
|
||||||
|
|
|
@ -24,11 +24,16 @@ namespace HISP
|
||||||
|
|
||||||
DroppedItems.Init();
|
DroppedItems.Init();
|
||||||
WildHorse.Init();
|
WildHorse.Init();
|
||||||
Brickpoet.LoadPoetryRooms();
|
|
||||||
Auction.LoadAllAuctionRooms();
|
|
||||||
Drawingroom.LoadAllDrawingRooms();
|
Drawingroom.LoadAllDrawingRooms();
|
||||||
|
Brickpoet.LoadPoetryRooms();
|
||||||
|
Multiroom.CreateMultirooms();
|
||||||
|
|
||||||
|
Auction.LoadAllAuctionRooms();
|
||||||
|
|
||||||
Item.DoSpecialCases();
|
Item.DoSpecialCases();
|
||||||
|
|
||||||
|
|
||||||
GameServer.StartServer();
|
GameServer.StartServer();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -3329,7 +3329,6 @@ namespace HISP.Server
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y, true, sender.LoggedinUser);
|
|
||||||
|
|
||||||
if(room.Drawing != "")
|
if(room.Drawing != "")
|
||||||
{
|
{
|
||||||
|
@ -3455,7 +3454,7 @@ namespace HISP.Server
|
||||||
}
|
}
|
||||||
|
|
||||||
room.Drawing += drawingToAdd;
|
room.Drawing += drawingToAdd;
|
||||||
UpdateDrawingForAll(sender, drawingToAdd, true);
|
UpdateDrawingForAll("D" + room.Id, sender, drawingToAdd, true);
|
||||||
|
|
||||||
byte[] loadedDrawingMessage = PacketBuilder.CreateChat(Messages.FormatDrawingRoomLoaded(slotNo), PacketBuilder.CHAT_BOTTOM_RIGHT);
|
byte[] loadedDrawingMessage = PacketBuilder.CreateChat(Messages.FormatDrawingRoomLoaded(slotNo), PacketBuilder.CHAT_BOTTOM_RIGHT);
|
||||||
sender.SendPacket(loadedDrawingMessage);
|
sender.SendPacket(loadedDrawingMessage);
|
||||||
|
@ -3510,7 +3509,7 @@ namespace HISP.Server
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateDrawingForAll(sender, drawing, false);
|
UpdateDrawingForAll("D" + room.Id, sender, drawing, false);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3544,7 +3543,6 @@ namespace HISP.Server
|
||||||
byte[] poetPacket = PacketBuilder.CreateBrickPoetListPacket(room);
|
byte[] poetPacket = PacketBuilder.CreateBrickPoetListPacket(room);
|
||||||
sender.SendPacket(poetPacket);
|
sender.SendPacket(poetPacket);
|
||||||
|
|
||||||
UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y, true, sender.LoggedinUser);
|
|
||||||
}
|
}
|
||||||
else if(packet[3] == PacketBuilder.BRICKPOET_MOVE)
|
else if(packet[3] == PacketBuilder.BRICKPOET_MOVE)
|
||||||
{
|
{
|
||||||
|
@ -3635,7 +3633,6 @@ namespace HISP.Server
|
||||||
sender.SendPacket(allDressupsResponse);
|
sender.SendPacket(allDressupsResponse);
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y, true, sender.LoggedinUser);
|
|
||||||
}
|
}
|
||||||
else // Move
|
else // Move
|
||||||
{
|
{
|
||||||
|
@ -3705,18 +3702,26 @@ namespace HISP.Server
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case PacketBuilder.SWFMODULE_BANDHALL: // Basic
|
||||||
|
byte[] response = PacketBuilder.CreateForwardedSwfRequest(packet);
|
||||||
|
foreach (User user in GetUsersAt(sender.LoggedinUser.X, sender.LoggedinUser.Y))
|
||||||
|
{
|
||||||
|
if (user.Id == sender.LoggedinUser.Id)
|
||||||
|
continue;
|
||||||
|
user.LoggedinClient.SendPacket(response);
|
||||||
|
}
|
||||||
|
break;
|
||||||
case PacketBuilder.SWFMODULE_ARENA:
|
case PacketBuilder.SWFMODULE_ARENA:
|
||||||
if (Arena.UserHasEnteredHorseInAnyArena(sender.LoggedinUser))
|
if (Arena.UserHasEnteredHorseInAnyArena(sender.LoggedinUser))
|
||||||
{
|
{
|
||||||
Arena arena = Arena.GetArenaUserEnteredIn(sender.LoggedinUser);
|
Arena arena = Arena.GetArenaUserEnteredIn(sender.LoggedinUser);
|
||||||
byte[] response = PacketBuilder.CreateForwardedSwfRequest(packet);
|
response = PacketBuilder.CreateForwardedSwfRequest(packet);
|
||||||
foreach (Arena.ArenaEntry entry in arena.Entries.ToArray())
|
foreach (Arena.ArenaEntry entry in arena.Entries.ToArray())
|
||||||
{
|
{
|
||||||
if (entry.EnteredUser.Id == sender.LoggedinUser.Id)
|
if (entry.EnteredUser.Id == sender.LoggedinUser.Id)
|
||||||
continue;
|
continue;
|
||||||
if(entry.EnteredUser.LoggedinClient.LoggedIn)
|
if(entry.EnteredUser.LoggedinClient.LoggedIn)
|
||||||
entry.EnteredUser.LoggedinClient.SendPacket(response);
|
entry.EnteredUser.LoggedinClient.SendPacket(response);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -4274,6 +4279,24 @@ namespace HISP.Server
|
||||||
|
|
||||||
User loggedInUser = sender.LoggedinUser;
|
User loggedInUser = sender.LoggedinUser;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Player stuff
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Leave Multirooms
|
||||||
|
Multiroom.LeaveAllMultirooms(loggedInUser);
|
||||||
|
|
||||||
|
// Cancel Trades
|
||||||
|
if (loggedInUser.TradingWith != null)
|
||||||
|
loggedInUser.TradingWith.CancelTradeMoved();
|
||||||
|
loggedInUser.PendingBuddyRequestTo = null;
|
||||||
|
|
||||||
|
// Close Social Windows
|
||||||
|
foreach (User sUser in loggedInUser.BeingSocializedBy.ToArray())
|
||||||
|
UpdateArea(sUser.LoggedinClient);
|
||||||
|
loggedInUser.BeingSocializedBy.Clear();
|
||||||
|
|
||||||
|
|
||||||
// Pac-man the world.
|
// Pac-man the world.
|
||||||
if (loggedInUser.X > Map.Width)
|
if (loggedInUser.X > Map.Width)
|
||||||
loggedInUser.Teleport(2, loggedInUser.Y);
|
loggedInUser.Teleport(2, loggedInUser.Y);
|
||||||
|
@ -4306,6 +4329,8 @@ namespace HISP.Server
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Randomly move if thirst, hunger, tiredness too low-
|
||||||
|
|
||||||
byte movementDirection = packet[1];
|
byte movementDirection = packet[1];
|
||||||
|
|
||||||
if (loggedInUser.Thirst <= 0 || loggedInUser.Hunger <= 0 || loggedInUser.Tiredness <= 0)
|
if (loggedInUser.Thirst <= 0 || loggedInUser.Hunger <= 0 || loggedInUser.Tiredness <= 0)
|
||||||
|
@ -4355,7 +4380,7 @@ namespace HISP.Server
|
||||||
int newY = loggedInUser.Y;
|
int newY = loggedInUser.Y;
|
||||||
bool moveTwo = false;
|
bool moveTwo = false;
|
||||||
|
|
||||||
if (movementDirection == PacketBuilder.MOVE_ESCAPE)
|
if (movementDirection == PacketBuilder.MOVE_ESCAPE) // Exit this place / X Button
|
||||||
{
|
{
|
||||||
|
|
||||||
byte Direction;
|
byte Direction;
|
||||||
|
@ -4397,7 +4422,6 @@ namespace HISP.Server
|
||||||
Direction = PacketBuilder.DIRECTION_DOWN;
|
Direction = PacketBuilder.DIRECTION_DOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
loggedInUser.Facing = Direction + (onHorse * 5);
|
loggedInUser.Facing = Direction + (onHorse * 5);
|
||||||
Logger.DebugPrint("Exiting player: " + loggedInUser.Username + " to: " + loggedInUser.X + "," + loggedInUser.Y);
|
Logger.DebugPrint("Exiting player: " + loggedInUser.Username + " to: " + loggedInUser.X + "," + loggedInUser.Y);
|
||||||
byte[] moveResponse = PacketBuilder.CreateMovementPacket(loggedInUser.X, loggedInUser.Y, loggedInUser.CharacterId, loggedInUser.Facing, Direction, true);
|
byte[] moveResponse = PacketBuilder.CreateMovementPacket(loggedInUser.X, loggedInUser.Y, loggedInUser.CharacterId, loggedInUser.Facing, Direction, true);
|
||||||
|
@ -4473,11 +4497,11 @@ namespace HISP.Server
|
||||||
{
|
{
|
||||||
if (moveTwo)
|
if (moveTwo)
|
||||||
direction += 20;
|
direction += 20;
|
||||||
|
|
||||||
loggedInUser.Y = newY;
|
loggedInUser.Y = newY;
|
||||||
loggedInUser.X = newX;
|
loggedInUser.X = newX;
|
||||||
|
|
||||||
|
// Check Treasures
|
||||||
// check Treasures
|
|
||||||
if (Treasure.IsTileTreasure(loggedInUser.X, loggedInUser.Y))
|
if (Treasure.IsTileTreasure(loggedInUser.X, loggedInUser.Y))
|
||||||
{
|
{
|
||||||
Treasure treasure = Treasure.GetTreasureAt(loggedInUser.X, loggedInUser.Y);
|
Treasure treasure = Treasure.GetTreasureAt(loggedInUser.X, loggedInUser.Y);
|
||||||
|
@ -4489,16 +4513,6 @@ namespace HISP.Server
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cancel Trades
|
|
||||||
if (loggedInUser.TradingWith != null)
|
|
||||||
loggedInUser.TradingWith.CancelTradeMoved();
|
|
||||||
loggedInUser.PendingBuddyRequestTo = null;
|
|
||||||
|
|
||||||
// Close Social Windows
|
|
||||||
foreach (User sUser in loggedInUser.BeingSocializedBy.ToArray())
|
|
||||||
UpdateArea(sUser.LoggedinClient);
|
|
||||||
loggedInUser.BeingSocializedBy.Clear();
|
|
||||||
|
|
||||||
byte[] moveResponse = PacketBuilder.CreateMovementPacket(loggedInUser.X, loggedInUser.Y, loggedInUser.CharacterId, loggedInUser.Facing, direction, true);
|
byte[] moveResponse = PacketBuilder.CreateMovementPacket(loggedInUser.X, loggedInUser.Y, loggedInUser.CharacterId, loggedInUser.Facing, direction, true);
|
||||||
sender.SendPacket(moveResponse);
|
sender.SendPacket(moveResponse);
|
||||||
}
|
}
|
||||||
|
@ -6434,6 +6448,9 @@ namespace HISP.Server
|
||||||
|
|
||||||
Database.RemoveOnlineUser(sender.LoggedinUser.Id);
|
Database.RemoveOnlineUser(sender.LoggedinUser.Id);
|
||||||
|
|
||||||
|
// Leave multirooms
|
||||||
|
Multiroom.LeaveAllMultirooms(sender.LoggedinUser);
|
||||||
|
|
||||||
// Remove Trade Reference
|
// Remove Trade Reference
|
||||||
sender.LoggedinUser.TradingWith = null;
|
sender.LoggedinUser.TradingWith = null;
|
||||||
sender.LoggedinUser.PendingTradeTo = 0;
|
sender.LoggedinUser.PendingTradeTo = 0;
|
||||||
|
@ -6445,6 +6462,7 @@ namespace HISP.Server
|
||||||
arena.DeleteEntry(sender.LoggedinUser);
|
arena.DeleteEntry(sender.LoggedinUser);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Send disconnect message
|
// Send disconnect message
|
||||||
byte[] logoutMessageBytes = PacketBuilder.CreateChat(Messages.FormatLogoutMessage(sender.LoggedinUser.Username), PacketBuilder.CHAT_BOTTOM_LEFT);
|
byte[] logoutMessageBytes = PacketBuilder.CreateChat(Messages.FormatLogoutMessage(sender.LoggedinUser.Username), PacketBuilder.CHAT_BOTTOM_LEFT);
|
||||||
foreach (GameClient client in ConnectedClients)
|
foreach (GameClient client in ConnectedClients)
|
||||||
|
@ -6709,11 +6727,11 @@ namespace HISP.Server
|
||||||
UpdateUserInfo(client.LoggedinUser);
|
UpdateUserInfo(client.LoggedinUser);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void UpdateDrawingForAll(GameClient sender, string drawing, bool includingSender=false)
|
public static void UpdateDrawingForAll(string id, GameClient sender, string drawing, bool includingSender=false)
|
||||||
{
|
{
|
||||||
|
|
||||||
UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y);
|
UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y);
|
||||||
User[] usersHere = GetUsersAt(sender.LoggedinUser.X, sender.LoggedinUser.Y, true, true);
|
User[] usersHere = GetUsersOnSpecialTileCode("MULTIROOM-D" + id);
|
||||||
foreach (User user in usersHere)
|
foreach (User user in usersHere)
|
||||||
{
|
{
|
||||||
if(!includingSender)
|
if(!includingSender)
|
||||||
|
|
|
@ -116,6 +116,7 @@ namespace HISP.Server
|
||||||
public const byte SWFMODULE_BRICKPOET = 0x5A;
|
public const byte SWFMODULE_BRICKPOET = 0x5A;
|
||||||
public const byte SWFMODULE_DRAWINGROOM = 0x5B;
|
public const byte SWFMODULE_DRAWINGROOM = 0x5B;
|
||||||
public const byte SWFMODULE_DRESSUPROOM = 0x5C;
|
public const byte SWFMODULE_DRESSUPROOM = 0x5C;
|
||||||
|
public const byte SWFMODULE_BANDHALL = 0x51;
|
||||||
|
|
||||||
public const byte DRAWINGROOM_GET_DRAWING = 0x14;
|
public const byte DRAWINGROOM_GET_DRAWING = 0x14;
|
||||||
public const byte DRAWINGROOM_SAVE = 0x15;
|
public const byte DRAWINGROOM_SAVE = 0x15;
|
||||||
|
|
Loading…
Add table
Reference in a new issue