- Регистрация
- 4 Апр 2025
- Сообщения
- 24
- Реакции
- 0
- Баллы
- 1
- Город
- Санкт-Петербург
- Веб-сайт
- paxgame.ru
- Discord
- nicolayka
Прежде всего, необходимо установить Forge, так как мы будем использовать событие EntityJoinWorld.
Мы будем использовать конкретные примеры, однако вы можете применять это где угодно. Если вы хотите, чтобы криперы не взрывались или чтобы животные нападали на вас, вам нужно будет заменить, добавить или удалить определенные ИИ сущности. Вот как это сделать!
Инструкция
Теперь, следующие примеры покажут код, который ДОЛЖЕН быть ТОЛЬКО в "doTaskStuff( ... )"!
Заставляем криперов не нападать:
Заставляем коров нападать:
Объединяя и удаляя ИИ, можно изменять существующий ИИ. Например, можно EntityAIBreakDoor заменить на EntityAIBreakDoorAndTrapdoor (довольно понятно). Наши возможности почти безграничны.
Теперь вы знаете, как изменить ИИ криперов, коров и всего того, что захотите. Вы также можете создать свой собственный ИИ.
Ниже приведен довольно бессмысленный ИИ. Моб с этим ИИ просто подпрыгнет ОЧЕНЬ высоко, если окажется в воде.
Если вы найдете, как выполнить код при появлении сущности без Forge, вы, безусловно, можете использовать его тоже. Однако, поскольку в Forge эта функциональность уже встроена, я буду использовать Forge.
Мы будем использовать конкретные примеры, однако вы можете применять это где угодно. Если вы хотите, чтобы криперы не взрывались или чтобы животные нападали на вас, вам нужно будет заменить, добавить или удалить определенные ИИ сущности. Вот как это сделать!
Инструкция
Вам понадобится событие, которое будет запускаться каждый раз, когда моб появляется в мире.
Внутри нового класса с именем MyEvents.class добавьте:
И вызовите его в основном классе мода с помощью:
Поскольку работать с искусственным интеллектом могут только мобы, (EntityLiving), нам нужен флаг:
Внутри нового класса с именем MyEvents.class добавьте:
Java:
@SubscribeEvent
public void onEntitySpawn(EntityJoinWorldEvent e) {}
И вызовите его в основном классе мода с помощью:
Java:
FMLCommonHandler.instance().bus().register(new MyEvents());
Поскольку работать с искусственным интеллектом могут только мобы, (EntityLiving), нам нужен флаг:
Код:
@SubscribeEvent
public void onEntitySpawn(EntityJoinWorldEvent event)
{
if (event.entity instanceof EntityLiving) doTaskStuff((EntityLiving) event.entity, event);
}
private void doTaskStuff(EntityLiving e, Event ev)
{
//Do our code here!
}
Теперь, следующие примеры покажут код, который ДОЛЖЕН быть ТОЛЬКО в "doTaskStuff( ... )"!
Заставляем криперов не нападать:
Криперы могут быть довольно неприятными. Если вы захотите изменить их поведение, тогда вам нужно будет удалить такой AI, это значит, что нам нужно будет узнать, какой AI удалить. В Eclipse нажмите Ctrl + Shift + T и введите EntityCreeper, откройте его и немного прокрутите вниз.
Вы должны увидеть это:
Всё, что нам нужно удалить, это "EntityAICreeperSwell", "EntityAIAttackOnCollide" и "EntityAINearestAttackableTarget". Однако третий класс находится в списке под названием "targetTasks", а остальные находятся в "tasks".
Теперь мы знаем, какие задачи нужно удалить. Удобнее это делать это с помощью цикла for.
Добавьте это в doTaskStuff:
Однако, поскольку есть два списка "tasks" и "targetTasks", нам понадобится два цикла for. Вот второй, добавьте его после первого куска кода:
Теперь можно удалить задачи. Для проверки определенной задачи необходимо использовать проверку:
Например, это проверит все задачи в списке и удалит все, которые заставляют моба реагировать на другого моба.
В этом примере мы изменим код выше, чтобы удалить задачи "EntityAICreeperSwell" и "EntityAIAttackOnCollide" с помощью оператора OR.
Добавьте этот код в первый цикл for.
Отлично! Но мы не закончили, нам еще нужно удалить "EntityAINearestAttackableTarget".
Поскольку эта задача находится в "targetTasks", мы добавляем строку ниже в наш второй цикл for.
Готово!
Всё! Криперы больше не будут взрываться и/или причинять вред чему-либо.
Вы должны увидеть это:
Java:
public EntityCreeper(World par1World)
{
super(par1World);
this.tasks.addTask(1, new EntityAISwimming(this));
this.tasks.addTask(2, new EntityAICreeperSwell(this));
this.tasks.addTask(3, new EntityAIAvoidEntity(this, EntityOcelot.class, 6.0F, 1.0D, 1.2D));
this.tasks.addTask(4, new EntityAIAttackOnCollide(this, 1.0D, false));
this.tasks.addTask(5, new EntityAIWander(this, 0.8D));
this.tasks.addTask(6, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F));
this.tasks.addTask(6, new EntityAILookIdle(this));
this.targetTasks.addTask(1, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true));
this.targetTasks.addTask(2, new EntityAIHurtByTarget(this, false));
}
Теперь мы знаем, какие задачи нужно удалить. Удобнее это делать это с помощью цикла for.
Добавьте это в doTaskStuff:
Java:
for (Object a : entity.tasks.taskEntries.toArray())
{
EntityAIBase ai = ((EntityAITaskEntry) a).action;
//We put new code here
}
Однако, поскольку есть два списка "tasks" и "targetTasks", нам понадобится два цикла for. Вот второй, добавьте его после первого куска кода:
Java:
for (Object a : entity.targetTasks.taskEntries.toArray())
{
EntityAIBase ai = ((EntityAITaskEntry) a).action;
//We put new code here
}
Теперь можно удалить задачи. Для проверки определенной задачи необходимо использовать проверку:
Java:
if (e instanceof EntityChicken && ai instanceof EntityAIMate) e.tasks.removeTask(ai);
Например, это проверит все задачи в списке и удалит все, которые заставляют моба реагировать на другого моба.
В этом примере мы изменим код выше, чтобы удалить задачи "EntityAICreeperSwell" и "EntityAIAttackOnCollide" с помощью оператора OR.
Добавьте этот код в первый цикл for.
Java:
if (e instanceof EntityCreeper && (ai instanceof EntityAICreeperSwell || ai instanceof EntityAIAttackOnCollide)) e.tasks.removeTask(ai);
Отлично! Но мы не закончили, нам еще нужно удалить "EntityAINearestAttackableTarget".
Поскольку эта задача находится в "targetTasks", мы добавляем строку ниже в наш второй цикл for.
Java:
if (e instanceof EntityCreeper && ai instanceof EntityAINearestAttackableTarget) e.targetTasks.removeTask(ai);
Всё! Криперы больше не будут взрываться и/или причинять вред чему-либо.
Заставляем коров нападать:
Подобно примеру выше (но проще), мы просто добавим новую задачу.
Внутри вашего метода "doTaskStuff" просто добавьте следующие строки:
Вот и всё.
Внутри вашего метода "doTaskStuff" просто добавьте следующие строки:
Java:
if (e instanceof EntityCow)
{
this.tasks.addTask(2, new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.0D, false));
this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true));
}
Объединяя и удаляя ИИ, можно изменять существующий ИИ. Например, можно EntityAIBreakDoor заменить на EntityAIBreakDoorAndTrapdoor (довольно понятно). Наши возможности почти безграничны.
Теперь вы знаете, как изменить ИИ криперов, коров и всего того, что захотите. Вы также можете создать свой собственный ИИ.
Ниже приведен довольно бессмысленный ИИ. Моб с этим ИИ просто подпрыгнет ОЧЕНЬ высоко, если окажется в воде.
Внутри нового класса под названием EntityAIJumpOutOfWater:
Java:
public class EntityAIJumpOutOfWater extends EntityAIBase {
private EntityLiving theEntity;
public EntityAIJumpOutOfWater(EntityLiving par1EntityLiving)
{
this.theEntity = par1EntityLiving;
}
public boolean shouldExecute()
{
return theEntity.isInWater();
}
public boolean continueExecuting()
{
return theEntity.isInWater();
}
public void startExecuting()
{
this.theEntity.motionY = 2;
}
public void resetTask()
{
//Nothing to reset, if you have variables, you can set them to 0, false, "", etc here.
}
public void updateTask()
{
//We have nothing to update, you can't continue jumping, you jump once then fall back down.
}
}
Последнее редактирование: