From 7756f2daabb72974d179a6d2230b12fca5b684c9 Mon Sep 17 00:00:00 2001 From: Chris Sanders Date: Thu, 11 Sep 2014 11:43:21 -0500 Subject: [PATCH] Start planning out a Component system. Huge thanks to all the great discussion on http://forums.spongepowered.org/t/component-system-and-minecraft/76/39 Signed-off-by: Chris Sanders --- .../api/component/Component.java | 20 ++++++++++ .../api/component/ComponentHolder.java | 7 ++++ .../api/component/entity/EntityComponent.java | 10 +++++ .../component/entity/attribute/Health.java | 20 ++++++++++ .../api/component/system/ComponentSystem.java | 39 +++++++++++++++++++ .../system/TickableComponentSystem.java | 12 ++++++ .../org/spongepowered/api/entity/Entity.java | 5 ++- 7 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/spongepowered/api/component/Component.java create mode 100644 src/main/java/org/spongepowered/api/component/ComponentHolder.java create mode 100644 src/main/java/org/spongepowered/api/component/entity/EntityComponent.java create mode 100644 src/main/java/org/spongepowered/api/component/entity/attribute/Health.java create mode 100644 src/main/java/org/spongepowered/api/component/system/ComponentSystem.java create mode 100644 src/main/java/org/spongepowered/api/component/system/TickableComponentSystem.java diff --git a/src/main/java/org/spongepowered/api/component/Component.java b/src/main/java/org/spongepowered/api/component/Component.java new file mode 100644 index 00000000000..778463e2530 --- /dev/null +++ b/src/main/java/org/spongepowered/api/component/Component.java @@ -0,0 +1,20 @@ +package org.spongepowered.api.component; + +import org.spongepowered.api.Game; + +/** + * Represents a data holder for a {@link org.spongepowered.api.component.ComponentHolder}. + */ +public interface Component { + /** + * Returns the{@link org.spongepowered.api.component.ComponentHolder} holding this component. + * @return The holder + */ + H getHolder(); + + /** + * Gets the {@link org.spongepowered.api.Game} object. + * @return The game + */ + Game getGame(); +} diff --git a/src/main/java/org/spongepowered/api/component/ComponentHolder.java b/src/main/java/org/spongepowered/api/component/ComponentHolder.java new file mode 100644 index 00000000000..09526dcaae2 --- /dev/null +++ b/src/main/java/org/spongepowered/api/component/ComponentHolder.java @@ -0,0 +1,7 @@ +package org.spongepowered.api.component; + +/** + * Marks an object as holding {@link org.spongepowered.api.component.Component}s. + */ +public interface ComponentHolder { +} diff --git a/src/main/java/org/spongepowered/api/component/entity/EntityComponent.java b/src/main/java/org/spongepowered/api/component/entity/EntityComponent.java new file mode 100644 index 00000000000..a3c0928705c --- /dev/null +++ b/src/main/java/org/spongepowered/api/component/entity/EntityComponent.java @@ -0,0 +1,10 @@ +package org.spongepowered.api.component.entity; + +import org.spongepowered.api.component.Component; +import org.spongepowered.api.entity.Entity; + +/** + * Represents a {@link org.spongepowered.api.component.Component> attachable to {@link org.spongepowered.api.entity.Entity}s. + */ +public interface EntityComponent extends Component { +} diff --git a/src/main/java/org/spongepowered/api/component/entity/attribute/Health.java b/src/main/java/org/spongepowered/api/component/entity/attribute/Health.java new file mode 100644 index 00000000000..45197aff262 --- /dev/null +++ b/src/main/java/org/spongepowered/api/component/entity/attribute/Health.java @@ -0,0 +1,20 @@ +package org.spongepowered.api.component.entity.attribute; + +import org.spongepowered.api.component.entity.EntityComponent; + +/** + * Gives the attribute "health" to an {@link org.spongepowered.api.entity.Entity}. + */ +public interface Health extends EntityComponent { + /** + * Gets the value of the current health + * @return The value + */ + double getHealth(); + + /** + * Sets the value for the health + * @param value The value + */ + void setHealth(double value); +} diff --git a/src/main/java/org/spongepowered/api/component/system/ComponentSystem.java b/src/main/java/org/spongepowered/api/component/system/ComponentSystem.java new file mode 100644 index 00000000000..75362cd38bd --- /dev/null +++ b/src/main/java/org/spongepowered/api/component/system/ComponentSystem.java @@ -0,0 +1,39 @@ +package org.spongepowered.api.component.system; + +import org.spongepowered.api.component.Component; +import org.spongepowered.api.component.ComponentHolder; + +import javax.annotation.Nullable; + +/** + * Represents a relationship system of {@link org.spongepowered.api.component.ComponentHolder}s and their {@link org.spongepowered.api.component.Component}s. + */ +public interface ComponentSystem { + /** + * Registers a {@link org.spongepowered.api.component.ComponentHolder} and {@link org.spongepowered.api.component.Component} relationship in the system + * + * @param holder The holder + * @param component The component + * @return The component, for chaining + */ + public T register(ComponentHolder holder, T component); + + /** + * Gets a {@link org.spongepowered.api.component.Component} for the {@link org.spongepowered.api.component.ComponentHolder} in the system. + * + * @param holder The holder + * @param clazz The component class + * @return The component + */ + @Nullable + T get(ComponentHolder holder, Class clazz); + + /** + * Removes a {@link org.spongepowered.api.component.ComponentHolder} and {@link org.spongepowered.api.component.Component}'s relationship from the system. + * + * @param holder The holder + * @param clazz The component's class + * @return The component that was removed + */ + public T remove(ComponentHolder holder, Class clazz); +} diff --git a/src/main/java/org/spongepowered/api/component/system/TickableComponentSystem.java b/src/main/java/org/spongepowered/api/component/system/TickableComponentSystem.java new file mode 100644 index 00000000000..2184eda6abd --- /dev/null +++ b/src/main/java/org/spongepowered/api/component/system/TickableComponentSystem.java @@ -0,0 +1,12 @@ +package org.spongepowered.api.component.system; + +/** + * Represents a system where {@link org.spongepowered.api.component.Component}s are processed each implementation's tick. + */ +public interface TickableComponentSystem extends ComponentSystem { + /** + * Called by the implementation to "process" the system + * @param dt Time since last tick + */ + void tick(float dt); +} diff --git a/src/main/java/org/spongepowered/api/entity/Entity.java b/src/main/java/org/spongepowered/api/entity/Entity.java index 14a291f16e0..306c94eb968 100644 --- a/src/main/java/org/spongepowered/api/entity/Entity.java +++ b/src/main/java/org/spongepowered/api/entity/Entity.java @@ -23,9 +23,12 @@ */ package org.spongepowered.api.entity; +import org.spongepowered.api.component.ComponentHolder; +import org.spongepowered.api.component.entity.EntityComponent; + import java.util.UUID; -public interface Entity { +public interface Entity extends ComponentHolder { /** * Gets the unique ID for this entity