All multirooms implemented!

This commit is contained in:
SilicaAndPina 2021-03-10 15:10:29 +13:00
parent 2b59ba1be9
commit e9dc4157b0
6 changed files with 151 additions and 47 deletions

View file

@ -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

View 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);
}
}
}

View file

@ -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
{ {

View file

@ -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();
} }

View file

@ -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)

View file

@ -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;