Огнестрельное оружие MCreator

Версия Minecraft
1.16+
API
MCreator
Прошу помощи,делаю мод на рейдеров со стволами.
Создал оружие(ак47),создал дальнобойного моба,которому дал ствол,но он стреляет слишком медленно,слишком не точно,и атакует на слишком маленькой дистанции,при том что сам ак стреляет исправно,точно и быстро.Я так и не понял,где и что надо изменить,в гуи мкреатора ничего по этому поводу,в коде чекнул какие можно вбить атрибуты,происал ATTACK_SPEED и FOLLOW_RANGE:
Атрибуты:
public static AttributeSupplier.Builder createAttributes() {
        AttributeSupplier.Builder builder = Mob.createMobAttributes();
        builder = builder.add(Attributes.MOVEMENT_SPEED, 0.2);
        builder = builder.add(Attributes.MAX_HEALTH, 25);
        builder = builder.add(Attributes.ARMOR, 0);
        builder = builder.add(Attributes.ATTACK_DAMAGE, 4);
        builder = builder.add(Attributes.ATTACK_SPEED, 50);
        builder = builder.add(Attributes.FOLLOW_RANGE, 60);

Собственно,скорость атаки не сработала,скорее всего потому что это атака в рукопашную,вырос Follow range,точности в подсказках атрибутов не было,поэтому непонятно где она может быть прописана.По итогу есть только дальность того куда моб может атаковать,скорость и точность хз где.

Кто-то может помочь с этим?
 
28
3
4
Какого типа твоё оружие? Лук|Трезубец|Зелье?
 
28
3
4
@MaximPixel,
Это я понял, но во время настройки оружия дальнего боя.
Там выбирается тип оружия+анимация.
Возможно ему следует выбрать тип "зелье".
Либо он настраивает скорость АА оружия, в тот момент, когда ИИ моба может стрелять только с определённой скоростью.

Советую создать процедуру с глобальным триггером " Сущность видит цель" (как-то так) и создать там схему: Если сущность = бандит, то выполнить -> Стрелять снарядом...

Следует ещё создать переменную, в которой будет храниться тег NBT моба, который будет отвечать за КД(иначе моб будет стрелять без задержки и перезарядки)
Схема:
Глобальный триггер = Сущность видит цель/игрока -> Если NBT тег "КД" = "да" то выполнить -> Если сущность = бандит то выполнить -> выстрелить снарядом... | задать NBT тег "КД" = "нет" | подождать 20 тиков а затем выполнить -> задать NBT тег "КД" -> "да"
 
Как ты собрался через ентити настраивать "пулю" ? Особенно в MCreator's.....
В том и проблема,что её и не надо настраивать,само оружие-то работает исправно,полёт пули прямой на очень большую дистанцию,а вот то что моб стреляет криво - дело другое.

Там выбирается тип оружия+анимация.
Ну анимация там выбирается,действительно,и это арбалет(на самом деле и лук,и копье пробовал,результат всё равно был +/- одинаковый,а хотелось бы чтобы персонаж не "бил" этим калашом при каждом выстреле а держал неподвижно),а вот тип оружия - не знаю,не было там такого.Кроме того что в самом начале выбирается ranged item.Если что,версия креатора последняя.

А поможет ли это?Оружие-то уже готово,проблема скорее в поведении моба,которое его использует,нет?
 
28
3
4
В том и проблема,что её и не надо настраивать,само оружие-то работает исправно,полёт пули прямой на очень большую дистанцию,а вот то что моб стреляет криво - дело другое.

Ну анимация там выбирается,действительно,и это арбалет(на самом деле и лук,и копье пробовал,результат всё равно был +/- одинаковый,а хотелось бы чтобы персонаж не "бил" этим калашом при каждом выстреле а держал неподвижно),а вот тип оружия - не знаю,не было там такого.Кроме того что в самом начале выбирается ranged item.Если что,версия креатора последняя.

А поможет ли это?Оружие-то уже готово,проблема скорее в поведении моба,которое его использует,нет?

ну попробуй создать процедуру выстрела, поможет, будет стрелять по направлению взгляда

экспортируй проэкт, я посмотрю когда приеду, что у тебя там, создам процедуру, протестирую, получится - импортирую тебе или скопируешь
 
Последнее редактирование модератором:
ну попробуй создать процедуру выстрела, поможет, будет стрелять по направлению взгляда

экспортируй проэкт, я посмотрю когда приеду, что у тебя там, создам процедуру, протестирую, получится - импортирую тебе или скопируешь
Могу,буду благодарен.Куда лучше кинуть?Гуглач,телега?
 
ну попробуй создать процедуру выстрела, поможет, будет стрелять по направлению взгляда

экспортируй проэкт, я посмотрю когда приеду, что у тебя там, создам процедуру, протестирую, получится - импортирую тебе или скопируешь
Ну как там?Я пока толком вообще не разобрался как создавать свои процедуры,к сожалению.
 
28
3
4
короче, ну его... этот реализм и стрельбу очередями, методом тыка и скролинга кодаа, нашел решение
заходи в BandinNewEntity.java - т.е основной класс своего Бандита
ищи (примерно у тебя строчку 96) и в ней this.goalSelector.addGoal(1, new RangedAttackGoal(this, 1.25, 20, 10)
меняй 20 на 10-20 (в районе 7 стрельба наносит урон через раз)
p.s 20 = 1сек (10 = 0.5сек)
 
ищи (примерно у тебя строчку 96) и в ней this.goalSelector.addGoal(1, new RangedAttackGoal(this, 1.25, 20, 10)
Спасибо,кое-как помогло.
Не знаешь за что отвечают остальные 2 числа?Первое вообще что-то неадекватное делает с повышением,третье непонятно.
Да и второй чисто скорость регулирует,а не точность,но да ладно,в целом кое-как фиксит.
Тогда еще вопрос,может быть знаешь,дальность реагирования на врага можно увеличить?
А то эти снайперы уже блоков через 15-20 не видят никого.
 
я сейчас удалил последнюю версию MC (пытаюсь оживить Geckolib на старой(не получается)) и не могу посмотреть и точно сказать, видел где то в настройках ИИ, пришли полностью код ентити, посмотрим
Вот,держи.Всё что находится по слову "range" это либо верхний код,либо что-то не то.По запросу distance вообще ничего нет.

BanditNewEntity:
package net.mcreator.ak.entity;



import net.minecraftforge.registries.ForgeRegistries;

import net.minecraftforge.fmllegacy.network.NetworkHooks;

import net.minecraftforge.fmllegacy.network.FMLPlayMessages;

import net.minecraftforge.fml.common.Mod;

import net.minecraftforge.eventbus.api.SubscribeEvent;

import net.minecraftforge.event.world.BiomeLoadingEvent;

import net.minecraftforge.common.DungeonHooks;



import net.minecraft.world.level.material.Material;

import net.minecraft.world.level.levelgen.Heightmap;

import net.minecraft.world.level.block.state.BlockState;

import net.minecraft.world.level.biome.MobSpawnSettings;

import net.minecraft.world.level.Level;

import net.minecraft.world.item.ItemStack;

import net.minecraft.world.entity.player.Player;

import net.minecraft.world.entity.monster.RangedAttackMob;

import net.minecraft.world.entity.monster.Monster;

import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal;

import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal;

import net.minecraft.world.entity.ai.goal.RangedAttackGoal;

import net.minecraft.world.entity.ai.goal.RandomStrollGoal;

import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal;

import net.minecraft.world.entity.ai.goal.PanicGoal;

import net.minecraft.world.entity.ai.goal.OpenDoorGoal;

import net.minecraft.world.entity.ai.goal.MoveBackToVillageGoal;

import net.minecraft.world.entity.ai.goal.LeapAtTargetGoal;

import net.minecraft.world.entity.ai.goal.FloatGoal;

import net.minecraft.world.entity.ai.attributes.Attributes;

import net.minecraft.world.entity.ai.attributes.AttributeSupplier;

import net.minecraft.world.entity.SpawnPlacements;

import net.minecraft.world.entity.MobType;

import net.minecraft.world.entity.MobCategory;

import net.minecraft.world.entity.Mob;

import net.minecraft.world.entity.LivingEntity;

import net.minecraft.world.entity.EquipmentSlot;

import net.minecraft.world.entity.EntityType;

import net.minecraft.world.damagesource.DamageSource;

import net.minecraft.sounds.SoundEvent;

import net.minecraft.resources.ResourceLocation;

import net.minecraft.network.protocol.Packet;

import net.minecraft.core.BlockPos;



import net.mcreator.ak.init.AkModItems;

import net.mcreator.ak.init.AkModEntities;



import java.util.Set;



@Mod.EventBusSubscriber

public class BandinNewEntity extends Monster implements RangedAttackMob {

    private static final Set<ResourceLocation> SPAWN_BIOMES = Set.of(new ResourceLocation("forest"), new ResourceLocation("plains"),

            new ResourceLocation("savanna"), new ResourceLocation("swamp"), new ResourceLocation("desert"));



    @SubscribeEvent

    public static void addLivingEntityToBiomes(BiomeLoadingEvent event) {

        if (SPAWN_BIOMES.contains(event.getName()))

            event.getSpawns().getSpawner(MobCategory.CREATURE).add(new MobSpawnSettings.SpawnerData(AkModEntities.BANDIN_NEW, 20, 3, 5));

    }



    public BandinNewEntity(FMLPlayMessages.SpawnEntity packet, Level world) {

        this(AkModEntities.BANDIN_NEW, world);

    }



    public BandinNewEntity(EntityType<BandinNewEntity> type, Level world) {

        super(type, world);

        xpReward = 5;

        setNoAi(false);

        this.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(AkModItems.AK_47));

    }



    @Override

    public Packet<?> getAddEntityPacket() {

        return NetworkHooks.getEntitySpawningPacket(this);

    }



    @Override

    protected void registerGoals() {

        super.registerGoals();

        this.targetSelector.addGoal(1, new NearestAttackableTargetGoal(this, Player.class, true, false));

        this.targetSelector.addGoal(2, new NearestAttackableTargetGoal(this, Monster.class, true, false));

        this.goalSelector.addGoal(3, new RandomStrollGoal(this, 1));

        this.goalSelector.addGoal(4, new OpenDoorGoal(this, true));

        this.goalSelector.addGoal(5, new MoveBackToVillageGoal(this, 0.6, false));

        this.goalSelector.addGoal(6, new RandomLookAroundGoal(this));

        this.goalSelector.addGoal(7, new FloatGoal(this));

        this.goalSelector.addGoal(8, new LeapAtTargetGoal(this, (float) 0.8));

        this.goalSelector.addGoal(9, new PanicGoal(this, 1.2));

        this.targetSelector.addGoal(10, new HurtByTargetGoal(this).setAlertOthers(this.getClass()));

        this.goalSelector.addGoal(1, new RangedAttackGoal(this, 1.25, 2, 10) {

            @Override

            public boolean canContinueToUse() {

                return this.canUse();

            }

        });

    }



    @Override

    public MobType getMobType() {

        return MobType.UNDEFINED;

    }



    @Override

    public SoundEvent getAmbientSound() {

        return ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.sheep.step"));

    }



    @Override

    public void playStepSound(BlockPos pos, BlockState blockIn) {

        this.playSound(ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.zombie_villager.step")), 0.15f, 1);

    }



    @Override

    public SoundEvent getHurtSound(DamageSource ds) {

        return ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.generic.hurt"));

    }



    @Override

    public SoundEvent getDeathSound() {

        return ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.generic.death"));

    }



    @Override

    public void performRangedAttack(LivingEntity target, float flval) {

        Ak47Entity.shoot(this, target);

    }



    public static void init() {

        SpawnPlacements.register(AkModEntities.BANDIN_NEW, SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES,

                (entityType, world, reason, pos,

                        random) -> (world.getBlockState(pos.below()).getMaterial() == Material.GRASS && world.getRawBrightness(pos, 0) > 8));

        DungeonHooks.addDungeonMob(AkModEntities.BANDIN_NEW, 180);

    }



    public static AttributeSupplier.Builder createAttributes() {

        AttributeSupplier.Builder builder = Mob.createMobAttributes();

        builder = builder.add(Attributes.MOVEMENT_SPEED, 0.3);

        builder = builder.add(Attributes.MAX_HEALTH, 25);

        builder = builder.add(Attributes.ARMOR, 0);

        builder = builder.add(Attributes.ATTACK_DAMAGE, 1);

        return builder;

    }

}

А еще в конструкторе можно указать атковать если видишь врага/враг поблизости,но в коде там чисто true/falce,без численных значений:
Code:
this.targetSelector.addGoal(1, new NearestAttackableTargetGoal(this, Player.class, true, false));
 
Последнее редактирование:
Сверху