[1.7.10] Предмет призывающий молнию.

Как сделать чтобы был и предмет при нажатии ПКМ он призывал молнию(и если можно чтобы за один призыв снималось сколько-то прочности).
 
Посмотри в дивайн рпг,там такая штука есть и работает.
 
Код:
@Override
public boolean onItemUse(ItemStack is, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) {
    Entity entity = new EntityLightningBolt(world, (double)x + 0.5D, (double)y + 0.5D, (double)z + 0.5D);
    world.addWeatherEffect(entity);
    is.damageItem(1, player);
    return true;
}
 
Спасибо всё работает, но если я призываю молния ближе чем на 3 блока от себя(не считаю тот на котором я стою) то мне наносится урон. Нельзя ли это как-то исправить.
 
Использовать два вектора, один вектор равен координатам игрока плюс высота головы, второй вектор куда смотрит игрок * на дистанцию. Сделать проверку есть-ли на пути линии этих векторов какие-либо блоки, если да то отправлять их координаты и спавнить молнию на этих координатах.
 
dimagor555 написал(а):
Спасибо всё работает, но если я призываю молния ближе чем на 3 блока от себя(не считаю тот на котором я стою) то мне наносится урон. Нельзя ли это как-то исправить.
Писать свою молнию с параметром summoner в конструкторе, туда сохранить игрока и бить всех, кроме него --ExcludingEntity(summoner) - смотри в зельке
 
Я мало знаю не могли бы вы показать пример или скинуть какой-нибудь туториал.
 
Как пример, на данный момент я бы так сделал:
Код:
@Override
public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
    MovingObjectPosition mop = block(player, 1.0F, 13.0D, false);
    if (mop != null) {
        EntityLightningBolt entity_l = new EntityLightningBolt(world, mop.hitVec.xCoord, mop.hitVec.yCoord, mop.hitVec.zCoord);
        world.addWeatherEffect(entity_l);
    }
    return stack;
}

public static MovingObjectPosition block(EntityLivingBase entity_base, float fasc, double dist, boolean interact) {
    Vec3 vec3 = Vec3.createVectorHelper(entity_base.posX, entity_base.posY + entity_base.getEyeHeight(), entity_base.posZ);
    Vec3 vec31 = entity_base.getLook(fasc);
    Vec3 vec32 = vec3.addVector(vec31.xCoord * dist, vec31.yCoord * dist, vec31.zCoord * dist);
    MovingObjectPosition mop = entity_base.worldObj.rayTraceBlocks(vec3, vec32, interact);
    return mop;
}
Ибо по другому сейчас-бы не старался-бы делать.
 
А если mop - энтитя, а ты блоки рейтрейсишь? Как тогда?

UPD:
Хотя лучше задам отдельный вопрос :D
 
Посмотри как работает пуля и перепили под себя (форум в помощь)...
Да и тем на эту тему было валом.
 
Да-да-да, я знаю, "if (mop.typeOfHit == MovingObjectType.ENTITY)". Вот только оно нифига не работает. Я не могу получить энтитю. Не знаю, почему ._.
 
Мой метод ищет блоки, а не Entity. Нужно сделать метод взяв за пример Minecraft#getMouseOver() и переделать под себя. У меня был пример, но он у меня для клиента.
Можно с клиентской стороны отправить ид Entity, на который мы смотрим, и по координатам Entity спавнить молнию.
А чтобы он работал и для серверной стороны, то его ещё нужно по изменять (т.е. он у меня ещё не готов).
 
timaxa007 написал(а):
Мой метод ищет блоки, а не Entity. Нужно сделать метод взяв за пример Minecraft#getMouseOver() и переделать под себя. У меня был пример, но он у меня для клиента.
Можно с клиентской стороны отправить ид Entity, на который мы смотрим, и по координатам Entity спавнить молнию.
А чтобы он работал и для серверной стороны, то его ещё нужно по изменять (т.е. он у меня ещё не готов).
А ещё это дыра, которую можно юзать для читов.
 
Ой, да кому ты нужен, чтобы под тебя специально свои читы писать?
Неплохо сойдет и такое решение, обнаружишь абуз - тогда и время делать серверные проверки.
 
Извернулся и соединил код Agravainа и рейтрейсер блоков, который уже был в моём моде, и через if (есть энтити) {} else {} таки сделал "переключалку" энтити-/-блок :D
 
Назад
Сверху