You definitely could do this with a shader, but i have no idea how to.
Instead I'd recommend registering a GuiLayer instead, it's what is used to render the hotbar, health and armor points.
-# StartupScript
let $RegisterGuiLayersEvent = Java.loadClass("net.neoforged.neoforge.client.event.RegisterGuiLayersEvent");
const OVERLAY_TEXTURE = ID.kjs("example_sprite")
NativeEvents.onEvent($RegisterGuiLayersEvent, event => {
event.registerAboveAll(
ID.kjs("custom_screen_overlay"),
(gui, delta) => global.drawCustomScreenOverlay(gui, delta)
)
})
global.drawCustomScreenOverlay = (guiGraphics, deltaTracker) => {
if (!Client.player || !Client.player.hasEffect("minecraft:poison")) return
guiGraphics.blitSprite(OVERLAY_TEXTURE, 0, 0, guiGraphics.guiWidth(), guiGraphics.guiHeight())
}
Your texture has to be assets/kubejs/textures/gui/sprites/example_sprite.png in this case (see OVERLAY_TEXTURE declaration; the textures/gui/sprites/ part is required by mc)
Note that you might not want to use .registerAboveAll() because it draws over the hotbar. If so, just register above/below one of the vanilla layers. They render in this order: ```
camera_overlays, crosshair, hotbar, jump_meter, experience_bar, player_health, armor_level, food_level, vehicle_health, air_level, selected_item_name, spectator_tooltip, experience_level, effects, boss_overlay, sleep_overlay, demo_overlay, debug_overlay, scoreboard_sidebar, overlay_message, title, chat, tab_list, subtitle_overlay, saving_indicator