From a5d6d13672aa81565e109c1e3a4741b09ee74588 Mon Sep 17 00:00:00 2001 From: Josephine Rueckert Date: Mon, 15 Aug 2022 22:49:01 +0200 Subject: [PATCH 1/8] feat: make ChangingBlocks case insensitive via SimpleUri - before this PR, a prefab specifying the `ChangingBlocks` component had to make sure that the keys in the `blockFamilyStages` map match the string representation of the respective `BlockUri`s including case example for a mismatch: `PlantPack:Corn1` (as referenced in `PlantPack:Corn.prefab`) != `PlantPack:corn1` (in-game `BlockUri` of `PlantPack:Corn1.block`) - by sanitizing the reference in the `ChangingBlocks` component via the `SimpleUriTypeHandler` and comparing it with the `SimpleUri` derived from the in-game `BlockUri`, the logic becomes case insensitive --- .../changingBlocks/ChangingBlocksComponent.java | 3 ++- .../changingBlocks/ChangingBlocksSystem.java | 11 ++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/terasology/changingBlocks/ChangingBlocksComponent.java b/src/main/java/org/terasology/changingBlocks/ChangingBlocksComponent.java index 957f0d0..17acc5c 100644 --- a/src/main/java/org/terasology/changingBlocks/ChangingBlocksComponent.java +++ b/src/main/java/org/terasology/changingBlocks/ChangingBlocksComponent.java @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 package org.terasology.changingBlocks; +import org.terasology.engine.core.SimpleUri; import org.terasology.engine.world.block.ForceBlockActive; import org.terasology.gestalt.entitysystem.component.Component; @@ -17,7 +18,7 @@ public final class ChangingBlocksComponent implements Component blockFamilyStages; + public Map blockFamilyStages; // internal: used to determine time to next block change public long timeInGameMsToNextStage; diff --git a/src/main/java/org/terasology/changingBlocks/ChangingBlocksSystem.java b/src/main/java/org/terasology/changingBlocks/ChangingBlocksSystem.java index cb82277..f6064ca 100644 --- a/src/main/java/org/terasology/changingBlocks/ChangingBlocksSystem.java +++ b/src/main/java/org/terasology/changingBlocks/ChangingBlocksSystem.java @@ -18,6 +18,7 @@ import org.joml.RoundingMode; import org.joml.Vector3f; import org.joml.Vector3i; +import org.terasology.engine.core.SimpleUri; import org.terasology.engine.core.Time; import org.terasology.engine.entitySystem.entity.EntityManager; import org.terasology.engine.entitySystem.entity.EntityRef; @@ -63,7 +64,7 @@ public void onSpawn(OnAddedComponent event, EntityRef entity) { ChangingBlocksComponent changingBlocks = entity.getComponent(ChangingBlocksComponent.class); LocationComponent locComponent = entity.getComponent(LocationComponent.class); Block currentBlock = worldprovider.getBlock(locComponent.getWorldPosition(new Vector3f())); - String currentBlockFamilyStage = currentBlock.getURI().toString(); + SimpleUri currentBlockFamilyStage = new SimpleUri(currentBlock.getURI().getModuleName(), currentBlock.getURI().getIdentifier()); changingBlocks.timeInGameMsToNextStage = changingBlocks.blockFamilyStages.get(currentBlockFamilyStage); changingBlocks.lastGameTimeCheck = initTime; entity.saveComponent(changingBlocks); @@ -94,8 +95,8 @@ public void update(float delta) { LocationComponent locComponent = changingBlocks.getComponent(LocationComponent.class); Block currentBlock = worldprovider.getBlock(locComponent.getWorldPosition(new Vector3f())); String currentBlockFamilyStage = currentBlock.getURI().toString(); - Set keySet = blockAnimation.blockFamilyStages.keySet(); - List keyList = new ArrayList<>(keySet); + Set keySet = blockAnimation.blockFamilyStages.keySet(); + List keyList = new ArrayList<>(keySet); int currentstageIndex = keyList.indexOf(currentBlockFamilyStage); int lastStageIndex = blockAnimation.blockFamilyStages.size() - 1; if (lastStageIndex > currentstageIndex) { @@ -108,8 +109,8 @@ public void update(float delta) { changingBlocks.send(new OnBlockSequenceComplete()); } } - String newBlockUri = keyList.get(currentstageIndex); - Block newBlock = blockManager.getBlock(newBlockUri); + SimpleUri newBlockUri = keyList.get(currentstageIndex); + Block newBlock = blockManager.getBlock(newBlockUri.toString()); if (newBlockUri.equals(newBlock.getURI().toString())) { worldprovider.setBlock(new Vector3i(locComponent.getWorldPosition(new Vector3f()), RoundingMode.FLOOR), newBlock); blockAnimation.timeInGameMsToNextStage = blockAnimation.blockFamilyStages.get(currentBlockFamilyStage); From 765e649024c549281015f961b26fae19fa8b7a2a Mon Sep 17 00:00:00 2001 From: Josephine Rueckert Date: Mon, 15 Aug 2022 23:37:34 +0200 Subject: [PATCH 2/8] chore: update copyright --- .../changingBlocks/OnBlockSequenceComplete.java | 17 ++--------------- .../conditional/BlockCondition.java | 17 ++--------------- .../ChangeBlockBlockDirectedComponent.java | 2 +- .../ChangeBlockBlockNearbyComponent.java | 2 +- .../ChangeBlockEntityDirectedComponent.java | 2 +- .../ChangeBlockEntityNearbyComponent.java | 2 +- .../ConditionalBlockChangeComponent.java | 2 +- 7 files changed, 9 insertions(+), 35 deletions(-) diff --git a/src/main/java/org/terasology/changingBlocks/OnBlockSequenceComplete.java b/src/main/java/org/terasology/changingBlocks/OnBlockSequenceComplete.java index 4298310..9d7aaa0 100644 --- a/src/main/java/org/terasology/changingBlocks/OnBlockSequenceComplete.java +++ b/src/main/java/org/terasology/changingBlocks/OnBlockSequenceComplete.java @@ -1,18 +1,5 @@ -/* - * Copyright 2013 MovingBlocks - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Copyright 2022 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 package org.terasology.changingBlocks; import org.terasology.engine.entitySystem.event.AbstractConsumableEvent; diff --git a/src/main/java/org/terasology/changingBlocks/conditional/BlockCondition.java b/src/main/java/org/terasology/changingBlocks/conditional/BlockCondition.java index 96e1c8a..03192fc 100644 --- a/src/main/java/org/terasology/changingBlocks/conditional/BlockCondition.java +++ b/src/main/java/org/terasology/changingBlocks/conditional/BlockCondition.java @@ -1,18 +1,5 @@ -/* - * Copyright 2019 MovingBlocks - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Copyright 2022 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 package org.terasology.changingBlocks.conditional; import org.terasology.engine.math.Side; diff --git a/src/main/java/org/terasology/changingBlocks/conditional/components/ChangeBlockBlockDirectedComponent.java b/src/main/java/org/terasology/changingBlocks/conditional/components/ChangeBlockBlockDirectedComponent.java index 8731c81..4ee1287 100644 --- a/src/main/java/org/terasology/changingBlocks/conditional/components/ChangeBlockBlockDirectedComponent.java +++ b/src/main/java/org/terasology/changingBlocks/conditional/components/ChangeBlockBlockDirectedComponent.java @@ -1,4 +1,4 @@ -// Copyright 2021 The Terasology Foundation +// Copyright 2022 The Terasology Foundation // SPDX-License-Identifier: Apache-2.0 package org.terasology.changingBlocks.conditional.components; diff --git a/src/main/java/org/terasology/changingBlocks/conditional/components/ChangeBlockBlockNearbyComponent.java b/src/main/java/org/terasology/changingBlocks/conditional/components/ChangeBlockBlockNearbyComponent.java index 946fe50..b2bb498 100644 --- a/src/main/java/org/terasology/changingBlocks/conditional/components/ChangeBlockBlockNearbyComponent.java +++ b/src/main/java/org/terasology/changingBlocks/conditional/components/ChangeBlockBlockNearbyComponent.java @@ -1,4 +1,4 @@ -// Copyright 2021 The Terasology Foundation +// Copyright 2022 The Terasology Foundation // SPDX-License-Identifier: Apache-2.0 package org.terasology.changingBlocks.conditional.components; diff --git a/src/main/java/org/terasology/changingBlocks/conditional/components/ChangeBlockEntityDirectedComponent.java b/src/main/java/org/terasology/changingBlocks/conditional/components/ChangeBlockEntityDirectedComponent.java index a8f4b65..bba10dc 100644 --- a/src/main/java/org/terasology/changingBlocks/conditional/components/ChangeBlockEntityDirectedComponent.java +++ b/src/main/java/org/terasology/changingBlocks/conditional/components/ChangeBlockEntityDirectedComponent.java @@ -1,4 +1,4 @@ -// Copyright 2021 The Terasology Foundation +// Copyright 2022 The Terasology Foundation // SPDX-License-Identifier: Apache-2.0 package org.terasology.changingBlocks.conditional.components; diff --git a/src/main/java/org/terasology/changingBlocks/conditional/components/ChangeBlockEntityNearbyComponent.java b/src/main/java/org/terasology/changingBlocks/conditional/components/ChangeBlockEntityNearbyComponent.java index 55c9a6c..9bc8136 100644 --- a/src/main/java/org/terasology/changingBlocks/conditional/components/ChangeBlockEntityNearbyComponent.java +++ b/src/main/java/org/terasology/changingBlocks/conditional/components/ChangeBlockEntityNearbyComponent.java @@ -1,4 +1,4 @@ -// Copyright 2021 The Terasology Foundation +// Copyright 2022 The Terasology Foundation // SPDX-License-Identifier: Apache-2.0 package org.terasology.changingBlocks.conditional.components; diff --git a/src/main/java/org/terasology/changingBlocks/conditional/components/ConditionalBlockChangeComponent.java b/src/main/java/org/terasology/changingBlocks/conditional/components/ConditionalBlockChangeComponent.java index 1ec9ddb..5d685b3 100644 --- a/src/main/java/org/terasology/changingBlocks/conditional/components/ConditionalBlockChangeComponent.java +++ b/src/main/java/org/terasology/changingBlocks/conditional/components/ConditionalBlockChangeComponent.java @@ -1,4 +1,4 @@ -// Copyright 2021 The Terasology Foundation +// Copyright 2022 The Terasology Foundation // SPDX-License-Identifier: Apache-2.0 package org.terasology.changingBlocks.conditional.components; From 2297a317f6cbe8fb067d282f0d2a3862d3cc7ec1 Mon Sep 17 00:00:00 2001 From: Josephine Rueckert Date: Mon, 15 Aug 2022 23:38:11 +0200 Subject: [PATCH 3/8] chore: fix checkstyle findings - line length - missing whitespaces - copyright updates --- .../ChangingBlocksComponent.java | 4 +-- .../changingBlocks/ChangingBlocksSystem.java | 20 +++-------- .../conditional/ConditionalBlocksSystem.java | 36 ++++++++++++------- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/main/java/org/terasology/changingBlocks/ChangingBlocksComponent.java b/src/main/java/org/terasology/changingBlocks/ChangingBlocksComponent.java index 17acc5c..bedabf5 100644 --- a/src/main/java/org/terasology/changingBlocks/ChangingBlocksComponent.java +++ b/src/main/java/org/terasology/changingBlocks/ChangingBlocksComponent.java @@ -1,4 +1,4 @@ -// Copyright 2021 The Terasology Foundation +// Copyright 2022 The Terasology Foundation // SPDX-License-Identifier: Apache-2.0 package org.terasology.changingBlocks; @@ -31,7 +31,7 @@ public void copyFrom(ChangingBlocksComponent other) { this.loops = other.loops; this.stopped = other.stopped; this.blockFamilyStages.clear(); - other.blockFamilyStages.forEach((k,v) -> this.blockFamilyStages.put(k,v)); + other.blockFamilyStages.forEach((k, v) -> this.blockFamilyStages.put(k, v)); this.timeInGameMsToNextStage = other.timeInGameMsToNextStage; this.lastGameTimeCheck = other.lastGameTimeCheck; } diff --git a/src/main/java/org/terasology/changingBlocks/ChangingBlocksSystem.java b/src/main/java/org/terasology/changingBlocks/ChangingBlocksSystem.java index f6064ca..eb251ae 100644 --- a/src/main/java/org/terasology/changingBlocks/ChangingBlocksSystem.java +++ b/src/main/java/org/terasology/changingBlocks/ChangingBlocksSystem.java @@ -1,18 +1,5 @@ -/* - * Copyright 2015 MovingBlocks - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Copyright 2022 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 package org.terasology.changingBlocks; import org.joml.RoundingMode; @@ -80,7 +67,8 @@ public void update(float delta) { // System last time check is to try to improve performance long gameTimeInMs = timer.getGameTimeInMs(); if (lastCheckTime + CHECK_INTERVAL < gameTimeInMs) { - for (EntityRef changingBlocks : entityManager.getEntitiesWith(ChangingBlocksComponent.class, BlockComponent.class, LocationComponent.class)) { + for (EntityRef changingBlocks : entityManager.getEntitiesWith(ChangingBlocksComponent.class, + BlockComponent.class, LocationComponent.class)) { ChangingBlocksComponent blockAnimation = changingBlocks.getComponent(ChangingBlocksComponent.class); if (blockAnimation.stopped) { return; diff --git a/src/main/java/org/terasology/changingBlocks/conditional/ConditionalBlocksSystem.java b/src/main/java/org/terasology/changingBlocks/conditional/ConditionalBlocksSystem.java index 7239333..2706678 100644 --- a/src/main/java/org/terasology/changingBlocks/conditional/ConditionalBlocksSystem.java +++ b/src/main/java/org/terasology/changingBlocks/conditional/ConditionalBlocksSystem.java @@ -1,4 +1,4 @@ -// Copyright 2020 The Terasology Foundation +// Copyright 2022 The Terasology Foundation // SPDX-License-Identifier: Apache-2.0 package org.terasology.changingBlocks.conditional; @@ -81,11 +81,12 @@ public void registerTrigger(String trigger, EntityRef triggerable, Boolean isBlo triggerCollections.compute( trigger.toLowerCase(), (k, v) -> { - if (v == null) { - v = new ArrayList<>(); + List vCopy = v; + if (vCopy == null) { + vCopy = new ArrayList<>(); } - v.add(triggerable); - return v; + vCopy.add(triggerable); + return vCopy; } ); } @@ -108,7 +109,9 @@ private void checkBlockNearby(EntityRef entity, Vector3fc triggerPosition, Strin if (distance >= change.minDistance && distance <= change.maxDistance) { Vector3f direction = triggerPosition.sub(changeSpot, new Vector3f()); //if the change can occur when obstructed, or otherwise if there is no obstruction - if (change.throughWalls || physics.rayTrace(changeSpot, direction, change.maxDistance, StandardCollisionGroup.WORLD).getEntity() == entity) { + if (change.throughWalls || physics + .rayTrace(changeSpot, direction, change.maxDistance, StandardCollisionGroup.WORLD) + .getEntity() == entity) { //if the random odds are in our favor if (change.chance >= random.nextFloat()) { worldprovider.setBlock(new Vector3i(changeSpot, RoundingMode.FLOOR), blockManager.getBlock(change.targetBlockID)); @@ -140,10 +143,13 @@ private void checkBlockDirected(EntityRef entity, Vector3fc triggerPosition, Str //if the angle is within the change's field of view limit if (direction.angle(new Vector3f(global.direction())) <= change.fieldOfView) { //if the change can occur when obstructed, or otherwise if there is no obstruction - if (change.throughWalls || physics.rayTrace(changeSpot, direction, change.maxDistance, StandardCollisionGroup.WORLD).getEntity() == entity) { + if (change.throughWalls || physics + .rayTrace(changeSpot, direction, change.maxDistance, StandardCollisionGroup.WORLD) + .getEntity() == entity) { //if the random odds are in our favor if (change.chance >= random.nextFloat()) { - worldprovider.setBlock(new Vector3i(changeSpot, RoundingMode.FLOOR), blockManager.getBlock(change.targetBlockID)); + worldprovider.setBlock(new Vector3i(changeSpot, RoundingMode.FLOOR), + blockManager.getBlock(change.targetBlockID)); } } } @@ -168,10 +174,13 @@ private void checkEntityNearby(EntityRef entity, Vector3fc triggerPosition, Stri if (distance >= change.minDistance && distance <= change.maxDistance) { Vector3f direction = triggerPosition.sub(changeSpot, new Vector3f()); //if the change can occur when obstructed, or otherwise if there is no obstruction - if (change.throughWalls || physics.rayTrace(changeSpot, direction, change.maxDistance, StandardCollisionGroup.WORLD).getEntity() == entity) { + if (change.throughWalls || physics + .rayTrace(changeSpot, direction, change.maxDistance, StandardCollisionGroup.WORLD) + .getEntity() == entity) { //if the random odds are in our favor if (change.chance >= random.nextFloat()) { - worldprovider.setBlock(new Vector3i(changeSpot, RoundingMode.FLOOR), blockManager.getBlock(change.targetBlockID)); + worldprovider.setBlock(new Vector3i(changeSpot, RoundingMode.FLOOR), + blockManager.getBlock(change.targetBlockID)); } } } @@ -199,10 +208,13 @@ private void checkEntityDirected(EntityRef entity, Vector3fc triggerPosition, St //if the angle is within the change's field of view limit if (direction.angle(new Vector3f(global.direction())) <= change.fieldOfView) { //if the change can occur when obstructed, or otherwise if there is no obstruction - if (change.throughWalls || physics.rayTrace(changeSpot, direction, change.maxDistance, StandardCollisionGroup.WORLD).getEntity() == entity) { + if (change.throughWalls || physics + .rayTrace(changeSpot, direction, change.maxDistance, StandardCollisionGroup.WORLD) + .getEntity() == entity) { //if the random odds are in our favor if (change.chance >= random.nextFloat()) { - worldprovider.setBlock(new Vector3i(changeSpot, RoundingMode.FLOOR), blockManager.getBlock(change.targetBlockID)); + worldprovider.setBlock(new Vector3i(changeSpot, RoundingMode.FLOOR), + blockManager.getBlock(change.targetBlockID)); } } } From 78fe822c47c16524d7f608ebcaedcc461c2b3249 Mon Sep 17 00:00:00 2001 From: Josephine Rueckert Date: Tue, 16 Aug 2022 00:21:12 +0200 Subject: [PATCH 4/8] chore: align sample component map formatting --- README.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 527bf49..3623515 100644 --- a/README.md +++ b/README.md @@ -9,14 +9,15 @@ When the last block is reached, either loop back to the first one, or send an On Example component to add to a prefab: "ChangingBlocks" : { - "blockFamilyStages" : { - "Crops:Corn1" : 30000, - "Crops:Corn2" : 30000, - "Crops:Corn3" : 30000, - "Crops:Corn4" : 30000, - "Crops:Corn5" : 30000, - "Crops:Corn6" : 30000, - "Crops:Corn7" : 30000 }, + "blockFamilyStages" : [ + { "key": "Crops:Corn1", "value": 30000 }, + { "key": "Crops:Corn2", "value": 30000 }, + { "key": "Crops:Corn3", "value": 30000 }, + { "key": "Crops:Corn4", "value": 30000 }, + { "key": "Crops:Corn5", "value": 30000 }, + { "key": "Crops:Corn6", "value": 30000 }, + { "key": "Crops:Corn7", "value": 30000 } + ], "loops" : false } From 40182c62b6a4f45bce0cc9c4b63ad8d8252ff289 Mon Sep 17 00:00:00 2001 From: Josephine Rueckert Date: Sun, 21 Aug 2022 12:07:29 +0200 Subject: [PATCH 5/8] doc: fix sample prefab indentation --- README.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 3623515..07bcb89 100644 --- a/README.md +++ b/README.md @@ -8,18 +8,18 @@ When the last block is reached, either loop back to the first one, or send an On Example component to add to a prefab: - "ChangingBlocks" : { - "blockFamilyStages" : [ - { "key": "Crops:Corn1", "value": 30000 }, - { "key": "Crops:Corn2", "value": 30000 }, - { "key": "Crops:Corn3", "value": 30000 }, - { "key": "Crops:Corn4", "value": 30000 }, - { "key": "Crops:Corn5", "value": 30000 }, - { "key": "Crops:Corn6", "value": 30000 }, - { "key": "Crops:Corn7", "value": 30000 } - ], - "loops" : false - } + "ChangingBlocks" : { + "blockFamilyStages" : [ + { "key": "Crops:Corn1", "value": 30000 }, + { "key": "Crops:Corn2", "value": 30000 }, + { "key": "Crops:Corn3", "value": 30000 }, + { "key": "Crops:Corn4", "value": 30000 }, + { "key": "Crops:Corn5", "value": 30000 }, + { "key": "Crops:Corn6", "value": 30000 }, + { "key": "Crops:Corn7", "value": 30000 } + ], + "loops" : false + } Example prefab to add to each block: From 61af2687904901df4d7243b8c078a55377e75488 Mon Sep 17 00:00:00 2001 From: Josephine Rueckert Date: Sun, 21 Aug 2022 12:15:24 +0200 Subject: [PATCH 6/8] chore: fix spotbugs findings --- .../org/terasology/changingBlocks/ChangingBlocksSystem.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/terasology/changingBlocks/ChangingBlocksSystem.java b/src/main/java/org/terasology/changingBlocks/ChangingBlocksSystem.java index eb251ae..3c9bbfa 100644 --- a/src/main/java/org/terasology/changingBlocks/ChangingBlocksSystem.java +++ b/src/main/java/org/terasology/changingBlocks/ChangingBlocksSystem.java @@ -82,7 +82,8 @@ public void update(float delta) { blockAnimation.lastGameTimeCheck = timer.getGameTimeInMs(); LocationComponent locComponent = changingBlocks.getComponent(LocationComponent.class); Block currentBlock = worldprovider.getBlock(locComponent.getWorldPosition(new Vector3f())); - String currentBlockFamilyStage = currentBlock.getURI().toString(); + SimpleUri currentBlockFamilyStage = new SimpleUri(currentBlock.getURI().getModuleName(), + currentBlock.getURI().getIdentifier()); Set keySet = blockAnimation.blockFamilyStages.keySet(); List keyList = new ArrayList<>(keySet); int currentstageIndex = keyList.indexOf(currentBlockFamilyStage); @@ -99,7 +100,7 @@ public void update(float delta) { } SimpleUri newBlockUri = keyList.get(currentstageIndex); Block newBlock = blockManager.getBlock(newBlockUri.toString()); - if (newBlockUri.equals(newBlock.getURI().toString())) { + if (newBlockUri.equals(new SimpleUri(newBlock.getURI().getModuleName(), newBlock.getURI().getIdentifier()))) { worldprovider.setBlock(new Vector3i(locComponent.getWorldPosition(new Vector3f()), RoundingMode.FLOOR), newBlock); blockAnimation.timeInGameMsToNextStage = blockAnimation.blockFamilyStages.get(currentBlockFamilyStage); } From 54773d537e03e3b03094a18bc99e12ffd5a8bb24 Mon Sep 17 00:00:00 2001 From: Josephine Rueckert Date: Sun, 21 Aug 2022 18:57:39 +0200 Subject: [PATCH 7/8] chore: extract BlockUri to SimpleUri logic into helper method --- .../changingBlocks/ChangingBlocksSystem.java | 32 +++++++++++++------ 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/terasology/changingBlocks/ChangingBlocksSystem.java b/src/main/java/org/terasology/changingBlocks/ChangingBlocksSystem.java index 3c9bbfa..f67293f 100644 --- a/src/main/java/org/terasology/changingBlocks/ChangingBlocksSystem.java +++ b/src/main/java/org/terasology/changingBlocks/ChangingBlocksSystem.java @@ -20,6 +20,7 @@ import org.terasology.engine.world.block.Block; import org.terasology.engine.world.block.BlockComponent; import org.terasology.engine.world.block.BlockManager; +import org.terasology.engine.world.block.BlockUri; import org.terasology.gestalt.entitysystem.event.ReceiveEvent; import java.util.ArrayList; @@ -42,25 +43,25 @@ public class ChangingBlocksSystem extends BaseComponentSystem implements UpdateS private long lastCheckTime; @Override - public void initialise() { - } + public void initialise() { } @ReceiveEvent(components = {ChangingBlocksComponent.class, LocationComponent.class, BlockComponent.class}) public void onSpawn(OnAddedComponent event, EntityRef entity) { long initTime = timer.getGameTimeInMs(); + ChangingBlocksComponent changingBlocks = entity.getComponent(ChangingBlocksComponent.class); LocationComponent locComponent = entity.getComponent(LocationComponent.class); Block currentBlock = worldprovider.getBlock(locComponent.getWorldPosition(new Vector3f())); - SimpleUri currentBlockFamilyStage = new SimpleUri(currentBlock.getURI().getModuleName(), currentBlock.getURI().getIdentifier()); + SimpleUri currentBlockFamilyStage = getSimpleUriFromBlockUri(currentBlock.getURI()); + changingBlocks.timeInGameMsToNextStage = changingBlocks.blockFamilyStages.get(currentBlockFamilyStage); changingBlocks.lastGameTimeCheck = initTime; + entity.saveComponent(changingBlocks); } @Override - public void shutdown() { - - } + public void shutdown() { } @Override public void update(float delta) { @@ -78,14 +79,16 @@ public void update(float delta) { changingBlocks.saveComponent(blockAnimation); return; } + if (gameTimeInMs - blockAnimation.lastGameTimeCheck > blockAnimation.timeInGameMsToNextStage) { blockAnimation.lastGameTimeCheck = timer.getGameTimeInMs(); + LocationComponent locComponent = changingBlocks.getComponent(LocationComponent.class); Block currentBlock = worldprovider.getBlock(locComponent.getWorldPosition(new Vector3f())); - SimpleUri currentBlockFamilyStage = new SimpleUri(currentBlock.getURI().getModuleName(), - currentBlock.getURI().getIdentifier()); + SimpleUri currentBlockFamilyStage = getSimpleUriFromBlockUri(currentBlock.getURI()); Set keySet = blockAnimation.blockFamilyStages.keySet(); List keyList = new ArrayList<>(keySet); + int currentstageIndex = keyList.indexOf(currentBlockFamilyStage); int lastStageIndex = blockAnimation.blockFamilyStages.size() - 1; if (lastStageIndex > currentstageIndex) { @@ -100,7 +103,7 @@ public void update(float delta) { } SimpleUri newBlockUri = keyList.get(currentstageIndex); Block newBlock = blockManager.getBlock(newBlockUri.toString()); - if (newBlockUri.equals(new SimpleUri(newBlock.getURI().getModuleName(), newBlock.getURI().getIdentifier()))) { + if (newBlockUri.equals(getSimpleUriFromBlockUri(newBlock.getURI()))) { worldprovider.setBlock(new Vector3i(locComponent.getWorldPosition(new Vector3f()), RoundingMode.FLOOR), newBlock); blockAnimation.timeInGameMsToNextStage = blockAnimation.blockFamilyStages.get(currentBlockFamilyStage); } @@ -111,4 +114,15 @@ public void update(float delta) { lastCheckTime = gameTimeInMs; } } + + /*** + * Creates a {@link SimpleUri} from a {@link BlockUri}, omitting blockFamily and shape. + * For the `ChangingBlocks` module, shape and block family are irrelevant. + * + * @param blockUri a valid BlockUri + * @return a SimpleUri following the pattern [package]:[blockIdentifier] + */ + private SimpleUri getSimpleUriFromBlockUri(BlockUri blockUri) { + return new SimpleUri(blockUri.getModuleName(), blockUri.getIdentifier()); + } } From af4803f54da266bc58155e89943099c7db01e02a Mon Sep 17 00:00:00 2001 From: Josephine Rueckert Date: Mon, 22 Aug 2022 00:25:43 +0200 Subject: [PATCH 8/8] feat: use BlockUri instead of SimpleUri --- .../ChangingBlocksComponent.java | 4 +-- .../changingBlocks/ChangingBlocksSystem.java | 31 ++++++------------- 2 files changed, 11 insertions(+), 24 deletions(-) diff --git a/src/main/java/org/terasology/changingBlocks/ChangingBlocksComponent.java b/src/main/java/org/terasology/changingBlocks/ChangingBlocksComponent.java index bedabf5..209e38f 100644 --- a/src/main/java/org/terasology/changingBlocks/ChangingBlocksComponent.java +++ b/src/main/java/org/terasology/changingBlocks/ChangingBlocksComponent.java @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 package org.terasology.changingBlocks; -import org.terasology.engine.core.SimpleUri; +import org.terasology.engine.world.block.BlockUri; import org.terasology.engine.world.block.ForceBlockActive; import org.terasology.gestalt.entitysystem.component.Component; @@ -18,7 +18,7 @@ public final class ChangingBlocksComponent implements Component blockFamilyStages; + public Map blockFamilyStages; // internal: used to determine time to next block change public long timeInGameMsToNextStage; diff --git a/src/main/java/org/terasology/changingBlocks/ChangingBlocksSystem.java b/src/main/java/org/terasology/changingBlocks/ChangingBlocksSystem.java index f67293f..89f1f56 100644 --- a/src/main/java/org/terasology/changingBlocks/ChangingBlocksSystem.java +++ b/src/main/java/org/terasology/changingBlocks/ChangingBlocksSystem.java @@ -5,7 +5,6 @@ import org.joml.RoundingMode; import org.joml.Vector3f; import org.joml.Vector3i; -import org.terasology.engine.core.SimpleUri; import org.terasology.engine.core.Time; import org.terasology.engine.entitySystem.entity.EntityManager; import org.terasology.engine.entitySystem.entity.EntityRef; @@ -52,7 +51,7 @@ public void onSpawn(OnAddedComponent event, EntityRef entity) { ChangingBlocksComponent changingBlocks = entity.getComponent(ChangingBlocksComponent.class); LocationComponent locComponent = entity.getComponent(LocationComponent.class); Block currentBlock = worldprovider.getBlock(locComponent.getWorldPosition(new Vector3f())); - SimpleUri currentBlockFamilyStage = getSimpleUriFromBlockUri(currentBlock.getURI()); + BlockUri currentBlockFamilyStage = currentBlock.getURI(); changingBlocks.timeInGameMsToNextStage = changingBlocks.blockFamilyStages.get(currentBlockFamilyStage); changingBlocks.lastGameTimeCheck = initTime; @@ -85,12 +84,13 @@ public void update(float delta) { LocationComponent locComponent = changingBlocks.getComponent(LocationComponent.class); Block currentBlock = worldprovider.getBlock(locComponent.getWorldPosition(new Vector3f())); - SimpleUri currentBlockFamilyStage = getSimpleUriFromBlockUri(currentBlock.getURI()); - Set keySet = blockAnimation.blockFamilyStages.keySet(); - List keyList = new ArrayList<>(keySet); + BlockUri currentBlockFamilyStage = currentBlock.getURI(); + Set keySet = blockAnimation.blockFamilyStages.keySet(); + List keyList = new ArrayList<>(keySet); int currentstageIndex = keyList.indexOf(currentBlockFamilyStage); int lastStageIndex = blockAnimation.blockFamilyStages.size() - 1; + if (lastStageIndex > currentstageIndex) { currentstageIndex++; if (currentstageIndex == lastStageIndex) { @@ -101,12 +101,10 @@ public void update(float delta) { changingBlocks.send(new OnBlockSequenceComplete()); } } - SimpleUri newBlockUri = keyList.get(currentstageIndex); - Block newBlock = blockManager.getBlock(newBlockUri.toString()); - if (newBlockUri.equals(getSimpleUriFromBlockUri(newBlock.getURI()))) { - worldprovider.setBlock(new Vector3i(locComponent.getWorldPosition(new Vector3f()), RoundingMode.FLOOR), newBlock); - blockAnimation.timeInGameMsToNextStage = blockAnimation.blockFamilyStages.get(currentBlockFamilyStage); - } + BlockUri newBlockUri = keyList.get(currentstageIndex); + Block newBlock = blockManager.getBlock(newBlockUri); + worldprovider.setBlock(new Vector3i(locComponent.getWorldPosition(new Vector3f()), RoundingMode.FLOOR), newBlock); + blockAnimation.timeInGameMsToNextStage = blockAnimation.blockFamilyStages.get(currentBlockFamilyStage); } changingBlocks.saveComponent(blockAnimation); } @@ -114,15 +112,4 @@ public void update(float delta) { lastCheckTime = gameTimeInMs; } } - - /*** - * Creates a {@link SimpleUri} from a {@link BlockUri}, omitting blockFamily and shape. - * For the `ChangingBlocks` module, shape and block family are irrelevant. - * - * @param blockUri a valid BlockUri - * @return a SimpleUri following the pattern [package]:[blockIdentifier] - */ - private SimpleUri getSimpleUriFromBlockUri(BlockUri blockUri) { - return new SimpleUri(blockUri.getModuleName(), blockUri.getIdentifier()); - } }