예제 #1
0
        /// <summary>
        /// Close all linked doors in the building
        /// </summary>
        /// <param name="privilege"></param>
        /// <param name="player"></param>
        private void CloseDoors(BuildingPrivlidge privilege, BasePlayer player)
        {
            uint       doorCount = 0;
            BaseEntity baseLock  = privilege.GetSlot(BaseEntity.Slot.Lock);

            if (baseLock is CodeLock)
            {
                CodeLock masterLock = baseLock as CodeLock;
                BuildingManager.Building building = privilege.GetBuilding();
                foreach (DecayEntity entity in building.decayEntities)
                {
                    if (entity.GetSlot(BaseEntity.Slot.Lock) is CodeLock && entity is Door)
                    {
                        CodeLock codeLock = (entity.GetSlot(BaseEntity.Slot.Lock) as CodeLock);
                        if (masterLock.code == codeLock.code && masterLock != codeLock)
                        {
                            if ((entity as Door).HasFlag(BaseEntity.Flags.Open))
                            {
                                (entity as Door).SetFlag(BaseEntity.Flags.Open, false);
                                (entity as Door).SendNetworkUpdate();
                                doorCount++;
                            }
                        }
                    }
                }
                player.ChatMessage(Lang("ClosedDoors", player.UserIDString, doorCount));
            }
        }
예제 #2
0
        /// <summary>
        /// Clear lock's whitelist
        /// </summary>
        /// <param name="privilege"></param>
        void ClearAuthorizations(BuildingPrivlidge privilege)
        {
            BaseEntity baseLock = privilege.GetSlot(BaseEntity.Slot.Lock);

            if (baseLock is CodeLock)
            {
                CodeLock masterLock = baseLock as CodeLock;
                BuildingManager.Building building = privilege.GetBuilding();
                foreach (BuildingBlock block in building.buildingBlocks)
                {
                    if (block.GetSlot(BaseEntity.Slot.Lock) is CodeLock)
                    {
                        CodeLock codeLock = (block.GetSlot(BaseEntity.Slot.Lock) as CodeLock);
                        if (masterLock.code == codeLock.code)
                        {
                            codeLock.whitelistPlayers.Clear();
                            codeLock.SendNetworkUpdateImmediate();
                        }
                    }
                }
                foreach (DecayEntity entity in building.decayEntities)
                {
                    if (entity.GetSlot(BaseEntity.Slot.Lock) is CodeLock)
                    {
                        CodeLock codeLock = (entity.GetSlot(BaseEntity.Slot.Lock) as CodeLock);
                        if (masterLock.code == codeLock.code)
                        {
                            codeLock.whitelistPlayers.Clear();
                            codeLock.SendNetworkUpdateImmediate();
                        }
                    }
                }
            }
        }
예제 #3
0
        private object OnHammerHit(BasePlayer player, HitInfo info)
        {
            BaseCombatEntity entity = info?.HitEntity as BaseCombatEntity;

            if (entity == null || entity.IsDestroyed)
            {
                return(null);
            }

            DecayEntity decay = entity as DecayEntity;

            if (decay != null && decay.buildingID == 0)
            {
                return(null);
            }

            if (!_storedData.RepairEnabled.ContainsKey(player.userID) && _pluginConfig.DefaultEnabled)
            {
                _storedData.RepairEnabled[player.userID] = true;
            }

            if (!_storedData.RepairEnabled[player.userID])
            {
                return(null);
            }

            if (IsNoEscapeBlocked(player))
            {
                Chat(player, Lang(LangKeys.NoEscape, player));
                return(null);
            }

            if (_repairingPlayers.Contains(player.userID))
            {
                Chat(player, Lang(LangKeys.RepairInProcess, player));
                return(null);
            }

            BuildingPrivlidge priv = player.GetBuildingPrivilege();

            if (priv == null || !priv.IsAuthed(player))
            {
                return(null);
            }

            PlayerRepairStats stats = new PlayerRepairStats();

            BuildingManager.Building building = priv.GetBuilding();
            ServerMgr.Instance.StartCoroutine(DoBuildingRepair(player, building, stats));
            return(true);
        }
예제 #4
0
        /// <summary>
        /// Initialize locks in a building
        /// </summary>
        /// <param name="privilege"></param>
        private void InitializeMasterLock(BuildingPrivlidge privilege)
        {
            BaseEntity baseLock = privilege.GetSlot(BaseEntity.Slot.Lock);

            if (baseLock is CodeLock)
            {
                string code = (baseLock as CodeLock).code;

                BuildingManager.Building building = privilege.GetBuilding();
                foreach (BuildingBlock block in building.buildingBlocks)
                {
                    if (block.GetSlot(BaseEntity.Slot.Lock) is CodeLock)
                    {
                        CodeLock codeLock = (block.GetSlot(BaseEntity.Slot.Lock) as CodeLock);
                        if (!codeLock.IsLocked())
                        {
                            codeLock.code = code;
                            codeLock.SetFlag(BaseEntity.Flags.Locked, true);
                            foreach (ProtoBuf.PlayerNameID player in privilege.authorizedPlayers)
                            {
                                codeLock.whitelistPlayers.Add(player.userid);
                            }
                            codeLock.SendNetworkUpdateImmediate();
                        }
                    }
                }
                foreach (DecayEntity entity in building.decayEntities)
                {
                    if (entity.GetSlot(BaseEntity.Slot.Lock) is CodeLock)
                    {
                        CodeLock codeLock = (entity.GetSlot(BaseEntity.Slot.Lock) as CodeLock);
                        if (!codeLock.IsLocked())
                        {
                            codeLock.code = code;
                            codeLock.SetFlag(BaseEntity.Flags.Locked, true);
                            foreach (ProtoBuf.PlayerNameID player in privilege.authorizedPlayers)
                            {
                                codeLock.whitelistPlayers.Add(player.userid);
                            }
                            codeLock.SendNetworkUpdateImmediate();
                        }
                    }
                }
            }
        }
예제 #5
0
        /// <summary>
        /// Calculate the tax rate
        /// </summary>
        /// <param name="privlidge"></param>
        /// <returns></returns>
        private double CalculateTaxRate(BuildingPrivlidge privlidge)
        {
            BuildingPrivlidge.UpkeepBracket[] upkeepBrackets = new List <BuildingPrivlidge.UpkeepBracket>()
            {
                new BuildingPrivlidge.UpkeepBracket(ConVar.Decay.bracket_0_blockcount, ConVar.Decay.bracket_0_costfraction),
                new BuildingPrivlidge.UpkeepBracket(ConVar.Decay.bracket_1_blockcount, ConVar.Decay.bracket_1_costfraction),
                new BuildingPrivlidge.UpkeepBracket(ConVar.Decay.bracket_2_blockcount, ConVar.Decay.bracket_2_costfraction),
                new BuildingPrivlidge.UpkeepBracket(ConVar.Decay.bracket_3_blockcount, ConVar.Decay.bracket_3_costfraction)
            }.ToArray();

            BuildingManager.Building building = privlidge.GetBuilding();
            if (building == null || !building.HasBuildingBlocks())
            {
                return(ConVar.Decay.bracket_0_costfraction);
            }
            int count = building.buildingBlocks.Count;
            int a     = count;

            for (int index = 0; index < upkeepBrackets.Length; ++index)
            {
                BuildingPrivlidge.UpkeepBracket upkeepBracket = upkeepBrackets[index];
                upkeepBracket.blocksTaxPaid = 0.0f;
                if (a > 0)
                {
                    int num = index != upkeepBrackets.Length - 1 ? Mathf.Min(a, upkeepBrackets[index].objectsUpTo) : a;
                    a -= num;
                    upkeepBracket.blocksTaxPaid = num * upkeepBracket.fraction;
                }
            }
            float num1 = 0.0f;

            for (int index = 0; index < upkeepBrackets.Length; ++index)
            {
                BuildingPrivlidge.UpkeepBracket upkeepBracket = upkeepBrackets[index];
                if (upkeepBracket.blocksTaxPaid > 0.0)
                {
                    num1 += upkeepBracket.blocksTaxPaid;
                }
                else
                {
                    break;
                }
            }
            return(Math.Ceiling((num1 / count) * 100));
        }
예제 #6
0
        /// <summary>
        /// Remove player from lock's whitelist
        /// </summary>
        /// <param name="privilege"></param>
        /// <param name="player"></param>
        void RemoveAuthorization(BuildingPrivlidge privilege, BasePlayer player)
        {
            uint       deauthCount = 0;
            BaseEntity baseLock    = privilege.GetSlot(BaseEntity.Slot.Lock);

            if (baseLock is CodeLock)
            {
                CodeLock masterLock = baseLock as CodeLock;
                BuildingManager.Building building = privilege.GetBuilding();
                foreach (BuildingBlock block in building.buildingBlocks)
                {
                    if (block.GetSlot(BaseEntity.Slot.Lock) is CodeLock)
                    {
                        CodeLock codeLock = (block.GetSlot(BaseEntity.Slot.Lock) as CodeLock);
                        if (masterLock.code == codeLock.code)
                        {
                            codeLock.whitelistPlayers.Remove(player.userID);
                            codeLock.SendNetworkUpdateImmediate();
                            deauthCount++;
                        }
                    }
                }
                foreach (DecayEntity entity in building.decayEntities)
                {
                    if (entity.GetSlot(BaseEntity.Slot.Lock) is CodeLock)
                    {
                        CodeLock codeLock = (entity.GetSlot(BaseEntity.Slot.Lock) as CodeLock);
                        if (masterLock.code == codeLock.code)
                        {
                            codeLock.whitelistPlayers.Remove(player.userID);
                            codeLock.SendNetworkUpdateImmediate();
                            deauthCount++;
                        }
                    }
                }
                if (deauthCount > 0)
                {
                    player.ChatMessage(Lang("RemoveAuthorization", player.UserIDString, player.displayName, deauthCount));
                }
            }
        }
예제 #7
0
        /// <summary>
        /// Update all locks following the master lock
        /// </summary>
        /// <param name="privilege"></param>
        /// <param name="newCode"></param>
        private uint UpdateCode(BuildingPrivlidge privilege, string newCode)
        {
            BaseEntity baseLock  = privilege.GetSlot(BaseEntity.Slot.Lock);
            uint       codeLocks = 0;

            if (baseLock is CodeLock)
            {
                CodeLock masterLock = baseLock as CodeLock;
                BuildingManager.Building building = privilege.GetBuilding();
                foreach (BuildingBlock block in building.buildingBlocks)
                {
                    if (block.GetSlot(BaseEntity.Slot.Lock) is CodeLock)
                    {
                        CodeLock codeLock = (block.GetSlot(BaseEntity.Slot.Lock) as CodeLock);
                        if (masterLock.code == codeLock.code && masterLock != codeLock)
                        {
                            codeLock.code = newCode;
                            codeLock.SendNetworkUpdateImmediate();
                            codeLocks++;
                        }
                    }
                }
                foreach (DecayEntity entity in building.decayEntities)
                {
                    if (entity.GetSlot(BaseEntity.Slot.Lock) is CodeLock)
                    {
                        CodeLock codeLock = (entity.GetSlot(BaseEntity.Slot.Lock) as CodeLock);
                        if (masterLock.code == codeLock.code && masterLock != codeLock)
                        {
                            codeLock.code = newCode;
                            codeLock.SendNetworkUpdateImmediate();
                            codeLocks++;
                        }
                    }
                }
            }
            return(codeLocks);
        }
예제 #8
0
        void CalculateUpkeepCost(BasePlayer player, string command, string[] args)
        {
            if (!permission.UserHasPermission(player.UserIDString, "tcmanager.upkeep") && !player.IsAdmin)
            {
                player.ChatMessage(Lang("NoCommandPermission", player.UserIDString));
                return;
            }
            BuildingPrivlidge privilege = player.GetBuildingPrivilege();

            if (!privilege)
            {
                player.ChatMessage(Lang("NoBuildingPrivilege", player.UserIDString));
                return;
            }
            if (!privilege.IsAuthed(player) && !player.IsAdmin)
            {
                player.ChatMessage(Lang("NoAuthorization", player.UserIDString));
                return;
            }

            if (args.Length == 0)             // Default
            {
                List <ItemAmount> itemAmounts = Facepunch.Pool.GetList <ItemAmount>();
                privilege.CalculateUpkeepCostAmounts(itemAmounts);
                player.ChatMessage(Lang("DefaultCostHeader", player.UserIDString));
                player.ChatMessage(Lang("Line", player.UserIDString));
                foreach (ItemAmount amount in itemAmounts)
                {
                    player.ChatMessage(Lang("ItemCost", player.UserIDString, amount.itemDef.displayName.translated, Math.Ceiling(amount.amount)));
                }
                Facepunch.Pool.FreeList(ref itemAmounts);
            }
            else
            {
                BuildingGrade.Enum grade = BuildingGrade.Enum.None;
                switch (args[0].ToLower())
                {
                case "0":
                    grade = BuildingGrade.Enum.Twigs;
                    break;

                case "1":
                    grade = BuildingGrade.Enum.Wood;
                    break;

                case "2":
                    grade = BuildingGrade.Enum.Stone;
                    break;

                case "3":
                    grade = BuildingGrade.Enum.Metal;
                    break;

                case "4":
                    grade = BuildingGrade.Enum.TopTier;
                    break;

                default:
                    player.ChatMessage(Lang("UpkeepUsage", player.UserIDString));
                    return;
                }
                List <ItemAmount>        itemAmounts = Facepunch.Pool.GetList <ItemAmount>();
                BuildingManager.Building building    = privilege.GetBuilding();
                foreach (BuildingBlock block in  building.buildingBlocks)
                {
                    BuildingGrade.Enum original = block.grade;
                    block.grade = grade;
                    block.CalculateUpkeepCostAmounts(itemAmounts, privilege.CalculateUpkeepCostFraction());
                    block.grade = original;
                }
                player.ChatMessage(Lang("GradedCostHeader", player.UserIDString, grade));
                player.ChatMessage(Lang("Line", player.UserIDString));
                foreach (ItemAmount amount in itemAmounts)
                {
                    player.ChatMessage(Lang("ItemCost", player.UserIDString, amount.itemDef.displayName.translated, Math.Ceiling(amount.amount)));
                }
                Facepunch.Pool.FreeList(ref itemAmounts);
            }
        }