class_name LocalNetShipController extends ShipController const LocalInputTimeline = preload("res://scripts/local_input_timeline.gd") var source: ShipController var timeline: LocalInputTimeline var last_applied_seq := -1 var last_sampled_intent: ShipAction func _init(new_source: ShipController, new_timeline: LocalInputTimeline) -> void: source = new_source timeline = new_timeline last_sampled_intent = ShipAction.new() func get_action() -> ShipAction: # Ship invokes this exactly once per local physics tick. Prediction must use # the player's current intent immediately; the timeline is transmission and # immutable-redundancy bookkeeping only. Advance its cursor solely to label # this post-step state at the estimated server-consumption sequence; never # use its queued action to delay local control. last_sampled_intent = source.get_action().copy() var label := timeline.consume() last_applied_seq = int(label["seq"]) return last_sampled_intent.copy()