Jump to content

[1.8] Natural entity spawns.


GerbShert

Recommended Posts

Hello, I am trying to get a custom entity to spawn in the world. I can get it to spawn with it's spawn egg and with the /summon command but it does not spawn naturally. This is the current code I am using to try to spawn my creatures.

public class RegisterEntitySpawns {
    static BiomeGenBase[] WaterBiomes = {BiomeGenBase.beach, BiomeGenBase.ocean, BiomeGenBase.deepOcean, BiomeGenBase.swampland, BiomeGenBase.frozenOcean, BiomeGenBase.frozenRiver};

    public static void registerEntitySpawns() {
        System.out.println("Registering natural fish spawns");
        EntityRegistry.addSpawn(EntityCod.class, 10, 1,7, EnumCreatureType.WATER_CREATURE, BiomeGenBase.deepOcean);
        EntityRegistry.addSpawn(EntityClown.class, 20, 2, 5, EnumCreatureType.WATER_CREATURE, WaterBiomes);
        EntityRegistry.addSpawn(EntitySalmon.class, 20, 2, 7, EnumCreatureType.WATER_CREATURE, WaterBiomes);
    }
}

My mods full code can be seen on GitHub if that will help at all.

Link to comment
Share on other sites

Registering Entitys

public class RegisterEntitys {
    public static void RegisterFishyEntitys() {
        GerbsEntityRegistrar.registerEntity(EntityCod.class, "entityCod", 8774806, 11784191);
        GerbsEntityRegistrar.registerEntity(EntitySalmon.class, "entitySalmon", 11295305, 16766904);
        GerbsEntityRegistrar.registerEntity(EntityPuffer.class, "entityPuffer", 16764928, 3839999);
        GerbsEntityRegistrar.registerEntity(EntityClown.class, "entityClown", 16740096, 16777215);
    }
}

public class GerbsEntityRegistrar {
    public static void registerEntity(Class entityClass, String name, Integer colorOne, Integer colorTwo) {
        int entityID = EntityRegistry.findGlobalUniqueEntityId();
        long seed = name.hashCode();
        Random rand = new Random(seed);
        int primaryColor = colorOne;
        int secondaryColor = colorTwo;

        EntityRegistry.registerGlobalEntityID(entityClass, name, entityID);
        EntityRegistry.registerModEntity(entityClass, name, entityID, FishyPlus.instance, 64, 1, true);
        EntityList.entityEggs.put(Integer.valueOf(entityID), new EntityList.EntityEggInfo(entityID, primaryColor, secondaryColor));
    }
}

Link to comment
Share on other sites

You provide an id yourself.

-Mitchellbrine

 

Minecraft can do ANYTHING, it's coded in Java and you got the full power of Java behind you when you code. So nothing is impossible.

It may be freaking fucking hard though, but still possible ;)

 

If you create a topic on Modder Support, live by this motto:

I don't want your charity, I want your information
Link to comment
Share on other sites

New Entity Registration

public class RegisterEntitys {

    public static void RegisterFishyEntitys() {

        GerbsEntityRegistrar.registerEntity(EntityCod.class, "entityCod", 8774806, 11784191,0);
        GerbsEntityRegistrar.registerEntity(EntitySalmon.class, "entitySalmon", 11295305, 16766904,1);
        GerbsEntityRegistrar.registerEntity(EntityPuffer.class, "entityPuffer", 16764928, 3839999,2);
        GerbsEntityRegistrar.registerEntity(EntityClown.class, "entityClown", 16740096, 16777215,3);
    }
}

public class GerbsEntityRegistrar {
    static int startEntityId = 354;
    public static void registerEntity(Class entityClass, String name, Integer colorOne, Integer colorTwo, Integer gerbsEntityID) {
        int entityID = 354 + gerbsEntityID;
        long seed = name.hashCode();;
        int primaryColor = colorOne;
        int secondaryColor = colorTwo;

        EntityRegistry.registerModEntity(entityClass, name, entityID, FishyPlus.instance, 64, 1, true);
        EntityList.entityEggs.put(Integer.valueOf(entityID), new EntityList.EntityEggInfo(entityID, primaryColor, secondaryColor));

    }
}

Spawn eggs are in-game but when used they don't spawn and console says

[16:41:29] [server thread/WARN]: Skipping Entity with id 358
[16:41:31] [server thread/WARN]: Skipping Entity with id 358
[16:41:31] [server thread/WARN]: Skipping Entity with id 358
[16:41:31] [server thread/WARN]: Skipping Entity with id 358
[16:41:31] [server thread/WARN]: Skipping Entity with id 358

They can be spawned with the summon command just fine.

 

 

Link to comment
Share on other sites

Using registerModEntity, you can't spawn them with spawn eggs.  IIRC, you need to create your own spawn egg item.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

Using registerModEntity, you can't spawn them with spawn eggs(without making my own spawn egg item).  IIRC, you need to create your own spawn egg item.

I looked at EntityList and figured out how to make spawn eggs. Replaced
EntityList.entityEggs.put(Integer.valueOf(entityID), new EntityList.EntityEggInfo(entityID, primaryColor, secondaryColor));

with

EntityList.addMapping(entityClass, name, entityID, primaryColor, secondaryColor);

And now the spawn eggs work again and the /summon command works but now I still have my original problem... They can not be found naturally spawned in-world.

Link to comment
Share on other sites

Adding directly to the EntityList like that is still not a good idea - you have no idea whether the ID you chose is unique or not, and if you did still use findUniqueGlobalId but didn't register it to your entity, then it's pointless.

 

You need to implement your own custom EntityList / spawn egg / summon command. I've brought this up before, but the Forge team is apparently not keen on making it easier to use, and that's just the way it is.

 

I've posted links to my own code as an example somewhere around here; you can probably find it if you search.

 

To make your entity spawn in the world, you need to add the spawn information to the EntityRegistry for each biome that you want it to spawn in:

EntityRegistry.addSpawn(entity.class, spawnRate, min, max, creatureType, biome);

Link to comment
Share on other sites

Adding directly to the EntityList like that is still not a good idea - you have no idea whether the ID you chose is unique or not, and if you did still use findUniqueGlobalId but didn't register it to your entity, then it's pointless.

 

You need to implement your own custom EntityList / spawn egg / summon command. I've brought this up before, but the Forge team is apparently not keen on making it easier to use, and that's just the way it is.

 

I've posted links to my own code as an example somewhere around here; you can probably find it if you search.

 

To make your entity spawn in the world, you need to add the spawn information to the EntityRegistry for each biome that you want it to spawn in:

EntityRegistry.addSpawn(entity.class, spawnRate, min, max, creatureType, biome);

 

I am not trying to be rude but in the first post I said that "EntityRegistry.addSpawn(entity.class, spawnRate, min, max, creatureType, biome);" was exactly what I was using and it is not working.

When I was using the global unique ID I was registering it to my entity (and diesieben07 said I should not do that so I registered them with my own IDs.)

The spawn eggs and Summon command were(and are) not a problem. They work fine. My mob is not spawning naturally in the world.

 

Here is ALL my current code I am using for entitys

 

 

Registering Entitys :

public class RegisterEntitys {

    public static void RegisterFishyEntitys() {

        GerbsEntityRegistrar.registerEntity(EntityCod.class, "entityCod", 8774806, 11784191,0);
        GerbsEntityRegistrar.registerEntity(EntitySalmon.class, "entitySalmon", 11295305, 16766904,1);
        GerbsEntityRegistrar.registerEntity(EntityPuffer.class, "entityPuffer", 16764928, 3839999,2);
        GerbsEntityRegistrar.registerEntity(EntityClown.class, "entityClown", 16740096, 16777215,3);
    }
}

public class GerbsEntityRegistrar {
    public static void registerEntity(Class entityClass, String name, Integer colorOne, Integer colorTwo, Integer gerbsEntityID) {

        int entityID = 354 + gerbsEntityID;
        int primaryColor = colorOne;
        int secondaryColor = colorTwo;

        EntityRegistry.registerModEntity(entityClass, name, entityID, FishyPlus.instance, 64, 1, true);
        EntityList.addMapping(entityClass, name, entityID, primaryColor, secondaryColor);
        System.out.println("Registering GerbShert's Fish entity " + name + " with ID of " + entityID);
    }
}

Making entities spawn in world

public class RegisterEntitySpawns {
    static BiomeGenBase[] WaterBiomes = {BiomeGenBase.beach, BiomeGenBase.ocean, BiomeGenBase.deepOcean, BiomeGenBase.swampland, BiomeGenBase.frozenOcean, BiomeGenBase.frozenRiver};

    public static void registerEntitySpawns() {
        System.out.println("Registering natural fish spawns");
        EntityRegistry.addSpawn(EntityCod.class, 50, 1,7, EnumCreatureType.WATER_CREATURE, BiomeGenBase.deepOcean);
        EntityRegistry.addSpawn(EntityClown.class, 20, 2, 5, EnumCreatureType.WATER_CREATURE, WaterBiomes);
        EntityRegistry.addSpawn(EntitySalmon.class, 20, 2, 7, EnumCreatureType.WATER_CREATURE, WaterBiomes);
    }
}

Link to comment
Share on other sites

And when do you call registerEntitySpawns? I don't see you call that method from anywhere.

 

It needs to be after all entities are registered, and preferably during FMLPostInitializationEvent in case you want to use any modded biomes or anything. That's where I add mob spawns, and that works for me.

I was calling it like this

    public void preInit(FMLPreInitializationEvent event) {
        //Register Entities
        RegisterEntitys.RegisterFishyEntitys();
        //Register Blocks
        RegisterBlocks.RegisterBlocks();
        //Register Items
        RegisterItems.RegisterItems();
        //Register Recipes
        FishyRecipes.RegisterFishyRecipes();
        //Register Entity Spawns
        RegisterEntitySpawns.registerEntitySpawns();

    }

I will try to move it to post init.

Link to comment
Share on other sites

Do something like this:

 

public class ModEntities {

public static final String tag = "EntityName";
public static int startEntityId = 300;

// Put Renderers in ClientProxy//
// Put Guis in CommonProxy//
// Put Creature SFX in Sound and sounds.json//
public static void loadCreatures() {
	registerEntity(EntityZertum.class, "Zertum", 0);
	registerEntityEgg(EntityZertum.class, 0xCCCCCC, 0x33FFFF);
	registerEntity(EntityRedZertum.class, "RedZertum", 1);
	registerEntityEgg(EntityRedZertum.class, 0xCCCCCC, 0xFF0000);
	registerEntity(EntityDestroZertum.class, "DestroZertum", 2);
	registerEntityEgg(EntityDestroZertum.class, 0xCCCCCC, 0xE6CC80);
	registerEntity(EntityIceZertum.class, "IceZertum", 3);
	registerEntityEgg(EntityIceZertum.class, 0xCCCCCC, 0x6699FF);
	registerEntity(EntityForisZertum.class, "ForisZertum", 4);
	registerEntityEgg(EntityForisZertum.class, 0xCCCCCC, 0x33CC33);
	registerEntity(EntityMetalZertum.class, "MetalZertum", 5);
	registerEntityEgg(EntityMetalZertum.class, 0xCCCCCC, 0x666699);
	registerEntity(EntityJakan.class, "Jakan", 30);
	registerEntityEgg(EntityJakan.class, 0x0033CC, 0x00CCFF);
	registerEntity(EntityKortor.class, "Kortor", 31);
	registerEntityEgg(EntityKortor.class, 0x6699FF, 0xD1E0FF);
	registerEntity(EntityRiggator.class, "Riggator", 32);
	registerEntityEgg(EntityRiggator.class, 0x1D302C, 0x671734);
}

public static void loadDarkCreatures() {
	registerEntity(EntityDarkZertum.class, "DarkZertum", 40);
	registerEntityEgg(EntityDarkZertum.class, 0xCCCCCC, 0x470047);
	registerEntity(EntityKurr.class, "Kurr", 41);
	registerEntityEgg(EntityKurr.class, 0xFF0000, 0x660000);
}

public static void loadSpawns() {
	addSpawn(EntityZertum.class, 100, 4, 5, EnumCreatureType.CREATURE, ModBiomes.bioZone, ModBiomes.nileSavanna, ModBiomes.nileSavannaPlateau, ModBiomes.nileSwampland, ModBiomes.pinkZone);
	addSpawn(EntityRedZertum.class, 100, 4, 5, EnumCreatureType.CREATURE, ModBiomes.redSeed);
	addSpawn(EntityDestroZertum.class, 100, 4, 5, EnumCreatureType.CREATURE, ModBiomes.destroZone, ModBiomes.destroZoneHills);
	addSpawn(EntityIceZertum.class, 100, 4, 5, EnumCreatureType.CREATURE, ModBiomes.blueTaiga, ModBiomes.blueTaigaHills, ModBiomes.blueColdTaiga, ModBiomes.blueColdTaigaHills);
	addSpawn(EntityForisZertum.class, 100, 4, 5, EnumCreatureType.CREATURE, ModBiomes.nileJungle, ModBiomes.nileJungleHills, ModBiomes.nileJungleEdge, ModBiomes.nileSwampland);
	addSpawn(EntityMetalZertum.class, 100, 4, 5, EnumCreatureType.CREATURE, ModBiomes.walRockland);
	addSpawn(EntityJakan.class, 100, 2, 3, EnumCreatureType.CREATURE, ModBiomes.walRockland);
	addSpawn(EntityKortor.class, 100, 2, 3, EnumCreatureType.CREATURE, ModBiomes.nileSavanna, ModBiomes.nileSavannaPlateau, ModBiomes.nileJungle, ModBiomes.nileJungleEdge, ModBiomes.nileJungleHills);
	addSpawn(EntityRiggator.class, 100, 2, 3, EnumCreatureType.MONSTER, ModBiomes.bioZone, ModBiomes.nileSwampland, ModBiomes.nileMesa, ModBiomes.nileMesaPlateau, ModBiomes.nileMesaPlateau_F);
}

public static void loadDarkSpawns() {
	addSpawn(EntityDarkZertum.class, 100, 4, 5, EnumCreatureType.CREATURE, ModBiomes.darkWasteland);
	addSpawn(EntityKurr.class, 100, 2, 3, EnumCreatureType.MONSTER, ModBiomes.darkWasteland);
}

public static void loadOthers() {
	registerTileEntity(TileEntityNileWorkbench.class, "Nile Worktable");
	registerTileEntity(TileEntityFoodBowl.class, "Food Bowl");
	registerProjectileEntity(EntityFlamingPoisonball.class, "FPoisonball", 400);
	registerProjectileEntity(EntityGrenade.class, "Grenade", 401);
	registerProjectileEntity(EntityIceball.class, "Iceball", 402);
}

public static void addSpawn(Class entityClass, int weightedProb, int min, int max, EnumCreatureType typeOfCreature, BiomeGenBase... biomes) {
	EntityRegistry.addSpawn(entityClass, weightedProb, min, max, typeOfCreature, biomes);
}

public static void registerEntity(Class entityClass, String saveName, int id) {
	EntityRegistry.registerModEntity(entityClass, saveName, id, ZeroQuest.instance, 120, 1, true);
}

public static void registerEntityEgg(Class<? extends Entity> entity, int main, int spots) {
	int id = getUniqueEntityId();
	EntityList.idToClassMapping.put(id, entity);
	EntityList.entityEggs.put(id, new EntityList.EntityEggInfo(id, main, spots));
}

public static void registerTileEntity(Class entityTileClass, String saveName) {
	GameRegistry.registerTileEntity(entityTileClass, saveName);
}

public static void registerProjectileEntity(Class entityClass, String saveName, int id) {
	EntityRegistry.registerModEntity(entityClass, saveName, id, ZeroQuest.instance, 128, 1, true);
}

public static int getUniqueEntityId() {
	do {
		startEntityId++;
	}
	while (EntityList.getStringFromID(startEntityId) != null);

	return startEntityId;
}
}

Main Developer and Owner of Zero Quest

Visit the Wiki for more information

If I helped anyone, please give me a applaud and a thank you!

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • They were already updated, and just to double check I even did a cleanup and fresh update from that same page. I'm quite sure drivers are not the problem here. 
    • i tried downloading the drivers but it says no AMD graphics hardware has been detected    
    • Update your AMD/ATI drivers - get the drivers from their website - do not update via system  
    • As the title says i keep on crashing on forge 1.20.1 even without any mods downloaded, i have the latest drivers (nvidia) and vanilla minecraft works perfectly fine for me logs: https://pastebin.com/5UR01yG9
    • Hello everyone, I'm making this post to seek help for my modded block, It's a special block called FrozenBlock supposed to take the place of an old block, then after a set amount of ticks, it's supposed to revert its Block State, Entity, data... to the old block like this :  The problem I have is that the system breaks when handling multi blocks (I tried some fix but none of them worked) :  The bug I have identified is that the function "setOldBlockFields" in the item's "setFrozenBlock" function gets called once for the 1st block of multiblock getting frozen (as it should), but gets called a second time BEFORE creating the first FrozenBlock with the data of the 1st block, hence giving the same data to the two FrozenBlock :   Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=head] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@73681674 BlockEntityData : id:"minecraft:bed",x:3,y:-60,z:-6} Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=3, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=2, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} here is the code inside my custom "freeze" item :    @Override     public @NotNull InteractionResult useOn(@NotNull UseOnContext pContext) {         if (!pContext.getLevel().isClientSide() && pContext.getHand() == InteractionHand.MAIN_HAND) {             BlockPos blockPos = pContext.getClickedPos();             BlockPos secondBlockPos = getMultiblockPos(blockPos, pContext.getLevel().getBlockState(blockPos));             if (secondBlockPos != null) {                 createFrozenBlock(pContext, secondBlockPos);             }             createFrozenBlock(pContext, blockPos);             return InteractionResult.SUCCESS;         }         return super.useOn(pContext);     }     public static void createFrozenBlock(UseOnContext pContext, BlockPos blockPos) {         BlockState oldState = pContext.getLevel().getBlockState(blockPos);         BlockEntity oldBlockEntity = oldState.hasBlockEntity() ? pContext.getLevel().getBlockEntity(blockPos) : null;         CompoundTag oldBlockEntityData = oldState.hasBlockEntity() ? oldBlockEntity.serializeNBT() : null;         if (oldBlockEntity != null) {             pContext.getLevel().removeBlockEntity(blockPos);         }         BlockState FrozenBlock = setFrozenBlock(oldState, oldBlockEntity, oldBlockEntityData);         pContext.getLevel().setBlockAndUpdate(blockPos, FrozenBlock);     }     public static BlockState setFrozenBlock(BlockState blockState, @Nullable BlockEntity blockEntity, @Nullable CompoundTag blockEntityData) {         BlockState FrozenBlock = BlockRegister.FROZEN_BLOCK.get().defaultBlockState();         ((FrozenBlock) FrozenBlock.getBlock()).setOldBlockFields(blockState, blockEntity, blockEntityData);         return FrozenBlock;     }  
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.