::ROOT <- getroottable() local ValuesTable = { TANKHEALTHBARS_NUMBER_SIZE = 32 TANKHEALTHBARS_NUMBER_COLOR = "125 175 255" TANKHEALTHBARS_BAR_SIZE = 24 TANKHEALTHBARS_BAR_COLOR = "125 175 255" TANKHEALTHBARS_BAR_LENGTH = 24 TANKHEALTHBARS_TEXT_HEIGHT_OFFSET = 48 TANKHEALTHBARS_RAINBOW = false } foreach(k, v in ValuesTable) ROOT[k] <- v local TankTable = {} for(local hOldThinkEnt; hOldThinkEnt = Entities.FindByName(hOldThinkEnt, "tankhealthbars_thinkent");) EntFireByHandle(hOldThinkEnt, "Kill", null, -1, null, null) local hThinkEnt = Entities.CreateByClassname("logic_script") NetProps.SetPropBool(hThinkEnt, "m_bForcePurgeFixedupStrings", true) hThinkEnt.ValidateScriptScope() NetProps.SetPropString(hThinkEnt, "m_iName", "tankhealthbars_thinkent") local function TankHealthBarsThink() { for(local hTank; hTank = Entities.FindByClassname(hTank, "tank_boss");) if(hTank instanceof CTFBaseBoss && !(hTank in TankTable)) { local vecOrigin = Vector(0, 0, hTank.GetBoundingMaxs().z * hTank.GetModelScale() + TANKHEALTHBARS_TEXT_HEIGHT_OFFSET) local hTextNumber = SpawnEntityFromTable("point_worldtext", { color = TANKHEALTHBARS_NUMBER_COLOR font = 1 orientation = 2 textsize = TANKHEALTHBARS_NUMBER_SIZE rainbow = TANKHEALTHBARS_RAINBOW }) NetProps.SetPropBool(hTextNumber, "m_bForcePurgeFixedupStrings", true) hTextNumber.AcceptInput("SetParent", "!activator", hTank, null) hTextNumber.SetLocalOrigin(vecOrigin) local hTextBar = SpawnEntityFromTable("point_worldtext", { color = TANKHEALTHBARS_BAR_COLOR font = 5 orientation = 2 textsize = TANKHEALTHBARS_BAR_SIZE rainbow = TANKHEALTHBARS_RAINBOW }) NetProps.SetPropBool(hTextBar, "m_bForcePurgeFixedupStrings", true) hTextBar.AcceptInput("SetParent", "!activator", hTank, null) hTextBar.SetLocalOrigin(vecOrigin) TankTable[hTank] <- { iHealthLast = 0 hTextNumber = hTextNumber hTextBar = hTextBar } } foreach(hTank, Table in TankTable) if(hTank.IsValid()) { local iHealth = hTank.GetHealth() if(Table.iHealthLast != iHealth) { Table.iHealthLast = iHealth local iBarPortion = ceil(iHealth / hTank.GetMaxHealth().tofloat() * TANKHEALTHBARS_BAR_LENGTH).tointeger() local sBar = "" for(local i = 0; i < TANKHEALTHBARS_BAR_LENGTH; i++) sBar += i < iBarPortion ? "|" : " " Table.hTextNumber.AcceptInput("SetText", format("%i", iHealth), null, null) Table.hTextBar.AcceptInput("SetText", format("\n[%s]", sBar), null, null) } } else { if(Table.hTextNumber.IsValid()) Table.hTextNumber.Kill() if(Table.hTextBar.IsValid()) Table.hTextBar.Kill() delete TankTable[hTank] } return -1 } hThinkEnt.GetScriptScope().TankHealthBarsThink <- TankHealthBarsThink AddThinkToEnt(hThinkEnt, "TankHealthBarsThink")