Implement experience sounds (#1320)

Bedrock sends a level event for the experience sound around the same time as a Java entity collect item packet is sent.
This commit is contained in:
Camotoy 2020-09-22 14:16:57 -04:00 committed by GitHub
parent 2dc7dc10ff
commit b4c7682130
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 26 additions and 9 deletions

View File

@ -23,26 +23,32 @@
* @link https://github.com/GeyserMC/Geyser * @link https://github.com/GeyserMC/Geyser
*/ */
package org.geysermc.connector.network.translators.java.world; package org.geysermc.connector.network.translators.java.entity;
import com.github.steveice10.mc.protocol.packet.ingame.server.entity.ServerEntityCollectItemPacket; import com.github.steveice10.mc.protocol.packet.ingame.server.entity.ServerEntityCollectItemPacket;
import com.nukkitx.protocol.bedrock.data.LevelEventType;
import com.nukkitx.protocol.bedrock.packet.LevelEventPacket;
import com.nukkitx.protocol.bedrock.packet.TakeItemEntityPacket; import com.nukkitx.protocol.bedrock.packet.TakeItemEntityPacket;
import org.geysermc.connector.entity.Entity; import org.geysermc.connector.entity.Entity;
import org.geysermc.connector.entity.ExpOrbEntity;
import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.session.GeyserSession;
import org.geysermc.connector.network.translators.PacketTranslator; import org.geysermc.connector.network.translators.PacketTranslator;
import org.geysermc.connector.network.translators.Translator; import org.geysermc.connector.network.translators.Translator;
/**
* This packet is called whenever a player picks up an item.
* In Java, this is called for item entities, experience orbs and arrows
* Bedrock uses it for arrows and item entities, but not experience orbs.
*/
@Translator(packet = ServerEntityCollectItemPacket.class) @Translator(packet = ServerEntityCollectItemPacket.class)
public class JavaCollectItemTranslator extends PacketTranslator<ServerEntityCollectItemPacket> { public class JavaEntityCollectItemTranslator extends PacketTranslator<ServerEntityCollectItemPacket> {
@Override @Override
public void translate(ServerEntityCollectItemPacket packet, GeyserSession session) { public void translate(ServerEntityCollectItemPacket packet, GeyserSession session) {
// This is the definition of translating - both packets take the same values // Collected entity is the other entity
TakeItemEntityPacket takeItemEntityPacket = new TakeItemEntityPacket();
// Collected entity is the item
Entity collectedEntity = session.getEntityCache().getEntityByJavaId(packet.getCollectedEntityId()); Entity collectedEntity = session.getEntityCache().getEntityByJavaId(packet.getCollectedEntityId());
if (collectedEntity == null) return; if (collectedEntity == null) return;
// Collector is the entity picking up the item // Collector is the entity 'picking up' the item
Entity collectorEntity; Entity collectorEntity;
if (packet.getCollectorEntityId() == session.getPlayerEntity().getEntityId()) { if (packet.getCollectorEntityId() == session.getPlayerEntity().getEntityId()) {
collectorEntity = session.getPlayerEntity(); collectorEntity = session.getPlayerEntity();
@ -50,8 +56,19 @@ public class JavaCollectItemTranslator extends PacketTranslator<ServerEntityColl
collectorEntity = session.getEntityCache().getEntityByJavaId(packet.getCollectorEntityId()); collectorEntity = session.getEntityCache().getEntityByJavaId(packet.getCollectorEntityId());
} }
if (collectorEntity == null) return; if (collectorEntity == null) return;
takeItemEntityPacket.setRuntimeEntityId(collectorEntity.getGeyserId()); if (collectedEntity instanceof ExpOrbEntity) {
takeItemEntityPacket.setItemRuntimeEntityId(collectedEntity.getGeyserId()); // Player just picked up an experience orb
session.sendUpstreamPacket(takeItemEntityPacket); LevelEventPacket xpPacket = new LevelEventPacket();
xpPacket.setType(LevelEventType.SOUND_EXPERIENCE_ORB_PICKUP);
xpPacket.setPosition(collectedEntity.getPosition());
xpPacket.setData(0);
session.sendUpstreamPacket(xpPacket);
} else {
// Item is being picked up (visual only)
TakeItemEntityPacket takeItemEntityPacket = new TakeItemEntityPacket();
takeItemEntityPacket.setRuntimeEntityId(collectorEntity.getGeyserId());
takeItemEntityPacket.setItemRuntimeEntityId(collectedEntity.getGeyserId());
session.sendUpstreamPacket(takeItemEntityPacket);
}
} }
} }