Skip to content

Commit

Permalink
feat: add permission tag & compatible block trigger list
Browse files Browse the repository at this point in the history
* Update DataStorage.java

- Fix error in folder creation.
- Use output file directly instead of asserting a new one

* Fix Null PlayerDataServices

* Feature: Add only compatible blocks to the trigger block list

* Permission Tag Added
  • Loading branch information
TreemanKing authored May 12, 2024
1 parent 2064c3f commit f52b54d
Show file tree
Hide file tree
Showing 10 changed files with 111 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,7 @@
import com.sekwah.advancedportals.core.services.DestinationServices;
import com.sekwah.advancedportals.core.services.PortalServices;
import com.sekwah.advancedportals.core.services.PlayerDataServices;
import com.sekwah.advancedportals.core.tags.activation.CooldownTag;
import com.sekwah.advancedportals.core.tags.activation.DestiTag;
import com.sekwah.advancedportals.core.tags.activation.NameTag;
import com.sekwah.advancedportals.core.tags.activation.TriggerBlockTag;
import com.sekwah.advancedportals.core.tags.activation.*;
import com.sekwah.advancedportals.core.util.GameScheduler;
import com.sekwah.advancedportals.core.util.InfoLogger;
import com.sekwah.advancedportals.core.util.Lang;
Expand Down Expand Up @@ -121,6 +118,7 @@ private void registerTags() {
this.tagRegistry.registerTag(new DestiTag());
this.tagRegistry.registerTag(new CooldownTag());
this.tagRegistry.registerTag(new TriggerBlockTag());
this.tagRegistry.registerTag(new PermissionTag());
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public class PortalPermissions {


/**
* this will not currently build the permissions for the files, but maybe at some point. I'tll just make it easier though.
* this will not currently build the permissions for the files, but maybe at some point. It'll just make it easier though.
*/
public static class PermissionBuilder {
private final String permissionTag;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
import com.sekwah.advancedportals.core.services.PlayerDataServices;
import com.sekwah.advancedportals.core.tags.activation.TriggerBlockTag;
import com.sekwah.advancedportals.core.util.Lang;
import com.sekwah.advancedportals.core.util.PlayerUtils;
import com.sekwah.advancedportals.core.warphandler.ActivationData;
import com.sekwah.advancedportals.core.warphandler.Tag;

Expand All @@ -24,7 +23,7 @@
public class AdvancedPortal implements TagTarget {

@Inject
transient TagRegistry tagRegistry;
private transient TagRegistry tagRegistry;

@SerializedName("max")
private BlockLocation maxLoc;
Expand All @@ -33,15 +32,17 @@ public class AdvancedPortal implements TagTarget {
private BlockLocation minLoc;

@SerializedName("a")
private HashMap<String, String[]> args = new HashMap<>();
private final HashMap<String, String[]> args = new HashMap<>();

@Inject
transient PlayerDataServices playerDataServices;
private transient PlayerDataServices playerDataServices;

@Inject
transient ConfigRepository configRepository;

public AdvancedPortal(BlockLocation minLoc, BlockLocation maxLoc) {
public AdvancedPortal(BlockLocation minLoc, BlockLocation maxLoc, TagRegistry tagRegistry, PlayerDataServices playerDataServices) {
this.tagRegistry = tagRegistry;
this.playerDataServices = playerDataServices;
this.updateBounds(minLoc, maxLoc);
}

Expand Down Expand Up @@ -103,7 +104,7 @@ public void updateBounds(BlockLocation loc1, BlockLocation loc2) {

/**
*
* @param player
* @param player The player on the server attempting to use an advanced portal
* @param moveActivated if the portal was activated by a move event (won't trigger knockback)
* @return
*/
Expand Down Expand Up @@ -157,7 +158,6 @@ public boolean activate(PlayerContainer player, boolean moveActivated) {
return false;
}


public boolean isLocationInPortal(BlockLocation loc) {
return this.isLocationInPortal(loc, 0);
}
Expand All @@ -166,7 +166,6 @@ public boolean isLocationInPortal(PlayerLocation loc) {
return this.isLocationInPortal(loc.toBlockPos(), 0);
}


public boolean isLocationInPortal(PlayerLocation loc, int additionalArea) {
return this.isLocationInPortal(loc.toBlockPos(), additionalArea);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,14 +78,14 @@ public <T> T loadJson(Class<T> dataHolder, String location) {
public boolean storeJson(Object dataHolder, String location) {
// Create folders if they don't exist
File outFile = new File(this.dataFolder, location);
if (!outFile.exists()) {
if (!outFile.getParentFile().exists()) { // Check if parent folder exists
if(!outFile.getParentFile().mkdirs()) {
infoLogger.warning("Failed to create folder for file: " + location);
}
}
String json = gson.toJson(dataHolder);
try {
FileWriter fileWriter = new FileWriter(new File(this.dataFolder, location));
FileWriter fileWriter = new FileWriter(outFile); // Use outFile directly here
fileWriter.write(json);
fileWriter.close();
return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public class PortalServices {
private IPortalRepository portalRepository;

@Inject
private PlayerDataServices playerDataServices;
private transient PlayerDataServices playerDataServices;

@Inject
private ConfigRepository configRepository;
Expand Down Expand Up @@ -88,17 +88,17 @@ public void playerMove(PlayerContainer player, PlayerLocation toLoc) {
|| (portal.isLocationInPortal(blockEntityTopLoc)
&& portal.isTriggerBlock(blockEntityTopMaterial))) {
notInPortal = false;
if(portal.activate(player, true)) {
if (portal.activate(player, true)) {
return;
}
}
}
var playerData = playerDataServices.getPlayerData(player);
if(!notInPortal) {
if (!notInPortal) {
var strength = configRepository.getThrowbackStrength();
PlayerUtils.throwPlayerBack(player, strength);
}
if(playerData.isInPortal() && notInPortal) {
if (playerData.isInPortal() && notInPortal) {
playerData.setInPortal(false);
}
}
Expand Down Expand Up @@ -154,7 +154,7 @@ else if(this.portalRepository.containsKey(name)) {
return null;
}

AdvancedPortal portal = new AdvancedPortal(pos1, pos2);
AdvancedPortal portal = new AdvancedPortal(pos1, pos2, tagRegistry, playerDataServices);

for (DataTag portalTag : tags) {
portal.setArgValues(portalTag);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.sekwah.advancedportals.core.warphandler.ActivationData;
import com.sekwah.advancedportals.core.warphandler.Tag;

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

/**
Expand Down Expand Up @@ -46,6 +47,12 @@ public List<String> autoComplete(String argData) {
return null;
}

@Nullable
@Override
public String splitString() {
return null;
}

@Override
public boolean created(TagTarget target, PlayerContainer player, String[] argData) {
if (argData.length > 0) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package com.sekwah.advancedportals.core.tags.activation;

import com.sekwah.advancedportals.core.connector.containers.PlayerContainer;
import com.sekwah.advancedportals.core.permissions.PortalPermissions;
import com.sekwah.advancedportals.core.portal.AdvancedPortal;
import com.sekwah.advancedportals.core.registry.TagTarget;
import com.sekwah.advancedportals.core.repository.ConfigRepository;
import com.sekwah.advancedportals.core.services.PlayerDataServices;
import com.sekwah.advancedportals.core.util.InfoLogger;
import com.sekwah.advancedportals.core.util.Lang;
import com.sekwah.advancedportals.core.warphandler.ActivationData;
import com.sekwah.advancedportals.core.warphandler.Tag;

import javax.annotation.Nullable;
import javax.inject.Inject;
import java.util.List;

public class PermissionTag implements Tag.Activation{

@Inject
transient PlayerDataServices playerDataServices;

@Inject
transient ConfigRepository configRepository;

@Inject
private InfoLogger infoLogger;

public static String TAG_NAME = "permission";

private final String[] aliases = new String[]{ "perm" };

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

@Override
public TagType[] getTagTypes() {
return tagTypes;
}

@Override
public String getName() {
return TAG_NAME;
}

@Nullable
@Override
public String[] getAliases() {
return new String[0];
}

@Override
public String description() {
return Lang.translate("tag.permission.description");
}

@Override
public boolean preActivated(TagTarget target, PlayerContainer player, ActivationData activeData, String[] argData) {
if (target instanceof AdvancedPortal portal) {
var portalName = portal.getName();
if (!player.hasPermission(argData[0])) return false;
}
return false;
}

@Override
public void postActivated(TagTarget target, PlayerContainer player, ActivationData activationData, String[] argData) {

}

@Override
public boolean activated(TagTarget target, PlayerContainer player, ActivationData activationData, String[] argData) {
return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ interface AutoComplete extends Tag {
@Nullable
List<String> autoComplete(String argData);

@Nullable
String splitString();
}

interface Split extends Tag {
Expand Down
1 change: 1 addition & 0 deletions lang/src/main/resources/lang/en_GB.lang
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ items.selector.pos=Select pos %1$s
items.interact.left=Left Click
items.interact.right=Right Click

tag.permission.description=Sets the permission of a portal
tag.desti.description=Sets the destination of the portal
tag.name.error.nospaces= The name cannot contain spaces.
tag.triggerblock.description=Sets the trigger block/s of the portal. Comma seperated or multi tag.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import com.sekwah.advancedportals.core.connector.containers.WorldContainer;
import org.bukkit.Material;
import org.bukkit.Server;
import org.bukkit.block.Block;

import java.util.Arrays;
import java.util.List;
Expand All @@ -13,7 +14,7 @@
public class SpigotServerContainer implements ServerContainer {

private final Server server;
private final List<String> triggerBlockList = Arrays.stream(Material.values()).filter(Material::isBlock).map(Enum::name)
private final List<String> triggerBlockList = Arrays.stream(Material.values()).filter(this::isAdvancedPortalBlock).map(Enum::name)
.toList();

public SpigotServerContainer(Server server) {
Expand Down Expand Up @@ -61,4 +62,12 @@ public PlayerContainer[] getPlayers() {
.map(SpigotPlayerContainer::new)
.toArray(PlayerContainer[]::new);
}

// Check if it's a material compatible with making portals
private boolean isAdvancedPortalBlock(Material material) {
return switch (material) {
case WATER, LAVA, AIR, NETHER_PORTAL, END_GATEWAY, END_PORTAL -> true;
default -> false;
};
}
}

0 comments on commit f52b54d

Please sign in to comment.