forked from GeyserMC/Geyser
Compare commits
2 commits
master
...
feature/sp
Author | SHA1 | Date | |
---|---|---|---|
|
116dea9cb6 | ||
|
4bbb057f62 |
11 changed files with 127 additions and 4 deletions
|
@ -56,10 +56,7 @@ import org.geysermc.connector.utils.AttributeUtils;
|
||||||
import org.geysermc.connector.utils.ChunkUtils;
|
import org.geysermc.connector.utils.ChunkUtils;
|
||||||
import org.geysermc.connector.utils.MessageUtils;
|
import org.geysermc.connector.utils.MessageUtils;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
|
@ -67,6 +64,8 @@ public class Entity {
|
||||||
protected long entityId;
|
protected long entityId;
|
||||||
protected long geyserId;
|
protected long geyserId;
|
||||||
|
|
||||||
|
protected UUID javaUuid;
|
||||||
|
|
||||||
protected String dimension;
|
protected String dimension;
|
||||||
|
|
||||||
protected Vector3f position;
|
protected Vector3f position;
|
||||||
|
|
|
@ -47,6 +47,7 @@ import com.nukkitx.protocol.bedrock.BedrockPacket;
|
||||||
import com.nukkitx.protocol.bedrock.BedrockServerSession;
|
import com.nukkitx.protocol.bedrock.BedrockServerSession;
|
||||||
import com.nukkitx.protocol.bedrock.data.*;
|
import com.nukkitx.protocol.bedrock.data.*;
|
||||||
import com.nukkitx.protocol.bedrock.data.command.CommandPermission;
|
import com.nukkitx.protocol.bedrock.data.command.CommandPermission;
|
||||||
|
import com.nukkitx.protocol.bedrock.data.entity.EntityLinkData;
|
||||||
import com.nukkitx.protocol.bedrock.packet.*;
|
import com.nukkitx.protocol.bedrock.packet.*;
|
||||||
import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
|
import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
|
||||||
import it.unimi.dsi.fastutil.longs.Long2ObjectMaps;
|
import it.unimi.dsi.fastutil.longs.Long2ObjectMaps;
|
||||||
|
@ -261,6 +262,11 @@ public class GeyserSession implements CommandSender {
|
||||||
@Setter
|
@Setter
|
||||||
private String lastSignMessage;
|
private String lastSignMessage;
|
||||||
|
|
||||||
|
private Entity spectatingEntity = null;
|
||||||
|
private Vector3f originalPosition = null;
|
||||||
|
private Vector3f originalRotation = null;
|
||||||
|
private boolean originalOnGround = false;
|
||||||
|
|
||||||
private MinecraftProtocol protocol;
|
private MinecraftProtocol protocol;
|
||||||
|
|
||||||
public GeyserSession(GeyserConnector connector, BedrockServerSession bedrockServerSession) {
|
public GeyserSession(GeyserConnector connector, BedrockServerSession bedrockServerSession) {
|
||||||
|
@ -751,4 +757,44 @@ public class GeyserSession implements CommandSender {
|
||||||
adventureSettingsPacket.getSettings().addAll(flags);
|
adventureSettingsPacket.getSettings().addAll(flags);
|
||||||
sendUpstreamPacket(adventureSettingsPacket);
|
sendUpstreamPacket(adventureSettingsPacket);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void stopSpectatingEntity() {
|
||||||
|
playerEntity.updatePositionAndRotation(this, originalPosition.getX(), originalPosition.getY(), originalPosition.getZ(),
|
||||||
|
originalRotation.getZ(), originalRotation.getY(), originalOnGround);
|
||||||
|
|
||||||
|
SetEntityLinkPacket linkPacket = new SetEntityLinkPacket();
|
||||||
|
linkPacket.setEntityLink(new EntityLinkData(spectatingEntity.getGeyserId(), playerEntity.getGeyserId(), EntityLinkData.Type.REMOVE, false));
|
||||||
|
this.sendUpstreamPacket(linkPacket);
|
||||||
|
|
||||||
|
spectatingEntity.getPassengers().remove(playerEntity.getEntityId());
|
||||||
|
|
||||||
|
spectatingEntity = null;
|
||||||
|
|
||||||
|
this.sendMessage("Stopping spectating entity");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSpectatingEntity(Entity entity) {
|
||||||
|
this.sendMessage("Starting spectating entity");
|
||||||
|
|
||||||
|
originalPosition = playerEntity.getPosition();
|
||||||
|
originalRotation = playerEntity.getRotation();
|
||||||
|
originalOnGround = playerEntity.isOnGround();
|
||||||
|
|
||||||
|
SetEntityLinkPacket linkPacket = new SetEntityLinkPacket();
|
||||||
|
linkPacket.setEntityLink(new EntityLinkData(entity.getGeyserId(), playerEntity.getGeyserId(),
|
||||||
|
EntityLinkData.Type.RIDER, false));
|
||||||
|
|
||||||
|
this.sendUpstreamPacket(linkPacket);
|
||||||
|
|
||||||
|
entity.getPassengers().add(playerEntity.getEntityId());
|
||||||
|
|
||||||
|
spectatingEntity = entity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendSpectateLocation() {
|
||||||
|
Vector3f pos = spectatingEntity.getPosition();
|
||||||
|
Vector3f rot = spectatingEntity.getRotation();
|
||||||
|
|
||||||
|
playerEntity.updatePositionAndRotation(this, pos.getX(), pos.getY(), pos.getZ(), rot.getZ(), rot.getY(), spectatingEntity.isOnGround());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,6 +36,7 @@ import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlaye
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerInteractEntityPacket;
|
import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerInteractEntityPacket;
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerPlaceBlockPacket;
|
import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerPlaceBlockPacket;
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerUseItemPacket;
|
import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerUseItemPacket;
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.client.world.ClientSpectatePacket;
|
||||||
import com.nukkitx.math.vector.Vector3f;
|
import com.nukkitx.math.vector.Vector3f;
|
||||||
import com.nukkitx.math.vector.Vector3i;
|
import com.nukkitx.math.vector.Vector3i;
|
||||||
import com.nukkitx.protocol.bedrock.data.LevelEventType;
|
import com.nukkitx.protocol.bedrock.data.LevelEventType;
|
||||||
|
@ -45,6 +46,7 @@ import com.nukkitx.protocol.bedrock.packet.ContainerOpenPacket;
|
||||||
import com.nukkitx.protocol.bedrock.packet.InventorySlotPacket;
|
import com.nukkitx.protocol.bedrock.packet.InventorySlotPacket;
|
||||||
import com.nukkitx.protocol.bedrock.packet.InventoryTransactionPacket;
|
import com.nukkitx.protocol.bedrock.packet.InventoryTransactionPacket;
|
||||||
import com.nukkitx.protocol.bedrock.packet.LevelEventPacket;
|
import com.nukkitx.protocol.bedrock.packet.LevelEventPacket;
|
||||||
|
import org.geysermc.connector.GeyserConnector;
|
||||||
import org.geysermc.connector.entity.CommandBlockMinecartEntity;
|
import org.geysermc.connector.entity.CommandBlockMinecartEntity;
|
||||||
import org.geysermc.connector.entity.Entity;
|
import org.geysermc.connector.entity.Entity;
|
||||||
import org.geysermc.connector.entity.ItemFrameEntity;
|
import org.geysermc.connector.entity.ItemFrameEntity;
|
||||||
|
@ -242,6 +244,15 @@ public class BedrockInventoryTransactionTranslator extends PacketTranslator<Inve
|
||||||
//https://wiki.vg/Protocol#Interact_Entity
|
//https://wiki.vg/Protocol#Interact_Entity
|
||||||
switch (packet.getActionType()) {
|
switch (packet.getActionType()) {
|
||||||
case 0: //Interact
|
case 0: //Interact
|
||||||
|
if (session.getGameMode() == GameMode.SPECTATOR) {
|
||||||
|
if (entity.getJavaUuid() == null) {
|
||||||
|
GeyserConnector.getInstance().getLogger().debug("Tried to spectate entity with no Java UUID");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
session.sendDownstreamPacket(new ClientSpectatePacket(entity.getJavaUuid()));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (entity instanceof CommandBlockMinecartEntity) {
|
if (entity instanceof CommandBlockMinecartEntity) {
|
||||||
// The UI is handled client-side on Java Edition
|
// The UI is handled client-side on Java Edition
|
||||||
// Ensure OP permission level and gamemode is appropriate
|
// Ensure OP permission level and gamemode is appropriate
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
|
|
||||||
package org.geysermc.connector.network.translators.bedrock.entity.player;
|
package org.geysermc.connector.network.translators.bedrock.entity.player;
|
||||||
|
|
||||||
|
import com.github.steveice10.mc.protocol.data.game.entity.player.GameMode;
|
||||||
import com.nukkitx.protocol.bedrock.data.entity.EntityData;
|
import com.nukkitx.protocol.bedrock.data.entity.EntityData;
|
||||||
import com.nukkitx.protocol.bedrock.data.entity.EntityDataMap;
|
import com.nukkitx.protocol.bedrock.data.entity.EntityDataMap;
|
||||||
import com.nukkitx.protocol.bedrock.data.entity.EntityFlag;
|
import com.nukkitx.protocol.bedrock.data.entity.EntityFlag;
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019-2020 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.connector.network.translators.java;
|
||||||
|
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.server.ServerSwitchCameraPacket;
|
||||||
|
import org.geysermc.connector.entity.Entity;
|
||||||
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
|
import org.geysermc.connector.network.translators.PacketTranslator;
|
||||||
|
import org.geysermc.connector.network.translators.Translator;
|
||||||
|
|
||||||
|
@Translator(packet = ServerSwitchCameraPacket.class)
|
||||||
|
public class JavaSwitchCameraTranslator extends PacketTranslator<ServerSwitchCameraPacket> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void translate(ServerSwitchCameraPacket packet, GeyserSession session) {
|
||||||
|
Entity entity = session.getEntityCache().getEntityByJavaId(packet.getCameraEntityId());
|
||||||
|
if (session.getPlayerEntity().getEntityId() == packet.getCameraEntityId()) {
|
||||||
|
entity = session.getPlayerEntity();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entity == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (session.getSpectatingEntity() != null && session.getPlayerEntity().getGeyserId() == entity.getGeyserId()) {
|
||||||
|
session.stopSpectatingEntity();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
session.setSpectatingEntity(entity);
|
||||||
|
}
|
||||||
|
}
|
|
@ -43,5 +43,9 @@ public class JavaEntityPositionRotationTranslator extends PacketTranslator<Serve
|
||||||
if (entity == null) return;
|
if (entity == null) return;
|
||||||
|
|
||||||
entity.updatePositionAndRotation(session, packet.getMoveX(), packet.getMoveY(), packet.getMoveZ(), packet.getYaw(), packet.getPitch(), packet.isOnGround());
|
entity.updatePositionAndRotation(session, packet.getMoveX(), packet.getMoveY(), packet.getMoveZ(), packet.getYaw(), packet.getPitch(), packet.isOnGround());
|
||||||
|
|
||||||
|
if (session.getSpectatingEntity() != null && session.getSpectatingEntity().getGeyserId() == entity.getGeyserId()) {
|
||||||
|
session.sendSpectateLocation();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,5 +44,9 @@ public class JavaEntityPositionTranslator extends PacketTranslator<ServerEntityP
|
||||||
if (entity == null) return;
|
if (entity == null) return;
|
||||||
|
|
||||||
entity.moveRelative(session, packet.getMoveX(), packet.getMoveY(), packet.getMoveZ(), entity.getRotation(), packet.isOnGround());
|
entity.moveRelative(session, packet.getMoveX(), packet.getMoveY(), packet.getMoveZ(), entity.getRotation(), packet.isOnGround());
|
||||||
|
|
||||||
|
if (session.getSpectatingEntity() != null && session.getSpectatingEntity().getGeyserId() == entity.getGeyserId()) {
|
||||||
|
session.sendSpectateLocation();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,6 +83,7 @@ public class JavaSpawnEntityTranslator extends PacketTranslator<ServerSpawnEntit
|
||||||
type, position, motion, rotation
|
type, position, motion, rotation
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
entity.setJavaUuid(packet.getUuid());
|
||||||
session.getEntityCache().spawnEntity(entity);
|
session.getEntityCache().spawnEntity(entity);
|
||||||
} catch (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException ex) {
|
} catch (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException ex) {
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
|
|
|
@ -61,6 +61,7 @@ public class JavaSpawnLivingEntityTranslator extends PacketTranslator<ServerSpaw
|
||||||
Entity entity = entityConstructor.newInstance(packet.getEntityId(), session.getEntityCache().getNextEntityId().incrementAndGet(),
|
Entity entity = entityConstructor.newInstance(packet.getEntityId(), session.getEntityCache().getNextEntityId().incrementAndGet(),
|
||||||
type, position, motion, rotation
|
type, position, motion, rotation
|
||||||
);
|
);
|
||||||
|
entity.setJavaUuid(packet.getUuid());
|
||||||
session.getEntityCache().spawnEntity(entity);
|
session.getEntityCache().spawnEntity(entity);
|
||||||
} catch (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException ex) {
|
} catch (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException ex) {
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
|
|
|
@ -51,6 +51,7 @@ public class JavaSpawnPaintingTranslator extends PacketTranslator<ServerSpawnPai
|
||||||
.setPaintingName(PaintingType.getByPaintingType(packet.getPaintingType()))
|
.setPaintingName(PaintingType.getByPaintingType(packet.getPaintingType()))
|
||||||
.setDirection(packet.getDirection().ordinal());
|
.setDirection(packet.getDirection().ordinal());
|
||||||
|
|
||||||
|
entity.setJavaUuid(packet.getUuid());
|
||||||
session.getEntityCache().spawnEntity(entity);
|
session.getEntityCache().spawnEntity(entity);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,6 +50,7 @@ public class JavaSpawnPlayerTranslator extends PacketTranslator<ServerSpawnPlaye
|
||||||
}
|
}
|
||||||
|
|
||||||
entity.setEntityId(packet.getEntityId());
|
entity.setEntityId(packet.getEntityId());
|
||||||
|
entity.setJavaUuid(packet.getUuid());
|
||||||
entity.setPosition(position);
|
entity.setPosition(position);
|
||||||
entity.setRotation(rotation);
|
entity.setRotation(rotation);
|
||||||
session.getEntityCache().cacheEntity(entity);
|
session.getEntityCache().cacheEntity(entity);
|
||||||
|
|
Loading…
Reference in a new issue