·
10 commits
to main
since this release
Immutable
release. Only release title and notes can be modified.
3D
Performance overhaul — fire-and-forget calls, msgpack wire protocol, field cache invalidation, and reduced serialization payload.
Changes
Fire-and-Forget Calls
- Added
call_fire_forget()toBridgeConnection— sends calls withno_response: true, skipping Future creation and await - Added
_call_ff()toProxyBase— convenience wrapper for fire-and-forget bridge calls - Java
handleCall()checksno_responseflag and skips result serialization + response sending - Java
executeBatchCalls()supportsno_responseper-call in both atomic and non-atomic batch paths - Converted ~80+ void/setter methods on Entity and Player to fire-and-forget:
- Entity:
teleport,remove, velocity setter,fire_tickssetter,add_passenger/remove_passenger,custom_namesetter, gravity/glowing/invisible/invulnerable/silent/persistent/collidable setters,portal_cooldown/freeze_tickssetters,eject,leave_vehicle,set_rotation - Entity (Mob):
targetsetter,is_awaresetter,stop_pathfinding,remove_all_goals - Player:
damage,send_message,chat,kick,give_exp,add_effect/remove_effect,set_game_mode,set_scoreboard,set_op,play_sound,send_action_bar,send_title, tab list setters, health/food/level/exp setters, flying/sneaking/sprinting setters, walk/fly speed setters,send_resource_pack, absorption/saturation/exhaustion setters,allow_flightsetter,hide_player/show_player,open_book,send_block_change,send_particle,set_cooldown,set_statistic,max_healthsetter,bed_spawn_location/compass_targetsetters,set_persistent_data
- Entity:
Field Cache Invalidation
- Added
_invalidate_field()toProxyBase— removes cached field values so next access fetches fresh data from Java - Setters that modify cached values call
_invalidate_field()before sending the fire-and-forget call, preventing desync:teleport→ invalidateslocation,worldgive_exp→ invalidatesexp,levelset_game_mode→ invalidatesgameMode,game_modeset_health→ invalidateshealthset_food_level→ invalidatesfoodLevel,food_levellevelsetter → invalidateslevelexpsetter → invalidatesexpmax_healthsetter → invalidateshealth
Reduced Serialization Payload
- Removed
inventoryfrom Player auto-serialization inBridgeSerializer— inventory is now fetched on demand instead of included in every Player object
Msgpack Wire Protocol
- Python: 3-tier serialization import chain — msgpack → orjson → stdlib json
- Python: handshake message sent as JSON on connect to negotiate format with Java
- Java:
handleHandshake()switchesuseMsgpackflag on format negotiation - Java:
serializePayload()/deserializePayload()helper methods convert JsonObject ↔ msgpack at IPC boundaries - Java: full msgpack ↔ Gson
JsonElementtree conversion (unpackValue,packJsonElement) handling all types (nil, bool, int, float, string, binary, array, map) - Java:
bridgeLoop(),send(),sendAll(),sendWithTiming()all route through format-aware helpers - Build: added
com.gradleup.shadowplugin,org.msgpack:msgpack-core:0.9.8shaded and relocated tocom.pyjavabridge.libs.msgpack copyPluginJarandcopyReleaseJartasks updated to depend onshadowJar
Bug Fixes
- Fixed stray
return self._call_sync(method)in_invalidate_fieldthat would have crashed on every call