did whatever to fix older client holos - #71

Merged
Tofaa2 merged 2 commits into
Tofaa2:masterfrom
InstantlyMoist:fix/hologram-older-client
Jul 4, 2026
Merged

did whatever to fix older client holos#71
Tofaa2 merged 2 commits into
Tofaa2:masterfrom
InstantlyMoist:fix/hologram-older-client

Conversation

@InstantlyMoist

@InstantlyMoistInstantlyMoist commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

good luck have fun

Summary by CodeRabbit

  • New Features
    • NPC hologram name tags can now render across multiple lines using configured line breaks.
  • Bug Fixes
    • Holograms now update more reliably during NPC movement by teleporting to the NPC each sync tick with correct yaw/pitch and sitting-dependent vertical offset.
    • Improved hologram line positioning and alignment after teleporting, including consistent per-line spacing.
    • Removed a post-teleport parent/passenger reassignment behavior for legacy holograms that could affect follow-up teleport state.

@coderabbitai

coderabbitaiBot commented Jul 4, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: e495c8d9-24ef-4b05-bf53-7cf43dae6357

📥 Commits

Reviewing files that changed from the base of the PR and between 1373d6e and 3a6b4fd.

📒 Files selected for processing (1)
  • api/src/main/java/me/tofaa/entitylib/wrapper/hologram/LegacyHologram.java

📝 Walkthrough

Walkthrough

Hologram teleport logic changes in LegacyHologram and ModernHologram, removing passenger re-parenting and instead independently positioning each hologram line. NPC hologram creation always uses the legacy hologram type and renders multi-line names via MiniMessage <br> splitting. NPCMovement now teleports holograms directly instead of setting a parent.

Changes

Hologram teleport and NPC hologram lines

Layer / File(s)Summary
Hologram teleport/parenting core changes
api/.../hologram/LegacyHologram.java, api/.../hologram/ModernHologram.java
LegacyHologram no longer re-parents passengers after teleport; ModernHologram introduces a LINE_SPACING constant and teleports each line individually to a computed offset instead of teleporting only the first line and attaching others as passengers.
NPC hologram creation and update with split lines
spaceNPC/.../npc/NPC.java, spaceNPC/.../npc/NPCMovement.java
Adds a MiniMessage-based helper to split display names into multiple lines on <br>, always creates Hologram.Legacy (removing the protocol-version branch), applies adjusted seated/non-seated Y-offsets, updates hologram lines fully on update, and changes NPCMovement to teleport the hologram to the NPC's location with yaw/pitch instead of setting its parent.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related PRs

  • Tofaa2/EntityLib#52: Modifies the same processViewerSync hologram update logic in NPCMovement.java.
  • Tofaa2/EntityLib#53: Also removes the post-teleport re-parenting behavior in LegacyHologram.teleport(Location).
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 inconclusive)

Check nameStatusExplanationResolution
Title check❓ InconclusiveThe title is vague and non-descriptive, so it does not clearly summarize the main change in the pull request.Replace it with a concise, specific title such as updating hologram behavior for older clients.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java`:
- Around line 331-344: The splitDisplayNameLines helper in NPC should stop using
MiniMessage.serialize(component) and splitting on the literal "<br>" tag, since
that is not a stable multiline delimiter. Update splitDisplayNameLines to split
on real newline characters (or accept already split lines) and then deserialize
each line with MiniMessage.miniMessage(), preserving multiline display names
without mangling literal "<br>" text. Also adjust the related doc comment to
describe newline-based splitting so the behavior is clear.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: c2cfd88b-83de-4afa-a835-b004f1e72a2d

📥 Commits

Reviewing files that changed from the base of the PR and between e797eee and 1373d6e.

📒 Files selected for processing (4)
  • api/src/main/java/me/tofaa/entitylib/wrapper/hologram/LegacyHologram.java
  • api/src/main/java/me/tofaa/entitylib/wrapper/hologram/ModernHologram.java
  • spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java
  • spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPCMovement.java

Comment on lines +331 to +344
private List<Component> splitDisplayNameLines(Component component) {
MiniMessage mm = MiniMessage.miniMessage();
String serialized = mm.serialize(component);
// MiniMessage round-trips <br> as the literal tag string "<br>"
String[] parts = serialized.split("(?i)<br>", -1);
if (parts.length == 1) {
return Collections.singletonList(component);
}
List<Component> lines = new ArrayList<>(parts.length);
for (String part : parts) {
lines.add(mm.deserialize(part));
}
return lines;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🌐 Web query:

MiniMessage <br> newline tag deserialize serialize round trip literal

💡 Result:

In MiniMessage, the newline tag, which can be represented as or
, is used to insert a newline into formatted text [1][2]. Regarding serialization and deserialization round-tripping: 1. Deserialization: When you deserialize a MiniMessage string containing or
, the MiniMessage parser interprets these tags as instructions to include a newline character or structure within the resulting component hierarchy [3][1]. 2. Serialization: When serializing components back into a MiniMessage string, the behavior of how newlines are represented depends on your configuration. While MiniMessage supports these tags, serializing a component tree that contains literal newline characters (\n) or specialized newline components back into a MiniMessage string does not always automatically "round-trip" to the exact original tag (
or ). Often, literal newline characters in a component may be preserved as raw characters in the serialized string, or handled according to the specific serialization logic active in your environment [4][5]. 3. Literal Handling: MiniMessage does not treat literal newline characters (\n) in the input string as special tags; it generally parses them as part of the text content [6][7]. The
and tags are explicit additions provided by the library to allow for cleaner management of multiline text within the MiniMessage format [1][6]. If you are experiencing issues with round-tripping, ensure that your MiniMessage instance is configured correctly and consider whether the component tree itself contains the expected structure (e.g., text components containing \n vs. components relying on newline-specific logic) before serialization [8][7]. There is no automatic, guaranteed 1:1 conversion back to the original
tag for all component types, as the serializer interprets components based on their structure [4][8].

Citations:


🏁 Script executed:

#!/bin/bashset -euo pipefail
# Locate the file and the helper's call sites.
rg -n --hidden --glob '!**/target/**' --glob '!**/build/**' \
'splitDisplayNameLines|createHologram|updateHologram' \
spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java \
spaceNPC/src/main/java ||true# Show the surrounding code for the helper and its callers.
python3 - <<'PY'from pathlib import Pathp = Path("spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java")if p.exists(): lines = p.read_text().splitlines() for start in [300, 330, 360]: end = min(len(lines), start + 70) print(f"\n--- {p}:{start+1}-{end} ---") for i in range(start, end): print(f"{i+1:4d}: {lines[i]}")PY

Repository: Tofaa2/EntityLib

Length of output: 11084


Split on actual newlines instead of re-serializing MiniMessage

MiniMessage.serialize(component) does not preserve <br> as a stable delimiter, so multiline names can collapse into one hologram line and literal <br> text can be mangled. Update this helper (and its doc comment) to split on real \n or accept pre-split lines.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java` around lines 331 -
344, The splitDisplayNameLines helper in NPC should stop using
MiniMessage.serialize(component) and splitting on the literal "<br>" tag, since
that is not a stable multiline delimiter. Update splitDisplayNameLines to split
on real newline characters (or accept already split lines) and then deserialize
each line with MiniMessage.miniMessage(), preserving multiline display names
without mangling literal "<br>" text. Also adjust the related doc comment to
describe newline-based splitting so the behavior is clear.

@Tofaa2
Tofaa2 merged commit ee500f4 into Tofaa2:masterJul 4, 2026
1 of 2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@InstantlyMoist@Tofaa2
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

did whatever to fix older client holos - #71

Merged
Tofaa2 merged 2 commits into
Tofaa2:masterfrom
InstantlyMoist:fix/hologram-older-client
Jul 4, 2026
Merged

did whatever to fix older client holos#71
Tofaa2 merged 2 commits into
Tofaa2:masterfrom
InstantlyMoist:fix/hologram-older-client

Conversation

@InstantlyMoist

@InstantlyMoistInstantlyMoist commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

good luck have fun

Summary by CodeRabbit

  • New Features
    • NPC hologram name tags can now render across multiple lines using configured line breaks.
  • Bug Fixes
    • Holograms now update more reliably during NPC movement by teleporting to the NPC each sync tick with correct yaw/pitch and sitting-dependent vertical offset.
    • Improved hologram line positioning and alignment after teleporting, including consistent per-line spacing.
    • Removed a post-teleport parent/passenger reassignment behavior for legacy holograms that could affect follow-up teleport state.

@coderabbitai

coderabbitaiBot commented Jul 4, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: e495c8d9-24ef-4b05-bf53-7cf43dae6357

📥 Commits

Reviewing files that changed from the base of the PR and between 1373d6e and 3a6b4fd.

📒 Files selected for processing (1)
  • api/src/main/java/me/tofaa/entitylib/wrapper/hologram/LegacyHologram.java

📝 Walkthrough

Walkthrough

Hologram teleport logic changes in LegacyHologram and ModernHologram, removing passenger re-parenting and instead independently positioning each hologram line. NPC hologram creation always uses the legacy hologram type and renders multi-line names via MiniMessage <br> splitting. NPCMovement now teleports holograms directly instead of setting a parent.

Changes

Hologram teleport and NPC hologram lines

Layer / File(s)Summary
Hologram teleport/parenting core changes
api/.../hologram/LegacyHologram.java, api/.../hologram/ModernHologram.java
LegacyHologram no longer re-parents passengers after teleport; ModernHologram introduces a LINE_SPACING constant and teleports each line individually to a computed offset instead of teleporting only the first line and attaching others as passengers.
NPC hologram creation and update with split lines
spaceNPC/.../npc/NPC.java, spaceNPC/.../npc/NPCMovement.java
Adds a MiniMessage-based helper to split display names into multiple lines on <br>, always creates Hologram.Legacy (removing the protocol-version branch), applies adjusted seated/non-seated Y-offsets, updates hologram lines fully on update, and changes NPCMovement to teleport the hologram to the NPC's location with yaw/pitch instead of setting its parent.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related PRs

  • Tofaa2/EntityLib#52: Modifies the same processViewerSync hologram update logic in NPCMovement.java.
  • Tofaa2/EntityLib#53: Also removes the post-teleport re-parenting behavior in LegacyHologram.teleport(Location).
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 inconclusive)

Check nameStatusExplanationResolution
Title check❓ InconclusiveThe title is vague and non-descriptive, so it does not clearly summarize the main change in the pull request.Replace it with a concise, specific title such as updating hologram behavior for older clients.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java`:
- Around line 331-344: The splitDisplayNameLines helper in NPC should stop using
MiniMessage.serialize(component) and splitting on the literal "<br>" tag, since
that is not a stable multiline delimiter. Update splitDisplayNameLines to split
on real newline characters (or accept already split lines) and then deserialize
each line with MiniMessage.miniMessage(), preserving multiline display names
without mangling literal "<br>" text. Also adjust the related doc comment to
describe newline-based splitting so the behavior is clear.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: c2cfd88b-83de-4afa-a835-b004f1e72a2d

📥 Commits

Reviewing files that changed from the base of the PR and between e797eee and 1373d6e.

📒 Files selected for processing (4)
  • api/src/main/java/me/tofaa/entitylib/wrapper/hologram/LegacyHologram.java
  • api/src/main/java/me/tofaa/entitylib/wrapper/hologram/ModernHologram.java
  • spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java
  • spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPCMovement.java

Comment on lines +331 to +344
private List<Component> splitDisplayNameLines(Component component) {
MiniMessage mm = MiniMessage.miniMessage();
String serialized = mm.serialize(component);
// MiniMessage round-trips <br> as the literal tag string "<br>"
String[] parts = serialized.split("(?i)<br>", -1);
if (parts.length == 1) {
return Collections.singletonList(component);
}
List<Component> lines = new ArrayList<>(parts.length);
for (String part : parts) {
lines.add(mm.deserialize(part));
}
return lines;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🌐 Web query:

MiniMessage <br> newline tag deserialize serialize round trip literal

💡 Result:

In MiniMessage, the newline tag, which can be represented as or
, is used to insert a newline into formatted text [1][2]. Regarding serialization and deserialization round-tripping: 1. Deserialization: When you deserialize a MiniMessage string containing or
, the MiniMessage parser interprets these tags as instructions to include a newline character or structure within the resulting component hierarchy [3][1]. 2. Serialization: When serializing components back into a MiniMessage string, the behavior of how newlines are represented depends on your configuration. While MiniMessage supports these tags, serializing a component tree that contains literal newline characters (\n) or specialized newline components back into a MiniMessage string does not always automatically "round-trip" to the exact original tag (
or ). Often, literal newline characters in a component may be preserved as raw characters in the serialized string, or handled according to the specific serialization logic active in your environment [4][5]. 3. Literal Handling: MiniMessage does not treat literal newline characters (\n) in the input string as special tags; it generally parses them as part of the text content [6][7]. The
and tags are explicit additions provided by the library to allow for cleaner management of multiline text within the MiniMessage format [1][6]. If you are experiencing issues with round-tripping, ensure that your MiniMessage instance is configured correctly and consider whether the component tree itself contains the expected structure (e.g., text components containing \n vs. components relying on newline-specific logic) before serialization [8][7]. There is no automatic, guaranteed 1:1 conversion back to the original
tag for all component types, as the serializer interprets components based on their structure [4][8].

Citations:


🏁 Script executed:

#!/bin/bashset -euo pipefail
# Locate the file and the helper's call sites.
rg -n --hidden --glob '!**/target/**' --glob '!**/build/**' \
'splitDisplayNameLines|createHologram|updateHologram' \
spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java \
spaceNPC/src/main/java ||true# Show the surrounding code for the helper and its callers.
python3 - <<'PY'from pathlib import Pathp = Path("spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java")if p.exists(): lines = p.read_text().splitlines() for start in [300, 330, 360]: end = min(len(lines), start + 70) print(f"\n--- {p}:{start+1}-{end} ---") for i in range(start, end): print(f"{i+1:4d}: {lines[i]}")PY

Repository: Tofaa2/EntityLib

Length of output: 11084


Split on actual newlines instead of re-serializing MiniMessage

MiniMessage.serialize(component) does not preserve <br> as a stable delimiter, so multiline names can collapse into one hologram line and literal <br> text can be mangled. Update this helper (and its doc comment) to split on real \n or accept pre-split lines.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java` around lines 331 -
344, The splitDisplayNameLines helper in NPC should stop using
MiniMessage.serialize(component) and splitting on the literal "<br>" tag, since
that is not a stable multiline delimiter. Update splitDisplayNameLines to split
on real newline characters (or accept already split lines) and then deserialize
each line with MiniMessage.miniMessage(), preserving multiline display names
without mangling literal "<br>" text. Also adjust the related doc comment to
describe newline-based splitting so the behavior is clear.

@Tofaa2
Tofaa2 merged commit ee500f4 into Tofaa2:masterJul 4, 2026
1 of 2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@InstantlyMoist@Tofaa2
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

did whatever to fix older client holos - #71

Merged
Tofaa2 merged 2 commits into
Tofaa2:masterfrom
InstantlyMoist:fix/hologram-older-client
Jul 4, 2026
Merged

did whatever to fix older client holos#71
Tofaa2 merged 2 commits into
Tofaa2:masterfrom
InstantlyMoist:fix/hologram-older-client

Conversation

@InstantlyMoist

@InstantlyMoistInstantlyMoist commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

good luck have fun

Summary by CodeRabbit

  • New Features
    • NPC hologram name tags can now render across multiple lines using configured line breaks.
  • Bug Fixes
    • Holograms now update more reliably during NPC movement by teleporting to the NPC each sync tick with correct yaw/pitch and sitting-dependent vertical offset.
    • Improved hologram line positioning and alignment after teleporting, including consistent per-line spacing.
    • Removed a post-teleport parent/passenger reassignment behavior for legacy holograms that could affect follow-up teleport state.

@coderabbitai

coderabbitaiBot commented Jul 4, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: e495c8d9-24ef-4b05-bf53-7cf43dae6357

📥 Commits

Reviewing files that changed from the base of the PR and between 1373d6e and 3a6b4fd.

📒 Files selected for processing (1)
  • api/src/main/java/me/tofaa/entitylib/wrapper/hologram/LegacyHologram.java

📝 Walkthrough

Walkthrough

Hologram teleport logic changes in LegacyHologram and ModernHologram, removing passenger re-parenting and instead independently positioning each hologram line. NPC hologram creation always uses the legacy hologram type and renders multi-line names via MiniMessage <br> splitting. NPCMovement now teleports holograms directly instead of setting a parent.

Changes

Hologram teleport and NPC hologram lines

Layer / File(s)Summary
Hologram teleport/parenting core changes
api/.../hologram/LegacyHologram.java, api/.../hologram/ModernHologram.java
LegacyHologram no longer re-parents passengers after teleport; ModernHologram introduces a LINE_SPACING constant and teleports each line individually to a computed offset instead of teleporting only the first line and attaching others as passengers.
NPC hologram creation and update with split lines
spaceNPC/.../npc/NPC.java, spaceNPC/.../npc/NPCMovement.java
Adds a MiniMessage-based helper to split display names into multiple lines on <br>, always creates Hologram.Legacy (removing the protocol-version branch), applies adjusted seated/non-seated Y-offsets, updates hologram lines fully on update, and changes NPCMovement to teleport the hologram to the NPC's location with yaw/pitch instead of setting its parent.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related PRs

  • Tofaa2/EntityLib#52: Modifies the same processViewerSync hologram update logic in NPCMovement.java.
  • Tofaa2/EntityLib#53: Also removes the post-teleport re-parenting behavior in LegacyHologram.teleport(Location).
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 inconclusive)

Check nameStatusExplanationResolution
Title check❓ InconclusiveThe title is vague and non-descriptive, so it does not clearly summarize the main change in the pull request.Replace it with a concise, specific title such as updating hologram behavior for older clients.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java`:
- Around line 331-344: The splitDisplayNameLines helper in NPC should stop using
MiniMessage.serialize(component) and splitting on the literal "<br>" tag, since
that is not a stable multiline delimiter. Update splitDisplayNameLines to split
on real newline characters (or accept already split lines) and then deserialize
each line with MiniMessage.miniMessage(), preserving multiline display names
without mangling literal "<br>" text. Also adjust the related doc comment to
describe newline-based splitting so the behavior is clear.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: c2cfd88b-83de-4afa-a835-b004f1e72a2d

📥 Commits

Reviewing files that changed from the base of the PR and between e797eee and 1373d6e.

📒 Files selected for processing (4)
  • api/src/main/java/me/tofaa/entitylib/wrapper/hologram/LegacyHologram.java
  • api/src/main/java/me/tofaa/entitylib/wrapper/hologram/ModernHologram.java
  • spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java
  • spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPCMovement.java

Comment on lines +331 to +344
private List<Component> splitDisplayNameLines(Component component) {
MiniMessage mm = MiniMessage.miniMessage();
String serialized = mm.serialize(component);
// MiniMessage round-trips <br> as the literal tag string "<br>"
String[] parts = serialized.split("(?i)<br>", -1);
if (parts.length == 1) {
return Collections.singletonList(component);
}
List<Component> lines = new ArrayList<>(parts.length);
for (String part : parts) {
lines.add(mm.deserialize(part));
}
return lines;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🌐 Web query:

MiniMessage <br> newline tag deserialize serialize round trip literal

💡 Result:

In MiniMessage, the newline tag, which can be represented as or
, is used to insert a newline into formatted text [1][2]. Regarding serialization and deserialization round-tripping: 1. Deserialization: When you deserialize a MiniMessage string containing or
, the MiniMessage parser interprets these tags as instructions to include a newline character or structure within the resulting component hierarchy [3][1]. 2. Serialization: When serializing components back into a MiniMessage string, the behavior of how newlines are represented depends on your configuration. While MiniMessage supports these tags, serializing a component tree that contains literal newline characters (\n) or specialized newline components back into a MiniMessage string does not always automatically "round-trip" to the exact original tag (
or ). Often, literal newline characters in a component may be preserved as raw characters in the serialized string, or handled according to the specific serialization logic active in your environment [4][5]. 3. Literal Handling: MiniMessage does not treat literal newline characters (\n) in the input string as special tags; it generally parses them as part of the text content [6][7]. The
and tags are explicit additions provided by the library to allow for cleaner management of multiline text within the MiniMessage format [1][6]. If you are experiencing issues with round-tripping, ensure that your MiniMessage instance is configured correctly and consider whether the component tree itself contains the expected structure (e.g., text components containing \n vs. components relying on newline-specific logic) before serialization [8][7]. There is no automatic, guaranteed 1:1 conversion back to the original
tag for all component types, as the serializer interprets components based on their structure [4][8].

Citations:


🏁 Script executed:

#!/bin/bashset -euo pipefail
# Locate the file and the helper's call sites.
rg -n --hidden --glob '!**/target/**' --glob '!**/build/**' \
'splitDisplayNameLines|createHologram|updateHologram' \
spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java \
spaceNPC/src/main/java ||true# Show the surrounding code for the helper and its callers.
python3 - <<'PY'from pathlib import Pathp = Path("spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java")if p.exists(): lines = p.read_text().splitlines() for start in [300, 330, 360]: end = min(len(lines), start + 70) print(f"\n--- {p}:{start+1}-{end} ---") for i in range(start, end): print(f"{i+1:4d}: {lines[i]}")PY

Repository: Tofaa2/EntityLib

Length of output: 11084


Split on actual newlines instead of re-serializing MiniMessage

MiniMessage.serialize(component) does not preserve <br> as a stable delimiter, so multiline names can collapse into one hologram line and literal <br> text can be mangled. Update this helper (and its doc comment) to split on real \n or accept pre-split lines.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java` around lines 331 -
344, The splitDisplayNameLines helper in NPC should stop using
MiniMessage.serialize(component) and splitting on the literal "<br>" tag, since
that is not a stable multiline delimiter. Update splitDisplayNameLines to split
on real newline characters (or accept already split lines) and then deserialize
each line with MiniMessage.miniMessage(), preserving multiline display names
without mangling literal "<br>" text. Also adjust the related doc comment to
describe newline-based splitting so the behavior is clear.

@Tofaa2
Tofaa2 merged commit ee500f4 into Tofaa2:masterJul 4, 2026
1 of 2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@InstantlyMoist@Tofaa2
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

did whatever to fix older client holos - #71

Merged
Tofaa2 merged 2 commits into
Tofaa2:masterfrom
InstantlyMoist:fix/hologram-older-client
Jul 4, 2026
Merged

did whatever to fix older client holos#71
Tofaa2 merged 2 commits into
Tofaa2:masterfrom
InstantlyMoist:fix/hologram-older-client

Conversation

@InstantlyMoist

@InstantlyMoistInstantlyMoist commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

good luck have fun

Summary by CodeRabbit

  • New Features
    • NPC hologram name tags can now render across multiple lines using configured line breaks.
  • Bug Fixes
    • Holograms now update more reliably during NPC movement by teleporting to the NPC each sync tick with correct yaw/pitch and sitting-dependent vertical offset.
    • Improved hologram line positioning and alignment after teleporting, including consistent per-line spacing.
    • Removed a post-teleport parent/passenger reassignment behavior for legacy holograms that could affect follow-up teleport state.

@coderabbitai

coderabbitaiBot commented Jul 4, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: e495c8d9-24ef-4b05-bf53-7cf43dae6357

📥 Commits

Reviewing files that changed from the base of the PR and between 1373d6e and 3a6b4fd.

📒 Files selected for processing (1)
  • api/src/main/java/me/tofaa/entitylib/wrapper/hologram/LegacyHologram.java

📝 Walkthrough

Walkthrough

Hologram teleport logic changes in LegacyHologram and ModernHologram, removing passenger re-parenting and instead independently positioning each hologram line. NPC hologram creation always uses the legacy hologram type and renders multi-line names via MiniMessage <br> splitting. NPCMovement now teleports holograms directly instead of setting a parent.

Changes

Hologram teleport and NPC hologram lines

Layer / File(s)Summary
Hologram teleport/parenting core changes
api/.../hologram/LegacyHologram.java, api/.../hologram/ModernHologram.java
LegacyHologram no longer re-parents passengers after teleport; ModernHologram introduces a LINE_SPACING constant and teleports each line individually to a computed offset instead of teleporting only the first line and attaching others as passengers.
NPC hologram creation and update with split lines
spaceNPC/.../npc/NPC.java, spaceNPC/.../npc/NPCMovement.java
Adds a MiniMessage-based helper to split display names into multiple lines on <br>, always creates Hologram.Legacy (removing the protocol-version branch), applies adjusted seated/non-seated Y-offsets, updates hologram lines fully on update, and changes NPCMovement to teleport the hologram to the NPC's location with yaw/pitch instead of setting its parent.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related PRs

  • Tofaa2/EntityLib#52: Modifies the same processViewerSync hologram update logic in NPCMovement.java.
  • Tofaa2/EntityLib#53: Also removes the post-teleport re-parenting behavior in LegacyHologram.teleport(Location).
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 inconclusive)

Check nameStatusExplanationResolution
Title check❓ InconclusiveThe title is vague and non-descriptive, so it does not clearly summarize the main change in the pull request.Replace it with a concise, specific title such as updating hologram behavior for older clients.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java`:
- Around line 331-344: The splitDisplayNameLines helper in NPC should stop using
MiniMessage.serialize(component) and splitting on the literal "<br>" tag, since
that is not a stable multiline delimiter. Update splitDisplayNameLines to split
on real newline characters (or accept already split lines) and then deserialize
each line with MiniMessage.miniMessage(), preserving multiline display names
without mangling literal "<br>" text. Also adjust the related doc comment to
describe newline-based splitting so the behavior is clear.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: c2cfd88b-83de-4afa-a835-b004f1e72a2d

📥 Commits

Reviewing files that changed from the base of the PR and between e797eee and 1373d6e.

📒 Files selected for processing (4)
  • api/src/main/java/me/tofaa/entitylib/wrapper/hologram/LegacyHologram.java
  • api/src/main/java/me/tofaa/entitylib/wrapper/hologram/ModernHologram.java
  • spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java
  • spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPCMovement.java

Comment on lines +331 to +344
private List<Component> splitDisplayNameLines(Component component) {
MiniMessage mm = MiniMessage.miniMessage();
String serialized = mm.serialize(component);
// MiniMessage round-trips <br> as the literal tag string "<br>"
String[] parts = serialized.split("(?i)<br>", -1);
if (parts.length == 1) {
return Collections.singletonList(component);
}
List<Component> lines = new ArrayList<>(parts.length);
for (String part : parts) {
lines.add(mm.deserialize(part));
}
return lines;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🌐 Web query:

MiniMessage <br> newline tag deserialize serialize round trip literal

💡 Result:

In MiniMessage, the newline tag, which can be represented as or
, is used to insert a newline into formatted text [1][2]. Regarding serialization and deserialization round-tripping: 1. Deserialization: When you deserialize a MiniMessage string containing or
, the MiniMessage parser interprets these tags as instructions to include a newline character or structure within the resulting component hierarchy [3][1]. 2. Serialization: When serializing components back into a MiniMessage string, the behavior of how newlines are represented depends on your configuration. While MiniMessage supports these tags, serializing a component tree that contains literal newline characters (\n) or specialized newline components back into a MiniMessage string does not always automatically "round-trip" to the exact original tag (
or ). Often, literal newline characters in a component may be preserved as raw characters in the serialized string, or handled according to the specific serialization logic active in your environment [4][5]. 3. Literal Handling: MiniMessage does not treat literal newline characters (\n) in the input string as special tags; it generally parses them as part of the text content [6][7]. The
and tags are explicit additions provided by the library to allow for cleaner management of multiline text within the MiniMessage format [1][6]. If you are experiencing issues with round-tripping, ensure that your MiniMessage instance is configured correctly and consider whether the component tree itself contains the expected structure (e.g., text components containing \n vs. components relying on newline-specific logic) before serialization [8][7]. There is no automatic, guaranteed 1:1 conversion back to the original
tag for all component types, as the serializer interprets components based on their structure [4][8].

Citations:


🏁 Script executed:

#!/bin/bashset -euo pipefail
# Locate the file and the helper's call sites.
rg -n --hidden --glob '!**/target/**' --glob '!**/build/**' \
'splitDisplayNameLines|createHologram|updateHologram' \
spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java \
spaceNPC/src/main/java ||true# Show the surrounding code for the helper and its callers.
python3 - <<'PY'from pathlib import Pathp = Path("spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java")if p.exists(): lines = p.read_text().splitlines() for start in [300, 330, 360]: end = min(len(lines), start + 70) print(f"\n--- {p}:{start+1}-{end} ---") for i in range(start, end): print(f"{i+1:4d}: {lines[i]}")PY

Repository: Tofaa2/EntityLib

Length of output: 11084


Split on actual newlines instead of re-serializing MiniMessage

MiniMessage.serialize(component) does not preserve <br> as a stable delimiter, so multiline names can collapse into one hologram line and literal <br> text can be mangled. Update this helper (and its doc comment) to split on real \n or accept pre-split lines.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java` around lines 331 -
344, The splitDisplayNameLines helper in NPC should stop using
MiniMessage.serialize(component) and splitting on the literal "<br>" tag, since
that is not a stable multiline delimiter. Update splitDisplayNameLines to split
on real newline characters (or accept already split lines) and then deserialize
each line with MiniMessage.miniMessage(), preserving multiline display names
without mangling literal "<br>" text. Also adjust the related doc comment to
describe newline-based splitting so the behavior is clear.

@Tofaa2
Tofaa2 merged commit ee500f4 into Tofaa2:masterJul 4, 2026
1 of 2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@InstantlyMoist@Tofaa2
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

did whatever to fix older client holos - #71

Merged
Tofaa2 merged 2 commits into
Tofaa2:masterfrom
InstantlyMoist:fix/hologram-older-client
Jul 4, 2026
Merged

did whatever to fix older client holos#71
Tofaa2 merged 2 commits into
Tofaa2:masterfrom
InstantlyMoist:fix/hologram-older-client

Conversation

@InstantlyMoist

@InstantlyMoistInstantlyMoist commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

good luck have fun

Summary by CodeRabbit

  • New Features
    • NPC hologram name tags can now render across multiple lines using configured line breaks.
  • Bug Fixes
    • Holograms now update more reliably during NPC movement by teleporting to the NPC each sync tick with correct yaw/pitch and sitting-dependent vertical offset.
    • Improved hologram line positioning and alignment after teleporting, including consistent per-line spacing.
    • Removed a post-teleport parent/passenger reassignment behavior for legacy holograms that could affect follow-up teleport state.

@coderabbitai

coderabbitaiBot commented Jul 4, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: e495c8d9-24ef-4b05-bf53-7cf43dae6357

📥 Commits

Reviewing files that changed from the base of the PR and between 1373d6e and 3a6b4fd.

📒 Files selected for processing (1)
  • api/src/main/java/me/tofaa/entitylib/wrapper/hologram/LegacyHologram.java

📝 Walkthrough

Walkthrough

Hologram teleport logic changes in LegacyHologram and ModernHologram, removing passenger re-parenting and instead independently positioning each hologram line. NPC hologram creation always uses the legacy hologram type and renders multi-line names via MiniMessage <br> splitting. NPCMovement now teleports holograms directly instead of setting a parent.

Changes

Hologram teleport and NPC hologram lines

Layer / File(s)Summary
Hologram teleport/parenting core changes
api/.../hologram/LegacyHologram.java, api/.../hologram/ModernHologram.java
LegacyHologram no longer re-parents passengers after teleport; ModernHologram introduces a LINE_SPACING constant and teleports each line individually to a computed offset instead of teleporting only the first line and attaching others as passengers.
NPC hologram creation and update with split lines
spaceNPC/.../npc/NPC.java, spaceNPC/.../npc/NPCMovement.java
Adds a MiniMessage-based helper to split display names into multiple lines on <br>, always creates Hologram.Legacy (removing the protocol-version branch), applies adjusted seated/non-seated Y-offsets, updates hologram lines fully on update, and changes NPCMovement to teleport the hologram to the NPC's location with yaw/pitch instead of setting its parent.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related PRs

  • Tofaa2/EntityLib#52: Modifies the same processViewerSync hologram update logic in NPCMovement.java.
  • Tofaa2/EntityLib#53: Also removes the post-teleport re-parenting behavior in LegacyHologram.teleport(Location).
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 inconclusive)

Check nameStatusExplanationResolution
Title check❓ InconclusiveThe title is vague and non-descriptive, so it does not clearly summarize the main change in the pull request.Replace it with a concise, specific title such as updating hologram behavior for older clients.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java`:
- Around line 331-344: The splitDisplayNameLines helper in NPC should stop using
MiniMessage.serialize(component) and splitting on the literal "<br>" tag, since
that is not a stable multiline delimiter. Update splitDisplayNameLines to split
on real newline characters (or accept already split lines) and then deserialize
each line with MiniMessage.miniMessage(), preserving multiline display names
without mangling literal "<br>" text. Also adjust the related doc comment to
describe newline-based splitting so the behavior is clear.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: c2cfd88b-83de-4afa-a835-b004f1e72a2d

📥 Commits

Reviewing files that changed from the base of the PR and between e797eee and 1373d6e.

📒 Files selected for processing (4)
  • api/src/main/java/me/tofaa/entitylib/wrapper/hologram/LegacyHologram.java
  • api/src/main/java/me/tofaa/entitylib/wrapper/hologram/ModernHologram.java
  • spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java
  • spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPCMovement.java

Comment on lines +331 to +344
private List<Component> splitDisplayNameLines(Component component) {
MiniMessage mm = MiniMessage.miniMessage();
String serialized = mm.serialize(component);
// MiniMessage round-trips <br> as the literal tag string "<br>"
String[] parts = serialized.split("(?i)<br>", -1);
if (parts.length == 1) {
return Collections.singletonList(component);
}
List<Component> lines = new ArrayList<>(parts.length);
for (String part : parts) {
lines.add(mm.deserialize(part));
}
return lines;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🌐 Web query:

MiniMessage <br> newline tag deserialize serialize round trip literal

💡 Result:

In MiniMessage, the newline tag, which can be represented as or
, is used to insert a newline into formatted text [1][2]. Regarding serialization and deserialization round-tripping: 1. Deserialization: When you deserialize a MiniMessage string containing or
, the MiniMessage parser interprets these tags as instructions to include a newline character or structure within the resulting component hierarchy [3][1]. 2. Serialization: When serializing components back into a MiniMessage string, the behavior of how newlines are represented depends on your configuration. While MiniMessage supports these tags, serializing a component tree that contains literal newline characters (\n) or specialized newline components back into a MiniMessage string does not always automatically "round-trip" to the exact original tag (
or ). Often, literal newline characters in a component may be preserved as raw characters in the serialized string, or handled according to the specific serialization logic active in your environment [4][5]. 3. Literal Handling: MiniMessage does not treat literal newline characters (\n) in the input string as special tags; it generally parses them as part of the text content [6][7]. The
and tags are explicit additions provided by the library to allow for cleaner management of multiline text within the MiniMessage format [1][6]. If you are experiencing issues with round-tripping, ensure that your MiniMessage instance is configured correctly and consider whether the component tree itself contains the expected structure (e.g., text components containing \n vs. components relying on newline-specific logic) before serialization [8][7]. There is no automatic, guaranteed 1:1 conversion back to the original
tag for all component types, as the serializer interprets components based on their structure [4][8].

Citations:


🏁 Script executed:

#!/bin/bashset -euo pipefail
# Locate the file and the helper's call sites.
rg -n --hidden --glob '!**/target/**' --glob '!**/build/**' \
'splitDisplayNameLines|createHologram|updateHologram' \
spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java \
spaceNPC/src/main/java ||true# Show the surrounding code for the helper and its callers.
python3 - <<'PY'from pathlib import Pathp = Path("spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java")if p.exists(): lines = p.read_text().splitlines() for start in [300, 330, 360]: end = min(len(lines), start + 70) print(f"\n--- {p}:{start+1}-{end} ---") for i in range(start, end): print(f"{i+1:4d}: {lines[i]}")PY

Repository: Tofaa2/EntityLib

Length of output: 11084


Split on actual newlines instead of re-serializing MiniMessage

MiniMessage.serialize(component) does not preserve <br> as a stable delimiter, so multiline names can collapse into one hologram line and literal <br> text can be mangled. Update this helper (and its doc comment) to split on real \n or accept pre-split lines.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java` around lines 331 -
344, The splitDisplayNameLines helper in NPC should stop using
MiniMessage.serialize(component) and splitting on the literal "<br>" tag, since
that is not a stable multiline delimiter. Update splitDisplayNameLines to split
on real newline characters (or accept already split lines) and then deserialize
each line with MiniMessage.miniMessage(), preserving multiline display names
without mangling literal "<br>" text. Also adjust the related doc comment to
describe newline-based splitting so the behavior is clear.

@Tofaa2
Tofaa2 merged commit ee500f4 into Tofaa2:masterJul 4, 2026
1 of 2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@InstantlyMoist@Tofaa2
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

did whatever to fix older client holos - #71

Merged
Tofaa2 merged 2 commits into
Tofaa2:masterfrom
InstantlyMoist:fix/hologram-older-client
Jul 4, 2026
Merged

did whatever to fix older client holos#71
Tofaa2 merged 2 commits into
Tofaa2:masterfrom
InstantlyMoist:fix/hologram-older-client

Conversation

@InstantlyMoist

@InstantlyMoistInstantlyMoist commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

good luck have fun

Summary by CodeRabbit

  • New Features
    • NPC hologram name tags can now render across multiple lines using configured line breaks.
  • Bug Fixes
    • Holograms now update more reliably during NPC movement by teleporting to the NPC each sync tick with correct yaw/pitch and sitting-dependent vertical offset.
    • Improved hologram line positioning and alignment after teleporting, including consistent per-line spacing.
    • Removed a post-teleport parent/passenger reassignment behavior for legacy holograms that could affect follow-up teleport state.

@coderabbitai

coderabbitaiBot commented Jul 4, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: e495c8d9-24ef-4b05-bf53-7cf43dae6357

📥 Commits

Reviewing files that changed from the base of the PR and between 1373d6e and 3a6b4fd.

📒 Files selected for processing (1)
  • api/src/main/java/me/tofaa/entitylib/wrapper/hologram/LegacyHologram.java

📝 Walkthrough

Walkthrough

Hologram teleport logic changes in LegacyHologram and ModernHologram, removing passenger re-parenting and instead independently positioning each hologram line. NPC hologram creation always uses the legacy hologram type and renders multi-line names via MiniMessage <br> splitting. NPCMovement now teleports holograms directly instead of setting a parent.

Changes

Hologram teleport and NPC hologram lines

Layer / File(s)Summary
Hologram teleport/parenting core changes
api/.../hologram/LegacyHologram.java, api/.../hologram/ModernHologram.java
LegacyHologram no longer re-parents passengers after teleport; ModernHologram introduces a LINE_SPACING constant and teleports each line individually to a computed offset instead of teleporting only the first line and attaching others as passengers.
NPC hologram creation and update with split lines
spaceNPC/.../npc/NPC.java, spaceNPC/.../npc/NPCMovement.java
Adds a MiniMessage-based helper to split display names into multiple lines on <br>, always creates Hologram.Legacy (removing the protocol-version branch), applies adjusted seated/non-seated Y-offsets, updates hologram lines fully on update, and changes NPCMovement to teleport the hologram to the NPC's location with yaw/pitch instead of setting its parent.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related PRs

  • Tofaa2/EntityLib#52: Modifies the same processViewerSync hologram update logic in NPCMovement.java.
  • Tofaa2/EntityLib#53: Also removes the post-teleport re-parenting behavior in LegacyHologram.teleport(Location).
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 inconclusive)

Check nameStatusExplanationResolution
Title check❓ InconclusiveThe title is vague and non-descriptive, so it does not clearly summarize the main change in the pull request.Replace it with a concise, specific title such as updating hologram behavior for older clients.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java`:
- Around line 331-344: The splitDisplayNameLines helper in NPC should stop using
MiniMessage.serialize(component) and splitting on the literal "<br>" tag, since
that is not a stable multiline delimiter. Update splitDisplayNameLines to split
on real newline characters (or accept already split lines) and then deserialize
each line with MiniMessage.miniMessage(), preserving multiline display names
without mangling literal "<br>" text. Also adjust the related doc comment to
describe newline-based splitting so the behavior is clear.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: c2cfd88b-83de-4afa-a835-b004f1e72a2d

📥 Commits

Reviewing files that changed from the base of the PR and between e797eee and 1373d6e.

📒 Files selected for processing (4)
  • api/src/main/java/me/tofaa/entitylib/wrapper/hologram/LegacyHologram.java
  • api/src/main/java/me/tofaa/entitylib/wrapper/hologram/ModernHologram.java
  • spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java
  • spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPCMovement.java

Comment on lines +331 to +344
private List<Component> splitDisplayNameLines(Component component) {
MiniMessage mm = MiniMessage.miniMessage();
String serialized = mm.serialize(component);
// MiniMessage round-trips <br> as the literal tag string "<br>"
String[] parts = serialized.split("(?i)<br>", -1);
if (parts.length == 1) {
return Collections.singletonList(component);
}
List<Component> lines = new ArrayList<>(parts.length);
for (String part : parts) {
lines.add(mm.deserialize(part));
}
return lines;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🌐 Web query:

MiniMessage <br> newline tag deserialize serialize round trip literal

💡 Result:

In MiniMessage, the newline tag, which can be represented as or
, is used to insert a newline into formatted text [1][2]. Regarding serialization and deserialization round-tripping: 1. Deserialization: When you deserialize a MiniMessage string containing or
, the MiniMessage parser interprets these tags as instructions to include a newline character or structure within the resulting component hierarchy [3][1]. 2. Serialization: When serializing components back into a MiniMessage string, the behavior of how newlines are represented depends on your configuration. While MiniMessage supports these tags, serializing a component tree that contains literal newline characters (\n) or specialized newline components back into a MiniMessage string does not always automatically "round-trip" to the exact original tag (
or ). Often, literal newline characters in a component may be preserved as raw characters in the serialized string, or handled according to the specific serialization logic active in your environment [4][5]. 3. Literal Handling: MiniMessage does not treat literal newline characters (\n) in the input string as special tags; it generally parses them as part of the text content [6][7]. The
and tags are explicit additions provided by the library to allow for cleaner management of multiline text within the MiniMessage format [1][6]. If you are experiencing issues with round-tripping, ensure that your MiniMessage instance is configured correctly and consider whether the component tree itself contains the expected structure (e.g., text components containing \n vs. components relying on newline-specific logic) before serialization [8][7]. There is no automatic, guaranteed 1:1 conversion back to the original
tag for all component types, as the serializer interprets components based on their structure [4][8].

Citations:


🏁 Script executed:

#!/bin/bashset -euo pipefail
# Locate the file and the helper's call sites.
rg -n --hidden --glob '!**/target/**' --glob '!**/build/**' \
'splitDisplayNameLines|createHologram|updateHologram' \
spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java \
spaceNPC/src/main/java ||true# Show the surrounding code for the helper and its callers.
python3 - <<'PY'from pathlib import Pathp = Path("spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java")if p.exists(): lines = p.read_text().splitlines() for start in [300, 330, 360]: end = min(len(lines), start + 70) print(f"\n--- {p}:{start+1}-{end} ---") for i in range(start, end): print(f"{i+1:4d}: {lines[i]}")PY

Repository: Tofaa2/EntityLib

Length of output: 11084


Split on actual newlines instead of re-serializing MiniMessage

MiniMessage.serialize(component) does not preserve <br> as a stable delimiter, so multiline names can collapse into one hologram line and literal <br> text can be mangled. Update this helper (and its doc comment) to split on real \n or accept pre-split lines.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java` around lines 331 -
344, The splitDisplayNameLines helper in NPC should stop using
MiniMessage.serialize(component) and splitting on the literal "<br>" tag, since
that is not a stable multiline delimiter. Update splitDisplayNameLines to split
on real newline characters (or accept already split lines) and then deserialize
each line with MiniMessage.miniMessage(), preserving multiline display names
without mangling literal "<br>" text. Also adjust the related doc comment to
describe newline-based splitting so the behavior is clear.

@Tofaa2
Tofaa2 merged commit ee500f4 into Tofaa2:masterJul 4, 2026
1 of 2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@InstantlyMoist@Tofaa2
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

did whatever to fix older client holos - #71

Merged
Tofaa2 merged 2 commits into
Tofaa2:masterfrom
InstantlyMoist:fix/hologram-older-client
Jul 4, 2026
Merged

did whatever to fix older client holos#71
Tofaa2 merged 2 commits into
Tofaa2:masterfrom
InstantlyMoist:fix/hologram-older-client

Conversation

@InstantlyMoist

@InstantlyMoistInstantlyMoist commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

good luck have fun

Summary by CodeRabbit

  • New Features
    • NPC hologram name tags can now render across multiple lines using configured line breaks.
  • Bug Fixes
    • Holograms now update more reliably during NPC movement by teleporting to the NPC each sync tick with correct yaw/pitch and sitting-dependent vertical offset.
    • Improved hologram line positioning and alignment after teleporting, including consistent per-line spacing.
    • Removed a post-teleport parent/passenger reassignment behavior for legacy holograms that could affect follow-up teleport state.

@coderabbitai

coderabbitaiBot commented Jul 4, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: e495c8d9-24ef-4b05-bf53-7cf43dae6357

📥 Commits

Reviewing files that changed from the base of the PR and between 1373d6e and 3a6b4fd.

📒 Files selected for processing (1)
  • api/src/main/java/me/tofaa/entitylib/wrapper/hologram/LegacyHologram.java

📝 Walkthrough

Walkthrough

Hologram teleport logic changes in LegacyHologram and ModernHologram, removing passenger re-parenting and instead independently positioning each hologram line. NPC hologram creation always uses the legacy hologram type and renders multi-line names via MiniMessage <br> splitting. NPCMovement now teleports holograms directly instead of setting a parent.

Changes

Hologram teleport and NPC hologram lines

Layer / File(s)Summary
Hologram teleport/parenting core changes
api/.../hologram/LegacyHologram.java, api/.../hologram/ModernHologram.java
LegacyHologram no longer re-parents passengers after teleport; ModernHologram introduces a LINE_SPACING constant and teleports each line individually to a computed offset instead of teleporting only the first line and attaching others as passengers.
NPC hologram creation and update with split lines
spaceNPC/.../npc/NPC.java, spaceNPC/.../npc/NPCMovement.java
Adds a MiniMessage-based helper to split display names into multiple lines on <br>, always creates Hologram.Legacy (removing the protocol-version branch), applies adjusted seated/non-seated Y-offsets, updates hologram lines fully on update, and changes NPCMovement to teleport the hologram to the NPC's location with yaw/pitch instead of setting its parent.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related PRs

  • Tofaa2/EntityLib#52: Modifies the same processViewerSync hologram update logic in NPCMovement.java.
  • Tofaa2/EntityLib#53: Also removes the post-teleport re-parenting behavior in LegacyHologram.teleport(Location).
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 inconclusive)

Check nameStatusExplanationResolution
Title check❓ InconclusiveThe title is vague and non-descriptive, so it does not clearly summarize the main change in the pull request.Replace it with a concise, specific title such as updating hologram behavior for older clients.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java`:
- Around line 331-344: The splitDisplayNameLines helper in NPC should stop using
MiniMessage.serialize(component) and splitting on the literal "<br>" tag, since
that is not a stable multiline delimiter. Update splitDisplayNameLines to split
on real newline characters (or accept already split lines) and then deserialize
each line with MiniMessage.miniMessage(), preserving multiline display names
without mangling literal "<br>" text. Also adjust the related doc comment to
describe newline-based splitting so the behavior is clear.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: c2cfd88b-83de-4afa-a835-b004f1e72a2d

📥 Commits

Reviewing files that changed from the base of the PR and between e797eee and 1373d6e.

📒 Files selected for processing (4)
  • api/src/main/java/me/tofaa/entitylib/wrapper/hologram/LegacyHologram.java
  • api/src/main/java/me/tofaa/entitylib/wrapper/hologram/ModernHologram.java
  • spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java
  • spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPCMovement.java

Comment on lines +331 to +344
private List<Component> splitDisplayNameLines(Component component) {
MiniMessage mm = MiniMessage.miniMessage();
String serialized = mm.serialize(component);
// MiniMessage round-trips <br> as the literal tag string "<br>"
String[] parts = serialized.split("(?i)<br>", -1);
if (parts.length == 1) {
return Collections.singletonList(component);
}
List<Component> lines = new ArrayList<>(parts.length);
for (String part : parts) {
lines.add(mm.deserialize(part));
}
return lines;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🌐 Web query:

MiniMessage <br> newline tag deserialize serialize round trip literal

💡 Result:

In MiniMessage, the newline tag, which can be represented as or
, is used to insert a newline into formatted text [1][2]. Regarding serialization and deserialization round-tripping: 1. Deserialization: When you deserialize a MiniMessage string containing or
, the MiniMessage parser interprets these tags as instructions to include a newline character or structure within the resulting component hierarchy [3][1]. 2. Serialization: When serializing components back into a MiniMessage string, the behavior of how newlines are represented depends on your configuration. While MiniMessage supports these tags, serializing a component tree that contains literal newline characters (\n) or specialized newline components back into a MiniMessage string does not always automatically "round-trip" to the exact original tag (
or ). Often, literal newline characters in a component may be preserved as raw characters in the serialized string, or handled according to the specific serialization logic active in your environment [4][5]. 3. Literal Handling: MiniMessage does not treat literal newline characters (\n) in the input string as special tags; it generally parses them as part of the text content [6][7]. The
and tags are explicit additions provided by the library to allow for cleaner management of multiline text within the MiniMessage format [1][6]. If you are experiencing issues with round-tripping, ensure that your MiniMessage instance is configured correctly and consider whether the component tree itself contains the expected structure (e.g., text components containing \n vs. components relying on newline-specific logic) before serialization [8][7]. There is no automatic, guaranteed 1:1 conversion back to the original
tag for all component types, as the serializer interprets components based on their structure [4][8].

Citations:


🏁 Script executed:

#!/bin/bashset -euo pipefail
# Locate the file and the helper's call sites.
rg -n --hidden --glob '!**/target/**' --glob '!**/build/**' \
'splitDisplayNameLines|createHologram|updateHologram' \
spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java \
spaceNPC/src/main/java ||true# Show the surrounding code for the helper and its callers.
python3 - <<'PY'from pathlib import Pathp = Path("spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java")if p.exists(): lines = p.read_text().splitlines() for start in [300, 330, 360]: end = min(len(lines), start + 70) print(f"\n--- {p}:{start+1}-{end} ---") for i in range(start, end): print(f"{i+1:4d}: {lines[i]}")PY

Repository: Tofaa2/EntityLib

Length of output: 11084


Split on actual newlines instead of re-serializing MiniMessage

MiniMessage.serialize(component) does not preserve <br> as a stable delimiter, so multiline names can collapse into one hologram line and literal <br> text can be mangled. Update this helper (and its doc comment) to split on real \n or accept pre-split lines.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java` around lines 331 -
344, The splitDisplayNameLines helper in NPC should stop using
MiniMessage.serialize(component) and splitting on the literal "<br>" tag, since
that is not a stable multiline delimiter. Update splitDisplayNameLines to split
on real newline characters (or accept already split lines) and then deserialize
each line with MiniMessage.miniMessage(), preserving multiline display names
without mangling literal "<br>" text. Also adjust the related doc comment to
describe newline-based splitting so the behavior is clear.

@Tofaa2
Tofaa2 merged commit ee500f4 into Tofaa2:masterJul 4, 2026
1 of 2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@InstantlyMoist@Tofaa2
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

did whatever to fix older client holos - #71

Merged
Tofaa2 merged 2 commits into
Tofaa2:masterfrom
InstantlyMoist:fix/hologram-older-client
Jul 4, 2026
Merged

did whatever to fix older client holos#71
Tofaa2 merged 2 commits into
Tofaa2:masterfrom
InstantlyMoist:fix/hologram-older-client

Conversation

@InstantlyMoist

@InstantlyMoistInstantlyMoist commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

good luck have fun

Summary by CodeRabbit

  • New Features
    • NPC hologram name tags can now render across multiple lines using configured line breaks.
  • Bug Fixes
    • Holograms now update more reliably during NPC movement by teleporting to the NPC each sync tick with correct yaw/pitch and sitting-dependent vertical offset.
    • Improved hologram line positioning and alignment after teleporting, including consistent per-line spacing.
    • Removed a post-teleport parent/passenger reassignment behavior for legacy holograms that could affect follow-up teleport state.

@coderabbitai

coderabbitaiBot commented Jul 4, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: e495c8d9-24ef-4b05-bf53-7cf43dae6357

📥 Commits

Reviewing files that changed from the base of the PR and between 1373d6e and 3a6b4fd.

📒 Files selected for processing (1)
  • api/src/main/java/me/tofaa/entitylib/wrapper/hologram/LegacyHologram.java

📝 Walkthrough

Walkthrough

Hologram teleport logic changes in LegacyHologram and ModernHologram, removing passenger re-parenting and instead independently positioning each hologram line. NPC hologram creation always uses the legacy hologram type and renders multi-line names via MiniMessage <br> splitting. NPCMovement now teleports holograms directly instead of setting a parent.

Changes

Hologram teleport and NPC hologram lines

Layer / File(s)Summary
Hologram teleport/parenting core changes
api/.../hologram/LegacyHologram.java, api/.../hologram/ModernHologram.java
LegacyHologram no longer re-parents passengers after teleport; ModernHologram introduces a LINE_SPACING constant and teleports each line individually to a computed offset instead of teleporting only the first line and attaching others as passengers.
NPC hologram creation and update with split lines
spaceNPC/.../npc/NPC.java, spaceNPC/.../npc/NPCMovement.java
Adds a MiniMessage-based helper to split display names into multiple lines on <br>, always creates Hologram.Legacy (removing the protocol-version branch), applies adjusted seated/non-seated Y-offsets, updates hologram lines fully on update, and changes NPCMovement to teleport the hologram to the NPC's location with yaw/pitch instead of setting its parent.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related PRs

  • Tofaa2/EntityLib#52: Modifies the same processViewerSync hologram update logic in NPCMovement.java.
  • Tofaa2/EntityLib#53: Also removes the post-teleport re-parenting behavior in LegacyHologram.teleport(Location).
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 inconclusive)

Check nameStatusExplanationResolution
Title check❓ InconclusiveThe title is vague and non-descriptive, so it does not clearly summarize the main change in the pull request.Replace it with a concise, specific title such as updating hologram behavior for older clients.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java`:
- Around line 331-344: The splitDisplayNameLines helper in NPC should stop using
MiniMessage.serialize(component) and splitting on the literal "<br>" tag, since
that is not a stable multiline delimiter. Update splitDisplayNameLines to split
on real newline characters (or accept already split lines) and then deserialize
each line with MiniMessage.miniMessage(), preserving multiline display names
without mangling literal "<br>" text. Also adjust the related doc comment to
describe newline-based splitting so the behavior is clear.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: c2cfd88b-83de-4afa-a835-b004f1e72a2d

📥 Commits

Reviewing files that changed from the base of the PR and between e797eee and 1373d6e.

📒 Files selected for processing (4)
  • api/src/main/java/me/tofaa/entitylib/wrapper/hologram/LegacyHologram.java
  • api/src/main/java/me/tofaa/entitylib/wrapper/hologram/ModernHologram.java
  • spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java
  • spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPCMovement.java

Comment on lines +331 to +344
private List<Component> splitDisplayNameLines(Component component) {
MiniMessage mm = MiniMessage.miniMessage();
String serialized = mm.serialize(component);
// MiniMessage round-trips <br> as the literal tag string "<br>"
String[] parts = serialized.split("(?i)<br>", -1);
if (parts.length == 1) {
return Collections.singletonList(component);
}
List<Component> lines = new ArrayList<>(parts.length);
for (String part : parts) {
lines.add(mm.deserialize(part));
}
return lines;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🌐 Web query:

MiniMessage <br> newline tag deserialize serialize round trip literal

💡 Result:

In MiniMessage, the newline tag, which can be represented as or
, is used to insert a newline into formatted text [1][2]. Regarding serialization and deserialization round-tripping: 1. Deserialization: When you deserialize a MiniMessage string containing or
, the MiniMessage parser interprets these tags as instructions to include a newline character or structure within the resulting component hierarchy [3][1]. 2. Serialization: When serializing components back into a MiniMessage string, the behavior of how newlines are represented depends on your configuration. While MiniMessage supports these tags, serializing a component tree that contains literal newline characters (\n) or specialized newline components back into a MiniMessage string does not always automatically "round-trip" to the exact original tag (
or ). Often, literal newline characters in a component may be preserved as raw characters in the serialized string, or handled according to the specific serialization logic active in your environment [4][5]. 3. Literal Handling: MiniMessage does not treat literal newline characters (\n) in the input string as special tags; it generally parses them as part of the text content [6][7]. The
and tags are explicit additions provided by the library to allow for cleaner management of multiline text within the MiniMessage format [1][6]. If you are experiencing issues with round-tripping, ensure that your MiniMessage instance is configured correctly and consider whether the component tree itself contains the expected structure (e.g., text components containing \n vs. components relying on newline-specific logic) before serialization [8][7]. There is no automatic, guaranteed 1:1 conversion back to the original
tag for all component types, as the serializer interprets components based on their structure [4][8].

Citations:


🏁 Script executed:

#!/bin/bashset -euo pipefail
# Locate the file and the helper's call sites.
rg -n --hidden --glob '!**/target/**' --glob '!**/build/**' \
'splitDisplayNameLines|createHologram|updateHologram' \
spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java \
spaceNPC/src/main/java ||true# Show the surrounding code for the helper and its callers.
python3 - <<'PY'from pathlib import Pathp = Path("spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java")if p.exists(): lines = p.read_text().splitlines() for start in [300, 330, 360]: end = min(len(lines), start + 70) print(f"\n--- {p}:{start+1}-{end} ---") for i in range(start, end): print(f"{i+1:4d}: {lines[i]}")PY

Repository: Tofaa2/EntityLib

Length of output: 11084


Split on actual newlines instead of re-serializing MiniMessage

MiniMessage.serialize(component) does not preserve <br> as a stable delimiter, so multiline names can collapse into one hologram line and literal <br> text can be mangled. Update this helper (and its doc comment) to split on real \n or accept pre-split lines.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java` around lines 331 -
344, The splitDisplayNameLines helper in NPC should stop using
MiniMessage.serialize(component) and splitting on the literal "<br>" tag, since
that is not a stable multiline delimiter. Update splitDisplayNameLines to split
on real newline characters (or accept already split lines) and then deserialize
each line with MiniMessage.miniMessage(), preserving multiline display names
without mangling literal "<br>" text. Also adjust the related doc comment to
describe newline-based splitting so the behavior is clear.

@Tofaa2
Tofaa2 merged commit ee500f4 into Tofaa2:masterJul 4, 2026
1 of 2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@InstantlyMoist@Tofaa2