Все не так.Ну вообщем
Это проверка на то, работает ли печь. Если да, то вызывается метод ниже. Тебе эта if проверка не нужна, так как ты будешь вызывать этот метод поJava:if (this.field_150187_a) { this.func_150186_m(p_149734_1_, p_149734_2_, p_149734_3_, p_149734_4_); }
onBlockActivated
.
Попробуй поиграться с разными значениями d1-d3. Посмотри, что будет.
public BlockRedstoneOre(boolean p_i45420_1_)
{
super(Material.rock);
if (p_i45420_1_)
{
this.setTickRandomly(true);
}
this.field_150187_a = p_i45420_1_;
}
EnumFacing enumfacing = (EnumFacing)stateIn.getValue(FACING);
double d0 = (double)pos.getX() + 0.5D;
double d1 = (double)pos.getY() + rand.nextDouble() * 6.0D / 16.0D;
double d2 = (double)pos.getZ() + 0.5D;
double d3 = 0.52D;
double d4 = rand.nextDouble() * 0.6D - 0.3D;
if (rand.nextDouble() < 0.1D)
{
worldIn.playSound((double)pos.getX() + 0.5D, (double)pos.getY(), (double)pos.getZ() + 0.5D, SoundEvents.BLOCK_FURNACE_FIRE_CRACKLE, SoundCategory.BLOCKS, 1.0F, 1.0F, false);
}
switch (enumfacing)
{
case WEST:
worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 - 0.52D, d1, d2 + d4, 0.0D, 0.0D, 0.0D);
worldIn.spawnParticle(EnumParticleTypes.FLAME, d0 - 0.52D, d1, d2 + d4, 0.0D, 0.0D, 0.0D);
break;
case EAST:
worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + 0.52D, d1, d2 + d4, 0.0D, 0.0D, 0.0D);
worldIn.spawnParticle(EnumParticleTypes.FLAME, d0 + 0.52D, d1, d2 + d4, 0.0D, 0.0D, 0.0D);
break;
case NORTH:
worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + d4, d1, d2 - 0.52D, 0.0D, 0.0D, 0.0D);
worldIn.spawnParticle(EnumParticleTypes.FLAME, d0 + d4, d1, d2 - 0.52D, 0.0D, 0.0D, 0.0D);
break;
case SOUTH:
worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + d4, d1, d2 + 0.52D, 0.0D, 0.0D, 0.0D);
worldIn.spawnParticle(EnumParticleTypes.FLAME, d0 + d4, d1, d2 + 0.52D, 0.0D, 0.0D, 0.0D);
}
Да тут вроде никаких func нет. (код из печки). Все понятно. Только комменты добавить и все.
Java:EnumFacing enumfacing = (EnumFacing)stateIn.getValue(FACING); double d0 = (double)pos.getX() + 0.5D; double d1 = (double)pos.getY() + rand.nextDouble() * 6.0D / 16.0D; double d2 = (double)pos.getZ() + 0.5D; double d3 = 0.52D; double d4 = rand.nextDouble() * 0.6D - 0.3D; if (rand.nextDouble() < 0.1D) { worldIn.playSound((double)pos.getX() + 0.5D, (double)pos.getY(), (double)pos.getZ() + 0.5D, SoundEvents.BLOCK_FURNACE_FIRE_CRACKLE, SoundCategory.BLOCKS, 1.0F, 1.0F, false); } switch (enumfacing) { case WEST: worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 - 0.52D, d1, d2 + d4, 0.0D, 0.0D, 0.0D); worldIn.spawnParticle(EnumParticleTypes.FLAME, d0 - 0.52D, d1, d2 + d4, 0.0D, 0.0D, 0.0D); break; case EAST: worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + 0.52D, d1, d2 + d4, 0.0D, 0.0D, 0.0D); worldIn.spawnParticle(EnumParticleTypes.FLAME, d0 + 0.52D, d1, d2 + d4, 0.0D, 0.0D, 0.0D); break; case NORTH: worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + d4, d1, d2 - 0.52D, 0.0D, 0.0D, 0.0D); worldIn.spawnParticle(EnumParticleTypes.FLAME, d0 + d4, d1, d2 - 0.52D, 0.0D, 0.0D, 0.0D); break; case SOUTH: worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + d4, d1, d2 + 0.52D, 0.0D, 0.0D, 0.0D); worldIn.spawnParticle(EnumParticleTypes.FLAME, d0 + d4, d1, d2 + 0.52D, 0.0D, 0.0D, 0.0D); }
А. Стоп. У меня же 1.12+. Ну может в 1.7.10 и есть func...
Кстати, по желанию можешь сделать, чтобы частицы и звук появлялись только при клике на блок c маслом в руке и оставались на пару секунд, а не все время. Так реалистичней будет.
@SideOnly(Side.CLIENT)
public void randomDisplayTick(World p_149734_1_, int p_149734_2_, int p_149734_3_, int p_149734_4_, Random p_149734_5_)
{
if (this.field_150187_a)
{
this.func_150186_m(p_149734_1_, p_149734_2_, p_149734_3_, p_149734_4_);
}
}
private void func_150186_m(World p_150186_1_, int p_150186_2_, int p_150186_3_, int p_150186_4_)
{
Random random = p_150186_1_.rand; //Вроде-бы спавн рандомных частиц.
double d0 = 0.0625D; //Тут уже сам не знаю так-что могу писать бред.
for (int l = 0; l < 6; ++l)
{
double d1 = (double)((float)p_150186_2_ + random.nextFloat()); //Рандомный флоат. Скорее всего это
double d2 = (double)((float)p_150186_3_ + random.nextFloat()); //Положение частиц. Рандомное.
double d3 = (double)((float)p_150186_4_ + random.nextFloat());
if (l == 0 && !p_150186_1_.getBlock(p_150186_2_, p_150186_3_, p_150186_4_ + 1).isOpaqueCube())
{
d3 = (double)(p_150186_4_ + 1) + d0;
}
if (l == 1 && !p_150186_1_.getBlock(p_150186_2_, p_150186_3_ - 1, p_150186_4_).isOpaqueCube())//Ниже смотри
{ //там места не хватило. Крч. l == 1 это сторона нашего блока как в текстуре. 1 - top т.е. вверх блока.
d2 = (double)(p_150186_3_ + 0) - d0;
}
if (d1 < (double)p_150186_2_ || d1 > (double)(p_150186_2_ + 1) || d2 < 0.0D || d2 > (double)(p_150186_3_ + 1) || d3 < (double)p_150186_4_ || d3 > (double)(p_150186_4_ + 1))
{
p_150186_1_.spawnParticle("flame", d1, d2, d3, 0.0D, 0.0D, 0.0D); //Спавн частиц огня "flame".
p_150186_1_.spawnParticle("smoke", d1, d2, d3, 0.0D, 0.0D, 0.0D); //Спавн частиц дыма "smoke".
}
}
}
}
if (this.field_150187_a)
{
this.func_150186_m(p_149734_1_, p_149734_2_, p_149734_3_, p_149734_4_);
}
onBlockActivated
.Окей, просто мало частиц было я натыкался в коде. Это редстоун руда код. Крч копаюсь и найти сторону Top не могу xDНу вообщем
Это проверка на то, работает ли печь. Если да, то вызывается метод ниже. Тебе эта if проверка не нужна, так как ты будешь вызывать этот метод поJava:if (this.field_150187_a) { this.func_150186_m(p_149734_1_, p_149734_2_, p_149734_3_, p_149734_4_); }
onBlockActivated
.
Попробуй поиграться с разными значениями d1-d3. Посмотри, что будет.
Все не так.Ну вообщем
Это проверка на то, работает ли печь. Если да, то вызывается метод ниже. Тебе эта if проверка не нужна, так как ты будешь вызывать этот метод поJava:if (this.field_150187_a) { this.func_150186_m(p_149734_1_, p_149734_2_, p_149734_3_, p_149734_4_); }
onBlockActivated
.
Попробуй поиграться с разными значениями d1-d3. Посмотри, что будет.
public BlockRedstoneOre(boolean p_i45420_1_)
{
super(Material.rock);
if (p_i45420_1_)
{
this.setTickRandomly(true);
}
this.field_150187_a = p_i45420_1_;
}
private void func_150185_e(World p_150185_1_, int p_150185_2_, int p_150185_3_, int p_150185_4_)
{
this.func_150186_m(p_150185_1_, p_150185_2_, p_150185_3_, p_150185_4_);
if (this == Blocks.redstone_ore)
{
p_150185_1_.setBlock(p_150185_2_, p_150185_3_, p_150185_4_, Blocks.lit_redstone_ore);
}
}
@SideOnly(Side.CLIENT)
public void randomDisplayTick(World p_149734_1_, int p_149734_2_, int p_149734_3_, int p_149734_4_, Random p_149734_5_)
{
if (this.field_150187_a)
{
this.func_150186_m(p_149734_1_, p_149734_2_, p_149734_3_, p_149734_4_);
}
}
private void func_150186_m(World p_150186_1_, int p_150186_2_, int p_150186_3_, int p_150186_4_)
{
Random random = p_150186_1_.rand;
double d0 = 0.0625D;
for (int l = 0; l < 6; ++l)
{
double d1 = (double)((float)p_150186_2_ + random.nextFloat());
double d2 = (double)((float)p_150186_3_ + random.nextFloat());
double d3 = (double)((float)p_150186_4_ + random.nextFloat());
if (l == 0 && !p_150186_1_.getBlock(p_150186_2_, p_150186_3_ + 1, p_150186_4_).isOpaqueCube())
{
d2 = (double)(p_150186_3_ + 1) + d0;
}
if (l == 1 && !p_150186_1_.getBlock(p_150186_2_, p_150186_3_ - 1, p_150186_4_).isOpaqueCube())
{
d2 = (double)(p_150186_3_ + 0) - d0;
}
if (l == 2 && !p_150186_1_.getBlock(p_150186_2_, p_150186_3_, p_150186_4_ + 1).isOpaqueCube())
{
d3 = (double)(p_150186_4_ + 1) + d0;
}
if (l == 3 && !p_150186_1_.getBlock(p_150186_2_, p_150186_3_, p_150186_4_ - 1).isOpaqueCube())
{
d3 = (double)(p_150186_4_ + 0) - d0;
}
if (l == 4 && !p_150186_1_.getBlock(p_150186_2_ + 1, p_150186_3_, p_150186_4_).isOpaqueCube())
{
d1 = (double)(p_150186_2_ + 1) + d0;
}
if (l == 5 && !p_150186_1_.getBlock(p_150186_2_ - 1, p_150186_3_, p_150186_4_).isOpaqueCube())
{
d1 = (double)(p_150186_2_ + 0) - d0;
}
if (d1 < (double)p_150186_2_ || d1 > (double)(p_150186_2_ + 1) || d2 < 0.0D || d2 > (double)(p_150186_3_ + 1) || d3 < (double)p_150186_4_ || d3 > (double)(p_150186_4_ + 1))
{
p_150186_1_.spawnParticle("reddust", d1, d2, d3, 0.0D, 0.0D, 0.0D);
}
}
}
Ну да всё так вроде только в spawnParticle указан flame а не reddust. Стороны ща указываю что-бы только на стороне 1{Top} были партикли.Все не так.
Есть 2 блока руды Redstone, которые определяются булеаном при реге. Тот что с true, будет спаунить частицы.
Java:public BlockRedstoneOre(boolean p_i45420_1_) { super(Material.rock); if (p_i45420_1_) { this.setTickRandomly(true); } this.field_150187_a = p_i45420_1_; }
В Методах onBlockClicked, onEntityWalking, onBlockActivated
вызывается спавн частиц и замена блока (ставится блок со светом)
Java:private void func_150185_e(World p_150185_1_, int p_150185_2_, int p_150185_3_, int p_150185_4_) { this.func_150186_m(p_150185_1_, p_150185_2_, p_150185_3_, p_150185_4_); if (this == Blocks.redstone_ore) { p_150185_1_.setBlock(p_150185_2_, p_150185_3_, p_150185_4_, Blocks.lit_redstone_ore); } }
В рандом тиках так-же спавнятся частицы
Java:@SideOnly(Side.CLIENT) public void randomDisplayTick(World p_149734_1_, int p_149734_2_, int p_149734_3_, int p_149734_4_, Random p_149734_5_) { if (this.field_150187_a) { this.func_150186_m(p_149734_1_, p_149734_2_, p_149734_3_, p_149734_4_); } }
Ну и сам метод спавна частиц, который вроде определяет Side блока и задает координаты для частиц
Java:private void func_150186_m(World p_150186_1_, int p_150186_2_, int p_150186_3_, int p_150186_4_) { Random random = p_150186_1_.rand; double d0 = 0.0625D; for (int l = 0; l < 6; ++l) { double d1 = (double)((float)p_150186_2_ + random.nextFloat()); double d2 = (double)((float)p_150186_3_ + random.nextFloat()); double d3 = (double)((float)p_150186_4_ + random.nextFloat()); if (l == 0 && !p_150186_1_.getBlock(p_150186_2_, p_150186_3_ + 1, p_150186_4_).isOpaqueCube()) { d2 = (double)(p_150186_3_ + 1) + d0; } if (l == 1 && !p_150186_1_.getBlock(p_150186_2_, p_150186_3_ - 1, p_150186_4_).isOpaqueCube()) { d2 = (double)(p_150186_3_ + 0) - d0; } if (l == 2 && !p_150186_1_.getBlock(p_150186_2_, p_150186_3_, p_150186_4_ + 1).isOpaqueCube()) { d3 = (double)(p_150186_4_ + 1) + d0; } if (l == 3 && !p_150186_1_.getBlock(p_150186_2_, p_150186_3_, p_150186_4_ - 1).isOpaqueCube()) { d3 = (double)(p_150186_4_ + 0) - d0; } if (l == 4 && !p_150186_1_.getBlock(p_150186_2_ + 1, p_150186_3_, p_150186_4_).isOpaqueCube()) { d1 = (double)(p_150186_2_ + 1) + d0; } if (l == 5 && !p_150186_1_.getBlock(p_150186_2_ - 1, p_150186_3_, p_150186_4_).isOpaqueCube()) { d1 = (double)(p_150186_2_ + 0) - d0; } if (d1 < (double)p_150186_2_ || d1 > (double)(p_150186_2_ + 1) || d2 < 0.0D || d2 > (double)(p_150186_3_ + 1) || d3 < (double)p_150186_4_ || d3 > (double)(p_150186_4_ + 1)) { p_150186_1_.spawnParticle("reddust", d1, d2, d3, 0.0D, 0.0D, 0.0D); } } }
x=0.5, z=0.5, y=1
и у тебя будут партиклы сверху посередине. Можешь раскидать их малёх используя java.util.Random#nextInt(bound)
, а кол-во увеличить циклом forFloat'ом лучше раскидывать, а то будут частицы в радиусе 2-3 блоков =D
У меня всё пока зашибись только вот как сделать что-бы всё это само было а не по клику xDПросто при спауне указываешьx=0.5, z=0.5, y=1
и у тебя будут партиклы сверху посередине. Можешь раскидать их малёх используяjava.util.Random#nextInt(bound)
, а кол-во увеличить циклом for
Тебе надо, что бы все время он испускал партиклы?У меня всё пока зашибись только вот как сделать что-бы всё это само было а не по клику xD
У меня так-то само не получается, голову ломаю. В коде печки нифига найти и понять не могу
this.setTickRandomly(true); // Прописывается в public BlockYOUBLOCK()
@SideOnly(Side.CLIENT)
public void randomDisplayTick(World p_149734_1_, int p_149734_2_, int p_149734_3_, int p_149734_4_, Random p_149734_5_)
{
this.func_150186_m(p_149734_1_, p_149734_2_, p_149734_3_, p_149734_4_); //Метод спауна частиц
}
Так CMTV написал xDТебе надо, что бы все время он испускал партиклы?
Это у меня есть но испускает только по клику потому-что естьJava:this.setTickRandomly(true); // Прописывается в public BlockYOUBLOCK()
Java:@SideOnly(Side.CLIENT) public void randomDisplayTick(World p_149734_1_, int p_149734_2_, int p_149734_3_, int p_149734_4_, Random p_149734_5_) { this.func_150186_m(p_149734_1_, p_149734_2_, p_149734_3_, p_149734_4_); //Метод спауна частиц }
public void onBlockClicked(World p_149699_1_, int p_149699_2_, int p_149699_3_, int p_149699_4_, EntityPlayer p_149699_5_)
{
this.func_150186_m(p_149699_1_, p_149699_2_, p_149699_3_, p_149699_4_);
this.func_150186_m(p_149699_1_, p_149699_2_, p_149699_3_, p_149699_4_);
}
Java:this.setTickRandomly(true); // Прописывается в public BlockYOUBLOCK()
Java:@SideOnly(Side.CLIENT) public void randomDisplayTick(World p_149734_1_, int p_149734_2_, int p_149734_3_, int p_149734_4_, Random p_149734_5_) { this.func_150186_m(p_149734_1_, p_149734_2_, p_149734_3_, p_149734_4_); //Метод спауна частиц }
//Вот как это хламьё так настроить что-бы в onBlockActivated работало?
//this. там нельзя с func прописать...
package fxg.hotoilplus;
import java.util.Random;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import net.minecraft.world.World;
public class Oven1 extends Block {
private boolean field_150187_a;
private static final String __OBFID = "CL_00000294";
public Oven1(boolean p_i45420_1_)
{
super(Material.rock); //Материал блока
this.setBlockName("Oven1"); //Имя блока
this.setCreativeTab(CreativeTabs.tabBlock); //Предмет будет отоброжатся во вкладке Блоки
this.setBlockTextureName("fxg:oven"); //Текстура. Чуть ниже про разные стороны.
this.setHardness(4F); //Твёрдость 4F
this.setResistance(4F); //Защита от взрывов и т.д. 4F
if (p_i45420_1_)
{
this.setTickRandomly(true);
}
this.field_150187_a = p_i45420_1_;
}
public IIcon[] icons = new IIcon[6]; //Добавляет разностороннюю текстуру блока посредством циферных значении :?
@Override
public void registerBlockIcons(IIconRegister reg) { //Регистрирует иконки
for (int i = 0; i < 6; i ++) { //Интерьер для дома. Шутка. Означает что все стороны будут различатся цифрами.
this.icons[i] = reg.registerIcon(this.textureName + "_" + i); //тут понятно должно быть.
//textureName - название вашей текстуры + _ + i(+_+ циферное значение) Итог. Должно быть 6 текстур
//oven_0.png oven_1.png oven_2.png и т.д.
}
}
public IIcon getIcon(int side, int meta) { //Тут он берёт иконки и делает i(число) стороной.
return this.icons[side];
}
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int var6, float var7, float var8, float var9){
if(!world.isRemote){ //Вызов мира
ItemStack currentStack = player.getCurrentEquippedItem(); //Вызов какая вещь в руке
if(currentStack != null && currentStack.getItem().equals(Game.OilBL)){ //если это бутылка масла то...
player.inventory.setInventorySlotContents(player.inventory.currentItem, new ItemStack(Game.OilBlockHot)); //ЗАМЕНИТЬ currentItem
//На вещь которая у вас в руке когда вы жмякали ПКМ по блоку на OilBlockHot(Блок масла).
return true;
}
}
return false;
}
public int tickRate(World p_149738_1_)
{
return 30;
}
public void onBlockClicked(World p_149699_1_, int p_149699_2_, int p_149699_3_, int p_149699_4_, EntityPlayer p_149699_5_)
{
this.func_150186_m(p_149699_1_, p_149699_2_, p_149699_3_, p_149699_4_);
this.func_150186_m(p_149699_1_, p_149699_2_, p_149699_3_, p_149699_4_);
super.onBlockClicked(p_149699_1_, p_149699_2_, p_149699_3_, p_149699_4_, p_149699_5_);
}
@SideOnly(Side.CLIENT)
public void randomDisplayTick(World p_149734_1_, int p_149734_2_, int p_149734_3_, int p_149734_4_, Random p_149734_5_)
{
if (this.field_150187_a)
{
this.func_150186_m(p_149734_1_, p_149734_2_, p_149734_3_, p_149734_4_);
}
}
private void func_150186_m(World p_150186_1_, int p_150186_2_, int p_150186_3_, int p_150186_4_)
{
Random random = p_150186_1_.rand;
double d0 = 0.0625D; //Высота партиклей над блоком
for (int l = 0; l < 6; ++l)
{
double d1 = (double)((float)p_150186_2_ + random.nextFloat());
double d2 = (double)((float)p_150186_3_ + random.nextFloat());
double d3 = (double)((float)p_150186_4_ + random.nextFloat());
if (l == 0 && !p_150186_1_.getBlock(p_150186_2_, p_150186_3_ + 1, p_150186_4_).isOpaqueCube()) //Сторона на которой
{ //Спавнятся партикли.
d2 = (double)(p_150186_3_ + 1) + d0;
}
if (l == 1 && !p_150186_1_.getBlock(p_150186_2_, p_150186_3_ - 1, p_150186_4_).isOpaqueCube())
{
d2 = (double)(p_150186_3_ + 0) - d0;
}
if (d1 < (double)p_150186_2_ || d1 > (double)(p_150186_2_ + 1) || d2 < 0.0D || d2 > (double)(p_150186_3_ + 1) || d3 < (double)p_150186_4_ || d3 > (double)(p_150186_4_ + 1))
{
p_150186_1_.spawnParticle("flame", d1, d2, d3, 0.0D, 0.0D, 0.0D); //Спавн частиц огня "flame".
p_150186_1_.spawnParticle("smoke", d1, d2, d3, 0.0D, 0.0D, 0.0D); //Спавн частиц дыма "smoke".
}
}
}
}
Oven1 = new Oven1(true);Регистрируешь блок как?
Да не. Я как раз писал, чтобы активировалось только по клику, а не все время!Так CMTV написал xD