mirror of
https://github.com/GeyserMC/Geyser.git
synced 2024-08-14 23:57:35 +00:00
Better logic for item updating on item entities
Specifically created to address InteractionVisualizer updating all metadata properties when updating the nametag - this commit prevents the item from jumping on updating. It also prevents the entity from being respawned if just the stack size updated.
This commit is contained in:
parent
c3f65b176d
commit
11f048a065
2 changed files with 24 additions and 3 deletions
|
@ -29,9 +29,11 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.EntityMetadat
|
|||
import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack;
|
||||
import com.nukkitx.math.vector.Vector3f;
|
||||
import com.nukkitx.math.vector.Vector3i;
|
||||
import com.nukkitx.protocol.bedrock.data.entity.EntityEventType;
|
||||
import com.nukkitx.protocol.bedrock.data.entity.EntityFlag;
|
||||
import com.nukkitx.protocol.bedrock.data.inventory.ItemData;
|
||||
import com.nukkitx.protocol.bedrock.packet.AddItemEntityPacket;
|
||||
import com.nukkitx.protocol.bedrock.packet.EntityEventPacket;
|
||||
import org.geysermc.connector.entity.type.EntityType;
|
||||
import org.geysermc.connector.network.session.GeyserSession;
|
||||
import org.geysermc.connector.network.translators.item.ItemTranslator;
|
||||
|
@ -115,9 +117,26 @@ public class ItemEntity extends ThrowableEntity {
|
|||
@Override
|
||||
public void updateBedrockMetadata(EntityMetadata entityMetadata, GeyserSession session) {
|
||||
if (entityMetadata.getId() == 8) {
|
||||
item = ItemTranslator.translateToBedrock(session, (ItemStack) entityMetadata.getValue());
|
||||
despawnEntity(session);
|
||||
spawnEntity(session);
|
||||
ItemData item = ItemTranslator.translateToBedrock(session, (ItemStack) entityMetadata.getValue());
|
||||
if (this.item == null) {
|
||||
this.item = item;
|
||||
spawnEntity(session);
|
||||
} else if (item.equals(this.item, false, true, true)) {
|
||||
// Don't bother respawning the entity if items are equal
|
||||
if (this.item.getCount() != item.getCount()) {
|
||||
// Just item count updated; let's make this easy
|
||||
this.item = item;
|
||||
EntityEventPacket packet = new EntityEventPacket();
|
||||
packet.setRuntimeEntityId(geyserId);
|
||||
packet.setType(EntityEventType.UPDATE_ITEM_STACK_SIZE);
|
||||
packet.setData(this.item.getCount());
|
||||
session.sendUpstreamPacket(packet);
|
||||
}
|
||||
} else {
|
||||
this.item = item;
|
||||
despawnEntity(session);
|
||||
spawnEntity(session);
|
||||
}
|
||||
}
|
||||
|
||||
super.updateBedrockMetadata(entityMetadata, session);
|
||||
|
|
|
@ -44,6 +44,7 @@ import org.geysermc.connector.registry.type.ItemMappings;
|
|||
import org.geysermc.connector.utils.FileUtils;
|
||||
import org.geysermc.connector.utils.LocaleUtils;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
|
@ -125,6 +126,7 @@ public abstract class ItemTranslator {
|
|||
return itemStack;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
public static ItemData translateToBedrock(GeyserSession session, ItemStack stack) {
|
||||
if (stack == null) {
|
||||
return ItemData.AIR;
|
||||
|
|
Loading…
Reference in a new issue