mirror of
https://github.com/Anuken/Mindustry.git
synced 2025-07-21 21:28:28 +07:00
Added WorldLabel entity for better server-side labels
This commit is contained in:
@ -20,6 +20,7 @@ mindustry.entities.comp.PlayerComp=12
|
|||||||
mindustry.entities.comp.PosTeam=27
|
mindustry.entities.comp.PosTeam=27
|
||||||
mindustry.entities.comp.PosTeamDef=28
|
mindustry.entities.comp.PosTeamDef=28
|
||||||
mindustry.entities.comp.PuddleComp=13
|
mindustry.entities.comp.PuddleComp=13
|
||||||
|
mindustry.entities.comp.WorldLabelComp=35
|
||||||
mindustry.type.Weather.WeatherStateComp=14
|
mindustry.type.Weather.WeatherStateComp=14
|
||||||
mindustry.world.blocks.campaign.LaunchPad.LaunchPayloadComp=15
|
mindustry.world.blocks.campaign.LaunchPad.LaunchPayloadComp=15
|
||||||
mindustry.world.blocks.campaign.PayloadLaunchPad.LargeLaunchPayloadComp=34
|
mindustry.world.blocks.campaign.PayloadLaunchPad.LargeLaunchPayloadComp=34
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
{fields:[{name:flags,type:byte},{name:fontSize,type:float},{name:text,type:java.lang.String},{name:x,type:float},{name:y,type:float},{name:z,type:float}]}
|
@ -14,4 +14,5 @@ class GroupDefs<G>{
|
|||||||
@GroupDef(value = Firec.class) G fire;
|
@GroupDef(value = Firec.class) G fire;
|
||||||
@GroupDef(value = Puddlec.class) G puddle;
|
@GroupDef(value = Puddlec.class) G puddle;
|
||||||
@GroupDef(value = WeatherStatec.class) G weather;
|
@GroupDef(value = WeatherStatec.class) G weather;
|
||||||
|
@GroupDef(value = WorldLabelc.class, mapping = true) G label;
|
||||||
}
|
}
|
||||||
|
68
core/src/mindustry/entities/comp/WorldLabelComp.java
Normal file
68
core/src/mindustry/entities/comp/WorldLabelComp.java
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
package mindustry.entities.comp;
|
||||||
|
|
||||||
|
import arc.graphics.*;
|
||||||
|
import arc.graphics.g2d.*;
|
||||||
|
import arc.scene.ui.layout.*;
|
||||||
|
import arc.util.*;
|
||||||
|
import arc.util.pooling.*;
|
||||||
|
import mindustry.annotations.Annotations.*;
|
||||||
|
import mindustry.gen.*;
|
||||||
|
import mindustry.graphics.*;
|
||||||
|
import mindustry.ui.*;
|
||||||
|
|
||||||
|
/** Component/entity for labels in world space. Useful for servers. Does not save in files - create only on world load. */
|
||||||
|
@EntityDef(value = {WorldLabelc.class}, serialize = false)
|
||||||
|
@Component(base = true)
|
||||||
|
public abstract class WorldLabelComp implements Posc, Drawc, Syncc{
|
||||||
|
@Import int id;
|
||||||
|
@Import float x, y;
|
||||||
|
|
||||||
|
public static final byte flagBackground = 1, flagOutline = 2;
|
||||||
|
|
||||||
|
public String text = "sample text";
|
||||||
|
public float fontSize = 1f, z = Layer.playerName + 1;
|
||||||
|
/** Flags are packed into a byte for sync efficiency; see the flag static values. */
|
||||||
|
public byte flags = flagBackground | flagOutline;
|
||||||
|
|
||||||
|
@Replace
|
||||||
|
public float clipSize(){
|
||||||
|
return text.length() * 10f * fontSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void draw(){
|
||||||
|
Draw.z(z);
|
||||||
|
float z = Drawf.text();
|
||||||
|
|
||||||
|
Font font = (flags & flagOutline) != 0 ? Fonts.outline : Fonts.def;
|
||||||
|
GlyphLayout layout = Pools.obtain(GlyphLayout.class, GlyphLayout::new);
|
||||||
|
|
||||||
|
boolean ints = font.usesIntegerPositions();
|
||||||
|
font.setUseIntegerPositions(false);
|
||||||
|
font.getData().setScale(0.25f / Scl.scl(1f) * fontSize);
|
||||||
|
layout.setText(font, text);
|
||||||
|
|
||||||
|
if((flags & flagBackground) != 0){
|
||||||
|
Draw.color(0f, 0f, 0f, 0.3f);
|
||||||
|
Fill.rect(x, y - layout.height / 2, layout.width + 2, layout.height + 3);
|
||||||
|
Draw.color();
|
||||||
|
}
|
||||||
|
|
||||||
|
font.setColor(Color.white);
|
||||||
|
font.draw(text, x, y, 0, Align.center, false);
|
||||||
|
|
||||||
|
Draw.reset();
|
||||||
|
Pools.free(layout);
|
||||||
|
font.getData().setScale(1f);
|
||||||
|
font.setColor(Color.white);
|
||||||
|
font.setUseIntegerPositions(ints);
|
||||||
|
|
||||||
|
Draw.z(z);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** This MUST be called instead of remove()! */
|
||||||
|
public void hide(){
|
||||||
|
remove();
|
||||||
|
Call.removeWorldLabel(id);
|
||||||
|
}
|
||||||
|
}
|
@ -94,9 +94,7 @@ public class Menus{
|
|||||||
|
|
||||||
@Remote(variants = Variant.both)
|
@Remote(variants = Variant.both)
|
||||||
public static void labelReliable(String message, float duration, float worldx, float worldy){
|
public static void labelReliable(String message, float duration, float worldx, float worldy){
|
||||||
if(message == null) return;
|
label(message, duration, worldx, worldy);
|
||||||
|
|
||||||
ui.showLabel(message, duration, worldx, worldy);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Remote(variants = Variant.both)
|
@Remote(variants = Variant.both)
|
||||||
@ -113,6 +111,15 @@ public class Menus{
|
|||||||
ui.hudfrag.showToast(Fonts.getGlyph(Fonts.icon, (char)unicode), text);
|
ui.hudfrag.showToast(Fonts.getGlyph(Fonts.icon, (char)unicode), text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//internal use only
|
||||||
|
@Remote
|
||||||
|
public static void removeWorldLabel(int id){
|
||||||
|
var label = Groups.label.getByID(id);
|
||||||
|
if(label != null){
|
||||||
|
label.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public interface MenuListener{
|
public interface MenuListener{
|
||||||
void get(Player player, int option);
|
void get(Player player, int option);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user