Skip to content

Keep Quark's glass item frames aboard sub-levels - #1576

Open
Gerry3010 wants to merge 1 commit into
ryanhcode:mainfrom
Gerry3010:fix/quark-glass-item-frames
Open

Gerry3010 wants to merge 1 commit into
ryanhcode:mainfrom
Gerry3010:fix/quark-glass-item-frames

Conversation

@Gerry3010

Copy link
Copy Markdown

Quark's glass item frame (quark:glass_frame) is missing from sable:wall_entities, so EntitySubLevelUtil.shouldKick returns true for it. The frame is therefore projected out of the plot as soon as it is placed — ServerLevel.addFreshEntityEntitySubLevelUtil.kickEntity on the server, Entity.recreateFromPacket on the client. Out there it holds parent-level coordinates instead of sitting on the sub-level's block grid, so it no longer lines up with the ship or follows it, and with no supporting block behind it ItemFrame.survives() fails on the next check and the frame drops.

org.violetmoon.quark.content.building.entity.GlassItemFrame extends ItemFrame, so it is the same kind of entity as minecraft:item_frame and minecraft:glow_item_frame, which are listed already — as are the frames from Exposure, Labels and Immersive Paintings. The glowing variant shares that entity type (it differs only by a synched IS_SHINY flag), so the single entry covers both items.

required: false, so the tag stays inert without Quark installed.

The symptom was observed on NeoForge 1.21.1 with Sable 2.0.5 and Quark 4.1-482, and the cause traced to shouldKick. In-game confirmation of the patched tag is still pending on our server; the change is data-only and flips exactly that check.

🤖 Generated with Claude Code

@CLAassistant

Copy link
Copy Markdown

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.
You have signed the CLA already but the status is still pending? Let us recheck it.

@Gerry3010

Copy link
Copy Markdown
Author

Confirmed in game since opening this: with quark:glass_frame in the tag, glass item frames placed on a sub-level now stay on the ship's block grid and no longer drop. Tested on a NeoForge 1.21.1 server running Sable 2.0.5, Create Aeronautics 1.3.1 and Quark 4.1-482, on an assembled airship in motion.

Before the change the frame was projected out of the plot the moment it was placed and ItemFrame.survives() dropped it on the next check, exactly as described above.

Gerry3010 pushed a commit to GeraldHofbauerWeb/vanillaplusadditions that referenced this pull request Sep 20, 2026
…hiffe, vier Sable-Reparaturen

Zwei neue Module und vier Fehler, die alle an derselben Stelle haengen: Sable parkt
ein Schiff als Chunk-Plot bei rund 20,48 Millionen Blocken und zeichnet es ueber eine
Pose an seinem echten Ort. Was davon im Plot lebt, entscheidet ein einziger Tag.

mo_arrows (neu)
- Feuerpfeil aus Pfeil und Fire Charge: brennt im Flug, zuendet Ziele an und legt
  Feuer, wo er landet - Letzteres kann nicht mal ein Flammen-Bogen.
- Die Entity ist Vanillas Arrow; das Feuerlegen haengt an ProjectileImpactEvent und
  erkennt den Pfeil an getPickupItemStackOrigin(). Keine eigene Entity, kein Renderer.
- Textur aus Vanillas arrow.png abgeleitet, Farben aus campfire_fire.png; erzeugt von
  scripts/gen_fire_arrow_texture.py und eingecheckt, der Build braucht kein Client-Jar.
- light_fires schaltet nur das Feuerlegen ab, nicht den brennenden Pfeil.

freecam_sublevel_noclip (neu)
- Freecam blieb im Rumpf haengen, waehrend es durch Gelaende flog: Sable reicht auf
  Sublevels nur fuer Scaffolding einen CollisionContext durch, sonst die gecachte Form
  ohne "wer kollidiert" - Freecams Hook wird also nie gefragt.
- Repariert ueber noPhysics am HEAD von Entity.move. Nicht frueher: Player.tick setzt
  das Flag jeden Tick auf isSpectator() zurueck, ein Client-Tick-Handler verpufft.

Sable-Tags (data/sable/tags/entity_type, in vpa_core)
- quark:glass_frame und overpacked:giant_backpack blieben nicht am Schiff: ohne Eintrag
  in sable:retain_in_sub_level wirft EntitySubLevelUtil.shouldKick sie aus dem Plot,
  danach droppt der Rahmen und der Rucksack faellt. Upstream: ryanhcode/sable#1576.

compass_overhaul
- Nadel im Sitz: der Mitfahrer behaelt Weltkoordinaten, aber plot-lokale Gierung. Jetzt
  wird ueber getVehicle() auch seine Position in den Plot gerechnet, wie Sable es tut.
- Weltkompass im Item Frame: das Ziel wird jetzt ab der Elternwelt-Position gemessen.
  Vom Plot aus dominierte der 20-Millionen-Versatz die Richtung statt Norden.
- Rezept: vier Eisenbarren und ein Amethyst-Splitter in der Mitte.

overpacked_extensions
- Die Helfer-Entity fuer das getragene Backpack ueberlebte einen Neustart: SESSIONS ist
  statisch und danach leer, onContainerClose laesst sie deshalb liegen. Sie steckt im
  Spieler, und Overpackeds place_predicate verwirft dann jedes Platzieren aus der Hand
  stumm; ihr Inhalt ist zudem eine Kopie des getragenen - ein Duplikationsweg.
  Jetzt traegt sie den Tag vpa_backpack_helper und wird beim Laden von der Platte
  verworfen. Die Spawn-Position bleibt absichtlich unveraendert.

scripts/deploy.sh
- WEB_TMP liegt in storage/drop statt im Webroot oder /var/tmp. Beide Haelften waren
  kaputt: gerry darf nicht in den Webroot schreiben, und aus /tmp oder /var/tmp darf
  Craft die Datei wegen des Sticky-Bits nicht wegschieben.
- Schlaegt der Upload fehl, gibt es jetzt eine klare Meldung statt eines Tracebacks -
  der alte Asset ist zu dem Zeitpunkt schon geloescht, die Downloadseite also leer.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NfsZa7hQ6SkBArFajVwdWP
@GaMiR9195

Copy link
Copy Markdown

2 lines change? Good.

Sign up for free to 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.

3 participants