Java源码示例:com.nukkitx.protocol.bedrock.packet.LevelEventPacket
示例1
@Override
public void handleInteraction(GeyserSession session, Vector3f position, String identifier) {
boolean powered = identifier.contains("powered=true");
LevelEventPacket levelEventPacket = new LevelEventPacket();
levelEventPacket.setPosition(position);
levelEventPacket.setType(LevelEventType.REDSTONE_TRIGGER);
levelEventPacket.setData(powered ? 600 : 500);
session.sendUpstreamPacket(levelEventPacket);
}
示例2
@Override
public void handleInteraction(GeyserSession session, Vector3f position, String identifier) {
LevelEventPacket levelEventPacket = new LevelEventPacket();
levelEventPacket.setType(LevelEventType.SOUND_DOOR);
levelEventPacket.setPosition(position);
levelEventPacket.setData(0);
session.sendUpstreamPacket(levelEventPacket);
}
示例3
@Override
public void handleInteraction(GeyserSession session, Vector3f position, String identifier) {
boolean powered = identifier.contains("mode=compare");
LevelEventPacket levelEventPacket = new LevelEventPacket();
levelEventPacket.setPosition(position);
levelEventPacket.setType(LevelEventType.REDSTONE_TRIGGER);
levelEventPacket.setData(powered ? 500 : 550);
session.sendUpstreamPacket(levelEventPacket);
}
示例4
@Override
public void translate(ServerRespawnPacket packet, GeyserSession session) {
Entity entity = session.getPlayerEntity();
if (entity == null)
return;
float maxHealth = entity.getAttributes().containsKey(AttributeType.MAX_HEALTH) ? entity.getAttributes().get(AttributeType.MAX_HEALTH).getValue() : 20f;
// Max health must be divisible by two in bedrock
entity.getAttributes().put(AttributeType.HEALTH, AttributeType.HEALTH.getAttribute(maxHealth, (maxHealth % 2 == 1 ? maxHealth + 1 : maxHealth)));
session.getInventoryCache().setOpenInventory(null);
SetPlayerGameTypePacket playerGameTypePacket = new SetPlayerGameTypePacket();
playerGameTypePacket.setGamemode(packet.getGamemode().ordinal());
session.sendUpstreamPacket(playerGameTypePacket);
session.setGameMode(packet.getGamemode());
LevelEventPacket stopRainPacket = new LevelEventPacket();
stopRainPacket.setType(LevelEventType.STOP_RAIN);
stopRainPacket.setData(ThreadLocalRandom.current().nextInt(50000) + 10000);
stopRainPacket.setPosition(Vector3f.ZERO);
session.sendUpstreamPacket(stopRainPacket);
if (entity.getDimension() != DimensionUtils.javaToBedrock(packet.getDimension())) {
DimensionUtils.switchDimension(session, packet.getDimension());
} else {
if (session.isManyDimPackets()) { //reloading world
int fakeDim = entity.getDimension() == 0 ? -1 : 0;
DimensionUtils.switchDimension(session, fakeDim);
DimensionUtils.switchDimension(session, packet.getDimension());
} else {
// Handled in JavaPlayerPositionRotationTranslator
session.setSpawned(false);
}
}
}
示例5
@Override
public void deserialize(ByteBuf buffer, LevelEventPacket packet) {
int eventId = VarInts.readInt(buffer);
packet.setType(events.get(eventId));
if (packet.getType() == null) {
log.debug("Unknown Level Event {} received", eventId);
}
packet.setPosition(BedrockUtils.readVector3f(buffer));
packet.setData(VarInts.readInt(buffer));
}
示例6
@Override
public void deserialize(ByteBuf buffer, LevelEventPacket packet) {
int eventId = VarInts.readInt(buffer);
packet.setType(events.get(eventId));
if (packet.getType() == null) {
log.debug("Unknown Level Event {} received", eventId);
}
packet.setPosition(BedrockUtils.readVector3f(buffer));
packet.setData(VarInts.readInt(buffer));
}
示例7
@Override
public void deserialize(ByteBuf buffer, LevelEventPacket packet) {
int eventId = VarInts.readInt(buffer);
packet.setType(events.get(eventId));
if (packet.getType() == null) {
log.debug("Unknown Level Event {} received", eventId);
}
packet.setPosition(BedrockUtils.readVector3f(buffer));
packet.setData(VarInts.readInt(buffer));
}
示例8
@Override
public void deserialize(ByteBuf buffer, LevelEventPacket packet) {
int eventId = VarInts.readInt(buffer);
packet.setType(events.get(eventId));
if (packet.getType() == null) {
log.debug("Unknown Level Event {} received", eventId);
}
packet.setPosition(BedrockUtils.readVector3f(buffer));
packet.setData(VarInts.readInt(buffer));
}
示例9
@Override
public void deserialize(ByteBuf buffer, LevelEventPacket packet) {
int eventId = VarInts.readInt(buffer);
packet.setType(events.get(eventId));
if (packet.getType() == null) {
log.debug("Unknown Level Event {} received", eventId);
}
packet.setPosition(BedrockUtils.readVector3f(buffer));
packet.setData(VarInts.readInt(buffer));
}
示例10
@Override
public void deserialize(ByteBuf buffer, LevelEventPacket packet) {
int eventId = VarInts.readInt(buffer);
packet.setType(events.get(eventId));
if (packet.getType() == null) {
log.debug("Unknown Level Event {} received", eventId);
}
packet.setPosition(BedrockUtils.readVector3f(buffer));
packet.setData(VarInts.readInt(buffer));
}
示例11
@Override
public void deserialize(ByteBuf buffer, LevelEventPacket packet) {
int eventId = VarInts.readInt(buffer);
packet.setType(events.get(eventId));
if (packet.getType() == null) {
log.debug("Unknown Level Event {} received", eventId);
}
packet.setPosition(BedrockUtils.readVector3f(buffer));
packet.setData(VarInts.readInt(buffer));
}
示例12
@Override
public void translate(ServerSpawnParticlePacket packet, GeyserSession session) {
LevelEventPacket particle = new LevelEventPacket();
switch (packet.getParticle().getType()) {
case BLOCK:
particle.setType(LevelEventType.DESTROY);
particle.setPosition(Vector3f.from(packet.getX(), packet.getY(), packet.getZ()));
particle.setData(BlockTranslator.getBedrockBlockId(((BlockParticleData) packet.getParticle().getData()).getBlockState()));
session.sendUpstreamPacket(particle);
break;
case FALLING_DUST:
//In fact, FallingDustParticle should have data like DustParticle,
//but in MCProtocol, its data is BlockState(1).
particle.setType(LevelEventType.PARTICLE_FALLING_DUST);
particle.setData(BlockTranslator.getBedrockBlockId(((FallingDustParticleData)packet.getParticle().getData()).getBlockState()));
particle.setPosition(Vector3f.from(packet.getX(), packet.getY(), packet.getZ()));
session.sendUpstreamPacket(particle);
break;
case ITEM:
ItemStack javaItem = ((ItemParticleData)packet.getParticle().getData()).getItemStack();
ItemData bedrockItem = ItemTranslator.translateToBedrock(session, javaItem);
int id = bedrockItem.getId();
short damage = bedrockItem.getDamage();
particle.setType(LevelEventType.PARTICLE_ITEM_BREAK);
particle.setData(id << 16 | damage);
particle.setPosition(Vector3f.from(packet.getX(), packet.getY(), packet.getZ()));
session.sendUpstreamPacket(particle);
break;
case DUST:
DustParticleData data = (DustParticleData)packet.getParticle().getData();
int r = (int) (data.getRed()*255);
int g = (int) (data.getGreen()*255);
int b = (int) (data.getBlue()*255);
particle.setType(LevelEventType.PARTICLE_FALLING_DUST);
particle.setData(((0xff) << 24) | ((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff));
particle.setPosition(Vector3f.from(packet.getX(), packet.getY(), packet.getZ()));
session.sendUpstreamPacket(particle);
break;
default:
LevelEventType typeParticle = EffectRegistry.getParticleLevelEventType(packet.getParticle().getType());
if (typeParticle != null) {
particle.setType(typeParticle);
particle.setPosition(Vector3f.from(packet.getX(), packet.getY(), packet.getZ()));
session.sendUpstreamPacket(particle);
} else {
String stringParticle = EffectRegistry.getParticleString(packet.getParticle().getType());
if (stringParticle != null) {
SpawnParticleEffectPacket stringPacket = new SpawnParticleEffectPacket();
stringPacket.setIdentifier(stringParticle);
stringPacket.setDimensionId(session.getPlayerEntity().getDimension());
stringPacket.setPosition(Vector3f.from(packet.getX(), packet.getY(), packet.getZ()));
session.sendUpstreamPacket(stringPacket);
}
}
break;
}
}
示例13
@Override
public void translate(ServerPlayBuiltinSoundPacket packet, GeyserSession session) {
String packetSound = packet.getSound().getName();
SoundRegistry.SoundMapping soundMapping = SoundRegistry.fromJava(packetSound);
if (soundMapping == null) {
session.getConnector().getLogger().debug("[Builtin] Sound mapping " + packetSound + " not found - " + packet.toString());
return;
}
if (soundMapping.isLevelEvent()) {
LevelEventPacket levelEventPacket = new LevelEventPacket();
levelEventPacket.setPosition(Vector3f.from(packet.getX(), packet.getY(), packet.getZ()));
levelEventPacket.setData(0);
levelEventPacket.setType(LevelEventType.valueOf(soundMapping.getBedrock()));
session.sendUpstreamPacket(levelEventPacket);
return;
}
LevelSoundEventPacket soundPacket = new LevelSoundEventPacket();
SoundEvent sound = SoundRegistry.toSoundEvent(soundMapping.getBedrock());
if (sound == null) {
sound = SoundRegistry.toSoundEvent(soundMapping.getBedrock());
}
if (sound == null) {
sound = SoundRegistry.toSoundEvent(packetSound);
}
if (sound == null) {
session.getConnector().getLogger().debug("[Builtin] Sound for original " + packetSound + " to mappings " + soundPacket
+ " was not a playable level sound, or has yet to be mapped to an enum in "
+ "NukkitX SoundEvent ");
}
soundPacket.setSound(sound);
soundPacket.setPosition(Vector3f.from(packet.getX(), packet.getY(), packet.getZ()));
soundPacket.setIdentifier(soundMapping.getIdentifier());
if (sound == SoundEvent.NOTE) {
// Minecraft Wiki: 2^(x/12) = Java pitch where x is -12 to 12
// Java sends the note value as above starting with -12 and ending at 12
// Bedrock has a number for each type of note, then proceeds up the scale by adding to that number
soundPacket.setExtraData(soundMapping.getExtraData() + (int)(Math.round((Math.log10(packet.getPitch()) / Math.log10(2)) * 12)) + 12);
} else if (sound == SoundEvent.PLACE && soundMapping.getExtraData() == -1) {
soundPacket.setExtraData(BlockTranslator.getBedrockBlockId(BlockTranslator.getJavaBlockState(soundMapping.getIdentifier())));
soundPacket.setIdentifier(":");
} else {
soundPacket.setExtraData(soundMapping.getExtraData());
}
soundPacket.setBabySound(false); // might need to adjust this in the future
soundPacket.setRelativeVolumeDisabled(false);
session.sendUpstreamPacket(soundPacket);
}
示例14
@Override
public void translate(ServerBlockBreakAnimPacket packet, GeyserSession session) {
BlockState state = session.getConnector().getWorldManager().getBlockAt(session, packet.getPosition().getX(), packet.getPosition().getY(), packet.getPosition().getZ());
int breakTime = (int) (65535 / Math.ceil(BlockUtils.getBreakTime(BlockTranslator.JAVA_RUNTIME_ID_TO_HARDNESS.get(state.getId()), state.getId(), ItemEntry.AIR, new CompoundTag(""), null) * 20));
LevelEventPacket levelEventPacket = new LevelEventPacket();
levelEventPacket.setPosition(Vector3f.from(
packet.getPosition().getX(),
packet.getPosition().getY(),
packet.getPosition().getZ()
));
levelEventPacket.setType(LevelEventType.BLOCK_START_BREAK);
switch (packet.getStage()) {
case STAGE_1:
levelEventPacket.setData(breakTime);
break;
case STAGE_2:
levelEventPacket.setData(breakTime * 2);
break;
case STAGE_3:
levelEventPacket.setData(breakTime * 3);
break;
case STAGE_4:
levelEventPacket.setData(breakTime * 4);
break;
case STAGE_5:
levelEventPacket.setData(breakTime * 5);
break;
case STAGE_6:
levelEventPacket.setData(breakTime * 6);
break;
case STAGE_7:
levelEventPacket.setData(breakTime * 7);
break;
case STAGE_8:
levelEventPacket.setData(breakTime * 8);
break;
case STAGE_9:
levelEventPacket.setData(breakTime * 9);
break;
case STAGE_10:
levelEventPacket.setData(breakTime * 10);
break;
case RESET:
levelEventPacket.setType(LevelEventType.BLOCK_STOP_BREAK);
levelEventPacket.setData(0);
break;
}
session.sendUpstreamPacket(levelEventPacket);
}
示例15
@Override
public void translate(ServerPlayerActionAckPacket packet, GeyserSession session) {
LevelEventPacket levelEvent = new LevelEventPacket();
switch (packet.getAction()) {
case FINISH_DIGGING:
double blockHardness = BlockTranslator.JAVA_RUNTIME_ID_TO_HARDNESS.get(session.getBreakingBlock() == null ? 0 : session.getBreakingBlock().getId());
if (session.getGameMode() != GameMode.CREATIVE && blockHardness != 0) {
levelEvent.setType(LevelEventType.DESTROY);
levelEvent.setPosition(Vector3f.from(packet.getPosition().getX(), packet.getPosition().getY(), packet.getPosition().getZ()));
levelEvent.setData(BlockTranslator.getBedrockBlockId(session.getBreakingBlock()));
session.sendUpstreamPacket(levelEvent);
session.setBreakingBlock(null);
}
ChunkUtils.updateBlock(session, packet.getNewState(), packet.getPosition());
break;
case START_DIGGING:
if (session.getGameMode() == GameMode.CREATIVE) {
break;
}
blockHardness = BlockTranslator.JAVA_RUNTIME_ID_TO_HARDNESS.get(packet.getNewState().getId());
levelEvent.setType(LevelEventType.BLOCK_START_BREAK);
levelEvent.setPosition(Vector3f.from(
packet.getPosition().getX(),
packet.getPosition().getY(),
packet.getPosition().getZ()
));
PlayerInventory inventory = session.getInventory();
ItemStack item = inventory.getItemInHand();
ItemEntry itemEntry = null;
CompoundTag nbtData = new CompoundTag("");
if (item != null) {
itemEntry = ItemRegistry.getItem(item);
nbtData = item.getNbt();
}
double breakTime = Math.ceil(BlockUtils.getBreakTime(blockHardness, packet.getNewState().getId(), itemEntry, nbtData, session) * 20);
levelEvent.setData((int) (65535 / breakTime));
session.setBreakingBlock(packet.getNewState());
session.sendUpstreamPacket(levelEvent);
break;
case CANCEL_DIGGING:
levelEvent.setType(LevelEventType.BLOCK_STOP_BREAK);
levelEvent.setPosition(Vector3f.from(
packet.getPosition().getX(),
packet.getPosition().getY(),
packet.getPosition().getZ()
));
levelEvent.setData(0);
session.setBreakingBlock(null);
session.sendUpstreamPacket(levelEvent);
break;
}
}
示例16
@Override
public void translate(PlayerActionPacket packet, GeyserSession session) {
Entity entity = session.getPlayerEntity();
if (entity == null)
return;
Vector3i vector = packet.getBlockPosition();
Position position = new Position(vector.getX(), vector.getY(), vector.getZ());
switch (packet.getAction()) {
case RESPAWN:
// Don't put anything here as respawn is already handled
// in BedrockRespawnTranslator
break;
case START_SWIMMING:
ClientPlayerStatePacket startSwimPacket = new ClientPlayerStatePacket((int) entity.getEntityId(), PlayerState.START_SPRINTING);
session.sendDownstreamPacket(startSwimPacket);
break;
case STOP_SWIMMING:
ClientPlayerStatePacket stopSwimPacket = new ClientPlayerStatePacket((int) entity.getEntityId(), PlayerState.STOP_SPRINTING);
session.sendDownstreamPacket(stopSwimPacket);
break;
case START_GLIDE:
case STOP_GLIDE:
ClientPlayerStatePacket glidePacket = new ClientPlayerStatePacket((int) entity.getEntityId(), PlayerState.START_ELYTRA_FLYING);
session.sendDownstreamPacket(glidePacket);
break;
case START_SNEAK:
ClientPlayerStatePacket startSneakPacket = new ClientPlayerStatePacket((int) entity.getEntityId(), PlayerState.START_SNEAKING);
session.sendDownstreamPacket(startSneakPacket);
session.setSneaking(true);
break;
case STOP_SNEAK:
ClientPlayerStatePacket stopSneakPacket = new ClientPlayerStatePacket((int) entity.getEntityId(), PlayerState.STOP_SNEAKING);
session.sendDownstreamPacket(stopSneakPacket);
session.setSneaking(false);
break;
case START_SPRINT:
ClientPlayerStatePacket startSprintPacket = new ClientPlayerStatePacket((int) entity.getEntityId(), PlayerState.START_SPRINTING);
session.sendDownstreamPacket(startSprintPacket);
session.setSprinting(true);
break;
case STOP_SPRINT:
ClientPlayerStatePacket stopSprintPacket = new ClientPlayerStatePacket((int) entity.getEntityId(), PlayerState.STOP_SPRINTING);
session.sendDownstreamPacket(stopSprintPacket);
session.setSprinting(false);
break;
case DROP_ITEM:
ClientPlayerActionPacket dropItemPacket = new ClientPlayerActionPacket(PlayerAction.DROP_ITEM, position, BlockFace.values()[packet.getFace()]);
session.sendDownstreamPacket(dropItemPacket);
break;
case STOP_SLEEP:
ClientPlayerStatePacket stopSleepingPacket = new ClientPlayerStatePacket((int) entity.getEntityId(), PlayerState.LEAVE_BED);
session.sendDownstreamPacket(stopSleepingPacket);
break;
case BLOCK_INTERACT:
// Handled in BedrockInventoryTransactionTranslator
break;
case START_BREAK:
ClientPlayerActionPacket startBreakingPacket = new ClientPlayerActionPacket(PlayerAction.START_DIGGING, new Position(packet.getBlockPosition().getX(),
packet.getBlockPosition().getY(), packet.getBlockPosition().getZ()), BlockFace.values()[packet.getFace()]);
session.sendDownstreamPacket(startBreakingPacket);
break;
case CONTINUE_BREAK:
LevelEventPacket continueBreakPacket = new LevelEventPacket();
continueBreakPacket.setType(LevelEventType.PUNCH_BLOCK);
continueBreakPacket.setData(BlockTranslator.getBedrockBlockId(session.getBreakingBlock() == null ? BlockTranslator.AIR : session.getBreakingBlock()));
continueBreakPacket.setPosition(packet.getBlockPosition().toFloat());
session.sendUpstreamPacket(continueBreakPacket);
break;
case ABORT_BREAK:
ClientPlayerActionPacket abortBreakingPacket = new ClientPlayerActionPacket(PlayerAction.CANCEL_DIGGING, new Position(packet.getBlockPosition().getX(),
packet.getBlockPosition().getY(), packet.getBlockPosition().getZ()), BlockFace.DOWN);
session.sendDownstreamPacket(abortBreakingPacket);
break;
case STOP_BREAK:
// Handled in BedrockInventoryTransactionTranslator
break;
case DIMENSION_CHANGE_SUCCESS:
if (session.getPendingDimSwitches().decrementAndGet() == 0) {
//sometimes the client doesn't feel like loading
PlayStatusPacket spawnPacket = new PlayStatusPacket();
spawnPacket.setStatus(PlayStatusPacket.Status.PLAYER_SPAWN);
session.sendUpstreamPacket(spawnPacket);
entity.updateBedrockAttributes(session);
session.getEntityCache().updateBossBars();
}
break;
case JUMP:
session.setJumping(true);
session.getConnector().getGeneralThreadPool().schedule(() -> {
session.setJumping(false);
}, 1, TimeUnit.SECONDS);
break;
}
}
示例17
@Override
public void serialize(ByteBuf buffer, LevelEventPacket packet) {
VarInts.writeInt(buffer, events.get(packet.getType()));
BedrockUtils.writeVector3f(buffer, packet.getPosition());
VarInts.writeInt(buffer, packet.getData());
}
示例18
@Override
public void serialize(ByteBuf buffer, LevelEventPacket packet) {
VarInts.writeInt(buffer, events.get(packet.getType()));
BedrockUtils.writeVector3f(buffer, packet.getPosition());
VarInts.writeInt(buffer, packet.getData());
}
示例19
@Override
public void serialize(ByteBuf buffer, LevelEventPacket packet) {
VarInts.writeInt(buffer, events.get(packet.getType()));
BedrockUtils.writeVector3f(buffer, packet.getPosition());
VarInts.writeInt(buffer, packet.getData());
}
示例20
@Override
public void serialize(ByteBuf buffer, LevelEventPacket packet) {
VarInts.writeInt(buffer, events.get(packet.getType()));
BedrockUtils.writeVector3f(buffer, packet.getPosition());
VarInts.writeInt(buffer, packet.getData());
}
示例21
@Override
public void serialize(ByteBuf buffer, LevelEventPacket packet) {
VarInts.writeInt(buffer, events.get(packet.getType()));
BedrockUtils.writeVector3f(buffer, packet.getPosition());
VarInts.writeInt(buffer, packet.getData());
}
示例22
@Override
public void serialize(ByteBuf buffer, LevelEventPacket packet) {
VarInts.writeInt(buffer, events.get(packet.getType()));
BedrockUtils.writeVector3f(buffer, packet.getPosition());
VarInts.writeInt(buffer, packet.getData());
}
示例23
@Override
public void serialize(ByteBuf buffer, LevelEventPacket packet) {
VarInts.writeInt(buffer, events.get(packet.getType()));
BedrockUtils.writeVector3f(buffer, packet.getPosition());
VarInts.writeInt(buffer, packet.getData());
}