well its kinda lot of code... actually i'm attaching the capabilities to every EntityLiving/EntityMinecart by catching the attachCapability event.
every capability has a wrapper around it which is able to attach/detach the capability. so i dont see any place to optimize here except of adding a wrapper around all capabilities so that i end up with one capability... but even those wrappers already used are annoying me
its just that multiplayer server hold tons of entities cached and i would like to keep my overhead at the possible minimum. And Capabilities would be a great Tool for me if i could just add/remove them on the fly to a entity.
@dieSieben07 also while you are reading this thread anyways, thanks for all the questions you answered before on the forums, that helped a lot to get started with modding minecraft
well thats one of my capabilities, the attaching/detaching is managed within the capability provider
public class authorityCapability implements ICapabilitySerializable<NBTBase> {
@CapabilityInject(IauthorityCapability.class)
public static Capability<IauthorityCapability> AUTHORITY = null;
private authorityProvider instance = null;
public static void register(){
CapabilityManager.INSTANCE.register(IauthorityCapability.class, new authorityStorage(), authorityProvider.class);
MinecraftForge.EVENT_BUS.register(new eventHandler());
capabilities.register(AUTHORITY);}
public authorityCapability(Entity e){
instance = new authorityProvider(e);
}
public boolean hasCapability(Capability<?> capability, @Nullable EnumFacing facing) {
return capability.equals(AUTHORITY);
}
@Nullable
public <T> T getCapability(Capability<T> capability, @Nullable EnumFacing facing) {
if(!capability.equals(AUTHORITY))
return null;
return AUTHORITY.<T> cast(instance);
}
@Override
public NBTBase serializeNBT(){
if(instance == null)
return new NBTTagCompound();
return AUTHORITY.getStorage().writeNBT(AUTHORITY, instance, null);
}
@Override
public void deserializeNBT(NBTBase nbt){
if(instance != null)
AUTHORITY.getStorage().readNBT(AUTHORITY, instance, null, nbt);
}
public static class eventHandler {
private static final ResourceLocation KEY = new ResourceLocation(OpenEntity.MODID, "authorityCapability");
@SubscribeEvent
public void StartTracking(PlayerEvent.StartTracking event){
if(!event.getTarget().hasCapability(AUTHORITY, null))
return;
if(!event.getTarget().getCapability(AUTHORITY, null).isAttached())
return;
event.getTarget().getCapability(AUTHORITY, null).syncToClient(event.getEntityPlayer());
}
@SubscribeEvent
public void attachCapability(AttachCapabilitiesEvent<Entity> event) {
Entity entity = event.getObject();
if (!giveCapToEntity(entity))
return;
if(entity.hasCapability(AUTHORITY, null))
return;
//Logger.getLogger(OpenEntity.MODID).info("adding cap INVENTORY " + entity.world.isRemote);
event.addCapability(KEY, new authorityCapability(entity));
}
@SubscribeEvent
public void onDeath(LivingDeathEvent event) {
if(event.getEntity().hasCapability(AUTHORITY, null))
event.getEntity().getCapability(AUTHORITY, null).detach(null);
}
public static boolean giveCapToEntity(Entity e){
if(e instanceof EntityCreature)
return true;
if(e instanceof EntityMinecart)
return true;
return false;
}
}
}