diff --git a/module.txt b/module.txt index 64070812..89857126 100644 --- a/module.txt +++ b/module.txt @@ -59,6 +59,10 @@ "id": "Pathfinding", "minVersion": "1.0.0" }, + { + "id": "MultiBlock", + "minVersion": "1.1.0" + }, { "id": "Tasks", "minVersion": "1.0.0" diff --git a/src/main/java/org/terasology/ligthandshadow/componentsystem/controllers/MultiBlockSystem.java b/src/main/java/org/terasology/ligthandshadow/componentsystem/controllers/MultiBlockSystem.java new file mode 100644 index 00000000..fd076ef9 --- /dev/null +++ b/src/main/java/org/terasology/ligthandshadow/componentsystem/controllers/MultiBlockSystem.java @@ -0,0 +1,66 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 +package org.terasology.ligthandshadow.componentsystem.controllers; + +import java.util.Collection; + +import org.joml.Vector3i; +import org.terasology.engine.entitySystem.entity.EntityRef; +import org.terasology.engine.entitySystem.event.EventPriority; +import org.terasology.engine.entitySystem.event.ReceiveEvent; +import org.terasology.engine.entitySystem.prefab.Prefab; +import org.terasology.engine.entitySystem.systems.BaseComponentSystem; +import org.terasology.engine.entitySystem.systems.RegisterMode; +import org.terasology.engine.entitySystem.systems.RegisterSystem; +import org.terasology.engine.logic.characters.events.AttackEvent; +import org.terasology.engine.logic.health.EngineDamageTypes; +import org.terasology.engine.logic.inventory.ItemComponent; +import org.terasology.engine.world.BlockEntityRegistry; +import org.terasology.module.health.events.DoDamageEvent; +import org.terasology.engine.registry.In; +import org.terasology.multiBlock2.component.MultiBlockMainComponent; +import org.terasology.multiBlock2.component.MultiBlockMemberComponent; + +/** + * Damages all the blocks in a multiBlock Structure when any block in the structure is damaged. + */ +@RegisterSystem(RegisterMode.AUTHORITY) +public class MultiBlockSystem extends BaseComponentSystem { + @In + private BlockEntityRegistry blockEntityRegistry; + + @ReceiveEvent(priority = EventPriority.PRIORITY_CRITICAL) + public void onDamageDone(AttackEvent event, EntityRef entity) { + int damage = 1; + Prefab damageType = EngineDamageTypes.PHYSICAL.get(); + ItemComponent item = event.getDirectCause().getComponent(ItemComponent.class); + if (item != null) { + damage = item.baseDamage; + if (item.damageType != null) { + damageType = item.damageType; + } + } + Collection blocks = getBlocks(entity); + if (blocks != null) { + for (Vector3i pos : blocks) { + EntityRef block = blockEntityRegistry.getBlockEntityAt(pos); + block.send(new DoDamageEvent(damage, damageType, event.getInstigator(), event.getDirectCause())); + event.consume(); + } + } + } + + public Collection getBlocks(EntityRef entity) { + Collection blocks = null; + EntityRef mainBlock = null; + if (entity.hasComponent(MultiBlockMainComponent.class)) { + mainBlock = entity; + } else if (entity.hasComponent(MultiBlockMemberComponent.class)) { + mainBlock = blockEntityRegistry.getBlockEntityAt(entity.getComponent(MultiBlockMemberComponent.class).getMainBlockLocation()); + } + if (mainBlock != null) { + blocks = mainBlock.getComponent(MultiBlockMainComponent.class).getMultiBlockMembers(); + } + return blocks; + } +}