/// <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)); } }
/// <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(); } } } } }
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); }
/// <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(); } } } } }
/// <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)); }
/// <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)); } } }
/// <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); }
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); } }