Как сделать FluidTank

Статус
В этой теме нельзя размещать новые ответы.
Версия Minecraft
1.7.10
29
1
2
Вопрос:
Подскажите как сделать блок, который хранит жидкость с нуля, если можно объясните че да как, а то смотрел исходники в других модах не чего не понял)) Ещё пожалуйста без лишнего оффтопика :)
 
Решение
Каким-нибудь образом зарендерить блок с текстурой этой жидкости. Я-бы зарендерил часть типа так:
Код:
if (tank.getFluid() != null && tank.getFluid().getFluid() != null && tank.getFluid().getFluid().getIcon() != null) {
	boxOnIcon(Tessellator.instance, tank.getFluid().getFluid().getIcon(),
			0.0625D, 0.0625D, 0.0625D, 0.9375D, 0.9375D, 0.9375D);
}
Код:
	public static void boxOnIcon(Tessellator tessellator, IIcon icon, double minX, double minY, double minZ, double maxX, double maxY, double maxZ) {
		if (icon == null) return;
		double icon_minX = (minX < 0D ? 0D : minX) * 16D;
		double icon_minY = (minY < 0D ? 0D : minY) * 16D;
		double icon_minZ = (minZ < 0D ? 0D : minZ) * 16D;
		double icon_maxX = (maxX > 1D ? 1D : maxX) * 16D...
http://www.minecraftforum.net/forums/mapping-and-modding/mapping-and-modding-tutorials/2361797-1-7-10-minecraft-forge-modding-tutorials-now-with
Правда, у меня так и не получилось по этому гайду. Наверно я криворукий
 
Maxik001 написал(а):
http://www.minecraftforum.net/forums/mapping-and-modding/mapping-and-modding-tutorials/2361797-1-7-10-minecraft-forge-modding-tutorials-now-with
Правда, у меня так и не получилось по этому гайду. Наверно я криворукий

Я тоже по этому пытался делать и у меня тоже не получилось :(
 
Если тебе повезет, добрый Тимаха скинет тебе код :)
 
connor41 написал(а):
timaxa007 написал(а):
Maxik001, у меня нету подобного кода.

можно хотя-бы последовательность действий? Код я уж сам надумаю.

Блок, тайл энтити, что делать при райтклике ведром с жидкостью, контейнер
 
Maxik001 написал(а):
connor41 написал(а):
timaxa007 написал(а):
Maxik001, у меня нету подобного кода.

можно хотя-бы последовательность действий? Код я уж сам надумаю.

Блок, тайл энтити, что делать при райтклике ведром с жидкостью, контейнер

Ну.. первые 2 пункта уже есть :-/ А буду думать дальше :huh:
Если получится скину код)
 
И какую тебе нужно последовательность?

"implements IFluidHandler" - для твоего TileEntity и добавляешь нужные методы. А так-же создаёшь, в твоём TileEntity, переменную класса FluidTank с определённым вместимостью.
Код:
public FluidTank tank = new FluidTank(20000);
 
Код:
public FluidTankInfo[] getTankInfo(ForgeDirection from) {
return new FluidTankInfo[] {this.tank.getInfo()};
}
FluidTankInfo
Код:
/**
 * Wrapper class used to encapsulate information about an IFluidTank.
 * 
 * @author King Lemming
 * 
 */
Для получения информации об IFluidTank.
 
timaxa007 написал(а):
Код:
public FluidTankInfo[] getTankInfo(ForgeDirection from) {
return new FluidTankInfo[] {this.tank.getInfo()};
}
FluidTankInfo
Код:
/**
 * Wrapper class used to encapsulate information about an IFluidTank.
 * 
 * @author King Lemming
 * 
 */
Для получения информации об IFluidTank.

Метод чтоб жидкость из ведра по пкм попадала в бак тут надо писать?
Код:
@Override
 public boolean canFill(ForgeDirection from, Fluid fluid) {
 // TODO Auto-generated method stub
 return false;
 }
 
Я не знаю точно. Но нужно возвращать true. А onBlockActivated проверять, что в руке у игрока, если у игрока предмет в котором есть жидкость, то заполнять наш FluidTank этой жидкостью, если танк пустой или есть такая-же жидкость.
 
Код:
public class TileGlassFluidTank extends TileEntity implements IFluidHandler {

 public FluidTank tank = new FluidTank(GlassFluidTank.MAXFLUID);
 private boolean needsUpdate = false;
 private int updateTimer = 0;
 
 

 public TileGlassFluidTank() {

 
 }
 public TileGlassFluidTank(int x, int y, int z) {
 worldObj.getTileEntity(x, y, z);
 
 }
 
 @Override
 public int fill(ForgeDirection from, FluidStack resource, boolean doFill) {
 needsUpdate = true;
 return this.tank.fill(resource, doFill);
 }

 @Override
 public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) {
 return this.tank.drain(resource.amount, doDrain);
 }

 @Override
 public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) {
 needsUpdate = true;
 return this.tank.drain(maxDrain, doDrain);
 }

 @Override
 public boolean canFill(ForgeDirection from, Fluid fluid) {
 return true;
 }

 @Override
 public boolean canDrain(ForgeDirection from, Fluid fluid) {
 return true;
 }

 @Override
 public FluidTankInfo[] getTankInfo(ForgeDirection from) {
 return new FluidTankInfo[] {this.tank.getInfo()};
 }
Мне достаточно тут onBlockActivated чтоб жидкость по пкм отправлял и он будет хранить её и больше не чего не надо?
 
connor41 написал(а):
Мне достаточно тут onBlockActivated чтоб жидкость по пкм отправлял и он будет хранить её и больше не чего не надо?
После перезапуска мира он не сохранит так как ты не использовал readFromNBT и writeToNBT для TileEntity и в этих методах использовать методы readFromNBT и writeToNBT от FluidTank. И ещё что надо зависит от тебя.
 
Каким-нибудь образом зарендерить блок с текстурой этой жидкости. Я-бы зарендерил часть типа так:
Код:
if (tank.getFluid() != null && tank.getFluid().getFluid() != null && tank.getFluid().getFluid().getIcon() != null) {
	boxOnIcon(Tessellator.instance, tank.getFluid().getFluid().getIcon(),
			0.0625D, 0.0625D, 0.0625D, 0.9375D, 0.9375D, 0.9375D);
}
Код:
	public static void boxOnIcon(Tessellator tessellator, IIcon icon, double minX, double minY, double minZ, double maxX, double maxY, double maxZ) {
		if (icon == null) return;
		double icon_minX = (minX < 0D ? 0D : minX) * 16D;
		double icon_minY = (minY < 0D ? 0D : minY) * 16D;
		double icon_minZ = (minZ < 0D ? 0D : minZ) * 16D;
		double icon_maxX = (maxX > 1D ? 1D : maxX) * 16D;
		double icon_maxY = (maxY > 1D ? 1D : maxY) * 16D;
		double icon_maxZ = (maxZ > 1D ? 1D : maxZ) * 16D;
		tessellator.startDrawingQuads();
		//Top
		tessellator.addVertexWithUV(maxX, maxY, minZ, 
				(double)icon.getInterpolatedU(icon_maxX),
				(double)icon.getInterpolatedV(icon_minZ)
				);
		tessellator.addVertexWithUV(minX, maxY, minZ, 
				(double)icon.getInterpolatedU(icon_minX),
				(double)icon.getInterpolatedV(icon_minZ)
				);
		tessellator.addVertexWithUV(minX, maxY, maxZ, 
				(double)icon.getInterpolatedU(icon_minX),
				(double)icon.getInterpolatedV(icon_maxZ)
				);
		tessellator.addVertexWithUV(maxX, maxY, maxZ, 
				(double)icon.getInterpolatedU(icon_maxX),
				(double)icon.getInterpolatedV(icon_maxZ)
				);
		//Bottom
		tessellator.addVertexWithUV(maxX, minY, maxZ, 
				(double)icon.getInterpolatedU(icon_maxX),
				(double)icon.getInterpolatedV(icon_maxZ)
				);
		tessellator.addVertexWithUV(minX, minY, maxZ, 
				(double)icon.getInterpolatedU(icon_minX),
				(double)icon.getInterpolatedV(icon_maxZ)
				);
		tessellator.addVertexWithUV(minX, minY, minZ, 
				(double)icon.getInterpolatedU(icon_minX),
				(double)icon.getInterpolatedV(icon_minZ)
				);
		tessellator.addVertexWithUV(maxX, minY, minZ, 
				(double)icon.getInterpolatedU(icon_maxX),
				(double)icon.getInterpolatedV(icon_minZ)
				);
		//North
		tessellator.addVertexWithUV(maxX, minY, minZ, 
				(double)icon.getInterpolatedU(icon_minX),
				(double)icon.getInterpolatedV(icon_maxY)
				);
		tessellator.addVertexWithUV(minX, minY, minZ, 
				(double)icon.getInterpolatedU(icon_maxX),
				(double)icon.getInterpolatedV(icon_maxY)
				);
		tessellator.addVertexWithUV(minX, maxY, minZ, 
				(double)icon.getInterpolatedU(icon_maxX),
				(double)icon.getInterpolatedV(icon_minY)
				);
		tessellator.addVertexWithUV(maxX, maxY, minZ, 
				(double)icon.getInterpolatedU(icon_minX),
				(double)icon.getInterpolatedV(icon_minY)
				);
		//South
		tessellator.addVertexWithUV(maxX, maxY, maxZ, 
				(double)icon.getInterpolatedU(icon_maxX),
				(double)icon.getInterpolatedV(icon_minY)
				);
		tessellator.addVertexWithUV(minX, maxY, maxZ, 
				(double)icon.getInterpolatedU(icon_minX),
				(double)icon.getInterpolatedV(icon_minY)
				);
		tessellator.addVertexWithUV(minX, minY, maxZ, 
				(double)icon.getInterpolatedU(icon_minX),
				(double)icon.getInterpolatedV(icon_maxY)
				);
		tessellator.addVertexWithUV(maxX, minY, maxZ, 
				(double)icon.getInterpolatedU(icon_maxX),
				(double)icon.getInterpolatedV(icon_maxY)
				);
		//West
		tessellator.addVertexWithUV(minX, maxY, maxZ, 
				(double)icon.getInterpolatedU(icon_maxY),
				(double)icon.getInterpolatedV(icon_minZ)
				);
		tessellator.addVertexWithUV(minX, maxY, minZ, 
				(double)icon.getInterpolatedU(icon_minY),
				(double)icon.getInterpolatedV(icon_minZ)
				);
		tessellator.addVertexWithUV(minX, minY, minZ, 
				(double)icon.getInterpolatedU(icon_minY),
				(double)icon.getInterpolatedV(icon_maxZ)
				);
		tessellator.addVertexWithUV(minX, minY, maxZ, 
				(double)icon.getInterpolatedU(icon_maxY),
				(double)icon.getInterpolatedV(icon_maxZ)
				);
		//East
		tessellator.addVertexWithUV(maxX, minY, maxZ, 
				(double)icon.getInterpolatedU(icon_minY),
				(double)icon.getInterpolatedV(icon_maxZ)
				);
		tessellator.addVertexWithUV(maxX, minY, minZ, 
				(double)icon.getInterpolatedU(icon_maxY),
				(double)icon.getInterpolatedV(icon_maxZ)
				);
		tessellator.addVertexWithUV(maxX, maxY, minZ, 
				(double)icon.getInterpolatedU(icon_maxY),
				(double)icon.getInterpolatedV(icon_minZ)
				);
		tessellator.addVertexWithUV(maxX, maxY, maxZ, 
				(double)icon.getInterpolatedU(icon_minY),
				(double)icon.getInterpolatedV(icon_minZ)
				);

		tessellator.draw();
	}
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху