EntityTrowable или предмет, который можно кинуть

EntityTrowable или предмет, который можно кинуть

Нет прав для скачивания
917
22
332
Крокодил добавил(а) новый ресурс:

EntityTrowable или предмет, который можно кинуть - Вы узнаете о создании своего предмета, который можно кидать, как снежок . И ещё кое-что...

Доброго времени суток, господа.
Этот туториал ориентирован, прежде всего, на новичков и ничего сложного не представляет. Здесь я даже не упомяну про рендер, пользуясь исключительно ванильными средствами.
Однако, на эту версию подобных статей практически нет, и я думаю лишней она не будет.
Ну а те, кто не новички, возможно, найдут что-нибудь интересное в главе 5.
Ладно, хватит лирики, поехали!

Содержание:
  1. [COLOR=rgb(147, 101...[/SIZE]


Узнать больше об этом ресурсе...
 
2,932
44
598
Хех) А я тут стрелы юзал:
Java:
public class EntityBlockBullet extends EntityTippedArrow {
   
    public EntityBlockBullet(World a) {
       
        super(a);
       
       
    }

    public EntityBlockBullet(World worldIn, double x, double y, double z) {
       
        super(worldIn, x, y, z);
       
    }

    public EntityBlockBullet(World worldIn, EntityLivingBase shooter) {
       
        super(worldIn, shooter);
       
    }

    @Override
    public void onCollideWithPlayer(EntityPlayer entity) {
       
        super.onCollideWithPlayer(entity);
       
        MathHelper.floor(this.getEntityBoundingBox().minX + 0D);
        MathHelper.floor(this.getEntityBoundingBox().minY + 0D);
        MathHelper.floor(this.getEntityBoundingBox().minZ + 0D);

    }

    @Override
    public void onUpdate() {
       
        super.onUpdate();
       
        int x = MathHelper.floor(getEntityBoundingBox().minX + 0D);
        int y = MathHelper.floor(getEntityBoundingBox().minY + 0D);
        int z = MathHelper.floor(getEntityBoundingBox().minZ + 0D);

                   if (getBlock(world, x, y, z) != Blocks.AIR
                || getBlock(world, x, y - 1, z) != Blocks.AIR
                || getBlock(world, x, y + 1, z) != Blocks.AIR
                || getBlock(world, x + 1, y, z) != Blocks.AIR
                || getBlock(world, x - 1, y, z) != Blocks.AIR
                || getBlock(world, x, y, z + 1) != Blocks.AIR
                || getBlock(world, x, y, z - 1) != Blocks.AIR) {
   
                world.setBlockState(new BlockPos(x, y, z), Blocks.DIRT.getDefaultState(), 2);
               
                world.removeEntity(this);
        }
    }

    public Block getBlock(World World, int x, int y, int z) {
       
        return World.getBlockState(new BlockPos(x, y, z)).getBlock();
       
    }

}
Надо будет попробовать перейти на EntityTrowable.
 
917
22
332
Зависит от того, что тебе нужно. Стрелы больше подойдут там, где полёт entity будет более динамичный, и они позволят настраивать больше параметров. А вот для летающего яблока хватит и моего способа)
 
917
22
332
Пулям нужны только скорость, урон... ну и может ещё что-то, в зависимости от разработчика. Наверное по этому.
 

CMTV

Основатель
Администратор
1,304
4
601
Отличный туториал! (y)

Читается легко, архив с исходниками есть, картинки есть, комментарии в коде тоже.

Так держать!

Может, стоит перенести в учебник. Что думаете? :unsure:
 
917
22
332
Спасибо:giggle:. Прям так много позитива в комментариях, что не жаль ни секунды потраченного времени. Кстати, для учебника и делал, в Trello в плитке "сущность" запись уже есть.
 
Последнее редактирование:
2,932
44
598
Извиняюсь за такой странный вопрос, но на какие случай жизни могут пригодиться эти конструкторы?)
Java:
//Три блока ниже - это конструкторы. На разные случаи жизни.
    public EntityFlyApple(World world) {
        super(world);
    }

    public EntityFlyApple(World world, EntityLivingBase thrower) {
        super(world, thrower);
    }

    public EntityFlyApple(World world, double x, double y, double z) {
        super(world, x, y, z);
    }
 

timaxa007

Модератор
5,831
409
672
@Garik, типа 1 и 3 конструкторы от родителя Entity. 2 конструктор от родителя EntityTrowable.
1 конструктор из-за рефлексии надо всегда писать.
2 чтобы бросался от координат бросающего и для родителя EntityTrowable запомнить кто бросил.
3 не обязателен или даже не желателен, лучше использовать 1 и давать позицию через нужный метод.
 

timaxa007

Модератор
5,831
409
672
@Крокодил, я ни чего плохо не имею виду. Всё завит от использование, если тебе удобно писать всё в одну строчку, то 3 конструктор подойдёт. Просто я обычно не использую подобный конструктор, по этому я так глупо написал про его "не обязателен и даже не желателен".
 
917
22
332
Ясно, спасибо. @timaxa007, я тоже ничего особо не имел в виду) Но тупо скопипастил эти три конструктора из снежка и не особо парился, что нужно, а что нет, понадеявшись на умных моджангов. X] Поэтому, когда Гарик спросил про эти конструкторы, я уже подумал, что такие комментарии в коде рано или поздно приведут меня на раскалённую сковороду))) А тут ты написал свой ответ и я понял, что моджангам доверять нельзя - это раз. Два - раскалённая сковородка мой дом:LOL: Отсюда и мой комментарий.
 

timaxa007

Модератор
5,831
409
672
Пожалуйста. "моджанги" именно создали для сокращения, чтобы не вызывать метод setPosition через переменную этого объекта, а использовать в конструкторе.
 
1,200
37
237
Всё понятно, даже читая по диагонали (с пропуском слов). Не напрягают слова. Короче, годно.

А чтобы яблоко можно было есть, воткни проверку на приседание игрока)
 
1,200
37
237
Можно добавить послесловием, но это не столь важно.
 

ReyMagos

Тег-бомбастер
412
7
121
Я сделал, как написано, у меня краш
Код:
---- Minecraft Crash Report ----
// Don't be sad. I'll do better next time, I promise!

Time: 7/13/18 5:25 PM
Description: There was a severe problem during mod loading that has caused the game to fail

net.minecraftforge.fml.common.LoaderExceptionModCrash: Caught exception from RedMod (redmod)
Caused by: java.lang.IllegalArgumentException: Can not set static luckyblock.redmod.entites.EntityBullet field luckyblock.redmod.RedModMain.instance to luckyblock.redmod.RedModMain
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
    at sun.reflect.UnsafeStaticObjectFieldAccessorImpl.set(UnsafeStaticObjectFieldAccessorImpl.java:79)
    at java.lang.reflect.Field.set(Field.java:764)
    at net.minecraftforge.fml.common.FMLModContainer.parseSimpleFieldAnnotation(FMLModContainer.java:500)
    at net.minecraftforge.fml.common.FMLModContainer.processFieldAnnotations(FMLModContainer.java:430)
    at net.minecraftforge.fml.common.FMLModContainer.constructMod(FMLModContainer.java:583)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.google.common.eventbus.Subscriber.invokeSubscriberMethod(Subscriber.java:91)
    at com.google.common.eventbus.Subscriber$SynchronizedSubscriber.invokeSubscriberMethod(Subscriber.java:150)
    at com.google.common.eventbus.Subscriber$1.run(Subscriber.java:76)
    at com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:399)
    at com.google.common.eventbus.Subscriber.dispatchEvent(Subscriber.java:71)
    at com.google.common.eventbus.Dispatcher$PerThreadQueuedDispatcher.dispatch(Dispatcher.java:116)
    at com.google.common.eventbus.EventBus.post(EventBus.java:217)
    at net.minecraftforge.fml.common.LoadController.sendEventToModContainer(LoadController.java:278)
    at net.minecraftforge.fml.common.LoadController.propogateStateMessage(LoadController.java:256)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.google.common.eventbus.Subscriber.invokeSubscriberMethod(Subscriber.java:91)
    at com.google.common.eventbus.Subscriber$SynchronizedSubscriber.invokeSubscriberMethod(Subscriber.java:150)
    at com.google.common.eventbus.Subscriber$1.run(Subscriber.java:76)
    at com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:399)
    at com.google.common.eventbus.Subscriber.dispatchEvent(Subscriber.java:71)
    at com.google.common.eventbus.Dispatcher$PerThreadQueuedDispatcher.dispatch(Dispatcher.java:116)
    at com.google.common.eventbus.EventBus.post(EventBus.java:217)
    at net.minecraftforge.fml.common.LoadController.distributeStateMessage(LoadController.java:148)
    at net.minecraftforge.fml.common.Loader.loadMods(Loader.java:568)
    at net.minecraftforge.fml.client.FMLClientHandler.beginMinecraftLoading(FMLClientHandler.java:231)
    at net.minecraft.client.Minecraft.init(Minecraft.java:513)
    at net.minecraft.client.Minecraft.run(Minecraft.java:421)
    at net.minecraft.client.main.Main.main(Main.java:118)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97)
    at GradleStart.main(GradleStart.java:25)


A detailed walkthrough of the error, its code path and all known details is as follows:
---------------------------------------------------------------------------------------

-- System Details --
Details:
    Minecraft Version: 1.12.2
    Operating System: Windows 10 (amd64) version 10.0
    Java Version: 1.8.0_171, Oracle Corporation
    Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
    Memory: 358431688 bytes (341 MB) / 547880960 bytes (522 MB) up to 1897922560 bytes (1810 MB)
    JVM Flags: 0 total;
    IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
    FML: MCP 9.42 Powered by Forge 14.23.3.2655 5 mods loaded, 5 mods active
    States: 'U' = Unloaded 'L' = Loaded 'C' = Constructed 'H' = Pre-initialized 'I' = Initialized 'J' = Post-initialized 'A' = Available 'D' = Disabled 'E' = Errored

    | State | ID        | Version      | Source                           | Signature |
    |:----- |:--------- |:------------ |:-------------------------------- |:--------- |
    | UC    | minecraft | 1.12.2       | minecraft.jar                    | None      |
    | UC    | mcp       | 9.42         | minecraft.jar                    | None      |
    | UC    | FML       | 8.0.99.99    | forgeSrc-1.12.2-14.23.3.2655.jar | None      |
    | UC    | forge     | 14.23.3.2655 | forgeSrc-1.12.2-14.23.3.2655.jar | None      |
    | UE    | redmod    | 1.0          | LuckyBlock_main                  | None      |

    Loaded coremods (and transformers):
    GL info: ' Vendor: 'ATI Technologies Inc.' Version: '4.5.13492 Compatibility Profile Context 22.19.677.257' Renderer: 'AMD Radeon HD 7700 Series'
 
Последнее редактирование модератором:

ReyMagos

Тег-бомбастер
412
7
121
Java:
@Mod(modid = "redmod", name = "RedMod - BlockLuckyBlock", version = "1.0", canBeDeactivated = true, acceptedMinecraftVersions = "[1.12]")
public class RedModMain {

    @SidedProxy(clientSide = "luckyblock.redmod.proxy.ClientProxy", serverSide = "luckyblock.redmod.proxy.CommonProxy")
    public static CommonProxy proxy;
    public static CreativeTabs RedMod = new CreativeTab("RedMod");

    @EventHandler
    public void preInit(FMLPreInitializationEvent event) {
       proxy.preInit(event);
    }

    @EventHandler
    public void init(FMLInitializationEvent event) {
        proxy.init(event);
    }

    @EventHandler
    public void postInit(FMLPostInitializationEvent event) {
        proxy.postInit(event);
    }

    @Mod.Instance("redmod")
    public static EntityBullet instance;
}
 
Сверху