From 4eda17e314794fec029bca578de13167a6a9a875 Mon Sep 17 00:00:00 2001 From: Michael Pollind Date: Sat, 2 Jan 2021 08:46:31 -0800 Subject: [PATCH] feat(JOML): cleanup and migrate to joml (#48) Co-authored-by: Tobias Nett --- .../regions/RegionBeingCreatedComponent.java | 72 +- .../regions/RegionLocationComponent.java | 66 +- .../internal/systems/ActionEventSystem.java | 10 +- .../ComponentEvaluation/EvaluationSystem.java | 6 +- .../internal/systems/ConvertEntitySystem.java | 536 +++++++------ .../systems/ConvertIntoEntitySystem.java | 362 +++++---- .../internal/systems/EntityTreeSystem.java | 732 +++++++++--------- .../systems/EventListeningSystem.java | 160 ++-- .../systems/HubToolRewriteSystem.java | 106 +-- .../internal/systems/RegionDisplaySystem.java | 16 +- .../internal/systems/RegionEventSystem.java | 191 +++-- .../internal/systems/RegionSystem.java | 8 +- .../internal/systems/RegionTreeSystem.java | 52 +- .../systems/ScenarioRootManagementSystem.java | 290 ++++--- .../internal/ui/EditRegionScreen.java | 9 +- 15 files changed, 1304 insertions(+), 1312 deletions(-) diff --git a/src/main/java/org/terasology/scenario/components/regions/RegionBeingCreatedComponent.java b/src/main/java/org/terasology/scenario/components/regions/RegionBeingCreatedComponent.java index 7b93a0d..0001046 100644 --- a/src/main/java/org/terasology/scenario/components/regions/RegionBeingCreatedComponent.java +++ b/src/main/java/org/terasology/scenario/components/regions/RegionBeingCreatedComponent.java @@ -1,36 +1,36 @@ -/* - * Copyright 2017 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. - */ -package org.terasology.scenario.components.regions; - -import org.terasology.entitySystem.Component; -import org.terasology.entitySystem.entity.EntityRef; -import org.terasology.math.geom.Vector3i; -import org.terasology.network.FieldReplicateType; -import org.terasology.network.Replicate; -import org.terasology.scenario.components.ScenarioComponent; - -/** - * Creation component for a Scenario argument entity, indicates that this region is currently being created - * - * Scenario region entities are detailed in {@link ScenarioComponent} - */ -public class RegionBeingCreatedComponent implements Component { - @Replicate(FieldReplicateType.SERVER_TO_CLIENT) - public Vector3i firstHit; - - @Replicate(FieldReplicateType.SERVER_TO_CLIENT) - public EntityRef creatingEntity; -} +/* + * Copyright 2017 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. + */ +package org.terasology.scenario.components.regions; + +import org.joml.Vector3i; +import org.terasology.entitySystem.Component; +import org.terasology.entitySystem.entity.EntityRef; +import org.terasology.network.FieldReplicateType; +import org.terasology.network.Replicate; +import org.terasology.scenario.components.ScenarioComponent; + +/** + * Creation component for a Scenario argument entity, indicates that this region is currently being created + * + * Scenario region entities are detailed in {@link ScenarioComponent} + */ +public class RegionBeingCreatedComponent implements Component { + @Replicate(FieldReplicateType.SERVER_TO_CLIENT) + public Vector3i firstHit; + + @Replicate(FieldReplicateType.SERVER_TO_CLIENT) + public EntityRef creatingEntity; +} diff --git a/src/main/java/org/terasology/scenario/components/regions/RegionLocationComponent.java b/src/main/java/org/terasology/scenario/components/regions/RegionLocationComponent.java index 76b0a07..4e8a80e 100644 --- a/src/main/java/org/terasology/scenario/components/regions/RegionLocationComponent.java +++ b/src/main/java/org/terasology/scenario/components/regions/RegionLocationComponent.java @@ -1,34 +1,32 @@ -/* - * Copyright 2017 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. - */ -package org.terasology.scenario.components.regions; - -import org.terasology.entitySystem.Component; -import org.terasology.math.Region3i; -import org.terasology.network.FieldReplicateType; -import org.terasology.network.Replicate; -import org.terasology.scenario.components.ScenarioComponent; -import org.terasology.scenario.internal.systems.RegionSystem; -import org.terasology.structureTemplates.components.ProtectedRegionsComponent; - -/** - * Creation component for a Scenario argument entity, contains the actual Region3i of the region - * - * Scenario region entities are detailed in {@link ScenarioComponent} - */ -public class RegionLocationComponent implements Component { - @Replicate(FieldReplicateType.SERVER_TO_CLIENT) - public Region3i region; -} +/* + * Copyright 2017 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. + */ +package org.terasology.scenario.components.regions; + +import org.terasology.entitySystem.Component; +import org.terasology.network.FieldReplicateType; +import org.terasology.network.Replicate; +import org.terasology.scenario.components.ScenarioComponent; +import org.terasology.world.block.BlockRegion; + +/** + * Creation component for a Scenario argument entity, contains the actual Region3i of the region + * + * Scenario region entities are detailed in {@link ScenarioComponent} + */ +public class RegionLocationComponent implements Component { + @Replicate(FieldReplicateType.SERVER_TO_CLIENT) + public BlockRegion region; +} diff --git a/src/main/java/org/terasology/scenario/internal/systems/ActionEventSystem.java b/src/main/java/org/terasology/scenario/internal/systems/ActionEventSystem.java index c5897b5..4905ed0 100644 --- a/src/main/java/org/terasology/scenario/internal/systems/ActionEventSystem.java +++ b/src/main/java/org/terasology/scenario/internal/systems/ActionEventSystem.java @@ -15,6 +15,7 @@ */ package org.terasology.scenario.internal.systems; +import org.joml.Vector3f; import org.slf4j.LoggerFactory; import org.terasology.assets.management.AssetManager; import org.terasology.entitySystem.entity.EntityManager; @@ -27,19 +28,18 @@ import org.terasology.logic.characters.CharacterTeleportEvent; import org.terasology.logic.chat.ChatMessageEvent; import org.terasology.logic.common.DisplayNameComponent; +import org.terasology.logic.health.EngineDamageTypes; import org.terasology.logic.health.event.DoDamageEvent; import org.terasology.logic.health.event.DoRestoreEvent; -import org.terasology.logic.health.EngineDamageTypes; import org.terasology.logic.inventory.InventoryComponent; import org.terasology.logic.inventory.InventoryManager; import org.terasology.logic.inventory.ItemComponent; import org.terasology.logic.inventory.events.GiveItemEvent; import org.terasology.math.JomlUtil; -import org.terasology.math.geom.Vector3f; import org.terasology.network.ClientComponent; import org.terasology.network.ColorComponent; -import org.terasology.registry.In; import org.terasology.nui.Color; +import org.terasology.registry.In; import org.terasology.scenario.components.ScenarioArgumentContainerComponent; import org.terasology.scenario.components.actions.ScenarioSecondaryDamageAmountComponent; import org.terasology.scenario.components.actions.ScenarioSecondaryGiveBlockComponent; @@ -186,9 +186,9 @@ public void onEventTriggerEvent(EventTriggerEvent event, EntityRef entity, Scena EvaluateRegionEvent regionEvaluateEvent = new EvaluateRegionEvent(event.informationEntity); variables.get("region1").send(regionEvaluateEvent); - Vector3f location = regionEvaluateEvent.getResult().getComponent(RegionLocationComponent.class).region.center(); + Vector3f location = regionEvaluateEvent.getResult().getComponent(RegionLocationComponent.class).region.center(new Vector3f()); - CharacterTeleportEvent teleportEvent = new CharacterTeleportEvent(JomlUtil.from(location)); + CharacterTeleportEvent teleportEvent = new CharacterTeleportEvent(location); ScenarioValuePlayerComponent.PlayerType playerType = variables.get("player").getComponent(ScenarioValuePlayerComponent.class).type; diff --git a/src/main/java/org/terasology/scenario/internal/systems/ComponentEvaluation/EvaluationSystem.java b/src/main/java/org/terasology/scenario/internal/systems/ComponentEvaluation/EvaluationSystem.java index 4d2d80b..f6d7648 100644 --- a/src/main/java/org/terasology/scenario/internal/systems/ComponentEvaluation/EvaluationSystem.java +++ b/src/main/java/org/terasology/scenario/internal/systems/ComponentEvaluation/EvaluationSystem.java @@ -15,6 +15,7 @@ */ package org.terasology.scenario.internal.systems.ComponentEvaluation; +import org.joml.Vector3f; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.terasology.entitySystem.entity.EntityRef; @@ -28,7 +29,6 @@ import org.terasology.logic.inventory.InventoryComponent; import org.terasology.logic.inventory.ItemComponent; import org.terasology.logic.location.LocationComponent; -import org.terasology.math.geom.Vector3f; import org.terasology.network.ClientComponent; import org.terasology.nui.FontColor; import org.terasology.registry.In; @@ -226,9 +226,9 @@ public void onEvaluatePlayerRegionComparison(ConditionalCheckEvent event, Entity EntityRef player = event.getPassedEntity().getComponent(InfoTriggeringEntityComponent.class).entity.getOwner().getComponent(ClientComponent.class).character; RegionLocationComponent regionComp = region.getComponent(RegionLocationComponent.class); - Vector3f loc = player.getComponent(LocationComponent.class).getWorldPosition(); + Vector3f loc = player.getComponent(LocationComponent.class).getWorldPosition(new Vector3f()); - event.setResult(regionComp.region.encompasses((int)loc.x, (int)loc.y, (int)loc.z)); + event.setResult(regionComp.region.contains((int) loc.x, (int) loc.y, (int) loc.z)); } @ReceiveEvent diff --git a/src/main/java/org/terasology/scenario/internal/systems/ConvertEntitySystem.java b/src/main/java/org/terasology/scenario/internal/systems/ConvertEntitySystem.java index bb11c52..c336c0e 100644 --- a/src/main/java/org/terasology/scenario/internal/systems/ConvertEntitySystem.java +++ b/src/main/java/org/terasology/scenario/internal/systems/ConvertEntitySystem.java @@ -1,269 +1,267 @@ -/* - * Copyright 2017 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. - */ -package org.terasology.scenario.internal.systems; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.terasology.entitySystem.entity.EntityRef; -import org.terasology.entitySystem.event.ReceiveEvent; -import org.terasology.entitySystem.systems.BaseComponentSystem; -import org.terasology.entitySystem.systems.RegisterMode; -import org.terasology.entitySystem.systems.RegisterSystem; -import org.terasology.network.NetworkComponent; -import org.terasology.scenario.components.ScenarioArgumentContainerComponent; -import org.terasology.scenario.components.actions.ScenarioSecondaryDamageAmountComponent; -import org.terasology.scenario.components.actions.ScenarioSecondaryGiveBlockComponent; -import org.terasology.scenario.components.actions.ScenarioSecondaryGiveItemComponent; -import org.terasology.scenario.components.actions.ScenarioSecondaryHealAmountComponent; -import org.terasology.scenario.components.actions.ScenarioSecondaryLogInfoComponent; -import org.terasology.scenario.components.actions.ScenarioSecondarySendChatComponent; -import org.terasology.scenario.components.actions.ScenarioSecondaryTakeBlockComponent; -import org.terasology.scenario.components.actions.ScenarioSecondaryTakeItemComponent; -import org.terasology.scenario.components.actions.ScenarioSecondaryTeleportComponent; -import org.terasology.scenario.components.conditionals.ScenarioSecondaryBlockCompareComponent; -import org.terasology.scenario.components.conditionals.ScenarioSecondaryIntCompareComponent; -import org.terasology.scenario.components.conditionals.ScenarioSecondaryPlayerRegionComponent; -import org.terasology.scenario.components.events.ScenarioSecondaryBlockDestroyComponent; -import org.terasology.scenario.components.events.ScenarioSecondaryEnterRegionComponent; -import org.terasology.scenario.components.events.ScenarioSecondaryLeaveRegionComponent; -import org.terasology.scenario.components.events.ScenarioSecondaryRespawnComponent; -import org.terasology.scenario.components.events.ScenarioSecondarySpawnComponent; -import org.terasology.scenario.components.information.ScenarioExpressionBlockCountComponent; -import org.terasology.scenario.components.information.ScenarioExpressionConcatStringComponent; -import org.terasology.scenario.components.information.ScenarioValueBlockUriComponent; -import org.terasology.scenario.components.information.ScenarioValueComparatorComponent; -import org.terasology.scenario.components.information.ScenarioValueIntegerComponent; -import org.terasology.scenario.components.information.ScenarioValueItemPrefabUriComponent; -import org.terasology.scenario.components.information.ScenarioValueRegionComponent; -import org.terasology.scenario.components.information.ScenarioValueStringComponent; -import org.terasology.scenario.components.information.ScenarioExpressionItemCountComponent; -import org.terasology.scenario.components.information.ScenarioValuePlayerComponent; -import org.terasology.scenario.components.information.ScenarioExpressionPlayerNameComponent; -import org.terasology.scenario.components.information.ScenarioExpressionRandomIntComponent; -import org.terasology.scenario.components.information.ScenarioExpressionRegionNameComponent; -import org.terasology.scenario.components.information.ScenarioValueTriggeringBlockComponent; -import org.terasology.scenario.components.information.ScenarioValueTriggeringRegionComponent; -import org.terasology.scenario.internal.events.ConvertScenarioEntityEvent; - -import java.util.Map; - -/** - * System that recursively takes a logic entity and develops a list of serialised strings that allow for recreation of the entity - * following the same order of the list(Makes sure that the list always goes down in in depth, not a skip of branches that would result in - * wanting to satisfy an entity that doesn't yet exist - */ -@RegisterSystem(RegisterMode.CLIENT) -public class ConvertEntitySystem extends BaseComponentSystem { - - /** - * Most entities will follow a similar method, but to leave the system open for future inclusions with new event/action/conditions - * it is designed with each specific component(the unique component of a logic prefab). All are based off the component that indicates what - * type an entity is. - * - * Follows a pattern of [PREFAB]prefabName{key name for entity argument}[VALUE]value of the component - */ - - - - private static final String PREFAB_MARKER = "[PREFAB]"; - private static final String VALUE_MARKER = "[VALUE]"; - - private Logger logger = LoggerFactory.getLogger(ConvertEntitySystem.class); - - /** - * Anything that has an argument container and is not a value would use this serialization - * @param event the ConvertScenarioEntityEvent that triggered the original call - * @param entity The entityRef that the call was sent to - */ - public void DefaultSerialize(ConvertScenarioEntityEvent event, EntityRef entity) { - event.getOutputList().add(event.getPrefix() + PREFAB_MARKER + entity.getParentPrefab().getName()); - - for (Map.Entry e : entity.getComponent(ScenarioArgumentContainerComponent.class).arguments.entrySet()) { - ConvertScenarioEntityEvent newEvent = new ConvertScenarioEntityEvent(event.getPrefix() + "{" + e.getKey() + "}"); - e.getValue().send(newEvent); - for (String s : newEvent.getOutputList()) { - event.getOutputList().add(s); - } - } - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioValueTriggeringRegionComponent component) { - event.getOutputList().add(event.getPrefix() + PREFAB_MARKER + entity.getParentPrefab().getName()); - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondarySendChatComponent component) { - DefaultSerialize(event, entity); - } - - - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioValueTriggeringBlockComponent component) { - event.getOutputList().add(event.getPrefix() + PREFAB_MARKER + entity.getParentPrefab().getName()); - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioExpressionRandomIntComponent component) { - DefaultSerialize(event, entity); - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioExpressionPlayerNameComponent component) { - DefaultSerialize(event, entity); - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioValueStringComponent component) { - event.getOutputList().add(event.getPrefix() + VALUE_MARKER + component.string); - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioValueRegionComponent component) { - if (component.regionEntity.getComponent(NetworkComponent.class).getNetworkId() == 0) { //No network component (local/single player, so can't/don't need to use network id) - event.getOutputList().add(event.getPrefix() + VALUE_MARKER + "x" + component.regionEntity.getId()); - } - else { - event.getOutputList().add(event.getPrefix() + VALUE_MARKER + component.regionEntity.getComponent(NetworkComponent.class).getNetworkId()); - } - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioValueItemPrefabUriComponent component) { - event.getOutputList().add(event.getPrefix() + VALUE_MARKER + component.prefabURI); - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioValueIntegerComponent component) { - event.getOutputList().add(event.getPrefix() + VALUE_MARKER + Integer.toString(component.value)); - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioValueComparatorComponent component) { - event.getOutputList().add(event.getPrefix() + VALUE_MARKER + component.compare.name()); - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioValueBlockUriComponent component) { - event.getOutputList().add(event.getPrefix() + VALUE_MARKER + component.block_uri); - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioValuePlayerComponent component) { - event.getOutputList().add(event.getPrefix() + VALUE_MARKER + component.type.name()); - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioExpressionRegionNameComponent component) { - DefaultSerialize(event, entity); - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondaryPlayerRegionComponent component) { - DefaultSerialize(event, entity); - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondarySpawnComponent component) { - event.getOutputList().add(event.getPrefix() + PREFAB_MARKER + entity.getParentPrefab().getName()); - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondaryRespawnComponent component) { - event.getOutputList().add(event.getPrefix() + PREFAB_MARKER + entity.getParentPrefab().getName()); - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondaryLeaveRegionComponent component) { - DefaultSerialize(event, entity); - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondaryEnterRegionComponent component) { - DefaultSerialize(event, entity); - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondaryBlockDestroyComponent component) { - event.getOutputList().add(event.getPrefix() + PREFAB_MARKER + entity.getParentPrefab().getName()); - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondaryLogInfoComponent component) { - DefaultSerialize(event, entity); - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioExpressionItemCountComponent component) { - DefaultSerialize(event, entity); - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondaryIntCompareComponent component) { - DefaultSerialize(event, entity); - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondaryGiveItemComponent component) { - DefaultSerialize(event, entity); - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondaryGiveBlockComponent component) { - DefaultSerialize(event, entity); - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioExpressionConcatStringComponent component) { - DefaultSerialize(event, entity); - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondaryTeleportComponent component) { - DefaultSerialize(event, entity); - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondaryBlockCompareComponent component) { - DefaultSerialize(event, entity); - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondaryTakeItemComponent component) { - DefaultSerialize(event, entity); - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondaryTakeBlockComponent component) { - DefaultSerialize(event, entity); - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondaryHealAmountComponent component) { - DefaultSerialize(event, entity); - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondaryDamageAmountComponent component) { - DefaultSerialize(event, entity); - } - - @ReceiveEvent - public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioExpressionBlockCountComponent component) { - DefaultSerialize(event, entity); - } -} +/* + * Copyright 2017 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. + */ +package org.terasology.scenario.internal.systems; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.terasology.entitySystem.entity.EntityRef; +import org.terasology.entitySystem.event.ReceiveEvent; +import org.terasology.entitySystem.systems.BaseComponentSystem; +import org.terasology.entitySystem.systems.RegisterMode; +import org.terasology.entitySystem.systems.RegisterSystem; +import org.terasology.network.NetworkComponent; +import org.terasology.scenario.components.ScenarioArgumentContainerComponent; +import org.terasology.scenario.components.actions.ScenarioSecondaryDamageAmountComponent; +import org.terasology.scenario.components.actions.ScenarioSecondaryGiveBlockComponent; +import org.terasology.scenario.components.actions.ScenarioSecondaryGiveItemComponent; +import org.terasology.scenario.components.actions.ScenarioSecondaryHealAmountComponent; +import org.terasology.scenario.components.actions.ScenarioSecondaryLogInfoComponent; +import org.terasology.scenario.components.actions.ScenarioSecondarySendChatComponent; +import org.terasology.scenario.components.actions.ScenarioSecondaryTakeBlockComponent; +import org.terasology.scenario.components.actions.ScenarioSecondaryTakeItemComponent; +import org.terasology.scenario.components.actions.ScenarioSecondaryTeleportComponent; +import org.terasology.scenario.components.conditionals.ScenarioSecondaryBlockCompareComponent; +import org.terasology.scenario.components.conditionals.ScenarioSecondaryIntCompareComponent; +import org.terasology.scenario.components.conditionals.ScenarioSecondaryPlayerRegionComponent; +import org.terasology.scenario.components.events.ScenarioSecondaryBlockDestroyComponent; +import org.terasology.scenario.components.events.ScenarioSecondaryEnterRegionComponent; +import org.terasology.scenario.components.events.ScenarioSecondaryLeaveRegionComponent; +import org.terasology.scenario.components.events.ScenarioSecondaryRespawnComponent; +import org.terasology.scenario.components.events.ScenarioSecondarySpawnComponent; +import org.terasology.scenario.components.information.ScenarioExpressionBlockCountComponent; +import org.terasology.scenario.components.information.ScenarioExpressionConcatStringComponent; +import org.terasology.scenario.components.information.ScenarioValueBlockUriComponent; +import org.terasology.scenario.components.information.ScenarioValueComparatorComponent; +import org.terasology.scenario.components.information.ScenarioValueIntegerComponent; +import org.terasology.scenario.components.information.ScenarioValueItemPrefabUriComponent; +import org.terasology.scenario.components.information.ScenarioValueRegionComponent; +import org.terasology.scenario.components.information.ScenarioValueStringComponent; +import org.terasology.scenario.components.information.ScenarioExpressionItemCountComponent; +import org.terasology.scenario.components.information.ScenarioValuePlayerComponent; +import org.terasology.scenario.components.information.ScenarioExpressionPlayerNameComponent; +import org.terasology.scenario.components.information.ScenarioExpressionRandomIntComponent; +import org.terasology.scenario.components.information.ScenarioExpressionRegionNameComponent; +import org.terasology.scenario.components.information.ScenarioValueTriggeringBlockComponent; +import org.terasology.scenario.components.information.ScenarioValueTriggeringRegionComponent; +import org.terasology.scenario.internal.events.ConvertScenarioEntityEvent; + +import java.util.Map; + +/** + * System that recursively takes a logic entity and develops a list of serialised strings that allow for recreation of the entity + * following the same order of the list(Makes sure that the list always goes down in in depth, not a skip of branches that would result in + * wanting to satisfy an entity that doesn't yet exist + */ +@RegisterSystem(RegisterMode.CLIENT) +public class ConvertEntitySystem extends BaseComponentSystem { + + /** + * Most entities will follow a similar method, but to leave the system open for future inclusions with new + * event/action/conditions it is designed with each specific component(the unique component of a logic prefab). All + * are based off the component that indicates what type an entity is. + *

+ * Follows a pattern of [PREFAB]prefabName{key name for entity argument}[VALUE]value of the component + */ + + + private static final String PREFAB_MARKER = "[PREFAB]"; + private static final String VALUE_MARKER = "[VALUE]"; + + private Logger logger = LoggerFactory.getLogger(ConvertEntitySystem.class); + + /** + * Anything that has an argument container and is not a value would use this serialization + * + * @param event the ConvertScenarioEntityEvent that triggered the original call + * @param entity The entityRef that the call was sent to + */ + public void defaultSerialize(ConvertScenarioEntityEvent event, EntityRef entity) { + event.getOutputList().add(event.getPrefix() + PREFAB_MARKER + entity.getParentPrefab().getName()); + + for (Map.Entry e : entity.getComponent(ScenarioArgumentContainerComponent.class).arguments.entrySet()) { + ConvertScenarioEntityEvent newEvent = new ConvertScenarioEntityEvent(event.getPrefix() + "{" + e.getKey() + "}"); + e.getValue().send(newEvent); + for (String s : newEvent.getOutputList()) { + event.getOutputList().add(s); + } + } + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioValueTriggeringRegionComponent component) { + event.getOutputList().add(event.getPrefix() + PREFAB_MARKER + entity.getParentPrefab().getName()); + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondarySendChatComponent component) { + defaultSerialize(event, entity); + } + + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioValueTriggeringBlockComponent component) { + event.getOutputList().add(event.getPrefix() + PREFAB_MARKER + entity.getParentPrefab().getName()); + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioExpressionRandomIntComponent component) { + defaultSerialize(event, entity); + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioExpressionPlayerNameComponent component) { + defaultSerialize(event, entity); + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioValueStringComponent component) { + event.getOutputList().add(event.getPrefix() + VALUE_MARKER + component.string); + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioValueRegionComponent component) { + if (component.regionEntity.getComponent(NetworkComponent.class).getNetworkId() == 0) { //No network component (local/single player, so can't/don't need to use network id) + event.getOutputList().add(event.getPrefix() + VALUE_MARKER + "x" + component.regionEntity.getId()); + } else { + event.getOutputList().add(event.getPrefix() + VALUE_MARKER + component.regionEntity.getComponent(NetworkComponent.class).getNetworkId()); + } + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioValueItemPrefabUriComponent component) { + event.getOutputList().add(event.getPrefix() + VALUE_MARKER + component.prefabURI); + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioValueIntegerComponent component) { + event.getOutputList().add(event.getPrefix() + VALUE_MARKER + Integer.toString(component.value)); + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioValueComparatorComponent component) { + event.getOutputList().add(event.getPrefix() + VALUE_MARKER + component.compare.name()); + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioValueBlockUriComponent component) { + event.getOutputList().add(event.getPrefix() + VALUE_MARKER + component.block_uri); + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioValuePlayerComponent component) { + event.getOutputList().add(event.getPrefix() + VALUE_MARKER + component.type.name()); + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioExpressionRegionNameComponent component) { + defaultSerialize(event, entity); + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondaryPlayerRegionComponent component) { + defaultSerialize(event, entity); + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondarySpawnComponent component) { + event.getOutputList().add(event.getPrefix() + PREFAB_MARKER + entity.getParentPrefab().getName()); + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondaryRespawnComponent component) { + event.getOutputList().add(event.getPrefix() + PREFAB_MARKER + entity.getParentPrefab().getName()); + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondaryLeaveRegionComponent component) { + defaultSerialize(event, entity); + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondaryEnterRegionComponent component) { + defaultSerialize(event, entity); + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondaryBlockDestroyComponent component) { + event.getOutputList().add(event.getPrefix() + PREFAB_MARKER + entity.getParentPrefab().getName()); + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondaryLogInfoComponent component) { + defaultSerialize(event, entity); + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioExpressionItemCountComponent component) { + defaultSerialize(event, entity); + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondaryIntCompareComponent component) { + defaultSerialize(event, entity); + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondaryGiveItemComponent component) { + defaultSerialize(event, entity); + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondaryGiveBlockComponent component) { + defaultSerialize(event, entity); + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioExpressionConcatStringComponent component) { + defaultSerialize(event, entity); + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondaryTeleportComponent component) { + defaultSerialize(event, entity); + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondaryBlockCompareComponent component) { + defaultSerialize(event, entity); + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondaryTakeItemComponent component) { + defaultSerialize(event, entity); + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondaryTakeBlockComponent component) { + defaultSerialize(event, entity); + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondaryHealAmountComponent component) { + defaultSerialize(event, entity); + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioSecondaryDamageAmountComponent component) { + defaultSerialize(event, entity); + } + + @ReceiveEvent + public void onConvertEntityEvent(ConvertScenarioEntityEvent event, EntityRef entity, ScenarioExpressionBlockCountComponent component) { + defaultSerialize(event, entity); + } +} diff --git a/src/main/java/org/terasology/scenario/internal/systems/ConvertIntoEntitySystem.java b/src/main/java/org/terasology/scenario/internal/systems/ConvertIntoEntitySystem.java index b427687..610f6bb 100644 --- a/src/main/java/org/terasology/scenario/internal/systems/ConvertIntoEntitySystem.java +++ b/src/main/java/org/terasology/scenario/internal/systems/ConvertIntoEntitySystem.java @@ -1,182 +1,180 @@ -/* - * Copyright 2017 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. - */ -package org.terasology.scenario.internal.systems; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.terasology.assets.management.AssetManager; -import org.terasology.entitySystem.entity.EntityManager; -import org.terasology.entitySystem.entity.EntityRef; -import org.terasology.entitySystem.event.ReceiveEvent; -import org.terasology.entitySystem.prefab.Prefab; -import org.terasology.entitySystem.systems.BaseComponentSystem; -import org.terasology.entitySystem.systems.RegisterMode; -import org.terasology.entitySystem.systems.RegisterSystem; -import org.terasology.network.NetworkComponent; -import org.terasology.registry.In; -import org.terasology.scenario.components.ScenarioHubToolUpdateComponent; -import org.terasology.scenario.components.ScenarioArgumentContainerComponent; -import org.terasology.scenario.components.information.ScenarioValueBlockUriComponent; -import org.terasology.scenario.components.information.ScenarioValueComparatorComponent; -import org.terasology.scenario.components.information.ScenarioValueIntegerComponent; -import org.terasology.scenario.components.information.ScenarioValueItemPrefabUriComponent; -import org.terasology.scenario.components.information.ScenarioValueRegionComponent; -import org.terasology.scenario.components.information.ScenarioValueStringComponent; -import org.terasology.scenario.components.information.ScenarioValuePlayerComponent; -import org.terasology.scenario.components.regions.RegionNameComponent; -import org.terasology.scenario.internal.events.ConvertIntoEntityConstantEvent; -import org.terasology.scenario.internal.events.ConvertIntoEntityEvent; -import org.terasology.scenario.internal.utilities.ArgumentParser; -import org.terasology.world.block.BlockManager; - -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * System that takes a list of strings generated by the ConvertEntitySystem in order to create an entity based on the strings - */ -@RegisterSystem(RegisterMode.AUTHORITY) -public class ConvertIntoEntitySystem extends BaseComponentSystem { - - /** - * Strings follow a pattern of [PREFAB]prefabName{key name for entity argument}[VALUE]value of the component - * - * Calls to entities that are argument entities that contain a value component are the leaves of the tree and therefore - * are evaluated for the value passed with the string - */ - - @In - EntityManager entityManager; - - @In - AssetManager assetManager; - - @In - BlockManager blockManager; - - @In - ArgumentParser argumentParser; - - private Logger logger = LoggerFactory.getLogger(ConvertIntoEntitySystem.class); - - private Pattern patternMain = Pattern.compile("\\[(.*?)\\]"); - private Pattern keyPattern = Pattern.compile("\\{(.*?)\\}"); - private static final String PREFAB_MARKER = "PREFAB"; - - - @ReceiveEvent - public void onConvertIntoEntityEvent(ConvertIntoEntityEvent event, EntityRef entity, ScenarioHubToolUpdateComponent component) { - List constructions = event.getConstructionStrings(); - //Finding the main prefab of the entity - Matcher matcher = patternMain.matcher(constructions.get(0)); - matcher.find(); - String prefabName = constructions.get(0).substring(matcher.end()); - EntityRef starterEntity = entityManager.create(assetManager.getAsset(prefabName, Prefab.class).get()); - argumentParser.parseDefaults(starterEntity); - constructions.remove(0); - - - for (String s : constructions) { - Matcher keyMatcher = keyPattern.matcher(s); - EntityRef previousEntity = starterEntity; - EntityRef currentEntity = starterEntity; - String lastKey = ""; - int lastIndex = 0; - while(keyMatcher.find()) { - String key = keyMatcher.group(1); - lastKey = key; - lastIndex = keyMatcher.end(); - previousEntity = currentEntity; - currentEntity = currentEntity.getComponent(ScenarioArgumentContainerComponent.class).arguments.get(key); - } - // At this point previousEntity is the second to last entity, current entity is the furthest depth entity - // lastKey is the key from the previous entity to the current entity and lastIndex is the index in the string - // that begins the last "segment" that isn't keyed(either a prefab or a value) - - Matcher matcherLast = patternMain.matcher(s); - matcherLast.find(lastIndex); - if (matcherLast.group(1).equals(PREFAB_MARKER)) { - String subPrefab = s.substring(matcherLast.end()); - EntityRef newEntity = entityManager.create(assetManager.getAsset(subPrefab, Prefab.class).get()); - argumentParser.parseDefaults(newEntity); - previousEntity.getComponent(ScenarioArgumentContainerComponent.class).arguments.put(lastKey, newEntity); - previousEntity.saveComponent(previousEntity.getComponent(ScenarioArgumentContainerComponent.class)); - } - else { - //Type doesn't actually matter because the entity will be set up to a constant value at the end and therefore - //Will be able to be detected by component - String value = s.substring(matcherLast.end()); - ConvertIntoEntityConstantEvent constEvent = new ConvertIntoEntityConstantEvent(value); - currentEntity.send(constEvent); - previousEntity.saveComponent(previousEntity.getComponent(ScenarioArgumentContainerComponent.class)); - } - } - - event.setReturnEntity(starterEntity); - } - - @ReceiveEvent - public void onConvertIntoEntityConstantEvent(ConvertIntoEntityConstantEvent event, EntityRef entity, ScenarioValueIntegerComponent component) { - component.value = Integer.parseInt(event.getValue()); - entity.saveComponent(component); - } - - @ReceiveEvent - public void onConvertIntoEntityConstantEvent(ConvertIntoEntityConstantEvent event, EntityRef entity, ScenarioValueBlockUriComponent component) { - component.block_uri = event.getValue(); - entity.saveComponent(component); - } - - @ReceiveEvent - public void onConvertIntoEntityConstantEvent(ConvertIntoEntityConstantEvent event, EntityRef entity, ScenarioValuePlayerComponent component) { - component.type = ScenarioValuePlayerComponent.PlayerType.valueOf(event.getValue()); - entity.saveComponent(component); - } - - @ReceiveEvent - public void onConvertIntoEntityConstantEvent(ConvertIntoEntityConstantEvent event, EntityRef entity, ScenarioValueStringComponent component) { - component.string = event.getValue(); - entity.saveComponent(component); - } - - @ReceiveEvent - public void onConvertIntoEntityConstantEvent(ConvertIntoEntityConstantEvent event, EntityRef entity, ScenarioValueItemPrefabUriComponent component) { - component.prefabURI = event.getValue(); - entity.saveComponent(component); - } - - @ReceiveEvent - public void onConvertIntoEntityConstantEvent(ConvertIntoEntityConstantEvent event, EntityRef entity, ScenarioValueComparatorComponent component) { - component.compare = ScenarioValueComparatorComponent.comparison.valueOf(event.getValue()); - entity.saveComponent(component); - } - - @ReceiveEvent - public void onConvertIntoEntityConstantEvent(ConvertIntoEntityConstantEvent event, EntityRef entity, ScenarioValueRegionComponent component) { - if (event.getValue().substring(0,1).equals("x")) { //No network component - component.regionEntity = entityManager.getEntity(Integer.parseInt(event.getValue().substring(1))); - } - else { - for (EntityRef e : entityManager.getEntitiesWith(RegionNameComponent.class)) { - if (e.getComponent(NetworkComponent.class).getNetworkId() == Integer.parseInt(event.getValue())) { - component.regionEntity = e; - } - } - } - entity.saveComponent(component); - } -} +/* + * Copyright 2017 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. + */ +package org.terasology.scenario.internal.systems; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.terasology.assets.management.AssetManager; +import org.terasology.entitySystem.entity.EntityManager; +import org.terasology.entitySystem.entity.EntityRef; +import org.terasology.entitySystem.event.ReceiveEvent; +import org.terasology.entitySystem.prefab.Prefab; +import org.terasology.entitySystem.systems.BaseComponentSystem; +import org.terasology.entitySystem.systems.RegisterMode; +import org.terasology.entitySystem.systems.RegisterSystem; +import org.terasology.network.NetworkComponent; +import org.terasology.registry.In; +import org.terasology.scenario.components.ScenarioHubToolUpdateComponent; +import org.terasology.scenario.components.ScenarioArgumentContainerComponent; +import org.terasology.scenario.components.information.ScenarioValueBlockUriComponent; +import org.terasology.scenario.components.information.ScenarioValueComparatorComponent; +import org.terasology.scenario.components.information.ScenarioValueIntegerComponent; +import org.terasology.scenario.components.information.ScenarioValueItemPrefabUriComponent; +import org.terasology.scenario.components.information.ScenarioValueRegionComponent; +import org.terasology.scenario.components.information.ScenarioValueStringComponent; +import org.terasology.scenario.components.information.ScenarioValuePlayerComponent; +import org.terasology.scenario.components.regions.RegionNameComponent; +import org.terasology.scenario.internal.events.ConvertIntoEntityConstantEvent; +import org.terasology.scenario.internal.events.ConvertIntoEntityEvent; +import org.terasology.scenario.internal.utilities.ArgumentParser; +import org.terasology.world.block.BlockManager; + +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * System that takes a list of strings generated by the ConvertEntitySystem in order to create an entity based on the strings + */ +@RegisterSystem(RegisterMode.AUTHORITY) +public class ConvertIntoEntitySystem extends BaseComponentSystem { + + /** + * Strings follow a pattern of [PREFAB]prefabName{key name for entity argument}[VALUE]value of the component + *

+ * Calls to entities that are argument entities that contain a value component are the leaves of the tree and + * therefore are evaluated for the value passed with the string + */ + + @In + EntityManager entityManager; + + @In + AssetManager assetManager; + + @In + BlockManager blockManager; + + @In + ArgumentParser argumentParser; + + private Logger logger = LoggerFactory.getLogger(ConvertIntoEntitySystem.class); + + private Pattern patternMain = Pattern.compile("\\[(.*?)\\]"); + private Pattern keyPattern = Pattern.compile("\\{(.*?)\\}"); + private static final String PREFAB_MARKER = "PREFAB"; + + + @ReceiveEvent + public void onConvertIntoEntityEvent(ConvertIntoEntityEvent event, EntityRef entity, ScenarioHubToolUpdateComponent component) { + List constructions = event.getConstructionStrings(); + //Finding the main prefab of the entity + Matcher matcher = patternMain.matcher(constructions.get(0)); + matcher.find(); + String prefabName = constructions.get(0).substring(matcher.end()); + EntityRef starterEntity = entityManager.create(assetManager.getAsset(prefabName, Prefab.class).get()); + argumentParser.parseDefaults(starterEntity); + constructions.remove(0); + + + for (String s : constructions) { + Matcher keyMatcher = keyPattern.matcher(s); + EntityRef previousEntity = starterEntity; + EntityRef currentEntity = starterEntity; + String lastKey = ""; + int lastIndex = 0; + while (keyMatcher.find()) { + String key = keyMatcher.group(1); + lastKey = key; + lastIndex = keyMatcher.end(); + previousEntity = currentEntity; + currentEntity = currentEntity.getComponent(ScenarioArgumentContainerComponent.class).arguments.get(key); + } + // At this point previousEntity is the second to last entity, current entity is the furthest depth entity + // lastKey is the key from the previous entity to the current entity and lastIndex is the index in the string + // that begins the last "segment" that isn't keyed(either a prefab or a value) + + Matcher matcherLast = patternMain.matcher(s); + matcherLast.find(lastIndex); + if (matcherLast.group(1).equals(PREFAB_MARKER)) { + String subPrefab = s.substring(matcherLast.end()); + EntityRef newEntity = entityManager.create(assetManager.getAsset(subPrefab, Prefab.class).get()); + argumentParser.parseDefaults(newEntity); + previousEntity.getComponent(ScenarioArgumentContainerComponent.class).arguments.put(lastKey, newEntity); + previousEntity.saveComponent(previousEntity.getComponent(ScenarioArgumentContainerComponent.class)); + } else { + //Type doesn't actually matter because the entity will be set up to a constant value at the end and therefore + //Will be able to be detected by component + String value = s.substring(matcherLast.end()); + ConvertIntoEntityConstantEvent constEvent = new ConvertIntoEntityConstantEvent(value); + currentEntity.send(constEvent); + previousEntity.saveComponent(previousEntity.getComponent(ScenarioArgumentContainerComponent.class)); + } + } + + event.setReturnEntity(starterEntity); + } + + @ReceiveEvent + public void onConvertIntoEntityConstantEvent(ConvertIntoEntityConstantEvent event, EntityRef entity, ScenarioValueIntegerComponent component) { + component.value = Integer.parseInt(event.getValue()); + entity.saveComponent(component); + } + + @ReceiveEvent + public void onConvertIntoEntityConstantEvent(ConvertIntoEntityConstantEvent event, EntityRef entity, ScenarioValueBlockUriComponent component) { + component.block_uri = event.getValue(); + entity.saveComponent(component); + } + + @ReceiveEvent + public void onConvertIntoEntityConstantEvent(ConvertIntoEntityConstantEvent event, EntityRef entity, ScenarioValuePlayerComponent component) { + component.type = ScenarioValuePlayerComponent.PlayerType.valueOf(event.getValue()); + entity.saveComponent(component); + } + + @ReceiveEvent + public void onConvertIntoEntityConstantEvent(ConvertIntoEntityConstantEvent event, EntityRef entity, ScenarioValueStringComponent component) { + component.string = event.getValue(); + entity.saveComponent(component); + } + + @ReceiveEvent + public void onConvertIntoEntityConstantEvent(ConvertIntoEntityConstantEvent event, EntityRef entity, ScenarioValueItemPrefabUriComponent component) { + component.prefabURI = event.getValue(); + entity.saveComponent(component); + } + + @ReceiveEvent + public void onConvertIntoEntityConstantEvent(ConvertIntoEntityConstantEvent event, EntityRef entity, ScenarioValueComparatorComponent component) { + component.compare = ScenarioValueComparatorComponent.comparison.valueOf(event.getValue()); + entity.saveComponent(component); + } + + @ReceiveEvent + public void onConvertIntoEntityConstantEvent(ConvertIntoEntityConstantEvent event, EntityRef entity, ScenarioValueRegionComponent component) { + if (event.getValue().substring(0, 1).equals("x")) { //No network component + component.regionEntity = entityManager.getEntity(Integer.parseInt(event.getValue().substring(1))); + } else { + for (EntityRef e : entityManager.getEntitiesWith(RegionNameComponent.class)) { + if (e.getComponent(NetworkComponent.class).getNetworkId() == Integer.parseInt(event.getValue())) { + component.regionEntity = e; + } + } + } + entity.saveComponent(component); + } +} diff --git a/src/main/java/org/terasology/scenario/internal/systems/EntityTreeSystem.java b/src/main/java/org/terasology/scenario/internal/systems/EntityTreeSystem.java index dd8d230..5e7f521 100644 --- a/src/main/java/org/terasology/scenario/internal/systems/EntityTreeSystem.java +++ b/src/main/java/org/terasology/scenario/internal/systems/EntityTreeSystem.java @@ -1,371 +1,361 @@ -/* - * Copyright 2017 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. - */ -package org.terasology.scenario.internal.systems; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.terasology.assets.management.AssetManager; -import org.terasology.entitySystem.entity.EntityManager; -import org.terasology.entitySystem.entity.EntityRef; -import org.terasology.entitySystem.event.ReceiveEvent; -import org.terasology.entitySystem.prefab.Prefab; -import org.terasology.entitySystem.systems.BaseComponentSystem; -import org.terasology.entitySystem.systems.RegisterMode; -import org.terasology.entitySystem.systems.RegisterSystem; -import org.terasology.registry.In; -import org.terasology.scenario.components.HubToolExpansionComponent; -import org.terasology.scenario.components.ScenarioComponent; -import org.terasology.scenario.components.ScenarioHubToolUpdateComponent; -import org.terasology.scenario.components.TriggerActionListComponent; -import org.terasology.scenario.components.TriggerConditionListComponent; -import org.terasology.scenario.components.TriggerEventListComponent; -import org.terasology.scenario.components.TriggerNameComponent; -import org.terasology.scenario.components.actions.ScenarioIndicatorActionComponent; -import org.terasology.scenario.components.conditionals.ScenarioIndicatorConditionalComponent; -import org.terasology.scenario.components.events.ScenarioIndicatorEventComponent; -import org.terasology.scenario.internal.events.ConvertIntoEntityEvent; -import org.terasology.scenario.internal.events.HubtoolRewriteLogicEvent; -import org.terasology.scenario.internal.events.LogicTreeAddActionEvent; -import org.terasology.scenario.internal.events.LogicTreeAddConditionEvent; -import org.terasology.scenario.internal.events.LogicTreeAddEventEvent; -import org.terasology.scenario.internal.events.LogicTreeAddTriggerEvent; -import org.terasology.scenario.internal.events.LogicTreeDeleteEvent; -import org.terasology.scenario.internal.events.LogicTreeMoveEntityEvent; -import org.terasology.scenario.internal.events.ReplaceEntityFromConstructionStringsEvent; -import org.terasology.scenario.internal.utilities.ArgumentParser; -import org.terasology.world.block.BlockManager; - -import java.util.List; - -/** - * The system that handles all of the events for the entity version of the tree structure. - * - * Allows for clients to make request to the entity tree that is contained on the server's side. - */ -@RegisterSystem(RegisterMode.AUTHORITY) -public class EntityTreeSystem extends BaseComponentSystem{ - private static final Logger logger = LoggerFactory.getLogger(EntityTreeSystem.class); - - @In - private AssetManager assetManager; - - @In - private EntityManager entityManager; - - @In - private BlockManager blockManager; - - @In - private ArgumentParser argumentParser; - - private EntityRef scenarioEntity; - - /** - * The whole scenario system relies on only one scenario entity existing - */ - @Override - public void postBegin() { - Iterable scenario = entityManager.getEntitiesWith(ScenarioComponent.class); // Checks for existing Scenario - - if (!scenario.iterator().hasNext()) { //No scenario exists yet - scenarioEntity = entityManager.create(assetManager.getAsset("scenario:scenarioEntity", Prefab.class).get()); - } - else { - scenarioEntity = scenario.iterator().next(); - } - } - - /** - * Adding event, attaches to the scenarioComponent.actions in the Scenario root and then adds a new empty list - * for eventually adding actions to that event. Updates the hub tool's screen if it was passed with the event. - * Does this by indicating to all hubtools that it's logic is "dirty" and needs to be refreshed and telling the adding hubtool - * what entity was just added so that it can prompt open the edit screen - */ - @ReceiveEvent - public void onLogicTreeAddEventEvent(LogicTreeAddEventEvent event, EntityRef entity, ScenarioHubToolUpdateComponent component) { - TriggerEventListComponent events = event.getTriggerEntity().getComponent(TriggerEventListComponent.class); - - EntityRef newEventEntity = entityManager.create(assetManager.getAsset("scenario:onPlayerSpawnEvent", Prefab.class).get()); - - argumentParser.parseDefaults(newEventEntity); - newEventEntity.setOwner(event.getTriggerEntity()); - events.events.add(newEventEntity); - event.getTriggerEntity().saveComponent(events); - scenarioEntity.saveComponent(scenarioEntity.getComponent(ScenarioComponent.class)); - - if (event.getHubScreen() != null) { - event.getHubScreen().getComponent(HubToolExpansionComponent.class).expandedList.add(event.getTriggerEntity()); - event.getHubScreen().getComponent(HubToolExpansionComponent.class).expandedList.add(event.getTriggerEntity().getComponent(TriggerNameComponent.class).entityForEvent); - event.getHubScreen().saveComponent(event.getHubScreen().getComponent(HubToolExpansionComponent.class)); - event.getHubScreen().getComponent(ScenarioHubToolUpdateComponent.class).addedEntity = newEventEntity; - event.getHubScreen().saveComponent(event.getHubScreen().getComponent(ScenarioHubToolUpdateComponent.class)); - } - - for (EntityRef e : entityManager.getEntitiesWith(ScenarioHubToolUpdateComponent.class)) { - e.send(new HubtoolRewriteLogicEvent()); - } - } - - /** - * Adding action, attaches to the ActionListComponent in the event entity. - * Updates the hub tool's screen if it was passed with the event. - * Does this by indicating to all hubtools that it's logic is "dirty" and needs to be refreshed and telling the adding hubtool - * what entity was just added so that it can prompt open the edit screen - */ - @ReceiveEvent - public void onLogicTreeAddActionEvent(LogicTreeAddActionEvent event, EntityRef entity, ScenarioHubToolUpdateComponent component) { - TriggerActionListComponent actions = event.getTriggerEntity().getComponent(TriggerActionListComponent.class); - //Sets up the default basic action as a give block component - EntityRef newActionEntity = entityManager.create(assetManager.getAsset("scenario:givePlayerBlockAction", Prefab.class).get()); - - argumentParser.parseDefaults(newActionEntity); - newActionEntity.setOwner(event.getTriggerEntity()); - actions.actions.add(newActionEntity); - event.getTriggerEntity().saveComponent(actions); - scenarioEntity.saveComponent(scenarioEntity.getComponent(ScenarioComponent.class)); - - if (event.getHubScreen() != null) { - event.getHubScreen().getComponent(HubToolExpansionComponent.class).expandedList.add(event.getTriggerEntity()); - event.getHubScreen().getComponent(HubToolExpansionComponent.class).expandedList.add(event.getTriggerEntity().getComponent(TriggerNameComponent.class).entityForAction); - event.getHubScreen().saveComponent(event.getHubScreen().getComponent(HubToolExpansionComponent.class)); - event.getHubScreen().getComponent(ScenarioHubToolUpdateComponent.class).addedEntity = newActionEntity; - event.getHubScreen().saveComponent(event.getHubScreen().getComponent(ScenarioHubToolUpdateComponent.class)); - } - - for (EntityRef e : entityManager.getEntitiesWith(ScenarioHubToolUpdateComponent.class)) { - e.send(new HubtoolRewriteLogicEvent()); - } - } - - - /** - * Adding condition, attaches to the scenarioComponent.actions in the Scenario root and then adds a new empty list - * for eventually adding actions to that event. Updates the hub tool's screen if it was passed with the event. - * Does this by indicating to all hubtools that it's logic is "dirty" and needs to be refreshed and telling the adding hubtool - * what entity was just added so that it can prompt open the edit screen - */ - @ReceiveEvent - public void onLogicTreeAddConditionEvent(LogicTreeAddConditionEvent event, EntityRef entity, ScenarioHubToolUpdateComponent component) { - TriggerConditionListComponent conditions = event.getTriggerEntity().getComponent(TriggerConditionListComponent.class); - //Sets up basic action as a give block component - EntityRef newCondEntity = entityManager.create(assetManager.getAsset("scenario:blockConditional", Prefab.class).get()); - - argumentParser.parseDefaults(newCondEntity); - newCondEntity.setOwner(event.getTriggerEntity()); - conditions.conditions.add(newCondEntity); - event.getTriggerEntity().saveComponent(conditions); - scenarioEntity.saveComponent(scenarioEntity.getComponent(ScenarioComponent.class)); - - if (event.getHubScreen() != null) { - event.getHubScreen().getComponent(HubToolExpansionComponent.class).expandedList.add(event.getTriggerEntity()); - event.getHubScreen().getComponent(HubToolExpansionComponent.class).expandedList.add(event.getTriggerEntity().getComponent(TriggerNameComponent.class).entityForCondition); - event.getHubScreen().saveComponent(event.getHubScreen().getComponent(HubToolExpansionComponent.class)); - event.getHubScreen().getComponent(ScenarioHubToolUpdateComponent.class).addedEntity = newCondEntity; - event.getHubScreen().saveComponent(event.getHubScreen().getComponent(ScenarioHubToolUpdateComponent.class)); - } - - for (EntityRef e : entityManager.getEntitiesWith(ScenarioHubToolUpdateComponent.class)) { - e.send(new HubtoolRewriteLogicEvent()); - } - } - - /** - * Adds a trigger entity to the trigger list of the scenario entity, tells all hubtools to redraw and adds the new entity - * to the expansion list of the creating hubtool - */ - @ReceiveEvent - public void onLogicTreeAddTriggerEvent(LogicTreeAddTriggerEvent event, EntityRef entity, ScenarioHubToolUpdateComponent component) { - EntityRef trigger = entityManager.create(assetManager.getAsset("Scenario:trigger", Prefab.class).get()); - TriggerEventListComponent events = trigger.getComponent(TriggerEventListComponent.class); - trigger.saveComponent(events); - TriggerConditionListComponent conds = trigger.getComponent(TriggerConditionListComponent.class); - trigger.saveComponent(conds); - TriggerActionListComponent actions = trigger.getComponent(TriggerActionListComponent.class); - trigger.saveComponent(actions); - - TriggerNameComponent temp = trigger.getComponent(TriggerNameComponent.class); - - temp.entityForEvent = entityManager.create(assetManager.getAsset("scenario:emptyNetworkEntity", Prefab.class).get()); - temp.entityForCondition = entityManager.create(assetManager.getAsset("scenario:emptyNetworkEntity", Prefab.class).get()); - temp.entityForAction = entityManager.create(assetManager.getAsset("scenario:emptyNetworkEntity", Prefab.class).get()); - trigger.saveComponent(temp); - - scenarioEntity.getComponent(ScenarioComponent.class).triggerEntities.add(trigger); - scenarioEntity.saveComponent(scenarioEntity.getComponent(ScenarioComponent.class)); - - if (event.getHubScreen() != null) { - event.getHubScreen().getComponent(HubToolExpansionComponent.class).expandedList.add(entity); - event.getHubScreen().getComponent(HubToolExpansionComponent.class).expandedList.add(trigger); - event.getHubScreen().saveComponent(event.getHubScreen().getComponent(HubToolExpansionComponent.class)); - event.getHubScreen().saveComponent(event.getHubScreen().getComponent(ScenarioHubToolUpdateComponent.class)); - } - - for (EntityRef e : entityManager.getEntitiesWith(ScenarioHubToolUpdateComponent.class)) { - e.send(new HubtoolRewriteLogicEvent()); - } - } - - /** - * Checks if the deleted entity is an event or action and then removes and saves the correct entities. - * Event just needs to update scenario root, action needs to update both scenario and the event it is attached to - * Updates the hub tool's screen if it was passed with the event. - */ - @ReceiveEvent - public void onLogicTreeDeleteEvent(LogicTreeDeleteEvent event, EntityRef entity, ScenarioHubToolUpdateComponent component) { - if (event.getDeleteFromEntity().hasComponent(TriggerNameComponent.class)) { //Must be event/cond/action - if (event.getDeleteEntity().hasComponent(ScenarioIndicatorEventComponent.class)) { //Event - TriggerEventListComponent events = event.getDeleteFromEntity().getComponent(TriggerEventListComponent.class); - events.events.remove(event.getDeleteEntity()); - event.getDeleteFromEntity().saveComponent(events); - event.getDeleteEntity().destroy(); - } - else if (event.getDeleteEntity().hasComponent(ScenarioIndicatorConditionalComponent.class)) { //Condition - TriggerConditionListComponent conds = event.getDeleteFromEntity().getComponent(TriggerConditionListComponent.class); - conds.conditions.remove(event.getDeleteEntity()); - event.getDeleteFromEntity().saveComponent(conds); - event.getDeleteEntity().destroy(); - } - else if (event.getDeleteEntity().hasComponent(ScenarioIndicatorActionComponent.class)) { //Action - TriggerActionListComponent actions = event.getDeleteFromEntity().getComponent(TriggerActionListComponent.class); - actions.actions.remove(event.getDeleteEntity()); - event.getDeleteFromEntity().saveComponent(actions); - event.getDeleteEntity().destroy(); - } - entity.saveComponent(component); - } - else { //Must be a trigger, not an event/action/conditional - scenarioEntity.getComponent(ScenarioComponent.class).triggerEntities.remove(event.getDeleteEntity()); - scenarioEntity.saveComponent(scenarioEntity.getComponent(ScenarioComponent.class)); - event.getDeleteEntity().destroy(); - } - - for (EntityRef e : entityManager.getEntitiesWith(ScenarioHubToolUpdateComponent.class)) { - e.send(new HubtoolRewriteLogicEvent()); - } - } - - /** - * Re-orders the tree based on the desired index and the starting index of a logic - */ - @ReceiveEvent - public void onLogicTreeMoveEntityEvent(LogicTreeMoveEntityEvent event, EntityRef entity, ScenarioHubToolUpdateComponent component) { - List list; - switch (event.getElementType()) { - case EVENT: - list = event.getTriggerEntity().getComponent(TriggerEventListComponent.class).events; - break; - case CONDITIONAL: - list = event.getTriggerEntity().getComponent(TriggerConditionListComponent.class).conditions; - break; - case ACTION: - list = event.getTriggerEntity().getComponent(TriggerActionListComponent.class).actions; - break; - case TRIGGER: - list = scenarioEntity.getComponent(ScenarioComponent.class).triggerEntities; - break; - default: - for (EntityRef e : entityManager.getEntitiesWith(ScenarioHubToolUpdateComponent.class)) { - e.send(new HubtoolRewriteLogicEvent()); - } - return; - } - int startIndex = list.indexOf(event.getMoveEntity()); - int endIndex = event.getIndex(); - if (startIndex < endIndex) { - list.add(endIndex, list.get(startIndex)); - list.remove(startIndex); - } - else { - list.add(endIndex, list.get(startIndex)); - list.remove(startIndex + 1); - } - - switch (event.getElementType()) { - case EVENT: - event.getTriggerEntity().saveComponent(event.getTriggerEntity().getComponent(TriggerEventListComponent.class)); - entity.saveComponent(component); - break; - case CONDITIONAL: - event.getTriggerEntity().saveComponent(event.getTriggerEntity().getComponent(TriggerConditionListComponent.class)); - entity.saveComponent(component); - break; - case ACTION: - event.getTriggerEntity().saveComponent(event.getTriggerEntity().getComponent(TriggerActionListComponent.class)); - entity.saveComponent(component); - break; - case TRIGGER: - entity.saveComponent(component); - break; - default: - for (EntityRef e : entityManager.getEntitiesWith(ScenarioHubToolUpdateComponent.class)) { - e.send(new HubtoolRewriteLogicEvent()); - } - return; - } - - for (EntityRef e : entityManager.getEntitiesWith(ScenarioHubToolUpdateComponent.class)) { - e.send(new HubtoolRewriteLogicEvent()); - } - } - - /** - * Takes the serialized list from a client and constructs it back into an entity and replaces the original entity in the logic tree. - * Serialised using ConvertEntitySystem and converts back into entity using ConvertIntoEntitySystem - */ - @ReceiveEvent - public void onReplaceEntityWithPrefabEvent(ReplaceEntityFromConstructionStringsEvent event, EntityRef entity, ScenarioHubToolUpdateComponent component) { - ConvertIntoEntityEvent conversionEvent = new ConvertIntoEntityEvent(event.getConversions()); - entity.send(conversionEvent); - EntityRef newEntity = conversionEvent.getReturnEntity(); - EntityRef owningTrigger = event.getReplaced().getOwner(); - if (event.getReplaced().hasComponent(ScenarioIndicatorActionComponent.class)) { - TriggerActionListComponent actions = owningTrigger.getComponent(TriggerActionListComponent.class); - newEntity.setOwner(owningTrigger); - int index = actions.actions.indexOf(event.getReplaced()); - actions.actions.remove(event.getReplaced()); - actions.actions.add(index, newEntity); - owningTrigger.saveComponent(actions); - scenarioEntity.saveComponent(scenarioEntity.getComponent(ScenarioComponent.class)); - } - else if (event.getReplaced().hasComponent(ScenarioIndicatorEventComponent.class)) { - TriggerEventListComponent events = owningTrigger.getComponent(TriggerEventListComponent.class); - newEntity.setOwner(owningTrigger); - int index = events.events.indexOf(event.getReplaced()); - events.events.remove(event.getReplaced()); - events.events.add(index, newEntity); - owningTrigger.saveComponent(events); - scenarioEntity.saveComponent(scenarioEntity.getComponent(ScenarioComponent.class)); - } - else if (event.getReplaced().hasComponent(ScenarioIndicatorConditionalComponent.class)) { - TriggerConditionListComponent conds = owningTrigger.getComponent(TriggerConditionListComponent.class); - newEntity.setOwner(owningTrigger); - int index = conds.conditions.indexOf(event.getReplaced()); - conds.conditions.remove(event.getReplaced()); - conds.conditions.add(index, newEntity); - owningTrigger.saveComponent(conds); - scenarioEntity.saveComponent(scenarioEntity.getComponent(ScenarioComponent.class)); - } - - event.getReplaced().destroy(); - - for (EntityRef e : entityManager.getEntitiesWith(ScenarioHubToolUpdateComponent.class)) { - e.send(new HubtoolRewriteLogicEvent()); - } - - } - - -} +/* + * Copyright 2017 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. + */ +package org.terasology.scenario.internal.systems; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.terasology.assets.management.AssetManager; +import org.terasology.entitySystem.entity.EntityManager; +import org.terasology.entitySystem.entity.EntityRef; +import org.terasology.entitySystem.event.ReceiveEvent; +import org.terasology.entitySystem.prefab.Prefab; +import org.terasology.entitySystem.systems.BaseComponentSystem; +import org.terasology.entitySystem.systems.RegisterMode; +import org.terasology.entitySystem.systems.RegisterSystem; +import org.terasology.registry.In; +import org.terasology.scenario.components.HubToolExpansionComponent; +import org.terasology.scenario.components.ScenarioComponent; +import org.terasology.scenario.components.ScenarioHubToolUpdateComponent; +import org.terasology.scenario.components.TriggerActionListComponent; +import org.terasology.scenario.components.TriggerConditionListComponent; +import org.terasology.scenario.components.TriggerEventListComponent; +import org.terasology.scenario.components.TriggerNameComponent; +import org.terasology.scenario.components.actions.ScenarioIndicatorActionComponent; +import org.terasology.scenario.components.conditionals.ScenarioIndicatorConditionalComponent; +import org.terasology.scenario.components.events.ScenarioIndicatorEventComponent; +import org.terasology.scenario.internal.events.ConvertIntoEntityEvent; +import org.terasology.scenario.internal.events.HubtoolRewriteLogicEvent; +import org.terasology.scenario.internal.events.LogicTreeAddActionEvent; +import org.terasology.scenario.internal.events.LogicTreeAddConditionEvent; +import org.terasology.scenario.internal.events.LogicTreeAddEventEvent; +import org.terasology.scenario.internal.events.LogicTreeAddTriggerEvent; +import org.terasology.scenario.internal.events.LogicTreeDeleteEvent; +import org.terasology.scenario.internal.events.LogicTreeMoveEntityEvent; +import org.terasology.scenario.internal.events.ReplaceEntityFromConstructionStringsEvent; +import org.terasology.scenario.internal.utilities.ArgumentParser; +import org.terasology.world.block.BlockManager; + +import java.util.List; + +/** + * The system that handles all of the events for the entity version of the tree structure. + * + * Allows for clients to make request to the entity tree that is contained on the server's side. + */ +@RegisterSystem(RegisterMode.AUTHORITY) +public class EntityTreeSystem extends BaseComponentSystem { + private static final Logger logger = LoggerFactory.getLogger(EntityTreeSystem.class); + + @In + private AssetManager assetManager; + + @In + private EntityManager entityManager; + + @In + private BlockManager blockManager; + + @In + private ArgumentParser argumentParser; + + private EntityRef scenarioEntity; + + /** + * The whole scenario system relies on only one scenario entity existing + */ + @Override + public void postBegin() { + Iterable scenario = entityManager.getEntitiesWith(ScenarioComponent.class); // Checks for existing Scenario + + if (!scenario.iterator().hasNext()) { //No scenario exists yet + scenarioEntity = entityManager.create(assetManager.getAsset("scenario:scenarioEntity", Prefab.class).get()); + } else { + scenarioEntity = scenario.iterator().next(); + } + } + + /** + * Adding event, attaches to the scenarioComponent.actions in the Scenario root and then adds a new empty list for + * eventually adding actions to that event. Updates the hub tool's screen if it was passed with the event. Does this + * by indicating to all hubtools that it's logic is "dirty" and needs to be refreshed and telling the adding hubtool + * what entity was just added so that it can prompt open the edit screen + */ + @ReceiveEvent + public void onLogicTreeAddEventEvent(LogicTreeAddEventEvent event, EntityRef entity, ScenarioHubToolUpdateComponent component) { + TriggerEventListComponent events = event.getTriggerEntity().getComponent(TriggerEventListComponent.class); + + EntityRef newEventEntity = entityManager.create(assetManager.getAsset("scenario:onPlayerSpawnEvent", Prefab.class).get()); + + argumentParser.parseDefaults(newEventEntity); + newEventEntity.setOwner(event.getTriggerEntity()); + events.events.add(newEventEntity); + event.getTriggerEntity().saveComponent(events); + scenarioEntity.saveComponent(scenarioEntity.getComponent(ScenarioComponent.class)); + + if (event.getHubScreen() != null) { + event.getHubScreen().getComponent(HubToolExpansionComponent.class).expandedList.add(event.getTriggerEntity()); + event.getHubScreen().getComponent(HubToolExpansionComponent.class).expandedList.add(event.getTriggerEntity().getComponent(TriggerNameComponent.class).entityForEvent); + event.getHubScreen().saveComponent(event.getHubScreen().getComponent(HubToolExpansionComponent.class)); + event.getHubScreen().getComponent(ScenarioHubToolUpdateComponent.class).addedEntity = newEventEntity; + event.getHubScreen().saveComponent(event.getHubScreen().getComponent(ScenarioHubToolUpdateComponent.class)); + } + + for (EntityRef e : entityManager.getEntitiesWith(ScenarioHubToolUpdateComponent.class)) { + e.send(new HubtoolRewriteLogicEvent()); + } + } + + /** + * Adding action, attaches to the ActionListComponent in the event entity. Updates the hub tool's screen if it was + * passed with the event. Does this by indicating to all hubtools that it's logic is "dirty" and needs to be + * refreshed and telling the adding hubtool what entity was just added so that it can prompt open the edit screen + */ + @ReceiveEvent + public void onLogicTreeAddActionEvent(LogicTreeAddActionEvent event, EntityRef entity, ScenarioHubToolUpdateComponent component) { + TriggerActionListComponent actions = event.getTriggerEntity().getComponent(TriggerActionListComponent.class); + //Sets up the default basic action as a give block component + EntityRef newActionEntity = entityManager.create(assetManager.getAsset("scenario:givePlayerBlockAction", Prefab.class).get()); + + argumentParser.parseDefaults(newActionEntity); + newActionEntity.setOwner(event.getTriggerEntity()); + actions.actions.add(newActionEntity); + event.getTriggerEntity().saveComponent(actions); + scenarioEntity.saveComponent(scenarioEntity.getComponent(ScenarioComponent.class)); + + if (event.getHubScreen() != null) { + event.getHubScreen().getComponent(HubToolExpansionComponent.class).expandedList.add(event.getTriggerEntity()); + event.getHubScreen().getComponent(HubToolExpansionComponent.class).expandedList.add(event.getTriggerEntity().getComponent(TriggerNameComponent.class).entityForAction); + event.getHubScreen().saveComponent(event.getHubScreen().getComponent(HubToolExpansionComponent.class)); + event.getHubScreen().getComponent(ScenarioHubToolUpdateComponent.class).addedEntity = newActionEntity; + event.getHubScreen().saveComponent(event.getHubScreen().getComponent(ScenarioHubToolUpdateComponent.class)); + } + + for (EntityRef e : entityManager.getEntitiesWith(ScenarioHubToolUpdateComponent.class)) { + e.send(new HubtoolRewriteLogicEvent()); + } + } + + + /** + * Adding condition, attaches to the scenarioComponent.actions in the Scenario root and then adds a new empty list + * for eventually adding actions to that event. Updates the hub tool's screen if it was passed with the event. Does + * this by indicating to all hubtools that it's logic is "dirty" and needs to be refreshed and telling the adding + * hubtool what entity was just added so that it can prompt open the edit screen + */ + @ReceiveEvent + public void onLogicTreeAddConditionEvent(LogicTreeAddConditionEvent event, EntityRef entity, ScenarioHubToolUpdateComponent component) { + TriggerConditionListComponent conditions = event.getTriggerEntity().getComponent(TriggerConditionListComponent.class); + //Sets up basic action as a give block component + EntityRef newCondEntity = entityManager.create(assetManager.getAsset("scenario:blockConditional", Prefab.class).get()); + + argumentParser.parseDefaults(newCondEntity); + newCondEntity.setOwner(event.getTriggerEntity()); + conditions.conditions.add(newCondEntity); + event.getTriggerEntity().saveComponent(conditions); + scenarioEntity.saveComponent(scenarioEntity.getComponent(ScenarioComponent.class)); + + if (event.getHubScreen() != null) { + event.getHubScreen().getComponent(HubToolExpansionComponent.class).expandedList.add(event.getTriggerEntity()); + event.getHubScreen().getComponent(HubToolExpansionComponent.class).expandedList.add(event.getTriggerEntity().getComponent(TriggerNameComponent.class).entityForCondition); + event.getHubScreen().saveComponent(event.getHubScreen().getComponent(HubToolExpansionComponent.class)); + event.getHubScreen().getComponent(ScenarioHubToolUpdateComponent.class).addedEntity = newCondEntity; + event.getHubScreen().saveComponent(event.getHubScreen().getComponent(ScenarioHubToolUpdateComponent.class)); + } + + for (EntityRef e : entityManager.getEntitiesWith(ScenarioHubToolUpdateComponent.class)) { + e.send(new HubtoolRewriteLogicEvent()); + } + } + + /** + * Adds a trigger entity to the trigger list of the scenario entity, tells all hubtools to redraw and adds the new + * entity to the expansion list of the creating hubtool + */ + @ReceiveEvent + public void onLogicTreeAddTriggerEvent(LogicTreeAddTriggerEvent event, EntityRef entity, ScenarioHubToolUpdateComponent component) { + EntityRef trigger = entityManager.create(assetManager.getAsset("Scenario:trigger", Prefab.class).get()); + TriggerEventListComponent events = trigger.getComponent(TriggerEventListComponent.class); + trigger.saveComponent(events); + TriggerConditionListComponent conds = trigger.getComponent(TriggerConditionListComponent.class); + trigger.saveComponent(conds); + TriggerActionListComponent actions = trigger.getComponent(TriggerActionListComponent.class); + trigger.saveComponent(actions); + + TriggerNameComponent temp = trigger.getComponent(TriggerNameComponent.class); + + temp.entityForEvent = entityManager.create(assetManager.getAsset("scenario:emptyNetworkEntity", Prefab.class).get()); + temp.entityForCondition = entityManager.create(assetManager.getAsset("scenario:emptyNetworkEntity", Prefab.class).get()); + temp.entityForAction = entityManager.create(assetManager.getAsset("scenario:emptyNetworkEntity", Prefab.class).get()); + trigger.saveComponent(temp); + + scenarioEntity.getComponent(ScenarioComponent.class).triggerEntities.add(trigger); + scenarioEntity.saveComponent(scenarioEntity.getComponent(ScenarioComponent.class)); + + if (event.getHubScreen() != null) { + event.getHubScreen().getComponent(HubToolExpansionComponent.class).expandedList.add(entity); + event.getHubScreen().getComponent(HubToolExpansionComponent.class).expandedList.add(trigger); + event.getHubScreen().saveComponent(event.getHubScreen().getComponent(HubToolExpansionComponent.class)); + event.getHubScreen().saveComponent(event.getHubScreen().getComponent(ScenarioHubToolUpdateComponent.class)); + } + + for (EntityRef e : entityManager.getEntitiesWith(ScenarioHubToolUpdateComponent.class)) { + e.send(new HubtoolRewriteLogicEvent()); + } + } + + /** + * Checks if the deleted entity is an event or action and then removes and saves the correct entities. Event just + * needs to update scenario root, action needs to update both scenario and the event it is attached to Updates the + * hub tool's screen if it was passed with the event. + */ + @ReceiveEvent + public void onLogicTreeDeleteEvent(LogicTreeDeleteEvent event, EntityRef entity, ScenarioHubToolUpdateComponent component) { + if (event.getDeleteFromEntity().hasComponent(TriggerNameComponent.class)) { //Must be event/cond/action + if (event.getDeleteEntity().hasComponent(ScenarioIndicatorEventComponent.class)) { //Event + TriggerEventListComponent events = event.getDeleteFromEntity().getComponent(TriggerEventListComponent.class); + events.events.remove(event.getDeleteEntity()); + event.getDeleteFromEntity().saveComponent(events); + event.getDeleteEntity().destroy(); + } else if (event.getDeleteEntity().hasComponent(ScenarioIndicatorConditionalComponent.class)) { //Condition + TriggerConditionListComponent conds = event.getDeleteFromEntity().getComponent(TriggerConditionListComponent.class); + conds.conditions.remove(event.getDeleteEntity()); + event.getDeleteFromEntity().saveComponent(conds); + event.getDeleteEntity().destroy(); + } else if (event.getDeleteEntity().hasComponent(ScenarioIndicatorActionComponent.class)) { //Action + TriggerActionListComponent actions = event.getDeleteFromEntity().getComponent(TriggerActionListComponent.class); + actions.actions.remove(event.getDeleteEntity()); + event.getDeleteFromEntity().saveComponent(actions); + event.getDeleteEntity().destroy(); + } + entity.saveComponent(component); + } else { //Must be a trigger, not an event/action/conditional + scenarioEntity.getComponent(ScenarioComponent.class).triggerEntities.remove(event.getDeleteEntity()); + scenarioEntity.saveComponent(scenarioEntity.getComponent(ScenarioComponent.class)); + event.getDeleteEntity().destroy(); + } + + for (EntityRef e : entityManager.getEntitiesWith(ScenarioHubToolUpdateComponent.class)) { + e.send(new HubtoolRewriteLogicEvent()); + } + } + + /** + * Re-orders the tree based on the desired index and the starting index of a logic + */ + @ReceiveEvent + public void onLogicTreeMoveEntityEvent(LogicTreeMoveEntityEvent event, EntityRef entity, ScenarioHubToolUpdateComponent component) { + List list; + switch (event.getElementType()) { + case EVENT: + list = event.getTriggerEntity().getComponent(TriggerEventListComponent.class).events; + break; + case CONDITIONAL: + list = event.getTriggerEntity().getComponent(TriggerConditionListComponent.class).conditions; + break; + case ACTION: + list = event.getTriggerEntity().getComponent(TriggerActionListComponent.class).actions; + break; + case TRIGGER: + list = scenarioEntity.getComponent(ScenarioComponent.class).triggerEntities; + break; + default: + for (EntityRef e : entityManager.getEntitiesWith(ScenarioHubToolUpdateComponent.class)) { + e.send(new HubtoolRewriteLogicEvent()); + } + return; + } + int startIndex = list.indexOf(event.getMoveEntity()); + int endIndex = event.getIndex(); + if (startIndex < endIndex) { + list.add(endIndex, list.get(startIndex)); + list.remove(startIndex); + } else { + list.add(endIndex, list.get(startIndex)); + list.remove(startIndex + 1); + } + + switch (event.getElementType()) { + case EVENT: + event.getTriggerEntity().saveComponent(event.getTriggerEntity().getComponent(TriggerEventListComponent.class)); + entity.saveComponent(component); + break; + case CONDITIONAL: + event.getTriggerEntity().saveComponent(event.getTriggerEntity().getComponent(TriggerConditionListComponent.class)); + entity.saveComponent(component); + break; + case ACTION: + event.getTriggerEntity().saveComponent(event.getTriggerEntity().getComponent(TriggerActionListComponent.class)); + entity.saveComponent(component); + break; + case TRIGGER: + entity.saveComponent(component); + break; + default: + for (EntityRef e : entityManager.getEntitiesWith(ScenarioHubToolUpdateComponent.class)) { + e.send(new HubtoolRewriteLogicEvent()); + } + return; + } + + for (EntityRef e : entityManager.getEntitiesWith(ScenarioHubToolUpdateComponent.class)) { + e.send(new HubtoolRewriteLogicEvent()); + } + } + + /** + * Takes the serialized list from a client and constructs it back into an entity and replaces the original entity in + * the logic tree. Serialised using ConvertEntitySystem and converts back into entity using ConvertIntoEntitySystem + */ + @ReceiveEvent + public void onReplaceEntityWithPrefabEvent(ReplaceEntityFromConstructionStringsEvent event, EntityRef entity, ScenarioHubToolUpdateComponent component) { + ConvertIntoEntityEvent conversionEvent = new ConvertIntoEntityEvent(event.getConversions()); + entity.send(conversionEvent); + EntityRef newEntity = conversionEvent.getReturnEntity(); + EntityRef owningTrigger = event.getReplaced().getOwner(); + if (event.getReplaced().hasComponent(ScenarioIndicatorActionComponent.class)) { + TriggerActionListComponent actions = owningTrigger.getComponent(TriggerActionListComponent.class); + newEntity.setOwner(owningTrigger); + int index = actions.actions.indexOf(event.getReplaced()); + actions.actions.remove(event.getReplaced()); + actions.actions.add(index, newEntity); + owningTrigger.saveComponent(actions); + scenarioEntity.saveComponent(scenarioEntity.getComponent(ScenarioComponent.class)); + } else if (event.getReplaced().hasComponent(ScenarioIndicatorEventComponent.class)) { + TriggerEventListComponent events = owningTrigger.getComponent(TriggerEventListComponent.class); + newEntity.setOwner(owningTrigger); + int index = events.events.indexOf(event.getReplaced()); + events.events.remove(event.getReplaced()); + events.events.add(index, newEntity); + owningTrigger.saveComponent(events); + scenarioEntity.saveComponent(scenarioEntity.getComponent(ScenarioComponent.class)); + } else if (event.getReplaced().hasComponent(ScenarioIndicatorConditionalComponent.class)) { + TriggerConditionListComponent conds = owningTrigger.getComponent(TriggerConditionListComponent.class); + newEntity.setOwner(owningTrigger); + int index = conds.conditions.indexOf(event.getReplaced()); + conds.conditions.remove(event.getReplaced()); + conds.conditions.add(index, newEntity); + owningTrigger.saveComponent(conds); + scenarioEntity.saveComponent(scenarioEntity.getComponent(ScenarioComponent.class)); + } + + event.getReplaced().destroy(); + + for (EntityRef e : entityManager.getEntitiesWith(ScenarioHubToolUpdateComponent.class)) { + e.send(new HubtoolRewriteLogicEvent()); + } + + } +} diff --git a/src/main/java/org/terasology/scenario/internal/systems/EventListeningSystem.java b/src/main/java/org/terasology/scenario/internal/systems/EventListeningSystem.java index 8714f24..943c115 100644 --- a/src/main/java/org/terasology/scenario/internal/systems/EventListeningSystem.java +++ b/src/main/java/org/terasology/scenario/internal/systems/EventListeningSystem.java @@ -1,82 +1,78 @@ -/* - * Copyright 2017 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. - */ -package org.terasology.scenario.internal.systems; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.terasology.entitySystem.entity.EntityManager; -import org.terasology.entitySystem.entity.EntityRef; -import org.terasology.entitySystem.event.ReceiveEvent; -import org.terasology.entitySystem.systems.BaseComponentSystem; -import org.terasology.entitySystem.systems.RegisterMode; -import org.terasology.entitySystem.systems.RegisterSystem; -import org.terasology.logic.health.DoDestroyEvent; -import org.terasology.logic.players.event.OnPlayerRespawnedEvent; -import org.terasology.logic.players.event.OnPlayerSpawnedEvent; -import org.terasology.registry.In; -import org.terasology.scenario.components.ScenarioComponent; -import org.terasology.scenario.internal.events.scenarioEvents.DoDestroyScenarioEvent; -import org.terasology.scenario.internal.events.scenarioEvents.PlayerEnterRegionEvent; -import org.terasology.scenario.internal.events.scenarioEvents.PlayerRespawnScenarioEvent; -import org.terasology.scenario.internal.events.scenarioEvents.PlayerSpawnScenarioEvent; - -/** - * System that listens for normal terasology engine events and converts them into scenario events and sends them to the active scenario - * in order to for it to invoke any triggers that have a matching Scenario event - */ -@RegisterSystem(RegisterMode.AUTHORITY) -public class EventListeningSystem extends BaseComponentSystem { - @In - private EntityManager entityManager; - - private Logger logger = LoggerFactory.getLogger(EventListeningSystem.class); - - @ReceiveEvent //Respawn (On death or on rejoin a server) - public void onPlayerRejoinEvent(OnPlayerRespawnedEvent event, EntityRef entity) { - if (entityManager.getEntitiesWith(ScenarioComponent.class).iterator().hasNext()) { - EntityRef scenario = entityManager.getEntitiesWith(ScenarioComponent.class).iterator().next(); - if (scenario == null) { - return; - } - scenario.send(new PlayerRespawnScenarioEvent(entity)); - } - } - - @ReceiveEvent //Spawn, initial spawn on joining a server - public void onPlayerSpawnEvent(OnPlayerSpawnedEvent event, EntityRef entity) { - if (entityManager.getEntitiesWith(ScenarioComponent.class).iterator().hasNext()) { - EntityRef scenario = entityManager.getEntitiesWith(ScenarioComponent.class).iterator().next(); - if (scenario == null) { - return; - } - scenario.send(new PlayerSpawnScenarioEvent(entity)); - } - } - - @ReceiveEvent //On block detruction - public void onDoDestroyEvent(DoDestroyEvent event, EntityRef entity) { - if (entityManager.getEntitiesWith(ScenarioComponent.class).iterator().hasNext()) { - EntityRef scenario = entityManager.getEntitiesWith(ScenarioComponent.class).iterator().next(); - if (scenario == null) { - return; - } - scenario.send(new DoDestroyScenarioEvent(event.getInstigator(), event.getDirectCause(), event.getDamageType(), entity)); - } - } - - - -} +/* + * Copyright 2017 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. + */ +package org.terasology.scenario.internal.systems; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.terasology.entitySystem.entity.EntityManager; +import org.terasology.entitySystem.entity.EntityRef; +import org.terasology.entitySystem.event.ReceiveEvent; +import org.terasology.entitySystem.systems.BaseComponentSystem; +import org.terasology.entitySystem.systems.RegisterMode; +import org.terasology.entitySystem.systems.RegisterSystem; +import org.terasology.logic.health.DoDestroyEvent; +import org.terasology.logic.players.event.OnPlayerRespawnedEvent; +import org.terasology.logic.players.event.OnPlayerSpawnedEvent; +import org.terasology.registry.In; +import org.terasology.scenario.components.ScenarioComponent; +import org.terasology.scenario.internal.events.scenarioEvents.DoDestroyScenarioEvent; +import org.terasology.scenario.internal.events.scenarioEvents.PlayerRespawnScenarioEvent; +import org.terasology.scenario.internal.events.scenarioEvents.PlayerSpawnScenarioEvent; + +/** + * System that listens for normal terasology engine events and converts them into scenario events and sends them to the active scenario + * in order to for it to invoke any triggers that have a matching Scenario event + */ +@RegisterSystem(RegisterMode.AUTHORITY) +public class EventListeningSystem extends BaseComponentSystem { + @In + private EntityManager entityManager; + + private Logger logger = LoggerFactory.getLogger(EventListeningSystem.class); + + @ReceiveEvent //Respawn (On death or on rejoin a server) + public void onPlayerRejoinEvent(OnPlayerRespawnedEvent event, EntityRef entity) { + if (entityManager.getEntitiesWith(ScenarioComponent.class).iterator().hasNext()) { + EntityRef scenario = entityManager.getEntitiesWith(ScenarioComponent.class).iterator().next(); + if (scenario == null) { + return; + } + scenario.send(new PlayerRespawnScenarioEvent(entity)); + } + } + + @ReceiveEvent //Spawn, initial spawn on joining a server + public void onPlayerSpawnEvent(OnPlayerSpawnedEvent event, EntityRef entity) { + if (entityManager.getEntitiesWith(ScenarioComponent.class).iterator().hasNext()) { + EntityRef scenario = entityManager.getEntitiesWith(ScenarioComponent.class).iterator().next(); + if (scenario == null) { + return; + } + scenario.send(new PlayerSpawnScenarioEvent(entity)); + } + } + + @ReceiveEvent //On block detruction + public void onDoDestroyEvent(DoDestroyEvent event, EntityRef entity) { + if (entityManager.getEntitiesWith(ScenarioComponent.class).iterator().hasNext()) { + EntityRef scenario = entityManager.getEntitiesWith(ScenarioComponent.class).iterator().next(); + if (scenario == null) { + return; + } + scenario.send(new DoDestroyScenarioEvent(event.getInstigator(), event.getDirectCause(), event.getDamageType(), entity)); + } + } +} diff --git a/src/main/java/org/terasology/scenario/internal/systems/HubToolRewriteSystem.java b/src/main/java/org/terasology/scenario/internal/systems/HubToolRewriteSystem.java index 1e100ea..66d45b3 100644 --- a/src/main/java/org/terasology/scenario/internal/systems/HubToolRewriteSystem.java +++ b/src/main/java/org/terasology/scenario/internal/systems/HubToolRewriteSystem.java @@ -1,53 +1,53 @@ -/* - * Copyright 2017 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. - */ -package org.terasology.scenario.internal.systems; - -import org.terasology.entitySystem.entity.EntityRef; -import org.terasology.entitySystem.event.ReceiveEvent; -import org.terasology.entitySystem.systems.BaseComponentSystem; -import org.terasology.entitySystem.systems.RegisterMode; -import org.terasology.entitySystem.systems.RegisterSystem; -import org.terasology.registry.In; -import org.terasology.rendering.nui.NUIManager; -import org.terasology.scenario.components.ScenarioHubToolUpdateComponent; -import org.terasology.scenario.internal.events.HubtoolRewriteLogicEvent; -import org.terasology.scenario.internal.events.HubtoolRewriteRegionEvent; -import org.terasology.scenario.internal.ui.HubToolScreen; - -@RegisterSystem(RegisterMode.CLIENT) -public class HubToolRewriteSystem extends BaseComponentSystem { - - @In - private NUIManager nuiManager; - - @ReceiveEvent - public void onHubtoolRewriteLogicEvent(HubtoolRewriteLogicEvent event, EntityRef entity, ScenarioHubToolUpdateComponent component) { - if (component.localScreenID != null) { //Makes sure it is the owner of the hubtool - if (nuiManager.getScreen(component.localScreenID) != null) { - ((HubToolScreen)nuiManager.getScreen(component.localScreenID)).redrawLogic(); - } - } - } - - @ReceiveEvent - public void onHubtoolRewriteRegionEvent(HubtoolRewriteRegionEvent event, EntityRef entity, ScenarioHubToolUpdateComponent component) { - if (component.localScreenID != null) { //Makes sure it is the owner of the hubtool - if (nuiManager.getScreen(component.localScreenID) != null) { - ((HubToolScreen)nuiManager.getScreen(component.localScreenID)).redrawRegions(); - } - } - } -} +/* + * Copyright 2017 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. + */ +package org.terasology.scenario.internal.systems; + +import org.terasology.entitySystem.entity.EntityRef; +import org.terasology.entitySystem.event.ReceiveEvent; +import org.terasology.entitySystem.systems.BaseComponentSystem; +import org.terasology.entitySystem.systems.RegisterMode; +import org.terasology.entitySystem.systems.RegisterSystem; +import org.terasology.registry.In; +import org.terasology.rendering.nui.NUIManager; +import org.terasology.scenario.components.ScenarioHubToolUpdateComponent; +import org.terasology.scenario.internal.events.HubtoolRewriteLogicEvent; +import org.terasology.scenario.internal.events.HubtoolRewriteRegionEvent; +import org.terasology.scenario.internal.ui.HubToolScreen; + +@RegisterSystem(RegisterMode.CLIENT) +public class HubToolRewriteSystem extends BaseComponentSystem { + + @In + private NUIManager nuiManager; + + @ReceiveEvent + public void onHubtoolRewriteLogicEvent(HubtoolRewriteLogicEvent event, EntityRef entity, ScenarioHubToolUpdateComponent component) { + if (component.localScreenID != null) { //Makes sure it is the owner of the hubtool + if (nuiManager.getScreen(component.localScreenID) != null) { + ((HubToolScreen) nuiManager.getScreen(component.localScreenID)).redrawLogic(); + } + } + } + + @ReceiveEvent + public void onHubtoolRewriteRegionEvent(HubtoolRewriteRegionEvent event, EntityRef entity, ScenarioHubToolUpdateComponent component) { + if (component.localScreenID != null) { //Makes sure it is the owner of the hubtool + if (nuiManager.getScreen(component.localScreenID) != null) { + ((HubToolScreen) nuiManager.getScreen(component.localScreenID)).redrawRegions(); + } + } + } +} diff --git a/src/main/java/org/terasology/scenario/internal/systems/RegionDisplaySystem.java b/src/main/java/org/terasology/scenario/internal/systems/RegionDisplaySystem.java index 1ab8c99..957441c 100644 --- a/src/main/java/org/terasology/scenario/internal/systems/RegionDisplaySystem.java +++ b/src/main/java/org/terasology/scenario/internal/systems/RegionDisplaySystem.java @@ -15,6 +15,8 @@ */ package org.terasology.scenario.internal.systems; +import org.joml.Vector3f; +import org.joml.Vector3i; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.terasology.engine.modes.loadProcesses.AwaitedLocalCharacterSpawnEvent; @@ -30,13 +32,12 @@ import org.terasology.logic.characters.CharacterComponent; import org.terasology.logic.location.LocationComponent; import org.terasology.logic.players.LocalPlayer; -import org.terasology.math.Region3i; -import org.terasology.math.geom.Vector3i; +import org.terasology.math.JomlUtil; import org.terasology.network.NetworkSystem; +import org.terasology.nui.Color; import org.terasology.registry.In; import org.terasology.rendering.logic.FloatingTextComponent; import org.terasology.rendering.logic.RegionOutlineComponent; -import org.terasology.nui.Color; import org.terasology.scenario.components.ScenarioRegionVisibilityComponent; import org.terasology.scenario.components.regions.RegionColorComponent; import org.terasology.scenario.components.regions.RegionLocationComponent; @@ -44,6 +45,7 @@ import org.terasology.scenario.internal.events.RegionAddVisibilityEvent; import org.terasology.scenario.internal.events.RegionRedrawEvent; import org.terasology.scenario.internal.events.RegionRemoveVisibilityEvent; +import org.terasology.world.block.BlockRegion; import java.util.ArrayList; import java.util.List; @@ -131,8 +133,8 @@ private void updateOutlineEntities(ScenarioRegionVisibilityComponent component) EntityBuilder entityBuilder = entityManager.newBuilder(); entityBuilder.setPersistent(false); RegionOutlineComponent regionOutlineComponent = new RegionOutlineComponent(); - regionOutlineComponent.corner1 = new Vector3i(r.region.min()); - regionOutlineComponent.corner2 = new Vector3i(r.region.max()); + regionOutlineComponent.corner1 = JomlUtil.from(r.region.getMin(new Vector3i())); + regionOutlineComponent.corner2 = JomlUtil.from(r.region.getMax(new Vector3i())); regionOutlineComponent.color = r.color; entityBuilder.addComponent(regionOutlineComponent); regionOutlineAndTextEntities.add(entityBuilder.build()); @@ -144,7 +146,7 @@ private void updateOutlineEntities(ScenarioRegionVisibilityComponent component) textComponent.text = r.text; textComponent.textColor = r.color; LocationComponent loc = new LocationComponent(); - loc.setWorldPosition(r.region.center()); + loc.setWorldPosition(r.region.center(new Vector3f())); entityBuilder2.addComponent(textComponent); entityBuilder2.addComponent(loc); regionOutlineAndTextEntities.add(entityBuilder2.build()); @@ -160,7 +162,7 @@ private void destroyOutlineEntities() { } private class ColoredRegion { - public Region3i region; + public BlockRegion region; public Color color; public String text; } diff --git a/src/main/java/org/terasology/scenario/internal/systems/RegionEventSystem.java b/src/main/java/org/terasology/scenario/internal/systems/RegionEventSystem.java index 7bc0be2..55fffbe 100644 --- a/src/main/java/org/terasology/scenario/internal/systems/RegionEventSystem.java +++ b/src/main/java/org/terasology/scenario/internal/systems/RegionEventSystem.java @@ -1,97 +1,94 @@ -/* - * Copyright 2017 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. - */ -package org.terasology.scenario.internal.systems; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.terasology.entitySystem.entity.EntityManager; -import org.terasology.entitySystem.entity.EntityRef; -import org.terasology.entitySystem.systems.BaseComponentSystem; -import org.terasology.entitySystem.systems.RegisterMode; -import org.terasology.entitySystem.systems.RegisterSystem; -import org.terasology.entitySystem.systems.UpdateSubscriberSystem; -import org.terasology.logic.characters.CharacterComponent; -import org.terasology.logic.location.LocationComponent; -import org.terasology.math.geom.Vector3f; -import org.terasology.registry.In; -import org.terasology.scenario.components.ScenarioComponent; -import org.terasology.scenario.components.regions.RegionContainingEntitiesComponent; -import org.terasology.scenario.components.regions.RegionLocationComponent; -import org.terasology.scenario.internal.events.scenarioEvents.PlayerEnterRegionEvent; -import org.terasology.scenario.internal.events.scenarioEvents.PlayerLeaveRegionEvent; - -import java.util.List; - -/** - * System that will watch regions for all the player character entities that enter and leave regions - * - * Will update the {@link RegionContainingEntitiesComponent} of all the scenario region entities that are being monitored - */ -@RegisterSystem(RegisterMode.AUTHORITY) -public class RegionEventSystem extends BaseComponentSystem implements UpdateSubscriberSystem{ - @In - private EntityManager entityManager; - - private Logger logger = LoggerFactory.getLogger(RegionEventSystem.class); - - private EntityRef scenario; - - /** - * Region system's update that monitors the regions and updates them with players entering and leaving regions and triggering - * events when the respective event occurs to pass to the scenario - * - * @param delta The time (in seconds) since the last engine update. - */ - public void update(float delta) { - if (scenario == null) { - if (entityManager.getEntitiesWith(ScenarioComponent.class).iterator().hasNext()) { - EntityRef tempScen = entityManager.getEntitiesWith(ScenarioComponent.class).iterator().next(); - if (tempScen == null) { - return; - } - scenario = tempScen; - } - } - else { - for (EntityRef region : scenario.getComponent(ScenarioComponent.class).regionEntities) { - RegionLocationComponent locationRegion = region.getComponent(RegionLocationComponent.class); - RegionContainingEntitiesComponent containing = region.getComponent(RegionContainingEntitiesComponent.class); - List tempList = containing.entities; - for (EntityRef character : entityManager.getEntitiesWith(CharacterComponent.class)) { - Vector3f loc = character.getComponent(LocationComponent.class).getWorldPosition(); - if (locationRegion.region.encompasses((int)loc.x, (int)loc.y, (int)loc.z)) { - if (!tempList.contains(character)) { //Just entered region - tempList.add(character); - PlayerEnterRegionEvent newEvent = new PlayerEnterRegionEvent(character, region); - scenario.send(newEvent); - } - } - else { - if (tempList.contains(character)) { //Just left region - tempList.remove(character); - PlayerLeaveRegionEvent newEvent = new PlayerLeaveRegionEvent(character, region); - scenario.send(newEvent); - } - } - } - containing.entities = tempList; - region.saveComponent(containing); - } - scenario.saveComponent(scenario.getComponent(ScenarioComponent.class)); - } - } - -} +/* + * Copyright 2017 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. + */ +package org.terasology.scenario.internal.systems; + +import org.joml.Vector3f; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.terasology.entitySystem.entity.EntityManager; +import org.terasology.entitySystem.entity.EntityRef; +import org.terasology.entitySystem.systems.BaseComponentSystem; +import org.terasology.entitySystem.systems.RegisterMode; +import org.terasology.entitySystem.systems.RegisterSystem; +import org.terasology.entitySystem.systems.UpdateSubscriberSystem; +import org.terasology.logic.characters.CharacterComponent; +import org.terasology.logic.location.LocationComponent; +import org.terasology.registry.In; +import org.terasology.scenario.components.ScenarioComponent; +import org.terasology.scenario.components.regions.RegionContainingEntitiesComponent; +import org.terasology.scenario.components.regions.RegionLocationComponent; +import org.terasology.scenario.internal.events.scenarioEvents.PlayerEnterRegionEvent; +import org.terasology.scenario.internal.events.scenarioEvents.PlayerLeaveRegionEvent; + +import java.util.List; + +/** + * System that will watch regions for all the player character entities that enter and leave regions + * + * Will update the {@link RegionContainingEntitiesComponent} of all the scenario region entities that are being monitored + */ +@RegisterSystem(RegisterMode.AUTHORITY) +public class RegionEventSystem extends BaseComponentSystem implements UpdateSubscriberSystem { + @In + private EntityManager entityManager; + + private Logger logger = LoggerFactory.getLogger(RegionEventSystem.class); + + private EntityRef scenario; + + /** + * Region system's update that monitors the regions and updates them with players entering and leaving regions and + * triggering events when the respective event occurs to pass to the scenario + * + * @param delta The time (in seconds) since the last engine update. + */ + public void update(float delta) { + if (scenario == null) { + if (entityManager.getEntitiesWith(ScenarioComponent.class).iterator().hasNext()) { + EntityRef tempScen = entityManager.getEntitiesWith(ScenarioComponent.class).iterator().next(); + if (tempScen == null) { + return; + } + scenario = tempScen; + } + } else { + for (EntityRef region : scenario.getComponent(ScenarioComponent.class).regionEntities) { + RegionLocationComponent locationRegion = region.getComponent(RegionLocationComponent.class); + RegionContainingEntitiesComponent containing = region.getComponent(RegionContainingEntitiesComponent.class); + List tempList = containing.entities; + for (EntityRef character : entityManager.getEntitiesWith(CharacterComponent.class)) { + Vector3f loc = character.getComponent(LocationComponent.class).getWorldPosition(new Vector3f()); + if (locationRegion.region.contains((int) loc.x, (int) loc.y, (int) loc.z)) { + if (!tempList.contains(character)) { //Just entered region + tempList.add(character); + PlayerEnterRegionEvent newEvent = new PlayerEnterRegionEvent(character, region); + scenario.send(newEvent); + } + } else { + if (tempList.contains(character)) { //Just left region + tempList.remove(character); + PlayerLeaveRegionEvent newEvent = new PlayerLeaveRegionEvent(character, region); + scenario.send(newEvent); + } + } + } + containing.entities = tempList; + region.saveComponent(containing); + } + scenario.saveComponent(scenario.getComponent(ScenarioComponent.class)); + } + } +} diff --git a/src/main/java/org/terasology/scenario/internal/systems/RegionSystem.java b/src/main/java/org/terasology/scenario/internal/systems/RegionSystem.java index 071a565..024b4e8 100644 --- a/src/main/java/org/terasology/scenario/internal/systems/RegionSystem.java +++ b/src/main/java/org/terasology/scenario/internal/systems/RegionSystem.java @@ -15,6 +15,7 @@ */ package org.terasology.scenario.internal.systems; +import org.joml.Vector3i; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.terasology.assets.management.AssetManager; @@ -30,8 +31,6 @@ import org.terasology.logic.characters.events.AttackEvent; import org.terasology.logic.chat.ChatMessageEvent; import org.terasology.logic.common.DisplayNameComponent; -import org.terasology.math.Region3i; -import org.terasology.math.geom.Vector3i; import org.terasology.network.ColorComponent; import org.terasology.nui.Color; import org.terasology.registry.In; @@ -39,6 +38,7 @@ import org.terasology.scenario.components.regions.RegionBeingCreatedComponent; import org.terasology.scenario.components.regions.RegionLocationComponent; import org.terasology.scenario.internal.events.RegionTreeFullAddEvent; +import org.terasology.world.block.BlockRegion; import java.util.Iterator; @@ -80,7 +80,7 @@ public void onAttackEntity(AttackEvent event, EntityRef targetEntity, org.teraso if (editedRegion.getComponent(RegionBeingCreatedComponent.class).creatingEntity.equals(event.getInstigator())) { if (event.getDirectCause().getParentPrefab() != null && event.getDirectCause().getParentPrefab().equals(assetManager.getAsset("scenario:hubtool", Prefab.class).get())) { RegionBeingCreatedComponent create = editedRegion.getComponent(RegionBeingCreatedComponent.class); - Vector3i pos = blockComponent.getPosition(); + Vector3i pos = blockComponent.getPosition(new Vector3i()); if (create.firstHit == null) { create.firstHit = pos; @@ -90,7 +90,7 @@ public void onAttackEntity(AttackEvent event, EntityRef targetEntity, org.teraso } else { if (!pos.equals(create.firstHit)) { RegionLocationComponent loc = editedRegion.getComponent(RegionLocationComponent.class); - loc.region = Region3i.createBounded(pos, create.firstHit); + loc.region = new BlockRegion(pos).union(create.firstHit); editedRegion.saveComponent(loc); editedRegion.removeComponent(RegionBeingCreatedComponent.class); if (entityManager.getEntitiesWith(ScenarioComponent.class).iterator().hasNext()) { diff --git a/src/main/java/org/terasology/scenario/internal/systems/RegionTreeSystem.java b/src/main/java/org/terasology/scenario/internal/systems/RegionTreeSystem.java index e47d326..6eb6d97 100644 --- a/src/main/java/org/terasology/scenario/internal/systems/RegionTreeSystem.java +++ b/src/main/java/org/terasology/scenario/internal/systems/RegionTreeSystem.java @@ -16,6 +16,7 @@ package org.terasology.scenario.internal.systems; import com.google.common.collect.Lists; +import org.joml.Vector3f; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.terasology.assets.management.AssetManager; @@ -30,11 +31,10 @@ import org.terasology.logic.chat.ChatMessageEvent; import org.terasology.logic.common.DisplayNameComponent; import org.terasology.math.JomlUtil; -import org.terasology.math.Region3i; import org.terasology.network.ClientComponent; import org.terasology.network.ColorComponent; -import org.terasology.registry.In; import org.terasology.nui.Color; +import org.terasology.registry.In; import org.terasology.scenario.components.ScenarioComponent; import org.terasology.scenario.components.ScenarioHubToolUpdateComponent; import org.terasology.scenario.components.ScenarioRegionVisibilityComponent; @@ -81,7 +81,8 @@ public class RegionTreeSystem extends BaseComponentSystem { @Override public void postBegin() { - Iterable scenario = entityManager.getEntitiesWith(ScenarioComponent.class); // Checks for existing Scenario + // Checks for existing scenarios + Iterable scenario = entityManager.getEntitiesWith(ScenarioComponent.class); if (!scenario.iterator().hasNext()) { //No scenario exists yet scenarioEntity = entityManager.create(assetManager.getAsset("scenario:scenarioEntity", Prefab.class).get()); @@ -89,7 +90,8 @@ public void postBegin() { scenarioEntity = scenario.iterator().next(); } - chatMessageEntity = entityManager.create(assetManager.getAsset("scenario:scenarioChatEntity", Prefab.class).get()); + chatMessageEntity = + entityManager.create(assetManager.getAsset("scenario:scenarioChatEntity", Prefab.class).get()); chatMessageEntity.getComponent(DisplayNameComponent.class).name = "Scenario System"; chatMessageEntity.saveComponent(chatMessageEntity.getComponent(DisplayNameComponent.class)); chatMessageEntity.getComponent(ColorComponent.class).color = Color.RED; @@ -97,14 +99,17 @@ public void postBegin() { } @ReceiveEvent - public void onRegionTeleportationRequestEvent(RegionTeleportationRequestEvent event, EntityRef entity, ScenarioHubToolUpdateComponent component) { - org.terasology.math.geom.Vector3f location = event.getRequestedRegion().getComponent(RegionLocationComponent.class).region.center(); - CharacterTeleportEvent tele = new CharacterTeleportEvent(JomlUtil.from(location)); + public void onRegionTeleportationRequestEvent(RegionTeleportationRequestEvent event, EntityRef entity, + ScenarioHubToolUpdateComponent component) { + Vector3f location = + event.getRequestedRegion().getComponent(RegionLocationComponent.class).region.center(new Vector3f()); + CharacterTeleportEvent tele = new CharacterTeleportEvent(location); event.getTeleportedEntity().send(tele); } @ReceiveEvent - public void onRegionTreeAddEvent(RegionTreeAddEvent event, EntityRef entity, ScenarioHubToolUpdateComponent component) { + public void onRegionTreeAddEvent(RegionTreeAddEvent event, EntityRef entity, + ScenarioHubToolUpdateComponent component) { //Makes sure only one region is being created by a person at a time for (EntityRef e : entityManager.getEntitiesWith(RegionBeingCreatedComponent.class)) { @@ -113,16 +118,19 @@ public void onRegionTreeAddEvent(RegionTreeAddEvent event, EntityRef entity, Sce } } - event.getCreatingEntity().getOwner().send(new ChatMessageEvent("To begin creation of a region left click a block with a hubtool", chatMessageEntity)); + event.getCreatingEntity().getOwner().send(new ChatMessageEvent("To begin creation of a region left click a " + + "block with a hubtool", chatMessageEntity)); - EntityRef newRegion = entityManager.create(assetManager.getAsset("scenario:scenarioCreationEntity", Prefab.class).get()); + EntityRef newRegion = entityManager.create(assetManager.getAsset("scenario:scenarioCreationEntity", + Prefab.class).get()); newRegion.getComponent(RegionBeingCreatedComponent.class).creatingEntity = event.getCreatingEntity(); newRegion.saveComponent(newRegion.getComponent(RegionBeingCreatedComponent.class)); } @ReceiveEvent - public void onRegionTreeDeleteEvent(RegionTreeDeleteEvent event, EntityRef entity, ScenarioHubToolUpdateComponent component) { + public void onRegionTreeDeleteEvent(RegionTreeDeleteEvent event, EntityRef entity, + ScenarioHubToolUpdateComponent component) { scenarioEntity.getComponent(ScenarioComponent.class).regionEntities.remove(event.getDeleteEntity()); scenarioEntity.saveComponent(scenarioEntity.getComponent(ScenarioComponent.class)); @@ -143,7 +151,8 @@ public void onRegionTreeDeleteEvent(RegionTreeDeleteEvent event, EntityRef entit } @ReceiveEvent - public void onRegionTreeMoveEntityEvent(RegionTreeMoveEntityEvent event, EntityRef entity, ScenarioHubToolUpdateComponent component) { + public void onRegionTreeMoveEntityEvent(RegionTreeMoveEntityEvent event, EntityRef entity, + ScenarioHubToolUpdateComponent component) { List list = scenarioEntity.getComponent(ScenarioComponent.class).regionEntities; int startIndex = list.indexOf(event.getMoveEntity()); @@ -179,7 +188,8 @@ public void onRegionTreeFullAddEvent(RegionTreeFullAddEvent event, EntityRef ent } @ReceiveEvent - public void onRegionRenameEvent(RegionRenameEvent event, EntityRef entity, ScenarioHubToolUpdateComponent component) { + public void onRegionRenameEvent(RegionRenameEvent event, EntityRef entity, + ScenarioHubToolUpdateComponent component) { event.getRegionEntity().getComponent(RegionNameComponent.class).regionName = event.getNewName(); event.getRegionEntity().saveComponent(event.getRegionEntity().getComponent(RegionNameComponent.class)); @@ -194,7 +204,8 @@ public void onRegionRenameEvent(RegionRenameEvent event, EntityRef entity, Scena } @ReceiveEvent - public void onRegionRecolorEvent(RegionRecolorEvent event, EntityRef entity, ScenarioHubToolUpdateComponent component) { + public void onRegionRecolorEvent(RegionRecolorEvent event, EntityRef entity, + ScenarioHubToolUpdateComponent component) { event.getRegionEntity().getComponent(RegionColorComponent.class).color = event.getNewColor(); event.getRegionEntity().saveComponent(event.getRegionEntity().getComponent(RegionColorComponent.class)); @@ -209,12 +220,13 @@ public void onRegionRecolorEvent(RegionRecolorEvent event, EntityRef entity, Sce } @ReceiveEvent - public void onRegionProtectEvent(RegionProtectEvent event, EntityRef entity, ScenarioHubToolUpdateComponent component) { + public void onRegionProtectEvent(RegionProtectEvent event, EntityRef entity, + ScenarioHubToolUpdateComponent component) { event.getRegionEntity().removeComponent(ProtectedRegionsComponent.class); if (event.isProtected()) { ProtectedRegionsComponent protectedRegionsComponent = new ProtectedRegionsComponent(); List absoluteRegions = Lists.newArrayList(); - absoluteRegions.add(JomlUtil.from(event.getRegionEntity().getComponent(RegionLocationComponent.class).region)); + absoluteRegions.add(event.getRegionEntity().getComponent(RegionLocationComponent.class).region); protectedRegionsComponent.regions = absoluteRegions; event.getRegionEntity().addComponent(protectedRegionsComponent); } @@ -226,9 +238,11 @@ public void onRegionProtectEvent(RegionProtectEvent event, EntityRef entity, Sce } @ReceiveEvent - public void onRegionResizeEvent(RegionResizeEvent event, EntityRef entity, ScenarioHubToolUpdateComponent component) { - RegionLocationComponent regionLocationComponent = event.getRegionEntity().getComponent(RegionLocationComponent.class); - regionLocationComponent.region = event.getRegion(); + public void onRegionResizeEvent(RegionResizeEvent event, EntityRef entity, + ScenarioHubToolUpdateComponent component) { + RegionLocationComponent regionLocationComponent = + event.getRegionEntity().getComponent(RegionLocationComponent.class); + regionLocationComponent.region = JomlUtil.from(event.getRegion()); event.getRegionEntity().saveComponent(regionLocationComponent); scenarioEntity.saveComponent(scenarioEntity.getComponent(ScenarioComponent.class)); diff --git a/src/main/java/org/terasology/scenario/internal/systems/ScenarioRootManagementSystem.java b/src/main/java/org/terasology/scenario/internal/systems/ScenarioRootManagementSystem.java index b03b4a1..50bab4f 100644 --- a/src/main/java/org/terasology/scenario/internal/systems/ScenarioRootManagementSystem.java +++ b/src/main/java/org/terasology/scenario/internal/systems/ScenarioRootManagementSystem.java @@ -1,146 +1,144 @@ -/* - * Copyright 2017 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. - */ -package org.terasology.scenario.internal.systems; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.terasology.entitySystem.entity.EntityManager; -import org.terasology.entitySystem.entity.EntityRef; -import org.terasology.entitySystem.event.ReceiveEvent; -import org.terasology.entitySystem.systems.BaseComponentSystem; -import org.terasology.entitySystem.systems.RegisterMode; -import org.terasology.entitySystem.systems.RegisterSystem; -import org.terasology.registry.In; -import org.terasology.scenario.components.ScenarioComponent; -import org.terasology.scenario.components.TriggerActionListComponent; -import org.terasology.scenario.components.TriggerConditionListComponent; -import org.terasology.scenario.components.ScenarioArgumentContainerComponent; -import org.terasology.scenario.components.events.ScenarioSecondaryBlockDestroyComponent; -import org.terasology.scenario.components.events.ScenarioSecondaryEnterRegionComponent; -import org.terasology.scenario.components.events.ScenarioSecondaryLeaveRegionComponent; -import org.terasology.scenario.components.events.ScenarioSecondaryRespawnComponent; -import org.terasology.scenario.components.events.ScenarioSecondarySpawnComponent; -import org.terasology.scenario.components.events.triggerInformation.InfoDestroyedBlockComponent; -import org.terasology.scenario.components.events.triggerInformation.InfoTriggerRegionComponent; -import org.terasology.scenario.components.events.triggerInformation.InfoTriggeringEntityComponent; -import org.terasology.scenario.internal.events.EventTriggerEvent; -import org.terasology.scenario.internal.events.evaluationEvents.ConditionalCheckEvent; -import org.terasology.scenario.internal.events.evaluationEvents.EvaluateRegionEvent; -import org.terasology.scenario.internal.events.scenarioEvents.DoDestroyScenarioEvent; -import org.terasology.scenario.internal.events.scenarioEvents.PlayerEnterRegionEvent; -import org.terasology.scenario.internal.events.scenarioEvents.PlayerLeaveRegionEvent; -import org.terasology.scenario.internal.events.scenarioEvents.PlayerRespawnScenarioEvent; -import org.terasology.scenario.internal.events.scenarioEvents.PlayerSpawnScenarioEvent; - -/** - * System that relays game events into scenario events and sends them using a filled up information entity that contains information of the trigger - * which could include who the triggering entity or region is, or block details for breaking the block, etc - * - * First checks any conditionals with a {@link ConditionalCheckEvent} and if the conditional is satisfies it - * Will send {@link EventTriggerEvent} to the attached list of actions, technically in the order of the actions on the hubtool - */ -@RegisterSystem(RegisterMode.AUTHORITY) -public class ScenarioRootManagementSystem extends BaseComponentSystem { - @In - EntityManager entityManager; - - private Logger logger = LoggerFactory.getLogger(ScenarioRootManagementSystem.class); - - - - @ReceiveEvent - public void onEventTrigger(EventTriggerEvent event, EntityRef entity, TriggerActionListComponent actions) { - //Check Condition - for(EntityRef c : entity.getComponent(TriggerConditionListComponent.class).conditions) { - ConditionalCheckEvent cond = new ConditionalCheckEvent(event.informationEntity); - c.send(cond); - if (!cond.getResult()){ - return; //Break check if any conditional is registered as false - } - } - //Send to actions - for(EntityRef a : actions.actions) { - //Send new event in case eventually a new event needs to be made in which triggers and actions need different data - a.send(new EventTriggerEvent(event.informationEntity)); - } - } - - - @ReceiveEvent - public void onPlayerRespawnScenarioEvent(PlayerRespawnScenarioEvent event, EntityRef entity, ScenarioComponent component) { - Iterable entityList = entityManager.getEntitiesWith(ScenarioSecondaryRespawnComponent.class); - InfoTriggeringEntityComponent triggerEntity = new InfoTriggeringEntityComponent(); - triggerEntity.entity = event.getSpawningEntity(); - EntityRef passEntity = entityManager.create(triggerEntity); - entityList.forEach(e -> e.getOwner().send(new EventTriggerEvent(passEntity))); - } - - @ReceiveEvent - public void onPlayerSpawnScenarioEvent(PlayerSpawnScenarioEvent event, EntityRef entity, ScenarioComponent component) { - Iterable entityList = entityManager.getEntitiesWith(ScenarioSecondarySpawnComponent.class); - InfoTriggeringEntityComponent triggerEntity = new InfoTriggeringEntityComponent(); - triggerEntity.entity = event.getSpawningEntity(); - EntityRef passEntity = entityManager.create(triggerEntity); - entityList.forEach(e -> e.getOwner().send(new EventTriggerEvent(passEntity))); - } - - @ReceiveEvent - public void onDoDestroyScenarioEvent(DoDestroyScenarioEvent event, EntityRef entity, ScenarioComponent component) { - Iterable entityList = entityManager.getEntitiesWith(ScenarioSecondaryBlockDestroyComponent.class); - InfoTriggeringEntityComponent triggerEntity = new InfoTriggeringEntityComponent(); - triggerEntity.entity = event.getInstigator(); - InfoDestroyedBlockComponent destroyed = new InfoDestroyedBlockComponent(); - destroyed.damageType = event.getDamageType(); - destroyed.destroyedBlock = event.getDestroyed(); - destroyed.directCause = event.getDirectCause(); - EntityRef passEntity = entityManager.create(triggerEntity, destroyed); - entityList.forEach(e -> e.getOwner().send(new EventTriggerEvent(passEntity))); - } - - @ReceiveEvent - public void onPlayerEnterRegionEvent(PlayerEnterRegionEvent event, EntityRef entity, ScenarioComponent component) { - Iterable entityList = entityManager.getEntitiesWith(ScenarioSecondaryEnterRegionComponent.class); - InfoTriggeringEntityComponent triggerEntity = new InfoTriggeringEntityComponent(); - triggerEntity.entity = event.getTriggerEntity(); - InfoTriggerRegionComponent triggerRegion = new InfoTriggerRegionComponent(); - triggerRegion.region = event.getRegion(); - EntityRef passEntity = entityManager.create(triggerEntity, triggerRegion); - entityList.forEach(e -> { - EvaluateRegionEvent reg = new EvaluateRegionEvent(passEntity); - e.getComponent(ScenarioArgumentContainerComponent.class).arguments.get("region").send(reg); - if (reg.getResult().equals(event.getRegion())) { - e.getOwner().send(new EventTriggerEvent(passEntity)); - } - }); - } - - @ReceiveEvent - public void onPlayerLeaveRegionEvent(PlayerLeaveRegionEvent event, EntityRef entity, ScenarioComponent component) { - Iterable entityList = entityManager.getEntitiesWith(ScenarioSecondaryLeaveRegionComponent.class); - InfoTriggeringEntityComponent triggerEntity = new InfoTriggeringEntityComponent(); - triggerEntity.entity = event.getTriggerEntity(); - InfoTriggerRegionComponent triggerRegion = new InfoTriggerRegionComponent(); - triggerRegion.region = event.getRegion(); - EntityRef passEntity = entityManager.create(triggerEntity, triggerRegion); - entityList.forEach(e -> { - EvaluateRegionEvent reg = new EvaluateRegionEvent(passEntity); - e.getComponent(ScenarioArgumentContainerComponent.class).arguments.get("region").send(reg); - if (reg.getResult().equals(event.getRegion())) { - e.getOwner().send(new EventTriggerEvent(passEntity)); - } - }); - } -} +/* + * Copyright 2017 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. + */ +package org.terasology.scenario.internal.systems; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.terasology.entitySystem.entity.EntityManager; +import org.terasology.entitySystem.entity.EntityRef; +import org.terasology.entitySystem.event.ReceiveEvent; +import org.terasology.entitySystem.systems.BaseComponentSystem; +import org.terasology.entitySystem.systems.RegisterMode; +import org.terasology.entitySystem.systems.RegisterSystem; +import org.terasology.registry.In; +import org.terasology.scenario.components.ScenarioComponent; +import org.terasology.scenario.components.TriggerActionListComponent; +import org.terasology.scenario.components.TriggerConditionListComponent; +import org.terasology.scenario.components.ScenarioArgumentContainerComponent; +import org.terasology.scenario.components.events.ScenarioSecondaryBlockDestroyComponent; +import org.terasology.scenario.components.events.ScenarioSecondaryEnterRegionComponent; +import org.terasology.scenario.components.events.ScenarioSecondaryLeaveRegionComponent; +import org.terasology.scenario.components.events.ScenarioSecondaryRespawnComponent; +import org.terasology.scenario.components.events.ScenarioSecondarySpawnComponent; +import org.terasology.scenario.components.events.triggerInformation.InfoDestroyedBlockComponent; +import org.terasology.scenario.components.events.triggerInformation.InfoTriggerRegionComponent; +import org.terasology.scenario.components.events.triggerInformation.InfoTriggeringEntityComponent; +import org.terasology.scenario.internal.events.EventTriggerEvent; +import org.terasology.scenario.internal.events.evaluationEvents.ConditionalCheckEvent; +import org.terasology.scenario.internal.events.evaluationEvents.EvaluateRegionEvent; +import org.terasology.scenario.internal.events.scenarioEvents.DoDestroyScenarioEvent; +import org.terasology.scenario.internal.events.scenarioEvents.PlayerEnterRegionEvent; +import org.terasology.scenario.internal.events.scenarioEvents.PlayerLeaveRegionEvent; +import org.terasology.scenario.internal.events.scenarioEvents.PlayerRespawnScenarioEvent; +import org.terasology.scenario.internal.events.scenarioEvents.PlayerSpawnScenarioEvent; + +/** + * System that relays game events into scenario events and sends them using a filled up information entity that contains information of the trigger + * which could include who the triggering entity or region is, or block details for breaking the block, etc + * + * First checks any conditionals with a {@link ConditionalCheckEvent} and if the conditional is satisfies it + * Will send {@link EventTriggerEvent} to the attached list of actions, technically in the order of the actions on the hubtool + */ +@RegisterSystem(RegisterMode.AUTHORITY) +public class ScenarioRootManagementSystem extends BaseComponentSystem { + @In + EntityManager entityManager; + + private Logger logger = LoggerFactory.getLogger(ScenarioRootManagementSystem.class); + + @ReceiveEvent + public void onEventTrigger(EventTriggerEvent event, EntityRef entity, TriggerActionListComponent actions) { + //Check Condition + for (EntityRef c : entity.getComponent(TriggerConditionListComponent.class).conditions) { + ConditionalCheckEvent cond = new ConditionalCheckEvent(event.informationEntity); + c.send(cond); + if (!cond.getResult()) { + return; //Break check if any conditional is registered as false + } + } + //Send to actions + for (EntityRef a : actions.actions) { + //Send new event in case eventually a new event needs to be made in which triggers and actions need different data + a.send(new EventTriggerEvent(event.informationEntity)); + } + } + + + @ReceiveEvent + public void onPlayerRespawnScenarioEvent(PlayerRespawnScenarioEvent event, EntityRef entity, ScenarioComponent component) { + Iterable entityList = entityManager.getEntitiesWith(ScenarioSecondaryRespawnComponent.class); + InfoTriggeringEntityComponent triggerEntity = new InfoTriggeringEntityComponent(); + triggerEntity.entity = event.getSpawningEntity(); + EntityRef passEntity = entityManager.create(triggerEntity); + entityList.forEach(e -> e.getOwner().send(new EventTriggerEvent(passEntity))); + } + + @ReceiveEvent + public void onPlayerSpawnScenarioEvent(PlayerSpawnScenarioEvent event, EntityRef entity, ScenarioComponent component) { + Iterable entityList = entityManager.getEntitiesWith(ScenarioSecondarySpawnComponent.class); + InfoTriggeringEntityComponent triggerEntity = new InfoTriggeringEntityComponent(); + triggerEntity.entity = event.getSpawningEntity(); + EntityRef passEntity = entityManager.create(triggerEntity); + entityList.forEach(e -> e.getOwner().send(new EventTriggerEvent(passEntity))); + } + + @ReceiveEvent + public void onDoDestroyScenarioEvent(DoDestroyScenarioEvent event, EntityRef entity, ScenarioComponent component) { + Iterable entityList = entityManager.getEntitiesWith(ScenarioSecondaryBlockDestroyComponent.class); + InfoTriggeringEntityComponent triggerEntity = new InfoTriggeringEntityComponent(); + triggerEntity.entity = event.getInstigator(); + InfoDestroyedBlockComponent destroyed = new InfoDestroyedBlockComponent(); + destroyed.damageType = event.getDamageType(); + destroyed.destroyedBlock = event.getDestroyed(); + destroyed.directCause = event.getDirectCause(); + EntityRef passEntity = entityManager.create(triggerEntity, destroyed); + entityList.forEach(e -> e.getOwner().send(new EventTriggerEvent(passEntity))); + } + + @ReceiveEvent + public void onPlayerEnterRegionEvent(PlayerEnterRegionEvent event, EntityRef entity, ScenarioComponent component) { + Iterable entityList = entityManager.getEntitiesWith(ScenarioSecondaryEnterRegionComponent.class); + InfoTriggeringEntityComponent triggerEntity = new InfoTriggeringEntityComponent(); + triggerEntity.entity = event.getTriggerEntity(); + InfoTriggerRegionComponent triggerRegion = new InfoTriggerRegionComponent(); + triggerRegion.region = event.getRegion(); + EntityRef passEntity = entityManager.create(triggerEntity, triggerRegion); + entityList.forEach(e -> { + EvaluateRegionEvent reg = new EvaluateRegionEvent(passEntity); + e.getComponent(ScenarioArgumentContainerComponent.class).arguments.get("region").send(reg); + if (reg.getResult().equals(event.getRegion())) { + e.getOwner().send(new EventTriggerEvent(passEntity)); + } + }); + } + + @ReceiveEvent + public void onPlayerLeaveRegionEvent(PlayerLeaveRegionEvent event, EntityRef entity, ScenarioComponent component) { + Iterable entityList = entityManager.getEntitiesWith(ScenarioSecondaryLeaveRegionComponent.class); + InfoTriggeringEntityComponent triggerEntity = new InfoTriggeringEntityComponent(); + triggerEntity.entity = event.getTriggerEntity(); + InfoTriggerRegionComponent triggerRegion = new InfoTriggerRegionComponent(); + triggerRegion.region = event.getRegion(); + EntityRef passEntity = entityManager.create(triggerEntity, triggerRegion); + entityList.forEach(e -> { + EvaluateRegionEvent reg = new EvaluateRegionEvent(passEntity); + e.getComponent(ScenarioArgumentContainerComponent.class).arguments.get("region").send(reg); + if (reg.getResult().equals(event.getRegion())) { + e.getOwner().send(new EventTriggerEvent(passEntity)); + } + }); + } +} diff --git a/src/main/java/org/terasology/scenario/internal/ui/EditRegionScreen.java b/src/main/java/org/terasology/scenario/internal/ui/EditRegionScreen.java index 13bf554..997a05c 100644 --- a/src/main/java/org/terasology/scenario/internal/ui/EditRegionScreen.java +++ b/src/main/java/org/terasology/scenario/internal/ui/EditRegionScreen.java @@ -50,6 +50,7 @@ import org.terasology.scenario.internal.utilities.CieCamColorsScenario; import org.terasology.structureTemplates.components.ProtectedRegionsComponent; import org.terasology.utilities.Assets; +import org.terasology.world.block.BlockRegion; import java.math.RoundingMode; import java.util.List; @@ -127,14 +128,14 @@ public void setupDisplay(EntityRef entity, HubToolScreen returnScreen) { visiblity.setChecked(returnScreen.getEntity().getOwner().getComponent(ScenarioRegionVisibilityComponent.class).visibleList.contains(entity)); protectedRegion.setChecked(entity.hasComponent(ProtectedRegionsComponent.class)); - Region3i region = entity.getComponent(RegionLocationComponent.class).region; + BlockRegion region = entity.getComponent(RegionLocationComponent.class).region; minXField.setText(Integer.toString(region.minX())); minYField.setText(Integer.toString(region.minY())); minZField.setText(Integer.toString(region.minZ())); - sizeXField.setText(Integer.toString(region.sizeX())); - sizeYField.setText(Integer.toString(region.sizeY())); - sizeZField.setText(Integer.toString(region.sizeZ())); + sizeXField.setText(Integer.toString(region.getSizeX())); + sizeYField.setText(Integer.toString(region.getSizeY())); + sizeZField.setText(Integer.toString(region.getSizeZ())); if (colorSlider != null) { Color color = entity.getComponent(RegionColorComponent.class).color;