Пример #1
0
        private static void MoveWallItem(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.WallItem)
            {
                return;
            }

            string RawPlacementData = Message.PopString();
            string WallPos          = Instance.SetWallItem(Session, RawPlacementData, Item);

            if (WallPos.Length > 0)
            {
                Item.MoveToRoom(null, Instance.RoomId, new Vector3(0, 0, 0), 0, WallPos);
                RoomManager.MarkWriteback(Item, false);

                Instance.BroadcastMessage(RoomWallItemMovedComposer.Compose(Item));

                ItemEventDispatcher.InvokeItemEventHandler(Session, Item, Instance, ItemEventType.Moved);
            }
        }
Пример #2
0
 public static void Register()
 {
     ItemEventDispatcher.RegisterEventHandler(ItemBehavior.WiredTrigger, new ItemEventHandler(HandleWired));
     ItemEventDispatcher.RegisterEventHandler(ItemBehavior.WiredEffect, new ItemEventHandler(HandleWired));
     ItemEventDispatcher.RegisterEventHandler(ItemBehavior.WiredCondition, new ItemEventHandler(HandleWired));
     ItemEventDispatcher.RegisterEventHandler(ItemBehavior.Switchable, new ItemEventHandler(HandleSwitch));
 }
Пример #3
0
        private static void TakeItem(Session Session, ClientMessage Message)
        {
            RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId);

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

            int  Unknown1 = Message.PopWiredInt32();
            Item Item     = Instance.GetItem(Message.PopWiredUInt32());

            if (Item == null || Item.Definition.Behavior == ItemBehavior.StickyNote)
            {
                return;
            }

            if (Instance.TakeItem(Item.Id))
            {
                ItemEventDispatcher.InvokeItemEventHandler(Session, Item, Instance, ItemEventType.Removing);

                using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient())
                {
                    Item.MoveToUserInventory(MySqlClient, Session.CharacterId);
                }

                Instance.RegenerateRelativeHeightmap();

                Session.InventoryCache.Add(Item);
                Session.SendData(InventoryItemAddedComposer.Compose(Item));

                QuestManager.ProgressUserQuest(Session, QuestType.FURNI_PICK);
            }
        }
Пример #4
0
        private static void ActivateGeneric(Session Session, ClientMessage Message)
        {
            RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId);

            if (Instance == null) // warning: rights need to be checked in the event handler; we do not check here
            {
                return;
            }

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

            if (Item == null || Item.Definition.Behavior == ItemBehavior.StaticItem)
            {
                return;
            }

            int RequestData = Message.PopWiredInt32();

            ItemEventDispatcher.InvokeItemEventHandler(Session, Item, Instance, ItemEventType.Interact, RequestData);
            QuestManager.ProgressUserQuest(Session, QuestType.EXPLORE_FIND_ITEM, Item.DefinitionId);

            if (Item.Definition.Behavior == ItemBehavior.Switchable)
            {
                QuestManager.ProgressUserQuest(Session, QuestType.FURNI_SWITCH);
            }
        }
Пример #5
0
 public static void Register()
 {
     ItemEventDispatcher.RegisterEventHandler(ItemBehavior.HabboWheel, new ItemEventHandler(HandleHabboWheel));
     ItemEventDispatcher.RegisterEventHandler(ItemBehavior.SpinningBottle, new ItemEventHandler(HandleBottle));
     ItemEventDispatcher.RegisterEventHandler(ItemBehavior.Dice, new ItemEventHandler(HandleDice));
     ItemEventDispatcher.RegisterEventHandler(ItemBehavior.HoloDice, new ItemEventHandler(HandleDice));
     ItemEventDispatcher.RegisterEventHandler(ItemBehavior.LoveShuffler, new ItemEventHandler(HandleLoveShuffler));
 }
Пример #6
0
 public static void Register()
 {
     ItemEventDispatcher.RegisterEventHandler(ItemBehavior.Switchable, new ItemEventHandler(HandleGenericSwitch));
     ItemEventDispatcher.RegisterEventHandler(ItemBehavior.Bed, new ItemEventHandler(HandleGenericSwitch));
     ItemEventDispatcher.RegisterEventHandler(ItemBehavior.Seat, new ItemEventHandler(HandleGenericSwitch));
     ItemEventDispatcher.RegisterEventHandler(ItemBehavior.StepSwitch, new ItemEventHandler(HandleStepSwitch));
     ItemEventDispatcher.RegisterEventHandler(ItemBehavior.Scoreboard, new ItemEventHandler(HandleScoreboard));
     ItemEventDispatcher.RegisterEventHandler(ItemBehavior.Rental, new ItemEventHandler(HandleRental));
 }
Пример #7
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);
                }
            }
        }
Пример #8
0
 public static void Register()
 {
     ItemEventDispatcher.RegisterEventHandler(ItemBehavior.ExchangeItem, new ItemEventHandler(HandleExchangeRedemption));
 }
Пример #9
0
 public static void Register()
 {
     ItemEventDispatcher.RegisterEventHandler(ItemBehavior.Fireworks, new ItemEventHandler(HandleFireworks));
 }
Пример #10
0
        public RoomInstance(uint InstanceId, RoomInfo Info, RoomModel Model)
        {
            mActorSyncRoot = new object();
            mItemSyncRoot  = new object();

            mInstanceId               = InstanceId;
            mInfo                     = Info;
            mActors                   = new Dictionary <uint, RoomActor>();
            mCachedModel              = Model;
            mRelativeHeightmap        = string.Empty;
            mActorIdGenerator         = 1;
            mActorIdGeneratorSyncLock = new object();
            mTileStates               = new TileState[mCachedModel.Heightmap.SizeX, mCachedModel.Heightmap.SizeY];
            mUsersWithRights          = new List <uint>();
            mBannedUsers              = new Dictionary <uint, double>();
            mItems                    = new Dictionary <uint, Item>();
            mStaticObjects            = new List <StaticObject>();
            mItemLimitCache           = new Dictionary <ItemBehavior, int>();
            mUserGrid                 = new List <RoomActor> [mCachedModel.Heightmap.SizeX, mCachedModel.Heightmap.SizeY];
            mMusicController          = new RoomMusicController();
            mTemporaryStickieRights   = new Dictionary <uint, uint>();
            mTradeManager             = new TradeManager();
            mRollerItems              = new List <Item> [mCachedModel.Heightmap.SizeX, mCachedModel.Heightmap.SizeY];
            mWiredManager             = new WiredManager(this);

            foreach (Bot Bot in BotManager.GenerateBotInstancesForRoom(RoomId))
            {
                AddBotToRoom(Bot);
            }

            using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient())
            {
                // Items
                MySqlClient.SetParameter("id", RoomId);
                DataTable ItemTable = MySqlClient.ExecuteQueryTable("SELECT * FROM items WHERE room_id = @id");

                foreach (DataRow Row in ItemTable.Rows)
                {
                    Item Item = ItemFactory.CreateFromDatabaseRow(Row, mWiredManager);

                    if (Item.PendingExpiration && Item.ExpireTimeLeft <= 0)
                    {
                        Item.RemovePermanently(MySqlClient);
                        continue;
                    }

                    if (Item.InSoundManager)
                    {
                        continue;
                    }

                    mItems.Add(Item.Id, Item);
                    IncrecementFurniLimitCache(Item.Definition.Behavior);

                    ItemEventDispatcher.InvokeItemEventHandler(null, Item, this, ItemEventType.InstanceLoaded);
                }

                // Static objects
                MySqlClient.SetParameter("id", RoomId);
                DataTable StaticObjectTable = MySqlClient.ExecuteQueryTable("SELECT id,name,position,height,rotation,is_seat FROM static_objects WHERE room_id = @id");

                foreach (DataRow Row in StaticObjectTable.Rows)
                {
                    mStaticObjects.Add(new StaticObject((uint)Row["id"], (string)Row["name"], Vector2.FromString((string)Row["position"]),
                                                        (int)Row["height"], (int)Row["rotation"], (Row["is_seat"].ToString() == "1")));
                }

                // Rights
                MySqlClient.SetParameter("id", RoomId);
                DataTable RightsTable = MySqlClient.ExecuteQueryTable("SELECT user_id FROM room_rights WHERE room_id = @id");

                foreach (DataRow Row in RightsTable.Rows)
                {
                    mUsersWithRights.Add((uint)Row["user_id"]);
                }

                // Pets
                MySqlClient.SetParameter("id", RoomId);
                DataTable PetsTable = MySqlClient.ExecuteQueryTable("SELECT * FROM pets WHERE room_id = @id");

                foreach (DataRow Row in PetsTable.Rows)
                {
                    Pet PetData = PetFactory.GetPetFromDatabaseRow(Row);

                    AddBotToRoom(BotManager.CreateNewInstance(BotManager.GetHandlerDefinitionForPetType(PetData.Type),
                                                              RoomId, Vector3.FromString(Row["room_pos"].ToString()), PetData));
                }
            }

            RegenerateRelativeHeightmap();

            mUpdater = new Timer(new TimerCallback(PerformUpdate), null, TimeSpan.FromMilliseconds(500), TimeSpan.FromMilliseconds(500));
        }
Пример #11
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;
                    }
                }
            }
        }
Пример #12
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);
        }
Пример #13
0
        public void PerformUpdate(object state)
        {
            //Console.WriteLine(Thread.CurrentThread.ManagedThreadId); // use this only to debug threadpooling...

            List <RoomActor> ActorsToUpdate = new List <RoomActor>();
            List <RoomActor> ActorsToRemove = new List <RoomActor>();

            // Copy collection
            Dictionary <uint, RoomActor> ActorsCopy = new Dictionary <uint, RoomActor>();

            List <RoomActor>[,] NewUserGrid = new List <RoomActor> [mCachedModel.Heightmap.SizeX, mCachedModel.Heightmap.SizeY];

            lock (mActorSyncRoot)
            {
                foreach (KeyValuePair <uint, RoomActor> CopyItem in mActors)
                {
                    ActorsCopy.Add(CopyItem.Key, CopyItem.Value);
                }
            }

            foreach (RoomActor Actor in ActorsCopy.Values)
            {
                // If the room is unloaded, allow no actors
                if (mUnloaded)
                {
                    ActorsToRemove.Add(Actor);
                    continue;
                }

                // The idle time is increased in every step.
                if (Actor.Type == RoomActorType.UserCharacter)
                {
                    Actor.IncreaseIdleTime(Actor.ReferenceId == Info.OwnerId);
                }

                // If this is a bot, allow the brain to process this update tick.
                if (Actor.Type == RoomActorType.AiBot)
                {
                    ((Bot)Actor.ReferenceObject).Brain.PerformUpdate(this);
                }

                // Remove any walking statusses (they will be re-applied below if neccessary)
                if (Actor.UserStatusses.ContainsKey("mv"))
                {
                    Actor.RemoveStatus("mv");
                    Actor.UpdateNeeded = true;
                }

                // Update actor position if neccessary
                if (Actor.PositionToSet != null)
                {
                    // Check if the new position is in the door
                    if (Actor.Type == RoomActorType.UserCharacter && Actor.PositionToSet.X == mCachedModel.DoorPosition.X && Actor.PositionToSet.Y == mCachedModel.DoorPosition.Y)
                    {
                        ActorsToRemove.Add(Actor);
                        continue;
                    }

                    // Update the actual position
                    Actor.Position      = new Vector3(Actor.PositionToSet.X, Actor.PositionToSet.Y, (Math.Round(GetUserStepHeight(Actor.PositionToSet), 1)));
                    Actor.PositionToSet = null;

                    // Handle any "MoveToAndInteract" events if this was the last step
                    if (!Actor.IsMoving && Actor.MoveToAndInteract > 0 && Actor.Type == RoomActorType.UserCharacter)
                    {
                        Item Item = GetItem(Actor.MoveToAndInteract);

                        if (Item != null)
                        {
                            ItemEventDispatcher.InvokeItemEventHandler(SessionManager.GetSessionByCharacterId(
                                                                           Actor.ReferenceId), Item, this, ItemEventType.Interact, Actor.MoveToAndInteractData);
                        }

                        Actor.MoveToAndInteract     = 0;
                        Actor.MoveToAndInteractData = 0;
                    }
                }

                // If there are more steps to be made, handle it.
                if (Actor.IsMoving)
                {
                    // Check if moving to door
                    if (!Actor.IsLeavingRoom && Actor.Pathfinder.Target.X == mCachedModel.DoorPosition.X &&
                        Actor.Pathfinder.Target.Y == mCachedModel.DoorPosition.Y)
                    {
                        Actor.IsLeavingRoom = true;
                    }

                    // Get the next step from the pathfinder
                    Vector2 NextStep = Actor.GetNextStep();

                    // If the user is leaving and has exceeded 11 steps, help him out by instantly
                    // removing them.
                    if (Actor.LeaveStepsTaken >= 11)
                    {
                        ActorsToRemove.Add(Actor);
                        continue;
                    }

                    // If the pathfinder reports no more steps to be made, this is the last step.
                    bool LastStep = !Actor.IsMoving;

                    // Check that the next step is valid and allowed
                    if (NextStep != null && ((!Actor.ClippingEnabled && IsValidPosition(NextStep)) ||
                                             IsValidStep(Actor.Position.GetVector2(), NextStep, LastStep, NewUserGrid)))
                    {
                        // Update "mv" status
                        Actor.SetStatus("mv", NextStep.X + "," + NextStep.Y + "," + (Math.Round(GetUserStepHeight(NextStep), 1)).ToString().Replace(',', '.'));
                        Actor.PositionToSet = NextStep;

                        // Update new/temporary grid with our new move to position
                        if (NewUserGrid[NextStep.X, NextStep.Y] == null)
                        {
                            NewUserGrid[NextStep.X, NextStep.Y] = new List <RoomActor>();
                        }

                        NewUserGrid[NextStep.X, NextStep.Y].Add(Actor);

                        // Remove any "sit" statusses
                        if (Actor.UserStatusses.ContainsKey("sit"))
                        {
                            Actor.RemoveStatus("sit");
                        }

                        // Remove any "lay" statusses
                        if (Actor.UserStatusses.ContainsKey("lay"))
                        {
                            Actor.RemoveStatus("lay");
                        }

                        // Update rotation
                        Actor.BodyRotation = Rotation.Calculate(Actor.Position.GetVector2(), NextStep);
                        Actor.HeadRotation = Actor.BodyRotation;

                        // Request update for next @B cycle
                        Actor.UpdateNeeded = true;
                    }
                    else
                    {
                        // Invalid step: tell pathfinder to stop and mark current position on temporary grid
                        Actor.StopMoving();

                        if (NewUserGrid[NextStep.X, NextStep.Y] == null)
                        {
                            NewUserGrid[NextStep.X, NextStep.Y] = new List <RoomActor>();
                        }

                        NewUserGrid[NextStep.X, NextStep.Y].Add(Actor);
                    }
                }
                else
                {
                    if (NewUserGrid[Actor.Position.X, Actor.Position.Y] == null)
                    {
                        NewUserGrid[Actor.Position.X, Actor.Position.Y] = new List <RoomActor>();
                    }

                    NewUserGrid[Actor.Position.X, Actor.Position.Y].Add(Actor);
                }

                // If the actor is leaving and has stopped walking, help them out by removing them.
                if (!Actor.IsMoving && Actor.IsLeavingRoom && Actor.Type == RoomActorType.UserCharacter)
                {
                    ActorsToRemove.Add(Actor);
                    continue;
                }

                // Update status (apply any sit/lay/effect)
                UpdateActorStatus(Actor);

                // Add this actor to the update list if this has been requested
                if (Actor.UpdateNeeded)
                {
                    ActorsToUpdate.Add(Actor);
                    Actor.UpdateNeeded = false;
                }
            }

            // Remove all actors that need to be removed
            foreach (RoomActor Actor in ActorsToRemove)
            {
                lock (mActorSyncRoot)
                {
                    if (ActorsToUpdate.Contains(Actor))
                    {
                        ActorsToUpdate.Remove(Actor);
                    }
                }

                switch (Actor.Type)
                {
                default:

                    RemoveActorFromRoom(Actor.Id);
                    break;

                case RoomActorType.UserCharacter:

                    HardKickUser(Actor.ReferenceId);
                    break;
                }
            }

            // Send update list (if there are any updates) to room
            if (ActorsToUpdate.Count > 0)
            {
                BroadcastMessage(RoomUserStatusListComposer.Compose(ActorsToUpdate));
            }

            // Update tick on all items --
            List <Item> ItemCopy = null;

            lock (mItemSyncRoot)
            {
                ItemCopy = mItems.Values.ToList();
            }

            foreach (Item Item in ItemCopy)
            {
                Item.Update(this);
            }

            // Invalidate door position
            NewUserGrid[mCachedModel.DoorPosition.X, mCachedModel.DoorPosition.Y] = null;

            // Update user grid to our new version
            lock (mActorSyncRoot)
            {
                mUserGrid = NewUserGrid;
            }

            if (mMusicController != null && mMusicController.IsPlaying)
            {
                mMusicController.Update(this);
            }
        }
Пример #14
0
        public static void Main(string[] args)
        {
            mAlive = true;
            DateTime InitStart = DateTime.Now;

            // Set up basic output
            Console.WriteLine("Initializing Snowlight..."); // Cannot be localized before config+lang is loaded

            // Load configuration, translation, and re-configure output from config data
            ConfigManager.Initialize(Constants.DataFileDirectory + "server-main.cfg");
            Output.InitializeStream(true, (OutputLevel)ConfigManager.GetValue("output.verbositylevel"));
            Output.WriteLine("Initializing Snowlight...");

            Localization.Initialize(Constants.LangFileDirectory + "lang_" + ConfigManager.GetValue("lang") + ".lang");

            // Process args
            foreach (string arg in args)
            {
                Output.WriteLine(Localization.GetValue("core.init.cmdarg", arg));
                Input.ProcessInput(arg.Split(' '));
            }

            try
            {
                // Initialize and test database
                Output.WriteLine(Localization.GetValue("core.init.mysql"));
                SqlDatabaseManager.Initialize();

                // Initialize network components
                Output.WriteLine(Localization.GetValue("core.init.net", ConfigManager.GetValue("net.bind.port").ToString()));
                mServer = new SnowTcpListener(new IPEndPoint((IPAddress)ConfigManager.GetValue("net.bind.ip"), (int)ConfigManager.GetValue("net.bind.port")),
                                              (int)ConfigManager.GetValue("net.backlog"), new OnNewConnectionCallback(
                                                  SessionManager.HandleIncomingConnection));

                Output.WriteLine(Localization.GetValue("core.init.net", ConfigManager.GetValue("net.cmd.bind.port").ToString()));
                musServer = new SnowTcpListener(new IPEndPoint((IPAddress)ConfigManager.GetValue("net.cmd.bind.ip"), (int)ConfigManager.GetValue("net.cmd.bind.port")),
                                                (int)ConfigManager.GetValue("net.backlog"), new OnNewConnectionCallback(
                                                    CommandListener.parse));

                using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient())
                {
                    Output.WriteLine(Localization.GetValue("core.init.dbcleanup"));
                    PerformDatabaseCleanup(MySqlClient);

                    Output.WriteLine(Localization.GetValue("core.init.game"));

                    // Core
                    DataRouter.Initialize();

                    // Sessions, characters
                    Handshake.Initialize();
                    GlobalHandler.Initialize();
                    SessionManager.Initialize();
                    CharacterInfoLoader.Initialize();
                    RightsManager.Initialize(MySqlClient);
                    SingleSignOnAuthenticator.Initialize();

                    // Room management and navigator
                    RoomManager.Initialize(MySqlClient);
                    RoomInfoLoader.Initialize();
                    RoomHandler.Initialize();
                    RoomItemHandler.Initialize();
                    Navigator.Initialize(MySqlClient);

                    // Help and moderation
                    HelpTool.Initialize(MySqlClient);
                    ModerationPresets.Initialize(MySqlClient);
                    ModerationTicketManager.Initialize(MySqlClient);
                    ModerationHandler.Initialize();
                    ModerationBanManager.Initialize(MySqlClient);

                    // Catalog, pets and items
                    ItemDefinitionManager.Initialize(MySqlClient);
                    CatalogManager.Initialize(MySqlClient);
                    CatalogPurchaseHandler.Initialize();
                    Inventory.Initialize();
                    ItemEventDispatcher.Initialize();
                    PetDataManager.Initialize(MySqlClient);

                    // Messenger
                    MessengerHandler.Initialize();

                    // Achievements and quests
                    AchievementManager.Initialize(MySqlClient);
                    QuestManager.Initialize(MySqlClient);

                    // Misc/extras
                    CrossdomainPolicy.Initialize("Data\\crossdomain.xml");
                    InfobusManager.Initialize();
                    ActivityPointsWorker.Initialize();
                    BotManager.Initialize(MySqlClient);
                    InterstitialManager.Initialize(MySqlClient);
                    ChatEmotions.Initialize();
                    EffectsCacheWorker.Initialize();
                    RecyclerManager.Initialize(MySqlClient);
                    DrinkSetManager.Initialize(MySqlClient);
                    SongManager.Initialize();
                    TradeHandler.Initialize();
                    RandomGenerator.Initialize();
                    StatisticsSyncUtil.Initialize();
                    Wordfilter.Initialize(MySqlClient);

                    // Polish
                    WarningSurpressors.Initialize();
                }
            }
            catch (Exception e)
            {
                HandleFatalError(Localization.GetValue("core.init.error.details", new string[] { e.Message, e.StackTrace }));
                return;
            }

            // Init complete
            TimeSpan TimeSpent = DateTime.Now - InitStart;

            Output.WriteLine(Localization.GetValue("core.init.ok", Math.Round(TimeSpent.TotalSeconds, 2).ToString()), OutputLevel.Notification);
            Output.WriteLine((string)Localization.GetValue("core.init.ok.cmdinfo"), OutputLevel.Notification);

            Console.Write("$" + Environment.UserName.ToLower() + "@snowlight> ");
            Console.Beep();
            Input.Listen(); // This will make the main thread process console while Program.Alive.
        }
Пример #15
0
 public static void Register()
 {
     ItemEventDispatcher.RegisterEventHandler(ItemBehavior.TraxPlayer, new ItemEventHandler(HandleJukebox));
 }
Пример #16
0
        private static void PlaceItem(Session Session, ClientMessage Message)
        {
            RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId);

            if (Instance == null)
            {
                return;
            }

            uint ItemId = 0;

            string[] Data = null;

            if (Message.Id == OpcodesIn.ROOM_ITEM_PLACE_STICKY)
            {
                ItemId = Message.PopWiredUInt32();

                string   RawData = Message.PopString();
                string[] TmpData = RawData.Split(' ');

                Data    = new string[TmpData.Length + 1];
                Data[0] = string.Empty;
                Data[1] = TmpData[0];
                Data[2] = TmpData[1];
                Data[3] = TmpData[2];
            }
            else
            {
                string RawData = Message.PopString();
                Data = RawData.Split(' ');

                uint.TryParse(Data[0], out ItemId);
            }

            Item Item = Session.InventoryCache.GetItem(ItemId);

            if (Item == null)
            {
                return;
            }

            bool HasPlacementRights    = Instance.CheckUserRights(Session);
            bool IsPlacingGuestStickie = false;

            if (Item.Definition.Behavior == ItemBehavior.StickyNote && !HasPlacementRights &&
                Instance.GuestsCanPlaceStickies)
            {
                IsPlacingGuestStickie = true;
            }
            else if (!HasPlacementRights)
            {
                Session.SendData(RoomItemPlacementErrorComposer.Compose(RoomItemPlacementErrorCode.InsufficientRights));
                return;
            }

            if (Item.PendingExpiration && Item.ExpireTimeLeft <= 0)
            {
                using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient())
                {
                    Item.RemovePermanently(MySqlClient);
                }

                Session.InventoryCache.RemoveItem(Item.Id);
                Session.SendData(InventoryItemRemovedComposer.Compose(Item.Id));
                return;
            }

            switch (Item.Definition.Type)
            {
            default:
            case ItemType.FloorItem:

                if (Data.Length != 4)
                {
                    return;
                }

                int X        = 0;
                int Y        = 0;
                int Rotation = 0;

                int.TryParse(Data[1], out X);
                int.TryParse(Data[2], out Y);
                int.TryParse(Data[3], out Rotation);

                Vector3 FinalizedPosition = Instance.SetFloorItem(Session, Item, new Vector2(X, Y), Rotation);

                if (FinalizedPosition != null)
                {
                    using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient())
                    {
                        Item.MoveToRoom(MySqlClient, Instance.RoomId, FinalizedPosition, Rotation);
                    }

                    Instance.RegenerateRelativeHeightmap();

                    Session.InventoryCache.RemoveItem(Item.Id);
                    Session.SendData(InventoryItemRemovedComposer.Compose(Item.Id));

                    ItemEventDispatcher.InvokeItemEventHandler(Session, Item, Instance, ItemEventType.Placed);

                    Instance.BroadcastMessage(RoomFloorItemPlacedComposer.Compose(Item));

                    QuestManager.ProgressUserQuest(Session, QuestType.FURNI_PLACE);

                    if (FinalizedPosition.Z > Instance.Model.Heightmap.FloorHeight[FinalizedPosition.X, FinalizedPosition.Y])
                    {
                        QuestManager.ProgressUserQuest(Session, QuestType.FURNI_STACK);
                    }
                }

                break;

            case ItemType.WallItem:

                string[] CorrectedData = new string[Data.Length - 1];

                for (int i = 1; i < Data.Length; i++)
                {
                    CorrectedData[i - 1] = Data[i];
                }

                string WallPos = Instance.SetWallItem(Session, CorrectedData, Item);

                if (WallPos.Length > 0)
                {
                    using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient())
                    {
                        Item.MoveToRoom(MySqlClient, Instance.RoomId, new Vector3(0, 0, 0), 0, WallPos);
                    }

                    Session.InventoryCache.RemoveItem(Item.Id);
                    Session.SendData(InventoryItemRemovedComposer.Compose(Item.Id));

                    ItemEventDispatcher.InvokeItemEventHandler(Session, Item, Instance, ItemEventType.Placed);

                    Instance.BroadcastMessage(RoomWallItemPlacedComposer.Compose(Item));

                    if (IsPlacingGuestStickie)
                    {
                        Instance.GiveTemporaryStickieRights(Item.Id, Session.CharacterId);
                        Session.SendData(StickyDataComposer.Compose(Item));
                    }
                }

                break;
            }
        }
Пример #17
0
        public static void Main(string[] args)
        {
            mAlive = true;
            DateTime InitStart = DateTime.Now;

            // Set up basic output, configuration, etc
            Output.InitializeStream(true, OutputLevel.DebugInformation);
            Output.WriteLine("Initializing Snowlight...");

            ConfigManager.Initialize(Constants.DataFileDirectory + "\\server-main.cfg");
            Output.SetVerbosityLevel((OutputLevel)ConfigManager.GetValue("output.verbositylevel"));

            // Load Lang
            LangManager.Initialize(Constants.LangFileDirectory + "\\lang_" + ConfigManager.GetValue("lang") + ".lang");

            // Process args
            foreach (string arg in args)
            {
                Output.WriteLine("Command line argument: " + arg);
                Input.ProcessInput(arg.Split(' '));
            }

            try
            {
                // Initialize and test database
                Output.WriteLine("Initializing MySQL manager...");
                SqlDatabaseManager.Initialize();

                // Initialize network components
                Output.WriteLine("Setting up server listener on port " + (int)ConfigManager.GetValue("net.bind.port") + "...");
                mServer = new SnowTcpListener(new IPEndPoint(IPAddress.Any, (int)ConfigManager.GetValue("net.bind.port")),
                                              (int)ConfigManager.GetValue("net.backlog"), new OnNewConnectionCallback(
                                                  SessionManager.HandleIncomingConnection));

                using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient())
                {
                    Output.WriteLine("Resetting database counters and statistics...");
                    PerformDatabaseCleanup(MySqlClient);

                    Output.WriteLine("Initializing game components and workers...");

                    // Core
                    DataRouter.Initialize();

                    // Sessions, characters
                    Handshake.Initialize();
                    GlobalHandler.Initialize();
                    SessionManager.Initialize();
                    CharacterInfoLoader.Initialize();
                    RightsManager.Initialize(MySqlClient);
                    SingleSignOnAuthenticator.Initialize();

                    // Room management and navigator
                    RoomManager.Initialize(MySqlClient);
                    RoomInfoLoader.Initialize();
                    RoomHandler.Initialize();
                    RoomItemHandler.Initialize();
                    Navigator.Initialize(MySqlClient);

                    // Help and moderation
                    HelpTool.Initialize(MySqlClient);
                    ModerationPresets.Initialize(MySqlClient);
                    ModerationTicketManager.Initialize(MySqlClient);
                    ModerationHandler.Initialize();
                    ModerationBanManager.Initialize(MySqlClient);

                    // Catalog, pets and items
                    ItemDefinitionManager.Initialize(MySqlClient);
                    CatalogManager.Initialize(MySqlClient);
                    CatalogPurchaseHandler.Initialize();
                    Inventory.Initialize();
                    ItemEventDispatcher.Initialize();
                    PetDataManager.Initialize(MySqlClient);

                    // Messenger
                    MessengerHandler.Initialize();

                    // Achievements and quests
                    AchievementManager.Initialize(MySqlClient);
                    QuestManager.Initialize(MySqlClient);

                    // Misc/extras
                    CrossdomainPolicy.Initialize("Data\\crossdomain.xml");
                    InfobusManager.Initialize();
                    ActivityPointsWorker.Initialize();
                    BotManager.Initialize(MySqlClient);
                    InterstitialManager.Initialize(MySqlClient);
                    ChatEmotions.Initialize();
                    EffectsCacheWorker.Initialize();
                    RecyclerManager.Initialize(MySqlClient);
                    DrinkSetManager.Initialize(MySqlClient);
                    SongManager.Initialize();
                    TradeHandler.Initialize();
                    RandomGenerator.Initialize();
                    StatisticsSyncUtil.Initialize();

                    // Polish
                    WarningSurpressors.Initialize();
                }
            }
            catch (Exception e)
            {
                HandleFatalError("Could not initialize Snowlight: " + e.Message + "\n" + e.StackTrace);
                return;
            }

            // Init complete
            TimeSpan TimeSpent = DateTime.Now - InitStart;

            Output.WriteLine("The server has initialized successfully (" + Math.Round(TimeSpent.TotalSeconds, 2) + " seconds). Ready for connections.", OutputLevel.Notification);
            Output.WriteLine((string)LangManager.GetValue("initialized.info.cmd"), OutputLevel.Notification);

            Console.Beep();
            Input.Listen(); // This will make the main thread process console while Program.Alive.
        }
Пример #18
0
 public static void Register()
 {
     ItemEventDispatcher.RegisterEventHandler(ItemBehavior.Gate, new ItemEventHandler(HandleFixedGateSwitch));
     ItemEventDispatcher.RegisterEventHandler(ItemBehavior.OneWayGate, new ItemEventHandler(HandleOneWayGate));
 }
Пример #19
0
 public static void Register()
 {
     ItemEventDispatcher.RegisterEventHandler(ItemBehavior.Roller, new ItemEventHandler(HandleRoller));
 }
Пример #20
0
 public static void Register()
 {
     ItemEventDispatcher.RegisterEventHandler(ItemBehavior.TimedAlert, new ItemEventHandler(HandleAlert));
 }