示例#1
0
        private static bool HandleTeleporter(Session Session, Item Item, RoomInstance Instance, ItemEventType Event, int RequestData, uint Opcode)
        {
            RoomActor Actor = null;

            uint LinkedRef = 0;

            uint.TryParse(Item.Flags, out LinkedRef);

            switch (Event)
            {
            case ItemEventType.InstanceLoaded:

                Item.DisplayFlags = "0";
                break;

            case ItemEventType.Moved:

                if (RequestData != 1)
                {
                    goto case ItemEventType.Removing;
                }

                break;

            case ItemEventType.Removing:
            case ItemEventType.Placed:

                if (Item.DisplayFlags != "0")
                {
                    Item.DisplayFlags = "0";

                    if (Event == ItemEventType.Moved)
                    {
                        Item.BroadcastStateUpdate(Instance);
                    }
                }

                foreach (uint RefId in Item.TemporaryInteractionReferenceIds.Values)
                {
                    RoomActor InteractingActor = Instance.GetActor(RefId);

                    if (InteractingActor != null)
                    {
                        InteractingActor.UnblockWalking();
                    }
                }

                Item.TemporaryInteractionReferenceIds.Clear();
                break;

            case ItemEventType.Interact:

                if (Session != null)
                {
                    Actor = Instance.GetActorByReferenceId(Session.CharacterId);
                }

                if (Actor == null)
                {
                    break;
                }

                bool IsInFront = (Actor.Position.X == Item.SquareInFront.X && Actor.Position.Y == Item.SquareInFront.Y);
                bool IsInTele  = !IsInFront && (Actor.Position.X == Item.RoomPosition.X &&
                                                Actor.Position.Y == Item.RoomPosition.Y);

                if (!IsInFront && !IsInTele)
                {
                    Actor.MoveToItemAndInteract(Item, RequestData, Opcode);
                    break;
                }

                if (Item.DisplayFlags == "0" && Item.TemporaryInteractionReferenceIds.Count == 0)
                {
                    Item.TemporaryInteractionReferenceIds.Add(1, Actor.Id);
                    Actor.BlockWalking();

                    using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient())
                    {
                        TeleporterLinkFinder.FillCache(MySqlClient, LinkedRef);
                    }

                    if (IsInTele)
                    {
                        Item.RequestUpdate(1);
                    }
                    else
                    {
                        Item.DisplayFlags = "1";
                        Actor.MoveTo(Item.RoomPosition.GetVector2(), true, true, true);

                        Item.BroadcastStateUpdate(Instance);
                        Item.RequestUpdate(3);
                    }
                }

                break;

            case ItemEventType.UpdateTick:

                RoomActor OutgoingUser = null;
                RoomActor IncomingUser = null;

                if (Item.TemporaryInteractionReferenceIds.ContainsKey(1))
                {
                    OutgoingUser = Instance.GetActor(Item.TemporaryInteractionReferenceIds[1]);

                    if (OutgoingUser == null)
                    {
                        Item.TemporaryInteractionReferenceIds.Remove(1);
                    }
                }

                if (Item.TemporaryInteractionReferenceIds.ContainsKey(2))
                {
                    IncomingUser = Instance.GetActor(Item.TemporaryInteractionReferenceIds[2]);

                    if (IncomingUser == null)
                    {
                        Item.TemporaryInteractionReferenceIds.Remove(2);
                    }
                }

                string       EffectToApply   = "0";
                uint         LinkedRoomRefId = TeleporterLinkFinder.GetValue(LinkedRef);
                RoomInstance LinkedRoomRef   = RoomManager.GetInstanceByRoomId(LinkedRoomRefId);

                if (OutgoingUser != null)
                {
                    Item    TargetItem      = null;
                    Session OutgoingSession = SessionManager.GetSessionByCharacterId(OutgoingUser.ReferenceId);

                    if (LinkedRoomRef == null && LinkedRoomRefId > 0)
                    {
                        RoomManager.TryLoadRoomInstance(LinkedRoomRefId);
                        LinkedRoomRef = RoomManager.GetInstanceByRoomId(LinkedRoomRefId);
                    }

                    if (LinkedRoomRef != null)
                    {
                        TargetItem = LinkedRoomRef.GetItem(LinkedRef);
                    }

                    if (OutgoingSession == null || OutgoingUser.Position.X != Item.RoomPosition.X ||
                        OutgoingUser.Position.Y != Item.RoomPosition.Y || (TargetItem != null &&
                                                                           TargetItem.TemporaryInteractionReferenceIds.ContainsKey(2)))
                    {
                        OutgoingUser.UnblockWalking();
                        Item.TemporaryInteractionReferenceIds.Remove(1);
                    }
                    else if (TargetItem != null)
                    {
                        EffectToApply = "2";

                        RoomActor TeleActor = OutgoingUser;

                        if (Instance != LinkedRoomRef)
                        {
                            OutgoingSession.IsTeleporting      = true;
                            OutgoingSession.TargetTeleporterId = LinkedRef;

                            RoomHandler.PrepareRoom(OutgoingSession, LinkedRoomRefId, string.Empty, true);

                            TeleActor = null;
                        }

                        if (TeleActor != null)
                        {
                            TeleActor.BlockWalking();

                            TeleActor.Position     = new Vector3(TargetItem.RoomPosition.X, TargetItem.RoomPosition.Y, TargetItem.RoomPosition.Z);
                            TeleActor.BodyRotation = TargetItem.RoomRotation;
                            TeleActor.HeadRotation = TeleActor.BodyRotation;
                            TeleActor.UpdateNeeded = true;

                            if (TargetItem.DisplayFlags != "2")
                            {
                                TargetItem.DisplayFlags = "2";
                                TargetItem.BroadcastStateUpdate(LinkedRoomRef);
                                TargetItem.RequestUpdate(3);
                            }

                            TargetItem.TemporaryInteractionReferenceIds.Add(2, TeleActor.Id);
                        }

                        Item.TemporaryInteractionReferenceIds.Remove(1);
                        Item.RequestUpdate(2);
                    }
                    else if (TargetItem == null)
                    {
                        EffectToApply = "1";
                        OutgoingUser.UnblockWalking();

                        if (Instance.IsValidStep(OutgoingUser.Position.GetVector2(), Item.SquareInFront, true))
                        {
                            OutgoingUser.MoveTo(Item.SquareInFront);
                        }

                        Item.TemporaryInteractionReferenceIds.Remove(1);
                        Item.RequestUpdate(2);
                    }
                }

                if (IncomingUser != null)
                {
                    if (IncomingUser.Position.X != Item.RoomPosition.X || IncomingUser.Position.Y != IncomingUser.Position.Y)
                    {
                        IncomingUser.UnblockWalking();
                        Item.TemporaryInteractionReferenceIds.Remove(2);
                    }
                    else
                    {
                        EffectToApply = "1";

                        IncomingUser.UnblockWalking();
                        Item.TemporaryInteractionReferenceIds.Remove(2);

                        if (Instance.CanInitiateMoveToPosition(Item.SquareInFront))
                        {
                            IncomingUser.MoveTo(Item.SquareInFront);
                        }

                        Item.RequestUpdate(3);
                    }
                }

                if (Item.DisplayFlags != EffectToApply)
                {
                    Item.DisplayFlags = EffectToApply;
                    Item.BroadcastStateUpdate(Instance);
                }

                break;
            }

            return(true);
        }
示例#2
0
        public void HandleSave(Session Session, ClientMessage Message)
        {
            uint ItemId = Message.PopWiredUInt32();



            if (!mInstance.CheckUserRights(Session) || !mWired.ContainsKey(ItemId))
            {
                return;
            }

            Item item = mInstance.GetItem(ItemId);

            if (item == null)
            {
                return;
            }

            WiredData data = mWired [ItemId];

            String Data1 = "";
            int    Data2 = 0;
            int    Data3 = 0;
            int    Data4 = 0;
            int    Time  = 0;
            String Data5 = "";

            Message.PopWiredInt32();
            Data2 = Message.PopWiredInt32();

            Boolean Simple = true;

            if (item.Definition.Behavior == ItemBehavior.WiredEffect)
            {
                switch (WiredTypesUtil.EffectFromInt(item.Definition.BehaviorData))
                {
                case WiredEffectTypes.match_to_sshot:
                case WiredEffectTypes.move_rotate:
                case WiredEffectTypes.teleport_to:
                case WiredEffectTypes.toggle_state:
                    Simple = false;
                    break;
                }
            }

            if (item.Definition.Behavior == ItemBehavior.WiredTrigger)
            {
                switch (WiredTypesUtil.TriggerFromInt(item.Definition.BehaviorData))
                {
                case WiredTriggerTypes.state_changed:
                case WiredTriggerTypes.walks_off_furni:
                case WiredTriggerTypes.walks_on_furni:
                    Simple = false;
                    break;
                }
            }

            if (!Simple)
            {
                Data3 = Message.PopWiredInt32();

                if (item.Definition.Behavior == ItemBehavior.WiredEffect && WiredTypesUtil.EffectFromInt(item.Definition.BehaviorData) == WiredEffectTypes.match_to_sshot)
                {
                    Data4 = Message.PopWiredInt32();
                }

                Message.PopString();
                int c = Message.PopWiredInt32();
                for (int i = 0; i < c; i++)
                {
                    uint tmp = Message.PopWiredUInt32();
                    if (mInstance.GetItem(tmp) == null)
                    {
                        continue;
                    }
                    if (tmp != 0)
                    {
                        Data1 += "" + tmp.ToString() + "|";
                    }
                }

                Time = Message.PopWiredInt32();
            }
            else
            {
                Data1 = Message.PopString();
                Data3 = Message.PopWiredInt32();
            }


            if (item.Definition.Behavior == ItemBehavior.WiredEffect)
            {
                switch (WiredTypesUtil.EffectFromInt(item.Definition.BehaviorData))
                {
                case WiredEffectTypes.match_to_sshot:
                    String[] Selected = Data1.Split('|');

                    foreach (String ItemIdS in Selected)
                    {
                        uint SelectedItemId;
                        uint.TryParse(ItemIdS, out SelectedItemId);
                        Item Item = mInstance.GetItem(SelectedItemId);
                        if (Item == null)
                        {
                            continue;
                        }

                        Data5 += Item.Id + "#" + Item.RoomPosition.ToString() + "#" + Item.RoomRotation + "#" + Item.Flags + "+";
                    }
                    break;
                }
            }

            if (data.Data1 == Data1 && data.Data2 == Data2 && data.Data3 == Data3 && data.Data4 == Data4 && data.Time == Time && data.Data5 == Data5)
            {
                return;
            }

            using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) {
                data.Data1 = Data1;
                data.Data2 = Data2;
                data.Data3 = Data3;
                data.Data4 = Data4;
                data.Data5 = Data5;
                data.Time  = Time;
                data.SynchronizeDatabase(MySqlClient);
            }

            if (item.Definition.Behavior == ItemBehavior.WiredTrigger)
            {
                switch (WiredTypesUtil.TriggerFromInt(item.Definition.BehaviorData))
                {
                case WiredTriggerTypes.at_given_time:
                    item.RequestUpdate(Data2);
                    break;

                case WiredTriggerTypes.walks_on_furni:
                case WiredTriggerTypes.walks_off_furni:
                    DeRegisterWalkItems(item.Id);
                    RegisterWalkItems(item.Id);
                    break;
                }
            }
        }