I made a change using rust engines and managed to prevent the upgrade during damage to any entity
// Native security check built into the loop
if (block != null && block.SecondsSinceAttacked < 30)
{
BuildingCupboard[cup].work = false;
ShowButtonTC(player, cup);
CreateGameTip(cup, "Upgrade interrompido: Dano recente detectado!", player, fxnoresources, 10, GameTip.Styles.Error);
yield break;
}
...
the full argument looked like this :
private IEnumerator UpdateProgress(BasePlayer player, BuildingPrivlidge cup){
var set = cup.GetBuilding().buildingBlocks;
yield return CoroutineEx.waitForSeconds(0.15f);
var cd = Frequency(player.UserIDString, config.FrequencyUpgrade);
bool show = true;
List<ulong> playerTeamMembers = new List<ulong>();
if (config.teamupdate){
var playerTeam = RelationshipManager.ServerInstance.FindPlayersTeam(player.userID);
if (playerTeam == null){
playerTeamMembers.Add(player.userID);
} else {
playerTeamMembers = playerTeam?.members?.ToList() ?? new List<ulong>();
}
}
for (var index = 0; index < set.Count; index++){
var block = set[index];
// Verificação de segurança nativa: para o processo se o bloco sofreu dano nos últimos 30 segundos
if (block != null && block.SecondsSinceAttacked < 30)
{
BuildingCupboard[cup].work = false;
ShowButtonTC(player, cup);
CreateGameTip(cup, "Upgrade interrompido: Dano recente detectado!", player, fxnoresources, 10, GameTip.Styles.Error);
yield break;
}
if (cup == null) yield break;
if (!BuildingCupboard[cup].work) { show = false; break; }
var grade = BuildingCupboard[cup].grade;
if (!config.teamupdate || playerTeamMembers.Contains(block.OwnerID)){
if (grade == block.grade) continue;
if (!incompatibleFound){
if (Interface.CallHook("OnStructureUpgrade", block, player, grade) != null){
BuildingCupboard[cup].work = false;
ShowButtonTC(player, cup);
CreateGameTip(cup, Languaje("UpgradeBlock", player.UserIDString), player, fxnoresources, 10, GameTip.Styles.Error);
show = false;
break;
}
}