Skip to content

Commit

Permalink
wip: altering hwo tags work to allow always triggers
Browse files Browse the repository at this point in the history
  • Loading branch information
sekwah41 committed Sep 14, 2024
1 parent 07c6510 commit 5498f5d
Show file tree
Hide file tree
Showing 8 changed files with 211 additions and 50 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,7 @@
import com.sekwah.advancedportals.core.warphandler.Tag;
import com.sekwah.advancedportals.core.warphandler.TriggerType;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.*;

/**
* Possibly look at adding the ability to add some tags to destinations such as
Expand All @@ -33,8 +30,9 @@ public class Destination implements TagTarget {
private PlayerLocation loc;

private HashMap<String, String[]> args = new HashMap<>();
private transient List<DataTag> destiTags = new ArrayList<>();

private transient Set<String> argsCol;
private transient boolean isSorted = false;

public Destination() {
this.loc = new PlayerLocation();
Expand All @@ -51,26 +49,56 @@ public String[] getArgValues(String argName) {

@Override
public void setArgValues(String argName, String[] argValue) {
this.isSorted = false;
this.args.put(argName, argValue);
}

@Override
public void addArg(String argName, String argValues) {
this.isSorted = false;
}

public void setArgValues(DataTag portalTag) {
this.isSorted = false;
this.setArgValues(portalTag.NAME, portalTag.VALUES);
}

public void removeArg(String arg) {
this.isSorted = false;
this.args.remove(arg);
}

private void updateDestiTagList() {
destiTags.clear();
int i = 0;
for (Map.Entry<String, String[]> entry : args.entrySet()) {
this.destiTags.add(new DataTag(entry.getKey(), entry.getValue()));
}

this.tagRegistry.getAlwaysTriggerTags().forEach((key, value) -> {
if (value.getTagTypes().length == 0) {
this.destiTags.add(new DataTag(key));
}
});

this.destiTags.sort(Comparator.comparingInt(o -> {
var tag = tagRegistry.getTag(o.NAME);
if (tag instanceof Tag.OrderPriority tagPriority) {
return tagPriority.getPriority().ordinal();
} else {
return Tag.Priority.NORMAL.ordinal();
}
}));
isSorted = true;
}

public boolean activate(PlayerContainer player) {
ActivationData data = new ActivationData(TriggerType.MANUAL);
this.portalActivate(player, data);
this.postActivate(player, data);
return true;
if(this.portalActivate(player, data)) {
this.postActivate(player, data);
return true;
}
return false;
}

public boolean portalActivate(PlayerContainer player, ActivationData data) {
Expand All @@ -81,15 +109,15 @@ public boolean portalActivate(PlayerContainer player, ActivationData data) {
}
for (DataTag destiTag : destiTags) {
Tag.Activation activationHandler =
tagRegistry.getActivationHandler(destiTag.NAME);
if (activationHandler != null) {
activationHandler.preActivated(
this, player, data, this.getArgValues(destiTag.NAME));
tagRegistry.getActivationHandler(destiTag.NAME, Tag.TagType.DESTINATION);
if (activationHandler != null && !activationHandler.preActivated(
this, player, data, this.getArgValues(destiTag.NAME))) {
return false;
}
}
for (DataTag destiTag : destiTags) {
Tag.Activation activationHandler =
tagRegistry.getActivationHandler(destiTag.NAME);
tagRegistry.getActivationHandler(destiTag.NAME, Tag.TagType.DESTINATION);
if (activationHandler != null) {
activationHandler.activated(this, player, data,
this.getArgValues(destiTag.NAME));
Expand All @@ -106,7 +134,7 @@ public void postActivate(PlayerContainer player, ActivationData data) {
}
for (DataTag destiTag : destiTags) {
Tag.Activation activationHandler =
tagRegistry.getActivationHandler(destiTag.NAME);
tagRegistry.getActivationHandler(destiTag.NAME, Tag.TagType.DESTINATION);
if (activationHandler != null) {
activationHandler.postActivated(
this, player, data, this.getArgValues(destiTag.NAME));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,13 @@ private void updatePortalTagList() {
for (Map.Entry<String, String[]> entry : args.entrySet()) {
this.portalTags.add(new DataTag(entry.getKey(), entry.getValue()));
}

this.tagRegistry.getAlwaysTriggerTags().forEach((key, value) -> {
if (value.getTagTypes().length == 0) {
this.portalTags.add(new DataTag(key));
}
});

// sort the tags by priority
this.portalTags.sort(Comparator.comparingInt(o -> {
var tag = tagRegistry.getTag(o.NAME);
Expand All @@ -92,6 +99,7 @@ private void updatePortalTagList() {
return Tag.Priority.NORMAL.ordinal();
}
}));
isSorted = true;
}

@Override
Expand Down Expand Up @@ -138,7 +146,6 @@ public void updateBounds(BlockLocation loc1, BlockLocation loc2) {
public ActivationResult activate(PlayerContainer player, TriggerType triggerType) {
if(!isSorted) {
updatePortalTagList();
isSorted = true;
}

var playerData = playerDataServices.getPlayerData(player);
Expand All @@ -162,7 +169,7 @@ public ActivationResult activate(PlayerContainer player, TriggerType triggerType

for (DataTag portalTag : this.portalTags) {
Tag.Activation activationHandler =
tagRegistry.getActivationHandler(portalTag.NAME);
tagRegistry.getActivationHandler(portalTag.NAME, Tag.TagType.PORTAL);
if (activationHandler != null) {
var preActivated = activationHandler.preActivated(
this, player, data, this.getArgValues(portalTag.NAME));
Expand All @@ -177,7 +184,7 @@ public ActivationResult activate(PlayerContainer player, TriggerType triggerType
}
for (DataTag portalTag : this.portalTags) {
Tag.Activation activationHandler =
tagRegistry.getActivationHandler(portalTag.NAME);
tagRegistry.getActivationHandler(portalTag.NAME, Tag.TagType.PORTAL);
if (activationHandler != null
&& !activationHandler.activated(
this, player, data, this.getArgValues(portalTag.NAME))) {
Expand All @@ -186,7 +193,7 @@ public ActivationResult activate(PlayerContainer player, TriggerType triggerType
}
for (DataTag portalTag : this.portalTags) {
Tag.Activation activationHandler =
tagRegistry.getActivationHandler(portalTag.NAME);
tagRegistry.getActivationHandler(portalTag.NAME, Tag.TagType.PORTAL);
if (activationHandler != null) {
activationHandler.postActivated(
this, player, data, this.getArgValues(portalTag.NAME));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ public class TagRegistry {

private final ArrayList<Tag> tags = new ArrayList<>();

private final Map<String, Tag> tagMap = new HashMap<>();
private final Map<String, Tag.Activation> alwaysTriggerTags = new HashMap<>();
private final Map<String, Tag.Activation> activationTags = new HashMap<>();
private final Map<String, Tag.Creation> creationTags = new HashMap<>();
private final Map<String, Tag.TagStatus> statusTags = new HashMap<>();
Expand All @@ -32,8 +34,12 @@ public class TagRegistry {
* @param arg
* @return
*/
public Tag.Activation getActivationHandler(String arg) {
return this.activationTags.get(arg);
public Tag.Activation getActivationHandler(String arg, Tag.TagType targetType) {
var tag = this.activationTags.get(arg);
if (tag != null && Arrays.asList(tag.getTagTypes()).contains(targetType)) {
return tag;
}
return null;
}

/**
Expand All @@ -54,6 +60,10 @@ public Tag.TagStatus getStatusHandler(String arg) {
return this.statusTags.get(arg);
}

public Map<String, Tag.Activation> getAlwaysTriggerTags() {
return this.alwaysTriggerTags;
}

/**
* File must extend
* @return if the tag has been registered or if it already exists.
Expand Down Expand Up @@ -91,8 +101,13 @@ public boolean registerTag(Tag tag) {
return false;
}

this.tagMap.put(tagName, tag);

if (tag instanceof Tag.Activation tagActivation) {
this.activationTags.put(tagName, tagActivation);
if(tagActivation.triggerWithNoArgs()) {
this.alwaysTriggerTags.put(tagName, tagActivation);
}
}
if (tag instanceof Tag.TagStatus tagStatus) {
this.statusTags.put(tagName, tagStatus);
Expand All @@ -104,12 +119,7 @@ public boolean registerTag(Tag tag) {
}

public Tag getTag(String tagName) {
for (Tag tag : this.tags) {
if (tag.getName().equals(tagName)) {
return tag;
}
}
return null;
return this.tagMap.get(tagName);
}

public List<Tag> getTags() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.sekwah.advancedportals.core.connector.containers.PlayerContainer;
import com.sekwah.advancedportals.core.destination.Destination;
import com.sekwah.advancedportals.core.effect.WarpEffect;
import com.sekwah.advancedportals.core.registry.TagRegistry;
import com.sekwah.advancedportals.core.registry.TagTarget;
import com.sekwah.advancedportals.core.registry.WarpEffectRegistry;
import com.sekwah.advancedportals.core.repository.ConfigRepository;
Expand All @@ -13,7 +14,9 @@
import com.sekwah.advancedportals.core.warphandler.Tag;

import javax.annotation.Nullable;
import java.util.Arrays;
import java.util.List;
import java.util.Random;

public class DestiTag implements Tag.Activation, Tag.AutoComplete, Tag.Split {
public static String TAG_NAME = "destination";
Expand All @@ -24,7 +27,7 @@ public class DestiTag implements Tag.Activation, Tag.AutoComplete, Tag.Split {
WarpEffectRegistry warpEffectRegistry;

@Inject
ConfigRepository configRepository;
private transient TagRegistry tagRegistry;

private final TagType[] tagTypes = new TagType[] {TagType.PORTAL};

Expand All @@ -38,6 +41,8 @@ public String getName() {
return TAG_NAME;
}

private final Random random = new Random();

@Override
public String[] getAliases() {
return new String[] {"desti"};
Expand All @@ -54,30 +59,54 @@ public boolean preActivated(TagTarget target, PlayerContainer player,
if (argData.length == 0) {
return false;
}

String selectedArg = argData[new java.util.Random().nextInt(argData.length)];
String selectedArg = argData[random.nextInt(argData.length)];

activeData.setMetadata(TAG_NAME, selectedArg);


if(destinationServices.getDestination(selectedArg) == null) {
player.sendMessage(Lang.getNegativePrefix() + Lang.translateInsertVariables("desti.error.notfound", selectedArg));
return false;
}

// Check and trigger all tags on the destination
Destination destination = destinationServices.getDestination(selectedArg);
if (destination != null) {

for (var destiTag : destination.getArgs()) {
Tag.Activation activationHandler =
tagRegistry.getActivationHandler(destiTag.NAME, Tag.TagType.DESTINATION);
if (activationHandler != null
&& !activationHandler.preActivated(target, player, activeData, argData)) {
return false;
}
}
}

return true;
}

@Override
public void postActivated(TagTarget target, PlayerContainer player,
ActivationData activationData, String[] argData) {
var selectedArg = activationData.getMetadata(TAG_NAME);
Destination destination = destinationServices.getDestination(selectedArg);
if (destination != null) {
for (var destiTag : destination.getArgs()) {
Tag.Activation activationHandler =
tagRegistry.getActivationHandler(destiTag.NAME, Tag.TagType.DESTINATION);
if (activationHandler != null) {
activationHandler.postActivated(target, player, activationData, argData);
}
}
}
}

@Override
public boolean activated(TagTarget target, PlayerContainer player,
ActivationData activationData, String[] argData) {
var selectedArg = activationData.getMetadata(TAG_NAME);
Destination destination =
destinationServices.getDestination(argData[0]);
destinationServices.getDestination(selectedArg);
if (destination != null) {
var warpEffectVisual = warpEffectRegistry.getVisualEffect("ender");
if (warpEffectVisual != null) {
Expand All @@ -95,12 +124,6 @@ public boolean activated(TagTarget target, PlayerContainer player,
warpEffectSound.onWarpSound(player, WarpEffect.Action.EXIT);
}
activationData.setWarpStatus(ActivationData.WarpedStatus.WARPED);
if(this.configRepository.warpMessageOnActionBar()) {
player.sendMessage(Lang.translateInsertVariables("desti.warp", destination.getName()));
}
else if(this.configRepository.warpMessageInChat()) {
player.sendMessage(Lang.getPositivePrefix() + Lang.translateInsertVariables("desti.warp", destination.getName()));
}
}
return true;
}
Expand Down
Loading

0 comments on commit 5498f5d

Please sign in to comment.