All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.nukkit.network.process.processor.CommandBlockUpdateProcessor Maven / Gradle / Ivy

package cn.nukkit.network.process.processor;

import cn.nukkit.PlayerHandle;
import cn.nukkit.block.Block;
import cn.nukkit.block.BlockCommandBlock;
import cn.nukkit.block.BlockID;
import cn.nukkit.blockentity.BlockEntity;
import cn.nukkit.blockentity.BlockEntityCommandBlock;
import cn.nukkit.blockentity.ICommandBlock;
import cn.nukkit.level.Level;
import cn.nukkit.math.Vector3;
import cn.nukkit.network.process.DataPacketProcessor;
import cn.nukkit.network.protocol.CommandBlockUpdatePacket;
import cn.nukkit.network.protocol.ProtocolInfo;
import org.jetbrains.annotations.NotNull;

public class CommandBlockUpdateProcessor extends DataPacketProcessor {
    @Override
    public void handle(@NotNull PlayerHandle playerHandle, @NotNull CommandBlockUpdatePacket pk) {
        if (playerHandle.player.isOp() && playerHandle.player.isCreative()) {
            if (pk.isBlock) {
                BlockEntity blockEntity = playerHandle.player.level.getBlockEntity(new Vector3(pk.x, pk.y, pk.z));
                if (blockEntity instanceof BlockEntityCommandBlock commandBlock) {
                    Block cmdBlock = commandBlock.getLevelBlock();

                    //change commandblock type
                    switch (pk.commandBlockMode) {
                        case ICommandBlock.MODE_REPEATING:
                            if (cmdBlock.getId() != BlockID.REPEATING_COMMAND_BLOCK) {
                                cmdBlock = Block.get(BlockID.REPEATING_COMMAND_BLOCK, cmdBlock.getDamage());
                                commandBlock.scheduleUpdate();
                            }
                            break;
                        case ICommandBlock.MODE_CHAIN:
                            if (cmdBlock.getId() != BlockID.CHAIN_COMMAND_BLOCK) {
                                cmdBlock = Block.get(BlockID.CHAIN_COMMAND_BLOCK, cmdBlock.getDamage());
                            }
                            break;
                        case ICommandBlock.MODE_NORMAL:
                        default:
                            if (cmdBlock.getId() != BlockID.COMMAND_BLOCK) {
                                cmdBlock = Block.get(BlockID.COMMAND_BLOCK, cmdBlock.getDamage());
                            }
                            break;
                    }

                    boolean conditional = pk.isConditional;
                    cmdBlock.setPropertyValue(BlockCommandBlock.CONDITIONAL_BIT, conditional);

                    commandBlock.setCommand(pk.command);
                    commandBlock.setName(pk.name);
                    commandBlock.setTrackOutput(pk.shouldTrackOutput);
                    commandBlock.setConditional(conditional);
                    commandBlock.setTickDelay(pk.tickDelay);
                    commandBlock.setExecutingOnFirstTick(pk.executingOnFirstTick);

                    //redstone mode / auto
                    boolean isRedstoneMode = pk.isRedstoneMode;
                    commandBlock.setAuto(!isRedstoneMode);
                    if (!isRedstoneMode && pk.commandBlockMode == ICommandBlock.MODE_NORMAL) {
                        commandBlock.trigger();
                    }
                    commandBlock.getLevelBlockAround().forEach(b -> b.onUpdate(Level.BLOCK_UPDATE_REDSTONE));//update redstone
                    playerHandle.player.level.setBlock(commandBlock, cmdBlock, true);
                }
            }
        }
    }

    @Override
    public int getPacketId() {
        return ProtocolInfo.toNewProtocolID(ProtocolInfo.COMMAND_BLOCK_UPDATE_PACKET);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy