From dfb49341544cda3868c58834d39b87e97953b695 Mon Sep 17 00:00:00 2001 From: Tobias Nett Date: Wed, 25 Aug 2021 18:59:23 +0200 Subject: [PATCH] feature(ecs-gestalt): Migrate Components to gestalt's Components (#82) Ref: MovingBlocks/Terasology#4753 Co-authored-by: Michael Pollind --- .../org/terasology/combatSystem/Faction.java | 15 ++++++ .../terasology/combatSystem/FactionList.java | 8 --- ...etFactionList.java => PlanetFactions.java} | 5 +- .../components/FactionComponent.java | 17 ++++-- .../hurting/CritDamageComponent.java | 15 ++++-- .../hurting/HurtingComponent.java | 12 ++++- .../hurting/RandomDamageComponent.java | 19 +++++-- .../CollisionExceptionsComponent.java | 10 ++-- .../physics/components/FrictionComponent.java | 16 ++++-- .../physics/components/GravityComponent.java | 11 +++- .../physics/components/MassComponent.java | 13 ++++- .../combatSystem/systems/FactionSystem.java | 9 ++-- .../components/ActivateOnPlaceComponent.java | 10 ++-- .../components/BaseLauncherComponent.java | 19 +++++-- .../traps/components/BeaconComponent.java | 10 +++- .../traps/components/HomingComponent.java | 23 +++++--- .../traps/components/SwitchComponent.java | 10 ++-- .../systems/SwitchDoorHandlingSystem.java | 24 ++++----- .../traps/systems/TrapPlacingSystem.java | 54 +++++++++---------- .../components/ArrowComponent.java | 9 ++-- .../components/AttackerComponent.java | 29 ++++++---- .../components/BounceComponent.java | 21 +++++--- .../components/ExplodeComponent.java | 11 +++- .../components/ExplosionComponent.java | 19 ++++--- .../components/LaunchEntityComponent.java | 23 +++++--- .../components/LegacyShootComponent.java | 28 ++++------ .../components/MeleeComponent.java | 16 ++++-- .../components/ParentComponent.java | 11 ++-- .../components/PrimaryAttackComponent.java | 11 ++-- .../components/SecondaryAttackComponent.java | 12 +++-- .../components/StickComponent.java | 23 +++++--- .../components/WorldAvatarComponent.java | 10 +++- .../components/AddSwitchDoorsComponent.java | 23 ++++++-- 33 files changed, 371 insertions(+), 175 deletions(-) create mode 100644 src/main/java/org/terasology/combatSystem/Faction.java delete mode 100644 src/main/java/org/terasology/combatSystem/FactionList.java rename src/main/java/org/terasology/combatSystem/{PlanetFactionList.java => PlanetFactions.java} (68%) diff --git a/src/main/java/org/terasology/combatSystem/Faction.java b/src/main/java/org/terasology/combatSystem/Faction.java new file mode 100644 index 0000000..8073849 --- /dev/null +++ b/src/main/java/org/terasology/combatSystem/Faction.java @@ -0,0 +1,15 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 + +package org.terasology.combatSystem; + +/** + * Interface used to specify different types of faction lists. + *

+ * Classes implementing this interface should be immutable. This is to allow for a safe reuse when copying the faction in + * components. + */ +public interface Faction { + //NOTE: if we identify the need to make the faction implementations mutable, or observe any other issues with only doing a shallow copy + // of properties of this type in components, we may add a 'copy()' method to this interface. +} diff --git a/src/main/java/org/terasology/combatSystem/FactionList.java b/src/main/java/org/terasology/combatSystem/FactionList.java deleted file mode 100644 index b48180f..0000000 --- a/src/main/java/org/terasology/combatSystem/FactionList.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.terasology.combatSystem; - -/** - * Interface used to specify different types of faction lists. - */ -public interface FactionList { - -} diff --git a/src/main/java/org/terasology/combatSystem/PlanetFactionList.java b/src/main/java/org/terasology/combatSystem/PlanetFactions.java similarity index 68% rename from src/main/java/org/terasology/combatSystem/PlanetFactionList.java rename to src/main/java/org/terasology/combatSystem/PlanetFactions.java index 655c7f6..7e18697 100644 --- a/src/main/java/org/terasology/combatSystem/PlanetFactionList.java +++ b/src/main/java/org/terasology/combatSystem/PlanetFactions.java @@ -1,9 +1,12 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 + package org.terasology.combatSystem; /** * Basic test faction in CombatSystem module for implementation purpose. */ -public enum PlanetFactionList implements FactionList{ +public enum PlanetFactions implements Faction { MERCURY, VENUS, EARTH, diff --git a/src/main/java/org/terasology/combatSystem/components/FactionComponent.java b/src/main/java/org/terasology/combatSystem/components/FactionComponent.java index 9bcd0e5..628693d 100644 --- a/src/main/java/org/terasology/combatSystem/components/FactionComponent.java +++ b/src/main/java/org/terasology/combatSystem/components/FactionComponent.java @@ -1,15 +1,22 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 + package org.terasology.combatSystem.components; -import org.terasology.combatSystem.FactionList; -import org.terasology.combatSystem.PlanetFactionList; -import org.terasology.engine.entitySystem.Component; +import org.terasology.combatSystem.Faction; +import org.terasology.combatSystem.PlanetFactions; import org.terasology.engine.network.Replicate; +import org.terasology.gestalt.entitysystem.component.Component; /** * Makes the entity belong to a specific faction. */ -public class FactionComponent implements Component{ +public class FactionComponent implements Component { @Replicate - public FactionList faction = PlanetFactionList.EARTH; + public Faction faction = PlanetFactions.EARTH; + @Override + public void copyFrom(FactionComponent other) { + this.faction = other.faction; + } } diff --git a/src/main/java/org/terasology/combatSystem/hurting/CritDamageComponent.java b/src/main/java/org/terasology/combatSystem/hurting/CritDamageComponent.java index c37466e..21f080c 100644 --- a/src/main/java/org/terasology/combatSystem/hurting/CritDamageComponent.java +++ b/src/main/java/org/terasology/combatSystem/hurting/CritDamageComponent.java @@ -1,7 +1,9 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 package org.terasology.combatSystem.hurting; -import org.terasology.engine.entitySystem.Component; import org.terasology.engine.network.Replicate; +import org.terasology.gestalt.entitysystem.component.Component; /** * Damages an entity critically. @@ -9,12 +11,17 @@ * Damaging critically means multiplying the original damage by critFactor. * The critical damage has critChance/100 probability of occurring. */ -public class CritDamageComponent implements Component{ - +public class CritDamageComponent implements Component { + @Replicate public int critChance = 10; // in percentage out of 100 - + @Replicate public float critFactor = 2; // factor to multiply damage with + @Override + public void copyFrom(CritDamageComponent other) { + this.critChance = other.critChance; + this.critFactor = other.critFactor; + } } diff --git a/src/main/java/org/terasology/combatSystem/hurting/HurtingComponent.java b/src/main/java/org/terasology/combatSystem/hurting/HurtingComponent.java index 858272f..096a54c 100644 --- a/src/main/java/org/terasology/combatSystem/hurting/HurtingComponent.java +++ b/src/main/java/org/terasology/combatSystem/hurting/HurtingComponent.java @@ -1,16 +1,19 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 + package org.terasology.combatSystem.hurting; -import org.terasology.engine.entitySystem.Component; import org.terasology.engine.entitySystem.prefab.Prefab; import org.terasology.engine.logic.health.EngineDamageTypes; import org.terasology.engine.network.Replicate; +import org.terasology.gestalt.entitysystem.component.Component; /** * Specifies the amount and damage type that an entity will inflict on other entities. *

* {@link HurtEvent} is used to hurt other entity/entities. */ -public class HurtingComponent implements Component{ +public class HurtingComponent implements Component { /** * The amount of damage the entity will inflict. */ @@ -23,4 +26,9 @@ public class HurtingComponent implements Component{ @Replicate public Prefab damageType = EngineDamageTypes.DIRECT.get(); + @Override + public void copyFrom(HurtingComponent other) { + this.amount = other.amount; + this.damageType = other.damageType; + } } diff --git a/src/main/java/org/terasology/combatSystem/hurting/RandomDamageComponent.java b/src/main/java/org/terasology/combatSystem/hurting/RandomDamageComponent.java index 94faf50..d427d8a 100644 --- a/src/main/java/org/terasology/combatSystem/hurting/RandomDamageComponent.java +++ b/src/main/java/org/terasology/combatSystem/hurting/RandomDamageComponent.java @@ -1,18 +1,27 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 + package org.terasology.combatSystem.hurting; -import org.terasology.engine.entitySystem.Component; import org.terasology.engine.network.Replicate; +import org.terasology.gestalt.entitysystem.component.Component; /** * To generate a random damage amount between minDamage and maxDamage (both inclusive). */ -public class RandomDamageComponent implements Component{ - //inclusive +public class RandomDamageComponent implements Component { + + /** The minimal damage (inclusive). */ @Replicate public int minDamage = 2; - - //inclusive + + /** The maximum damage (inclusive). */ @Replicate public int maxDamage = 4; + @Override + public void copyFrom(RandomDamageComponent other) { + this.minDamage = other.minDamage; + this.maxDamage = other.maxDamage; + } } diff --git a/src/main/java/org/terasology/combatSystem/physics/components/CollisionExceptionsComponent.java b/src/main/java/org/terasology/combatSystem/physics/components/CollisionExceptionsComponent.java index 6c711bc..dc13cba 100644 --- a/src/main/java/org/terasology/combatSystem/physics/components/CollisionExceptionsComponent.java +++ b/src/main/java/org/terasology/combatSystem/physics/components/CollisionExceptionsComponent.java @@ -4,19 +4,23 @@ package org.terasology.combatSystem.physics.components; import com.google.common.collect.Lists; -import org.terasology.engine.entitySystem.Component; import org.terasology.engine.entitySystem.entity.EntityRef; import org.terasology.engine.network.Replicate; +import org.terasology.gestalt.entitysystem.component.Component; import java.util.List; /** * specifies the Entities that will not be collided with. *

- * An {@link EntityRef} with this {@link Component} will not collide with exceptions. + * An {@link EntityRef} with this {@link Component} will not collide with exceptions. */ -public class CollisionExceptionsComponent implements Component{ +public class CollisionExceptionsComponent implements Component { @Replicate public List exceptions = Lists.newArrayList(); + @Override + public void copyFrom(CollisionExceptionsComponent other) { + this.exceptions = Lists.newArrayList(other.exceptions); + } } diff --git a/src/main/java/org/terasology/combatSystem/physics/components/FrictionComponent.java b/src/main/java/org/terasology/combatSystem/physics/components/FrictionComponent.java index 99f582c..a10dee4 100644 --- a/src/main/java/org/terasology/combatSystem/physics/components/FrictionComponent.java +++ b/src/main/java/org/terasology/combatSystem/physics/components/FrictionComponent.java @@ -1,20 +1,28 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 + package org.terasology.combatSystem.physics.components; -import org.terasology.engine.entitySystem.Component; import org.terasology.engine.network.Replicate; +import org.terasology.gestalt.entitysystem.component.Component; /** * Adds friction. *

* this can be used to implement Fluid Viscosity as well. - * + * * TODO implement this component and its code. */ -public class FrictionComponent implements Component{ +public class FrictionComponent implements Component { @Replicate float friction = 20.0f; - + @Replicate float velocity = 20.0f; + @Override + public void copyFrom(FrictionComponent other) { + this.friction = other.friction; + this.velocity = other.velocity; + } } diff --git a/src/main/java/org/terasology/combatSystem/physics/components/GravityComponent.java b/src/main/java/org/terasology/combatSystem/physics/components/GravityComponent.java index c24054c..99cdd41 100644 --- a/src/main/java/org/terasology/combatSystem/physics/components/GravityComponent.java +++ b/src/main/java/org/terasology/combatSystem/physics/components/GravityComponent.java @@ -1,9 +1,12 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 + package org.terasology.combatSystem.physics.components; import org.joml.Vector3f; import org.terasology.combatSystem.physics.events.CombatForceEvent; -import org.terasology.engine.entitySystem.Component; import org.terasology.engine.network.Replicate; +import org.terasology.gestalt.entitysystem.component.Component; /** * Adds Gravity to the entity. @@ -12,8 +15,12 @@ * That would result in removal of those forces too if Gravity is disabled as a whole. * Instead use of {@link CombatForceEvent} is encouraged to add forces. */ -public class GravityComponent implements Component{ +public class GravityComponent implements Component { @Replicate public Vector3f gravityAccel = new Vector3f(0, -10.0f, 0); + @Override + public void copyFrom(GravityComponent other) { + this.gravityAccel.set(other.gravityAccel); + } } diff --git a/src/main/java/org/terasology/combatSystem/physics/components/MassComponent.java b/src/main/java/org/terasology/combatSystem/physics/components/MassComponent.java index 322eaaf..1826e3e 100644 --- a/src/main/java/org/terasology/combatSystem/physics/components/MassComponent.java +++ b/src/main/java/org/terasology/combatSystem/physics/components/MassComponent.java @@ -1,10 +1,12 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 package org.terasology.combatSystem.physics.components; import org.joml.Vector3f; -import org.terasology.engine.entitySystem.Component; import org.terasology.engine.network.Replicate; import org.terasology.engine.physics.components.RigidBodyComponent; import org.terasology.engine.physics.components.TriggerComponent; +import org.terasology.gestalt.entitysystem.component.Component; /** * Adds translational motion feature to an entity. @@ -12,7 +14,7 @@ * NOTE: It does not add collider like {@link RigidBodyComponent}. * {@link TriggerComponent} is used for collisions. */ -public class MassComponent implements Component{ +public class MassComponent implements Component { @Replicate(initialOnly = true) public float mass = 10.0f; @@ -23,4 +25,11 @@ public class MassComponent implements Component{ @Replicate public Vector3f force = new Vector3f(); + @Override + public void copyFrom(MassComponent other) { + this.velocity.set(other.velocity); + this.acceleration.set(other.acceleration); + this.force.set(other.force); + this.mass = other.mass; + } } diff --git a/src/main/java/org/terasology/combatSystem/systems/FactionSystem.java b/src/main/java/org/terasology/combatSystem/systems/FactionSystem.java index b307610..b076695 100644 --- a/src/main/java/org/terasology/combatSystem/systems/FactionSystem.java +++ b/src/main/java/org/terasology/combatSystem/systems/FactionSystem.java @@ -1,6 +1,9 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 + package org.terasology.combatSystem.systems; -import org.terasology.combatSystem.FactionList; +import org.terasology.combatSystem.Faction; import org.terasology.combatSystem.components.FactionComponent; import org.terasology.combatSystem.event.CombatEnteredEvent; import org.terasology.combatSystem.hurting.HurtEvent; @@ -21,8 +24,8 @@ public void combatEntered(HurtEvent event, EntityRef entity){ return; } - FactionList entityFaction = entity.getComponent(FactionComponent.class).faction; - FactionList otherEntityFaction = entity.getComponent(FactionComponent.class).faction; + Faction entityFaction = entity.getComponent(FactionComponent.class).faction; + Faction otherEntityFaction = entity.getComponent(FactionComponent.class).faction; if(entityFaction != otherEntityFaction){ entity.send(new CombatEnteredEvent()); otherEntity.send(new CombatEnteredEvent()); diff --git a/src/main/java/org/terasology/combatSystem/traps/components/ActivateOnPlaceComponent.java b/src/main/java/org/terasology/combatSystem/traps/components/ActivateOnPlaceComponent.java index 7abf906..4d24ebd 100644 --- a/src/main/java/org/terasology/combatSystem/traps/components/ActivateOnPlaceComponent.java +++ b/src/main/java/org/terasology/combatSystem/traps/components/ActivateOnPlaceComponent.java @@ -1,7 +1,11 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 package org.terasology.combatSystem.traps.components; -import org.terasology.engine.entitySystem.Component; +import org.terasology.gestalt.entitysystem.component.EmptyComponent; -public class ActivateOnPlaceComponent implements Component{ - +/** + * Marker component to indicate that the combat effect of an entity should activate when the entity is placed (as a block) in the world. + */ +public class ActivateOnPlaceComponent extends EmptyComponent { } diff --git a/src/main/java/org/terasology/combatSystem/traps/components/BaseLauncherComponent.java b/src/main/java/org/terasology/combatSystem/traps/components/BaseLauncherComponent.java index 1536c5a..28a887d 100644 --- a/src/main/java/org/terasology/combatSystem/traps/components/BaseLauncherComponent.java +++ b/src/main/java/org/terasology/combatSystem/traps/components/BaseLauncherComponent.java @@ -1,20 +1,29 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 package org.terasology.combatSystem.traps.components; -import org.terasology.engine.entitySystem.Component; import org.terasology.engine.entitySystem.prefab.Prefab; import org.terasology.engine.network.Replicate; +import org.terasology.gestalt.entitysystem.component.Component; -public class BaseLauncherComponent implements Component{ +public class BaseLauncherComponent implements Component { @Replicate public Prefab entityInBase; - + @Replicate public int amountOfEntityInBase; - + @Replicate public int coolDownTime = 1000; - + @Replicate public float lastLaunchTime = -1.0f; + @Override + public void copyFrom(BaseLauncherComponent other) { + this.entityInBase = other.entityInBase; + this.amountOfEntityInBase = other.amountOfEntityInBase; + this.coolDownTime = other.coolDownTime; + this.lastLaunchTime = other.lastLaunchTime; + } } diff --git a/src/main/java/org/terasology/combatSystem/traps/components/BeaconComponent.java b/src/main/java/org/terasology/combatSystem/traps/components/BeaconComponent.java index 5a7a07b..499bf55 100644 --- a/src/main/java/org/terasology/combatSystem/traps/components/BeaconComponent.java +++ b/src/main/java/org/terasology/combatSystem/traps/components/BeaconComponent.java @@ -1,11 +1,17 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 package org.terasology.combatSystem.traps.components; -import org.terasology.engine.entitySystem.Component; import org.terasology.engine.entitySystem.entity.EntityRef; import org.terasology.engine.network.Replicate; +import org.terasology.gestalt.entitysystem.component.Component; -public class BeaconComponent implements Component{ +public class BeaconComponent implements Component { @Replicate public EntityRef base = EntityRef.NULL; + @Override + public void copyFrom(BeaconComponent other) { + this.base = other.base; + } } diff --git a/src/main/java/org/terasology/combatSystem/traps/components/HomingComponent.java b/src/main/java/org/terasology/combatSystem/traps/components/HomingComponent.java index c938a2a..649b797 100644 --- a/src/main/java/org/terasology/combatSystem/traps/components/HomingComponent.java +++ b/src/main/java/org/terasology/combatSystem/traps/components/HomingComponent.java @@ -1,22 +1,33 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 package org.terasology.combatSystem.traps.components; -import org.terasology.engine.entitySystem.Component; import org.terasology.engine.entitySystem.entity.EntityRef; import org.terasology.engine.network.Replicate; +import org.terasology.gestalt.entitysystem.component.Component; -public class HomingComponent implements Component{ +public class HomingComponent implements Component { @Replicate public EntityRef target = EntityRef.NULL; - + @Replicate public int initialSleepTime = 500; - + @Replicate public int updationTime = 200; - + @Replicate public float lastUpdateTime = -1.0f; - + @Replicate public float launchedTime = -1.0f; + + @Override + public void copyFrom(HomingComponent other) { + this.target = other.target; + this.initialSleepTime = other.initialSleepTime; + this.updationTime = other.updationTime; + this.lastUpdateTime = other.lastUpdateTime; + this.launchedTime = other.launchedTime; + } } diff --git a/src/main/java/org/terasology/combatSystem/traps/components/SwitchComponent.java b/src/main/java/org/terasology/combatSystem/traps/components/SwitchComponent.java index 4e7bd87..18dc508 100644 --- a/src/main/java/org/terasology/combatSystem/traps/components/SwitchComponent.java +++ b/src/main/java/org/terasology/combatSystem/traps/components/SwitchComponent.java @@ -1,16 +1,20 @@ // Copyright 2021 The Terasology Foundation // SPDX-License-Identifier: Apache-2.0 - package org.terasology.combatSystem.traps.components; import com.google.common.collect.Lists; -import org.terasology.engine.entitySystem.Component; import org.terasology.engine.entitySystem.entity.EntityRef; import org.terasology.engine.world.block.ForceBlockActive; +import org.terasology.gestalt.entitysystem.component.Component; import java.util.List; @ForceBlockActive -public class SwitchComponent implements Component{ +public class SwitchComponent implements Component { public List doors = Lists.newArrayList(); + + @Override + public void copyFrom(SwitchComponent other) { + this.doors = Lists.newArrayList(other.doors); + } } diff --git a/src/main/java/org/terasology/combatSystem/traps/systems/SwitchDoorHandlingSystem.java b/src/main/java/org/terasology/combatSystem/traps/systems/SwitchDoorHandlingSystem.java index 5bc82a7..249e9c6 100644 --- a/src/main/java/org/terasology/combatSystem/traps/systems/SwitchDoorHandlingSystem.java +++ b/src/main/java/org/terasology/combatSystem/traps/systems/SwitchDoorHandlingSystem.java @@ -13,17 +13,17 @@ import org.terasology.engine.logic.health.EngineDamageTypes; @RegisterSystem -public class SwitchDoorHandlingSystem extends BaseComponentSystem{ +public class SwitchDoorHandlingSystem extends BaseComponentSystem { @ReceiveEvent(components = ParentComponent.class) - public void openDoor(OnActivatedComponent event, EntityRef entity){ + public void openDoor(OnActivatedComponent event, EntityRef entity) { SwitchComponent switchComp = entity.getComponent(SwitchComponent.class); - if(switchComp == null){ + if (switchComp == null) { return; } - for(EntityRef door : switchComp.doors){ - if(door == null || door == EntityRef.NULL || !door.exists()){ + for (EntityRef door : switchComp.doors) { + if (door == null || door == EntityRef.NULL || !door.exists()) { continue; } door.send(new DestroyEvent(entity, entity, EngineDamageTypes.DIRECT.get())); @@ -31,14 +31,14 @@ public void openDoor(OnActivatedComponent event, EntityRef entity){ } @ReceiveEvent(components = ParentComponent.class) - public void openDoor(OnChangedComponent event, EntityRef entity){ + public void openDoor(OnChangedComponent event, EntityRef entity) { SwitchComponent switchComp = entity.getComponent(SwitchComponent.class); - if(switchComp == null){ + if (switchComp == null) { return; } - for(EntityRef door : switchComp.doors){ - if(door == null || door == EntityRef.NULL || !door.exists()){ + for (EntityRef door : switchComp.doors) { + if (door == null || door == EntityRef.NULL || !door.exists()) { continue; } door.send(new DestroyEvent(entity, entity, EngineDamageTypes.DIRECT.get())); @@ -46,11 +46,11 @@ public void openDoor(OnChangedComponent event, EntityRef entity){ } @ReceiveEvent(components = SwitchComponent.class, priority = EventPriority.PRIORITY_HIGH) - public void openDoor(DestroyEvent event, EntityRef entity){ + public void openDoor(DestroyEvent event, EntityRef entity) { SwitchComponent switchComp = entity.getComponent(SwitchComponent.class); - for(EntityRef door : switchComp.doors){ - if(door == null || door == EntityRef.NULL || !door.exists()){ + for (EntityRef door : switchComp.doors) { + if (door == null || door == EntityRef.NULL || !door.exists()) { continue; } door.send(new DestroyEvent(entity, entity, EngineDamageTypes.DIRECT.get())); diff --git a/src/main/java/org/terasology/combatSystem/traps/systems/TrapPlacingSystem.java b/src/main/java/org/terasology/combatSystem/traps/systems/TrapPlacingSystem.java index 7a662c8..4620bfc 100644 --- a/src/main/java/org/terasology/combatSystem/traps/systems/TrapPlacingSystem.java +++ b/src/main/java/org/terasology/combatSystem/traps/systems/TrapPlacingSystem.java @@ -29,63 +29,62 @@ import java.util.List; @RegisterSystem -public class TrapPlacingSystem extends BaseComponentSystem{ +public class TrapPlacingSystem extends BaseComponentSystem { @In LocalPlayer player; - + @ReceiveEvent(components = {PhysicalSensorComponent.class, LocationComponent.class}) - public void activateOrDeactivateTrap(ActivateEvent event, EntityRef entity, PhysicalSensorComponent physical){ - if(!entity.hasComponent(AttackerComponent.class)){ + public void activateOrDeactivateTrap(ActivateEvent event, EntityRef entity, PhysicalSensorComponent physical) { + if (!entity.hasComponent(AttackerComponent.class)) { return; } - + EntityRef character = player.getCharacterEntity(); List allOwners = OwnerSpecific.getAllOwners(entity); - if(allOwners == null){ + if (allOwners == null) { return; } - - for(EntityRef attackerEntity : allOwners){ - if(attackerEntity.equals(character)){ - if(!physical.activated){ + + for (EntityRef attackerEntity : allOwners) { + if (attackerEntity.equals(character)) { + if (!physical.activated) { entity.send(new ActivateSensorEvent()); - } - else{ + } else { entity.send(new DeactivateSensorEvent()); } } } } - + @ReceiveEvent(components = {PhysicalSensorComponent.class}) - public void deactivateOnItemConversion(OnBlockToItem event, EntityRef entity, PhysicalSensorComponent physical){ - if(physical.activated){ + public void deactivateOnItemConversion(OnBlockToItem event, EntityRef entity, PhysicalSensorComponent physical) { + if (physical.activated) { entity.send(new DeactivateSensorEvent()); } } - + @ReceiveEvent(components = {ActivateOnPlaceComponent.class, BlockComponent.class}) - public void activateOnBlockConversion(OnActivatedComponent event, EntityRef entity){ + public void activateOnBlockConversion(OnActivatedComponent event, EntityRef entity) { entity.send(new ActivateSensorEvent()); } - + @ReceiveEvent(components = {VolumeSensorComponent.class, LocationComponent.class}, netFilter = RegisterMode.CLIENT, priority = EventPriority.PRIORITY_LOW) - public void addMeshForClient(ActivateSensorEvent event, EntityRef entity, PhysicalSensorComponent physical){ + public void addMeshForClient(ActivateSensorEvent event, EntityRef entity, PhysicalSensorComponent physical) { EntityRef sensor = physical.sensor; - - if(!entity.hasComponent(AttackerComponent.class)){ + + if (!entity.hasComponent(AttackerComponent.class)) { return; } - + EntityRef character = player.getCharacterEntity(); List allOwners = OwnerSpecific.getAllOwners(entity); - if(allOwners == null){ + if (allOwners == null) { return; } - - for(EntityRef attackerEntity : allOwners){ - if(attackerEntity.equals(character)){ - if(!sensor.hasComponent(MeshComponent.class)){ + + for (EntityRef attackerEntity : allOwners) { + if (attackerEntity.equals(character)) { + if (!sensor.hasComponent(MeshComponent.class)) { MeshComponent mesh = new MeshComponent(); mesh.translucent = true; mesh.material = Assets.getMaterial("CombatSystem:forceField").get(); @@ -95,5 +94,4 @@ public void addMeshForClient(ActivateSensorEvent event, EntityRef entity, Physic } } } - } diff --git a/src/main/java/org/terasology/combatSystem/weaponFeatures/components/ArrowComponent.java b/src/main/java/org/terasology/combatSystem/weaponFeatures/components/ArrowComponent.java index ddc1933..1054cc4 100644 --- a/src/main/java/org/terasology/combatSystem/weaponFeatures/components/ArrowComponent.java +++ b/src/main/java/org/terasology/combatSystem/weaponFeatures/components/ArrowComponent.java @@ -1,19 +1,22 @@ // Copyright 2021 The Terasology Foundation // SPDX-License-Identifier: Apache-2.0 - package org.terasology.combatSystem.weaponFeatures.components; import org.joml.Vector3f; -import org.terasology.engine.entitySystem.Component; import org.terasology.engine.network.Replicate; +import org.terasology.gestalt.entitysystem.component.Component; /** * the entity would traverse like an arrow. *

* The entity would always be facing tangent to its path. */ -public class ArrowComponent implements Component{ +public class ArrowComponent implements Component { @Replicate public Vector3f previousDir = new Vector3f(); + @Override + public void copyFrom(ArrowComponent other) { + this.previousDir.set(other.previousDir); + } } diff --git a/src/main/java/org/terasology/combatSystem/weaponFeatures/components/AttackerComponent.java b/src/main/java/org/terasology/combatSystem/weaponFeatures/components/AttackerComponent.java index fff5ab0..e169eef 100644 --- a/src/main/java/org/terasology/combatSystem/weaponFeatures/components/AttackerComponent.java +++ b/src/main/java/org/terasology/combatSystem/weaponFeatures/components/AttackerComponent.java @@ -1,36 +1,43 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 package org.terasology.combatSystem.weaponFeatures.components; import org.terasology.combatSystem.OwnerCollisionState; -import org.terasology.engine.entitySystem.Component; import org.terasology.engine.entitySystem.entity.EntityRef; import org.terasology.engine.network.Replicate; +import org.terasology.gestalt.entitysystem.component.Component; -public class AttackerComponent implements Component{ +public class AttackerComponent implements Component { @Replicate public EntityRef attacker = EntityRef.NULL; - + @Replicate public OwnerCollisionState state = OwnerCollisionState.ENABLED; public AttackerComponent(){ } - - public AttackerComponent(EntityRef shooter){ + + public AttackerComponent(EntityRef shooter) { this(shooter, null); } - - public AttackerComponent(OwnerCollisionState state){ + + public AttackerComponent(OwnerCollisionState state) { this(null, state); } - - public AttackerComponent(EntityRef shooter, OwnerCollisionState state){ - if(shooter != null){ + + public AttackerComponent(EntityRef shooter, OwnerCollisionState state) { + if (shooter != null) { this.attacker = shooter; } - if(state != null){ + if (state != null) { this.state = state; } } + @Override + public void copyFrom(AttackerComponent other) { + this.attacker = other.attacker; + this.state = other.state; + } } diff --git a/src/main/java/org/terasology/combatSystem/weaponFeatures/components/BounceComponent.java b/src/main/java/org/terasology/combatSystem/weaponFeatures/components/BounceComponent.java index ca7974e..e4b61bf 100644 --- a/src/main/java/org/terasology/combatSystem/weaponFeatures/components/BounceComponent.java +++ b/src/main/java/org/terasology/combatSystem/weaponFeatures/components/BounceComponent.java @@ -1,19 +1,28 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 package org.terasology.combatSystem.weaponFeatures.components; -import org.terasology.engine.entitySystem.Component; import org.terasology.engine.network.Replicate; +import org.terasology.gestalt.entitysystem.component.Component; -public class BounceComponent implements Component{ +public class BounceComponent implements Component { @Replicate public float bounceFactor = 0.5f; - + @Replicate - public int maxPierceAngle = 10; // in degrees - + public int maxPierceAngle = 10; // in degrees + @Replicate public float minPierceVelocity = 0.0f; - + @Replicate public float minBounceVelocity = 3.0f; + @Override + public void copyFrom(BounceComponent other) { + this.bounceFactor = other.bounceFactor; + this.maxPierceAngle = other.maxPierceAngle; + this.minPierceVelocity = other.minPierceVelocity; + this.minBounceVelocity = other.minBounceVelocity; + } } diff --git a/src/main/java/org/terasology/combatSystem/weaponFeatures/components/ExplodeComponent.java b/src/main/java/org/terasology/combatSystem/weaponFeatures/components/ExplodeComponent.java index 036779d..8285d70 100644 --- a/src/main/java/org/terasology/combatSystem/weaponFeatures/components/ExplodeComponent.java +++ b/src/main/java/org/terasology/combatSystem/weaponFeatures/components/ExplodeComponent.java @@ -1,8 +1,10 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 package org.terasology.combatSystem.weaponFeatures.components; -import org.terasology.engine.entitySystem.Component; import org.terasology.engine.entitySystem.prefab.Prefab; import org.terasology.engine.network.Replicate; +import org.terasology.gestalt.entitysystem.component.Component; /** * makes the entity explode into another entity. @@ -10,7 +12,12 @@ * the other entity may be defined in explosionPrefab or explosionEntity. * explosionEntity is given precedence over explosionPrefab if both are present. */ -public class ExplodeComponent implements Component{ +public class ExplodeComponent implements Component { @Replicate public Prefab explosionPrefab; + + @Override + public void copyFrom(ExplodeComponent other) { + this.explosionPrefab = other.explosionPrefab; + } } diff --git a/src/main/java/org/terasology/combatSystem/weaponFeatures/components/ExplosionComponent.java b/src/main/java/org/terasology/combatSystem/weaponFeatures/components/ExplosionComponent.java index b1979b5..8952ac4 100644 --- a/src/main/java/org/terasology/combatSystem/weaponFeatures/components/ExplosionComponent.java +++ b/src/main/java/org/terasology/combatSystem/weaponFeatures/components/ExplosionComponent.java @@ -1,29 +1,36 @@ // Copyright 2021 The Terasology Foundation // SPDX-License-Identifier: Apache-2.0 - package org.terasology.combatSystem.weaponFeatures.components; import com.google.common.collect.Lists; -import org.terasology.engine.entitySystem.Component; import org.terasology.engine.network.Replicate; import org.terasology.engine.physics.CollisionGroup; import org.terasology.engine.physics.StandardCollisionGroup; +import org.terasology.gestalt.entitysystem.component.Component; import java.util.List; -public class ExplosionComponent implements Component{ +public class ExplosionComponent implements Component { @Replicate public List collidesWith = Lists.newArrayList(StandardCollisionGroup.DEFAULT, StandardCollisionGroup.WORLD, StandardCollisionGroup.CHARACTER); - + @Replicate public float radius = 2.0f; - + @Replicate public float explosionStartTime = -1.0f; //sec @Replicate public float explosionDelayTime = 0.0f; //sec - + @Replicate public boolean explosionStarted = false; + @Override + public void copyFrom(ExplosionComponent other) { + this.collidesWith = Lists.newArrayList(other.collidesWith); + this.radius = other.radius; + this.explosionStartTime = other.explosionStartTime; + this.explosionDelayTime = other.explosionDelayTime; + this.explosionStarted = other.explosionStarted; + } } diff --git a/src/main/java/org/terasology/combatSystem/weaponFeatures/components/LaunchEntityComponent.java b/src/main/java/org/terasology/combatSystem/weaponFeatures/components/LaunchEntityComponent.java index 20fe26f..b637490 100644 --- a/src/main/java/org/terasology/combatSystem/weaponFeatures/components/LaunchEntityComponent.java +++ b/src/main/java/org/terasology/combatSystem/weaponFeatures/components/LaunchEntityComponent.java @@ -1,8 +1,10 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 package org.terasology.combatSystem.weaponFeatures.components; -import org.terasology.engine.entitySystem.Component; import org.terasology.engine.entitySystem.prefab.Prefab; import org.terasology.engine.network.Replicate; +import org.terasology.gestalt.entitysystem.component.Component; /** * makes the entity launch another entity. @@ -10,19 +12,28 @@ * the other entity may be defined in launchEntityPrefab or launchEntity. * launchEntity is given precedence over launchEntityPrefab if both are present. */ -public class LaunchEntityComponent implements Component{ +public class LaunchEntityComponent implements Component { @Replicate public Prefab launchEntityPrefab; - + @Replicate public int cooldownTime = 200; - + @Replicate public float launchTime = -1.0f; - + @Replicate public float impulse = 300.0f; - + @Replicate(initialOnly = true) public boolean primaryAttack = true; + + @Override + public void copyFrom(LaunchEntityComponent other) { + this.launchEntityPrefab = other.launchEntityPrefab; + this.cooldownTime = other.cooldownTime; + this.launchTime = other.launchTime; + this.impulse = other.impulse; + this.primaryAttack = other.primaryAttack; + } } diff --git a/src/main/java/org/terasology/combatSystem/weaponFeatures/components/LegacyShootComponent.java b/src/main/java/org/terasology/combatSystem/weaponFeatures/components/LegacyShootComponent.java index f3e9c9d..63fd181 100644 --- a/src/main/java/org/terasology/combatSystem/weaponFeatures/components/LegacyShootComponent.java +++ b/src/main/java/org/terasology/combatSystem/weaponFeatures/components/LegacyShootComponent.java @@ -1,25 +1,12 @@ -/* - * Copyright 2020 MovingBlocks - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 package org.terasology.combatSystem.weaponFeatures.components; -import org.terasology.engine.entitySystem.Component; import org.terasology.engine.entitySystem.prefab.Prefab; import org.terasology.engine.logic.health.EngineDamageTypes; +import org.terasology.gestalt.entitysystem.component.Component; -public class LegacyShootComponent implements Component { +public class LegacyShootComponent implements Component { /** * The max distance the arrow will fly. @@ -38,4 +25,11 @@ public class LegacyShootComponent implements Component { public Prefab damageType = EngineDamageTypes.PHYSICAL.get(); + @Override + public void copyFrom(LegacyShootComponent other) { + this.maxDistance = other.maxDistance; + this.damageAmount = other.damageAmount; + this.arrowsPerSecond = other.arrowsPerSecond; + this.damageType = other.damageType; + } } diff --git a/src/main/java/org/terasology/combatSystem/weaponFeatures/components/MeleeComponent.java b/src/main/java/org/terasology/combatSystem/weaponFeatures/components/MeleeComponent.java index f729376..33f22f4 100644 --- a/src/main/java/org/terasology/combatSystem/weaponFeatures/components/MeleeComponent.java +++ b/src/main/java/org/terasology/combatSystem/weaponFeatures/components/MeleeComponent.java @@ -1,13 +1,21 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 package org.terasology.combatSystem.weaponFeatures.components; -import org.terasology.engine.entitySystem.Component; import org.terasology.engine.network.Replicate; +import org.terasology.gestalt.entitysystem.component.Component; + +public class MeleeComponent implements Component { -public class MeleeComponent implements Component{ - @Replicate public float range = 2.0f; - + @Replicate(initialOnly = true) public boolean primaryAttack = false; + + @Override + public void copyFrom(MeleeComponent other) { + this.range = other.range; + this.primaryAttack = other.primaryAttack; + } } diff --git a/src/main/java/org/terasology/combatSystem/weaponFeatures/components/ParentComponent.java b/src/main/java/org/terasology/combatSystem/weaponFeatures/components/ParentComponent.java index e601799..66f49b4 100644 --- a/src/main/java/org/terasology/combatSystem/weaponFeatures/components/ParentComponent.java +++ b/src/main/java/org/terasology/combatSystem/weaponFeatures/components/ParentComponent.java @@ -1,21 +1,24 @@ // Copyright 2021 The Terasology Foundation // SPDX-License-Identifier: Apache-2.0 - package org.terasology.combatSystem.weaponFeatures.components; import com.google.common.collect.Lists; -import org.terasology.engine.entitySystem.Component; import org.terasology.engine.entitySystem.entity.EntityRef; import org.terasology.engine.network.Replicate; +import org.terasology.gestalt.entitysystem.component.Component; import java.util.List; -public class ParentComponent implements Component{ +public class ParentComponent implements Component { @Replicate public List children; - + public ParentComponent(){ children = Lists.newArrayList(); } + @Override + public void copyFrom(ParentComponent other) { + this.children = Lists.newArrayList(other.children); + } } diff --git a/src/main/java/org/terasology/combatSystem/weaponFeatures/components/PrimaryAttackComponent.java b/src/main/java/org/terasology/combatSystem/weaponFeatures/components/PrimaryAttackComponent.java index a7c058a..86b8b19 100644 --- a/src/main/java/org/terasology/combatSystem/weaponFeatures/components/PrimaryAttackComponent.java +++ b/src/main/java/org/terasology/combatSystem/weaponFeatures/components/PrimaryAttackComponent.java @@ -1,7 +1,12 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 package org.terasology.combatSystem.weaponFeatures.components; -import org.terasology.engine.entitySystem.Component; - -public class PrimaryAttackComponent implements Component{ +import org.terasology.gestalt.entitysystem.component.EmptyComponent; +/** + * Marker component to denote that a {@link org.terasology.combatSystem.weaponFeatures.events.PrimaryAttackEvent PrimaryAttackEvent} should + * be triggered when activating an entity with this component. + */ +public class PrimaryAttackComponent extends EmptyComponent { } diff --git a/src/main/java/org/terasology/combatSystem/weaponFeatures/components/SecondaryAttackComponent.java b/src/main/java/org/terasology/combatSystem/weaponFeatures/components/SecondaryAttackComponent.java index 5b67d20..47bfd85 100644 --- a/src/main/java/org/terasology/combatSystem/weaponFeatures/components/SecondaryAttackComponent.java +++ b/src/main/java/org/terasology/combatSystem/weaponFeatures/components/SecondaryAttackComponent.java @@ -1,7 +1,13 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 package org.terasology.combatSystem.weaponFeatures.components; -import org.terasology.engine.entitySystem.Component; - -public class SecondaryAttackComponent implements Component{ +import org.terasology.gestalt.entitysystem.component.EmptyComponent; +/** + * Marker component. + * + * NOTE: This component currently has no effect! + */ +public class SecondaryAttackComponent extends EmptyComponent { } diff --git a/src/main/java/org/terasology/combatSystem/weaponFeatures/components/StickComponent.java b/src/main/java/org/terasology/combatSystem/weaponFeatures/components/StickComponent.java index 58cc479..7c7a030 100644 --- a/src/main/java/org/terasology/combatSystem/weaponFeatures/components/StickComponent.java +++ b/src/main/java/org/terasology/combatSystem/weaponFeatures/components/StickComponent.java @@ -1,28 +1,37 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 package org.terasology.combatSystem.weaponFeatures.components; -import org.terasology.engine.entitySystem.Component; import org.terasology.engine.entitySystem.entity.EntityRef; import org.terasology.engine.network.Replicate; +import org.terasology.gestalt.entitysystem.component.Component; -public class StickComponent implements Component{ +public class StickComponent implements Component { @Replicate EntityRef target = EntityRef.NULL; - + @Replicate public float stickTime = -1; - + @Replicate public float totalStickingTime = -1; - + @Replicate public float pierceAmount = 1.0f; - + public void setTarget(EntityRef entity){ target = entity; } - + public EntityRef getTarget(){ return target; } + @Override + public void copyFrom(StickComponent other) { + this.target = other.target; + this.stickTime = other.stickTime; + this.totalStickingTime = other.totalStickingTime; + this.pierceAmount = other.pierceAmount; + } } diff --git a/src/main/java/org/terasology/combatSystem/weaponFeatures/components/WorldAvatarComponent.java b/src/main/java/org/terasology/combatSystem/weaponFeatures/components/WorldAvatarComponent.java index bf26cad..ad1cc64 100644 --- a/src/main/java/org/terasology/combatSystem/weaponFeatures/components/WorldAvatarComponent.java +++ b/src/main/java/org/terasology/combatSystem/weaponFeatures/components/WorldAvatarComponent.java @@ -1,14 +1,20 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 package org.terasology.combatSystem.weaponFeatures.components; -import org.terasology.engine.entitySystem.Component; import org.terasology.engine.entitySystem.prefab.Prefab; import org.terasology.engine.network.Replicate; +import org.terasology.gestalt.entitysystem.component.Component; /** * to be used specifically for items */ -public class WorldAvatarComponent implements Component{ +public class WorldAvatarComponent implements Component { @Replicate public Prefab worldAvatarPrefab; + @Override + public void copyFrom(WorldAvatarComponent other) { + this.worldAvatarPrefab = other.worldAvatarPrefab; + } } diff --git a/src/main/java/org/terasology/combatSystem/world/structures/components/AddSwitchDoorsComponent.java b/src/main/java/org/terasology/combatSystem/world/structures/components/AddSwitchDoorsComponent.java index bcbc860..1dee95d 100644 --- a/src/main/java/org/terasology/combatSystem/world/structures/components/AddSwitchDoorsComponent.java +++ b/src/main/java/org/terasology/combatSystem/world/structures/components/AddSwitchDoorsComponent.java @@ -3,21 +3,38 @@ package org.terasology.combatSystem.world.structures.components; +import com.google.common.collect.Lists; import org.joml.Vector3i; -import org.terasology.engine.entitySystem.Component; import org.terasology.engine.network.Replicate; +import org.terasology.gestalt.entitysystem.component.Component; import org.terasology.reflection.MappedContainer; import java.util.List; +import java.util.stream.Collectors; -public class AddSwitchDoorsComponent implements Component{ +public class AddSwitchDoorsComponent implements Component { @Replicate - public List doorsToSpawn; + public List doorsToSpawn = Lists.newArrayList(); + + @Override + public void copyFrom(AddSwitchDoorsComponent other) { + this.doorsToSpawn = other.doorsToSpawn.stream().map(DoorsToSpawn::copy).collect(Collectors.toList()); + } @MappedContainer public static class DoorsToSpawn { public Vector3i switchPos; public List doorsPos; + + /** + * Create a deep copy of this data class. + */ + DoorsToSpawn copy() { + DoorsToSpawn copy = new DoorsToSpawn(); + copy.switchPos = new Vector3i(this.switchPos); + copy.doorsPos = this.doorsPos.stream().map(Vector3i::new).collect(Collectors.toList()); + return copy; + } } }