Merge pull request #11355 from TheMrZZ/fix/vehicle-damage-command

Route generic damage commands to boats and minecarts
This commit is contained in:
rdbt authored and GitHub committed 2026-11-06 21:18:41 +00:00
commit ad2c0d2ecd
5 files changed
+415 -6

No files matched your search

+6 -1
View File
@@ -1489,7 +1489,12 @@ impl Game<'_> {
self.hurt_boat_result(i, damage, creative).unwrap_or(false)
}
/// None means a canceled hit; Some records whether an accepted hit destroyed it.
fn hurt_boat_result(&mut self, i: usize, mut damage: f32, creative: bool) -> Option<bool> {
pub(super) fn hurt_boat_result(
&mut self,
i: usize,
mut damage: f32,
creative: bool,
) -> Option<bool> {
let mut cancel = false;
self.native_vehicle_damage("boat", &mut damage, &mut cancel);
if cancel {
@@ -194,8 +194,9 @@ impl Game<'_> {
Some(Arg::Coords(_)) => self.position_arg(ctx, "location"),
_ => by.and_then(|t| self.target_position(t)),
};
// A lethal item hit discards it before the success message is built.
let item_name = matches!(target, Target::Item(_)).then(|| self.target_name(target));
// Destruction can remove the target before its success message is built.
let discarded_name = matches!(target, Target::Item(_) | Target::Boat(_) | Target::Cart(_))
.then(|| self.target_name(target));
let hurt = match target {
// The causing mob is the one the hit is credited to and thorns
// answer; the source position gives the knockback its direction.
@@ -264,6 +265,9 @@ impl Game<'_> {
}
}
Target::Item(id) => self.command_damage_item(id, amount, &ty, cause.or(by)),
Target::Boat(_) | Target::Cart(_) => {
self.command_damage_vehicle(target, amount, &ty, cause.or(by))
}
Target::Dragon(id) => self.command_damage_dragon(
id,
amount,
@@ -283,7 +287,7 @@ impl Game<'_> {
if !hurt {
return Err(err("commands.damage.invulnerable", &[]));
}
let name = item_name.unwrap_or_else(|| self.target_name(target));
let name = discarded_name.unwrap_or_else(|| self.target_name(target));
self.feedback(Text::translate(
"commands.damage.success",
&[
@@ -294,6 +298,53 @@ impl Game<'_> {
Ok(1)
}
/// `VehicleEntity.hurtServer`: report acceptance even when the vehicle survives.
fn command_damage_vehicle(
&mut self,
target: Target,
amount: f32,
damage_type: &str,
causing: Option<Target>,
) -> bool {
let registry = &self.motion.health.damage;
let Some(kind) = registry.id(damage_type) else {
return false;
};
let creative = match causing {
Some(Target::Player) => self.creative,
Some(Target::Guest(conn)) => self.command_guest(conn).is_some_and(|g| g.creative()),
_ => false,
};
let id = match target {
Target::Boat(id) | Target::Cart(id) => id,
_ => return false,
};
let invulnerable = self
.persist
.raw
.get(&id)
.is_some_and(|tag| horizon_client::entity_nbt::flag(tag, "Invulnerable"));
if invulnerable && !creative && !registry.in_tag(kind, "minecraft:bypasses_invulnerability")
{
return false;
}
let ignites = registry.in_tag(kind, "minecraft:is_fire")
|| registry.in_tag(kind, "minecraft:is_explosion");
match target {
Target::Boat(_) => self
.boats
.iter()
.position(|b| b.id == id)
.is_some_and(|i| self.hurt_boat_result(i, amount, creative).is_some()),
Target::Cart(_) => self
.carts
.iter()
.position(|c| c.id == id)
.is_some_and(|i| self.hurt_cart_result(i, amount, creative, ignites)),
_ => false,
}
}
/// `ItemEntity.hurtServer`: the item branch reached by `DamageCommand.damage`.
fn command_damage_item(
&mut self,
@@ -2147,3 +2198,138 @@ mod tests {
assert_eq!(point[1..], [64.0, 0.0]);
}
}
#[cfg(test)]
mod vehicle_damage_command_tests {
use crate::game::{Audio, Game, Options, Progress, Settings, load_resources};
use horizon_client::chunk::Chunk;
use horizon_core::position::ChunkPos;
use std::sync::Arc;
fn with_game(test: impl FnOnce(&mut Game<'_>)) {
let root = std::path::PathBuf::from(std::env::var_os("HORIZON_TEST_RESOURCES").unwrap());
let settings = Settings::default();
let loaded = load_resources(
root.clone(),
None,
&root,
&settings,
std::time::Instant::now(),
false,
true,
&Progress::new(),
&mut |_, _| unreachable!(),
)
.unwrap();
let mut options = Options::parse(std::iter::empty()).unwrap().unwrap();
options.resources = root.clone();
options.game_dir = Some(
std::path::PathBuf::from(std::env::var_os("HORIZON_HOME").unwrap())
.join(format!("h050-{:?}", std::thread::current().id())),
);
options.execution_role = crate::game::execution_role::ExecutionRole::IntegratedServer;
let mut game = Game::new(
&loaded.resources,
loaded.pack,
loaded.gui.unwrap(),
options,
settings,
Audio::silent(&root),
None,
)
.unwrap();
game.build_registries();
game.set_allow_commands(true);
game.world
.chunks
.insert((0, 0), Arc::new(Chunk::empty(0, 0)));
game.block_ticks
.add_empty_chunk(ChunkPos::new(0, 0))
.unwrap();
assert!(game.run_command("difficulty normal"));
assert!(game.run_command("forceload add 0 0"));
test(&mut game);
}
#[test]
#[ignore = "needs prepared resources in HORIZON_TEST_RESOURCES"]
fn generic_commands_reach_actual_vehicle_damage_and_drop() {
with_game(|game| {
game.creative = true; // issuer creative is not an attacker
let clock = game.world.game_time;
for (kind, n) in [("oak_boat", 1), ("minecart", 2)] {
let uuid = format!("000001f4-0000-0000-0000-{n:012x}");
assert!(game.run_command(&format!(
"summon {kind} 4.5 200 5.5 {{UUID:[I;500,0,0,{n}],NoGravity:1b}}"
)));
let id = game
.boats
.iter()
.map(|b| b.id)
.chain(game.carts.iter().map(|c| c.id))
.find(|id| game.persist.uuid_of(*id) == Some([500, 0, 0, n]))
.unwrap();
assert!(
game.run_command(&format!("damage {uuid} 1 minecraft:generic")),
"accepted small hit must reach vehicle"
);
let damage = if kind == "oak_boat" {
game.boats.iter().find(|b| b.id == id).unwrap().damage
} else {
game.carts.iter().find(|c| c.id == id).unwrap().damage
};
assert_eq!(damage, 10.0);
assert!(game.run_command(&format!("damage {uuid} 4 minecraft:generic")));
assert!(!game.boats.iter().any(|b| b.id == id));
assert!(!game.carts.iter().any(|c| c.id == id));
assert_eq!(
game.dropped
.iter()
.filter(|d| d.stack.item.as_ref() == format!("minecraft:{kind}")
&& d.stack.count == 1)
.count(),
1
);
let n = n + 2;
let uuid = format!("000001f4-0000-0000-0000-{n:012x}");
assert!(game.run_command(&format!(
"summon {kind} 8.5 200 5.5 {{UUID:[I;500,0,0,{n}],NoGravity:1b}}"
)));
let id = game
.boats
.iter()
.map(|b| b.id)
.chain(game.carts.iter().map(|c| c.id))
.find(|id| game.persist.uuid_of(*id) == Some([500, 0, 0, n]))
.unwrap();
assert!(game.run_command(&format!("damage {uuid} 4 minecraft:generic")));
let damage = if kind == "oak_boat" {
game.boats.iter().find(|b| b.id == id).unwrap().damage
} else {
game.carts.iter().find(|c| c.id == id).unwrap().damage
};
assert_eq!(damage, 40.0, "exact threshold survives");
}
// Fresh rejected subjects avoid relying on vehicle data adoption.
for (kind, n) in [("oak_boat", 5), ("minecart", 6)] {
let uuid = format!("000001f4-0000-0000-0000-{n:012x}");
assert!(game.run_command(&format!("summon {kind} 11.5 200 5.5 {{UUID:[I;500,0,0,{n}],NoGravity:1b,Invulnerable:1b}}")));
let id = game
.boats
.iter()
.map(|b| b.id)
.chain(game.carts.iter().map(|c| c.id))
.find(|id| game.persist.uuid_of(*id) == Some([500, 0, 0, n]))
.unwrap();
assert!(!game.run_command(&format!("damage {uuid} 4 minecraft:generic")));
let damage = if kind == "oak_boat" {
game.boats.iter().find(|b| b.id == id).unwrap().damage
} else {
game.carts.iter().find(|c| c.id == id).unwrap().damage
};
assert_eq!(damage, 0.0);
}
assert_eq!(game.world.game_time, clock);
});
}
}
+14 -2
View File
@@ -2352,12 +2352,23 @@ impl Game<'_> {
/// `VehicleEntity.hurtServer`: shake, add the damage, break past 40 (at
/// once for creative players); TNT minecarts prime instead when moving
/// or hurt by fire or an explosion (`damageSourceIgnitesTnt`).
pub(super) fn hurt_cart(&mut self, i: usize, mut damage: f32, creative: bool, fire: bool) {
pub(super) fn hurt_cart(&mut self, i: usize, damage: f32, creative: bool, fire: bool) {
self.hurt_cart_result(i, damage, creative, fire);
}
/// Accepted damage is distinct from survival, destruction, or TNT priming.
pub(super) fn hurt_cart_result(
&mut self,
i: usize,
mut damage: f32,
creative: bool,
fire: bool,
) -> bool {
let kind = self.carts[i].kind.id();
let mut cancel = false;
self.native_vehicle_damage(kind, &mut damage, &mut cancel);
if cancel {
return;
return false;
}
let destroyed = {
let c = &mut self.carts[i];
@@ -2409,6 +2420,7 @@ impl Game<'_> {
}
}
}
true
}
/// Baked block-state faces with default block tints and terrain shade or diffuse lighting.
pub(super) fn block_model_vertices(
+111
View File
@@ -0,0 +1,111 @@
# Generic damage commands for boats and minecarts
Frozen source: `41f822b659789780f58d32c63ddfb6887ea1b8bf`. Issue #11349.
The existing command route admits six actual UUID-bound vehicles: ordinary oak boats and minecarts, each with a sequence, exact-threshold, and Invulnerable control. A creative issuer supplies generic damage with **no attacker**. Generic1 survives; the following generic4 destroys the same vehicle and drops one correct hull. Independent generic4-only vehicles survive at40. Invulnerable vehicles reject; a pig damage control succeeds. All actors/load/floor/Pos/Motion/NoGravity guards and actual relative clock0 remain strict.
The predeclared128 complete records include exact messages, styles, callbacks and fresh result/success stores. No masks or tolerances. Full bodies/drop UUIDs and Motion plus absolute startup clocks were declared separate raw traces before either capture. Transient vehicle damage is independently checked in the actual Game regression, rather than inferred from a saved field.
## Old failure
Untouched Game:104/128; all admissions pass. The24 actual differences are below. Java/reference bytes and the original program remain unchanged for the fixed capture.
| Label | Java expected | Untouched Game actual |
| --- | --- | --- |
| oak_boat-sequence-hit | Applied 1.0 damage to Oak Boat; callbacks=[[True, 1]] | Target is invulnerable to the given damage type; callbacks=[[False, 0]] |
| oak_boat-sequence-hit-result | result has 1 [h050]; callbacks=[[True, 1]] | result has 0 [h050]; callbacks=[[True, 0]] |
| oak_boat-sequence-hit-success | success has 1 [h050]; callbacks=[[True, 1]] | success has 0 [h050]; callbacks=[[True, 0]] |
| oak_boat-sequence-break | Applied 4.0 damage to Oak Boat; callbacks=[[True, 1]] | Target is invulnerable to the given damage type; callbacks=[[False, 0]] |
| oak_boat-sequence-break-result | result has 1 [h050]; callbacks=[[True, 1]] | result has 0 [h050]; callbacks=[[True, 0]] |
| oak_boat-sequence-break-success | success has 1 [h050]; callbacks=[[True, 1]] | success has 0 [h050]; callbacks=[[True, 0]] |
| oak_boat-sequence-removed | Test passed; callbacks=[[True, 1]] | Test failed. Count: 1; callbacks=[[False, 0]] |
| oak_boat-sequence-hull | Test passed. Count: 1; callbacks=[[True, 1]] | Test failed; callbacks=[[False, 0]] |
| oak_boat-sequence-hull-stack | Oak Boat has the following entity data: {count: 1, id: "minecraft:oak_boat"}; callbacks=[[True, 2]] | No entity was found; callbacks=[[False, 0]] |
| oak_boat-threshold-hit | Applied 4.0 damage to Oak Boat; callbacks=[[True, 1]] | Target is invulnerable to the given damage type; callbacks=[[False, 0]] |
| oak_boat-threshold-hit-result | result has 1 [h050]; callbacks=[[True, 1]] | result has 0 [h050]; callbacks=[[True, 0]] |
| oak_boat-threshold-hit-success | success has 1 [h050]; callbacks=[[True, 1]] | success has 0 [h050]; callbacks=[[True, 0]] |
| minecart-sequence-hit | Applied 1.0 damage to Minecart; callbacks=[[True, 1]] | Target is invulnerable to the given damage type; callbacks=[[False, 0]] |
| minecart-sequence-hit-result | result has 1 [h050]; callbacks=[[True, 1]] | result has 0 [h050]; callbacks=[[True, 0]] |
| minecart-sequence-hit-success | success has 1 [h050]; callbacks=[[True, 1]] | success has 0 [h050]; callbacks=[[True, 0]] |
| minecart-sequence-break | Applied 4.0 damage to Minecart; callbacks=[[True, 1]] | Target is invulnerable to the given damage type; callbacks=[[False, 0]] |
| minecart-sequence-break-result | result has 1 [h050]; callbacks=[[True, 1]] | result has 0 [h050]; callbacks=[[True, 0]] |
| minecart-sequence-break-success | success has 1 [h050]; callbacks=[[True, 1]] | success has 0 [h050]; callbacks=[[True, 0]] |
| minecart-sequence-removed | Test passed; callbacks=[[True, 1]] | Test failed. Count: 1; callbacks=[[False, 0]] |
| minecart-sequence-hull | Test passed. Count: 1; callbacks=[[True, 1]] | Test failed; callbacks=[[False, 0]] |
| minecart-sequence-hull-stack | Minecart has the following entity data: {count: 1, id: "minecraft:minecart"}; callbacks=[[True, 2]] | No entity was found; callbacks=[[False, 0]] |
| minecart-threshold-hit | Applied 4.0 damage to Minecart; callbacks=[[True, 1]] | Target is invulnerable to the given damage type; callbacks=[[False, 0]] |
| minecart-threshold-hit-result | result has 1 [h050]; callbacks=[[True, 1]] | result has 0 [h050]; callbacks=[[True, 0]] |
| minecart-threshold-hit-success | success has 1 [h050]; callbacks=[[True, 1]] | success has 0 [h050]; callbacks=[[True, 0]] |
## Boundaries
The boat's old public bool remains destruction; its existing Option result carries cancellation versus acceptance. The cart's old unit-return wrapper remains; its unchanged body now returns false only on native-hook cancellation. The command reads actual Invulnerable through the existing damage registry/bypass rules, derives creative from the actual causing entity, and caches the actual display name before removal. Every old hook/action/drop/menu/RNG call keeps its order.
The source bridge reaches existing Boat/Cart target variants through their existing helpers. Runtime coverage is ordinary oak boats/minecarts, generic no-attacker, zero ticks, entity_drops true, and actual Invulnerable rejection. Other variants, damage sources, creative attackers, native-hook cancellation, containers, dimensions and trajectories are untested. No all-source or packet claim. H051 kill/spill/origin, H052 saved fields and pending patches remain separate. Existing native-hook cancellation has no cheap fixture; no plugin harness was added.
The prepared-resource actual Game test checks registered UUIDs, accepted model damage10, subsequent removal/hull, exact40 survival, fresh Invulnerable damage0, and unchanged world clock. Its unchanged assertions fail old at the first accepted hit; test-only Arc/String compiler draft is preserved as a rejected build prerequisite. The unit resident-chunk setup is separate from the runtime's actual loaded admission.
Run the public script with `PYTHONPATH=tools`, a fresh `--work-dir`, and `--binary <immutable-game>`. `--reference-only` establishes fresh Java; `--reference <vanilla.jsonl>` requires identical Java bytes in the pair. Prepared Java/resources are local-only.
Evidence is retained in `.local/h050/`: original script/declaration, references, complete Game/Java records and traces, old/fixed binaries, unit source/artifacts/logs, exact residual JSON, ownership/source reviews and phase manifest. Unknown phase times stay null. No public Mojang payloads.
## Fixed pair and raw diagnostics
Fixed Game: **128/128**, with identical original script and Java reference bytes. All strict setup and outcome records pass.
old-v1: 12/16 separate raw traces equal. Complete expected/actual differences:
```text
/execute store result score start h050 run time query gametime
Java: {"cmd": "/execute store result score start h050 run time query gametime", "messages": [[["The game time is 305 tick(s)", [null, false, false, false, false, false]]]], "results": [[true, 305]]}
Game: {"cmd": "/execute store result score start h050 run time query gametime", "messages": [[["The game time is 0 tick(s)", [null, false, false, false, false, false]]]], "results": [[true, 0]]}
```
```text
/data get entity @e[type=item,nbt={Item:{id:"minecraft:oak_boat"}},limit=1]
Java: {"cmd": "/data get entity @e[type=item,nbt={Item:{id:\"minecraft:oak_boat\"}},limit=1]", "messages": [[["Oak Boat has the following entity data: {", [null, false, false, false, false, false]], ["Motion", [5636095, false, false, false, false, false]], [": [", [null, false, false, false, false, false]], ["0.0772952039431482", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["0.2", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["-9.168480465201467E-4", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], ["], ", [null, false, false, false, false, false]], ["Health", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["5", [16755200, false, false, false, false, false]], ["s", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["Invulnerable", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["0", [16755200, false, false, false, false, false]], ["b", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["fall_distance", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["0.0", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["Air", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["300", [16755200, false, false, false, false, false]], ["s", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["OnGround", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["0", [16755200, false, false, false, false, false]], ["b", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["PortalCooldown", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["0", [16755200, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["Rotation", [5636095, false, false, false, false, false]], [": [", [null, false, false, false, false, false]], ["199.72446", [16755200, false, false, false, false, false]], ["f", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["0.0", [16755200, false, false, false, false, false]], ["f", [16733525, false, false, false, false, false]], ["], ", [null, false, false, false, false, false]], ["Item", [5636095, false, false, false, false, false]], [": {", [null, false, false, false, false, false]], ["count", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["1", [16755200, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["id", [5636095, false, false, false, false, false]], [": \"", [null, false, false, false, false, false]], ["minecraft:oak_boat", [5635925, false, false, false, false, false]], ["\"}, ", [null, false, false, false, false, false]], ["Pos", [5636095, false, false, false, false, false]], [": [", [null, false, false, false, false, false]], ["3.5", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["200.0", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["3.5", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], ["], ", [null, false, false, false, false, false]], ["PickupDelay", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["10", [16755200, false, false, false, false, false]], ["s", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["Fire", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["0", [16755200, false, false, false, false, false]], ["s", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["UUID", [5636095, false, false, false, false, false]], [": [", [null, false, false, false, false, false]], ["I", [16733525, false, false, false, false, false]], ["; ", [null, false, false, false, false, false]], ["179817655", [16755200, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["-1662825803", [16755200, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["-1421619595", [16755200, fLine truncated
Game: {"cmd": "/data get entity @e[type=item,nbt={Item:{id:\"minecraft:oak_boat\"}},limit=1]", "messages": [[["No entity was found", [16733525, false, false, false, false, false]]]], "results": [[false, 0]]}
```
```text
/data get entity @e[type=item,nbt={Item:{id:"minecraft:minecart"}},limit=1]
Java: {"cmd": "/data get entity @e[type=item,nbt={Item:{id:\"minecraft:minecart\"}},limit=1]", "messages": [[["Minecart has the following entity data: {", [null, false, false, false, false, false]], ["Motion", [5636095, false, false, false, false, false]], [": [", [null, false, false, false, false, false]], ["0.06317139770928379", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["0.2", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["0.08692915788757974", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], ["], ", [null, false, false, false, false, false]], ["Health", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["5", [16755200, false, false, false, false, false]], ["s", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["Invulnerable", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["0", [16755200, false, false, false, false, false]], ["b", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["fall_distance", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["0.0", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["Air", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["300", [16755200, false, false, false, false, false]], ["s", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["OnGround", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["0", [16755200, false, false, false, false, false]], ["b", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["PortalCooldown", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["0", [16755200, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["Rotation", [5636095, false, false, false, false, false]], [": [", [null, false, false, false, false, false]], ["1.219697", [16755200, false, false, false, false, false]], ["f", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["0.0", [16755200, false, false, false, false, false]], ["f", [16733525, false, false, false, false, false]], ["], ", [null, false, false, false, false, false]], ["Item", [5636095, false, false, false, false, false]], [": {", [null, false, false, false, false, false]], ["count", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["1", [16755200, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["id", [5636095, false, false, false, false, false]], [": \"", [null, false, false, false, false, false]], ["minecraft:minecart", [5635925, false, false, false, false, false]], ["\"}, ", [null, false, false, false, false, false]], ["Pos", [5636095, false, false, false, false, false]], [": [", [null, false, false, false, false, false]], ["3.5", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["200.0", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["9.5", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], ["], ", [null, false, false, false, false, false]], ["PickupDelay", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["10", [16755200, false, false, false, false, false]], ["s", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["Fire", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["0", [16755200, false, false, false, false, false]], ["s", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["UUID", [5636095, false, false, false, false, false]], [": [", [null, false, false, false, false, false]], ["I", [16733525, false, false, false, false, false]], ["; ", [null, false, false, false, false, false]], ["-465716956", [16755200, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["-226868535", [16755200, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["-1263438833", [16755200, falLine truncated
Game: {"cmd": "/data get entity @e[type=item,nbt={Item:{id:\"minecraft:minecart\"}},limit=1]", "messages": [[["No entity was found", [16733525, false, false, false, false, false]]]], "results": [[false, 0]]}
```
```text
/execute store result score end h050 run time query gametime
Java: {"cmd": "/execute store result score end h050 run time query gametime", "messages": [[["The game time is 305 tick(s)", [null, false, false, false, false, false]]]], "results": [[true, 305]]}
Game: {"cmd": "/execute store result score end h050 run time query gametime", "messages": [[["The game time is 0 tick(s)", [null, false, false, false, false, false]]]], "results": [[true, 0]]}
```
fixed-v1: 12/16 separate raw traces equal. Complete expected/actual differences:
```text
/execute store result score start h050 run time query gametime
Java: {"cmd": "/execute store result score start h050 run time query gametime", "messages": [[["The game time is 313 tick(s)", [null, false, false, false, false, false]]]], "results": [[true, 313]]}
Game: {"cmd": "/execute store result score start h050 run time query gametime", "messages": [[["The game time is 0 tick(s)", [null, false, false, false, false, false]]]], "results": [[true, 0]]}
```
```text
/data get entity @e[type=item,nbt={Item:{id:"minecraft:oak_boat"}},limit=1]
Java: {"cmd": "/data get entity @e[type=item,nbt={Item:{id:\"minecraft:oak_boat\"}},limit=1]", "messages": [[["Oak Boat has the following entity data: {", [null, false, false, false, false, false]], ["Motion", [5636095, false, false, false, false, false]], [": [", [null, false, false, false, false, false]], ["0.07143591099642635", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["0.2", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["-0.07987307682391527", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], ["], ", [null, false, false, false, false, false]], ["Health", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["5", [16755200, false, false, false, false, false]], ["s", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["Invulnerable", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["0", [16755200, false, false, false, false, false]], ["b", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["fall_distance", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["0.0", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["Air", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["300", [16755200, false, false, false, false, false]], ["s", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["OnGround", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["0", [16755200, false, false, false, false, false]], ["b", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["PortalCooldown", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["0", [16755200, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["Rotation", [5636095, false, false, false, false, false]], [": [", [null, false, false, false, false, false]], ["79.92485", [16755200, false, false, false, false, false]], ["f", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["0.0", [16755200, false, false, false, false, false]], ["f", [16733525, false, false, false, false, false]], ["], ", [null, false, false, false, false, false]], ["Item", [5636095, false, false, false, false, false]], [": {", [null, false, false, false, false, false]], ["count", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["1", [16755200, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["id", [5636095, false, false, false, false, false]], [": \"", [null, false, false, false, false, false]], ["minecraft:oak_boat", [5635925, false, false, false, false, false]], ["\"}, ", [null, false, false, false, false, false]], ["Pos", [5636095, false, false, false, false, false]], [": [", [null, false, false, false, false, false]], ["3.5", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["200.0", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["3.5", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], ["], ", [null, false, false, false, false, false]], ["PickupDelay", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["10", [16755200, false, false, false, false, false]], ["s", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["Fire", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["0", [16755200, false, false, false, false, false]], ["s", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["UUID", [5636095, false, false, false, false, false]], [": [", [null, false, false, false, false, false]], ["I", [16733525, false, false, false, false, false]], ["; ", [null, false, false, false, false, false]], ["-1352343907", [16755200, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["2070364242", [16755200, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["-1312738752", [16755200, fLine truncated
Game: {"cmd": "/data get entity @e[type=item,nbt={Item:{id:\"minecraft:oak_boat\"}},limit=1]", "messages": [[["Oak Boat has the following entity data: {", [null, false, false, false, false, false]], ["Motion", [5636095, false, false, false, false, false]], [": [", [null, false, false, false, false, false]], ["0.0", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["0.1", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["0.0", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], ["], ", [null, false, false, false, false, false]], ["Health", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["5", [16755200, false, false, false, false, false]], ["s", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["Invulnerable", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["0", [16755200, false, false, false, false, false]], ["b", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["fall_distance", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["0.0", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["Air", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["300", [16755200, false, false, false, false, false]], ["s", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["OnGround", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["0", [16755200, false, false, false, false, false]], ["b", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["PortalCooldown", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["0", [16755200, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["Rotation", [5636095, false, false, false, false, false]], [": [", [null, false, false, false, false, false]], ["0.0", [16755200, false, false, false, false, false]], ["f", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["0.0", [16755200, false, false, false, false, false]], ["f", [16733525, false, false, false, false, false]], ["], ", [null, false, false, false, false, false]], ["Item", [5636095, false, false, false, false, false]], [": {", [null, false, false, false, false, false]], ["count", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["1", [16755200, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["id", [5636095, false, false, false, false, false]], [": \"", [null, false, false, false, false, false]], ["minecraft:oak_boat", [5635925, false, false, false, false, false]], ["\"}, ", [null, false, false, false, false, false]], ["Pos", [5636095, false, false, false, false, false]], [": [", [null, false, false, false, false, false]], ["3.5", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["200.0", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["3.5", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], ["], ", [null, false, false, false, false, false]], ["PickupDelay", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["10", [16755200, false, false, false, false, false]], ["s", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["Fire", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["0", [16755200, false, false, false, false, false]], ["s", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["UUID", [5636095, false, false, false, false, false]], [": [", [null, false, false, false, false, false]], ["I", [16733525, false, false, false, false, false]], ["; ", [null, false, false, false, false, false]], ["-498365289", [16755200, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["102255954", [16755200, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["-1243443971", [16755200, false, false, false, false, false]], [", Line truncated
```
```text
/data get entity @e[type=item,nbt={Item:{id:"minecraft:minecart"}},limit=1]
Java: {"cmd": "/data get entity @e[type=item,nbt={Item:{id:\"minecraft:minecart\"}},limit=1]", "messages": [[["Minecart has the following entity data: {", [null, false, false, false, false, false]], ["Motion", [5636095, false, false, false, false, false]], [": [", [null, false, false, false, false, false]], ["-0.08605449468122495", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["0.2", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["0.009302897114117137", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], ["], ", [null, false, false, false, false, false]], ["Health", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["5", [16755200, false, false, false, false, false]], ["s", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["Invulnerable", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["0", [16755200, false, false, false, false, false]], ["b", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["fall_distance", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["0.0", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["Air", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["300", [16755200, false, false, false, false, false]], ["s", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["OnGround", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["0", [16755200, false, false, false, false, false]], ["b", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["PortalCooldown", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["0", [16755200, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["Rotation", [5636095, false, false, false, false, false]], [": [", [null, false, false, false, false, false]], ["204.338", [16755200, false, false, false, false, false]], ["f", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["0.0", [16755200, false, false, false, false, false]], ["f", [16733525, false, false, false, false, false]], ["], ", [null, false, false, false, false, false]], ["Item", [5636095, false, false, false, false, false]], [": {", [null, false, false, false, false, false]], ["count", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["1", [16755200, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["id", [5636095, false, false, false, false, false]], [": \"", [null, false, false, false, false, false]], ["minecraft:minecart", [5635925, false, false, false, false, false]], ["\"}, ", [null, false, false, false, false, false]], ["Pos", [5636095, false, false, false, false, false]], [": [", [null, false, false, false, false, false]], ["3.5", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["200.0", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["9.5", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], ["], ", [null, false, false, false, false, false]], ["PickupDelay", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["10", [16755200, false, false, false, false, false]], ["s", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["Fire", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["0", [16755200, false, false, false, false, false]], ["s", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["UUID", [5636095, false, false, false, false, false]], [": [", [null, false, false, false, false, false]], ["I", [16733525, false, false, false, false, false]], ["; ", [null, false, false, false, false, false]], ["1068265789", [16755200, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["444747224", [16755200, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["-1422236445", [16755200, falLine truncated
Game: {"cmd": "/data get entity @e[type=item,nbt={Item:{id:\"minecraft:minecart\"}},limit=1]", "messages": [[["Minecart has the following entity data: {", [null, false, false, false, false, false]], ["Motion", [5636095, false, false, false, false, false]], [": [", [null, false, false, false, false, false]], ["0.0", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["0.1", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["0.0", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], ["], ", [null, false, false, false, false, false]], ["Health", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["5", [16755200, false, false, false, false, false]], ["s", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["Invulnerable", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["0", [16755200, false, false, false, false, false]], ["b", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["fall_distance", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["0.0", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["Air", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["300", [16755200, false, false, false, false, false]], ["s", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["OnGround", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["0", [16755200, false, false, false, false, false]], ["b", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["PortalCooldown", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["0", [16755200, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["Rotation", [5636095, false, false, false, false, false]], [": [", [null, false, false, false, false, false]], ["0.0", [16755200, false, false, false, false, false]], ["f", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["0.0", [16755200, false, false, false, false, false]], ["f", [16733525, false, false, false, false, false]], ["], ", [null, false, false, false, false, false]], ["Item", [5636095, false, false, false, false, false]], [": {", [null, false, false, false, false, false]], ["count", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["1", [16755200, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["id", [5636095, false, false, false, false, false]], [": \"", [null, false, false, false, false, false]], ["minecraft:minecart", [5635925, false, false, false, false, false]], ["\"}, ", [null, false, false, false, false, false]], ["Pos", [5636095, false, false, false, false, false]], [": [", [null, false, false, false, false, false]], ["3.5", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["200.0", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["9.5", [16755200, false, false, false, false, false]], ["d", [16733525, false, false, false, false, false]], ["], ", [null, false, false, false, false, false]], ["PickupDelay", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["10", [16755200, false, false, false, false, false]], ["s", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["Fire", [5636095, false, false, false, false, false]], [": ", [null, false, false, false, false, false]], ["0", [16755200, false, false, false, false, false]], ["s", [16733525, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["UUID", [5636095, false, false, false, false, false]], [": [", [null, false, false, false, false, false]], ["I", [16733525, false, false, false, false, false]], ["; ", [null, false, false, false, false, false]], ["1917787141", [16755200, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["-1765652924", [16755200, false, false, false, false, false]], [", ", [null, false, false, false, false, false]], ["-1811989336", [16755200, false, false, false, false, false]], ["Line truncated
```
```text
/execute store result score end h050 run time query gametime
Java: {"cmd": "/execute store result score end h050 run time query gametime", "messages": [[["The game time is 313 tick(s)", [null, false, false, false, false, false]]]], "results": [[true, 313]]}
Game: {"cmd": "/execute store result score end h050 run time query gametime", "messages": [[["The game time is 0 tick(s)", [null, false, false, false, false, false]]]], "results": [[true, 0]]}
```
## Local checks
Actual prepared-resource regression: old intended failure, fixed1/1. Required final run: formatting, workspace/server Clippy,1078 Game tests and public/lock checks pass; overall exit1 from three existing optional-release Bash-array Python failures (708 run,1 skipped). The382 affected harnesses are listed for CI, not claimed locally. Ledger `--no-compare` retains broader existing vehicle callee warnings. No production change after required checks.
@@ -0,0 +1,95 @@
#!/usr/bin/env python3
"""Generic no-attacker vehicle damage, exact command records and raw bodies."""
import hashlib,json,sys,tempfile,uuid
from pathlib import Path
import test_command_exec_parity as driver
def program():
ops=[]
def cmd(text,label,result=None,admission=True,diagnostic=False):
op=dict(op='cmd',cmd=text,label=label,admission=admission)
if result is not None:op['expect_result']=result
if diagnostic:op.update(record=False,trace=True)
ops.append(op)
def action(text,label):
for k in ['result','success']:cmd(f'/scoreboard players set {k} h050 -99',label+'-reset-'+k,-99)
cmd('/execute store result score result h050 store success score success h050 run '+text,label,admission=False)
for k in ['result','success']:cmd(f'/scoreboard players get {k} h050',label+'-'+k,admission=False)
cmd('/tick freeze','freeze');cmd('/gamerule spawn_mobs false','no-spawn');cmd('/gamerule advance_time false','no-daylight')
cmd('/gamerule entity_drops true','drops-on')
cmd('/forceload add 0 0','force',1);ops.append(dict(op='settle',required_chunks=[[0,0]]))
cmd('/fill 0 199 0 15 199 15 stone','floor',256)
cmd('/tp @s 14.5 200 14.5 0 0','owner-position',1);cmd('/gamemode creative @s','owner-mode')
cmd('/execute if entity @s[type=player,name=Player,nbt={Health:20f,playerGameType:1,Pos:[14.5d,200d,14.5d]}]','owner',1)
cmd('/data get entity @s UUID','owner-uuid',4)
cmd('/scoreboard objectives add h050 dummy','objective')
cmd('/execute store result score start h050 run time query gametime','clock-start',diagnostic=True)
cmd('/execute unless entity @e[type=item]','initial-no-items',1)
for kind,base,z in [('oak_boat',1,3),('minecart',4,9)]:
for mode,offset,x in [('sequence',0,3),('threshold',1,7),('invulnerable',2,11)]:
i=base+offset;u=str(uuid.UUID(int=(500<<96)|i));label=kind+'-'+mode
inv=1 if mode=='invulnerable' else 0
cmd(f'/execute if loaded {x} 200 {z}',label+'-load',1)
cmd(f'/execute if block {x} 199 {z} stone',label+'-support',1)
cmd(f'/summon {kind} {x}.5 200 {z}.5 '+f'{{UUID:[I;500,0,0,{i}],NoGravity:1b,Invulnerable:{inv}b,Motion:[0d,0d,0d]}}',label+'-summon',1)
guard=f'{{UUID:[I;500,0,0,{i}],Pos:[{x}.5d,200d,{z}.5d],Motion:[0d,0d,0d],NoGravity:1b,Invulnerable:{inv}b}}'
cmd(f'/execute as {u} if entity @s[type={kind},nbt='+guard+']',label+'-actor',1)
for f in ['UUID','Pos','Motion','NoGravity','Invulnerable']:cmd(f'/data get entity {u} {f}',label+'-initial-'+f)
cmd(f'/data get entity {u}',label+'-initial-full',diagnostic=True)
action(f'damage {u} '+('1' if mode=='sequence' else '4')+' minecraft:generic',label+'-hit')
cmd(f'/execute as {u} if entity @s[type={kind},nbt='+guard+']',label+'-survives',1)
cmd(f'/data get entity {u}',label+'-after-hit-full',diagnostic=True)
if mode=='sequence':
action(f'damage {u} 4 minecraft:generic',label+'-break')
cmd(f'/execute unless entity {u}',label+'-removed',admission=False)
cmd(f'/execute if entity @e[type=item,nbt={{Item:{{id:"minecraft:{kind}",count:1}}}}]',label+'-hull',admission=False)
cmd(f'/data get entity @e[type=item,nbt={{Item:{{id:"minecraft:{kind}"}}}},limit=1] Item',label+'-hull-stack',admission=False)
cmd(f'/data get entity @e[type=item,nbt={{Item:{{id:"minecraft:{kind}"}}}},limit=1]',label+'-hull-full',admission=False,diagnostic=True)
cmd('/summon pig 13.5 200 6.5 {UUID:[I;500,0,0,7],Health:10f,NoAI:1b,NoGravity:1b}','pig-summon',1)
pig=str(uuid.UUID(int=(500<<96)|7))
cmd(f'/execute as {pig} if entity @s[type=pig,nbt={{Health:10f,NoAI:1b,NoGravity:1b}}]','pig-before',1)
action(f'damage {pig} 1 minecraft:generic','pig-hit')
cmd(f'/data get entity {pig} Health','pig-health',9)
cmd('/execute store result score end h050 run time query gametime','clock-end',diagnostic=True)
cmd('/scoreboard players operation end h050 -= start h050','clock-delta-operation',0)
cmd('/scoreboard players get end h050','clock-delta',0)
return ops
def main():
reference = None
if '--reference' in sys.argv:
i = sys.argv.index('--reference'); reference = Path(sys.argv[i+1]).resolve()
del sys.argv[i:i+2]
if '--work-dir' not in sys.argv:
parent = Path(tempfile.mkdtemp(prefix='vehicle-damage-', dir=driver.lab.LOCAL))
sys.argv += ['--work-dir', str(parent / 'run')]
build = Path(sys.argv[sys.argv.index('--work-dir')+1]).resolve()
assert not build.exists(), 'preserve attempts; choose a fresh directory'
build.mkdir(parents=True)
ops = program(); recorded = [op for op in ops if op['op']=='cmd' and op.get('record', True)]
(build/'declaration.json').write_text(json.dumps(dict(
script_sha256=hashlib.sha256(Path(__file__).read_bytes()).hexdigest(), records=len(recorded),
labels=[op['label'] for op in recorded],
raw_diagnostics=[op['label'] for op in ops if op.get('trace')],
comparison='complete records, no masks/tolerances; bodies and absolute clocks are separate raw traces'), indent=2)+'\n')
expected_bytes = reference.read_bytes() if reference else None
driver.corpus_module.groups = lambda: [('Vehicle generic command damage', ops)]
sys.argv.append('--allow-gaps'); driver.main()
java_bytes = (build/'vanilla.jsonl').read_bytes()
if expected_bytes is not None:
assert java_bytes==expected_bytes and reference.read_bytes()==expected_bytes, 'fresh Java reference changed'
java = [json.loads(s) for s in java_bytes.splitlines()]
if '--reference-only' in sys.argv: return
native = [json.loads(s) for s in (build/'rust.jsonl').read_bytes().splitlines()]
assert len(recorded)==len(java)==len(native)
residuals = [dict(label=op['label'], expected=a, actual=b) for op,a,b in zip(recorded,java,native) if a!=b]
report = dict(records=len(recorded), passed=len(recorded)-len(residuals), residuals=residuals,
reference_sha256=hashlib.sha256(java_bytes).hexdigest())
(build/'strict-report.json').write_text(json.dumps(report, indent=2)+'\n')
for op,a,b in zip(recorded,java,native):
if op['admission']: assert a==b, ('admission',op,a,b)
print(f'Strict records: {report["passed"]}/{report["records"]}')
if residuals: raise SystemExit(1)
if __name__ == '__main__':
main()