Mirror von
https://github.com/GeyserMC/Geyser.git
synchronisiert 2024-10-04 00:41:13 +02:00
Merge branch 'master' into rp
Dieser Commit ist enthalten in:
Commit
56495742b8
@ -37,9 +37,22 @@ public class DoorBlock extends Block {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateBlock(GeyserSession session, BlockState state, Vector3i position) {
|
public void updateBlock(GeyserSession session, BlockState state, Vector3i position) {
|
||||||
|
// Needed to check whether we must force the client to update the door state.
|
||||||
|
String doubleBlockHalf = state.getValue(Properties.DOUBLE_BLOCK_HALF);
|
||||||
|
|
||||||
|
if (doubleBlockHalf.equals("lower")) {
|
||||||
|
BlockState oldBlockState = session.getGeyser().getWorldManager().blockAt(session, position);
|
||||||
|
// If these are the same, it means that we already updated the lower door block (manually in the workaround below),
|
||||||
|
// and we do not need to update the block in the cache/on the client side using the super.updateBlock() method again.
|
||||||
|
// Otherwise, we send the door updates twice which will cause visual glitches on the client side
|
||||||
|
if (oldBlockState == state) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
super.updateBlock(session, state, position);
|
super.updateBlock(session, state, position);
|
||||||
|
|
||||||
if (state.getValue(Properties.DOUBLE_BLOCK_HALF).equals("upper")) {
|
if (doubleBlockHalf.equals("upper")) {
|
||||||
// Update the lower door block as Bedrock client doesn't like door to be closed from the top
|
// Update the lower door block as Bedrock client doesn't like door to be closed from the top
|
||||||
// See https://github.com/GeyserMC/Geyser/issues/4358
|
// See https://github.com/GeyserMC/Geyser/issues/4358
|
||||||
Vector3i belowDoorPosition = position.sub(0, 1, 0);
|
Vector3i belowDoorPosition = position.sub(0, 1, 0);
|
||||||
|
@ -100,8 +100,8 @@ public class JavaBlockUpdateTranslator extends PacketTranslator<ClientboundBlock
|
|||||||
|| lastInteractPos.getZ() != packet.getEntry().getPosition().getZ())) {
|
|| lastInteractPos.getZ() != packet.getEntry().getPosition().getZ())) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
String identifier = BlockState.of(packet.getEntry().getBlock()).toString(); // This will be yeeted soon. Thanks Chris.
|
BlockState state = BlockState.of(packet.getEntry().getBlock());
|
||||||
session.setInteracting(false);
|
session.setInteracting(false);
|
||||||
BlockSoundInteractionTranslator.handleBlockInteraction(session, lastInteractPos.toFloat(), identifier);
|
BlockSoundInteractionTranslator.handleBlockInteraction(session, lastInteractPos.toFloat(), state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,9 +28,16 @@ package org.geysermc.geyser.translator.protocol.java.level;
|
|||||||
import org.cloudburstmc.math.vector.Vector3f;
|
import org.cloudburstmc.math.vector.Vector3f;
|
||||||
import org.cloudburstmc.math.vector.Vector3i;
|
import org.cloudburstmc.math.vector.Vector3i;
|
||||||
import org.cloudburstmc.nbt.NbtMap;
|
import org.cloudburstmc.nbt.NbtMap;
|
||||||
|
import org.cloudburstmc.protocol.bedrock.data.LevelEvent;
|
||||||
import org.cloudburstmc.protocol.bedrock.data.ParticleType;
|
import org.cloudburstmc.protocol.bedrock.data.ParticleType;
|
||||||
import org.cloudburstmc.protocol.bedrock.data.SoundEvent;
|
import org.cloudburstmc.protocol.bedrock.data.SoundEvent;
|
||||||
import org.cloudburstmc.protocol.bedrock.packet.*;
|
import org.cloudburstmc.protocol.bedrock.packet.LevelEventGenericPacket;
|
||||||
|
import org.cloudburstmc.protocol.bedrock.packet.LevelEventPacket;
|
||||||
|
import org.cloudburstmc.protocol.bedrock.packet.LevelSoundEventPacket;
|
||||||
|
import org.cloudburstmc.protocol.bedrock.packet.PlaySoundPacket;
|
||||||
|
import org.cloudburstmc.protocol.bedrock.packet.SpawnParticleEffectPacket;
|
||||||
|
import org.cloudburstmc.protocol.bedrock.packet.StopSoundPacket;
|
||||||
|
import org.cloudburstmc.protocol.bedrock.packet.TextPacket;
|
||||||
import org.geysermc.geyser.GeyserImpl;
|
import org.geysermc.geyser.GeyserImpl;
|
||||||
import org.geysermc.geyser.level.JukeboxSong;
|
import org.geysermc.geyser.level.JukeboxSong;
|
||||||
import org.geysermc.geyser.registry.Registries;
|
import org.geysermc.geyser.registry.Registries;
|
||||||
@ -40,13 +47,27 @@ import org.geysermc.geyser.text.MinecraftLocale;
|
|||||||
import org.geysermc.geyser.translator.level.event.LevelEventTranslator;
|
import org.geysermc.geyser.translator.level.event.LevelEventTranslator;
|
||||||
import org.geysermc.geyser.translator.protocol.PacketTranslator;
|
import org.geysermc.geyser.translator.protocol.PacketTranslator;
|
||||||
import org.geysermc.geyser.translator.protocol.Translator;
|
import org.geysermc.geyser.translator.protocol.Translator;
|
||||||
|
import org.geysermc.geyser.util.DimensionUtils;
|
||||||
import org.geysermc.geyser.util.SoundUtils;
|
import org.geysermc.geyser.util.SoundUtils;
|
||||||
import org.geysermc.mcprotocollib.protocol.data.game.entity.object.Direction;
|
import org.geysermc.mcprotocollib.protocol.data.game.entity.object.Direction;
|
||||||
import org.geysermc.mcprotocollib.protocol.data.game.level.event.*;
|
import org.geysermc.mcprotocollib.protocol.data.game.level.event.BonemealGrowEventData;
|
||||||
|
import org.geysermc.mcprotocollib.protocol.data.game.level.event.BreakBlockEventData;
|
||||||
|
import org.geysermc.mcprotocollib.protocol.data.game.level.event.BreakPotionEventData;
|
||||||
|
import org.geysermc.mcprotocollib.protocol.data.game.level.event.ComposterEventData;
|
||||||
|
import org.geysermc.mcprotocollib.protocol.data.game.level.event.DragonFireballEventData;
|
||||||
|
import org.geysermc.mcprotocollib.protocol.data.game.level.event.LevelEventType;
|
||||||
|
import org.geysermc.mcprotocollib.protocol.data.game.level.event.RecordEventData;
|
||||||
|
import org.geysermc.mcprotocollib.protocol.data.game.level.event.SculkBlockChargeEventData;
|
||||||
|
import org.geysermc.mcprotocollib.protocol.data.game.level.event.SmokeEventData;
|
||||||
|
import org.geysermc.mcprotocollib.protocol.data.game.level.event.TrialSpawnerDetectEventData;
|
||||||
|
import org.geysermc.mcprotocollib.protocol.data.game.level.event.UnknownLevelEventData;
|
||||||
import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.level.ClientboundLevelEventPacket;
|
import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.level.ClientboundLevelEventPacket;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.Random;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
@Translator(packet = ClientboundLevelEventPacket.class)
|
@Translator(packet = ClientboundLevelEventPacket.class)
|
||||||
public class JavaLevelEventTranslator extends PacketTranslator<ClientboundLevelEventPacket> {
|
public class JavaLevelEventTranslator extends PacketTranslator<ClientboundLevelEventPacket> {
|
||||||
@ -291,6 +312,20 @@ public class JavaLevelEventTranslator extends PacketTranslator<ClientboundLevelE
|
|||||||
soundEventPacket.setRelativeVolumeDisabled(false);
|
soundEventPacket.setRelativeVolumeDisabled(false);
|
||||||
session.sendUpstreamPacket(soundEventPacket);
|
session.sendUpstreamPacket(soundEventPacket);
|
||||||
}
|
}
|
||||||
|
case ANIMATION_SPAWN_COBWEB -> effectPacket.setType(org.cloudburstmc.protocol.bedrock.data.LevelEvent.ANIMATION_SPAWN_COBWEB);
|
||||||
|
case ANIMATION_VAULT_ACTIVATE -> effectPacket.setType(org.cloudburstmc.protocol.bedrock.data.LevelEvent.ANIMATION_VAULT_ACTIVATE);
|
||||||
|
case ANIMATION_VAULT_DEACTIVATE -> effectPacket.setType(org.cloudburstmc.protocol.bedrock.data.LevelEvent.ANIMATION_VAULT_DEACTIVATE);
|
||||||
|
case ANIMATION_VAULT_EJECT_ITEM -> effectPacket.setType(org.cloudburstmc.protocol.bedrock.data.LevelEvent.ANIMATION_VAULT_EJECT_ITEM);
|
||||||
|
case ANIMATION_TRIAL_SPAWNER_EJECT_ITEM -> {
|
||||||
|
Random random = ThreadLocalRandom.current();
|
||||||
|
PlaySoundPacket playSoundPacket = new PlaySoundPacket();
|
||||||
|
playSoundPacket.setSound("trial_spawner.eject_item");
|
||||||
|
playSoundPacket.setPosition(pos);
|
||||||
|
playSoundPacket.setVolume(1.0f);
|
||||||
|
playSoundPacket.setPitch(0.8f + random.nextFloat() * 0.3f);
|
||||||
|
session.sendUpstreamPacket(playSoundPacket);
|
||||||
|
return;
|
||||||
|
}
|
||||||
case DRIPSTONE_DRIP -> effectPacket.setType(org.cloudburstmc.protocol.bedrock.data.LevelEvent.PARTICLE_DRIPSTONE_DRIP);
|
case DRIPSTONE_DRIP -> effectPacket.setType(org.cloudburstmc.protocol.bedrock.data.LevelEvent.PARTICLE_DRIPSTONE_DRIP);
|
||||||
case PARTICLES_ELECTRIC_SPARK -> effectPacket.setType(org.cloudburstmc.protocol.bedrock.data.LevelEvent.PARTICLE_ELECTRIC_SPARK); // Matches with a Bedrock server but doesn't seem to match up with Java
|
case PARTICLES_ELECTRIC_SPARK -> effectPacket.setType(org.cloudburstmc.protocol.bedrock.data.LevelEvent.PARTICLE_ELECTRIC_SPARK); // Matches with a Bedrock server but doesn't seem to match up with Java
|
||||||
case PARTICLES_AND_SOUND_WAX_ON -> effectPacket.setType(org.cloudburstmc.protocol.bedrock.data.LevelEvent.PARTICLE_WAX_ON);
|
case PARTICLES_AND_SOUND_WAX_ON -> effectPacket.setType(org.cloudburstmc.protocol.bedrock.data.LevelEvent.PARTICLE_WAX_ON);
|
||||||
@ -346,6 +381,54 @@ public class JavaLevelEventTranslator extends PacketTranslator<ClientboundLevelE
|
|||||||
session.sendUpstreamPacket(soundEventPacket);
|
session.sendUpstreamPacket(soundEventPacket);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
case PARTICLES_TRIAL_SPAWNER_DETECT_PLAYER -> {
|
||||||
|
// Particles spawn here
|
||||||
|
TrialSpawnerDetectEventData eventData = (TrialSpawnerDetectEventData) packet.getData();
|
||||||
|
effectPacket.setType(org.cloudburstmc.protocol.bedrock.data.LevelEvent.PARTICLE_TRIAL_SPAWNER_DETECTION);
|
||||||
|
// 0.75 is used here for Y instead of 0.5 to match Java Positioning.
|
||||||
|
// 0.5 is what the BDS uses for positioning.
|
||||||
|
effectPacket.setPosition(pos.sub(0.5f, 0.75f, 0.5f));
|
||||||
|
effectPacket.setData(eventData.getDetectedPlayers());
|
||||||
|
}
|
||||||
|
case PARTICLES_TRIAL_SPAWNER_DETECT_PLAYER_OMINOUS -> {
|
||||||
|
effectPacket.setType(org.cloudburstmc.protocol.bedrock.data.LevelEvent.PARTICLE_TRIAL_SPAWNER_DETECTION_CHARGED);
|
||||||
|
effectPacket.setPosition(pos.sub(0.5f, 0.75f, 0.5f));
|
||||||
|
/*
|
||||||
|
Particles don't spawn here for some reason, only sound plays
|
||||||
|
This seems to be a bug in v1.21.0 and v1.21.1: see https://bugs.mojang.com/browse/MCPE-181465
|
||||||
|
If this gets fixed, the spawnOminousTrialSpawnerParticles function can be removed.
|
||||||
|
The positioning should be the same as normal activation.
|
||||||
|
*/
|
||||||
|
spawnOminousTrialSpawnerParticles(session, pos);
|
||||||
|
}
|
||||||
|
case PARTICLES_TRIAL_SPAWNER_BECOME_OMINOUS -> {
|
||||||
|
effectPacket.setType(org.cloudburstmc.protocol.bedrock.data.LevelEvent.PARTICLE_TRIAL_SPAWNER_BECOME_CHARGED);
|
||||||
|
effectPacket.setPosition(pos.sub(0.5f, 0.5f, 0.5f));
|
||||||
|
// Same issue as above here
|
||||||
|
spawnOminousTrialSpawnerParticles(session, pos);
|
||||||
|
}
|
||||||
|
case PARTICLES_TRIAL_SPAWNER_SPAWN_MOB_AT -> {
|
||||||
|
// This should be its own class in MCProtocolLib.
|
||||||
|
// if 0, use Orange Flames,
|
||||||
|
// if 1, use Blue Flames for ominous spawners
|
||||||
|
UnknownLevelEventData eventData = (UnknownLevelEventData) packet.getData();
|
||||||
|
effectPacket.setType(org.cloudburstmc.protocol.bedrock.data.LevelEvent.PARTICLE_TRIAL_SPAWNER_SPAWNING);
|
||||||
|
effectPacket.setData(eventData.getData());
|
||||||
|
}
|
||||||
|
case PARTICLES_TRIAL_SPAWNER_SPAWN -> {
|
||||||
|
UnknownLevelEventData eventData = (UnknownLevelEventData) packet.getData();
|
||||||
|
effectPacket.setType(org.cloudburstmc.protocol.bedrock.data.LevelEvent.PARTICLE_TRIAL_SPAWNER_SPAWNING);
|
||||||
|
effectPacket.setData(eventData.getData());
|
||||||
|
|
||||||
|
Random random = ThreadLocalRandom.current();
|
||||||
|
PlaySoundPacket playSoundPacket = new PlaySoundPacket();
|
||||||
|
playSoundPacket.setSound("trial_spawner.spawn_mob");
|
||||||
|
playSoundPacket.setPosition(pos);
|
||||||
|
playSoundPacket.setVolume(1.0f);
|
||||||
|
playSoundPacket.setPitch(0.8f + random.nextFloat() * 0.3f);
|
||||||
|
session.sendUpstreamPacket(playSoundPacket);
|
||||||
|
}
|
||||||
|
case PARTICLES_TRIAL_SPAWNER_SPAWN_ITEM -> effectPacket.setType(org.cloudburstmc.protocol.bedrock.data.LevelEvent.PARTICLE_TRIAL_SPAWNER_EJECTING);
|
||||||
case SOUND_STOP_JUKEBOX_SONG -> {
|
case SOUND_STOP_JUKEBOX_SONG -> {
|
||||||
String bedrockSound = session.getWorldCache().removeActiveRecord(origin);
|
String bedrockSound = session.getWorldCache().removeActiveRecord(origin);
|
||||||
if (bedrockSound == null) {
|
if (bedrockSound == null) {
|
||||||
@ -396,4 +479,15 @@ public class JavaLevelEventTranslator extends PacketTranslator<ClientboundLevelE
|
|||||||
}
|
}
|
||||||
return facing;
|
return facing;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void spawnOminousTrialSpawnerParticles(GeyserSession session, Vector3f pos) {
|
||||||
|
int dimensionId = DimensionUtils.javaToBedrock(session.getDimension());
|
||||||
|
SpawnParticleEffectPacket stringPacket = new SpawnParticleEffectPacket();
|
||||||
|
stringPacket.setIdentifier("minecraft:trial_spawner_detection_ominous");
|
||||||
|
stringPacket.setDimensionId(dimensionId);
|
||||||
|
stringPacket.setPosition(pos.sub(0.5f, 0.75f, 0.5f));
|
||||||
|
stringPacket.setMolangVariablesJson(Optional.empty());
|
||||||
|
stringPacket.setUniqueEntityId(-1);
|
||||||
|
session.sendUpstreamPacket(stringPacket);
|
||||||
|
}
|
||||||
}
|
}
|
@ -27,6 +27,7 @@ package org.geysermc.geyser.translator.sound;
|
|||||||
|
|
||||||
import org.cloudburstmc.math.vector.Vector3f;
|
import org.cloudburstmc.math.vector.Vector3f;
|
||||||
import org.geysermc.geyser.inventory.GeyserItemStack;
|
import org.geysermc.geyser.inventory.GeyserItemStack;
|
||||||
|
import org.geysermc.geyser.level.block.type.BlockState;
|
||||||
import org.geysermc.geyser.registry.Registries;
|
import org.geysermc.geyser.registry.Registries;
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.GameMode;
|
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.GameMode;
|
||||||
@ -37,17 +38,16 @@ import java.util.Map;
|
|||||||
/**
|
/**
|
||||||
* Sound interaction handler for when a block is right-clicked.
|
* Sound interaction handler for when a block is right-clicked.
|
||||||
*/
|
*/
|
||||||
public interface BlockSoundInteractionTranslator extends SoundInteractionTranslator<String> {
|
public interface BlockSoundInteractionTranslator extends SoundInteractionTranslator<BlockState> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles the block interaction when a player
|
* Handles the block interaction when a player
|
||||||
* right-clicks a block.
|
* right-clicks a block.
|
||||||
*
|
*
|
||||||
* @param session the session interacting with the block
|
* @param session the session interacting with the block
|
||||||
* @param position the position of the block
|
* @param position the position of the block
|
||||||
* @param identifier the identifier of the block
|
* @param state the state of the block
|
||||||
*/
|
*/
|
||||||
static void handleBlockInteraction(GeyserSession session, Vector3f position, String identifier) {
|
static void handleBlockInteraction(GeyserSession session, Vector3f position, BlockState state) {
|
||||||
// If we need to get the hand identifier, only get it once and save it to a variable
|
// If we need to get the hand identifier, only get it once and save it to a variable
|
||||||
String handIdentifier = null;
|
String handIdentifier = null;
|
||||||
|
|
||||||
@ -58,7 +58,7 @@ public interface BlockSoundInteractionTranslator extends SoundInteractionTransla
|
|||||||
if (interactionEntry.getKey().blocks().length != 0) {
|
if (interactionEntry.getKey().blocks().length != 0) {
|
||||||
boolean contains = false;
|
boolean contains = false;
|
||||||
for (String blockIdentifier : interactionEntry.getKey().blocks()) {
|
for (String blockIdentifier : interactionEntry.getKey().blocks()) {
|
||||||
if (identifier.contains(blockIdentifier)) {
|
if (state.toString().contains(blockIdentifier)) {
|
||||||
contains = true;
|
contains = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -87,7 +87,7 @@ public interface BlockSoundInteractionTranslator extends SoundInteractionTransla
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
((BlockSoundInteractionTranslator) interactionEntry.getValue()).translate(session, position, identifier);
|
((BlockSoundInteractionTranslator) interactionEntry.getValue()).translate(session, position, state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,6 +29,7 @@ import org.cloudburstmc.math.vector.Vector3f;
|
|||||||
import org.cloudburstmc.protocol.bedrock.data.SoundEvent;
|
import org.cloudburstmc.protocol.bedrock.data.SoundEvent;
|
||||||
import org.cloudburstmc.protocol.bedrock.packet.LevelSoundEventPacket;
|
import org.cloudburstmc.protocol.bedrock.packet.LevelSoundEventPacket;
|
||||||
import org.geysermc.geyser.inventory.GeyserItemStack;
|
import org.geysermc.geyser.inventory.GeyserItemStack;
|
||||||
|
import org.geysermc.geyser.level.block.type.BlockState;
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
import org.geysermc.geyser.translator.sound.BlockSoundInteractionTranslator;
|
import org.geysermc.geyser.translator.sound.BlockSoundInteractionTranslator;
|
||||||
import org.geysermc.geyser.translator.sound.SoundTranslator;
|
import org.geysermc.geyser.translator.sound.SoundTranslator;
|
||||||
@ -37,7 +38,8 @@ import org.geysermc.geyser.translator.sound.SoundTranslator;
|
|||||||
public class BucketSoundInteractionTranslator implements BlockSoundInteractionTranslator {
|
public class BucketSoundInteractionTranslator implements BlockSoundInteractionTranslator {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void translate(GeyserSession session, Vector3f position, String identifier) {
|
public void translate(GeyserSession session, Vector3f position, BlockState state) {
|
||||||
|
String identifier = state.toString();
|
||||||
if (!session.isPlacedBucket()) {
|
if (!session.isPlacedBucket()) {
|
||||||
return; // No bucket was really interacted with
|
return; // No bucket was really interacted with
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,7 @@ package org.geysermc.geyser.translator.sound.block;
|
|||||||
import org.cloudburstmc.math.vector.Vector3f;
|
import org.cloudburstmc.math.vector.Vector3f;
|
||||||
import org.cloudburstmc.protocol.bedrock.data.LevelEvent;
|
import org.cloudburstmc.protocol.bedrock.data.LevelEvent;
|
||||||
import org.cloudburstmc.protocol.bedrock.packet.LevelEventPacket;
|
import org.cloudburstmc.protocol.bedrock.packet.LevelEventPacket;
|
||||||
|
import org.geysermc.geyser.level.block.type.BlockState;
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
import org.geysermc.geyser.translator.sound.BlockSoundInteractionTranslator;
|
import org.geysermc.geyser.translator.sound.BlockSoundInteractionTranslator;
|
||||||
import org.geysermc.geyser.translator.sound.SoundTranslator;
|
import org.geysermc.geyser.translator.sound.SoundTranslator;
|
||||||
@ -36,7 +37,8 @@ import org.geysermc.geyser.translator.sound.SoundTranslator;
|
|||||||
public class ComparatorSoundInteractionTranslator implements BlockSoundInteractionTranslator {
|
public class ComparatorSoundInteractionTranslator implements BlockSoundInteractionTranslator {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void translate(GeyserSession session, Vector3f position, String identifier) {
|
public void translate(GeyserSession session, Vector3f position, BlockState state) {
|
||||||
|
String identifier = state.toString();
|
||||||
boolean powered = identifier.contains("mode=compare");
|
boolean powered = identifier.contains("mode=compare");
|
||||||
LevelEventPacket levelEventPacket = new LevelEventPacket();
|
LevelEventPacket levelEventPacket = new LevelEventPacket();
|
||||||
levelEventPacket.setPosition(position);
|
levelEventPacket.setPosition(position);
|
||||||
|
@ -28,6 +28,7 @@ package org.geysermc.geyser.translator.sound.block;
|
|||||||
import org.cloudburstmc.math.vector.Vector3f;
|
import org.cloudburstmc.math.vector.Vector3f;
|
||||||
import org.cloudburstmc.protocol.bedrock.data.SoundEvent;
|
import org.cloudburstmc.protocol.bedrock.data.SoundEvent;
|
||||||
import org.cloudburstmc.protocol.bedrock.packet.LevelSoundEventPacket;
|
import org.cloudburstmc.protocol.bedrock.packet.LevelSoundEventPacket;
|
||||||
|
import org.geysermc.geyser.level.block.type.BlockState;
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
import org.geysermc.geyser.translator.sound.BlockSoundInteractionTranslator;
|
import org.geysermc.geyser.translator.sound.BlockSoundInteractionTranslator;
|
||||||
import org.geysermc.geyser.translator.sound.SoundTranslator;
|
import org.geysermc.geyser.translator.sound.SoundTranslator;
|
||||||
@ -36,7 +37,7 @@ import org.geysermc.geyser.translator.sound.SoundTranslator;
|
|||||||
public class FlintAndSteelInteractionTranslator implements BlockSoundInteractionTranslator {
|
public class FlintAndSteelInteractionTranslator implements BlockSoundInteractionTranslator {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void translate(GeyserSession session, Vector3f position, String identifier) {
|
public void translate(GeyserSession session, Vector3f position, BlockState state) {
|
||||||
LevelSoundEventPacket levelSoundEventPacket = new LevelSoundEventPacket();
|
LevelSoundEventPacket levelSoundEventPacket = new LevelSoundEventPacket();
|
||||||
levelSoundEventPacket.setPosition(position);
|
levelSoundEventPacket.setPosition(position);
|
||||||
levelSoundEventPacket.setBabySound(false);
|
levelSoundEventPacket.setBabySound(false);
|
||||||
|
@ -28,6 +28,7 @@ package org.geysermc.geyser.translator.sound.block;
|
|||||||
import org.cloudburstmc.math.vector.Vector3f;
|
import org.cloudburstmc.math.vector.Vector3f;
|
||||||
import org.cloudburstmc.protocol.bedrock.data.SoundEvent;
|
import org.cloudburstmc.protocol.bedrock.data.SoundEvent;
|
||||||
import org.cloudburstmc.protocol.bedrock.packet.LevelSoundEventPacket;
|
import org.cloudburstmc.protocol.bedrock.packet.LevelSoundEventPacket;
|
||||||
|
import org.geysermc.geyser.level.block.type.BlockState;
|
||||||
import org.geysermc.geyser.registry.BlockRegistries;
|
import org.geysermc.geyser.registry.BlockRegistries;
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
import org.geysermc.geyser.translator.sound.BlockSoundInteractionTranslator;
|
import org.geysermc.geyser.translator.sound.BlockSoundInteractionTranslator;
|
||||||
@ -37,7 +38,8 @@ import org.geysermc.geyser.translator.sound.SoundTranslator;
|
|||||||
public class GrassPathInteractionTranslator implements BlockSoundInteractionTranslator {
|
public class GrassPathInteractionTranslator implements BlockSoundInteractionTranslator {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void translate(GeyserSession session, Vector3f position, String identifier) {
|
public void translate(GeyserSession session, Vector3f position, BlockState state) {
|
||||||
|
String identifier = state.toString();
|
||||||
LevelSoundEventPacket levelSoundEventPacket = new LevelSoundEventPacket();
|
LevelSoundEventPacket levelSoundEventPacket = new LevelSoundEventPacket();
|
||||||
levelSoundEventPacket.setPosition(position);
|
levelSoundEventPacket.setPosition(position);
|
||||||
levelSoundEventPacket.setBabySound(false);
|
levelSoundEventPacket.setBabySound(false);
|
||||||
|
@ -28,6 +28,7 @@ package org.geysermc.geyser.translator.sound.block;
|
|||||||
import org.cloudburstmc.math.vector.Vector3f;
|
import org.cloudburstmc.math.vector.Vector3f;
|
||||||
import org.cloudburstmc.protocol.bedrock.data.SoundEvent;
|
import org.cloudburstmc.protocol.bedrock.data.SoundEvent;
|
||||||
import org.cloudburstmc.protocol.bedrock.packet.LevelSoundEventPacket;
|
import org.cloudburstmc.protocol.bedrock.packet.LevelSoundEventPacket;
|
||||||
|
import org.geysermc.geyser.level.block.type.BlockState;
|
||||||
import org.geysermc.geyser.registry.BlockRegistries;
|
import org.geysermc.geyser.registry.BlockRegistries;
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
import org.geysermc.geyser.translator.sound.BlockSoundInteractionTranslator;
|
import org.geysermc.geyser.translator.sound.BlockSoundInteractionTranslator;
|
||||||
@ -37,7 +38,8 @@ import org.geysermc.geyser.translator.sound.SoundTranslator;
|
|||||||
public class HoeInteractionTranslator implements BlockSoundInteractionTranslator {
|
public class HoeInteractionTranslator implements BlockSoundInteractionTranslator {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void translate(GeyserSession session, Vector3f position, String identifier) {
|
public void translate(GeyserSession session, Vector3f position, BlockState state) {
|
||||||
|
String identifier = state.toString();
|
||||||
LevelSoundEventPacket levelSoundEventPacket = new LevelSoundEventPacket();
|
LevelSoundEventPacket levelSoundEventPacket = new LevelSoundEventPacket();
|
||||||
levelSoundEventPacket.setPosition(position);
|
levelSoundEventPacket.setPosition(position);
|
||||||
levelSoundEventPacket.setBabySound(false);
|
levelSoundEventPacket.setBabySound(false);
|
||||||
|
@ -28,6 +28,7 @@ package org.geysermc.geyser.translator.sound.block;
|
|||||||
import org.cloudburstmc.math.vector.Vector3f;
|
import org.cloudburstmc.math.vector.Vector3f;
|
||||||
import org.cloudburstmc.protocol.bedrock.data.LevelEvent;
|
import org.cloudburstmc.protocol.bedrock.data.LevelEvent;
|
||||||
import org.cloudburstmc.protocol.bedrock.packet.LevelEventPacket;
|
import org.cloudburstmc.protocol.bedrock.packet.LevelEventPacket;
|
||||||
|
import org.geysermc.geyser.level.block.type.BlockState;
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
import org.geysermc.geyser.translator.sound.BlockSoundInteractionTranslator;
|
import org.geysermc.geyser.translator.sound.BlockSoundInteractionTranslator;
|
||||||
import org.geysermc.geyser.translator.sound.SoundTranslator;
|
import org.geysermc.geyser.translator.sound.SoundTranslator;
|
||||||
@ -36,7 +37,8 @@ import org.geysermc.geyser.translator.sound.SoundTranslator;
|
|||||||
public class LeverSoundInteractionTranslator implements BlockSoundInteractionTranslator {
|
public class LeverSoundInteractionTranslator implements BlockSoundInteractionTranslator {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void translate(GeyserSession session, Vector3f position, String identifier) {
|
public void translate(GeyserSession session, Vector3f position, BlockState state) {
|
||||||
|
String identifier = state.toString();
|
||||||
boolean powered = identifier.contains("powered=true");
|
boolean powered = identifier.contains("powered=true");
|
||||||
LevelEventPacket levelEventPacket = new LevelEventPacket();
|
LevelEventPacket levelEventPacket = new LevelEventPacket();
|
||||||
levelEventPacket.setPosition(position);
|
levelEventPacket.setPosition(position);
|
||||||
|
@ -27,21 +27,42 @@ package org.geysermc.geyser.translator.sound.block;
|
|||||||
|
|
||||||
import org.cloudburstmc.math.vector.Vector3f;
|
import org.cloudburstmc.math.vector.Vector3f;
|
||||||
import org.cloudburstmc.protocol.bedrock.data.LevelEvent;
|
import org.cloudburstmc.protocol.bedrock.data.LevelEvent;
|
||||||
|
import org.cloudburstmc.protocol.bedrock.data.SoundEvent;
|
||||||
import org.cloudburstmc.protocol.bedrock.packet.LevelEventPacket;
|
import org.cloudburstmc.protocol.bedrock.packet.LevelEventPacket;
|
||||||
|
import org.cloudburstmc.protocol.bedrock.packet.LevelSoundEventPacket;
|
||||||
|
import org.geysermc.geyser.level.block.type.BlockState;
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
import org.geysermc.geyser.translator.sound.BlockSoundInteractionTranslator;
|
import org.geysermc.geyser.translator.sound.BlockSoundInteractionTranslator;
|
||||||
import org.geysermc.geyser.translator.sound.SoundTranslator;
|
import org.geysermc.geyser.translator.sound.SoundTranslator;
|
||||||
|
|
||||||
@SoundTranslator(blocks = {"door", "fence_gate"})
|
@SoundTranslator(blocks = {"door", "fence_gate"})
|
||||||
public class DoorSoundInteractionTranslator implements BlockSoundInteractionTranslator {
|
public class OpenableSoundInteractionTranslator implements BlockSoundInteractionTranslator {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void translate(GeyserSession session, Vector3f position, String identifier) {
|
public void translate(GeyserSession session, Vector3f position, BlockState state) {
|
||||||
|
String identifier = state.toString();
|
||||||
if (identifier.contains("iron")) return;
|
if (identifier.contains("iron")) return;
|
||||||
LevelEventPacket levelEventPacket = new LevelEventPacket();
|
SoundEvent event = getSound(identifier.contains("open=true"), identifier);
|
||||||
levelEventPacket.setType(LevelEvent.SOUND_DOOR_OPEN);
|
LevelSoundEventPacket levelSoundEventPacket = new LevelSoundEventPacket();
|
||||||
levelEventPacket.setPosition(position);
|
levelSoundEventPacket.setPosition(position.add(0.5, 0.5, 0.5));
|
||||||
levelEventPacket.setData(0);
|
levelSoundEventPacket.setBabySound(false);
|
||||||
session.sendUpstreamPacket(levelEventPacket);
|
levelSoundEventPacket.setRelativeVolumeDisabled(false);
|
||||||
|
levelSoundEventPacket.setIdentifier(":");
|
||||||
|
levelSoundEventPacket.setSound(event);
|
||||||
|
levelSoundEventPacket.setExtraData(session.getBlockMappings().getBedrockBlock(state).getRuntimeId());
|
||||||
|
session.sendUpstreamPacket(levelSoundEventPacket);
|
||||||
|
}
|
||||||
|
|
||||||
|
private SoundEvent getSound(boolean open, String identifier) {
|
||||||
|
if (identifier.contains("_door")) {
|
||||||
|
return open ? SoundEvent.DOOR_OPEN : SoundEvent.DOOR_CLOSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (identifier.contains("_trapdoor")) {
|
||||||
|
return open ? SoundEvent.TRAPDOOR_OPEN : SoundEvent.TRAPDOOR_CLOSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fence Gate
|
||||||
|
return open ? SoundEvent.FENCE_GATE_OPEN : SoundEvent.FENCE_GATE_CLOSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1 +1 @@
|
|||||||
Subproject commit 69e302bf3a118e5274f86b23a1818c61dba84c64
|
Subproject commit aaf53d6953c927e5ac1b87fd6627ffbfd4aa7cf5
|
@ -10,7 +10,7 @@ netty-io-uring = "0.0.25.Final-SNAPSHOT"
|
|||||||
guava = "29.0-jre"
|
guava = "29.0-jre"
|
||||||
gson = "2.3.1" # Provided by Spigot 1.8.8
|
gson = "2.3.1" # Provided by Spigot 1.8.8
|
||||||
websocket = "1.5.1"
|
websocket = "1.5.1"
|
||||||
protocol = "3.0.0.Beta2-20240616.144648-10"
|
protocol = "3.0.0.Beta2-20240704.153116-14"
|
||||||
raknet = "1.0.0.CR3-20240416.144209-1"
|
raknet = "1.0.0.CR3-20240416.144209-1"
|
||||||
mcauthlib = "e5b0bcc"
|
mcauthlib = "e5b0bcc"
|
||||||
mcprotocollib = "1.21-20240616.154144-5"
|
mcprotocollib = "1.21-20240616.154144-5"
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren