package com.bergerkiller.bukkit.common.reflection.classes;
import com.bergerkiller.bukkit.common.internal.CommonNMS;
import com.bergerkiller.bukkit.common.reflection.ClassTemplate;
import com.bergerkiller.bukkit.common.reflection.FieldAccessor;
import com.bergerkiller.bukkit.common.reflection.MethodAccessor;
import com.bergerkiller.bukkit.common.reflection.NMSClassTemplate;
public class ChunkSectionRef {
public static final ClassTemplate<Object> TEMPLATE = new NMSClassTemplate("ChunkSection");
public static final FieldAccessor<Object> skyLight = TEMPLATE.getField("skyLight");
public static final FieldAccessor<Object> blockLight = TEMPLATE.getField("emittedLight");
public static final MethodAccessor<Boolean> isEmpty = TEMPLATE.getMethod("isEmpty");
public static final MethodAccessor<byte[]> getBlockIds = TEMPLATE.getMethod("getIdArray");
public static final MethodAccessor<Object> getExtBlockIds = TEMPLATE.getMethod("getExtendedIdArray");
public static final MethodAccessor<Object> getBlockData = TEMPLATE.getMethod("getDataArray");
public static final MethodAccessor<Object> getBlockLightNibble = TEMPLATE.getMethod("getEmittedLightArray");
public static final MethodAccessor<Object> getSkyLightNibble = TEMPLATE.getMethod("getSkyLightArray");
private static final MethodAccessor<Integer> blocks = TEMPLATE.getMethod("getTypeId", int.class, int.class, int.class);
private static final MethodAccessor<Void> setTypeBlock = TEMPLATE.getMethod("setTypeId", int.class, int.class, int.class, BlockRef.TEMPLATE.getType());
private static final MethodAccessor<Integer> getData = TEMPLATE.getMethod("getData", int.class, int.class, int.class);
private static final MethodAccessor<Void> setData = TEMPLATE.getMethod("setData", int.class, int.class, int.class, int.class);
private static final MethodAccessor<Integer> getSkyLight = TEMPLATE.getMethod("getSkyLight", int.class, int.class, int.class);
private static final MethodAccessor<Void> setSkyLight = TEMPLATE.getMethod("setSkyLight", int.class, int.class, int.class, int.class);
private static final MethodAccessor<Integer> getBlockLight = TEMPLATE.getMethod("getEmittedLight", int.class, int.class, int.class);
private static final MethodAccessor<Void> setBlockLight = TEMPLATE.getMethod("setEmittedLight", int.class, int.class, int.class, int.class);
public static int getTypeId(Object section, int x, int y, int z) {
return blocks.invoke(section, x & 0xf, y & 0xf, z & 0xf);
}
public static void setTypeId(Object section, int x, int y, int z, int typeId) {
setTypeBlock.invoke(section, x & 0xf, y & 0xf, z & 0xf, CommonNMS.getBlock(typeId));
}
public static int getData(Object section, int x, int y, int z) {
return getData.invoke(section, z & 0xf, y & 0xf, z & 0xf);
}
public static void setData(Object section, int x, int y, int z, int data) {
setData.invoke(section, x & 0xf, y & 0xf, z & 0xf, data);
}
public static int getSkyLight(Object section, int x, int y, int z) {
return getSkyLight.invoke(section, x & 0xf, y & 0xf, z & 0xf);
}
public static void setSkyLight(Object section, int x, int y, int z, int level) {
setSkyLight.invoke(section, x & 0xf, y & 0xf, z & 0xf, level);
}
public static int getBlockLight(Object section, int x, int y, int z) {
return getBlockLight.invoke(section,x & 0xf, y & 0xf, z & 0xf);
}
public static void setBlockLight(Object section, int x, int y, int z, int level) {
setBlockLight.invoke(section, x & 0xf, y & 0xf, z & 0xf, level);
}
}