Search in sources :

Example 1 with TileEntityTeleporter

use of mekanism.common.tile.TileEntityTeleporter in project Mekanism by mekanism.

the class PacketPortableTeleporterTeleport method handle.

@Override
public void handle(NetworkEvent.Context context) {
    ServerPlayerEntity player = context.getSender();
    if (player == null) {
        return;
    }
    ItemStack stack = player.getItemInHand(currentHand);
    if (!stack.isEmpty() && stack.getItem() instanceof ItemPortableTeleporter) {
        // Note: We make use of the player's own UUID, given they shouldn't be allowed to teleport to a private frequency of another player
        TeleporterFrequency found = FrequencyType.TELEPORTER.getFrequency(identity, player.getUUID());
        if (found == null) {
            return;
        }
        Coord4D coords = found.getClosestCoords(new Coord4D(player));
        if (coords != null) {
            World teleWorld = ServerLifecycleHooks.getCurrentServer().getLevel(coords.dimension);
            TileEntityTeleporter teleporter = WorldUtils.getTileEntity(TileEntityTeleporter.class, teleWorld, coords.getPos());
            if (teleporter != null) {
                if (!player.isCreative()) {
                    FloatingLong energyCost = TileEntityTeleporter.calculateEnergyCost(player, coords);
                    IEnergyContainer energyContainer = StorageUtils.getEnergyContainer(stack, 0);
                    if (energyContainer == null || energyContainer.extract(energyCost, Action.SIMULATE, AutomationType.MANUAL).smallerThan(energyCost)) {
                        return;
                    }
                    energyContainer.extract(energyCost, Action.EXECUTE, AutomationType.MANUAL);
                }
                // TODO: Figure out what this try catch is meant to be catching as I don't see much of a reason for it to exist
                try {
                    teleporter.didTeleport.add(player.getUUID());
                    teleporter.teleDelay = 5;
                    player.connection.aboveGroundTickCount = 0;
                    player.closeContainer();
                    Mekanism.packetHandler.sendToAllTracking(new PacketPortalFX(player.blockPosition()), player.level, coords.getPos());
                    if (player.isPassenger()) {
                        player.stopRiding();
                    }
                    double oldX = player.getX();
                    double oldY = player.getY();
                    double oldZ = player.getZ();
                    World oldWorld = player.level;
                    BlockPos teleporterTargetPos = teleporter.getTeleporterTargetPos();
                    TileEntityTeleporter.teleportEntityTo(player, teleWorld, teleporterTargetPos);
                    TileEntityTeleporter.alignPlayer(player, teleporterTargetPos, teleporter);
                    if (player.level != oldWorld || player.distanceToSqr(oldX, oldY, oldZ) >= 25) {
                        // If the player teleported over 5 blocks, play the sound at both the destination and the source
                        oldWorld.playSound(null, oldX, oldY, oldZ, SoundEvents.ENDERMAN_TELEPORT, SoundCategory.PLAYERS, 1.0F, 1.0F);
                    }
                    player.level.playSound(null, player.getX(), player.getY(), player.getZ(), SoundEvents.ENDERMAN_TELEPORT, SoundCategory.PLAYERS, 1.0F, 1.0F);
                    teleporter.sendTeleportParticles();
                } catch (Exception ignored) {
                }
            }
        }
    }
}
Also used : PacketPortalFX(mekanism.common.network.to_client.PacketPortalFX) TeleporterFrequency(mekanism.common.content.teleporter.TeleporterFrequency) ServerPlayerEntity(net.minecraft.entity.player.ServerPlayerEntity) World(net.minecraft.world.World) FloatingLong(mekanism.api.math.FloatingLong) IEnergyContainer(mekanism.api.energy.IEnergyContainer) ItemPortableTeleporter(mekanism.common.item.ItemPortableTeleporter) Coord4D(mekanism.api.Coord4D) BlockPos(net.minecraft.util.math.BlockPos) ItemStack(net.minecraft.item.ItemStack) TileEntityTeleporter(mekanism.common.tile.TileEntityTeleporter)

Aggregations

Coord4D (mekanism.api.Coord4D)1 IEnergyContainer (mekanism.api.energy.IEnergyContainer)1 FloatingLong (mekanism.api.math.FloatingLong)1 TeleporterFrequency (mekanism.common.content.teleporter.TeleporterFrequency)1 ItemPortableTeleporter (mekanism.common.item.ItemPortableTeleporter)1 PacketPortalFX (mekanism.common.network.to_client.PacketPortalFX)1 TileEntityTeleporter (mekanism.common.tile.TileEntityTeleporter)1 ServerPlayerEntity (net.minecraft.entity.player.ServerPlayerEntity)1 ItemStack (net.minecraft.item.ItemStack)1 BlockPos (net.minecraft.util.math.BlockPos)1 World (net.minecraft.world.World)1