package choonster.testmod3.network;
import choonster.testmod3.TestMod3;
import choonster.testmod3.api.capability.lock.ILock;
import choonster.testmod3.capability.lock.CapabilityLock;
import choonster.testmod3.client.gui.GuiLock;
import io.netty.buffer.ByteBuf;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraft.world.LockCode;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.network.ByteBufUtils;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
import javax.annotation.Nullable;
/**
* Sent to the server by {@link GuiLock} to set the new lock code.
*
* @author Choonster
*/
public class MessageLockSetLockCode implements IMessage {
private BlockPos pos;
private boolean hasFacing;
private EnumFacing facing;
private String lockCode;
@SuppressWarnings("unused")
public MessageLockSetLockCode() {
}
public MessageLockSetLockCode(BlockPos pos, @Nullable EnumFacing facing, String lockCode) {
this.pos = pos;
this.facing = facing;
this.lockCode = lockCode;
this.hasFacing = facing != null;
}
/**
* Convert from the supplied buffer into your specific message type
*
* @param buf The buffer
*/
@Override
public void fromBytes(ByteBuf buf) {
pos = BlockPos.fromLong(buf.readLong());
hasFacing = buf.readBoolean();
if (hasFacing) {
facing = EnumFacing.getFront(buf.readUnsignedByte());
}
lockCode = ByteBufUtils.readUTF8String(buf);
}
/**
* Deconstruct your message into the supplied byte buffer
*
* @param buf The buffer
*/
@Override
public void toBytes(ByteBuf buf) {
buf.writeLong(pos.toLong());
buf.writeBoolean(hasFacing);
if (hasFacing) {
buf.writeByte(facing.getIndex());
}
ByteBufUtils.writeUTF8String(buf, lockCode);
}
public static class Handler implements IMessageHandler<MessageLockSetLockCode, IMessage> {
/**
* Called when a message is received of the appropriate type. You can optionally return a reply message, or null if no reply
* is needed.
*
* @param message The message
* @param ctx The message context
* @return an optional return message
*/
@Nullable
@Override
public IMessage onMessage(MessageLockSetLockCode message, MessageContext ctx) {
TestMod3.proxy.getThreadListener(ctx).addScheduledTask(() -> {
final EntityPlayerMP player = (EntityPlayerMP) TestMod3.proxy.getPlayer(ctx);
final World world = player.world;
player.markPlayerActive();
if (world.isBlockLoaded(message.pos)) {
final ILock lock = CapabilityLock.getLock(world, message.pos, message.facing);
if (lock != null) {
if (lock.isLocked()) {
player.sendMessage(new TextComponentTranslation("testmod3:lock.already_locked"));
}
lock.setLockCode(new LockCode(message.lockCode));
}
}
});
return null;
}
}
}