1818import net .minecraft .world .entity .player .Player ;
1919import net .minecraft .world .level .Level ;
2020import net .timtaran .interactivemc .body .player .interaction .GrabInteraction ;
21+ import net .timtaran .interactivemc .body .player .interaction .TriggerInteraction ;
2122import net .timtaran .interactivemc .body .player .interaction .TriggerState ;
2223import net .timtaran .interactivemc .body .player .packet .S2CGrabResultPacket ;
2324import net .timtaran .interactivemc .body .player .physics .PlayerBodyPartGhostRigidBody ;
2425import net .timtaran .interactivemc .body .player .physics .PlayerBodyPartRigidBody ;
2526import net .timtaran .interactivemc .body .player .store .PlayerBodyDataStore ;
26- import net .timtaran .interactivemc .body .type .IGrabbable ;
2727import net .timtaran .interactivemc .init .InteractiveMC ;
2828import net .timtaran .interactivemc .init .registry .BodyRegistry ;
2929import net .timtaran .interactivemc .network .Networking ;
@@ -58,10 +58,12 @@ public class PlayerBodyManager {
5858
5959 private final VxPhysicsWorld world ;
6060 private final GrabInteraction grabInteraction ;
61+ private final TriggerInteraction triggerInteraction ;
6162
6263 private PlayerBodyManager (VxPhysicsWorld world ) {
6364 this .world = world ;
6465 this .grabInteraction = new GrabInteraction (world , this );
66+ this .triggerInteraction = new TriggerInteraction ();
6567 ContactListenerManager .init (world ); // todo delete this
6668 }
6769
@@ -331,39 +333,46 @@ public void release(Player player, InteractionHand interactionHand) {
331333
332334 VxBody grabbedBody = world .getBodyManager ().getVxBody (playerBodyPartData .grabbedBodyId ());
333335 if (grabbedBody != null ) {
334- PlayerBodyDataStore .grabbedBodies .remove (grabbedBody .getBodyId ());
336+ // remove only first found body because multiple bodies can grab single body
337+ PlayerBodyDataStore .grabbedBodies .rem (grabbedBody .getBodyId ());
335338 }
336339
337340 playerBodies .put (playerBodyPart , new PlayerBodyPartData (playerBodyPartData .bodyPartId (), playerBodyPartData .ghostBodyPartId (), playerBodyPartData .triggerState (), null , null ));
341+ if (player instanceof ServerPlayer serverPlayer ) {
342+ player .getServer ().execute (() ->
343+ Networking .sendToPlayer (
344+ serverPlayer ,
345+ new S2CGrabResultPacket (
346+ interactionHand ,
347+ null
348+ )
349+ )
350+ );
351+ }
338352 System .out .println ("released body" );
339353 }
340354
341355 public void updateTriggerState (Player player , InteractionHand interactionHand , TriggerState triggerState ) {
342356 PlayerBodyPart playerBodyPart = PlayerBodyPart .fromInteractionHand (interactionHand );
343- System .out .println ("release playerbodypart: " + playerBodyPart );
344357 if (playerBodyPart == null )
345358 return ;
346359
347360 EnumMap <PlayerBodyPart , PlayerBodyPartData > playerBodies = PlayerBodyDataStore .playersBodies .get (player .getUUID ());
348- System .out .println ("release playerbodies: " + playerBodies );
349361 if (playerBodies == null )
350362 return ;
351363
352364 PlayerBodyPartData playerBodyPartData = playerBodies .get (playerBodyPart );
353- System .out .println ("release playerbodypartdata: " + playerBodyPartData );
354365 if (playerBodyPartData == null ) {
355366 return ;
356367 }
357368
358- if (playerBodyPartData .grabbedBodyId () == null ) {
369+ if (playerBodyPartData .grabbedBodyId () == null || playerBodyPartData . grabConstraintId () == null ) {
359370 return ;
360371 }
361372
362373 VxBody grabbedBody = world .getBodyManager ().getVxBody (playerBodyPartData .grabbedBodyId ());
363374
364- if (grabbedBody instanceof IGrabbable grabbable ) {
365- grabbable .onTriggerStateUpdate (player , playerBodyPart , triggerState );
366- }
375+ triggerInteraction .updateGrabState (player , grabbedBody , playerBodyPart , triggerState );
367376 }
368377
369378 public void processGrabResult (Player player , PlayerBodyPart playerBodyPart , GrabInteraction .GrabResult grabResult ) {
@@ -376,18 +385,15 @@ public void processGrabResult(Player player, PlayerBodyPart playerBodyPart, Grab
376385 if (playerBodyPartData == null ) {
377386 return ;
378387 }
388+ System .out .println (playerBodyPartData );
379389
380390 playerBodies .put (playerBodyPart , new PlayerBodyPartData (
381391 playerBodyPartData .bodyPartId (), playerBodyPartData .ghostBodyPartId (), playerBodyPartData .triggerState (),
382392 grabResult .grabbedBody () != null ? grabResult .grabbedBody ().getPhysicsId () : null ,
383393 grabResult .grabConstraint () != null ? grabResult .grabConstraint ().getConstraintId () : null
384394 ));
385395
386-
387396 if (grabResult .grabbedBody () != null ) {
388- if (PlayerBodyDataStore .grabbedBodies .contains (grabResult .grabbedBody ().getBodyId ()))
389- return ;
390-
391397 PlayerBodyDataStore .grabbedBodies .add (grabResult .grabbedBody ().getBodyId ());
392398 }
393399
@@ -401,8 +407,7 @@ public void processGrabResult(Player player, PlayerBodyPart playerBodyPart, Grab
401407 serverPlayer ,
402408 new S2CGrabResultPacket (
403409 interactionHand ,
404- grabResult .grabbedBody () == null ? UUID .randomUUID () : grabResult .grabbedBody ().getPhysicsId ()
405- // todo: replace (I forgot with what, but random uuid is used here because passing null values causes NPE)
410+ grabResult .grabbedBody () == null ? null : grabResult .grabbedBody ().getPhysicsId ()
406411 )
407412 )
408413 );
0 commit comments