- 74
- 2
Пытаюсь реализовать спавн частиц для своей TileEntity. Столкнулся со следующей проблемой: вызов частиц хоть и работает, но с оговорками - при попытке смещения точки спавна в центр блока путем добавления + 0.5D к координатам x и z вылетает ошибка по причине "Ticking particle". Вдобавок у меня есть подозрения, что частицы спавнятся только на клиенте и не будут видны при игре на сервере (я плохо понимаю методы, написанные разработчиками игры для спавна частиц). Очевидное решение - использовать метод randomDisplayTick в классе блока - мне не подходит, т.к. мне нужно иметь контроль над спавнрейтом частиц, а в этом методе они создаются случайно. Также я бы все таки хотел вызывать спавн из класса TileEntity, если это возможно. Прошу знающих подсказать правильную методику спавна частиц. Заранее спасибо.
Для вызова частиц использую:
(Строка в коде ниже: 74)
Код метода update класса TileEntity:
Для вызова частиц использую:
Java:
Minecraft.getMinecraft().effectRenderer.spawnEffectParticle(EnumParticleTypes.CLOUD.getParticleID(), this.pos.getX(), this.pos.getY() + 1, this.pos.getZ(), 0, 0, 0, new int[0]);
Код метода update класса TileEntity:
Java:
public void update()
{
boolean canEjectSteam = !this.world.getBlockState(this.pos.up(1)).isFullCube();
boolean flag = this.isBurning();
boolean flag1 = false;
if (this.isBurning())
{
--this.burnTime;
}
if (!this.world.isRemote)
{
ItemStack fuel = this.inventory.get(0);
if (this.isBurning() || !fuel.isEmpty() && !((ItemStack)this.inventory.get(0)).isEmpty())
{
if (!this.isBurning() && this.waterAmount >= waterConsumptionRate)
{
this.burnTime = getItemBurnTime(fuel);
this.totalBurnTime = this.burnTime;
if (this.isBurning())
{
flag1 = true;
if (!fuel.isEmpty())
{
Item item = fuel.getItem();
fuel.shrink(1);
if (fuel.isEmpty())
{
ItemStack item1 = item.getContainerItem(fuel);
this.inventory.set(0, item1);
}
}
}
}
if(this.isBurning())
{
if(this.temperature < maxTemperature) this.temperature++;
}
}
if (this.temperature >= conversionTemperature && this.waterAmount >= waterConsumptionRate)
{
this.waterAmount -= waterConsumptionRate;
if(this.steamAmount <= internalVolumeSteam - waterConsumptionRate * conversionFactor)
{
this.steamAmount += waterConsumptionRate * conversionFactor;
}
}
if(!this.isBurning() && this.temperature > minTemperature) this.temperature--;
if (flag != this.isBurning())
{
flag1 = true;
BlockSteamBoiler.setState(this.isBurning(), this.world, this.pos);
}
int multiplier = internalVolumeSteam / maxPressure;
int targetPressure = MathHelper.clamp((this.steamAmount / multiplier), minPressure, canEjectSteam ? ejectionPressure : maxPressure);
if(this.pressure <= targetPressure)
{
if(this.pressure < ejectionPressure)
{
this.pressure++;
}
else if(this.isBurning() && waterAmount >= waterConsumptionRate)
{
Minecraft.getMinecraft().effectRenderer.spawnEffectParticle(EnumParticleTypes.CLOUD.getParticleID(), this.pos.getX(), this.pos.getY() + 1, this.pos.getZ(), 0, 0, 0, new int[0]);
this.pressure++;
}
}
else if(this.pressure > targetPressure)
{
this.pressure--;
}
if(this.pressure >= maxPressure)
{
this.world.createExplosion((Entity)null, this.pos.getX(), this.pos.getY(), this.pos.getZ(), 1.0F, true);
}
}
if (flag1)
{
this.markDirty();
}
}