Exemple #1
0
        private static bool HandleSwitch(Session Session, Item Item, RoomInstance Instance, ItemEventType Event, int RequestData, uint Opcode)
        {
            if (Event != ItemEventType.Interact)
            {
                return(true);
            }
            RoomActor actor = Instance.GetActor(Session.CharacterId);

            if (actor == null)
            {
                return(true);
            }

            foreach (Item item in Instance.GetFloorItems())
            {
                if (item.Definition.Behavior != ItemBehavior.WiredTrigger || WiredTypesUtil.TriggerFromInt(item.Definition.BehaviorData) != WiredTriggerTypes.state_changed)
                {
                    continue;
                }

                String[] Selected = item.WiredData.Data1.Split('|');

                if (Selected.Contains(Item.Id.ToString()))
                {
                    Instance.WiredManager.ExecuteActions(item, actor);
                }
            }
            return(true);
        }
Exemple #2
0
        private static void TradeInitiate(Session Session, ClientMessage Message)
        {
            RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId);

            if (Instance == null || !Instance.Info.CanTrade)
            {
                return;
            }

            RoomActor TargetActor = Instance.GetActor(Message.PopWiredUInt32());
            RoomActor SelfActor   = Instance.GetActorByReferenceId(Session.CharacterId);

            if (TargetActor == null || TargetActor.Type != RoomActorType.UserCharacter || SelfActor == null ||
                TargetActor.ReferenceId == SelfActor.ReferenceId)
            {
                return;
            }

            Session TargetSession = SessionManager.GetSessionByCharacterId(TargetActor.ReferenceId);

            if (TargetSession == null)
            {
                return;
            }

            if (!Instance.TradeManager.InitiateTrade(Session.CharacterId, TargetSession.CharacterId))
            {
                Session.SendData(RoomTradeCannotInitiate.Compose());
                return;
            }

            ServerMessage TradeInitiatedMessage = TradeInitiatedComposer.Compose(Session.CharacterId, Session.HasRight("trade"),
                                                                                 TargetSession.CharacterId, TargetSession.HasRight("trade"));

            Session.SendData(TradeInitiatedMessage);
            TargetSession.SendData(TradeInitiatedMessage);

            SelfActor.SetStatus("trd");
            SelfActor.UpdateNeeded = true;

            TargetActor.SetStatus("trd");
            TargetActor.UpdateNeeded = true;
        }
        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);
        }
        private List <Vector2> FindPath()
        {
            if (mCurrentInstance == null || mTarget == null)
            {
                return(null);
            }

            RoomActor Actor = mCurrentInstance.GetActor(mActorId);

            if (Actor == null)
            {
                return(null);
            }

            List <Vector2> Points       = new List <Vector2>();
            bool           MadeProgress = true;

            while (MadeProgress)
            {
                Vector2 NextPoint = new Vector2(-1, -1);
                Vector2 LastPoint = null;

                if (Points.Count > 0)
                {
                    LastPoint = Points[Points.Count - 1];
                }

                int FromX = 0;
                int FromY = 0;

                if (LastPoint != null)
                {
                    FromX = LastPoint.X;
                    FromY = LastPoint.Y;
                }
                else
                {
                    FromX = Actor.Position.X;
                    FromY = Actor.Position.Y;
                }

                if (FromX == mTarget.X && FromY == mTarget.Y)
                {
                    break;
                }

                if (FromX > mTarget.X && FromY > mTarget.Y)
                {
                    NextPoint = new Vector2(FromX - 1, FromY - 1);
                }
                else if (FromX < mTarget.X && FromY < mTarget.Y)
                {
                    NextPoint = new Vector2(FromX + 1, FromY + 1);
                }
                else if (FromX > mTarget.X && FromY < mTarget.Y)
                {
                    NextPoint = new Vector2(FromX - 1, FromY + 1);
                }
                else if (FromX < mTarget.X && FromY > mTarget.Y)
                {
                    NextPoint = new Vector2(FromX + 1, FromY - 1);
                }
                else if (FromX > mTarget.X)
                {
                    NextPoint = new Vector2(FromX - 1, FromY);
                }
                else if (FromX < mTarget.X)
                {
                    NextPoint = new Vector2(FromX + 1, FromY);
                }
                else if (FromY < mTarget.Y)
                {
                    NextPoint = new Vector2(FromX, FromY + 1);
                }
                else if (FromY > mTarget.Y)
                {
                    NextPoint = new Vector2(FromX, FromY - 1);
                }

                MadeProgress = (NextPoint.X > -1 && NextPoint.Y > -1);

                if (LastPoint != null && NextPoint.X == LastPoint.X && NextPoint.Y == LastPoint.Y)
                {
                    MadeProgress = false;
                }

                if (MadeProgress)
                {
                    Points.Add(NextPoint);
                }
            }

            return(Points);
        }
Exemple #5
0
        private static bool HandleDispenser(Session Session, Item Item, RoomInstance Instance, ItemEventType Event, int RequestData, uint Opcode)
        {
            switch (Event)
            {
            case ItemEventType.Moved:
            {
                RoomActor InteractingActor = (Item.TemporaryInteractionReferenceIds.ContainsKey(0) ?
                                              Instance.GetActor(Item.TemporaryInteractionReferenceIds[0]) : null);

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

                goto case ItemEventType.InstanceLoaded;
            }

            case ItemEventType.InstanceLoaded:
            {
                if (Item.DisplayFlags != "0")
                {
                    Item.DisplayFlags = "0";
                    Item.BroadcastStateUpdate(Instance);
                }

                return(true);
            }

            case ItemEventType.Interact:
            {
                RoomActor InteractingActor = Instance.GetActorByReferenceId(Session.CharacterId);

                if (InteractingActor == null)
                {
                    return(true);
                }

                if (InteractingActor.Position.X != Item.SquareInFront.X || InteractingActor.Position.Y !=
                    Item.SquareInFront.Y)
                {
                    InteractingActor.MoveToItemAndInteract(Item, RequestData, Opcode);
                    return(true);
                }

                if (Item.TemporaryInteractionReferenceIds.Count == 0)
                {
                    Item.TemporaryInteractionReferenceIds.Add(0, InteractingActor.Id);

                    InteractingActor.BlockWalking();
                    InteractingActor.PositionToSet = Item.SquareInFront;

                    int NewRot = Rotation.Calculate(InteractingActor.Position.GetVector2(),
                                                    Item.RoomPosition.GetVector2());

                    if (InteractingActor.BodyRotation != NewRot)
                    {
                        InteractingActor.BodyRotation = NewRot;
                        InteractingActor.HeadRotation = NewRot;
                        InteractingActor.UpdateNeeded = true;
                    }

                    Item.DisplayFlags = "1";
                    Item.BroadcastStateUpdate(Instance);

                    Item.RequestUpdate(2);
                }

                return(true);
            }

            case ItemEventType.UpdateTick:
            {
                if (Item.DisplayFlags != "0")
                {
                    Item.DisplayFlags = "0";
                    Item.BroadcastStateUpdate(Instance);
                }

                if (Item.TemporaryInteractionReferenceIds.Count < 1)
                {
                    return(true);
                }

                RoomActor InteractingActor = Instance.GetActor(Item.TemporaryInteractionReferenceIds[0]);
                Item.TemporaryInteractionReferenceIds.Clear();

                if (InteractingActor == null)
                {
                    return(true);
                }

                InteractingActor.CarryItem(DrinkSetManager.GetRandomDrinkForSet(Item.Definition.BehaviorData));

                int NewRot = Rotation.Calculate(InteractingActor.Position.GetVector2(),
                                                Item.RoomPosition.GetVector2());

                if (InteractingActor.BodyRotation != NewRot)
                {
                    InteractingActor.BodyRotation = NewRot;
                    InteractingActor.HeadRotation = NewRot;
                    InteractingActor.UpdateNeeded = true;
                }

                InteractingActor.UnblockWalking();
                return(true);
            }
            }

            return(true);
        }
Exemple #6
0
        public override void PerformUpdate(RoomInstance Instance)
        {
            if (mNextSpeechAttempt <= 0)
            {
                string Message = BotManager.GetRandomSpeechForBotDefinition(mSelfBot.DefinitionId);

                if (Message != null && Message.Length > 0)
                {
                    mSelfActor.Chat(Message);
                }

                mNextSpeechAttempt = RandomGenerator.GetNext(0, 255);
            }
            else
            {
                mNextSpeechAttempt--;
            }

            if (!mSelfActor.IsMoving && mNextMovementAttempt <= 0)
            {
                switch (mSelfBot.WalkMode)
                {
                    default:
                    case BotWalkMode.STAND:

                        break;

                    case BotWalkMode.FREEROAM:

                        mSelfActor.MoveTo(new Vector2(RandomGenerator.GetNext(0, Instance.Model.Heightmap.SizeX - 1),
                            RandomGenerator.GetNext(0, Instance.Model.Heightmap.SizeY - 1)));
                        break;

                    case BotWalkMode.SPECIFIED_RANGE:

                        ReadOnlyCollection<Vector2> Possibilites = mSelfBot.PredefinedPositions;
                        mSelfActor.MoveTo(Possibilites[RandomGenerator.GetNext(0, (Possibilites.Count - 1))]);
                        break;
                }

                mNextMovementAttempt = RandomGenerator.GetNext(0, 180);
                mNeedsRotation = true;
            }
            else
            {
                mNextMovementAttempt--;

                if (!mSelfActor.IsMoving)
                {
                    if (mMovingToServePos)
                    {
                        mMovingToServePos = false;
                        mSelfActor.CarryItem(mServingItemId);
                        mSelfActor.MoveTo(mActorServePos);
                    }
                    else if (mServingItemId > 0)
                    {
                        mSelfActor.CarryItem(0);

                        RoomActor TargetActor = Instance.GetActor(mServingActorId);

                        if (TargetActor != null)
                        {
                            TargetActor.CarryItem(mServingItemId);

                            int NewRot = Rotation.Calculate(mActorServePos, TargetActor.Position.GetVector2());

                            mSelfActor.HeadRotation = NewRot;
                            mSelfActor.BodyRotation = NewRot;
                            mNeedsRotation = true;

                            mSelfActor.UpdateNeeded = true;
                        }

                        mServingItemId = 0;
                    }
                    else if (mNeedsRotation && mSelfBot.Rotation >= 0)
                    {
                        mSelfActor.BodyRotation = mSelfBot.Rotation;
                        mSelfActor.HeadRotation = mSelfBot.Rotation;
                        mNeedsRotation = false;
                    }
                }
            }
        }
Exemple #7
0
        private static bool HandleOneWayGate(Session Session, Item Item, RoomInstance Instance, ItemEventType Event, int RequestData, uint Opcode)
        {
            switch (Event)
            {
            case ItemEventType.InstanceLoaded:
            case ItemEventType.Moved:
            case ItemEventType.Placed:

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

                foreach (uint ActorId in Item.TemporaryInteractionReferenceIds.Values)
                {
                    RoomActor ActorToUnlock = Instance.GetActor(ActorId);

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

                Item.TemporaryInteractionReferenceIds.Clear();
                break;

            case ItemEventType.Interact:

                RoomActor Actor = Instance.GetActorByReferenceId(Session.CharacterId);

                if (Actor == null)
                {
                    break;
                }

                if (Actor.Position.X != Item.SquareInFront.X || Actor.Position.Y != Item.SquareInFront.Y)
                {
                    Actor.MoveToItemAndInteract(Item, RequestData, Opcode);
                    break;
                }

                if (Item.TemporaryInteractionReferenceIds.Count == 0 && Instance.IsValidStep(Item.RoomPosition.GetVector2(),
                                                                                             Item.SquareBehind, true) && Item.DisplayFlags == "0")
                {
                    Actor.BlockWalking();
                    Actor.MoveTo(Item.RoomPosition.GetVector2(), true, true, true);
                    Item.TemporaryInteractionReferenceIds.Add(1, Actor.Id);
                    Item.RequestUpdate(1);
                }

                break;

            case ItemEventType.UpdateTick:

                RoomActor UpdateActor = null;

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

                if (UpdateActor == null || !Instance.IsValidStep(Item.RoomPosition.GetVector2(), Item.SquareBehind, true) ||
                    ((UpdateActor.Position.X != Item.RoomPosition.X || UpdateActor.Position.Y !=
                      Item.RoomPosition.Y) && (UpdateActor.Position.X != Item.SquareInFront.X ||
                                               UpdateActor.Position.Y != Item.SquareInFront.Y)))
                {
                    if (Item.DisplayFlags != "0")
                    {
                        Item.DisplayFlags = "0";
                        Item.BroadcastStateUpdate(Instance);
                    }

                    if (Item.TemporaryInteractionReferenceIds.Count > 0)
                    {
                        Item.TemporaryInteractionReferenceIds.Clear();
                    }

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

                    break;
                }

                Item.DisplayFlags = "1";
                Item.BroadcastStateUpdate(Instance);

                UpdateActor.MoveTo(Item.SquareBehind, true, true, true);

                Item.RequestUpdate(2);
                break;
            }

            return(true);
        }