HolographicDisplays/core/src/main/java/me/filoghost/holographicdisplays/core/tracking/TextLineTracker.java

121 lines
4.0 KiB
Java

/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.core.tracking;
import me.filoghost.holographicdisplays.core.base.BaseTextHologramLine;
import me.filoghost.holographicdisplays.core.listener.LineClickListener;
import me.filoghost.holographicdisplays.core.placeholder.tracking.ActivePlaceholderTracker;
import me.filoghost.holographicdisplays.core.tick.CachedPlayer;
import me.filoghost.holographicdisplays.nms.common.IndividualTextPacketGroup;
import me.filoghost.holographicdisplays.nms.common.NMSManager;
import me.filoghost.holographicdisplays.nms.common.entity.TextNMSPacketEntity;
import org.jetbrains.annotations.MustBeInvokedByOverriders;
import java.util.Objects;
public class TextLineTracker extends ClickableLineTracker<TextLineViewer> {
private final BaseTextHologramLine line;
private final TextNMSPacketEntity textEntity;
private final DisplayText displayText;
private boolean displayTextChanged;
public TextLineTracker(
BaseTextHologramLine line,
NMSManager nmsManager,
LineClickListener lineClickListener,
ActivePlaceholderTracker placeholderTracker) {
super(line, nmsManager, lineClickListener);
this.line = line;
this.textEntity = nmsManager.newTextPacketEntity();
this.displayText = new DisplayText(placeholderTracker);
}
@Override
public BaseTextHologramLine getLine() {
return line;
}
@Override
protected boolean updatePlaceholders() {
boolean placeholdersChanged = displayText.updateReplacements(getViewers());
if (placeholdersChanged) {
displayTextChanged = true; // Mark as changed to trigger a packet send with updated placeholders
}
return placeholdersChanged;
}
@Override
protected TextLineViewer createViewer(CachedPlayer cachedPlayer) {
return new TextLineViewer(cachedPlayer, displayText);
}
@MustBeInvokedByOverriders
@Override
protected void detectChanges() {
super.detectChanges();
String displayText = line.getText();
if (!Objects.equals(this.displayText.getUnreplacedText(), displayText)) {
this.displayText.setUnreplacedText(displayText);
this.displayTextChanged = true;
}
boolean allowPlaceholders = line.isAllowPlaceholders();
if (this.displayText.isAllowPlaceholders() != allowPlaceholders) {
this.displayText.setAllowPlaceholders(allowPlaceholders);
this.displayTextChanged = true;
}
}
@MustBeInvokedByOverriders
@Override
protected void clearDetectedChanges() {
super.clearDetectedChanges();
this.displayTextChanged = false;
}
@MustBeInvokedByOverriders
@Override
protected void sendSpawnPackets(Viewers<TextLineViewer> viewers) {
super.sendSpawnPackets(viewers);
IndividualTextPacketGroup spawnPackets = textEntity.newSpawnPackets(positionCoordinates);
viewers.forEach(viewer -> viewer.sendTextPackets(spawnPackets));
}
@MustBeInvokedByOverriders
@Override
protected void sendDestroyPackets(Viewers<TextLineViewer> viewers) {
super.sendDestroyPackets(viewers);
viewers.sendPackets(textEntity.newDestroyPackets());
}
@Override
protected void sendChangesPackets(Viewers<TextLineViewer> viewers) {
super.sendChangesPackets(viewers);
if (displayTextChanged) {
IndividualTextPacketGroup changePackets = textEntity.newChangePackets();
viewers.forEach(viewer -> viewer.sendTextPacketsIfNecessary(changePackets));
}
}
@MustBeInvokedByOverriders
@Override
protected void sendPositionChangePackets(Viewers<TextLineViewer> viewers) {
super.sendPositionChangePackets(viewers);
viewers.sendPackets(textEntity.newTeleportPackets(positionCoordinates));
}
@Override
protected double getViewRange() {
return 64;
}
}