Skip to content

Commit

Permalink
feat: use item activation (right click) for magic staff (#226)
Browse files Browse the repository at this point in the history
  • Loading branch information
skaldarnar authored Jul 26, 2021
1 parent 26cb00c commit 98aa873
Showing 1 changed file with 32 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,55 +10,65 @@
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.CharacterHeldItemComponent;
import org.terasology.engine.logic.common.ActivateEvent;
import org.terasology.engine.logic.inventory.ItemComponent;
import org.terasology.engine.logic.players.PlayerCharacterComponent;
import org.terasology.engine.network.ClientComponent;
import org.terasology.engine.registry.In;
import org.terasology.lightandshadowresources.components.FlagComponent;
import org.terasology.ligthandshadow.componentsystem.events.OnFlagDropEvent;
import org.terasology.lightandshadowresources.components.LASTeamComponent;
import org.terasology.ligthandshadow.componentsystem.components.FlagDropOnActivateComponent;
import org.terasology.ligthandshadow.componentsystem.components.HasFlagComponent;
import org.terasology.ligthandshadow.componentsystem.events.DropFlagEvent;
import org.terasology.ligthandshadow.componentsystem.events.OnFlagDropEvent;
import org.terasology.ligthandshadow.componentsystem.events.OnFlagPickupEvent;
import org.terasology.ligthandshadow.componentsystem.events.ReturnFlagEvent;
import org.terasology.module.inventory.events.InventorySlotChangedEvent;
import org.terasology.engine.logic.players.PlayerCharacterComponent;
import org.terasology.ligthandshadow.componentsystem.components.FlagDropOnActivateComponent;
import org.terasology.ligthandshadow.componentsystem.components.HasFlagComponent;
import org.terasology.lightandshadowresources.components.RaycastOnActivateComponent;
import org.terasology.lightandshadowresources.components.LASTeamComponent;

@RegisterSystem(RegisterMode.AUTHORITY)
public class AttackSystem extends BaseComponentSystem {

@In
EntityManager entityManager;

private EntityRef item;

/**
* Drop the flag if a player manages to "touch" (activate) the enemy flag bearer.
* @param event the activation event
* @param entity the target of the activation (here: the enemy flag bearer)
*/
@ReceiveEvent(components = {FlagDropOnActivateComponent.class, PlayerCharacterComponent.class, HasFlagComponent.class})
public void onActivate(ActivateEvent event, EntityRef entity) {
public void dropFlagOnTouch(ActivateEvent event, EntityRef entity) {
dropFlagOnPlayerAttack(event, entity);
}

/**
* Drop the flag if a player targets the enemy flag bearer with an item that causes a flag drop on activation.
* @param event the activation event, must target the enemy flag bearer
* @param item the target of the activation (here: the used item)
*/
@ReceiveEvent(components = {FlagDropOnActivateComponent.class, ItemComponent.class})
public void dropFlagOnRangeAttack(ActivateEvent event, EntityRef item) {
if (event.getTarget().exists()
&& event.getTarget().hasComponent(PlayerCharacterComponent.class)
&& event.getTarget().hasComponent(HasFlagComponent.class)) {

dropFlagOnPlayerAttack(event, event.getTarget());
}
}

/**
* When player activates another with the magic staff, checks to see if the attacked player has a flag
* If so, makes the player drop the flag
* @param targetPlayer The player being attacked
*/
private void dropFlagOnPlayerAttack(ActivateEvent event, EntityRef targetPlayer) {
EntityRef attackingPlayer = event.getInstigator(); // The player using the staff to attack
if (canPlayerAttack(attackingPlayer)) {
if (targetPlayer.hasComponent(PlayerCharacterComponent.class) && targetPlayer.hasComponent(HasFlagComponent.class)) {
// If the target player has the flag
targetPlayer.send(new DropFlagEvent(attackingPlayer));
}
}
}

private boolean canPlayerAttack(EntityRef attackingPlayer) {
if (!attackingPlayer.hasComponent(CharacterHeldItemComponent.class)) {
return false;
EntityRef attackingPlayer = event.getInstigator(); // The attacking player
if (targetPlayer.hasComponent(PlayerCharacterComponent.class) && targetPlayer.hasComponent(HasFlagComponent.class)) {
// If the target player has the flag
targetPlayer.send(new DropFlagEvent(attackingPlayer));
}
EntityRef heldItem = attackingPlayer.getComponent(CharacterHeldItemComponent.class).selectedItem;
return heldItem.hasComponent(RaycastOnActivateComponent.class);
}

/**
Expand Down

0 comments on commit 98aa873

Please sign in to comment.