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) {
}
}
}
}
}
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));
}
Aggregations