I didn't write this code, but I'm willing to learn how to fix and clean it up.
As for where the code is registered.
MinecraftForge.EVENT_BUS.register(new PlayerUnitPackage());
MinecraftForge.EVENT_BUS.register(new EntityUnitPackage());
MinecraftForge.EVENT_BUS.register(new DamageNumberPackage());
MinecraftForge.EVENT_BUS.register(new ParticlePackage());
MinecraftForge.EVENT_BUS.register(new WorldPackage());
MinecraftForge.EVENT_BUS.register(new PacketAnimation());
Network.registerMessage(PlayerUnitPackage.Handler.class, PlayerUnitPackage.class, 0,
Side.CLIENT);
Network.registerMessage(EntityUnitPackage.Handler.class, EntityUnitPackage.class, 1,
Side.CLIENT);
Network.registerMessage(DamageNumberPackage.Handler.class, DamageNumberPackage.class, 2,
Side.CLIENT);
Network.registerMessage(ParticlePackage.Handler.class, ParticlePackage.class, 3, Side.CLIENT);
Network.registerMessage(WorldPackage.Handler.class, WorldPackage.class, 4, Side.CLIENT);
Network.registerMessage(MessagePackage.Handler.class, MessagePackage.class, 5, Side.CLIENT);
@Mod.EventBusSubscriber
public class OnTrackEntity {
@SubscribeEvent
public static void onEntityTrack(PlayerEvent.StartTracking event) {
Entity entity = event.getTarget();
if (entity instanceof EntityLivingBase) {
if (entity.isEntityEqual(event.getEntityPlayer()) == false) {
if (entity.hasCapability(EntityData.Data, null)) {
Main.Network.sendTo(new EntityUnitPackage((EntityLivingBase) entity),
(EntityPlayerMP) event.getEntityPlayer());
}
}
}
}
}
/**
* @return checks if it should be synced to clients. Clients currently only see health and status
* effects
*/
private DirtyCheck getDirtyCheck() {
DirtyCheck check = new DirtyCheck();
check.hp = (int) MyStats.get(Health.GUID).Value;
return check;
}
public void RecalculateStats(EntityLivingBase entity, UnitData data, int level,
IWorldData world) {
data.setEquipsChanged(false);
if (data.getUnit() == null) {
data.setUnit(this, entity);
}
DirtyCheck old = getDirtyCheck();
Unit copy = this.Clone();
int tier = 0;
if (world != null) {
tier = world.getTier();
}
ClearStats();
MobRarity rar = Rarities.Mobs.get(data.getRarity());
float hpadded = this.getHpAdded(entity, rar, data);
MyStats.get(Health.GUID).Flat += hpadded;
if (entity instanceof EntityPlayer) {
List<GearItemData> gears = PlayerStatUtils.getEquipsExcludingWeapon(entity); // slow
boolean gearIsValid = this.isGearCombinationValid(gears, entity);
ItemStack weapon = entity.getHeldItemMainhand();
if (weapon != null) {
GearItemData wep = Gear.Load(weapon);
if (wep != null && wep.GetBaseGearType().slotType().equals(GearSlotType.Weapon))
gears.add(wep);
}
ItemStack offhand = entity.getHeldItemOffhand();
if (offhand != null) {
GearItemData off = Gear.Load(offhand);
if (off != null && off.GetBaseGearType().slotType().equals(GearSlotType.OffHand))
gears.add(off);
}
PlayerStatUtils.AddPlayerBaseStats(data, this);
if (gearIsValid) {
PlayerStatUtils.CountWornSets(entity, gears, this);
PlayerStatUtils.AddAllGearStats(entity, gears, this, level); // slow, but required
PlayerStatUtils.AddAllSetStats(entity, this, level);
}
} else {
MobStatUtils.AddMobcStats(data, data.getLevel(), entity);
MobStatUtils.AddMobTierStats(this, tier);
}
CommonStatUtils.AddStatusEffectStats(this, level);
CommonStatUtils.AddMapAffixStats(this, level);
PlayerStatUtils.CalcStatConversionsAndTransfers(copy, this);
PlayerStatUtils.CalcTraits(data);
CalcStats(data);
DirtyCheck newcheck = getDirtyCheck();
if (old.isDirty(newcheck)) {
Main.Network.sendToAllTracking(new EntityUnitPackage(entity, data), entity);
}
}