/* * This file is a part of the SteamWar software. * * Copyright (C) 2022 SteamWar.de-Serverteam * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ package de.steamwar.bausystem.utils; import net.minecraft.network.protocol.game.PacketPlayInFlying; import net.minecraft.server.level.EntityPlayer; import org.bukkit.Location; import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer; import org.bukkit.entity.Player; import java.util.HashMap; import java.util.Map; import java.util.UUID; public class PlayerMovementWrapper20 implements PlayerMovementWrapper { private static class Position { private double x; private double y; private double z; private float yaw; private float pitch; } private Map playerLocationMap = new HashMap<>(); @Override public void setPosition(Player player, Object object) { Position position = playerLocationMap.computeIfAbsent(player.getUniqueId(), uuid -> { Position pos = new Position(); Location location = player.getLocation(); pos.x = location.getX(); pos.y = location.getY(); pos.z = location.getZ(); pos.yaw = location.getYaw(); pos.pitch = location.getPitch(); return pos; }); PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object); EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle(); if (packetPlayInFlying.h) { entityPlayer.b(packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c, packetPlayInFlying.d, packetPlayInFlying.e); position.x = packetPlayInFlying.a; position.y = packetPlayInFlying.b; position.z = packetPlayInFlying.c; position.yaw = packetPlayInFlying.d; position.pitch = packetPlayInFlying.e; } else { entityPlayer.e(packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c); position.x = packetPlayInFlying.a; position.y = packetPlayInFlying.b; position.z = packetPlayInFlying.c; } } @Override public void disable(Player player) { Position position = playerLocationMap.remove(player.getUniqueId()); if (position != null) { player.teleport(new Location(player.getWorld(), position.x, position.y, position.z, position.yaw, position.pitch)); } } }