#made by Govindas @ limework.net import: com.comphenix.protocol.wrappers.EnumWrappers$ScoreboardAction net.minecraft.server.v1_12_R1.IScoreboardCriteria$EnumScoreboardHealthDisplay #cache packets / reflection, so we can run code much faster on script load: #remove scoreboard objective packet set {-scoreboard_objective_remove_packet} to new play_server_scoreboard_objective packet set int field 0 of {-scoreboard_objective_remove_packet} to 1 #1 means remove #create scoreboard objective packet set {-scoreboard_objective_create_packet} to new play_server_scoreboard_objective packet set int field 0 of {-scoreboard_objective_create_packet} to 0 #0 means create set {-scoreboard_objective_create_packet}.getHandle().c to EnumScoreboardHealthDisplay.INTEGER #update scoreboard objective packet set {-scoreboard_objective_update_packet} to new play_server_scoreboard_objective packet set int field 0 of {-scoreboard_objective_update_packet} to 2 #2 means update #set objective display slot #2 = below name #0 = sidebar set {-belowname_display_packet} to new play_server_scoreboard_display_objective packet set int field 0 of {-belowname_display_packet} to 2 #set the number displayed set {-scoreboard_score_packet} to new play_server_scoreboard_score packet set ScoreboardAction field 0 of {-scoreboard_score_packet} to ScoreboardAction.CHANGE effect set below[ ]name of %player/string% for %player% to %number% named %string%: trigger: #register scoreboard objective if {-hpbelowpacket::%expression 2%} is not set: set {_packet} to {-scoreboard_objective_create_packet} #random scoreboard name to support bungeecord set {_uuid} to first 16 characters of random uuid set string field 0 of {_packet} to {_uuid} set string field 1 of {_packet} to expression 4 #text that is displayed below name send packet {_packet} to expression 2 set {-hpbelowpacket::%expression 2%} to expression 4 set {-hpbelowpacketid::%expression 2%} to {_uuid} #below name display packet, MUST be sent only once set {_packet} to {-belowname_display_packet} set string field 0 of {_packet} to {-hpbelowpacketid::%expression 2%} send packet {_packet} to expression 2 #update the name if objective already present else if {-hpbelowpacket::%expression 2%} is not expression 4: set {_packet} to {-scoreboard_objective_update_packet} set string field 0 of {_packet} to {-hpbelowpacketid::%expression 2%} set string field 1 of {_packet} to expression 4 #new text displayed below name send packet {_packet} to expression 2 set {-hpbelowpacket::%expression 2%} to expression 4 #set the number displayed set {_packet} to {-scoreboard_score_packet} set int field 0 of {_packet} to expression 3 #number set string field 0 of {_packet} to "%expression 1%" #player name set string field 1 of {_packet} to {-hpbelowpacketid::%expression 2%} send packet {_packet} to expression 2 effect (remove|reset|delete) below[ ]name for %player%: trigger: #removed this condition... as it was sometimes preventing legitimate reset, maybe sometimes it just needs to do it twice?) #{-hpbelowpacketid::%expression 1%} is set: #needed to re-create the display, to reset it easier #somehow without re-setting it before removing, it bugs out and doesn't let to remove it anymore without relog sometimes set {_id} to "%{-hpbelowpacketid::%expression 1%}%" wait 2 ticks {_id} is "%{-hpbelowpacketid::%expression 1%}%" set belowname of expression 1 for expression 1 to 0 named "reset" set {_packet} to {-scoreboard_objective_remove_packet} set string field 0 of {_packet} to {-hpbelowpacketid::%expression 1%} send packet {_packet} to expression 1 delete {-hpbelowpacketid::%expression 1%} and {-hpbelowpacket::%expression 1%} on quit: remove belowname for player on player world change: {-hpbelowpacketid::%player%} is set: remove belowname for player