예제 #1
0
        private static void MoveFloorItem(Session Session, ClientMessage Message)
        {
            RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId);

            if (Instance == null || !Instance.CheckUserRights(Session))
            {
                return;
            }

            Item Item = Instance.GetItem(Message.PopWiredUInt32());

            if (Item == null || Item.Definition.Type != ItemType.FloorItem)
            {
                return;
            }

            Vector2 NewPosition = new Vector2(Message.PopWiredInt32(), Message.PopWiredInt32());
            int     NewRotation = Message.PopWiredInt32();

            bool IsRotationOnly = (Item.RoomId == Instance.RoomId && Item.RoomPosition.X == NewPosition.X &&
                                   Item.RoomPosition.Y == NewPosition.Y && NewRotation != Item.RoomRotation);

            Vector3 FinalizedPosition = Instance.SetFloorItem(Session, Item, NewPosition, NewRotation);

            if (FinalizedPosition != null)
            {
                Item.MoveToRoom(null, Instance.RoomId, FinalizedPosition, NewRotation, string.Empty);
                RoomManager.MarkWriteback(Item, false);

                Instance.RegenerateRelativeHeightmap();
                Instance.BroadcastMessage(RoomItemUpdatedComposer.Compose(Item));

                ItemEventDispatcher.InvokeItemEventHandler(Session, Item, Instance, ItemEventType.Moved,
                                                           IsRotationOnly ? 1 : 0);

                QuestManager.ProgressUserQuest(Session, IsRotationOnly ? QuestType.FURNI_ROTATE : QuestType.FURNI_MOVE);

                if (FinalizedPosition.Z > Instance.Model.Heightmap.FloorHeight[FinalizedPosition.X, FinalizedPosition.Y])
                {
                    QuestManager.ProgressUserQuest(Session, QuestType.FURNI_STACK);
                }
            }
        }
예제 #2
0
        public void ExecuteActions(Item Item, RoomActor Actor)
        {
            Random rnd = new Random();

            foreach (Item ActionItem in mInstance.GetItemsOnPosition(Item.RoomPosition.GetVector2()))
            {
                if (ActionItem.Definition.Behavior == ItemBehavior.WiredEffect)
                {
                    ActionItem.DisplayFlags = "1";
                    ActionItem.BroadcastStateUpdate(mInstance);
                    ActionItem.DisplayFlags = "2";
                    ActionItem.RequestUpdate(4);

                    switch (WiredTypesUtil.EffectFromInt(ActionItem.Definition.BehaviorData))
                    {
                        #region show_message
                    case WiredEffectTypes.show_message:
                        if (Actor == null)
                        {
                            continue;
                        }
                        Actor.Whisper(mWired [ActionItem.Id].Data1, 0, true);
                        break;

                        #endregion
                        #region move_rotate
                    case WiredEffectTypes.move_rotate:
                        if (ActionItem.WiredData.Data2 == 0 && ActionItem.WiredData.Data3 == 0)
                        {
                            continue;
                        }
                        String[] ItemsToMove = ActionItem.WiredData.Data1.Split('|');
                        foreach (String toMove in ItemsToMove)
                        {
                            uint ItemId;
                            uint.TryParse(toMove, out ItemId);
                            Item Move = mInstance.GetItem(ItemId);
                            if (Move == null)
                            {
                                continue;
                            }
                            Vector2 NewPosition = new Vector2(Move.RoomPosition.X, Move.RoomPosition.Y);

                            switch (ActionItem.WiredData.Data2)
                            {
                            case 1:
                                switch (rnd.Next(1, 5))
                                {
                                case 1:
                                    NewPosition = new Vector2(Move.RoomPosition.X - 1, Move.RoomPosition.Y);
                                    break;

                                case 2:
                                    NewPosition = new Vector2(Move.RoomPosition.X + 1, Move.RoomPosition.Y);
                                    break;


                                case 3:
                                    NewPosition = new Vector2(Move.RoomPosition.X, Move.RoomPosition.Y + 1);
                                    break;


                                case 4:
                                    NewPosition = new Vector2(Move.RoomPosition.X, Move.RoomPosition.Y - 1);
                                    break;
                                }
                                break;

                            case 2:
                                if (rnd.Next(0, 2) == 1)
                                {
                                    NewPosition = new Vector2(Move.RoomPosition.X - 1, Move.RoomPosition.Y);
                                }
                                else
                                {
                                    NewPosition = new Vector2(Move.RoomPosition.X + 1, Move.RoomPosition.Y);
                                }

                                break;

                            case 3:
                                if (rnd.Next(0, 2) == 1)
                                {
                                    NewPosition = new Vector2(Move.RoomPosition.X, Move.RoomPosition.Y - 1);
                                }
                                else
                                {
                                    NewPosition = new Vector2(Move.RoomPosition.X, Move.RoomPosition.Y + 1);
                                }

                                break;

                            case 4:
                                NewPosition = new Vector2(Move.RoomPosition.X, Move.RoomPosition.Y - 1);
                                break;

                            case 5:
                                NewPosition = new Vector2(Move.RoomPosition.X + 1, Move.RoomPosition.Y);
                                break;

                            case 6:
                                NewPosition = new Vector2(Move.RoomPosition.X, Move.RoomPosition.Y + 1);
                                break;

                            case 7:
                                NewPosition = new Vector2(Move.RoomPosition.X - 1, Move.RoomPosition.Y);
                                break;
                            }

                            int NewRotation = Move.RoomRotation;

                            switch (ActionItem.WiredData.Data3)
                            {
                            case 1:
                                NewRotation = NewRotation + 2;
                                if (NewRotation == 8)
                                {
                                    NewRotation = 0;
                                }
                                break;

                            case 2:
                                NewRotation = (NewRotation - 2);
                                if (NewRotation == -2)
                                {
                                    NewRotation = 6;
                                }
                                break;

                            case 3:
                                if (rnd.Next(0, 2) == 1)
                                {
                                    goto case 1;
                                }
                                else
                                {
                                    goto case 2;
                                }
                            }



                            bool    IsRotationOnly    = (ActionItem.WiredData.Data2 == 0);
                            Vector3 FinalizedPosition = mInstance.SetFloorItem(null, Move, NewPosition, NewRotation);

                            if (FinalizedPosition != null)
                            {
                                Move.MoveToRoom(null, mInstance.RoomId, FinalizedPosition, NewRotation, "");
                                RoomManager.MarkWriteback(Move, false);

                                mInstance.RegenerateRelativeHeightmap();
                                mInstance.BroadcastMessage(RoomItemUpdatedComposer.Compose(Move));

                                ItemEventDispatcher.InvokeItemEventHandler(null, Move, mInstance, ItemEventType.Moved, IsRotationOnly ? 1 : 0);
                            }
                        }
                        break;

                        #endregion
                        #region match_to_sshot
                    case WiredEffectTypes.match_to_sshot:
                        String[] Selected = ActionItem.WiredData.Data5.Split('+');
                        foreach (String FullData in Selected)
                        {
                            if (!FullData.Contains('#'))
                            {
                                continue;
                            }

                            String[] Data = FullData.Split('#');
                            if (Data.Length != 4)
                            {
                                continue;
                            }

                            uint     Id       = uint.Parse(Data [0]);
                            String[] Position = Data [1].Split('|');
                            int      Rotation = int.Parse(Data [2]);
                            String   Flags    = Data [3];

                            int  X = int.Parse(Position [0]);
                            int  Y = int.Parse(Position [1]);
                            uint Z = uint.Parse(Position [2]);

                            Item AffectedItem = mInstance.GetItem(Id);

                            if (AffectedItem == null)
                            {
                                continue;
                            }

                            Boolean IsRotationOnly = (X == AffectedItem.RoomPosition.X && Y == AffectedItem.RoomPosition.Y && Z == AffectedItem.RoomPosition.Z);

                            Vector2 NewPosition = new Vector2(X, Y);

                            if (ActionItem.WiredData.Data2 == 1)
                            {
                                AffectedItem.Flags        = Flags;
                                AffectedItem.DisplayFlags = Item.Flags;
                                AffectedItem.BroadcastStateUpdate(mInstance);
                            }

                            if (ActionItem.WiredData.Data3 == 0)
                            {
                                Rotation = AffectedItem.RoomRotation;
                            }

                            if (ActionItem.WiredData.Data4 == 0)
                            {
                                NewPosition = AffectedItem.RoomPosition.GetVector2();
                            }

                            if (ActionItem.WiredData.Data4 == 1 || ActionItem.WiredData.Data3 == 1)
                            {
                                Vector3 FinalizedPosition = mInstance.SetFloorItem(null, AffectedItem, NewPosition, Rotation);
                                AffectedItem.MoveToRoom(null, mInstance.RoomId, FinalizedPosition, Rotation, "");

                                RoomManager.MarkWriteback(AffectedItem, false);

                                mInstance.RegenerateRelativeHeightmap();
                                mInstance.BroadcastMessage(RoomItemUpdatedComposer.Compose(AffectedItem));

                                ItemEventDispatcher.InvokeItemEventHandler(null, AffectedItem, mInstance, ItemEventType.Moved, IsRotationOnly ? 1 : 0);
                            }
                            else if (ActionItem.WiredData.Data2 == 1)
                            {
                                RoomManager.MarkWriteback(AffectedItem, true);
                            }
                        }
                        break;

                        #endregion
                    case WiredEffectTypes.teleport_to:
                        if (Actor == null)
                        {
                            continue;
                        }

                        String[] Selected2 = ActionItem.WiredData.Data1.Split('|');
                        String   ItemIdS   = Actor.FurniOnId.ToString();

                        while (Actor.FurniOnId.ToString() == ItemIdS)
                        {
                            ItemIdS = Selected2 [rnd.Next(0, Selected2.Length)];
                        }

                        uint ItemId2;
                        uint.TryParse(ItemIdS, out ItemId2);
                        Item AffectedItem2 = mInstance.GetItem(ItemId2);
                        if (AffectedItem2 == null)
                        {
                            continue;
                        }

                        Actor.PositionToSet = AffectedItem2.RoomPosition.GetVector2();
                        Actor.UpdateNeeded  = true;
                        break;

                    case WiredEffectTypes.toggle_state:
                        String[] Selected3 = ActionItem.WiredData.Data1.Split('|');

                        foreach (String ItemIdS2 in Selected3)
                        {
                            uint ItemId3;
                            uint.TryParse(ItemIdS2, out ItemId3);
                            Item AffectedItem3 = mInstance.GetItem(ItemId3);
                            if (AffectedItem3 == null)
                            {
                                continue;
                            }

                            int CurrentState = 0;
                            int.TryParse(AffectedItem3.Flags, out CurrentState);

                            int NewState = CurrentState + 1;

                            if (CurrentState < 0 || CurrentState >= (AffectedItem3.Definition.BehaviorData - 1))
                            {
                                NewState = 0;
                            }

                            if (CurrentState != NewState)
                            {
                                AffectedItem3.Flags        = NewState.ToString();
                                AffectedItem3.DisplayFlags = AffectedItem3.Flags;

                                RoomManager.MarkWriteback(AffectedItem3, true);

                                AffectedItem3.BroadcastStateUpdate(mInstance);
                            }
                        }
                        break;
                    }
                }
            }
        }
예제 #3
0
        private static bool HandleRoller(Session Session, Item Item, RoomInstance Instance, ItemEventType Event, int RequestData, uint Opcode)
        {
            switch (Event)
            {
            case ItemEventType.UpdateTick:

                List <RoomActor> ActorsToMove = Instance.GetActorsOnPosition(Item.RoomPosition.GetVector2());
                List <Item>      ItemsToMove  = new List <Item>();
                ItemsToMove.AddRange(Instance.GetItemsOnPosition(Item.RoomPosition.GetVector2()));

                if (ActorsToMove != null)
                {
                    foreach (RoomActor Actor in ActorsToMove)
                    {
                        if (Actor.IsMoving)
                        {
                            continue;
                        }

                        if (Instance.IsValidStep(Actor.Position.GetVector2(), Item.SquareInFront, true))
                        {
                            Actor.PositionToSet = Item.SquareInFront;
                            Instance.BroadcastMessage(RollerEventComposer.Compose(Actor.Position, new Vector3(
                                                                                      Actor.PositionToSet.X, Actor.PositionToSet.Y,
                                                                                      Instance.GetUserStepHeight(Actor.PositionToSet)), Item.Id, Actor.Id, 0));
                        }
                    }
                }
                if (ItemsToMove.Count != 0)
                {
                    foreach (Item item in ItemsToMove)
                    {
                        if (item == Item)
                        {
                            continue;
                        }

                        if (Item.RoomPosition.X == item.RoomPosition.X && Item.RoomPosition.Y == item.RoomPosition.Y)
                        {
                            Vector2 NewPosition       = new Vector2(Item.SquareInFront.X, Item.SquareInFront.Y);
                            int     NewRotation       = item.RoomRotation;
                            Vector3 FinalizedPosition = Instance.SetFloorItem(Session, item, NewPosition, NewRotation);
                            Vector3 oldpos            = item.RoomPosition;

                            if (FinalizedPosition != null)
                            {
                                item.MoveToRoom(null, Instance.RoomId, FinalizedPosition, NewRotation, string.Empty);
                                RoomManager.MarkWriteback(item, false);

                                Instance.RegenerateRelativeHeightmap();
                                Instance.BroadcastMessage(RoomItemUpdatedComposer.Compose(item));

                                ItemEventDispatcher.InvokeItemEventHandler(Session, item, Instance, ItemEventType.Moved, 0);
                                Instance.BroadcastMessage(RollerEventComposer.Compose(oldpos, FinalizedPosition, Item.Id, 0, item.Id));
                            }
                        }
                    }
                }


                goto case ItemEventType.InstanceLoaded;

            case ItemEventType.InstanceLoaded:
            case ItemEventType.Placed:

                Item.RequestUpdate(4);
                break;
            }

            return(true);
        }