/// <summary> /// Points an exit to another room. /// </summary> /// <param name="exit">The direction to set</param> /// <param name="room">The ID of the room</param> public void SetExit(Constants.EXIT exit, uint?room) { switch (exit) { case Constants.EXIT.NORTH: Exits.North = room; return; case Constants.EXIT.EAST: Exits.East = room; return; case Constants.EXIT.SOUTH: Exits.South = room; return; case Constants.EXIT.WEST: Exits.West = room; return; case Constants.EXIT.UP: Exits.Up = room; return; case Constants.EXIT.DOWN: Exits.Down = room; return; } // Update persistence since data structure has changed if (CacheType == CacheType.Prototype) { DataPersistence.SaveObject(this); } }
/// <summary> /// Retrieves the opposite exit direction /// </summary> /// <param name="sourceExit">The direction to reverse</param> /// <returns>The opposite direction</returns> public static Constants.EXIT GetOpposingExit(Constants.EXIT sourceExit) { switch (sourceExit) { case Constants.EXIT.NORTH: return(Constants.EXIT.SOUTH); case Constants.EXIT.EAST: return(Constants.EXIT.WEST); case Constants.EXIT.SOUTH: return(Constants.EXIT.NORTH); case Constants.EXIT.WEST: return(Constants.EXIT.EAST); case Constants.EXIT.UP: return(Constants.EXIT.DOWN); case Constants.EXIT.DOWN: return(Constants.EXIT.UP); } return((Constants.EXIT)(-1)); }
/// <summary> /// Connects exits of rooms /// </summary> /// <param name="sourceRoom">The first room to link</param> /// <param name="destRoom">The second room to link</param> /// <param name="sourceExit">The direction of the first room to link to the second room</param> /// <param name="hoistToInstance">If the rooms are in the Prototype cache, setting this will lift changes to Instance.</param> /// <remarks>Either room may be null, and the appropriate exit will be set to null. The /// destRoom uses the opposite exit of sourceExit. Rooms must be of the same cache type.</remarks> public static void ConnectRoomExits(Room sourceRoom, Room destRoom, Constants.EXIT sourceExit, bool hoistToInstance, bool twoWay) { if (sourceRoom == null && destRoom == null) { return; } if (sourceRoom != null && destRoom != null) { if (sourceRoom?.CacheType != destRoom?.CacheType) { return; } } CacheType cacheType = sourceRoom == null ? destRoom.CacheType : sourceRoom.CacheType; var exitsToFix = new List <uint?>(); if (sourceRoom != null && destRoom == null) { sourceRoom.SetExit(sourceExit, null); } else if (sourceRoom == null && destRoom != null) { destRoom.SetExit(GetOpposingExit(sourceExit), null); } else { sourceRoom.SetExit(sourceExit, cacheType == CacheType.Instance ? destRoom.Instance : destRoom.Prototype); destRoom.SetExit(GetOpposingExit(sourceExit), cacheType == CacheType.Instance ? sourceRoom.Instance : sourceRoom.Prototype); } if (cacheType == CacheType.Prototype && hoistToInstance) { var instanceListToFix = new List <uint>(); var instanceRooms = new List <Room>(); instanceRooms.AddRange(DataAccess.GetInstancesOfPrototype <Room>(sourceRoom?.Prototype)); instanceRooms.AddRange(DataAccess.GetInstancesOfPrototype <Room>(destRoom?.Prototype)); foreach (var room in instanceRooms) { instanceListToFix.Add((uint)room.Instance); } LinkInstancedRoomExits(instanceListToFix); } // Update data persistence since the structure has changed if (cacheType == CacheType.Prototype) { if (sourceRoom != null) { DataPersistence.SaveObject(sourceRoom); } if (destRoom != null) { DataPersistence.SaveObject(destRoom); } } }
public CommandResult Execute(CommandEventArgs commandEventArgs, Constants.EXIT direction) { try { base.Execute(commandEventArgs); } catch (CommandException ex) { return(ex.CommandResult); } var output = new OutputBuilder(); var entity = commandEventArgs.Entity; Room sourceRoom = entity.GetInstanceParentRoom(); // Don't move entity if it's not already in a room if (sourceRoom != null && entity != null) { RoomExits exits = sourceRoom.Exits; Room destRoom; switch (direction) { case Constants.EXIT.NORTH: destRoom = DataAccess.Get <Room>(exits.North, CacheType.Instance); break; case Constants.EXIT.EAST: destRoom = DataAccess.Get <Room>(exits.East, CacheType.Instance); break; case Constants.EXIT.SOUTH: destRoom = DataAccess.Get <Room>(exits.South, CacheType.Instance); break; case Constants.EXIT.WEST: destRoom = DataAccess.Get <Room>(exits.West, CacheType.Instance); break; case Constants.EXIT.UP: destRoom = DataAccess.Get <Room>(exits.Up, CacheType.Instance); break; case Constants.EXIT.DOWN: destRoom = DataAccess.Get <Room>(exits.Down, CacheType.Instance); break; default: output.Append("You cannot go that way."); return(CommandResult.Failure(output.Output)); } if (destRoom != null) { sourceRoom.Animates.RemoveEntity(entity.Instance, entity); destRoom.Animates.AddEntity(entity.Instance, entity, false); output.Append( new Look() .Execute(new CommandEventArgs("", commandEventArgs.Entity, commandEventArgs.PrivilegeOverride)) .ResultMessage); return(CommandResult.Success(output.Output)); } else { // Create the room if Autodig is set if (entity.GetType() == typeof(Player)) { var player = (Player)entity; if (player.Configuration.Autodig) { sourceRoom = DataAccess.Get <Room>(sourceRoom.Prototype, CacheType.Prototype); if (sourceRoom == null) { return(CommandResult.Failure("You must be in a room with a saved prototype before you may dig.")); } var sourceArea = entity.GetInstanceParentArea(); if (sourceArea == null) { return(CommandResult.Failure("You must be in an area before you may dig.")); } var protoArea = DataAccess.Get <Area>(sourceArea.Prototype, CacheType.Prototype); if (protoArea == null) { return(CommandResult.Failure("You must be in an area with a saved prototype before you may dig.")); } destRoom = Room.NewPrototype((uint)protoArea.Prototype); destRoom.Spawn(false, (uint)sourceArea.Instance); RoomExits.ConnectRoomExits(sourceRoom, destRoom, direction, true, true); // Now move the entity to the new room output.Append($"You dig {direction.ToString().ToLower()}."); output.Append(new MoveEntity().Execute(commandEventArgs).ResultMessage); return(CommandResult.Success(output.Output)); } } output.Append("You cannot go that way."); return(CommandResult.Failure(output.Output)); } } // Return failure if entity was not already in a room or there was no entity to move output.Append("You cannot go that way."); return(CommandResult.Failure(output.Output)); }