Skip to content

Commit

Permalink
Start planning out a Component system.
Browse files Browse the repository at this point in the history
Huge thanks to all the great discussion on
http://forums.spongepowered.org/t/component-system-and-minecraft/76/39

Signed-off-by: Chris Sanders <zidane@outlook.com>
  • Loading branch information
Chris Sanders committed Sep 11, 2014
1 parent 3668cdb commit 7756f2d
Show file tree
Hide file tree
Showing 7 changed files with 112 additions and 1 deletion.
20 changes: 20 additions & 0 deletions 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<H> {
/**
* 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();
}
@@ -0,0 +1,7 @@
package org.spongepowered.api.component;

/**
* Marks an object as holding {@link org.spongepowered.api.component.Component}s.
*/
public interface ComponentHolder<C> {
}
@@ -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<Entity> {
}
@@ -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);
}
@@ -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 extends Component> T register(ComponentHolder<? super T> 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 extends Component> T get(ComponentHolder<? super T> holder, Class<T> 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 extends Component> T remove(ComponentHolder<? super T> holder, Class<T> clazz);
}
@@ -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);
}
5 changes: 4 additions & 1 deletion src/main/java/org/spongepowered/api/entity/Entity.java
Expand Up @@ -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<EntityComponent> {

/**
* Gets the unique ID for this entity
Expand Down

0 comments on commit 7756f2d

Please sign in to comment.