Search in sources :

Example 6 with TeleporterFrequency

use of mekanism.common.content.teleporter.TeleporterFrequency 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)

Example 7 with TeleporterFrequency

use of mekanism.common.content.teleporter.TeleporterFrequency in project Mekanism by mekanism.

the class GuiPortableTeleporter method addGuiElements.

@Override
protected void addGuiElements() {
    super.addGuiElements();
    addButton(new GuiTeleporterStatus(this, () -> getFrequency() != null, menu::getStatus));
    addButton(new GuiVerticalPowerBar(this, new IBarInfoHandler() {

        @Override
        public ITextComponent getTooltip() {
            IEnergyContainer container = StorageUtils.getEnergyContainer(menu.getStack(), 0);
            return container == null ? EnergyDisplay.ZERO.getTextComponent() : EnergyDisplay.of(container).getTextComponent();
        }

        @Override
        public double getLevel() {
            IEnergyContainer container = StorageUtils.getEnergyContainer(menu.getStack(), 0);
            return container == null ? 0 : container.getEnergy().divideToLevel(container.getMaxEnergy());
        }
    }, 158, 26));
    teleportButton = addButton(new TranslationButton(this, 42, 147, 92, 20, MekanismLang.BUTTON_TELEPORT, () -> {
        TeleporterFrequency frequency = getFrequency();
        if (frequency != null && menu.getStatus() == 1) {
            // This should always be true if the teleport button is active, but validate it just in case
            ClientTickHandler.portableTeleport(getMinecraft().player, menu.getHand(), frequency.getIdentity());
            getMinecraft().player.closeContainer();
        } else {
            // If something did go wrong make the teleport button not able to be pressed
            teleportButton.active = false;
        }
    }));
    // Teleporter button starts as deactivated until we have a frequency get synced
    teleportButton.active = false;
    addButton(new GuiFrequencySelector<>(this, 14));
}
Also used : IBarInfoHandler(mekanism.client.gui.element.bar.GuiBar.IBarInfoHandler) IEnergyContainer(mekanism.api.energy.IEnergyContainer) TranslationButton(mekanism.client.gui.element.button.TranslationButton) TeleporterFrequency(mekanism.common.content.teleporter.TeleporterFrequency) GuiTeleporterStatus(mekanism.client.gui.element.custom.GuiTeleporterStatus) GuiVerticalPowerBar(mekanism.client.gui.element.bar.GuiVerticalPowerBar)

Aggregations

TeleporterFrequency (mekanism.common.content.teleporter.TeleporterFrequency)7 ComputerMethod (mekanism.common.integration.computer.annotation.ComputerMethod)4 WrappingComputerMethod (mekanism.common.integration.computer.annotation.WrappingComputerMethod)4 IEnergyContainer (mekanism.api.energy.IEnergyContainer)2 ComputerException (mekanism.common.integration.computer.ComputerException)2 Coord4D (mekanism.api.Coord4D)1 FloatingLong (mekanism.api.math.FloatingLong)1 EnumColor (mekanism.api.text.EnumColor)1 IBarInfoHandler (mekanism.client.gui.element.bar.GuiBar.IBarInfoHandler)1 GuiVerticalPowerBar (mekanism.client.gui.element.bar.GuiVerticalPowerBar)1 TranslationButton (mekanism.client.gui.element.button.TranslationButton)1 GuiTeleporterStatus (mekanism.client.gui.element.custom.GuiTeleporterStatus)1 ItemPortableTeleporter (mekanism.common.item.ItemPortableTeleporter)1 FrequencyIdentity (mekanism.common.lib.frequency.Frequency.FrequencyIdentity)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