mirror of
https://github.com/horizon-rust/horizon.git
synced 2026-11-08 17:19:10 -10:00
Drop the hand after placing or using an item on a server
The server-client use path never called LocalPlayer.itemUsed, so the held item stayed up after a placement. Vanilla drops it after a swinging useItemOn that spent the item (or in creative) and after every successful useItem.
This commit is contained in:
1 parent
56f968e11c
commit
e24394ca3a
1 file changed
+23
-2
@@ -4627,9 +4627,26 @@ impl Game<'_> {
|
||||
false
|
||||
}
|
||||
|
||||
/// `Minecraft.startUseItem`'s block turn for `hand`: a use that swung drops
|
||||
/// the hand (`LocalPlayer.itemUsed`) when it spent the held item or the
|
||||
/// player has infinite materials.
|
||||
fn remote_use_block(&mut self, hand: Hand) -> bool {
|
||||
let before = self.with_hand(hand, |g| g.held().map(|s| s.count));
|
||||
let swings = self.swings_started;
|
||||
let done = self.remote_use_item_on(hand);
|
||||
if done
|
||||
&& self.swings_started != swings
|
||||
&& let Some(after) = self.with_hand(hand, |g| g.held().map(|s| s.count))
|
||||
&& (Some(after) != before || self.creative)
|
||||
{
|
||||
self.heights.item_used(hand);
|
||||
}
|
||||
done
|
||||
}
|
||||
|
||||
/// MultiPlayerGameMode.useItemOn for `hand`: whether the click ends there
|
||||
/// (the block reacts, or a block item is placed).
|
||||
fn remote_use_block(&mut self, hand: Hand) -> bool {
|
||||
fn remote_use_item_on(&mut self, hand: Hand) -> bool {
|
||||
let held = self.with_hand(hand, |g| g.held().cloned());
|
||||
let held_block = held
|
||||
.as_ref()
|
||||
@@ -5003,7 +5020,9 @@ impl Game<'_> {
|
||||
/// the main hand's item, then the off hand's turn (its block, its item).
|
||||
/// The server does each packet's part with that packet's hand only.
|
||||
fn remote_use_hands(&mut self) {
|
||||
// A successful Item.use always drops the hand (LocalPlayer.itemUsed).
|
||||
if self.remote_use_item(Hand::Main) {
|
||||
self.heights.item_used(Hand::Main);
|
||||
return;
|
||||
}
|
||||
// The off hand's turn: the entity again, or the block.
|
||||
@@ -5015,7 +5034,9 @@ impl Game<'_> {
|
||||
if off_target {
|
||||
return;
|
||||
}
|
||||
self.remote_use_item(Hand::Off);
|
||||
if self.remote_use_item(Hand::Off) {
|
||||
self.heights.item_used(Hand::Off);
|
||||
}
|
||||
}
|
||||
/// `LivingEntity.updatingUsingItem` on a server client: an item held in
|
||||
/// use (`held_until_released`), and a consumable's eating animation and
|
||||
|
||||
Reference in new issue
Block a user