Skip to content

kRPC v0.6.0

Latest

Choose a tag to compare

@djungelorm djungelorm released this 22 Jul 20:39
f0cc83d

Client libraries:

Changes

Server

  • Fix server version reported to clients (read from KRPC.dll not KRPC.Core.dll) (#848)
  • Fix Logger to write to both KSP.log and Player.log (#780)
  • Improve RPC and stream update performance (#879)
  • Fix Stream RPCs Executed and Stream RPC Rate always showing 0 in the info window (#879)
  • Improve the server window UI (#919)
  • Fix incorrect unit shown for "max. time per update" and "receive timeout" (#919)
  • Support switching the game scene by setting KRPC.GameScene (#897)
  • Fix repeated toolbar icons appearing in some situations (#939)

Core

  • Add Version property to Core, set by the server plugin on startup (#848)
  • Enable TCP_NODELAY on client TCP connections, reducing RPC round-trip latency (#879)
  • Surface deprecated members (annotated with [Obsolete]) in the service definition and over the wire (#904)
  • Add KRPC.GameScene and make it settable to switch the current game scene (#897)
  • Deprecated: KRPC.CurrentGameScene, kept as a read-only alias of KRPC.GameScene (#897)
  • Add AstronautComplex, MissionControl, ResearchAndDevelopment, Administration and MissionBuilder game scenes (#897)
  • Fix the game scenes a procedure is available in never being sent by GetServices; the game_scenes field of every procedure was always empty (#991)
  • Reduce copying and allocation overhead receiving protobuf messages (#972)
  • Fix the websocket servers rejecting connection requests that are split across multiple reads (#973)
  • Fix websocket connection URL query parameter parsing (#973)
  • Fix locale issues with type codes in the service description, and HTTP and websocket protocol tokens (#993)

DockingCamera service

  • Fix DockingCamera.Available incorrectly reporting false in game scenes other than flight (#937)

InfernalRobotics service

  • Add to Servo: UID, Mode (with a new ServoMode enum), TargetPosition, TargetSpeed, CommandedPosition, DefaultPosition, ForceLimit, MaxForce, MaxAcceleration, MaxSpeed, ElectricChargeRequired, SpringPower, DampingPower, RotorAcceleration, IsLimited, IsRotational, IsServo, CanHaveLimits, HasSpring, IsRunning, PresetPositions, AddPreset, RemovePresetAt and SortPresets (#942)
  • Add to ServoGroup: Vessel, MovingDirection, AdvancedMode, ElectricChargeRequired, BuildAid and IKActive (#942)
  • Fix Servo.MinPosition and MaxPosition to return the position limits set in the tweak menu, rather than the fixed range from the part configuration (#942)
  • Support controlling servos on any loaded vessel, not just the active vessel (#943)
  • Fix Servo.MoveLeft, MoveCenter and MoveRight failing with the latest version of IR (#941)
  • Make InfernalRobotics.Available report correctly in all game scenes (#941)
  • Fix InfernalRobotics.Ready reporting false when queried before IR has finished loading (#941)

KerbalAlarmClock service

  • Make available in all game scenes (#944)
  • Add AlarmType.ScienceLab (#982)
  • Add AlarmAction.Custom and AlarmAction.Converted (#982)
  • Add Alarm.Enabled, Alarm.PlaySound, Alarm.Triggered, Alarm.SupportsRepeat and Alarm.SupportsRepeatPeriod (#982)
  • Fix Alarm.Remaining always failing with an invalid cast error (#982)
  • Fix alarm equality, so the same alarm obtained twice compares equal (#982)
  • Fix accessing an alarm after it has been removed; it now fails with an "Alarm does not exist" error (#982)

LiDAR service

  • Fix LiDAR.Available incorrectly reporting false in game scenes other than flight (#937)

RemoteTech service

  • Fix RemoteTech.Available incorrectly reporting false in game scenes other than flight (#937)

SpaceCenter service

  • Space center
    • Add SpaceCenter.Expansions to report the installed KSP expansions (#985)
    • Add SpaceCenter.AltimeterMode and an AltimeterMode enumeration to get and set the mode of the in-game altimeter (#808)
    • SpaceCenter.ActiveVessel now returns null when there is no active vessel, instead of raising an error (#821)
    • Breaking: Make LaunchVessel crew parameter non-optional to work around protocol issue (#824)
    • Deprecated: SpaceCenter.LoadSpaceCenter, superseded by setting KRPC.GameScene (#897)
  • Vessels and crew
    • Add Vessel.Loaded and Vessel.Packed to report a vessel's loading and on-rails state (#967)
    • Add Vessel.PhysicsRange to set how far from the active vessel a vessel keeps running its physics simulation, so that it stays controllable beyond the game's default range. The range applies to that vessel only, and persists until it is set back to zero or the game is exited (#987)
    • Add RPCs for getting acceleration to Flight and Vessel classes (#581)
    • Fix Vessel.AvailableTorque due to sign inconsistency in KSP's ITorqueProvider implementations (#525)
    • Add CrewMember.Part and per-part CrewCapacity and Crew properties (#1001)
  • Staging
    • Add staging API giving per-stage delta-v and resource information (#920)
    • Deprecated: Parts.InStage, Parts.InDecoupleStage and Vessel.ResourcesInDecoupleStage, superseded by the staging API (#920)
    • Fix Part.DecoupledAt not considering if a decoupler is enabled (#818)
    • Fix Part.DecoupledAt returning the wrong stage when the part is decoupled by a decoupler on its parent part (#800)
    • Fix Decoupler.AttachedPart raising an error when no part is attached to the decoupler's node; it now returns null (#822)
  • Autopilot
    • Rework the AutoPilot for smoother, more accurate pointing across a wide range of craft, from small probes to large flexible launchers, with no per-craft tuning (#882, #571, #394, #220, #248, #542)
    • The AutoPilot now controls pitch and yaw together, so the nose tracks a straight path to the target and holding a roll no longer curves that path (#882)
    • The AutoPilot now detects and damps structural oscillations on long or flexible craft automatically; rigid craft are unaffected (#882)
    • Replace AutoPilot.Engage and Disengage with the AutoPilot.Engaged property (#882)
    • Add AutoPilot.TargetRotation to command a full target orientation (direction and roll) (#882)
    • Add AutoPilot.SetDirectionAndUp to aim the nose along a direction while keeping the roof aligned to an up vector, so an orientation can be held through a maneuver without the singularity the old roll control hit at the vertical (#882)
    • Add AutoPilot.UpReference, a persistent reference that AutoPilot.TargetRoll is measured against, and make TargetRoll well-defined through the vertical (#882)
    • Add AutoPilot.AttitudeError for a singularity-free (pitch, yaw, roll) attitude error; PitchError and HeadingError now use the same well-defined decomposition (#882)
    • Fix AutoPilot.RollError returning spurious large values near vertical (#564)
    • Document Flight.Pitch, Heading and Roll and the scalar target pitch/heading/roll as ill-defined near vertical, pointing to the rotation and error readouts instead (#882)
    • Add AutoPilot.TargetSmoothingTime to slew the target smoothly when it changes, with matching Current* readouts of the smoothed target actually being tracked (#882)
    • Add AutoPilot.SoftStartTime to fade in control output on engagement (#882)
    • Add AutoPilot.Reset to disengage and restore all settings to their defaults (#882)
    • Add AutoPilot.ShowInfoUI to show an in-game autopilot info window (#882)
    • Replace AutoPilot.RollThreshold with RollStartAngle and RollEngageAngle (#882)
    • Replace AutoPilot.StoppingTime and DecelerationTime with AutoPilot.MaxAngularVelocity (#882)
    • Replace AutoPilot.AttenuationAngle with PitchYawAttenuationAngle and RollAttenuationAngle (#882)
    • Add controls to tune and observe the AutoPilot's oscillation mitigation (rate filter, bandwidth floor, feedforward-cut and output-filter modes, and manual structural-frequency settings) (#882)
    • Add AutoPilot.StoppingAngleThreshold and StoppingVelocityThreshold to control when AutoPilot.Wait() returns (#882)
    • Add an optional timeout to AutoPilot.Wait(), throwing TimeoutException if it expires (#882)
    • Add AutoPilot.DiagnosticLogging and DiagnosticLog for per-tick controller diagnostics (#882)
    • On client disconnect the AutoPilot is now disengaged but its settings and target are kept (#882)
    • Fix AutoPilot.Error to return the absolute value of the normalized angle (#893)
    • Fix the auto-pilot no longer controlling the vessel after a Revert to Launch when a client keeps its auto-pilot object across the reload (it appeared engaged but stopped driving the vessel until the game was restarted) (#958)
    • Fix AutoPilot.ReferenceFrame raising an error when set to a docking port reference frame (#882)
  • Reference frames
    • Fix Maneuver and ManeuverOrbital reference frame velocity (previously returned zero; now returns the orbital velocity at the node UT) (#880)
    • Fix angular velocity for VesselSurface, VesselSurfaceVelocity, CelestialBodyOrbital, Maneuver, ManeuverOrbital, Part, PartCenterOfMass, DockingPort and Thrust reference frames (previously returned zero) (#880)
    • Fix VesselOrbital reference frame angular velocity (missing Coriolis correction) (#823)
    • Fix reference frame velocity being incorrect at non-equatorial latitudes (#454)
    • Fix Vessel/Part/Hybrid reference frame rotation precision (#880)
    • Fix ReferenceFrame.CreateHybrid using velocity frame's angular velocity instead of the angularVelocity frame (#880)
    • Fix VesselSurfaceVelocity reference frame producing NaN when surface velocity is near zero; now throws InvalidOperationException (#880)
    • Fix PartCenterOfMass reference frame throwing InvalidOperationException on velocity transforms (#880)
    • Fix Maneuver reference frame forward-vector fallback using unnormalized burn vector in collinearity check (#880)
    • Fix LookRotation2 producing NaN for rotations near 180° by using Shepperd's method (#880)
    • Fix maneuver node reference frame positions being computed relative to the active vessel, giving wrong positions for maneuver nodes on other vessels (#880)
    • Improve performance of CommNode.IsVessel, CommNode.Vessel, Vessel.AngularVelocity and reference frame angular velocities (#975)
  • Orbits, nodes and bodies
    • Add Orbit.OrbitalEnergy (#303)
    • Add Orbit.NextClosestApproach and Orbit.ClosestApproaches, and a ClosestApproach class exposing the time, distance, positions, velocities, relative position/velocity and relative speed at a close approach with a target orbit, plus the vessels or bodies involved (#334)
    • Deprecated: Orbit.TimeOfClosestApproach, Orbit.DistanceAtClosestApproach and Orbit.ListClosestApproaches, superseded by Orbit.NextClosestApproach and Orbit.ClosestApproaches (#334)
    • Add Node.Rotation (#880)
    • Fix Node objects whose maneuver node was removed by Control.RemoveNodes, another Node object or the in-game UI: all members now raise an error, instead of silently reading and writing the detached node (#975)
    • Fix CelestialBody.Rotation returning incorrect values before a flight scene loads (#890)
  • Flight and aerodynamics
    • Breaking: Add a rotation parameter to Flight.SimulateAerodynamicForceAt to set the vessel attitude (angle of attack and sideslip) independently of velocity. Pass the current rotation for the previous behavior (#915)
    • Add Flight.SurfacePrograde and Flight.SurfaceRetrograde direction vectors (surface-relative velocity direction, matching navball surface mode) (#582)
    • Fix Flight.AngleOfAttack and Flight.SideslipAngle treating dot product as radians instead of using asin (#880)
    • Add Flight.AerodynamicTorque, the live counterpart to Flight.AerodynamicForce, giving the net aerodynamic torque acting on the vessel about its center of mass on the current physics frame; not available with FAR (#914)
    • Add Flight.SimulateAerodynamicTorqueAt to simulate the aerodynamic torque about the vessel's center of mass, for a hypothetical attitude and angular velocity, with both stock aerodynamics and FAR, in newton-meters. The torque includes both damping mechanisms the game applies: the change in each part's local airflow due to rotation, and the per-part rigidbody angular drag (#825, #914, #429)
    • Add Flight.SimulateAerodynamicWrenchAt to evaluate stock aerodynamic force and torque together at a hypothetical center-of-mass state, attitude, body rate and atmospheric ephemeris time (#914)
    • Add Part.Drag and Part.Lift returning the aerodynamic drag and lift forces acting on an individual part (#459)
    • Fix Flight.SimulateAerodynamicForceAt ignoring the current deflection of aerodynamic control surfaces, including deployed airbrakes (#622)
    • Fix Flight.SimulateAerodynamicForceAt overestimating drag at low altitude and subsonic speed by applying KSP's pseudo-Reynolds drag multiplier to cube drag (#912)
    • Fix Flight.SimulateAerodynamicForceAt returning force in kilonewtons instead of newtons when FAR is installed (#915)
    • Fix Flight.SimulateAerodynamicForceAt computing incorrect lift for command pods and other parts with a perpendicular-only lifting-surface module: cube body lift was applied even where the game disables it (a pod with a heatshield occupying its bottom node has none), and lifting-surface modules were evaluated against stale internal airflow state, so results depended on the game context the call was made from (landed, in vacuum, or in atmospheric flight) (#914)
    • Fix Part.Lift, Flight.Lift and Flight.AerodynamicForce including stale body lift for parts whose body lift the game suppresses, e.g. a pod with a heatshield attached (#971)
  • Control
    • Breaking: Control.SAS now throws an exception when set to true while the autopilot is engaged, matching AutoPilot.SAS. Previously the write was accepted and the autopilot silently switched SAS back off on the next physics tick (#492)
    • Fix Control.SASMode being dropped when set in the same physics tick as enabling SAS (#236)
    • Add Control.PitchTrim, Control.YawTrim and Control.RollTrim to get/set the persistent pitch, yaw and roll trim of the active vessel (#863)
    • Add Control.AeroSurfaces to enable/disable pitch, yaw and roll on all control surfaces (#827)
    • Add Control.EngineGimbals to enable/disable gimbal on all gimballed engines (#827)
    • Add Control.ThrustReversers to engage/disengage thrust reversers on all engines (#865)
    • Add Control.GetActionGroupActions to list the part actions assigned to an action group (#864)
    • Add direct control of engine gimbals, RCS and control surfaces (#917)
    • Fix Control.CustomAxis01-04 being applied to the active vessel instead of the target vessel, and the getters not reading back the value that was set (#938)
    • Fix throttle being applied to a vessel with no RemoteTech control connection (#938)
  • Engines
    • Add Engine.Flameout (#311)
    • Add Engine.CanReverseThrust, Engine.ThrustReversed and Engine.ToggleThrustReversal to control thrust reversal on stock and recognized mod engines (#865)
    • Fix Engine.Propellants failing for non-active mode on multi-mode engines with different propellants (#833)
    • Fix Engine.AvailableThrust and MaxThrust for air-breathing engines at supersonic speeds (#924)
  • Reaction wheels, RCS and control surfaces
    • Add ReactionWheel.AuthorityLimiter (#909)
    • Fix ReactionWheel.AvailableTorque not considering authority limiter setting (#909)
    • Fix RCS force and torque vector calculations using max thrust rather than available thrust (#909)
    • Fix RCS.MaxTorque documentation error - it considers thrust limit set to 100% (#909)
    • Fix RCS.Active reporting a shielded thruster as inactive when it is able to thrust while shielded (#975)
    • Fix ControlSurface.AvailableTorque returning inconsistent signs (ModuleControlSurface negates the roll axis); now normalized to positive/negative torque like other parts (#881)
  • Parachutes and wheels
    • Fix Parachute.Deploy being a silent no-op for RealChute parachutes (#382)
    • Add Parachute.SafeState reporting whether it is currently safe to deploy the parachute (safe, risky, unsafe, or not applicable) (#977)
    • Add Wheel.SteeringAngleAuto to get/set automatic speed-based steering angle limiting (#975)
  • Deployable parts
    • Breaking: Replace the RadiatorState, SolarPanelState, AntennaState, LegState, WheelState and CargoBayState enumerations with a single DeployableState enumeration, whose members are Deployed, Retracted, Deploying, Retracting and Broken. Radiator.State and SolarPanel.State now report Deployed and Deploying in place of Extended and Extending, and CargoBay.State reports Deployed, Retracted, Deploying and Retracting in place of Open, Closed, Opening and Closing. The underlying values are unchanged, so only the enumeration and member names need updating (#986)
    • Breaking: ResourceHarvester.State is now a DeployableState and no longer reports Active; use ResourceHarvester.Active to check whether the harvester is drilling. The ResourceHarvesterState enumeration is removed and its values renumbered, so clients using it must be regenerated (#986)
    • Fix CargoBay.State reporting Deployed for a closed cargo ramp, and reporting a resting state while the bay was still moving (#986)
  • Robotic parts
    • Breaking: RoboticController.AddAxis, AddKeyFrame and ClearAxis now identify an axis by the name of its field, for example targetAngle, instead of by the label shown in the part's menu, for example "Target Angle". The names now match those returned by RoboticController.Axes, which previously could not be passed back in, and no longer change with the language the game is running in (#993)
    • Add Parts.RoboticControllers (#985)
    • Add to RoboticController: Enabled, Playing, Position, Length, PlaySpeed, Play and Stop (#985)
    • Add to RoboticHinge: MinAngle, MaxAngle and IsMoving (#985)
    • Add to RoboticPiston: MinExtension, MaxExtension and IsMoving (#985)
    • Add to RoboticRotation: MinAngle, MaxAngle, AllowFullRotation and IsMoving (#985)
    • Add to RoboticRotor: MaxTorque, BrakePercentage and IsMoving (#985)
    • Fix RoboticRotation.CurrentAngle and RoboticRotor.CurrentRPM returning stale values in flight (the KSP fields they read are only refreshed while the part action window is open) (#985)
  • Resource harvesters and converters
    • Fix ResourceHarvester.Active being silently ignored when set while the harvester is deploying; the requested state is now applied when the deploy completes (#983)
    • Fix ResourceHarvester.ExtractionRate returning 0 when part action window is not open (#889)
    • Fix ResourceConverter.State and ResourceHarvester.ThermalEfficiency misreading the KSP status string (#892)
    • Fix Sensor.Value returning zero when the part action window is not open (#883)
  • Part modules, fields and configuration
    • Add PartField, PartEvent and PartAction API (#859)
    • Deprecated: the string-dictionary Module field, event and action members (#859)
    • Allow Module.HasFieldWithId, GetFieldById, SetFieldIntById, SetFieldFloatById, SetFieldStringById, SetFieldBoolById and ResetFieldById to also access fields not visible in the UI (#858)
    • Add Part.Config, Module.Config and ConfigNode for accessing part and module static configuration (#831)
  • Science, contracts and waypoints
    • Fix Experiment.Reset not clearing the science data stored by DMagic experiments, which caused the next call to Run to fail with "Experiment already contains data" (#550)
    • Add Contract.DateAccepted, DateDeadline, DateExpire and DateFinished (#977)
    • Guard ContractManager against null ContractSystem in non-career game modes (#819)
    • Fix Waypoint.MeanAltitude returning the altitude relative to the terrain below the waypoint instead of relative to sea level (#801)
    • Fix Waypoint.MeanAltitude, SurfaceAltitude and BedrockAltitude not round-tripping: the setters did not account for KSP storing waypoint altitudes relative to the bedrock height, so the altitude read back differed from the value set (#891)
  • Alarms
    • Breaking: Alarm.Type now returns an AlarmType enumeration value instead of a string (#853)
    • Add to Alarm: Node, OriginBody, DestinationBody, WarpAction, MessageAction, PlaySound, DeleteOnDismiss, Triggered and Actioned (#853)
    • Add AlarmType, AlarmWarpAction and AlarmMessageAction enumerations (#853)
    • Add Alarm.Remove to delete an alarm (#853)
    • Add AlarmManager.AlarmWithName, AlarmManager.AlarmsWithType and AlarmManager.AddTransferWindowAlarm (#853)
    • Fix NullReferenceException raised every frame after creating or removing an alarm (#853)
  • Camera
    • Add Camera.FoV to get and set the camera field of view, and read-only Camera.MinFoV, Camera.MaxFoV and Camera.DefaultFoV (#804)
    • Add Camera.NextCamera, Camera.PreviousCamera and Camera.FocussedCrewMember to cycle and select IVA cameras (#804)
    • Fix Camera Distance, Pitch, Heading and FoV setters being lost when set during a camera mode switch (#318)
  • Client disconnect cleanup
    • Remove forces added by Part.AddForce when the client that added them disconnects (#934)
    • Cancel in-progress resource transfers when the client that started them disconnects; a canceled transfer is marked as complete (#934)
    • Fix part highlighting leaking a client-disconnect event handler each time the flight scene is loaded (#934)
  • Localization
    • Fix DockingPort.Undock doing nothing when the game is not running in English (#993)
    • Fix Fairing.Jettison doing nothing, and Fairing.Jettisoned always reporting true, when the game is not running in English (#993)
    • Fix CargoBay.Open neither opening nor closing the bay when the game is not running in English (#993)
    • Fix ResourceConverter.State only ever reporting Running when the game is not running in English, leaving MissingResource, StorageFull and Capacity unreachable (#993)
    • Fix DockingPort.State reporting Shielded instead of Moving while a shield is opening or closing, when the game is not running in English (#993)
    • Fix part module field values being formatted using the machine's locale, so that Module.Fields, Module.GetField and PartField.Value returned numbers that clients running under a locale that writes decimals with a comma could not parse (#993)

UI service

  • Fix locale issues with UI.Message (#993)

C# client

  • Breaking: Requires .NET Framework 4.7.2 or later (#948)
  • Update to protobuf v3.35.1 (#850)
  • Mark deprecated members with the [Obsolete] attribute (#904)
  • Disposing a connection now stops and joins the stream update thread (#1005)
  • An error from a service whose exception types were never registered now raises an RPCException describing it (#1005)
  • An exception thrown by a stream or event callback no longer escapes the stream update thread (#1005)
  • Fix a deadlock between the stream update thread and a thread waiting for an update (#1005)

C++ client

  • Update to protobuf v35.1 (#850)
  • Update to ASIO 1.38.0 (#850)
  • Distribute via vcpkg (#874)
  • Breaking: Drop autotools build; CMake is now the only supported build system (#851)
  • Breaking: Modernise CMake build: require CMake 3.15+, C++17, target-based usage requirements (#834)
  • Add CMake package config so consumers can use find_package(krpc CONFIG REQUIRED) (#851)
  • CMake dependency options (KRPC_FETCH_DEPS, KRPC_FETCH_PROTOBUF, KRPC_FETCH_ASIO, KRPC_FETCH_ABSL): when OFF (default) the system install is required; when ON FetchContent is used. (#857)
  • Mark deprecated members with the [[deprecated]] attribute (#904)
  • An error from a service whose generated header is not included now throws an RPCError describing it (#1007)
  • An exception thrown by a stream or event callback no longer escapes the stream update thread (#1007)
  • Fix a data race on the exception thrower map between constructing a service and handling an error (#1007)
  • Fix stream update notifications being lost, which could leave Client::wait_for_stream_update sleeping through the update it was waiting for (#974)
  • Fix Client::freeze_streams blocking forever when no stream is producing updates (#974)

C-nano client

  • Distribute via vcpkg (#874)
  • Breaking: Drop autotools build; CMake is now the only supported build system (#870)
  • Breaking: Modernize CMake build: require CMake 3.15+, target-based usage requirements (#834)
  • Breaking: nanopb is now an external dependency (fetched via FetchContent or found on the system) rather than being bundled in the release archive; the Arduino package still bundles nanopb (#870)
  • Breaking: Pre-generated protocol buffer code and krpc.proto are bundled in the release archive; set KRPC_REGENERATE_PROTO=ON to regenerate the code from krpc.proto using the nanopb generator (#872)
  • Add CMake package config so consumers can use find_package(krpc_cnano CONFIG REQUIRED) (#870)
  • CMake dependency options (KRPC_FETCH_DEPS, KRPC_FETCH_PROTOBUF, KRPC_FETCH_NANOPB): when OFF (default) the system install is required; when ON FetchContent is used. (#870)
  • Add support for serial port communication on Windows (#872)
  • Mark deprecated functions with the KRPC_DEPRECATED attribute macro (#904)
  • Generated functions are now defined as static inline, so the generated service headers can be safely included from multiple translation units (#948)
  • Breaking: On Arduino, a read now fails with KRPC_ERROR_EOF when the serial timeout elapses instead of retrying forever (#1002)
  • Add KRPC_ERROR_MESSAGES option, which captures the message describing an error returned by the server so that it can be read using krpc_get_error_message. (#1002)
  • Fix corruption of received data on POSIX systems when a serial read returns fewer bytes than were asked for (#1002)

Java client

  • Update to protobuf v4.35.1, guava 33.4.8-jre, antlr4-runtime 4.13.2 (#850)
  • Mark deprecated members with the @Deprecated annotation and an @deprecated javadoc tag (#904)
  • Reduce copying when encoding values (#979)
  • Fix Stream.getRate always returning zero, whatever the rate had been set to (#1004)
  • Fix looking up the method to stream or call (#1004)
  • An exception thrown by a stream or event callback no longer ends the stream update thread (#1004)
  • Fix a deadlock between the stream update thread and a thread waiting for an update (#1004)
  • An error from a service with no generated stubs loaded now raises an RPCException describing it (#1004)

Lua client

  • Fix attributes module to always return boolean for is_a_class_member and is_a_class_property_accessor (#850)
  • Fix service, method and property names being converted to snake case using the machine's locale (#993)
  • Calling a procedure with an argument that needs coercing no longer leaves a global named ok behind (#1003)
  • Remove encoder.client_name; a leftover from before the protocol used protocol buffers (#1003)

Python client

  • Breaking: Requires Python 3.10+ (#837)
  • Update to protobuf v7.35.1 (#850)
  • Allow calling static class methods from a class instance (#832)
  • Emit a DeprecationWarning when calling a deprecated member, and note deprecation in docstrings (#904)
  • Fix static class method calls being sent to the wrong connection when multiple clients are connected (#979)
  • An exception raised by a stream or event callback no longer ends the stream update thread (#1008)
  • Fix a deadlock between the stream update thread and a thread waiting for an update (#1008)
  • An error from a service this client does not know about now raises an RPCError describing it (#1008)
  • Fix decoding of sint64 values at or above 2**62 (#1008)
  • A closed connection is now reported instead of being mistaken for no data having arrived (#1008)
  • Removing a stream, or closing the client, now wakes threads waiting for an update on it, which previously waited for an update that could never arrive (#1008)
  • The client can now be closed from a stream or event callback, which raised RuntimeError and left the client half closed (#1008)
  • Fix a stream returning None rather than its value, or the error saying it has none, when read as its first update was being stored (#1008)

krpctools

  • Breaking: Requires Python 3.10+
  • Breaking: krpc-servicedefs now runs the ServiceDefinitions tool on the .NET 8 runtime; Mono is no longer required
  • Surface deprecated members in generated documentation and client stubs (#904)
  • Fix generated Java clients failing to compile when a service has enough procedures to push the generated type tables past the JVM's method size limit
  • Generated C-nano functions are now defined as static inline, so the generated service headers can be safely included from multiple translation units
  • Fix C-nano client generation emitting zero-sized argument arrays for procedures with no parameters
  • Fix C-nano documentation rendering an entire service's API as an indented block quote
  • Fix docgen dropping remarks in service-level documentation
  • Fix cross-service member references not resolving in generated C# and Lua documentation (#897)
  • Fix member references in generated Python documentation using lowerCamelCase instead of snake_case
  • Fix generating client stubs and documentation from a KSP install failing when the machine's locale is not UTF-8 and a service's documentation contains non-ASCII characters