Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: use item activation (right click) for magic staff #226

Merged
merged 4 commits into from
Jul 26, 2021
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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)) {
Comment on lines +54 to +55
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is also checked in dropFlagOnPlayerAttack, so we can probably drop this part of the check here... 🤔


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) {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we don't need this anymore as the "raycast" check now happens in the engine when creating the ActivateEvent.

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