private void HandleDragDropRequestEvent(DragDropRequestEvent msg, EntitySessionEventArgs args) { if (!ValidateClientInput(args.SenderSession, msg.DropLocation, msg.Target, out var userEntity)) { Logger.InfoS("system.interaction", $"DragDropRequestEvent input validation failed"); return; } if (!_actionBlockerSystem.CanInteract(userEntity.Value)) { return; } if (!EntityManager.EntityExists(msg.Dropped)) { return; } if (!EntityManager.EntityExists(msg.Target)) { return; } var interactionArgs = new DragDropEvent(userEntity.Value, msg.DropLocation, msg.Dropped, msg.Target); // must be in range of both the target and the object they are drag / dropping // Client also does this check but ya know we gotta validate it. if (!interactionArgs.InRangeUnobstructed(ignoreInsideBlocker: true, popup: true)) { return; } // trigger dragdrops on the dropped entity RaiseLocalEvent(msg.Dropped, interactionArgs); foreach (var dragDrop in EntityManager.GetComponents <IDraggable>(msg.Dropped)) { if (dragDrop.CanDrop(interactionArgs) && dragDrop.Drop(interactionArgs)) { return; } } // trigger dragdropons on the targeted entity RaiseLocalEvent(msg.Target, interactionArgs, false); foreach (var dragDropOn in EntityManager.GetComponents <IDragDropOn>(msg.Target)) { if (dragDropOn.CanDragDropOn(interactionArgs) && dragDropOn.DragDropOn(interactionArgs)) { return; } } }
private void HandleDragDropMessage(DragDropRequestEvent msg, EntitySessionEventArgs args) { var performer = args.SenderSession.AttachedEntity; if (performer == null) { return; } if (!EntityManager.TryGetEntity(msg.Dropped, out var dropped)) { return; } if (!EntityManager.TryGetEntity(msg.Target, out var target)) { return; } var interactionArgs = new DragDropEvent(performer, msg.DropLocation, dropped, target); // must be in range of both the target and the object they are drag / dropping // Client also does this check but ya know we gotta validate it. if (!interactionArgs.InRangeUnobstructed(ignoreInsideBlocker: true, popup: true)) { return; } // trigger dragdrops on the dropped entity RaiseLocalEvent(dropped.Uid, interactionArgs); foreach (var dragDrop in dropped.GetAllComponents <IDraggable>()) { if (dragDrop.CanDrop(interactionArgs) && dragDrop.Drop(interactionArgs)) { return; } } // trigger dragdropons on the targeted entity RaiseLocalEvent(target.Uid, interactionArgs, false); foreach (var dragDropOn in target.GetAllComponents <IDragDropOn>()) { if (dragDropOn.CanDragDropOn(interactionArgs) && dragDropOn.DragDropOn(interactionArgs)) { return; } } }