Mirror von
https://github.com/GeyserMC/Geyser.git
synchronisiert 2024-12-26 16:12:46 +01:00
Update CodecProcessor
Dieser Commit ist enthalten in:
Ursprung
4da8eca99a
Commit
edd62eb39e
@ -26,7 +26,6 @@
|
|||||||
package org.geysermc.geyser.level;
|
package org.geysermc.geyser.level;
|
||||||
|
|
||||||
import org.cloudburstmc.nbt.NbtMap;
|
import org.cloudburstmc.nbt.NbtMap;
|
||||||
import org.geysermc.geyser.GeyserImpl;
|
|
||||||
import org.geysermc.geyser.session.cache.registry.RegistryEntryContext;
|
import org.geysermc.geyser.session.cache.registry.RegistryEntryContext;
|
||||||
import org.geysermc.geyser.translator.text.MessageTranslator;
|
import org.geysermc.geyser.translator.text.MessageTranslator;
|
||||||
import org.geysermc.geyser.util.SoundUtils;
|
import org.geysermc.geyser.util.SoundUtils;
|
||||||
@ -35,7 +34,7 @@ public record JukeboxSong(String soundEvent, String description) {
|
|||||||
|
|
||||||
public static JukeboxSong read(RegistryEntryContext context) {
|
public static JukeboxSong read(RegistryEntryContext context) {
|
||||||
NbtMap data = context.data();
|
NbtMap data = context.data();
|
||||||
String soundEvent = SoundUtils.readSoundEvent(data, "jukebox song " + context.id());;
|
String soundEvent = SoundUtils.readSoundEvent(data, "jukebox song " + context.id());
|
||||||
String description = MessageTranslator.deserializeDescription(context.session(), data);
|
String description = MessageTranslator.deserializeDescription(context.session(), data);
|
||||||
return new JukeboxSong(soundEvent, description);
|
return new JukeboxSong(soundEvent, description);
|
||||||
}
|
}
|
||||||
|
@ -31,11 +31,13 @@ import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper;
|
|||||||
import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer;
|
import org.cloudburstmc.protocol.bedrock.codec.BedrockPacketSerializer;
|
||||||
import org.cloudburstmc.protocol.bedrock.codec.v291.serializer.MobArmorEquipmentSerializer_v291;
|
import org.cloudburstmc.protocol.bedrock.codec.v291.serializer.MobArmorEquipmentSerializer_v291;
|
||||||
import org.cloudburstmc.protocol.bedrock.codec.v291.serializer.MobEquipmentSerializer_v291;
|
import org.cloudburstmc.protocol.bedrock.codec.v291.serializer.MobEquipmentSerializer_v291;
|
||||||
|
import org.cloudburstmc.protocol.bedrock.codec.v291.serializer.MoveEntityAbsoluteSerializer_v291;
|
||||||
import org.cloudburstmc.protocol.bedrock.codec.v291.serializer.PlayerHotbarSerializer_v291;
|
import org.cloudburstmc.protocol.bedrock.codec.v291.serializer.PlayerHotbarSerializer_v291;
|
||||||
import org.cloudburstmc.protocol.bedrock.codec.v291.serializer.SetEntityLinkSerializer_v291;
|
import org.cloudburstmc.protocol.bedrock.codec.v291.serializer.SetEntityLinkSerializer_v291;
|
||||||
import org.cloudburstmc.protocol.bedrock.codec.v390.serializer.PlayerSkinSerializer_v390;
|
import org.cloudburstmc.protocol.bedrock.codec.v390.serializer.PlayerSkinSerializer_v390;
|
||||||
import org.cloudburstmc.protocol.bedrock.codec.v407.serializer.InventoryContentSerializer_v407;
|
import org.cloudburstmc.protocol.bedrock.codec.v407.serializer.InventoryContentSerializer_v407;
|
||||||
import org.cloudburstmc.protocol.bedrock.codec.v407.serializer.InventorySlotSerializer_v407;
|
import org.cloudburstmc.protocol.bedrock.codec.v407.serializer.InventorySlotSerializer_v407;
|
||||||
|
import org.cloudburstmc.protocol.bedrock.codec.v419.serializer.MovePlayerSerializer_v419;
|
||||||
import org.cloudburstmc.protocol.bedrock.codec.v486.serializer.BossEventSerializer_v486;
|
import org.cloudburstmc.protocol.bedrock.codec.v486.serializer.BossEventSerializer_v486;
|
||||||
import org.cloudburstmc.protocol.bedrock.codec.v557.serializer.SetEntityDataSerializer_v557;
|
import org.cloudburstmc.protocol.bedrock.codec.v557.serializer.SetEntityDataSerializer_v557;
|
||||||
import org.cloudburstmc.protocol.bedrock.codec.v662.serializer.SetEntityMotionSerializer_v662;
|
import org.cloudburstmc.protocol.bedrock.codec.v662.serializer.SetEntityMotionSerializer_v662;
|
||||||
@ -67,14 +69,18 @@ import org.cloudburstmc.protocol.bedrock.packet.MapCreateLockedCopyPacket;
|
|||||||
import org.cloudburstmc.protocol.bedrock.packet.MapInfoRequestPacket;
|
import org.cloudburstmc.protocol.bedrock.packet.MapInfoRequestPacket;
|
||||||
import org.cloudburstmc.protocol.bedrock.packet.MobArmorEquipmentPacket;
|
import org.cloudburstmc.protocol.bedrock.packet.MobArmorEquipmentPacket;
|
||||||
import org.cloudburstmc.protocol.bedrock.packet.MobEquipmentPacket;
|
import org.cloudburstmc.protocol.bedrock.packet.MobEquipmentPacket;
|
||||||
|
import org.cloudburstmc.protocol.bedrock.packet.MoveEntityAbsolutePacket;
|
||||||
|
import org.cloudburstmc.protocol.bedrock.packet.MovePlayerPacket;
|
||||||
import org.cloudburstmc.protocol.bedrock.packet.MultiplayerSettingsPacket;
|
import org.cloudburstmc.protocol.bedrock.packet.MultiplayerSettingsPacket;
|
||||||
import org.cloudburstmc.protocol.bedrock.packet.NpcRequestPacket;
|
import org.cloudburstmc.protocol.bedrock.packet.NpcRequestPacket;
|
||||||
import org.cloudburstmc.protocol.bedrock.packet.PhotoInfoRequestPacket;
|
import org.cloudburstmc.protocol.bedrock.packet.PhotoInfoRequestPacket;
|
||||||
import org.cloudburstmc.protocol.bedrock.packet.PhotoTransferPacket;
|
import org.cloudburstmc.protocol.bedrock.packet.PhotoTransferPacket;
|
||||||
import org.cloudburstmc.protocol.bedrock.packet.PlayerHotbarPacket;
|
import org.cloudburstmc.protocol.bedrock.packet.PlayerHotbarPacket;
|
||||||
|
import org.cloudburstmc.protocol.bedrock.packet.PlayerInputPacket;
|
||||||
import org.cloudburstmc.protocol.bedrock.packet.PlayerSkinPacket;
|
import org.cloudburstmc.protocol.bedrock.packet.PlayerSkinPacket;
|
||||||
import org.cloudburstmc.protocol.bedrock.packet.PurchaseReceiptPacket;
|
import org.cloudburstmc.protocol.bedrock.packet.PurchaseReceiptPacket;
|
||||||
import org.cloudburstmc.protocol.bedrock.packet.RefreshEntitlementsPacket;
|
import org.cloudburstmc.protocol.bedrock.packet.RefreshEntitlementsPacket;
|
||||||
|
import org.cloudburstmc.protocol.bedrock.packet.RiderJumpPacket;
|
||||||
import org.cloudburstmc.protocol.bedrock.packet.ScriptMessagePacket;
|
import org.cloudburstmc.protocol.bedrock.packet.ScriptMessagePacket;
|
||||||
import org.cloudburstmc.protocol.bedrock.packet.SetEntityDataPacket;
|
import org.cloudburstmc.protocol.bedrock.packet.SetEntityDataPacket;
|
||||||
import org.cloudburstmc.protocol.bedrock.packet.SetEntityLinkPacket;
|
import org.cloudburstmc.protocol.bedrock.packet.SetEntityLinkPacket;
|
||||||
@ -189,6 +195,20 @@ class CodecProcessor {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private static final BedrockPacketSerializer<MovePlayerPacket> MOVE_PLAYER_SERIALIZER = new MovePlayerSerializer_v419() {
|
||||||
|
@Override
|
||||||
|
public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, MovePlayerPacket packet) {
|
||||||
|
throw new IllegalArgumentException("Client cannot send MovePlayerPacket in server-auth movement environment!");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private static final BedrockPacketSerializer<MoveEntityAbsolutePacket> MOVE_ENTITY_SERIALIZER = new MoveEntityAbsoluteSerializer_v291() {
|
||||||
|
@Override
|
||||||
|
public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, MoveEntityAbsolutePacket packet) {
|
||||||
|
throw new IllegalArgumentException("Client cannot send MoveEntityAbsolutePacket in server-auth movement environment!");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Serializer that does nothing when trying to deserialize BossEventPacket since it is not used from the client.
|
* Serializer that does nothing when trying to deserialize BossEventPacket since it is not used from the client.
|
||||||
*/
|
*/
|
||||||
@ -317,7 +337,6 @@ class CodecProcessor {
|
|||||||
.updateSerializer(ClientCheatAbilityPacket.class, ILLEGAL_SERIALIZER)
|
.updateSerializer(ClientCheatAbilityPacket.class, ILLEGAL_SERIALIZER)
|
||||||
.updateSerializer(CraftingEventPacket.class, ILLEGAL_SERIALIZER)
|
.updateSerializer(CraftingEventPacket.class, ILLEGAL_SERIALIZER)
|
||||||
// Illegal unusued serverbound packets that relate to unused features
|
// Illegal unusued serverbound packets that relate to unused features
|
||||||
//.updateSerializer(PlayerAuthInputPacket.class, ILLEGAL_SERIALIZER) TODO keeping until we determine which packets should replace
|
|
||||||
.updateSerializer(ClientCacheBlobStatusPacket.class, ILLEGAL_SERIALIZER)
|
.updateSerializer(ClientCacheBlobStatusPacket.class, ILLEGAL_SERIALIZER)
|
||||||
.updateSerializer(SubClientLoginPacket.class, ILLEGAL_SERIALIZER)
|
.updateSerializer(SubClientLoginPacket.class, ILLEGAL_SERIALIZER)
|
||||||
.updateSerializer(SubChunkRequestPacket.class, ILLEGAL_SERIALIZER)
|
.updateSerializer(SubChunkRequestPacket.class, ILLEGAL_SERIALIZER)
|
||||||
@ -333,6 +352,10 @@ class CodecProcessor {
|
|||||||
// Illegal when serverbound due to Geyser specific setup
|
// Illegal when serverbound due to Geyser specific setup
|
||||||
.updateSerializer(InventoryContentPacket.class, inventoryContentSerializer)
|
.updateSerializer(InventoryContentPacket.class, inventoryContentSerializer)
|
||||||
.updateSerializer(InventorySlotPacket.class, inventorySlotSerializer)
|
.updateSerializer(InventorySlotPacket.class, inventorySlotSerializer)
|
||||||
|
.updateSerializer(MovePlayerPacket.class, MOVE_PLAYER_SERIALIZER)
|
||||||
|
.updateSerializer(MoveEntityAbsolutePacket.class, MOVE_ENTITY_SERIALIZER)
|
||||||
|
.updateSerializer(RiderJumpPacket.class, ILLEGAL_SERIALIZER)
|
||||||
|
.updateSerializer(PlayerInputPacket.class, ILLEGAL_SERIALIZER)
|
||||||
// Ignored only when serverbound
|
// Ignored only when serverbound
|
||||||
.updateSerializer(BossEventPacket.class, BOSS_EVENT_SERIALIZER)
|
.updateSerializer(BossEventPacket.class, BOSS_EVENT_SERIALIZER)
|
||||||
.updateSerializer(MobArmorEquipmentPacket.class, is712OrAbove ? MOB_ARMOR_EQUIPMENT_SERIALIZER_V712 : MOB_ARMOR_EQUIPMENT_SERIALIZER_V291)
|
.updateSerializer(MobArmorEquipmentPacket.class, is712OrAbove ? MOB_ARMOR_EQUIPMENT_SERIALIZER_V712 : MOB_ARMOR_EQUIPMENT_SERIALIZER_V291)
|
||||||
|
@ -1,74 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2019-2022 GeyserMC. http://geysermc.org
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*
|
|
||||||
* @author GeyserMC
|
|
||||||
* @link https://github.com/GeyserMC/Geyser
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.geysermc.geyser.translator.protocol.bedrock;
|
|
||||||
|
|
||||||
import org.cloudburstmc.math.vector.Vector3f;
|
|
||||||
import org.cloudburstmc.protocol.bedrock.packet.MoveEntityAbsolutePacket;
|
|
||||||
import org.geysermc.geyser.entity.type.BoatEntity;
|
|
||||||
import org.geysermc.geyser.entity.type.Entity;
|
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
|
||||||
import org.geysermc.geyser.translator.protocol.PacketTranslator;
|
|
||||||
import org.geysermc.geyser.translator.protocol.Translator;
|
|
||||||
import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.level.ServerboundMoveVehiclePacket;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sent by the client when moving a horse or boat.
|
|
||||||
*/
|
|
||||||
@Translator(packet = MoveEntityAbsolutePacket.class)
|
|
||||||
public class BedrockMoveEntityAbsoluteTranslator extends PacketTranslator<MoveEntityAbsolutePacket> {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void translate(GeyserSession session, MoveEntityAbsolutePacket packet) {
|
|
||||||
Entity ridingEntity = session.getPlayerEntity().getVehicle();
|
|
||||||
if (ridingEntity != null && session.getWorldBorder().isPassingIntoBorderBoundaries(packet.getPosition(), false)) {
|
|
||||||
Vector3f position = Vector3f.from(ridingEntity.getPosition().getX(), packet.getPosition().getY(),
|
|
||||||
ridingEntity.getPosition().getZ());
|
|
||||||
if (ridingEntity instanceof BoatEntity) {
|
|
||||||
// Undo the changes usually applied to the boat
|
|
||||||
// ridingEntity.as(BoatEntity.class)
|
|
||||||
// .moveAbsoluteWithoutAdjustments(position, ridingEntity.getYaw(),
|
|
||||||
// ridingEntity.isOnGround(), true);
|
|
||||||
} else {
|
|
||||||
// This doesn't work if teleported is false
|
|
||||||
ridingEntity.moveAbsolute(position,
|
|
||||||
ridingEntity.getYaw(), ridingEntity.getPitch(), ridingEntity.getHeadYaw(),
|
|
||||||
ridingEntity.isOnGround(), true);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
float y = packet.getPosition().getY();
|
|
||||||
if (ridingEntity instanceof BoatEntity && !ridingEntity.isOnGround()) {
|
|
||||||
// Remove the offset to prevents boats from looking like they're floating in water
|
|
||||||
y -= ridingEntity.getDefinition().offset();
|
|
||||||
}
|
|
||||||
ServerboundMoveVehiclePacket ServerboundMoveVehiclePacket = new ServerboundMoveVehiclePacket(
|
|
||||||
packet.getPosition().getX(), y, packet.getPosition().getZ(),
|
|
||||||
packet.getRotation().getY() - 90, packet.getRotation().getX()
|
|
||||||
);
|
|
||||||
session.sendDownstreamGamePacket(ServerboundMoveVehiclePacket);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,49 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2019-2022 GeyserMC. http://geysermc.org
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*
|
|
||||||
* @author GeyserMC
|
|
||||||
* @link https://github.com/GeyserMC/Geyser
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.geysermc.geyser.translator.protocol.bedrock;
|
|
||||||
|
|
||||||
import org.cloudburstmc.math.vector.Vector3f;
|
|
||||||
import org.cloudburstmc.protocol.bedrock.packet.PlayerInputPacket;
|
|
||||||
import org.geysermc.geyser.entity.type.BoatEntity;
|
|
||||||
import org.geysermc.geyser.entity.type.Entity;
|
|
||||||
import org.geysermc.geyser.entity.type.living.animal.horse.AbstractHorseEntity;
|
|
||||||
import org.geysermc.geyser.entity.type.living.animal.horse.LlamaEntity;
|
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
|
||||||
import org.geysermc.geyser.translator.protocol.PacketTranslator;
|
|
||||||
import org.geysermc.geyser.translator.protocol.Translator;
|
|
||||||
import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.level.ServerboundMoveVehiclePacket;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sent by the client for minecarts and boats.
|
|
||||||
*/
|
|
||||||
@Translator(packet = PlayerInputPacket.class)
|
|
||||||
public class BedrockPlayerInputTranslator extends PacketTranslator<PlayerInputPacket> {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void translate(GeyserSession session, PlayerInputPacket packet) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,49 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2019-2022 GeyserMC. http://geysermc.org
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*
|
|
||||||
* @author GeyserMC
|
|
||||||
* @link https://github.com/GeyserMC/Geyser
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.geysermc.geyser.translator.protocol.bedrock.entity.player;
|
|
||||||
|
|
||||||
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.PlayerState;
|
|
||||||
import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.player.ServerboundPlayerCommandPacket;
|
|
||||||
import org.cloudburstmc.protocol.bedrock.packet.RiderJumpPacket;
|
|
||||||
import org.geysermc.geyser.entity.type.Entity;
|
|
||||||
import org.geysermc.geyser.entity.type.living.animal.horse.AbstractHorseEntity;
|
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
|
||||||
import org.geysermc.geyser.translator.protocol.PacketTranslator;
|
|
||||||
import org.geysermc.geyser.translator.protocol.Translator;
|
|
||||||
|
|
||||||
@Translator(packet = RiderJumpPacket.class)
|
|
||||||
public class BedrockRiderJumpTranslator extends PacketTranslator<RiderJumpPacket> {
|
|
||||||
@Override
|
|
||||||
public void translate(GeyserSession session, RiderJumpPacket packet) {
|
|
||||||
session.getPlayerEntity().setVehicleJumpStrength(packet.getJumpStrength());
|
|
||||||
|
|
||||||
Entity vehicle = session.getPlayerEntity().getVehicle();
|
|
||||||
if (vehicle instanceof AbstractHorseEntity) {
|
|
||||||
ServerboundPlayerCommandPacket playerCommandPacket = new ServerboundPlayerCommandPacket(vehicle.getEntityId(), PlayerState.START_HORSE_JUMP, packet.getJumpStrength());
|
|
||||||
session.sendDownstreamGamePacket(playerCommandPacket);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren