public static void Knock(Client player)
        {
            if (!player.HasData("CurrentDoors"))
            {
                return;
            }
            BuildingEntity building = (BuildingEntity)player.GetData("CurrentDoors");

            if (building._spamProtector)
            {
                return;
            }

            building._spamProtector = true;
            CharacterEntity character = player.GetAccountEntity().CharacterEntity;

            ChatScript.SendMessageToNearbyPlayers(character, "unosi dłoń i puka do drzwi budynku", ChatMessageType.ServerMe);
            ChatScript.SendMessageToSpecifiedPlayers(character, building.PlayersInBuilding.Select(x => x.CharacterEntity),
                                                     "Słychać pukanie do drzwi.", ChatMessageType.ServerDo);

            // Ochrona przed spamem w pukaniu do drzwi
            Timer timer = new Timer(4000);

            timer.Start();
            timer.Elapsed += (o, e) =>
            {
                building._spamProtector = false;
                timer.Stop();
                timer.Dispose();
            };
        }
        public void ManageBuilding(Client sender, long id = -1)
        {
            //Dla administracji
            if (id != -1)
            {
                BuildingEntity buildindController = EntityHelper.GetBuilding(id);
                if (buildindController != null)
                {
                    List <string> adminInfo = new List <string>
                    {
                        buildindController.DbModel.Name,
                        buildindController.DbModel.Description,
                        buildindController.DbModel.EnterCharge.ToString()
                    };

                    sender.SetData("CurrentDoors", buildindController);
                    sender.TriggerEvent("ShowBuildingManagePanel", adminInfo);
                    return;
                }

                sender.SendError("Budynek o podanym Id nie istnieje.");
                return;
            }

            //CurrentBuilding jest po to żeby gracz mógł zarządzać budynkiem ze środka oraz do ofert
            if (sender.GetAccountEntity().CharacterEntity.CurrentBuilding != null ||
                sender.HasData("CurrentDoors"))
            {
                BuildingEntity building = sender.HasData("CurrentDoors")
                    ? sender.GetData("CurrentDoors")
                    : sender.GetAccountEntity().CharacterEntity.CurrentBuilding;

                //TODO: Dodanie, żeby właściciel grupy mógł zarządzać budynkiem grupowym
                if (building.DbModel.Character == null || building.DbModel.Character.Id !=
                    sender.GetAccountEntity().CharacterEntity.DbModel.Id)
                {
                    sender.SendError("Nie jesteś właścicielem tego budynku.");
                    return;
                }

                List <string> info = new List <string>
                {
                    building.DbModel.Name,
                    building.DbModel.Description,
                    building.DbModel.EnterCharge.ToString()
                };

                sender.TriggerEvent("ShowBuildingManagePanel", info);
            }
            else
            {
                sender.SendInfo(
                    "Aby otworzyć panel zarządzania budynkiem musisz znajdować się w markerze bądź środku budynku.");
            }
        }
        public static void PassDoors(Client sender)
        {
            if (!sender.HasData("CurrentDoors") || !sender.HasSharedData("DoorsTarget"))
            {
                return;
            }

            BuildingEntity buildingEntity = (BuildingEntity)sender.GetData("CurrentDoors");

            if (buildingEntity.DoorsLocked)
            {
                sender.SendWarning("Drzwi są zamknięte.");
                return;
            }

            CharacterEntity character = sender.GetAccountEntity().CharacterEntity;

            if (buildingEntity.DbModel.EnterCharge.HasValue &&
                !character.HasMoney(buildingEntity.DbModel.EnterCharge.Value))
            {
                sender.SendError("Nie posiadasz wystarczającej ilości gotówki");
                return;
            }

            if (buildingEntity.DbModel.EnterCharge.HasValue)
            {
                character.RemoveMoney(buildingEntity.DbModel.EnterCharge.Value);
            }

            if (buildingEntity.PlayersInBuilding.Contains(sender.GetAccountEntity()))
            {
                sender.Position  = (Vector3)sender.GetSharedData("DoorsTarget");
                sender.Dimension = 0;
                buildingEntity.PlayersInBuilding.Remove(sender.GetAccountEntity());

                character.CurrentBuilding = null;
            }
            else
            {
                sender.Position  = (Vector3)sender.GetSharedData("DoorsTarget");
                sender.Dimension = ((BuildingEntity)sender.GetData("CurrentDoors")).InteriorDoorsColshape
                                   .Dimension;
                buildingEntity.PlayersInBuilding.Add(sender.GetAccountEntity());
                character.CurrentBuilding = sender.GetData("CurrentDoors");
            }
        }
        public void DeleteBuilding(Client sender, long id = -1)
        {
            if (!sender.HasRank(ServerRank.AdministratorRozgrywki2))
            {
                sender.SendWarning("Nie posiadasz uprawnień do usuwania drzwi.");
                return;
            }

            if (id == -1 && !sender.HasData("CurrentDoors"))
            {
                sender.SendError("Aby usunąć budynek musisz podać jego Id, lub znajdować się w jego drzwiach.");
            }

            RoleplayContext ctx = Singletons.RoleplayContextFactory.Create();

            using (BuildingsRepository repository = new BuildingsRepository(ctx))
            {
                if (sender.HasData("CurrentDoors"))
                {
                    BuildingEntity building = (BuildingEntity)sender.GetData("CurrentDoors");
                    building.Dispose();
                    repository.Delete(building.DbModel.Id);
                    repository.Save();

                    return;
                }

                if (id != -1 && EntityHelper.GetBuilding(id) != null)
                {
                    BuildingEntity building = EntityHelper.GetBuilding(id);
                    building.Dispose();

                    repository.Delete(building.DbModel.Id);
                    repository.Save();
                }
            }
            sender.SendError("Podany budynek nie istnieje.");
        }
        public void ChangeBuildingLockState(Client sender)
        {
            if (!sender.HasData("CurrentDoors"))
            {
                sender.SendError("Nie znajdujesz się przy drzwiach.");
                return;
            }

            BuildingEntity building = sender.GetData("CurrentDoors");

            //TODO: Dodanie zeby pracownicy mogli otwierać budynki grupowe zgodnie z uprawnieniami
            if (building.DbModel.Character == null ||
                building.DbModel.Character.Id != sender.GetAccountEntity().CharacterEntity.DbModel.Id)
            {
                sender.SendError("Nie jesteś właścicielem tego budynku.");
                return;
            }

            string text = building.DoorsLocked ? "otwarte" : "zamknięte";

            sender.SendInfo($"Drzwi zostały {text}");
            building.DoorsLocked = !building.DoorsLocked;
        }
        private void API_OnClientEventTrigger(Client sender, string eventName, params object[] arguments)
        {
            switch (eventName)
            {
            case "PassDoors":
                BuildingEntity.PassDoors(sender);
                break;

            case "KnockDoors":
                BuildingEntity.Knock(sender);
                break;

            case "BuyBuilding":
                if (!sender.HasData("CurrentDoors"))
                {
                    return;
                }
                BuildingEntity buildingEntity = sender.GetData("CurrentDoors");
                buildingEntity.Buy(sender);
                break;

            case "AddBuilding":
            {
                /* Arguments
                 * args[0] string Name
                 * args[1] decimal cost
                 * args[2] string interiorName
                 * args[3] bool spawnPossible
                 */

                if (Constant.Items.DefaultInteriors.All(i => i.Name != (string)arguments[2]) ||
                    !sender.HasData("AdminDoorPosition"))
                {
                    return;
                }

                Vector3 internalPosition = Constant.Items.DefaultInteriors
                                           .First(i => i.Name == (string)arguments[2]).InternalPosition;
                Vector3 externalPosition = sender.GetData("AdminDoorPosition");

                BuildingEntity building = BuildingEntity.Create(
                    sender.GetAccountEntity().DbModel,
                    (string)arguments[0],
                    Convert.ToDecimal(arguments[1]),
                    internalPosition, externalPosition,
                    (bool)arguments[3]);

                building.Save();

                sender.SendInfo("Dodawanie budynku zakończyło się pomyślnie.");
                sender.Position  = externalPosition;
                sender.Dimension = (uint)Dimension.Global;
                break;
            }

            case "EdingBuildingInfo":
            {
                /* Arguments
                 * args[0] Name
                 * args[1] description
                 * args[2] enterCharge
                 */

                BuildingEntity building = sender.HasData("CurrentDoors")
                            ? sender.GetData("CurrentDoors")
                            : sender.GetAccountEntity().CharacterEntity.CurrentBuilding;
                building.DbModel.Name        = arguments[0].ToString();
                building.DbModel.Description = arguments[1].ToString();
                if (decimal.TryParse(arguments[2].ToString(), out decimal result))
                {
                    building.DbModel.EnterCharge = result;
                }
                building.Save();
                break;
            }
            }
        }