// 
// Decompiled by Procyon v0.6.0
// 

package com.hypixel.hytale.server.core.command.commands.player.viewradius;

import com.hypixel.hytale.server.core.command.system.arguments.system.Argument;
import com.hypixel.hytale.protocol.Packet;
import com.hypixel.hytale.protocol.packets.setup.ViewRadius;
import com.hypixel.hytale.server.core.HytaleServer;
import com.hypixel.hytale.server.core.Message;
import com.hypixel.hytale.server.core.modules.entity.tracker.EntityTrackerSystems;
import com.hypixel.hytale.server.core.entity.entities.Player;
import com.hypixel.hytale.component.Store;
import com.hypixel.hytale.server.core.universe.world.World;
import com.hypixel.hytale.server.core.universe.PlayerRef;
import javax.annotation.Nullable;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.server.core.command.system.CommandContext;
import com.hypixel.hytale.server.core.command.system.arguments.types.ArgumentType;
import com.hypixel.hytale.server.core.command.system.arguments.types.ArgTypes;
import com.hypixel.hytale.server.core.command.system.arguments.system.FlagArg;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.core.command.system.arguments.system.RequiredArg;
import com.hypixel.hytale.server.core.command.system.basecommands.AbstractTargetPlayerCommand;

public class PlayerViewRadiusSetCommand extends AbstractTargetPlayerCommand
{
    @Nonnull
    private final RequiredArg<String> radiusArg;
    @Nonnull
    private final FlagArg blocksArg;
    @Nonnull
    private final FlagArg bypassArg;
    
    public PlayerViewRadiusSetCommand() {
        super("set", "server.commands.player.viewradius.set.desc");
        this.radiusArg = this.withRequiredArg("radius", "server.commands.player.viewradius.set.radius.desc", ArgTypes.STRING);
        this.blocksArg = this.withFlagArg("blocks", "server.commands.player.viewradius.set.blocks.desc");
        this.bypassArg = this.withFlagArg("bypass", "server.commands.player.viewradius.set.bypass.desc");
    }
    
    @Override
    protected void execute(@Nonnull final CommandContext context, @Nullable final Ref<EntityStore> sourceRef, @Nonnull final Ref<EntityStore> ref, @Nonnull final PlayerRef playerRef, @Nonnull final World world, @Nonnull final Store<EntityStore> store) {
        final Player playerComponent = store.getComponent(ref, Player.getComponentType());
        assert playerComponent != null;
        final EntityTrackerSystems.EntityViewer entityViewerComponent = store.getComponent(ref, EntityTrackerSystems.EntityViewer.getComponentType());
        assert entityViewerComponent != null;
        final String radiusInput = this.radiusArg.get(context);
        final boolean measureInBlocks = ((Argument<Arg, Boolean>)this.blocksArg).get(context);
        final boolean bypass = ((Argument<Arg, Boolean>)this.bypassArg).get(context);
        int viewRadiusChunks;
        if ("default".equalsIgnoreCase(radiusInput)) {
            viewRadiusChunks = 32;
        }
        else {
            try {
                final int value = Integer.parseInt(radiusInput);
                viewRadiusChunks = (measureInBlocks ? ((int)Math.ceil(value / 32.0f)) : value);
            }
            catch (final NumberFormatException e) {
                context.sendMessage(Message.translation("server.commands.player.viewradius.set.invalidNumber").param("value", radiusInput));
                return;
            }
        }
        final int maxViewRadius = HytaleServer.get().getConfig().getMaxViewRadius();
        if (viewRadiusChunks > maxViewRadius && !bypass) {
            context.sendMessage(Message.translation("server.commands.player.viewradius.set.noHigherThan").param("radius", maxViewRadius));
            return;
        }
        final int viewRadiusBlocks = viewRadiusChunks * 32;
        playerComponent.setClientViewRadius(viewRadiusChunks);
        entityViewerComponent.viewRadiusBlocks = viewRadiusBlocks;
        playerRef.getPacketHandler().writeNoCache(new ViewRadius(viewRadiusBlocks));
        context.sendMessage(Message.translation("server.commands.player.viewradius.set.success").param("radius", viewRadiusChunks).param("radiusBlocks", viewRadiusBlocks));
    }
}
