Ejemplo n.º 1
0
        /// <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);
            }
        }
Ejemplo n.º 2
0
        /// <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));
        }
Ejemplo n.º 3
0
        /// <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);
                }
            }
        }
Ejemplo n.º 4
0
        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));
        }