Object.Abilities : components.Abilities::Abilities {
local:
	safe uint get_abilityCount() const;
	Ability@[] getAbilities() const;
	uint get_abilityTypes(int id) const;
	int findAbilityOfType(int type) const;

remote:
	async relocking void activateAbility(int id);
	async relocking void activateAbility(int id, vec3d point);
	async relocking void activateAbility(int id, Object@ target);
	
server:
	async relocking void activateAbilityFor(Empire& emp, int id);
	async relocking void activateAbilityFor(Empire& emp, int id, Object@ target);
	async relocking void activateAbilityFor(Empire& emp, int id, vec3d point);
	async relocking void activateAbilityTypeFor(Empire& emp, int type);
	async relocking void activateAbilityTypeFor(Empire& emp, int type, Object@ target);
	async relocking void activateAbilityTypeFor(Empire& emp, int type, vec3d point);
	
	void initAbilities(const Design@ fromDesign);
	void destroyAbilities();
	void abilityTick(double time);
	void abilityOwnerChange(Empire@ prevOwner, Empire@ newOwner)
	void setNeutralAbilities(bool value);
	void setAbilityDestroy(bool value);
	void setCooldownForType(int typeId, double cooldown);

	int addAbility(uint id);
	void createAbility(uint id);
	void removeAbility(int id);
	void disableAbility(int id);
	void enableAbility(int id);
	bool isChanneling(int id);

	bool isAbilityOnCooldown(int id);
	double getAbilityRange(int id, Object@ target);
	double getAbilityRange(int id, vec3d target);

//Networking
	void writeAbilities(Message& msg) const;
	bool writeAbilityDelta(Message& msg) const;

shadow:
	void readAbilities(Message& msg);
	void readAbilityDelta(Message& msg);
}
