use of gregtech.api.metatileentity.multiblock.MultiblockControllerBase in project GregTech by GregTechCEu.
the class MachineSceneWidget method updateScene.
private void updateScene() {
if (!mte.isValid())
return;
World world = mte.getWorld();
if (worldSceneRenderer != null) {
worldSceneRenderer.releaseFBO();
}
worldSceneRenderer = new FBOWorldSceneRenderer(world, 1080, 1080);
worldSceneRenderer.setAfterWorldRender(this::renderBlockOverLay);
cores = new HashSet<>();
around = new HashSet<>();
cores.add(pos);
if (mte instanceof MultiblockControllerBase) {
PatternMatchContext context = ((MultiblockControllerBase) mte).structurePattern.checkPatternFastAt(world, pos, mte.getFrontFacing().getOpposite());
if (context != null) {
List<BlockPos> validPos = ((MultiblockControllerBase) mte).structurePattern.cache.keySet().stream().map(BlockPos::fromLong).collect(Collectors.toList());
Set<IMultiblockPart> parts = context.getOrCreate("MultiblockParts", HashSet::new);
for (IMultiblockPart part : parts) {
if (part instanceof MetaTileEntity) {
cores.add(((MetaTileEntity) part).getPos());
}
}
for (EnumFacing facing : EnumFacing.VALUES) {
cores.forEach(pos -> around.add(pos.offset(facing)));
}
int minX = Integer.MAX_VALUE;
int minY = Integer.MAX_VALUE;
int minZ = Integer.MAX_VALUE;
int maxX = Integer.MIN_VALUE;
int maxY = Integer.MIN_VALUE;
int maxZ = Integer.MIN_VALUE;
for (BlockPos vPos : validPos) {
around.add(vPos);
minX = Math.min(minX, vPos.getX());
minY = Math.min(minY, vPos.getY());
minZ = Math.min(minZ, vPos.getZ());
maxX = Math.max(maxX, vPos.getX());
maxY = Math.max(maxY, vPos.getY());
maxZ = Math.max(maxZ, vPos.getZ());
}
around.removeAll(cores);
center = new Vector3f((minX + maxX) / 2f, (minY + maxY) / 2f, (minZ + maxZ) / 2f);
} else {
for (EnumFacing facing : EnumFacing.VALUES) {
around.add(pos.offset(facing));
}
center = new Vector3f(pos.getX() + 0.5f, pos.getY() + 0.5f, pos.getZ() + 0.5f);
}
} else {
for (EnumFacing facing : EnumFacing.VALUES) {
around.add(pos.offset(facing));
}
center = new Vector3f(pos.getX() + 0.5f, pos.getY() + 0.5f, pos.getZ() + 0.5f);
}
worldSceneRenderer.addRenderedBlocks(cores, null);
worldSceneRenderer.addRenderedBlocks(around, this::aroundBlocksRenderHook);
worldSceneRenderer.setCameraLookAt(center, zoom, Math.toRadians(rotationPitch), Math.toRadians(rotationYaw));
}
use of gregtech.api.metatileentity.multiblock.MultiblockControllerBase in project GregTech by GregTechCEu.
the class CoverDigitalInterface method getFluidCapability.
public IFluidHandler getFluidCapability() {
TileEntity te = getCoveredTE();
IFluidHandler capability = te == null ? null : te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, getCoveredFacing());
if (capability == null && this.coverHolder instanceof MultiblockControllerBase) {
List<IFluidTank> input = ((MultiblockControllerBase) this.coverHolder).getAbilities(MultiblockAbility.IMPORT_FLUIDS);
List<IFluidTank> output = ((MultiblockControllerBase) this.coverHolder).getAbilities(MultiblockAbility.EXPORT_FLUIDS);
List<IFluidTank> list = new ArrayList<>();
if (input.size() > 0) {
list.addAll(input);
}
if (output.size() > 0) {
list.addAll(output);
}
capability = new FluidTankList(true, list);
}
return capability;
}
use of gregtech.api.metatileentity.multiblock.MultiblockControllerBase in project GregTech by GregTechCEu.
the class CoverDigitalInterface method getEnergyCapability.
public IEnergyContainer getEnergyCapability() {
TileEntity te = getCoveredTE();
IEnergyContainer capability = te == null ? null : te.getCapability(GregtechCapabilities.CAPABILITY_ENERGY_CONTAINER, getCoveredFacing());
if (capability == null && this.coverHolder instanceof MultiblockControllerBase) {
List<IEnergyContainer> input = ((MultiblockControllerBase) this.coverHolder).getAbilities(MultiblockAbility.INPUT_ENERGY);
List<IEnergyContainer> output = ((MultiblockControllerBase) this.coverHolder).getAbilities(MultiblockAbility.OUTPUT_ENERGY);
List<IEnergyContainer> list = new ArrayList<>();
if (input.size() > 0) {
list.addAll(input);
}
if (output.size() > 0) {
list.addAll(output);
}
capability = new EnergyContainerList(list);
} else if (capability == null && te != null) {
IEnergyStorage fe = te.getCapability(CapabilityEnergy.ENERGY, getCoveredFacing());
if (fe != null) {
return new IEnergyContainer() {
public long acceptEnergyFromNetwork(EnumFacing enumFacing, long l, long l1) {
return 0;
}
public boolean inputsEnergy(EnumFacing enumFacing) {
return false;
}
public long changeEnergy(long l) {
return 0;
}
public long getEnergyStored() {
return FeCompat.toEu(fe.getEnergyStored(), FeCompat.ratio(false));
}
public long getEnergyCapacity() {
return FeCompat.toEu(fe.getMaxEnergyStored(), FeCompat.ratio(false));
}
public long getInputAmperage() {
return 0;
}
public long getInputVoltage() {
return 0;
}
};
}
}
return capability;
}
use of gregtech.api.metatileentity.multiblock.MultiblockControllerBase in project GregTech by GregTechCEu.
the class FakeGuiPluginBehavior method getRealMTE.
public MetaTileEntity getRealMTE() {
MetaTileEntity target = this.holder.getMetaTileEntity();
if (target instanceof MultiblockControllerBase && partIndex > 0) {
if (partPos != null) {
TileEntity entity = this.screen.getWorld().getTileEntity(partPos);
if (entity instanceof MetaTileEntityHolder) {
return ((MetaTileEntityHolder) entity).getMetaTileEntity();
} else {
partPos = null;
return null;
}
}
PatternMatchContext context = ((MultiblockControllerBase) target).structurePattern.checkPatternFastAt(target.getWorld(), target.getPos(), target.getFrontFacing().getOpposite());
if (context == null) {
return null;
}
Set<IMultiblockPart> rawPartsSet = context.getOrCreate("MultiblockParts", HashSet::new);
List<IMultiblockPart> parts = new ArrayList<>(rawPartsSet);
parts.sort(Comparator.comparing((it) -> ((MetaTileEntity) it).getPos().hashCode()));
if (parts.size() > partIndex - 1 && parts.get(partIndex - 1) instanceof MetaTileEntity) {
target = (MetaTileEntity) parts.get(partIndex - 1);
partPos = target.getPos();
} else {
return null;
}
}
return target;
}
use of gregtech.api.metatileentity.multiblock.MultiblockControllerBase in project GregTech by GregTechCEu.
the class MetaTileEntityMonitorScreen method checkLookingAt.
@SideOnly(Side.CLIENT)
public double[] checkLookingAt(RayTraceResult rayTraceResult) {
if (this.getWorld() != null) {
MultiblockControllerBase controller = this.getController();
if (rayTraceResult != null && rayTraceResult.typeOfHit == RayTraceResult.Type.BLOCK && controller != null && rayTraceResult.sideHit == controller.getFrontFacing()) {
int i, j;
TileEntity tileEntity = this.getWorld().getTileEntity(rayTraceResult.getBlockPos());
if (tileEntity instanceof MetaTileEntityHolder && ((MetaTileEntityHolder) tileEntity).getMetaTileEntity() instanceof MetaTileEntityMonitorScreen) {
MetaTileEntityMonitorScreen screenHit = (MetaTileEntityMonitorScreen) ((MetaTileEntityHolder) tileEntity).getMetaTileEntity();
if (controller == screenHit.getController()) {
i = ((MetaTileEntityMonitorScreen) ((MetaTileEntityHolder) tileEntity).getMetaTileEntity()).getX() - this.getX();
j = ((MetaTileEntityMonitorScreen) ((MetaTileEntityHolder) tileEntity).getMetaTileEntity()).getY() - this.getY();
double[] pos = handleRayTraceResult(rayTraceResult);
if ((i >= 0 && j >= 0)) {
pos[0] = (pos[0] + i) / this.scale;
pos[1] = (pos[1] + j) / this.scale;
if (pos[0] >= 0 && pos[0] <= 1 && pos[1] >= 0 && pos[1] <= 1)
return new double[] { pos[0], pos[1] };
}
}
}
}
}
return null;
}
Aggregations