Thank you very much, I managed to do as you said, and guided by some github repositories
EDIT:
After trying the mod for a few moments, when it comes to killing an enemy, the game gives me an error "net.minecraft.crash.ReportedException: Exception ticking world"
Crash-Report:
---- Minecraft Crash Report ----
// My bad.
Time: 16/03/20 05:16 AM
Description: Exception ticking world
java.lang.IllegalStateException: Entity is already tracked!
at net.minecraft.world.server.ChunkManager.track(ChunkManager.java:948) ~[?:?] {re:classloading}
at net.minecraft.world.server.ServerChunkProvider.track(ServerChunkProvider.java:450) ~[?:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.world.server.ServerWorld.onEntityAdded(ServerWorld.java:1012) ~[?:?] {re:classloading}
at net.minecraft.world.server.ServerWorld.tick(ServerWorld.java:367) ~[?:?] {re:classloading}
at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:878) ~[?:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:813) ~[?:?] {re:classloading,pl:accesstransformer:B}
at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118) ~[?:?] {re:classloading,pl:runtimedistcleaner:A}
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:659) [?:?] {re:classloading,pl:accesstransformer:B}
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_211] {}
A detailed walkthrough of the error, its code path and all known details is as follows:
---------------------------------------------------------------------------------------
-- Head --
Thread: Server thread
Stacktrace:
at net.minecraft.world.server.ChunkManager.track(ChunkManager.java:948)
at net.minecraft.world.server.ServerChunkProvider.track(ServerChunkProvider.java:450)
at net.minecraft.world.server.ServerWorld.onEntityAdded(ServerWorld.java:1012)
at net.minecraft.world.server.ServerWorld.tick(ServerWorld.java:367)
-- Affected level --
Details:
All players: 1 total; [ServerPlayerEntity['Dev'/324, l='New World', x=53.94, y=74.00, z=5.63]]
Chunk stats: ServerChunkCache: 2342
Level dimension: DimensionType{minecraft:overworld}
Level name: New World
Level seed: -5162292807879311142
Level generator: ID 00 - default, ver 1. Features enabled: true
Level generator options: {}
Level spawn location: World: (0,73,-32), Chunk: (at 0,4,0 in 0,-2; contains blocks 0,0,-32 to 15,255,-17), Region: (0,-1; contains chunks 0,-32 to 31,-1, blocks 0,0,-512 to 511,255,-1)
Level time: 415 game time, 415 day time
Level storage version: 0x04ABD - Anvil
Level weather: Rain time: 140401 (now: false), thunder time: 124012 (now: false)
Level game mode: Game mode: creative (ID 1). Hardcore: false. Cheats: true
Stacktrace:
at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:878)
at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:813)
at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:659)
at java.lang.Thread.run(Thread.java:748)
-- System Details --
Details:
Minecraft Version: 1.15.1
Minecraft Version ID: 1.15.1
Operating System: Windows 10 (amd64) version 10.0
Java Version: 1.8.0_211, Oracle Corporation
Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
Memory: 472310040 bytes (450 MB) / 2244476928 bytes (2140 MB) up to 3782737920 bytes (3607 MB)
CPUs: 12
JVM Flags: 1 total; -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump
ModLauncher: 5.0.0-milestone.4+67+b1a340b
ModLauncher launch target: fmluserdevclient
ModLauncher naming: mcp
ModLauncher services:
/eventbus-2.0.0-milestone.1-service.jar eventbus PLUGINSERVICE
/forge-1.15.1-30.0.51_mapped_snapshot_20200225-1.15.1-launcher.jar object_holder_definalize PLUGINSERVICE
/forge-1.15.1-30.0.51_mapped_snapshot_20200225-1.15.1-launcher.jar runtime_enum_extender PLUGINSERVICE
/accesstransformers-2.0.0-milestone.1-shadowed.jar accesstransformer PLUGINSERVICE
/forge-1.15.1-30.0.51_mapped_snapshot_20200225-1.15.1-launcher.jar capability_inject_definalize PLUGINSERVICE
/forge-1.15.1-30.0.51_mapped_snapshot_20200225-1.15.1-launcher.jar runtimedistcleaner PLUGINSERVICE
/forge-1.15.1-30.0.51_mapped_snapshot_20200225-1.15.1-launcher.jar fml TRANSFORMATIONSERVICE
FML: 30.0
Forge: net.minecraftforge:30.0.51
FML Language Providers:
[email protected]
minecraft@1
Mod List:
client-extra.jar Minecraft {
[email protected] DONE}
forge-1.15.1-30.0.51_mapped_snapshot_20200225-1.15.1-recomp.jar Forge {
[email protected] DONE}
main randommobsize {
[email protected] DONE}
Player Count: 1 / 8; [ServerPlayerEntity['Dev'/324, l='New World', x=53.94, y=74.00, z=5.63]]
Data Packs: vanilla, mod:forge (incompatible), mod:randommobsize
Type: Integrated Server (map_client.txt)
Is Modded: Definitely; Client brand changed to 'forge'
ModEventSuscriber.java
package com.jenhde.randommobsize;
import com.jenhde.randommobsize.capabilities.SizeCapability;
import com.jenhde.randommobsize.capabilities.SizeStorage;
import com.jenhde.randommobsize.capabilities.instances.Size;
import com.jenhde.randommobsize.capabilities.interfaces.ISize;
import com.jenhde.randommobsize.network.SizePacketHandler;
import com.mojang.blaze3d.matrix.MatrixStack;
import net.minecraft.client.renderer.Vector3f;
import net.minecraft.client.renderer.entity.model.GiantModel;
import net.minecraft.entity.*;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.monster.CreeperEntity;
import net.minecraft.entity.monster.ZombieEntity;
import net.minecraft.entity.passive.CowEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.IntNBT;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.world.World;
import net.minecraft.world.storage.loot.IRandomRange;
import net.minecraftforge.client.event.RenderLivingEvent;
import net.minecraftforge.common.capabilities.CapabilityManager;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.event.AttachCapabilitiesEvent;
import net.minecraftforge.event.entity.EntityEvent;
import net.minecraftforge.event.entity.EntityJoinWorldEvent;
import net.minecraftforge.event.entity.living.LivingDropsEvent;
import net.minecraftforge.event.entity.living.LivingSpawnEvent;
import net.minecraftforge.event.entity.player.PlayerEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent;
import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL20;
import java.nio.FloatBuffer;
import java.util.Collection;
import java.util.Iterator;
import java.util.Random;
@EventBusSubscriber(modid = RandomMobSize.MODID)
public class ModEventSuscriber {
public static final Logger LOGGER = LogManager.getLogger(RandomMobSize.MODID);
public static final ResourceLocation SIZE_CAP = new ResourceLocation(RandomMobSize.MODID, "sizet");
public ModEventSuscriber(){
}
@SubscribeEvent
public static void entityJoinWorld(EntityJoinWorldEvent event){
float [] arrSizes = new float[]{0.2f,0.2f,0.5f,0.5f,1.0f,1.0f,1.0f,2.0f,2.0f,2.0f,3.0f,3.0f,4.0f};
int generatedFloat = 0 + (int)(Math.random() * (13 - 0));
float sizet = arrSizes[generatedFloat];
Entity ent = event.getEntity();
if(!event.getEntity().world.isRemote && ent instanceof MobEntity){
ent.getCapability(SizeCapability.CAPABILITY_SIZE, null).ifPresent(
cap -> {
cap.setSizet(sizet);
});
float Max_health_new = (float)((MobEntity) ent).getAttribute(SharedMonsterAttributes.MAX_HEALTH).getValue()*sizet;
((MobEntity) ent).getAttribute(SharedMonsterAttributes.MAX_HEALTH).setBaseValue(Max_health_new);
((MobEntity) ent).setHealth(Max_health_new);
LOGGER.debug("Max health");
LOGGER.debug(Max_health_new);
if(ent instanceof CreeperEntity){
int radiusExplode = 3;
if((int)sizet <= 1) radiusExplode = 1;
else radiusExplode = (int)sizet * 3;
LOGGER.debug("Creeper sized");
LOGGER.debug(radiusExplode);
CompoundNBT compound = new CompoundNBT();
compound.put("ExplosionRadius", IntNBT.valueOf(radiusExplode *3));
((CreeperEntity) ent).readAdditional(compound);
}
SizePacketHandler.sendToAllTracking(ent,sizet);
}
}
@SubscribeEvent
public static void entityStartTracking(PlayerEvent.StartTracking event){
Entity target = event.getTarget();
PlayerEntity player = event.getPlayer();
if(player instanceof ServerPlayerEntity && target instanceof MobEntity){
target.getCapability(SizeCapability.CAPABILITY_SIZE, null).ifPresent(
cap -> {
SizePacketHandler.sendToPlayer(event.getPlayer(),target,cap.getSizet());
});
}
}
@SubscribeEvent
public static void onDropMob(LivingDropsEvent event) {
if (!(event.getEntity() instanceof MobEntity)) return;
Entity ent = event.getEntity();
World world = ent.getEntityWorld();
ent.getCapability(SizeCapability.CAPABILITY_SIZE, null).ifPresent(
cap -> {
int dropsQ = (int)cap.getSizet();
Collection<ItemEntity> collection = event.getDrops();
Iterator<ItemEntity> iterator = collection.iterator();
while (iterator.hasNext()) {
ItemEntity Item = iterator.next();
Item.getItem().setCount(dropsQ*2);
world.addEntity(Item);
}
}
);
}
@SubscribeEvent
public static void preRenderLiving(RenderLivingEvent.Pre event){
Entity ent = event.getEntity();
if(ent instanceof MobEntity){
ent.getCapability(SizeCapability.CAPABILITY_SIZE, null).ifPresent(
cap -> {
float scalet = cap.getSizet();
double half_width = ent.getWidth()*scalet / 2;
double height = ent.getHeight()*scalet;
AxisAlignedBB new_BoundingBox = new AxisAlignedBB(
ent.getPosX() - half_width, ent.getPosY(), ent.getPosZ()- half_width,
ent.getPosX() + half_width, ent.getPosY() + (double) height, ent.getPosZ() + half_width);
ent.setBoundingBox(new_BoundingBox );
//double MAX_HEALTH = ((MobEntity) ent).getAttribute(SharedMonsterAttributes.MAX_HEALTH).getBaseValue();
//((MobEntity) ent).getAttribute(SharedMonsterAttributes.MAX_HEALTH).setBaseValue(MAX_HEALTH * scalet);
event.getMatrixStack().push();
event.getMatrixStack().scale(scalet,scalet,scalet);
}
);
}
}
@SubscribeEvent
public static void postRenderLiving(RenderLivingEvent.Post event){
Entity ent = event.getEntity();
if(event.getEntity() instanceof MobEntity){
event.getMatrixStack().pop();
}
}
@SubscribeEvent
public static void onCommonSetup(FMLCommonSetupEvent event) {
//Register our Capability
CapabilityManager.INSTANCE.register(ISize.class, new SizeStorage(), Size::new);
SizePacketHandler.register();
LOGGER.debug("COMMON SETUP");
}
@SubscribeEvent
public static void onAttachCapability(final AttachCapabilitiesEvent<Entity> event){
if (event.getCapabilities().containsKey(SIZE_CAP)) return;
if(!(event.getObject().getEntity() instanceof MobEntity)) return;
event.addCapability(SIZE_CAP,new SizeCapability());
LOGGER.debug("Added Capability");
}
}