mirror of
https://github.com/sekwah41/Advanced-Portals.git
synced 2024-11-28 05:25:11 +01:00
chore: switch to using clang format
This commit is contained in:
parent
c0cdcc327d
commit
79c935a931
11
.clang-format
Normal file
11
.clang-format
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
BasedOnStyle: Google
|
||||||
|
IndentWidth: 4
|
||||||
|
TabWidth: 4
|
||||||
|
UseTab: Never
|
||||||
|
AllowShortFunctionsOnASingleLine: None
|
||||||
|
BreakBeforeBraces: Attach
|
||||||
|
ConstructorInitializerAllOnOneLineOrOnePerLine: true
|
||||||
|
BreakConstructorInitializers: BeforeComma
|
||||||
|
AlignAfterOpenBracket: Align
|
||||||
|
PenaltyBreakBeforeFirstCallParameter: 1
|
||||||
|
ColumnLimit: 80
|
6
.github/workflows/pre-commit-check.yaml
vendored
6
.github/workflows/pre-commit-check.yaml
vendored
@ -18,12 +18,6 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Set up JDK 11
|
|
||||||
uses: actions/setup-java@v4
|
|
||||||
with:
|
|
||||||
distribution: 'temurin'
|
|
||||||
java-version: '11'
|
|
||||||
|
|
||||||
- uses: dorny/paths-filter@v2
|
- uses: dorny/paths-filter@v2
|
||||||
id: filter
|
id: filter
|
||||||
with:
|
with:
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
# See https://pre-commit.com for more information
|
# See https://pre-commit.com for more information
|
||||||
repos:
|
repos:
|
||||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||||
rev: v4.0.1
|
rev: v4.6.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: trailing-whitespace
|
- id: trailing-whitespace
|
||||||
- id: end-of-file-fixer
|
- id: end-of-file-fixer
|
||||||
@ -11,7 +11,7 @@ repos:
|
|||||||
- id: check-case-conflict
|
- id: check-case-conflict
|
||||||
|
|
||||||
- repo: https://github.com/Lucas-C/pre-commit-hooks
|
- repo: https://github.com/Lucas-C/pre-commit-hooks
|
||||||
rev: v1.1.10
|
rev: v1.5.5
|
||||||
hooks:
|
hooks:
|
||||||
- id: remove-crlf
|
- id: remove-crlf
|
||||||
- id: remove-tabs
|
- id: remove-tabs
|
||||||
@ -19,9 +19,13 @@ repos:
|
|||||||
- repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks
|
- repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks
|
||||||
rev: v2.13.0
|
rev: v2.13.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: pretty-format-java
|
|
||||||
args: [--autofix, --aosp, --google-java-formatter-version=1.16.0]
|
|
||||||
- id: pretty-format-yaml
|
- id: pretty-format-yaml
|
||||||
args: [--autofix]
|
args: [--autofix]
|
||||||
- id: pretty-format-toml
|
- id: pretty-format-toml
|
||||||
args: [--autofix]
|
args: [--autofix]
|
||||||
|
|
||||||
|
- repo: https://github.com/pocc/pre-commit-hooks
|
||||||
|
rev: v1.3.5
|
||||||
|
hooks:
|
||||||
|
- id: clang-format
|
||||||
|
args: [-i, --style=file]
|
||||||
|
@ -20,12 +20,10 @@ import com.sekwah.advancedportals.core.tags.activation.*;
|
|||||||
import com.sekwah.advancedportals.core.util.GameScheduler;
|
import com.sekwah.advancedportals.core.util.GameScheduler;
|
||||||
import com.sekwah.advancedportals.core.util.InfoLogger;
|
import com.sekwah.advancedportals.core.util.InfoLogger;
|
||||||
import com.sekwah.advancedportals.core.util.Lang;
|
import com.sekwah.advancedportals.core.util.Lang;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
public class AdvancedPortalsCore {
|
public class AdvancedPortalsCore {
|
||||||
|
|
||||||
public static final String version = "1.0.0";
|
public static final String version = "1.0.0";
|
||||||
|
|
||||||
private final InfoLogger infoLogger;
|
private final InfoLogger infoLogger;
|
||||||
@ -34,8 +32,8 @@ public class AdvancedPortalsCore {
|
|||||||
private final AdvancedPortalsModule module;
|
private final AdvancedPortalsModule module;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Use this to enable or alter certain features for different versions. If there is an issue
|
* Use this to enable or alter certain features for different versions. If
|
||||||
* parsing it for any reason it will be set to 0.0.0
|
* there is an issue parsing it for any reason it will be set to 0.0.0
|
||||||
*/
|
*/
|
||||||
private final int[] mcVersion;
|
private final int[] mcVersion;
|
||||||
|
|
||||||
@ -63,9 +61,7 @@ public class AdvancedPortalsCore {
|
|||||||
// TEMP REMOVE THIS THIS IS JUST FOR DEV
|
// TEMP REMOVE THIS THIS IS JUST FOR DEV
|
||||||
@Inject private IPlayerDataRepository tempDataRepository;
|
@Inject private IPlayerDataRepository tempDataRepository;
|
||||||
|
|
||||||
public AdvancedPortalsCore(
|
public AdvancedPortalsCore(String mcVersion, File dataStorageLoc,
|
||||||
String mcVersion,
|
|
||||||
File dataStorageLoc,
|
|
||||||
InfoLogger infoLogger,
|
InfoLogger infoLogger,
|
||||||
ServerContainer serverContainer) {
|
ServerContainer serverContainer) {
|
||||||
instance = this;
|
instance = this;
|
||||||
@ -74,10 +70,12 @@ public class AdvancedPortalsCore {
|
|||||||
this.infoLogger = infoLogger;
|
this.infoLogger = infoLogger;
|
||||||
|
|
||||||
int[] mcVersionTemp;
|
int[] mcVersionTemp;
|
||||||
infoLogger.info("Loading Advanced Portals Core v" + version + " for MC: " + mcVersion);
|
infoLogger.info("Loading Advanced Portals Core v" + version
|
||||||
|
+ " for MC: " + mcVersion);
|
||||||
try {
|
try {
|
||||||
mcVersionTemp =
|
mcVersionTemp = Arrays.stream(mcVersion.split("\\."))
|
||||||
Arrays.stream(mcVersion.split("\\.")).mapToInt(Integer::parseInt).toArray();
|
.mapToInt(Integer::parseInt)
|
||||||
|
.toArray();
|
||||||
} catch (NumberFormatException e) {
|
} catch (NumberFormatException e) {
|
||||||
infoLogger.info("Failed to parse MC version: " + mcVersion);
|
infoLogger.info("Failed to parse MC version: " + mcVersion);
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@ -92,13 +90,13 @@ public class AdvancedPortalsCore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* For some platforms we could do this on construction but this just allows for a bit more
|
* For some platforms we could do this on construction but this just allows
|
||||||
* control
|
* for a bit more control
|
||||||
*/
|
*/
|
||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
// Force values to get injected, either because the initial ones were created too early or
|
// Force values to get injected, either because the initial ones were
|
||||||
// to ensure they are not null.
|
// created too early or to ensure they are not null. Do it here to give
|
||||||
// Do it here to give implementations a chance to interact with the module.
|
// implementations a chance to interact with the module.
|
||||||
Injector injector = module.getInjector();
|
Injector injector = module.getInjector();
|
||||||
injector.injectMembers(this);
|
injector.injectMembers(this);
|
||||||
injector.injectMembers(Lang.instance);
|
injector.injectMembers(Lang.instance);
|
||||||
@ -124,7 +122,8 @@ public class AdvancedPortalsCore {
|
|||||||
this.tagRegistry.registerTag(new PermissionTag());
|
this.tagRegistry.registerTag(new PermissionTag());
|
||||||
}
|
}
|
||||||
|
|
||||||
/** */
|
/**
|
||||||
|
*/
|
||||||
public void registerCommands() {
|
public void registerCommands() {
|
||||||
this.registerPortalCommand(commandRegister);
|
this.registerPortalCommand(commandRegister);
|
||||||
this.registerDestinationCommand(commandRegister);
|
this.registerDestinationCommand(commandRegister);
|
||||||
@ -133,43 +132,61 @@ public class AdvancedPortalsCore {
|
|||||||
private void registerPortalCommand(CommandRegister commandRegister) {
|
private void registerPortalCommand(CommandRegister commandRegister) {
|
||||||
this.portalCommand = new CommandWithSubCommands(this);
|
this.portalCommand = new CommandWithSubCommands(this);
|
||||||
|
|
||||||
this.portalCommand.registerSubCommand("version", new VersionSubCommand());
|
this.portalCommand.registerSubCommand("version",
|
||||||
this.portalCommand.registerSubCommand("langupdate", new LangUpdateSubCommand());
|
new VersionSubCommand());
|
||||||
this.portalCommand.registerSubCommand("reload", new ReloadPortalSubCommand());
|
this.portalCommand.registerSubCommand("langupdate",
|
||||||
this.portalCommand.registerSubCommand("selector", new SelectorSubCommand(), "wand");
|
new LangUpdateSubCommand());
|
||||||
this.portalCommand.registerSubCommand("portalblock", new PortalBlockSubCommand());
|
this.portalCommand.registerSubCommand("reload",
|
||||||
this.portalCommand.registerSubCommand("endportalblock", new EndPortalBlockSubCommand());
|
new ReloadPortalSubCommand());
|
||||||
this.portalCommand.registerSubCommand("endgatewayblock", new EndGatewayBlockSubCommand());
|
this.portalCommand.registerSubCommand("selector",
|
||||||
this.portalCommand.registerSubCommand("create", new CreatePortalSubCommand());
|
new SelectorSubCommand(), "wand");
|
||||||
this.portalCommand.registerSubCommand("remove", new RemovePortalSubCommand());
|
this.portalCommand.registerSubCommand("portalblock",
|
||||||
this.portalCommand.registerSubCommand("list", new ListPortalsSubCommand());
|
new PortalBlockSubCommand());
|
||||||
this.portalCommand.registerSubCommand("show", new ShowPortalSubCommand());
|
this.portalCommand.registerSubCommand("endportalblock",
|
||||||
|
new EndPortalBlockSubCommand());
|
||||||
|
this.portalCommand.registerSubCommand("endgatewayblock",
|
||||||
|
new EndGatewayBlockSubCommand());
|
||||||
|
this.portalCommand.registerSubCommand("create",
|
||||||
|
new CreatePortalSubCommand());
|
||||||
|
this.portalCommand.registerSubCommand("remove",
|
||||||
|
new RemovePortalSubCommand());
|
||||||
|
this.portalCommand.registerSubCommand("list",
|
||||||
|
new ListPortalsSubCommand());
|
||||||
|
this.portalCommand.registerSubCommand("show",
|
||||||
|
new ShowPortalSubCommand());
|
||||||
|
|
||||||
commandRegister.registerCommand("portal", this.portalCommand);
|
commandRegister.registerCommand("portal", this.portalCommand);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void registerDestinationCommand(CommandRegister commandRegister) {
|
private void registerDestinationCommand(CommandRegister commandRegister) {
|
||||||
this.destiCommand = new CommandWithSubCommands(this);
|
this.destiCommand = new CommandWithSubCommands(this);
|
||||||
this.destiCommand.registerSubCommand("create", new CreateDestiSubCommand());
|
this.destiCommand.registerSubCommand("create",
|
||||||
this.destiCommand.registerSubCommand("remove", new RemoveDestiSubCommand());
|
new CreateDestiSubCommand());
|
||||||
this.destiCommand.registerSubCommand("teleport", new TeleportDestiSubCommand(), "tp");
|
this.destiCommand.registerSubCommand("remove",
|
||||||
|
new RemoveDestiSubCommand());
|
||||||
|
this.destiCommand.registerSubCommand(
|
||||||
|
"teleport", new TeleportDestiSubCommand(), "tp");
|
||||||
this.destiCommand.registerSubCommand("list", new ListDestiSubCommand());
|
this.destiCommand.registerSubCommand("list", new ListDestiSubCommand());
|
||||||
this.destiCommand.registerSubCommand("show", new ShowDestiSubCommand());
|
this.destiCommand.registerSubCommand("show", new ShowDestiSubCommand());
|
||||||
|
|
||||||
commandRegister.registerCommand("destination", this.destiCommand);
|
commandRegister.registerCommand("destination", this.destiCommand);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean registerPortalCommand(String arg, SubCommand subCommand, String... aliasArgs) {
|
public boolean registerPortalCommand(String arg, SubCommand subCommand,
|
||||||
return this.portalCommand.registerSubCommand(arg, subCommand, aliasArgs);
|
String... aliasArgs) {
|
||||||
|
return this.portalCommand.registerSubCommand(arg, subCommand,
|
||||||
|
aliasArgs);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean registerDestiCommand(String arg, SubCommand subCommand, String... aliasArgs) {
|
public boolean registerDestiCommand(String arg, SubCommand subCommand,
|
||||||
|
String... aliasArgs) {
|
||||||
return this.destiCommand.registerSubCommand(arg, subCommand, aliasArgs);
|
return this.destiCommand.registerSubCommand(arg, subCommand, aliasArgs);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads the portal config into the memory and saves from the memory to check in case certain
|
* Loads the portal config into the memory and saves from the memory to
|
||||||
* things have changed (basically if values are missing or whatever)
|
* check in case certain things have changed (basically if values are
|
||||||
|
* missing or whatever)
|
||||||
*/
|
*/
|
||||||
public void loadPortalConfig() {
|
public void loadPortalConfig() {
|
||||||
this.configRepository.loadConfig(this.dataStorage);
|
this.configRepository.loadConfig(this.dataStorage);
|
||||||
|
@ -6,30 +6,24 @@ import com.sekwah.advancedportals.core.connector.containers.PlayerContainer;
|
|||||||
import com.sekwah.advancedportals.core.connector.containers.WorldContainer;
|
import com.sekwah.advancedportals.core.connector.containers.WorldContainer;
|
||||||
import com.sekwah.advancedportals.core.data.BlockAxis;
|
import com.sekwah.advancedportals.core.data.BlockAxis;
|
||||||
import com.sekwah.advancedportals.core.data.Direction;
|
import com.sekwah.advancedportals.core.data.Direction;
|
||||||
import com.sekwah.advancedportals.core.serializeddata.BlockLocation;
|
|
||||||
import com.sekwah.advancedportals.core.serializeddata.PlayerLocation;
|
|
||||||
import com.sekwah.advancedportals.core.permissions.PortalPermissions;
|
import com.sekwah.advancedportals.core.permissions.PortalPermissions;
|
||||||
import com.sekwah.advancedportals.core.repository.ConfigRepository;
|
import com.sekwah.advancedportals.core.repository.ConfigRepository;
|
||||||
import com.sekwah.advancedportals.core.services.PortalServices;
|
import com.sekwah.advancedportals.core.serializeddata.BlockLocation;
|
||||||
|
import com.sekwah.advancedportals.core.serializeddata.PlayerLocation;
|
||||||
import com.sekwah.advancedportals.core.services.PlayerDataServices;
|
import com.sekwah.advancedportals.core.services.PlayerDataServices;
|
||||||
|
import com.sekwah.advancedportals.core.services.PortalServices;
|
||||||
import com.sekwah.advancedportals.core.util.GameScheduler;
|
import com.sekwah.advancedportals.core.util.GameScheduler;
|
||||||
import com.sekwah.advancedportals.core.util.Lang;
|
import com.sekwah.advancedportals.core.util.Lang;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
public class CoreListeners {
|
public class CoreListeners {
|
||||||
|
@Inject private PlayerDataServices playerDataServices;
|
||||||
|
|
||||||
@Inject
|
@Inject private PortalServices portalServices;
|
||||||
private PlayerDataServices playerDataServices;
|
|
||||||
|
|
||||||
@Inject
|
@Inject private ConfigRepository configRepository;
|
||||||
private PortalServices portalServices;
|
|
||||||
|
|
||||||
@Inject
|
@Inject private GameScheduler gameScheduler;
|
||||||
private ConfigRepository configRepository;
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
private GameScheduler gameScheduler;
|
|
||||||
|
|
||||||
public void playerJoin(PlayerContainer player) {
|
public void playerJoin(PlayerContainer player) {
|
||||||
this.playerDataServices.setJoinCooldown(player);
|
this.playerDataServices.setJoinCooldown(player);
|
||||||
@ -56,19 +50,24 @@ public class CoreListeners {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If the block is indirectly broken it will also take null for the player e.g. with tnt
|
* If the block is indirectly broken it will also take null for the player
|
||||||
|
* e.g. with tnt
|
||||||
*
|
*
|
||||||
* @player player causing the event (or null if not a player)
|
* @player player causing the event (or null if not a player)
|
||||||
* @param blockPos
|
* @param blockPos
|
||||||
* @param blockMaterial
|
* @param blockMaterial
|
||||||
* @return if the block is allowed to break
|
* @return if the block is allowed to break
|
||||||
*/
|
*/
|
||||||
public boolean blockBreak(PlayerContainer player, BlockLocation blockPos, String blockMaterial, String itemInHandMaterial, String itemInHandName) {
|
public boolean blockBreak(PlayerContainer player, BlockLocation blockPos,
|
||||||
if(player == null) {
|
String blockMaterial, String itemInHandMaterial,
|
||||||
|
String itemInHandName) {
|
||||||
|
if (player == null) {
|
||||||
return !portalServices.inPortalRegionProtected(blockPos);
|
return !portalServices.inPortalRegionProtected(blockPos);
|
||||||
}
|
}
|
||||||
if(!(PortalPermissions.BUILD.hasPermission(player) || !portalServices.inPortalRegionProtected(blockPos))) {
|
if (!(PortalPermissions.BUILD.hasPermission(player)
|
||||||
player.sendMessage(Lang.translate("messageprefix.negative") + Lang.translate("portal.nobuild"));
|
|| !portalServices.inPortalRegionProtected(blockPos))) {
|
||||||
|
player.sendMessage(Lang.translate("messageprefix.negative")
|
||||||
|
+ Lang.translate("portal.nobuild"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -80,33 +79,36 @@ public class CoreListeners {
|
|||||||
* @param blockMaterial
|
* @param blockMaterial
|
||||||
* @return if the block is allowed to be placed
|
* @return if the block is allowed to be placed
|
||||||
*/
|
*/
|
||||||
public boolean blockPlace(PlayerContainer player, BlockLocation blockPos, String blockMaterial, String itemInHandMaterial, String itemInHandName) {
|
public boolean blockPlace(PlayerContainer player, BlockLocation blockPos,
|
||||||
if(player != null && PortalPermissions.BUILD.hasPermission(player)) {
|
String blockMaterial, String itemInHandMaterial,
|
||||||
|
String itemInHandName) {
|
||||||
|
if (player != null && PortalPermissions.BUILD.hasPermission(player)) {
|
||||||
WorldContainer world = player.getWorld();
|
WorldContainer world = player.getWorld();
|
||||||
if(itemInHandName.equals("\u00A75Portal Block Placer")) {
|
if (itemInHandName.equals("\u00A75Portal Block Placer")) {
|
||||||
world.setBlock(blockPos, "NETHER_PORTAL");
|
world.setBlock(blockPos, "NETHER_PORTAL");
|
||||||
for (Direction direction : Direction.values()) {
|
for (Direction direction : Direction.values()) {
|
||||||
var checkLoc = new BlockLocation(blockPos, direction);
|
var checkLoc = new BlockLocation(blockPos, direction);
|
||||||
if (world.getBlock(checkLoc).equals("NETHER_PORTAL")) {
|
if (world.getBlock(checkLoc).equals("NETHER_PORTAL")) {
|
||||||
world.setBlockAxis(blockPos, world.getBlockAxis(checkLoc));
|
world.setBlockAxis(blockPos,
|
||||||
|
world.getBlockAxis(checkLoc));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
} else if (itemInHandName.equals(
|
||||||
else if(itemInHandName.equals("\u00A78End Portal Block Placer")) {
|
"\u00A78End Portal Block Placer")) {
|
||||||
world.setBlock(blockPos, "END_PORTAL");
|
world.setBlock(blockPos, "END_PORTAL");
|
||||||
return true;
|
return true;
|
||||||
}
|
} else if (itemInHandName.equals("\u00A78Gateway Block Placer")) {
|
||||||
else if(itemInHandName.equals("\u00A78Gateway Block Placer")) {
|
|
||||||
world.setBlock(blockPos, "END_GATEWAY");
|
world.setBlock(blockPos, "END_GATEWAY");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if(portalServices.inPortalRegionProtected(blockPos)) {
|
if (portalServices.inPortalRegionProtected(blockPos)) {
|
||||||
if(player != null) {
|
if (player != null) {
|
||||||
player.sendMessage(Lang.translate("messageprefix.negative") + Lang.translate("portal.nobuild"));
|
player.sendMessage(Lang.translate("messageprefix.negative")
|
||||||
|
+ Lang.translate("portal.nobuild"));
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -119,7 +121,8 @@ public class CoreListeners {
|
|||||||
* @param blockPos
|
* @param blockPos
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public boolean blockInteract(PlayerContainer player, BlockLocation blockPos) {
|
public boolean blockInteract(PlayerContainer player,
|
||||||
|
BlockLocation blockPos) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -129,25 +132,33 @@ public class CoreListeners {
|
|||||||
* @param leftClick true = left click, false = right click
|
* @param leftClick true = left click, false = right click
|
||||||
* @return if player is allowed to interact with block
|
* @return if player is allowed to interact with block
|
||||||
*/
|
*/
|
||||||
public boolean playerInteractWithBlock(PlayerContainer player, String blockMaterialname, String itemMaterialName, String itemName,
|
public boolean playerInteractWithBlock(PlayerContainer player,
|
||||||
BlockLocation blockLoc, boolean leftClick) {
|
String blockMaterialname,
|
||||||
if(itemName != null && (player.isOp() || PortalPermissions.CREATE_PORTAL.hasPermission(player)) &&
|
String itemMaterialName,
|
||||||
itemMaterialName.equalsIgnoreCase(this.configRepository.getSelectorMaterial())
|
String itemName,
|
||||||
&& (!this.configRepository.getUseOnlySpecialAxe() || itemName.equals("\u00A7ePortal Region Selector"))) {
|
BlockLocation blockLoc,
|
||||||
this.playerDataServices.playerSelectorActivate(player, blockLoc, leftClick);
|
boolean leftClick) {
|
||||||
|
if (itemName != null
|
||||||
|
&& (player.isOp()
|
||||||
|
|| PortalPermissions.CREATE_PORTAL.hasPermission(player))
|
||||||
|
&& itemMaterialName.equalsIgnoreCase(
|
||||||
|
this.configRepository.getSelectorMaterial())
|
||||||
|
&& (!this.configRepository.getUseOnlySpecialAxe()
|
||||||
|
|| itemName.equals("\u00A7ePortal Region Selector"))) {
|
||||||
|
this.playerDataServices.playerSelectorActivate(player, blockLoc,
|
||||||
|
leftClick);
|
||||||
return false;
|
return false;
|
||||||
}
|
} else if (itemName != null && leftClick
|
||||||
else if(itemName != null && leftClick &&
|
&& Objects.equals(itemMaterialName, "PURPLE_WOOL")
|
||||||
Objects.equals(itemMaterialName, "PURPLE_WOOL") &&
|
&& itemName.equals("\u00A75Portal Block Placer")
|
||||||
itemName.equals("\u00A75Portal Block Placer") && PortalPermissions.BUILD.hasPermission(player)) {
|
&& PortalPermissions.BUILD.hasPermission(player)) {
|
||||||
if(!Objects.equals(blockMaterialname, "NETHER_PORTAL")) {
|
if (!Objects.equals(blockMaterialname, "NETHER_PORTAL")) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
WorldContainer world = player.getWorld();
|
WorldContainer world = player.getWorld();
|
||||||
if(world.getBlockAxis(blockLoc) == BlockAxis.X) {
|
if (world.getBlockAxis(blockLoc) == BlockAxis.X) {
|
||||||
world.setBlockAxis(blockLoc, BlockAxis.Z);
|
world.setBlockAxis(blockLoc, BlockAxis.Z);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
world.setBlockAxis(blockLoc, BlockAxis.X);
|
world.setBlockAxis(blockLoc, BlockAxis.X);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -166,14 +177,15 @@ public class CoreListeners {
|
|||||||
|
|
||||||
public boolean entityPortalEvent(EntityContainer entity) {
|
public boolean entityPortalEvent(EntityContainer entity) {
|
||||||
var pos = entity.getBlockLoc();
|
var pos = entity.getBlockLoc();
|
||||||
if(entity instanceof PlayerContainer player) {
|
if (entity instanceof PlayerContainer player) {
|
||||||
var playerData = playerDataServices.getPlayerData(player);
|
var playerData = playerDataServices.getPlayerData(player);
|
||||||
if(playerData.isNetherPortalCooldown()) {
|
if (playerData.isNetherPortalCooldown()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var feetInPortal = portalServices.inPortalRegion(pos, 1);
|
var feetInPortal = portalServices.inPortalRegion(pos, 1);
|
||||||
var headInPortal = portalServices.inPortalRegion(pos.addY((int) entity.getHeight()), 1);
|
var headInPortal = portalServices.inPortalRegion(
|
||||||
|
pos.addY((int) entity.getHeight()), 1);
|
||||||
return !(feetInPortal || headInPortal);
|
return !(feetInPortal || headInPortal);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package com.sekwah.advancedportals.core.commands;
|
package com.sekwah.advancedportals.core.commands;
|
||||||
|
|
||||||
import com.sekwah.advancedportals.core.connector.containers.CommandSenderContainer;
|
import com.sekwah.advancedportals.core.connector.containers.CommandSenderContainer;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -11,13 +10,14 @@ import java.util.List;
|
|||||||
* https://docs.spongepowered.org/stable/en/plugin/commands/arguments.html#custom-command-elements
|
* https://docs.spongepowered.org/stable/en/plugin/commands/arguments.html#custom-command-elements
|
||||||
*/
|
*/
|
||||||
public interface CommandTemplate {
|
public interface CommandTemplate {
|
||||||
|
void onCommand(CommandSenderContainer sender, String commandExecuted,
|
||||||
void onCommand(CommandSenderContainer sender, String commandExecuted, String[] args);
|
String[] args);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fired when someone asks for a tab complete action.
|
* Fired when someone asks for a tab complete action.
|
||||||
*
|
*
|
||||||
* @param sender whoever triggered the command e.g. command block, server or player
|
* @param sender whoever triggered the command e.g. command block, server or
|
||||||
|
* player
|
||||||
* @param args arguments for the command
|
* @param args arguments for the command
|
||||||
* @return a lot of strings that are possible completions
|
* @return a lot of strings that are possible completions
|
||||||
*/
|
*/
|
||||||
|
@ -4,14 +4,12 @@ import com.sekwah.advancedportals.core.AdvancedPortalsCore;
|
|||||||
import com.sekwah.advancedportals.core.connector.containers.CommandSenderContainer;
|
import com.sekwah.advancedportals.core.connector.containers.CommandSenderContainer;
|
||||||
import com.sekwah.advancedportals.core.registry.SubCommandRegistry;
|
import com.sekwah.advancedportals.core.registry.SubCommandRegistry;
|
||||||
import com.sekwah.advancedportals.core.util.Lang;
|
import com.sekwah.advancedportals.core.util.Lang;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class CommandWithSubCommands implements CommandTemplate {
|
public class CommandWithSubCommands implements CommandTemplate {
|
||||||
|
|
||||||
private final SubCommandRegistry subCommandRegistry;
|
private final SubCommandRegistry subCommandRegistry;
|
||||||
|
|
||||||
private final int subCommandsPerPage = 7;
|
private final int subCommandsPerPage = 7;
|
||||||
@ -22,128 +20,163 @@ public class CommandWithSubCommands implements CommandTemplate {
|
|||||||
this.pluginCore = advancedPortalsCore;
|
this.pluginCore = advancedPortalsCore;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean registerSubCommand(String arg, SubCommand subCommand, String... aliasArgs) {
|
public boolean registerSubCommand(String arg, SubCommand subCommand,
|
||||||
|
String... aliasArgs) {
|
||||||
pluginCore.getModule().getInjector().injectMembers(subCommand);
|
pluginCore.getModule().getInjector().injectMembers(subCommand);
|
||||||
boolean hasRegistered = false;
|
boolean hasRegistered = false;
|
||||||
for(String additionalArg : aliasArgs) {
|
for (String additionalArg : aliasArgs) {
|
||||||
hasRegistered = this.subCommandRegistry.registerSubCommand(additionalArg,subCommand) || hasRegistered;
|
hasRegistered = this.subCommandRegistry.registerSubCommand(
|
||||||
|
additionalArg, subCommand)
|
||||||
|
|| hasRegistered;
|
||||||
}
|
}
|
||||||
boolean result = this.subCommandRegistry.registerSubCommand(arg,subCommand) || hasRegistered;
|
boolean result =
|
||||||
if(subCommand instanceof SubCommand.SubCommandOnInit init) {
|
this.subCommandRegistry.registerSubCommand(arg, subCommand)
|
||||||
|
|| hasRegistered;
|
||||||
|
if (subCommand instanceof SubCommand.SubCommandOnInit init) {
|
||||||
init.registered();
|
init.registered();
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArrayList<String> getSubCommands(){
|
public ArrayList<String> getSubCommands() {
|
||||||
return this.subCommandRegistry.getSubCommands();
|
return this.subCommandRegistry.getSubCommands();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isArgRegistered(String arg){
|
public boolean isArgRegistered(String arg) {
|
||||||
return this.subCommandRegistry.isArgRegistered(arg);
|
return this.subCommandRegistry.isArgRegistered(arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
public SubCommand getSubCommand(String arg){
|
public SubCommand getSubCommand(String arg) {
|
||||||
return this.subCommandRegistry.getSubCommand(arg);
|
return this.subCommandRegistry.getSubCommand(arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCommand(CommandSenderContainer sender, String commandExecuted, String[] args) {
|
public void onCommand(CommandSenderContainer sender, String commandExecuted,
|
||||||
if(args.length > 0) {
|
String[] args) {
|
||||||
if(args[0].equalsIgnoreCase("help")) {
|
if (args.length > 0) {
|
||||||
|
if (args[0].equalsIgnoreCase("help")) {
|
||||||
int helpPage = 1;
|
int helpPage = 1;
|
||||||
String[] subCommands = this.subCommandRegistry.getSubCommands().toArray(new String[0]);
|
String[] subCommands =
|
||||||
int pages = (int) Math.ceil(subCommands.length / (float) this.subCommandsPerPage);
|
this.subCommandRegistry.getSubCommands().toArray(
|
||||||
String command = commandExecuted.substring(0, 1).toUpperCase() + commandExecuted.substring(1).toLowerCase();
|
new String[0]);
|
||||||
if(args.length > 1) {
|
int pages = (int) Math.ceil(subCommands.length
|
||||||
|
/ (float) this.subCommandsPerPage);
|
||||||
|
String command = commandExecuted.substring(0, 1).toUpperCase()
|
||||||
|
+ commandExecuted.substring(1).toLowerCase();
|
||||||
|
if (args.length > 1) {
|
||||||
try {
|
try {
|
||||||
helpPage = Integer.parseInt(args[1]);
|
helpPage = Integer.parseInt(args[1]);
|
||||||
if(helpPage > pages) {
|
if (helpPage > pages) {
|
||||||
helpPage = pages;
|
helpPage = pages;
|
||||||
}
|
}
|
||||||
if(helpPage <= 0) {
|
if (helpPage <= 0) {
|
||||||
helpPage = 1;
|
helpPage = 1;
|
||||||
}
|
}
|
||||||
}
|
} catch (NumberFormatException e) {
|
||||||
catch(NumberFormatException e) {
|
|
||||||
String subCommand = args[1].toLowerCase();
|
String subCommand = args[1].toLowerCase();
|
||||||
if(this.subCommandRegistry.isArgRegistered(subCommand)) {
|
if (this.subCommandRegistry.isArgRegistered(
|
||||||
|
subCommand)) {
|
||||||
sender.sendMessage("");
|
sender.sendMessage("");
|
||||||
var helpTitle = Lang.centeredTitle(Lang.translateInsertVariables("command.help.subcommandheader",
|
var helpTitle = Lang.centeredTitle(
|
||||||
command, subCommand));
|
Lang.translateInsertVariables(
|
||||||
|
"command.help.subcommandheader", command,
|
||||||
|
subCommand));
|
||||||
sender.sendMessage(helpTitle);
|
sender.sendMessage(helpTitle);
|
||||||
sender.sendMessage("\u00A77" + this.getSubCommand(subCommand).getDetailedHelpText());
|
sender.sendMessage("\u00A77"
|
||||||
}
|
+ this.getSubCommand(subCommand)
|
||||||
else {
|
.getDetailedHelpText());
|
||||||
sender.sendMessage(Lang.translate("messageprefix.negative") + Lang.translateInsertVariables("command.help.invalidhelp", args[1]));
|
} else {
|
||||||
|
sender.sendMessage(
|
||||||
|
Lang.translate("messageprefix.negative")
|
||||||
|
+ Lang.translateInsertVariables(
|
||||||
|
"command.help.invalidhelp", args[1]));
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sender.sendMessage("");
|
sender.sendMessage("");
|
||||||
|
|
||||||
var helpTitle = Lang.centeredTitle(Lang.translateInsertVariables("command.help.header",
|
var helpTitle =
|
||||||
command, helpPage, pages));
|
Lang.centeredTitle(Lang.translateInsertVariables(
|
||||||
|
"command.help.header", command, helpPage, pages));
|
||||||
|
|
||||||
sender.sendMessage(helpTitle);
|
sender.sendMessage(helpTitle);
|
||||||
sender.sendMessage("\u00A7a█\u00A77 = Permission \u00A7c█\u00A77 = No Permission");
|
sender.sendMessage(
|
||||||
|
"\u00A7a█\u00A77 = Permission \u00A7c█\u00A77 "
|
||||||
|
+ "= No Permission");
|
||||||
int subCommandOffset = (helpPage - 1) * this.subCommandsPerPage;
|
int subCommandOffset = (helpPage - 1) * this.subCommandsPerPage;
|
||||||
int displayEnd = subCommandOffset + this.subCommandsPerPage;
|
int displayEnd = subCommandOffset + this.subCommandsPerPage;
|
||||||
if(displayEnd > subCommands.length) {
|
if (displayEnd > subCommands.length) {
|
||||||
displayEnd = subCommands.length;
|
displayEnd = subCommands.length;
|
||||||
}
|
}
|
||||||
for(; subCommandOffset < displayEnd; subCommandOffset++) {
|
for (; subCommandOffset < displayEnd; subCommandOffset++) {
|
||||||
SubCommand subCommand = this.getSubCommand(subCommands[subCommandOffset]);
|
SubCommand subCommand =
|
||||||
String colorCode = "\u00A7" + (subCommand.hasPermission(sender) ? "a" : "c");
|
this.getSubCommand(subCommands[subCommandOffset]);
|
||||||
sender.sendMessage("\u00A7e/" + commandExecuted + " " + subCommands[subCommandOffset]
|
String colorCode = "\u00A7"
|
||||||
+ colorCode + " - " + subCommand.getBasicHelpText());
|
+ (subCommand.hasPermission(sender) ? "a" : "c");
|
||||||
|
sender.sendMessage("\u00A7e/" + commandExecuted + " "
|
||||||
|
+ subCommands[subCommandOffset]
|
||||||
|
+ colorCode + " - "
|
||||||
|
+ subCommand.getBasicHelpText());
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
for (String subCommandName :
|
||||||
for(String subCommandName : this.subCommandRegistry.getSubCommands()) {
|
this.subCommandRegistry.getSubCommands()) {
|
||||||
if(subCommandName.equalsIgnoreCase(args[0])) {
|
if (subCommandName.equalsIgnoreCase(args[0])) {
|
||||||
SubCommand subCommand = this.getSubCommand(subCommandName);
|
SubCommand subCommand =
|
||||||
if(subCommand.hasPermission(sender)) {
|
this.getSubCommand(subCommandName);
|
||||||
|
if (subCommand.hasPermission(sender)) {
|
||||||
subCommand.onCommand(sender, args);
|
subCommand.onCommand(sender, args);
|
||||||
}
|
} else {
|
||||||
else {
|
sender.sendMessage(
|
||||||
sender.sendMessage(Lang.translate("messageprefix.negative") + Lang.translateInsertVariables("command.subcommand.nopermission",
|
Lang.translate("messageprefix.negative")
|
||||||
|
+ Lang.translateInsertVariables(
|
||||||
|
"command.subcommand.nopermission",
|
||||||
commandExecuted));
|
commandExecuted));
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sender.sendMessage(Lang.translate("messageprefix.negative") + Lang.translate("command.subcommand.invalid"));
|
sender.sendMessage(
|
||||||
|
Lang.translate("messageprefix.negative")
|
||||||
|
+ Lang.translate("command.subcommand.invalid"));
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
sender.sendMessage(Lang.translate("messageprefix.negative")
|
||||||
sender.sendMessage(Lang.translate("messageprefix.negative") + Lang.translateInsertVariables("command.noargs", commandExecuted));
|
+ Lang.translateInsertVariables(
|
||||||
|
"command.noargs", commandExecuted));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> onTabComplete(CommandSenderContainer sender, String[] args) {
|
public List<String> onTabComplete(CommandSenderContainer sender,
|
||||||
if(args.length > 1) {
|
String[] args) {
|
||||||
if(args[0].equalsIgnoreCase("help")) {
|
if (args.length > 1) {
|
||||||
List<String> allowedCommands = new ArrayList<>(this.subCommandRegistry.getSubCommands());
|
if (args[0].equalsIgnoreCase("help")) {
|
||||||
int pages = (int) Math.ceil(allowedCommands.size() / (float) this.subCommandsPerPage);
|
List<String> allowedCommands =
|
||||||
|
new ArrayList<>(this.subCommandRegistry.getSubCommands());
|
||||||
|
int pages = (int) Math.ceil(allowedCommands.size()
|
||||||
|
/ (float) this.subCommandsPerPage);
|
||||||
for (int i = 1; i <= pages; i++) {
|
for (int i = 1; i <= pages; i++) {
|
||||||
allowedCommands.add(String.valueOf(i));
|
allowedCommands.add(String.valueOf(i));
|
||||||
}
|
}
|
||||||
Collections.sort(allowedCommands);
|
Collections.sort(allowedCommands);
|
||||||
return this.filterTabResults(allowedCommands, args[args.length - 1]);
|
return this.filterTabResults(allowedCommands,
|
||||||
}
|
|
||||||
else {
|
|
||||||
for (String subCommandName : this.subCommandRegistry.getSubCommands()) {
|
|
||||||
if (subCommandName.equalsIgnoreCase(args[0])) {
|
|
||||||
SubCommand subCommand = this.getSubCommand(subCommandName);
|
|
||||||
if (subCommand.hasPermission(sender)) {
|
|
||||||
List<String> tabComplete = this.filterTabResults(this.getSubCommand(subCommandName).onTabComplete(sender, args),
|
|
||||||
args[args.length - 1]);
|
args[args.length - 1]);
|
||||||
if(tabComplete != null) {
|
} else {
|
||||||
|
for (String subCommandName :
|
||||||
|
this.subCommandRegistry.getSubCommands()) {
|
||||||
|
if (subCommandName.equalsIgnoreCase(args[0])) {
|
||||||
|
SubCommand subCommand =
|
||||||
|
this.getSubCommand(subCommandName);
|
||||||
|
if (subCommand.hasPermission(sender)) {
|
||||||
|
List<String> tabComplete = this.filterTabResults(
|
||||||
|
this.getSubCommand(subCommandName)
|
||||||
|
.onTabComplete(sender, args),
|
||||||
|
args[args.length - 1]);
|
||||||
|
if (tabComplete != null) {
|
||||||
return tabComplete;
|
return tabComplete;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -152,12 +185,12 @@ public class CommandWithSubCommands implements CommandTemplate {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
List<String> allowedCommands = new ArrayList<>();
|
List<String> allowedCommands = new ArrayList<>();
|
||||||
for (String subCommandName : this.subCommandRegistry.getSubCommands()) {
|
for (String subCommandName :
|
||||||
|
this.subCommandRegistry.getSubCommands()) {
|
||||||
SubCommand subCommand = this.getSubCommand(subCommandName);
|
SubCommand subCommand = this.getSubCommand(subCommandName);
|
||||||
if(subCommand.hasPermission(sender)) {
|
if (subCommand.hasPermission(sender)) {
|
||||||
allowedCommands.add(subCommandName);
|
allowedCommands.add(subCommandName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -169,7 +202,7 @@ public class CommandWithSubCommands implements CommandTemplate {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public List<String> filterTabResults(List<String> tabList, String lastArg) {
|
public List<String> filterTabResults(List<String> tabList, String lastArg) {
|
||||||
if(tabList == null) {
|
if (tabList == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return tabList.stream()
|
return tabList.stream()
|
||||||
|
@ -1,16 +1,14 @@
|
|||||||
package com.sekwah.advancedportals.core.commands;
|
package com.sekwah.advancedportals.core.commands;
|
||||||
|
|
||||||
import com.sekwah.advancedportals.core.connector.containers.CommandSenderContainer;
|
import com.sekwah.advancedportals.core.connector.containers.CommandSenderContainer;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public interface SubCommand {
|
public interface SubCommand {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param sender
|
* @param sender
|
||||||
* @param args arguments including the subcommand that has been specified.
|
* @param args arguments including the subcommand that has been specified.
|
||||||
* @return if the command has worked (if false it will just display a message from the command
|
* @return if the command has worked (if false it will just display a
|
||||||
* suggesting to check help)
|
* message from the command suggesting to check help)
|
||||||
*/
|
*/
|
||||||
void onCommand(CommandSenderContainer sender, String[] args);
|
void onCommand(CommandSenderContainer sender, String[] args);
|
||||||
|
|
||||||
|
@ -5,7 +5,6 @@ import com.sekwah.advancedportals.core.connector.containers.CommandSenderContain
|
|||||||
import com.sekwah.advancedportals.core.serializeddata.DataTag;
|
import com.sekwah.advancedportals.core.serializeddata.DataTag;
|
||||||
import com.sekwah.advancedportals.core.util.TagReader;
|
import com.sekwah.advancedportals.core.util.TagReader;
|
||||||
import com.sekwah.advancedportals.core.warphandler.Tag;
|
import com.sekwah.advancedportals.core.warphandler.Tag;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -13,34 +12,36 @@ import java.util.Set;
|
|||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public abstract class CreateTaggedSubCommand implements SubCommand {
|
public abstract class CreateTaggedSubCommand implements SubCommand {
|
||||||
|
|
||||||
protected abstract List<Tag> getRelatedTags();
|
protected abstract List<Tag> getRelatedTags();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> onTabComplete(CommandSenderContainer sender, String[] args) {
|
public List<String> onTabComplete(CommandSenderContainer sender,
|
||||||
|
String[] args) {
|
||||||
if(TagReader.isClosedString(args)) {
|
if (TagReader.isClosedString(args)) {
|
||||||
return List.of();
|
return List.of();
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Tag> allTags = this.getRelatedTags();
|
List<Tag> allTags = this.getRelatedTags();
|
||||||
List<String> suggestions = new ArrayList<>();
|
List<String> suggestions = new ArrayList<>();
|
||||||
if(args.length > 0) {
|
if (args.length > 0) {
|
||||||
var lastArg = args[args.length - 1];
|
var lastArg = args[args.length - 1];
|
||||||
// Check if the split results in exactly 2 or if its 1 and ends with :
|
// Check if the split results in exactly 2 or if its 1 and ends
|
||||||
|
// with :
|
||||||
var split = lastArg.split(":");
|
var split = lastArg.split(":");
|
||||||
if(split.length == 2 || (split.length == 1 && lastArg.endsWith(":"))) {
|
if (split.length == 2
|
||||||
// Loop over tags in allTags and check if the first half of split is equal to the tag name or alias
|
|| (split.length == 1 && lastArg.endsWith(":"))) {
|
||||||
for(Tag tag : allTags) {
|
// Loop over tags in allTags and check if the first half of
|
||||||
|
// split is equal to the tag name or alias
|
||||||
|
for (Tag tag : allTags) {
|
||||||
// Check if the last tag starts with the tag name or alias
|
// Check if the last tag starts with the tag name or alias
|
||||||
var startsWith = false;
|
var startsWith = false;
|
||||||
if(lastArg.startsWith(tag.getName())) {
|
if (lastArg.startsWith(tag.getName())) {
|
||||||
startsWith = true;
|
startsWith = true;
|
||||||
} else {
|
} else {
|
||||||
var aliases = tag.getAliases();
|
var aliases = tag.getAliases();
|
||||||
if(aliases != null) {
|
if (aliases != null) {
|
||||||
for (String alias : aliases) {
|
for (String alias : aliases) {
|
||||||
if(lastArg.startsWith(alias)) {
|
if (lastArg.startsWith(alias)) {
|
||||||
startsWith = true;
|
startsWith = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -48,33 +49,52 @@ public abstract class CreateTaggedSubCommand implements SubCommand {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(tag instanceof Tag.AutoComplete autoComplete && startsWith) {
|
if (tag instanceof Tag.AutoComplete autoComplete
|
||||||
|
&& startsWith) {
|
||||||
var argData = split.length == 2 ? split[1] : "";
|
var argData = split.length == 2 ? split[1] : "";
|
||||||
var tagSuggestions = autoComplete.autoComplete(argData);
|
var tagSuggestions = autoComplete.autoComplete(argData);
|
||||||
|
|
||||||
if(tagSuggestions != null) {
|
if (tagSuggestions != null) {
|
||||||
if(tag instanceof Tag.Split splitTag) {
|
if (tag instanceof Tag.Split splitTag) {
|
||||||
var multiTagSplit = splitTag.splitString();
|
var multiTagSplit = splitTag.splitString();
|
||||||
boolean endsWithSplit = argData.endsWith(multiTagSplit);
|
boolean endsWithSplit =
|
||||||
|
argData.endsWith(multiTagSplit);
|
||||||
String[] items = argData.split(multiTagSplit);
|
String[] items = argData.split(multiTagSplit);
|
||||||
Set<String> existingItems = Arrays.stream(items, 0, endsWithSplit ? items.length : items.length - 1)
|
Set<String> existingItems =
|
||||||
|
Arrays
|
||||||
|
.stream(items, 0,
|
||||||
|
endsWithSplit
|
||||||
|
? items.length
|
||||||
|
: items.length - 1)
|
||||||
.map(String::trim)
|
.map(String::trim)
|
||||||
.collect(Collectors.toSet());
|
.collect(Collectors.toSet());
|
||||||
|
|
||||||
String partialInput = endsWithSplit ? "" : items[items.length - 1].trim();
|
String partialInput = endsWithSplit
|
||||||
String baseString = endsWithSplit ? argData : argData.substring(0, argData.lastIndexOf(multiTagSplit) + 1);
|
? ""
|
||||||
|
: items[items.length - 1].trim();
|
||||||
|
String baseString = endsWithSplit
|
||||||
|
? argData
|
||||||
|
: argData.substring(
|
||||||
|
0,
|
||||||
|
argData.lastIndexOf(multiTagSplit)
|
||||||
|
+ 1);
|
||||||
|
|
||||||
tagSuggestions = tagSuggestions.stream()
|
tagSuggestions =
|
||||||
|
tagSuggestions
|
||||||
|
.stream()
|
||||||
// Remove already listed items
|
// Remove already listed items
|
||||||
.filter(s -> !existingItems.contains(s))
|
.filter(s -> !existingItems.contains(s))
|
||||||
// Remove items that don't match the currently typed input
|
// Remove items that don't match the
|
||||||
|
// currently typed input
|
||||||
.filter(s -> s.startsWith(partialInput))
|
.filter(s -> s.startsWith(partialInput))
|
||||||
// Remap so the auto completes actually show
|
// Remap so the auto completes actually
|
||||||
|
// show
|
||||||
.map(s -> baseString + s)
|
.map(s -> baseString + s)
|
||||||
.toList();
|
.toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Loop over suggestions and add split[0] + ":" to the start
|
// Loop over suggestions and add split[0] + ":" to
|
||||||
|
// the start
|
||||||
for (String tagSuggestion : tagSuggestions) {
|
for (String tagSuggestion : tagSuggestions) {
|
||||||
suggestions.add(split[0] + ":" + tagSuggestion);
|
suggestions.add(split[0] + ":" + tagSuggestion);
|
||||||
}
|
}
|
||||||
@ -88,25 +108,27 @@ public abstract class CreateTaggedSubCommand implements SubCommand {
|
|||||||
|
|
||||||
ArrayList<DataTag> tagsFromArgs = TagReader.getTagsFromArgs(args);
|
ArrayList<DataTag> tagsFromArgs = TagReader.getTagsFromArgs(args);
|
||||||
|
|
||||||
allTags.stream().filter(tag -> {
|
allTags.stream()
|
||||||
|
.filter(tag -> {
|
||||||
for (DataTag argTag : tagsFromArgs) {
|
for (DataTag argTag : tagsFromArgs) {
|
||||||
if(argTag.NAME.equals(tag.getName())) {
|
if (argTag.NAME.equals(tag.getName())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
var aliases = tag.getAliases();
|
var aliases = tag.getAliases();
|
||||||
if(aliases != null) {
|
if (aliases != null) {
|
||||||
for (String alias : aliases) {
|
for (String alias : aliases) {
|
||||||
if(argTag.NAME.equals(alias)) {
|
if (argTag.NAME.equals(alias)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}).forEach(tag -> {
|
})
|
||||||
|
.forEach(tag -> {
|
||||||
suggestions.add(tag.getName());
|
suggestions.add(tag.getName());
|
||||||
var aliases = tag.getAliases();
|
var aliases = tag.getAliases();
|
||||||
if(aliases != null) {
|
if (aliases != null) {
|
||||||
suggestions.addAll(Arrays.stream(aliases).toList());
|
suggestions.addAll(Arrays.stream(aliases).toList());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -125,24 +147,34 @@ public abstract class CreateTaggedSubCommand implements SubCommand {
|
|||||||
|
|
||||||
for (var dataTag : dataTags) {
|
for (var dataTag : dataTags) {
|
||||||
for (Tag tag : relatedTags) {
|
for (Tag tag : relatedTags) {
|
||||||
if(tag instanceof Tag.Split splitTag) {
|
if (tag instanceof Tag.Split splitTag) {
|
||||||
var splitString = splitTag.splitString();
|
var splitString = splitTag.splitString();
|
||||||
if(splitString != null) {
|
if (splitString != null) {
|
||||||
List<String> newValues = new ArrayList<>();
|
List<String> newValues = new ArrayList<>();
|
||||||
for(String split : dataTag.VALUES) {
|
for (String split : dataTag.VALUES) {
|
||||||
newValues.addAll(Arrays.stream(split.split(splitString)).map(String::trim).toList());
|
newValues.addAll(
|
||||||
|
Arrays.stream(split.split(splitString))
|
||||||
|
.map(String::trim)
|
||||||
|
.toList());
|
||||||
}
|
}
|
||||||
dataTag = new DataTag(dataTag.NAME, newValues.toArray(new String[0]));
|
dataTag = new DataTag(dataTag.NAME,
|
||||||
|
newValues.toArray(new String[0]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (dataTag.NAME.equals(tag.getName())) {
|
if (dataTag.NAME.equals(tag.getName())) {
|
||||||
// DataTag name matches the tag's main name, add as is
|
// DataTag name matches the tag's main name, add as is
|
||||||
processedTags.add(dataTag);
|
processedTags.add(dataTag);
|
||||||
break;
|
break;
|
||||||
} else if (tag.getAliases() != null && Arrays.asList(tag.getAliases()).contains(dataTag.NAME)) {
|
} else if (tag.getAliases() != null
|
||||||
// There is currently an edge case where if someone uses multiple aliases or names for tags at the same time, it'll only use the last one applied to the mapping.
|
&& Arrays.asList(tag.getAliases())
|
||||||
// DataTag name matches an alias, create a new DataTag with the main name
|
.contains(dataTag.NAME)) {
|
||||||
processedTags.add(new DataTag(tag.getName(), dataTag.VALUES));
|
// There is currently an edge case where if someone uses
|
||||||
|
// multiple aliases or names for tags at the same time,
|
||||||
|
// it'll only use the last one applied to the mapping.
|
||||||
|
// DataTag name matches an alias, create a new DataTag with
|
||||||
|
// the main name
|
||||||
|
processedTags.add(
|
||||||
|
new DataTag(tag.getName(), dataTag.VALUES));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -153,24 +185,26 @@ public abstract class CreateTaggedSubCommand implements SubCommand {
|
|||||||
dataTags.addAll(processedTags);
|
dataTags.addAll(processedTags);
|
||||||
// Sort the tags by name however make sure name is first
|
// Sort the tags by name however make sure name is first
|
||||||
dataTags.sort((o1, o2) -> {
|
dataTags.sort((o1, o2) -> {
|
||||||
if(o1.NAME.equals("name")) {
|
if (o1.NAME.equals("name")) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if(o2.NAME.equals("name")) {
|
if (o2.NAME.equals("name")) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return o1.NAME.compareTo(o2.NAME);
|
return o1.NAME.compareTo(o2.NAME);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void printTags(CommandSenderContainer sender,
|
||||||
protected void printTags(CommandSenderContainer sender, List<DataTag> dataTags) {
|
List<DataTag> dataTags) {
|
||||||
for (DataTag tag : dataTags) {
|
for (DataTag tag : dataTags) {
|
||||||
if(tag.VALUES.length == 1) {
|
if (tag.VALUES.length == 1) {
|
||||||
sender.sendMessage(" \u00A7a" + tag.NAME + "\u00A77:\u00A7e" + tag.VALUES[0]);
|
sender.sendMessage(" \u00A7a" + tag.NAME + "\u00A77:\u00A7e"
|
||||||
|
+ tag.VALUES[0]);
|
||||||
} else {
|
} else {
|
||||||
for (int i = 0; i < tag.VALUES.length; i++) {
|
for (int i = 0; i < tag.VALUES.length; i++) {
|
||||||
sender.sendMessage(" \u00A7a" + tag.NAME + "\u00A77[" + i + "]:\u00A7e" + tag.VALUES[i]);
|
sender.sendMessage(" \u00A7a" + tag.NAME + "\u00A77[" + i
|
||||||
|
+ "]:\u00A7e" + tag.VALUES[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,13 +12,11 @@ import com.sekwah.advancedportals.core.services.DestinationServices;
|
|||||||
import com.sekwah.advancedportals.core.util.Lang;
|
import com.sekwah.advancedportals.core.util.Lang;
|
||||||
import com.sekwah.advancedportals.core.util.TagReader;
|
import com.sekwah.advancedportals.core.util.TagReader;
|
||||||
import com.sekwah.advancedportals.core.warphandler.Tag;
|
import com.sekwah.advancedportals.core.warphandler.Tag;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class CreateDestiSubCommand extends CreateTaggedSubCommand {
|
public class CreateDestiSubCommand extends CreateTaggedSubCommand {
|
||||||
|
|
||||||
@Inject TagRegistry tagRegistry;
|
@Inject TagRegistry tagRegistry;
|
||||||
|
|
||||||
@Inject DestinationServices destinationServices;
|
@Inject DestinationServices destinationServices;
|
||||||
@ -34,29 +32,29 @@ public class CreateDestiSubCommand extends CreateTaggedSubCommand {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ArrayList<DataTag> destinationTags = TagReader.getTagsFromArgs(args);
|
ArrayList<DataTag> destinationTags =
|
||||||
|
TagReader.getTagsFromArgs(args);
|
||||||
|
|
||||||
// Find the tag with the "name" NAME
|
// Find the tag with the "name" NAME
|
||||||
DataTag nameTag =
|
DataTag nameTag = destinationTags.stream()
|
||||||
destinationTags.stream()
|
|
||||||
.filter(tag -> tag.NAME.equals("name"))
|
.filter(tag -> tag.NAME.equals("name"))
|
||||||
.findFirst()
|
.findFirst()
|
||||||
.orElse(null);
|
.orElse(null);
|
||||||
|
|
||||||
// If the tag is null, check if arg[1] has a : to check it's not a tag.
|
// If the tag is null, check if arg[1] has a : to check it's not a
|
||||||
|
// tag.
|
||||||
if (nameTag == null && !args[1].contains(":")) {
|
if (nameTag == null && !args[1].contains(":")) {
|
||||||
nameTag = new DataTag("name", args[1]);
|
nameTag = new DataTag("name", args[1]);
|
||||||
destinationTags.add(nameTag);
|
destinationTags.add(nameTag);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nameTag == null) {
|
if (nameTag == null) {
|
||||||
sender.sendMessage(
|
sender.sendMessage(Lang.translate("messageprefix.negative")
|
||||||
Lang.translate("messageprefix.negative")
|
|
||||||
+ Lang.translate("command.error.noname"));
|
+ Lang.translate("command.error.noname"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
sender.sendMessage(
|
sender.sendMessage(Lang.centeredTitle(
|
||||||
Lang.centeredTitle(Lang.translate("command.create.destination.prep")));
|
Lang.translate("command.create.destination.prep")));
|
||||||
sender.sendMessage("");
|
sender.sendMessage("");
|
||||||
sender.sendMessage(Lang.translate("command.create.tags"));
|
sender.sendMessage(Lang.translate("command.create.tags"));
|
||||||
|
|
||||||
@ -65,8 +63,8 @@ public class CreateDestiSubCommand extends CreateTaggedSubCommand {
|
|||||||
this.printTags(sender, destinationTags);
|
this.printTags(sender, destinationTags);
|
||||||
}
|
}
|
||||||
sender.sendMessage("");
|
sender.sendMessage("");
|
||||||
Destination destination =
|
Destination destination = destinationServices.createDesti(
|
||||||
destinationServices.createDesti(player, player.getLoc(), destinationTags);
|
player, player.getLoc(), destinationTags);
|
||||||
if (destination != null) {
|
if (destination != null) {
|
||||||
sender.sendMessage(
|
sender.sendMessage(
|
||||||
Lang.translate("messageprefix.positive")
|
Lang.translate("messageprefix.positive")
|
||||||
@ -78,8 +76,7 @@ public class CreateDestiSubCommand extends CreateTaggedSubCommand {
|
|||||||
+ Lang.translate("command.create.destination.error"));
|
+ Lang.translate("command.create.destination.error"));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
sender.sendMessage(
|
sender.sendMessage(Lang.translate("messageprefix.negative")
|
||||||
Lang.translate("messageprefix.negative")
|
|
||||||
+ Lang.translate("command.error.noname"));
|
+ Lang.translate("command.error.noname"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -94,7 +91,9 @@ public class CreateDestiSubCommand extends CreateTaggedSubCommand {
|
|||||||
var tags = tagRegistry.getTags();
|
var tags = tagRegistry.getTags();
|
||||||
// Filter tags that support Destination
|
// Filter tags that support Destination
|
||||||
return tags.stream()
|
return tags.stream()
|
||||||
.filter(tag -> Arrays.asList(tag.getTagTypes()).contains(Tag.TagType.DESTINATION))
|
.filter(tag
|
||||||
|
-> Arrays.asList(tag.getTagTypes())
|
||||||
|
.contains(Tag.TagType.DESTINATION))
|
||||||
.toList();
|
.toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,23 +5,19 @@ import com.sekwah.advancedportals.core.commands.SubCommand;
|
|||||||
import com.sekwah.advancedportals.core.connector.containers.CommandSenderContainer;
|
import com.sekwah.advancedportals.core.connector.containers.CommandSenderContainer;
|
||||||
import com.sekwah.advancedportals.core.services.DestinationServices;
|
import com.sekwah.advancedportals.core.services.DestinationServices;
|
||||||
import com.sekwah.advancedportals.core.util.Lang;
|
import com.sekwah.advancedportals.core.util.Lang;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class ListDestiSubCommand implements SubCommand {
|
public class ListDestiSubCommand implements SubCommand {
|
||||||
|
|
||||||
@Inject DestinationServices portalServices;
|
@Inject DestinationServices portalServices;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCommand(CommandSenderContainer sender, String[] args) {
|
public void onCommand(CommandSenderContainer sender, String[] args) {
|
||||||
sender.sendMessage(
|
sender.sendMessage(
|
||||||
Lang.translate("messageprefix.positive")
|
Lang.translate("messageprefix.positive")
|
||||||
+ Lang.translate("command.destination.list")
|
+ Lang.translate("command.destination.list") + " "
|
||||||
+ " "
|
+ portalServices.getDestinationNames().stream().sorted().collect(
|
||||||
+ portalServices.getDestinationNames().stream()
|
Collectors.joining(", ")));
|
||||||
.sorted()
|
|
||||||
.collect(Collectors.joining(", ")));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -30,7 +26,8 @@ public class ListDestiSubCommand implements SubCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> onTabComplete(CommandSenderContainer sender, String[] args) {
|
public List<String> onTabComplete(CommandSenderContainer sender,
|
||||||
|
String[] args) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,18 +6,17 @@ import com.sekwah.advancedportals.core.connector.containers.CommandSenderContain
|
|||||||
import com.sekwah.advancedportals.core.permissions.PortalPermissions;
|
import com.sekwah.advancedportals.core.permissions.PortalPermissions;
|
||||||
import com.sekwah.advancedportals.core.services.DestinationServices;
|
import com.sekwah.advancedportals.core.services.DestinationServices;
|
||||||
import com.sekwah.advancedportals.core.util.Lang;
|
import com.sekwah.advancedportals.core.util.Lang;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class RemoveDestiSubCommand implements SubCommand {
|
public class RemoveDestiSubCommand implements SubCommand {
|
||||||
|
|
||||||
@Inject DestinationServices destinationServices;
|
@Inject DestinationServices destinationServices;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCommand(CommandSenderContainer sender, String[] args) {
|
public void onCommand(CommandSenderContainer sender, String[] args) {
|
||||||
if (args.length > 1) {
|
if (args.length > 1) {
|
||||||
if (destinationServices.removeDestination(args[1], sender.getPlayerContainer())) {
|
if (destinationServices.removeDestination(
|
||||||
|
args[1], sender.getPlayerContainer())) {
|
||||||
sender.sendMessage(
|
sender.sendMessage(
|
||||||
Lang.translate("messageprefix.positive")
|
Lang.translate("messageprefix.positive")
|
||||||
+ Lang.translate("command.destination.remove.complete"));
|
+ Lang.translate("command.destination.remove.complete"));
|
||||||
@ -37,7 +36,8 @@ public class RemoveDestiSubCommand implements SubCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> onTabComplete(CommandSenderContainer sender, String[] args) {
|
public List<String> onTabComplete(CommandSenderContainer sender,
|
||||||
|
String[] args) {
|
||||||
if (args.length > 2) {
|
if (args.length > 2) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
@ -13,17 +13,16 @@ import com.sekwah.advancedportals.core.services.PlayerDataServices;
|
|||||||
import com.sekwah.advancedportals.core.util.Debug;
|
import com.sekwah.advancedportals.core.util.Debug;
|
||||||
import com.sekwah.advancedportals.core.util.GameScheduler;
|
import com.sekwah.advancedportals.core.util.GameScheduler;
|
||||||
import com.sekwah.advancedportals.core.util.Lang;
|
import com.sekwah.advancedportals.core.util.Lang;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This will be different from the old show command and I believe it is 1.16+ till the latest
|
* This will be different from the old show command and I believe it is 1.16+
|
||||||
* version as of writing this.
|
* till the latest version as of writing this.
|
||||||
*/
|
*/
|
||||||
public class ShowDestiSubCommand implements SubCommand, SubCommand.SubCommandOnInit {
|
public class ShowDestiSubCommand
|
||||||
|
implements SubCommand, SubCommand.SubCommandOnInit {
|
||||||
@Inject PlayerDataServices tempDataServices;
|
@Inject PlayerDataServices tempDataServices;
|
||||||
|
|
||||||
@Inject GameScheduler gameScheduler;
|
@Inject GameScheduler gameScheduler;
|
||||||
@ -45,7 +44,8 @@ public class ShowDestiSubCommand implements SubCommand, SubCommand.SubCommandOnI
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var tempData = tempDataServices.getPlayerData(sender.getPlayerContainer());
|
var tempData =
|
||||||
|
tempDataServices.getPlayerData(sender.getPlayerContainer());
|
||||||
if (tempData.isDestiVisible()) {
|
if (tempData.isDestiVisible()) {
|
||||||
sender.sendMessage(
|
sender.sendMessage(
|
||||||
Lang.translate("messageprefix.negative")
|
Lang.translate("messageprefix.negative")
|
||||||
@ -64,7 +64,8 @@ public class ShowDestiSubCommand implements SubCommand, SubCommand.SubCommandOnI
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> onTabComplete(CommandSenderContainer sender, String[] args) {
|
public List<String> onTabComplete(CommandSenderContainer sender,
|
||||||
|
String[] args) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,30 +81,26 @@ public class ShowDestiSubCommand implements SubCommand, SubCommand.SubCommandOnI
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registered() {
|
public void registered() {
|
||||||
gameScheduler.intervalTickEvent(
|
gameScheduler.intervalTickEvent("show_portal", () -> {
|
||||||
"show_portal",
|
|
||||||
() -> {
|
|
||||||
for (PlayerContainer player : serverContainer.getPlayers()) {
|
for (PlayerContainer player : serverContainer.getPlayers()) {
|
||||||
var tempData = tempDataServices.getPlayerData(player);
|
var tempData = tempDataServices.getPlayerData(player);
|
||||||
if (!tempData.isDestiVisible()) {
|
if (!tempData.isDestiVisible()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Destination destination : destinationServices.getDestinations()) {
|
for (Destination destination :
|
||||||
|
destinationServices.getDestinations()) {
|
||||||
var pos = destination.getLoc();
|
var pos = destination.getLoc();
|
||||||
if (Objects.equals(pos.getWorldName(), player.getWorldName())
|
if (Objects.equals(pos.getWorldName(),
|
||||||
&& pos.distanceTo(player.getLoc()) < config.getVisibleRange()) {
|
player.getWorldName())
|
||||||
Debug.addMarker(
|
&& pos.distanceTo(player.getLoc())
|
||||||
player,
|
< config.getVisibleRange()) {
|
||||||
pos.toBlockPos(),
|
Debug.addMarker(player, pos.toBlockPos(),
|
||||||
destination.getArgValues("name")[0],
|
destination.getArgValues("name")[0],
|
||||||
new Color(100, 100, 100, 100),
|
new Color(100, 100, 100, 100), 1300);
|
||||||
1300);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
}, 1, 20);
|
||||||
1,
|
|
||||||
20);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,18 +6,17 @@ import com.sekwah.advancedportals.core.connector.containers.CommandSenderContain
|
|||||||
import com.sekwah.advancedportals.core.permissions.PortalPermissions;
|
import com.sekwah.advancedportals.core.permissions.PortalPermissions;
|
||||||
import com.sekwah.advancedportals.core.services.DestinationServices;
|
import com.sekwah.advancedportals.core.services.DestinationServices;
|
||||||
import com.sekwah.advancedportals.core.util.Lang;
|
import com.sekwah.advancedportals.core.util.Lang;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class TeleportDestiSubCommand implements SubCommand {
|
public class TeleportDestiSubCommand implements SubCommand {
|
||||||
|
|
||||||
@Inject DestinationServices destinationServices;
|
@Inject DestinationServices destinationServices;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCommand(CommandSenderContainer sender, String[] args) {
|
public void onCommand(CommandSenderContainer sender, String[] args) {
|
||||||
if (args.length > 1) {
|
if (args.length > 1) {
|
||||||
if (destinationServices.teleportToDestination(args[1], sender.getPlayerContainer())) {
|
if (destinationServices.teleportToDestination(
|
||||||
|
args[1], sender.getPlayerContainer())) {
|
||||||
sender.sendMessage(
|
sender.sendMessage(
|
||||||
Lang.translate("messageprefix.positive")
|
Lang.translate("messageprefix.positive")
|
||||||
+ Lang.translate("command.destination.teleport.success")
|
+ Lang.translate("command.destination.teleport.success")
|
||||||
@ -39,7 +38,8 @@ public class TeleportDestiSubCommand implements SubCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> onTabComplete(CommandSenderContainer sender, String[] args) {
|
public List<String> onTabComplete(CommandSenderContainer sender,
|
||||||
|
String[] args) {
|
||||||
if (args.length > 2) {
|
if (args.length > 2) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
@ -16,13 +16,11 @@ import com.sekwah.advancedportals.core.util.InfoLogger;
|
|||||||
import com.sekwah.advancedportals.core.util.Lang;
|
import com.sekwah.advancedportals.core.util.Lang;
|
||||||
import com.sekwah.advancedportals.core.util.TagReader;
|
import com.sekwah.advancedportals.core.util.TagReader;
|
||||||
import com.sekwah.advancedportals.core.warphandler.Tag;
|
import com.sekwah.advancedportals.core.warphandler.Tag;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class CreatePortalSubCommand extends CreateTaggedSubCommand {
|
public class CreatePortalSubCommand extends CreateTaggedSubCommand {
|
||||||
|
|
||||||
@Inject PortalServices portalServices;
|
@Inject PortalServices portalServices;
|
||||||
|
|
||||||
@Inject TagRegistry tagRegistry;
|
@Inject TagRegistry tagRegistry;
|
||||||
@ -36,8 +34,7 @@ public class CreatePortalSubCommand extends CreateTaggedSubCommand {
|
|||||||
if (args.length > 1) {
|
if (args.length > 1) {
|
||||||
PlayerContainer player = sender.getPlayerContainer();
|
PlayerContainer player = sender.getPlayerContainer();
|
||||||
if (player == null) {
|
if (player == null) {
|
||||||
sender.sendMessage(
|
sender.sendMessage(Lang.translate("messageprefix.negative")
|
||||||
Lang.translate("messageprefix.negative")
|
|
||||||
+ Lang.translate("command.create.console"));
|
+ Lang.translate("command.create.console"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -47,8 +44,7 @@ public class CreatePortalSubCommand extends CreateTaggedSubCommand {
|
|||||||
// Find the tag with the "name" NAME
|
// Find the tag with the "name" NAME
|
||||||
DataTag nameTag =
|
DataTag nameTag =
|
||||||
portalTags.stream()
|
portalTags.stream()
|
||||||
.filter(
|
.filter(tag -> {
|
||||||
tag -> {
|
|
||||||
this.infoLogger.info("Tag: " + tag.NAME);
|
this.infoLogger.info("Tag: " + tag.NAME);
|
||||||
this.infoLogger.info(
|
this.infoLogger.info(
|
||||||
"Equals: " + tag.NAME.equals(NameTag.TAG_NAME));
|
"Equals: " + tag.NAME.equals(NameTag.TAG_NAME));
|
||||||
@ -57,20 +53,21 @@ public class CreatePortalSubCommand extends CreateTaggedSubCommand {
|
|||||||
.findFirst()
|
.findFirst()
|
||||||
.orElse(null);
|
.orElse(null);
|
||||||
|
|
||||||
// If the tag is null, check if arg[1] has a : to check it's not a tag.
|
// If the tag is null, check if arg[1] has a : to check it's not a
|
||||||
|
// tag.
|
||||||
if (nameTag == null && !args[1].contains(":")) {
|
if (nameTag == null && !args[1].contains(":")) {
|
||||||
nameTag = new DataTag("name", args[1]);
|
nameTag = new DataTag("name", args[1]);
|
||||||
portalTags.add(nameTag);
|
portalTags.add(nameTag);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nameTag == null) {
|
if (nameTag == null) {
|
||||||
sender.sendMessage(
|
sender.sendMessage(Lang.translate("messageprefix.negative")
|
||||||
Lang.translate("messageprefix.negative")
|
|
||||||
+ Lang.translate("command.error.noname"));
|
+ Lang.translate("command.error.noname"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sender.sendMessage(Lang.centeredTitle(Lang.translate("command.create.portal.prep")));
|
sender.sendMessage(Lang.centeredTitle(
|
||||||
|
Lang.translate("command.create.portal.prep")));
|
||||||
sender.sendMessage("");
|
sender.sendMessage("");
|
||||||
sender.sendMessage(Lang.translate("command.create.tags"));
|
sender.sendMessage(Lang.translate("command.create.tags"));
|
||||||
|
|
||||||
@ -87,32 +84,31 @@ public class CreatePortalSubCommand extends CreateTaggedSubCommand {
|
|||||||
.orElse(null);
|
.orElse(null);
|
||||||
|
|
||||||
if (triggerBlockTag == null) {
|
if (triggerBlockTag == null) {
|
||||||
portalTags.add(
|
portalTags.add(new DataTag(TriggerBlockTag.TAG_NAME,
|
||||||
new DataTag(TriggerBlockTag.TAG_NAME, config.getDefaultTriggerBlock()));
|
config.getDefaultTriggerBlock()));
|
||||||
}
|
}
|
||||||
|
|
||||||
AdvancedPortal portal = portalServices.createPortal(player, portalTags);
|
AdvancedPortal portal =
|
||||||
|
portalServices.createPortal(player, portalTags);
|
||||||
if (portal != null) {
|
if (portal != null) {
|
||||||
sender.sendMessage(
|
sender.sendMessage(Lang.translate("messageprefix.positive")
|
||||||
Lang.translate("messageprefix.positive")
|
|
||||||
+ Lang.translate("command.create.complete"));
|
+ Lang.translate("command.create.complete"));
|
||||||
sender.sendMessage(Lang.translate("command.create.tags"));
|
sender.sendMessage(Lang.translate("command.create.tags"));
|
||||||
this.printTags(sender, portal.getArgs());
|
this.printTags(sender, portal.getArgs());
|
||||||
} else {
|
} else {
|
||||||
sender.sendMessage(
|
sender.sendMessage(Lang.translate("messageprefix.negative")
|
||||||
Lang.translate("messageprefix.negative")
|
|
||||||
+ Lang.translate("command.create.error"));
|
+ Lang.translate("command.create.error"));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
sender.sendMessage(
|
sender.sendMessage(Lang.translate("messageprefix.negative")
|
||||||
Lang.translate("messageprefix.negative")
|
|
||||||
+ Lang.translate("command.error.notags"));
|
+ Lang.translate("command.error.notags"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasPermission(CommandSenderContainer sender) {
|
public boolean hasPermission(CommandSenderContainer sender) {
|
||||||
return sender.isOp() || PortalPermissions.CREATE_PORTAL.hasPermission(sender);
|
return sender.isOp()
|
||||||
|
|| PortalPermissions.CREATE_PORTAL.hasPermission(sender);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -120,7 +116,9 @@ public class CreatePortalSubCommand extends CreateTaggedSubCommand {
|
|||||||
var tags = tagRegistry.getTags();
|
var tags = tagRegistry.getTags();
|
||||||
// Filter tags that support Destination
|
// Filter tags that support Destination
|
||||||
return tags.stream()
|
return tags.stream()
|
||||||
.filter(tag -> Arrays.asList(tag.getTagTypes()).contains(Tag.TagType.PORTAL))
|
.filter(tag
|
||||||
|
-> Arrays.asList(tag.getTagTypes())
|
||||||
|
.contains(Tag.TagType.PORTAL))
|
||||||
.toList();
|
.toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,39 +7,36 @@ import com.sekwah.advancedportals.core.connector.containers.CommandSenderContain
|
|||||||
import com.sekwah.advancedportals.core.connector.containers.PlayerContainer;
|
import com.sekwah.advancedportals.core.connector.containers.PlayerContainer;
|
||||||
import com.sekwah.advancedportals.core.permissions.PortalPermissions;
|
import com.sekwah.advancedportals.core.permissions.PortalPermissions;
|
||||||
import com.sekwah.advancedportals.core.util.Lang;
|
import com.sekwah.advancedportals.core.util.Lang;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class EndGatewayBlockSubCommand implements SubCommand {
|
public class EndGatewayBlockSubCommand implements SubCommand {
|
||||||
|
|
||||||
@Inject private AdvancedPortalsCore portalsCore;
|
@Inject private AdvancedPortalsCore portalsCore;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCommand(CommandSenderContainer sender, String[] args) {
|
public void onCommand(CommandSenderContainer sender, String[] args) {
|
||||||
PlayerContainer player = sender.getPlayerContainer();
|
PlayerContainer player = sender.getPlayerContainer();
|
||||||
if (player == null) {
|
if (player == null) {
|
||||||
sender.sendMessage(
|
sender.sendMessage(Lang.translate("messageprefix.negative")
|
||||||
Lang.translate("messageprefix.negative")
|
|
||||||
+ Lang.translate("command.playeronly"));
|
+ Lang.translate("command.playeronly"));
|
||||||
} else {
|
} else {
|
||||||
player.giveItem(
|
player.giveItem(
|
||||||
"BLACK_WOOL",
|
"BLACK_WOOL", "\u00A78Gateway Block Placer",
|
||||||
"\u00A78Gateway Block Placer",
|
|
||||||
"\u00A7r\u00A77This wool is made of a magical substance",
|
"\u00A7r\u00A77This wool is made of a magical substance",
|
||||||
"\u00A7r\u00A7eRight Click\u00A77: Place portal block");
|
"\u00A7r\u00A7eRight Click\u00A77: Place portal block");
|
||||||
sender.sendMessage(
|
sender.sendMessage(Lang.translate("messageprefix.positive")
|
||||||
Lang.translate("messageprefix.positive")
|
|
||||||
+ Lang.translate("command.gatewayblock"));
|
+ Lang.translate("command.gatewayblock"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasPermission(CommandSenderContainer sender) {
|
public boolean hasPermission(CommandSenderContainer sender) {
|
||||||
return sender.isOp() || PortalPermissions.CREATE_PORTAL.hasPermission(sender);
|
return sender.isOp()
|
||||||
|
|| PortalPermissions.CREATE_PORTAL.hasPermission(sender);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> onTabComplete(CommandSenderContainer sender, String[] args) {
|
public List<String> onTabComplete(CommandSenderContainer sender,
|
||||||
|
String[] args) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,39 +7,36 @@ import com.sekwah.advancedportals.core.connector.containers.CommandSenderContain
|
|||||||
import com.sekwah.advancedportals.core.connector.containers.PlayerContainer;
|
import com.sekwah.advancedportals.core.connector.containers.PlayerContainer;
|
||||||
import com.sekwah.advancedportals.core.permissions.PortalPermissions;
|
import com.sekwah.advancedportals.core.permissions.PortalPermissions;
|
||||||
import com.sekwah.advancedportals.core.util.Lang;
|
import com.sekwah.advancedportals.core.util.Lang;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class EndPortalBlockSubCommand implements SubCommand {
|
public class EndPortalBlockSubCommand implements SubCommand {
|
||||||
|
|
||||||
@Inject private AdvancedPortalsCore portalsCore;
|
@Inject private AdvancedPortalsCore portalsCore;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCommand(CommandSenderContainer sender, String[] args) {
|
public void onCommand(CommandSenderContainer sender, String[] args) {
|
||||||
PlayerContainer player = sender.getPlayerContainer();
|
PlayerContainer player = sender.getPlayerContainer();
|
||||||
if (player == null) {
|
if (player == null) {
|
||||||
sender.sendMessage(
|
sender.sendMessage(Lang.translate("messageprefix.negative")
|
||||||
Lang.translate("messageprefix.negative")
|
|
||||||
+ Lang.translate("command.playeronly"));
|
+ Lang.translate("command.playeronly"));
|
||||||
} else {
|
} else {
|
||||||
player.giveItem(
|
player.giveItem(
|
||||||
"BLACK_WOOL",
|
"BLACK_WOOL", "\u00A78End Portal Block Placer",
|
||||||
"\u00A78End Portal Block Placer",
|
|
||||||
"\u00A7r\u00A77This wool is made of a magical substance",
|
"\u00A7r\u00A77This wool is made of a magical substance",
|
||||||
"\u00A7r\u00A7eRight Click\u00A77: Place portal block");
|
"\u00A7r\u00A7eRight Click\u00A77: Place portal block");
|
||||||
sender.sendMessage(
|
sender.sendMessage(Lang.translate("messageprefix.positive")
|
||||||
Lang.translate("messageprefix.positive")
|
|
||||||
+ Lang.translate("command.endportalblock"));
|
+ Lang.translate("command.endportalblock"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasPermission(CommandSenderContainer sender) {
|
public boolean hasPermission(CommandSenderContainer sender) {
|
||||||
return sender.isOp() || PortalPermissions.CREATE_PORTAL.hasPermission(sender);
|
return sender.isOp()
|
||||||
|
|| PortalPermissions.CREATE_PORTAL.hasPermission(sender);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> onTabComplete(CommandSenderContainer sender, String[] args) {
|
public List<String> onTabComplete(CommandSenderContainer sender,
|
||||||
|
String[] args) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,7 +7,6 @@ import com.sekwah.advancedportals.core.connector.containers.CommandSenderContain
|
|||||||
import com.sekwah.advancedportals.core.permissions.PortalPermissions;
|
import com.sekwah.advancedportals.core.permissions.PortalPermissions;
|
||||||
import com.sekwah.advancedportals.core.repository.ConfigRepository;
|
import com.sekwah.advancedportals.core.repository.ConfigRepository;
|
||||||
import com.sekwah.advancedportals.core.util.Lang;
|
import com.sekwah.advancedportals.core.util.Lang;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
@ -18,25 +17,23 @@ import java.util.Map;
|
|||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class LangUpdateSubCommand implements SubCommand {
|
public class LangUpdateSubCommand implements SubCommand {
|
||||||
|
|
||||||
@Inject private AdvancedPortalsCore portalsCore;
|
@Inject private AdvancedPortalsCore portalsCore;
|
||||||
@Inject private ConfigRepository configRepository;
|
@Inject private ConfigRepository configRepository;
|
||||||
|
|
||||||
public LangUpdateSubCommand() {}
|
public LangUpdateSubCommand() {
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCommand(CommandSenderContainer sender, String[] args) {
|
public void onCommand(CommandSenderContainer sender, String[] args) {
|
||||||
if (args.length > 1 && args[1].equalsIgnoreCase("overwrite")) {
|
if (args.length > 1 && args[1].equalsIgnoreCase("overwrite")) {
|
||||||
this.portalsCore
|
this.portalsCore.getDataStorage().copyDefaultFile(
|
||||||
.getDataStorage()
|
"lang/" + configRepository.getTranslation() + ".lang", true);
|
||||||
.copyDefaultFile("lang/" + configRepository.getTranslation() + ".lang", true);
|
sender.sendMessage(Lang.translate("messageprefix.positive")
|
||||||
sender.sendMessage(
|
|
||||||
Lang.translate("messageprefix.positive")
|
|
||||||
+ Lang.translate("translatedata.replaced"));
|
+ Lang.translate("translatedata.replaced"));
|
||||||
Lang.loadLanguage(configRepository.getTranslation());
|
Lang.loadLanguage(configRepository.getTranslation());
|
||||||
} else {
|
} else {
|
||||||
// TODO check what keys are missing and append them to the end of the file, check the
|
// TODO check what keys are missing and append them to the end of
|
||||||
// translation first then GB
|
// the file, check the translation first then GB
|
||||||
Lang lang = Lang.instance;
|
Lang lang = Lang.instance;
|
||||||
Map<String, String> internalTranslation =
|
Map<String, String> internalTranslation =
|
||||||
lang.getInternalLanguageMap(Lang.DEFAULT_LANG);
|
lang.getInternalLanguageMap(Lang.DEFAULT_LANG);
|
||||||
@ -46,48 +43,50 @@ public class LangUpdateSubCommand implements SubCommand {
|
|||||||
Map<String, String> currentTranslation =
|
Map<String, String> currentTranslation =
|
||||||
lang.getLanguageMap(configRepository.getTranslation());
|
lang.getLanguageMap(configRepository.getTranslation());
|
||||||
// Remove everything to leave just the missing keys
|
// Remove everything to leave just the missing keys
|
||||||
for (Map.Entry<String, String> entry : currentTranslation.entrySet()) {
|
for (Map.Entry<String, String> entry :
|
||||||
|
currentTranslation.entrySet()) {
|
||||||
internalTranslation.remove(entry.getKey());
|
internalTranslation.remove(entry.getKey());
|
||||||
}
|
}
|
||||||
|
|
||||||
List<String> newTranslations = new ArrayList<>();
|
List<String> newTranslations = new ArrayList<>();
|
||||||
for (Map.Entry<String, String> entry : internalTranslation.entrySet()) {
|
for (Map.Entry<String, String> entry :
|
||||||
|
internalTranslation.entrySet()) {
|
||||||
newTranslations.add(entry.getKey() + "=" + entry.getValue());
|
newTranslations.add(entry.getKey() + "=" + entry.getValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
String appendText = String.join("\n", newTranslations);
|
String appendText = String.join("\n", newTranslations);
|
||||||
|
|
||||||
InputStream translationFile =
|
InputStream translationFile =
|
||||||
this.portalsCore
|
this.portalsCore.getDataStorage().loadResource(
|
||||||
.getDataStorage()
|
"lang/" + configRepository.getTranslation() + ".lang");
|
||||||
.loadResource("lang/" + configRepository.getTranslation() + ".lang");
|
|
||||||
String result =
|
String result =
|
||||||
new BufferedReader(new InputStreamReader(translationFile))
|
new BufferedReader(new InputStreamReader(translationFile))
|
||||||
.lines()
|
.lines()
|
||||||
.collect(Collectors.joining("\n"));
|
.collect(Collectors.joining("\n"));
|
||||||
InputStream withExtras =
|
InputStream withExtras = new ByteArrayInputStream(
|
||||||
new ByteArrayInputStream(result.concat("\n").concat(appendText).getBytes());
|
result.concat("\n").concat(appendText).getBytes());
|
||||||
this.portalsCore
|
this.portalsCore.getDataStorage().writeResource(
|
||||||
.getDataStorage()
|
withExtras,
|
||||||
.writeResource(
|
"lang/" + configRepository.getTranslation() + ".lang");
|
||||||
withExtras, "lang/" + configRepository.getTranslation() + ".lang");
|
|
||||||
|
|
||||||
Lang.loadLanguage(configRepository.getTranslation());
|
Lang.loadLanguage(configRepository.getTranslation());
|
||||||
|
|
||||||
sender.sendMessage(
|
sender.sendMessage(
|
||||||
Lang.translate("messageprefix.positive")
|
Lang.translate("messageprefix.positive")
|
||||||
+ Lang.translateInsertVariables(
|
+ Lang.translateInsertVariables("translatedata.updated",
|
||||||
"translatedata.updated", newTranslations.size()));
|
newTranslations.size()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasPermission(CommandSenderContainer sender) {
|
public boolean hasPermission(CommandSenderContainer sender) {
|
||||||
return sender.isOp() || PortalPermissions.LANG_UPDATE.hasPermission(sender);
|
return sender.isOp()
|
||||||
|
|| PortalPermissions.LANG_UPDATE.hasPermission(sender);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> onTabComplete(CommandSenderContainer sender, String[] args) {
|
public List<String> onTabComplete(CommandSenderContainer sender,
|
||||||
|
String[] args) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,23 +5,19 @@ import com.sekwah.advancedportals.core.commands.SubCommand;
|
|||||||
import com.sekwah.advancedportals.core.connector.containers.CommandSenderContainer;
|
import com.sekwah.advancedportals.core.connector.containers.CommandSenderContainer;
|
||||||
import com.sekwah.advancedportals.core.services.PortalServices;
|
import com.sekwah.advancedportals.core.services.PortalServices;
|
||||||
import com.sekwah.advancedportals.core.util.Lang;
|
import com.sekwah.advancedportals.core.util.Lang;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class ListPortalsSubCommand implements SubCommand {
|
public class ListPortalsSubCommand implements SubCommand {
|
||||||
|
|
||||||
@Inject PortalServices portalServices;
|
@Inject PortalServices portalServices;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCommand(CommandSenderContainer sender, String[] args) {
|
public void onCommand(CommandSenderContainer sender, String[] args) {
|
||||||
sender.sendMessage(
|
sender.sendMessage(
|
||||||
Lang.translate("messageprefix.positive")
|
Lang.translate("messageprefix.positive")
|
||||||
+ Lang.translate("command.portal.list")
|
+ Lang.translate("command.portal.list") + " "
|
||||||
+ " "
|
+ portalServices.getPortalNames().stream().sorted().collect(
|
||||||
+ portalServices.getPortalNames().stream()
|
Collectors.joining(", ")));
|
||||||
.sorted()
|
|
||||||
.collect(Collectors.joining(", ")));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -30,7 +26,8 @@ public class ListPortalsSubCommand implements SubCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> onTabComplete(CommandSenderContainer sender, String[] args) {
|
public List<String> onTabComplete(CommandSenderContainer sender,
|
||||||
|
String[] args) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,44 +7,39 @@ import com.sekwah.advancedportals.core.connector.containers.CommandSenderContain
|
|||||||
import com.sekwah.advancedportals.core.connector.containers.PlayerContainer;
|
import com.sekwah.advancedportals.core.connector.containers.PlayerContainer;
|
||||||
import com.sekwah.advancedportals.core.permissions.PortalPermissions;
|
import com.sekwah.advancedportals.core.permissions.PortalPermissions;
|
||||||
import com.sekwah.advancedportals.core.util.Lang;
|
import com.sekwah.advancedportals.core.util.Lang;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class PortalBlockSubCommand implements SubCommand {
|
public class PortalBlockSubCommand implements SubCommand {
|
||||||
|
|
||||||
@Inject private AdvancedPortalsCore portalsCore;
|
@Inject private AdvancedPortalsCore portalsCore;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCommand(CommandSenderContainer sender, String[] args) {
|
public void onCommand(CommandSenderContainer sender, String[] args) {
|
||||||
PlayerContainer player = sender.getPlayerContainer();
|
PlayerContainer player = sender.getPlayerContainer();
|
||||||
if (player == null) {
|
if (player == null) {
|
||||||
sender.sendMessage(
|
sender.sendMessage(Lang.translate("messageprefix.negative")
|
||||||
Lang.translate("messageprefix.negative")
|
|
||||||
+ Lang.translate("command.playeronly"));
|
+ Lang.translate("command.playeronly"));
|
||||||
} else {
|
} else {
|
||||||
player.giveItem(
|
player.giveItem(
|
||||||
"PURPLE_WOOL",
|
"PURPLE_WOOL", "\u00A75Portal Block Placer",
|
||||||
"\u00A75Portal Block Placer",
|
|
||||||
"\u00A7r\u00A77This wool is made of a magical substance",
|
"\u00A7r\u00A77This wool is made of a magical substance",
|
||||||
"\u00A7r\u00A7e"
|
"\u00A7r\u00A7e" + Lang.translate("items.interact.left")
|
||||||
+ Lang.translate("items.interact.left")
|
|
||||||
+ "\u00A77: Rotate portal block",
|
+ "\u00A77: Rotate portal block",
|
||||||
"\u00A7r\u00A7e"
|
"\u00A7r\u00A7e" + Lang.translate("items.interact.right")
|
||||||
+ Lang.translate("items.interact.right")
|
|
||||||
+ "\u00A77: Place portal block");
|
+ "\u00A77: Place portal block");
|
||||||
sender.sendMessage(
|
sender.sendMessage(Lang.translate("messageprefix.positive")
|
||||||
Lang.translate("messageprefix.positive")
|
|
||||||
+ Lang.translate("command.portalblock"));
|
+ Lang.translate("command.portalblock"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasPermission(CommandSenderContainer sender) {
|
public boolean hasPermission(CommandSenderContainer sender) {
|
||||||
return sender.isOp() || PortalPermissions.CREATE_PORTAL.hasPermission(sender);
|
return sender.isOp()
|
||||||
|
|| PortalPermissions.CREATE_PORTAL.hasPermission(sender);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> onTabComplete(CommandSenderContainer sender, String[] args) {
|
public List<String> onTabComplete(CommandSenderContainer sender,
|
||||||
|
String[] args) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,11 +9,9 @@ import com.sekwah.advancedportals.core.repository.ConfigRepository;
|
|||||||
import com.sekwah.advancedportals.core.services.DestinationServices;
|
import com.sekwah.advancedportals.core.services.DestinationServices;
|
||||||
import com.sekwah.advancedportals.core.services.PortalServices;
|
import com.sekwah.advancedportals.core.services.PortalServices;
|
||||||
import com.sekwah.advancedportals.core.util.Lang;
|
import com.sekwah.advancedportals.core.util.Lang;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class ReloadPortalSubCommand implements SubCommand {
|
public class ReloadPortalSubCommand implements SubCommand {
|
||||||
|
|
||||||
@Inject private AdvancedPortalsCore portalsCore;
|
@Inject private AdvancedPortalsCore portalsCore;
|
||||||
|
|
||||||
@Inject PortalServices portalServices;
|
@Inject PortalServices portalServices;
|
||||||
@ -28,8 +26,7 @@ public class ReloadPortalSubCommand implements SubCommand {
|
|||||||
portalServices.loadPortals();
|
portalServices.loadPortals();
|
||||||
destinationServices.loadDestinations();
|
destinationServices.loadDestinations();
|
||||||
Lang.loadLanguage(configRepository.getTranslation());
|
Lang.loadLanguage(configRepository.getTranslation());
|
||||||
sender.sendMessage(
|
sender.sendMessage(Lang.translate("messageprefix.positive")
|
||||||
Lang.translate("messageprefix.positive")
|
|
||||||
+ Lang.translate("command.reload.reloaded"));
|
+ Lang.translate("command.reload.reloaded"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -39,7 +36,8 @@ public class ReloadPortalSubCommand implements SubCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> onTabComplete(CommandSenderContainer sender, String[] args) {
|
public List<String> onTabComplete(CommandSenderContainer sender,
|
||||||
|
String[] args) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,17 +6,16 @@ import com.sekwah.advancedportals.core.connector.containers.CommandSenderContain
|
|||||||
import com.sekwah.advancedportals.core.permissions.PortalPermissions;
|
import com.sekwah.advancedportals.core.permissions.PortalPermissions;
|
||||||
import com.sekwah.advancedportals.core.services.PortalServices;
|
import com.sekwah.advancedportals.core.services.PortalServices;
|
||||||
import com.sekwah.advancedportals.core.util.Lang;
|
import com.sekwah.advancedportals.core.util.Lang;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class RemovePortalSubCommand implements SubCommand {
|
public class RemovePortalSubCommand implements SubCommand {
|
||||||
|
|
||||||
@Inject PortalServices portalServices;
|
@Inject PortalServices portalServices;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCommand(CommandSenderContainer sender, String[] args) {
|
public void onCommand(CommandSenderContainer sender, String[] args) {
|
||||||
if (args.length > 1) {
|
if (args.length > 1) {
|
||||||
if (portalServices.removePortal(args[1], sender.getPlayerContainer())) {
|
if (portalServices.removePortal(args[1],
|
||||||
|
sender.getPlayerContainer())) {
|
||||||
sender.sendMessage(
|
sender.sendMessage(
|
||||||
Lang.translate("messageprefix.positive")
|
Lang.translate("messageprefix.positive")
|
||||||
+ Lang.translate("command.portal.remove.complete"));
|
+ Lang.translate("command.portal.remove.complete"));
|
||||||
@ -32,11 +31,13 @@ public class RemovePortalSubCommand implements SubCommand {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasPermission(CommandSenderContainer sender) {
|
public boolean hasPermission(CommandSenderContainer sender) {
|
||||||
return sender.isOp() || PortalPermissions.CREATE_PORTAL.hasPermission(sender);
|
return sender.isOp()
|
||||||
|
|| PortalPermissions.CREATE_PORTAL.hasPermission(sender);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> onTabComplete(CommandSenderContainer sender, String[] args) {
|
public List<String> onTabComplete(CommandSenderContainer sender,
|
||||||
|
String[] args) {
|
||||||
return portalServices.getPortalNames();
|
return portalServices.getPortalNames();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,11 +8,9 @@ import com.sekwah.advancedportals.core.connector.containers.PlayerContainer;
|
|||||||
import com.sekwah.advancedportals.core.permissions.PortalPermissions;
|
import com.sekwah.advancedportals.core.permissions.PortalPermissions;
|
||||||
import com.sekwah.advancedportals.core.repository.ConfigRepository;
|
import com.sekwah.advancedportals.core.repository.ConfigRepository;
|
||||||
import com.sekwah.advancedportals.core.util.Lang;
|
import com.sekwah.advancedportals.core.util.Lang;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class SelectorSubCommand implements SubCommand {
|
public class SelectorSubCommand implements SubCommand {
|
||||||
|
|
||||||
@Inject private ConfigRepository configRepo;
|
@Inject private ConfigRepository configRepo;
|
||||||
|
|
||||||
@Inject private AdvancedPortalsCore portalsCore;
|
@Inject private AdvancedPortalsCore portalsCore;
|
||||||
@ -21,36 +19,34 @@ public class SelectorSubCommand implements SubCommand {
|
|||||||
public void onCommand(CommandSenderContainer sender, String[] args) {
|
public void onCommand(CommandSenderContainer sender, String[] args) {
|
||||||
PlayerContainer player = sender.getPlayerContainer();
|
PlayerContainer player = sender.getPlayerContainer();
|
||||||
if (player == null) {
|
if (player == null) {
|
||||||
sender.sendMessage(
|
sender.sendMessage(Lang.translate("messageprefix.negative")
|
||||||
Lang.translate("messageprefix.negative")
|
|
||||||
+ Lang.translate("command.playeronly"));
|
+ Lang.translate("command.playeronly"));
|
||||||
} else {
|
} else {
|
||||||
player.giveItem(
|
player.giveItem(
|
||||||
configRepo.getSelectorMaterial(),
|
configRepo.getSelectorMaterial(),
|
||||||
"\u00A7e" + Lang.translate("items.selector.name"),
|
"\u00A7e" + Lang.translate("items.selector.name"),
|
||||||
"\u00A7r\u00A77This wand with has the power to help",
|
"\u00A7r\u00A77This wand with has the power to help",
|
||||||
"\u00A7r\u00A77 create portals bistowed upon it!",
|
"\u00A7r\u00A77 create portals bistowed upon it!", "",
|
||||||
"",
|
"\u00A7r\u00A7e" + Lang.translate("items.interact.left")
|
||||||
"\u00A7r\u00A7e"
|
|
||||||
+ Lang.translate("items.interact.left")
|
|
||||||
+ "\u00A77: "
|
+ "\u00A77: "
|
||||||
+ Lang.translateInsertVariables("items.selector.pos", "1"),
|
+ Lang.translateInsertVariables("items.selector.pos", "1"),
|
||||||
"\u00A7r\u00A7e"
|
"\u00A7r\u00A7e" + Lang.translate("items.interact.right")
|
||||||
+ Lang.translate("items.interact.right")
|
|
||||||
+ "\u00A77: "
|
+ "\u00A77: "
|
||||||
+ Lang.translateInsertVariables("items.selector.pos", "2"));
|
+ Lang.translateInsertVariables("items.selector.pos", "2"));
|
||||||
sender.sendMessage(
|
sender.sendMessage(Lang.translate("messageprefix.positive")
|
||||||
Lang.translate("messageprefix.positive") + Lang.translate("command.selector"));
|
+ Lang.translate("command.selector"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasPermission(CommandSenderContainer sender) {
|
public boolean hasPermission(CommandSenderContainer sender) {
|
||||||
return sender.isOp() || PortalPermissions.CREATE_PORTAL.hasPermission(sender);
|
return sender.isOp()
|
||||||
|
|| PortalPermissions.CREATE_PORTAL.hasPermission(sender);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> onTabComplete(CommandSenderContainer sender, String[] args) {
|
public List<String> onTabComplete(CommandSenderContainer sender,
|
||||||
|
String[] args) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,17 +15,16 @@ import com.sekwah.advancedportals.core.tags.activation.NameTag;
|
|||||||
import com.sekwah.advancedportals.core.util.Debug;
|
import com.sekwah.advancedportals.core.util.Debug;
|
||||||
import com.sekwah.advancedportals.core.util.GameScheduler;
|
import com.sekwah.advancedportals.core.util.GameScheduler;
|
||||||
import com.sekwah.advancedportals.core.util.Lang;
|
import com.sekwah.advancedportals.core.util.Lang;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This will be different from the old show command and I believe it is 1.16+ till the latest
|
* This will be different from the old show command and I believe it is 1.16+
|
||||||
* version as of writing this.
|
* till the latest version as of writing this.
|
||||||
*/
|
*/
|
||||||
public class ShowPortalSubCommand implements SubCommand, SubCommand.SubCommandOnInit {
|
public class ShowPortalSubCommand
|
||||||
|
implements SubCommand, SubCommand.SubCommandOnInit {
|
||||||
static final int SHOW_TICKS = 1010;
|
static final int SHOW_TICKS = 1010;
|
||||||
|
|
||||||
boolean alternate_show_trigger = true;
|
boolean alternate_show_trigger = true;
|
||||||
@ -62,14 +61,14 @@ public class ShowPortalSubCommand implements SubCommand, SubCommand.SubCommandOn
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var tempData = playerDataServices.getPlayerData(sender.getPlayerContainer());
|
var tempData =
|
||||||
|
playerDataServices.getPlayerData(sender.getPlayerContainer());
|
||||||
if (tempData.isPortalVisible()) {
|
if (tempData.isPortalVisible()) {
|
||||||
sender.sendMessage(
|
sender.sendMessage(
|
||||||
Lang.translate("messageprefix.negative")
|
Lang.translate("messageprefix.negative")
|
||||||
+ Lang.translate("command.portal.show.disabled"));
|
+ Lang.translate("command.portal.show.disabled"));
|
||||||
} else {
|
} else {
|
||||||
sender.sendMessage(
|
sender.sendMessage(Lang.translate("messageprefix.positive")
|
||||||
Lang.translate("messageprefix.positive")
|
|
||||||
+ Lang.translate("command.portal.show.enabled"));
|
+ Lang.translate("command.portal.show.enabled"));
|
||||||
}
|
}
|
||||||
tempData.setPortalVisible(!tempData.isPortalVisible());
|
tempData.setPortalVisible(!tempData.isPortalVisible());
|
||||||
@ -81,7 +80,8 @@ public class ShowPortalSubCommand implements SubCommand, SubCommand.SubCommandOn
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> onTabComplete(CommandSenderContainer sender, String[] args) {
|
public List<String> onTabComplete(CommandSenderContainer sender,
|
||||||
|
String[] args) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -97,9 +97,7 @@ public class ShowPortalSubCommand implements SubCommand, SubCommand.SubCommandOn
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registered() {
|
public void registered() {
|
||||||
gameScheduler.intervalTickEvent(
|
gameScheduler.intervalTickEvent("show_portal", () -> {
|
||||||
"show_portal",
|
|
||||||
() -> {
|
|
||||||
alternate_show_trigger = !alternate_show_trigger;
|
alternate_show_trigger = !alternate_show_trigger;
|
||||||
for (PlayerContainer player : serverContainer.getPlayers()) {
|
for (PlayerContainer player : serverContainer.getPlayers()) {
|
||||||
var tempData = playerDataServices.getPlayerData(player);
|
var tempData = playerDataServices.getPlayerData(player);
|
||||||
@ -107,39 +105,31 @@ public class ShowPortalSubCommand implements SubCommand, SubCommand.SubCommandOn
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tempData.getPos1() != null
|
if (tempData.getPos1() != null && tempData.getPos2() != null
|
||||||
&& tempData.getPos2() != null
|
&& tempData.getPos1().getWorldName().equals(
|
||||||
&& tempData.getPos1().getWorldName().equals(player.getWorldName())
|
player.getWorldName())
|
||||||
&& tempData.getPos2()
|
&& tempData.getPos2().getWorldName().equals(
|
||||||
.getWorldName()
|
player.getWorldName())) {
|
||||||
.equals(player.getWorldName())) {
|
debugVisuals(player, tempData.getPos1(), tempData.getPos2(),
|
||||||
debugVisuals(
|
SELECTION_COLOR, SHOW_TICKS);
|
||||||
player,
|
|
||||||
tempData.getPos1(),
|
|
||||||
tempData.getPos2(),
|
|
||||||
SELECTION_COLOR,
|
|
||||||
SHOW_TICKS);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tempData.getPos1() != null
|
if (tempData.getPos1() != null
|
||||||
&& tempData.getPos1()
|
&& tempData.getPos1().getWorldName().equals(
|
||||||
.getWorldName()
|
player.getWorldName())) {
|
||||||
.equals(player.getWorldName())) {
|
Debug.addMarker(player, tempData.getPos1(), "Pos1",
|
||||||
Debug.addMarker(
|
POS1_COLOR, SHOW_TICKS);
|
||||||
player, tempData.getPos1(), "Pos1", POS1_COLOR, SHOW_TICKS);
|
|
||||||
}
|
}
|
||||||
if (tempData.getPos2() != null
|
if (tempData.getPos2() != null
|
||||||
&& tempData.getPos2()
|
&& tempData.getPos2().getWorldName().equals(
|
||||||
.getWorldName()
|
player.getWorldName())) {
|
||||||
.equals(player.getWorldName())) {
|
Debug.addMarker(player, tempData.getPos2(), "Pos2",
|
||||||
Debug.addMarker(
|
POS2_COLOR, SHOW_TICKS);
|
||||||
player, tempData.getPos2(), "Pos2", POS2_COLOR, SHOW_TICKS);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var world = player.getWorld();
|
var world = player.getWorld();
|
||||||
for (var portal : portalServices.getPortals()) {
|
for (var portal : portalServices.getPortals()) {
|
||||||
if (Objects.equals(
|
if (Objects.equals(portal.getMinLoc().getWorldName(),
|
||||||
portal.getMinLoc().getWorldName(),
|
|
||||||
player.getWorldName())
|
player.getWorldName())
|
||||||
&& portal.isLocationInPortal(
|
&& portal.isLocationInPortal(
|
||||||
player.getLoc(), config.getVisibleRange())) {
|
player.getLoc(), config.getVisibleRange())) {
|
||||||
@ -148,11 +138,8 @@ public class ShowPortalSubCommand implements SubCommand, SubCommand.SubCommandOn
|
|||||||
int midX = (minLoc.getPosX() + maxLoc.getPosX()) / 2;
|
int midX = (minLoc.getPosX() + maxLoc.getPosX()) / 2;
|
||||||
int midZ = (minLoc.getPosZ() + maxLoc.getPosZ()) / 2;
|
int midZ = (minLoc.getPosZ() + maxLoc.getPosZ()) / 2;
|
||||||
BlockLocation midPoint =
|
BlockLocation midPoint =
|
||||||
new BlockLocation(
|
new BlockLocation(minLoc.getWorldName(), midX,
|
||||||
minLoc.getWorldName(),
|
maxLoc.getPosY(), midZ);
|
||||||
midX,
|
|
||||||
maxLoc.getPosY(),
|
|
||||||
midZ);
|
|
||||||
Color color;
|
Color color;
|
||||||
if (portal.isTriggerBlock(world.getBlock(midPoint))) {
|
if (portal.isTriggerBlock(world.getBlock(midPoint))) {
|
||||||
color = TRIGGER_OUTLINE_COLOR;
|
color = TRIGGER_OUTLINE_COLOR;
|
||||||
@ -162,45 +149,36 @@ public class ShowPortalSubCommand implements SubCommand, SubCommand.SubCommandOn
|
|||||||
|| midPoint.getPosZ() == minLoc.getPosZ()
|
|| midPoint.getPosZ() == minLoc.getPosZ()
|
||||||
|| midPoint.getPosZ() == maxLoc.getPosZ())
|
|| midPoint.getPosZ() == maxLoc.getPosZ())
|
||||||
color = OUTLINE_COLOR;
|
color = OUTLINE_COLOR;
|
||||||
else color = new Color(0, 0, 0, 0);
|
else
|
||||||
|
color = new Color(0, 0, 0, 0);
|
||||||
}
|
}
|
||||||
debugVisuals(
|
debugVisuals(player, portal, OUTLINE_COLOR, SHOW_TICKS,
|
||||||
player, portal, OUTLINE_COLOR, SHOW_TICKS, TRIGGER_COLOR);
|
TRIGGER_COLOR);
|
||||||
var name = portal.getArgValues(NameTag.TAG_NAME);
|
var name = portal.getArgValues(NameTag.TAG_NAME);
|
||||||
if (name != null && name.length > 0) {
|
if (name != null && name.length > 0) {
|
||||||
Debug.addMarker(player, midPoint, name[0], color, SHOW_TICKS);
|
Debug.addMarker(player, midPoint, name[0], color,
|
||||||
|
SHOW_TICKS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
}, 1, 20);
|
||||||
1,
|
|
||||||
20);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void debugVisuals(
|
private void debugVisuals(PlayerContainer player, BlockLocation pos1,
|
||||||
PlayerContainer player, BlockLocation pos1, BlockLocation pos2, Color color, int time) {
|
BlockLocation pos2, Color color, int time) {
|
||||||
debugVisuals(player, pos1, pos2, color, time, null, null);
|
debugVisuals(player, pos1, pos2, color, time, null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void debugVisuals(
|
private void debugVisuals(PlayerContainer player, AdvancedPortal portal,
|
||||||
PlayerContainer player,
|
Color color, int time, Color triggerColor) {
|
||||||
AdvancedPortal portal,
|
debugVisuals(player, portal.getMinLoc(), portal.getMaxLoc(), color,
|
||||||
Color color,
|
time, triggerColor, portal);
|
||||||
int time,
|
|
||||||
Color triggerColor) {
|
|
||||||
debugVisuals(
|
|
||||||
player, portal.getMinLoc(), portal.getMaxLoc(), color, time, triggerColor, portal);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void debugVisuals(
|
private void debugVisuals(PlayerContainer player, BlockLocation pos1,
|
||||||
PlayerContainer player,
|
BlockLocation pos2, Color color, int time,
|
||||||
BlockLocation pos1,
|
Color triggerColor, AdvancedPortal portal) {
|
||||||
BlockLocation pos2,
|
|
||||||
Color color,
|
|
||||||
int time,
|
|
||||||
Color triggerColor,
|
|
||||||
AdvancedPortal portal) {
|
|
||||||
int minX = Math.min(pos1.getPosX(), pos2.getPosX());
|
int minX = Math.min(pos1.getPosX(), pos2.getPosX());
|
||||||
int minY = Math.min(pos1.getPosY(), pos2.getPosY());
|
int minY = Math.min(pos1.getPosY(), pos2.getPosY());
|
||||||
int minZ = Math.min(pos1.getPosZ(), pos2.getPosZ());
|
int minZ = Math.min(pos1.getPosZ(), pos2.getPosZ());
|
||||||
@ -221,105 +199,83 @@ public class ShowPortalSubCommand implements SubCommand, SubCommand.SubCommandOn
|
|||||||
for (int x = minX; x <= maxX; x++) {
|
for (int x = minX; x <= maxX; x++) {
|
||||||
for (int y = minY; y <= maxY; y++) {
|
for (int y = minY; y <= maxY; y++) {
|
||||||
for (int z = minZ; z <= maxZ; z++) {
|
for (int z = minZ; z <= maxZ; z++) {
|
||||||
var pos = new BlockLocation(pos1.getWorldName(), x, y, z);
|
var pos =
|
||||||
boolean isTrigger =
|
new BlockLocation(pos1.getWorldName(), x, y, z);
|
||||||
portal != null && portal.isTriggerBlock(world.getBlock(pos));
|
boolean isTrigger = portal != null
|
||||||
boolean isOutline =
|
&& portal.isTriggerBlock(world.getBlock(pos));
|
||||||
(y == minY || y == maxY)
|
boolean isOutline = (y == minY || y == maxY)
|
||||||
&& (x == minX || x == maxX || z == minZ
|
&& (x == minX || x == maxX || z == minZ
|
||||||
|| z == maxZ)
|
|| z == maxZ)
|
||||||
|| (z == minZ || z == maxZ) && (x == minX || x == maxX);
|
|| (z == minZ || z == maxZ)
|
||||||
|
&& (x == minX || x == maxX);
|
||||||
if (isTrigger && isOutline && alternate_show_trigger) {
|
if (isTrigger && isOutline && alternate_show_trigger) {
|
||||||
Debug.addMarker(player, pos, "", TRIGGER_OUTLINE_COLOR, time);
|
Debug.addMarker(player, pos, "",
|
||||||
|
TRIGGER_OUTLINE_COLOR, time);
|
||||||
} else if (isOutline) {
|
} else if (isOutline) {
|
||||||
Debug.addMarker(player, pos, "", color, time);
|
Debug.addMarker(player, pos, "", color, time);
|
||||||
} else if (isTrigger) {
|
} else if (isTrigger) {
|
||||||
if (alternate_show_trigger)
|
if (alternate_show_trigger)
|
||||||
Debug.addMarker(player, pos, "", triggerColor, time);
|
Debug.addMarker(player, pos, "", triggerColor,
|
||||||
|
time);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
for (int x = minX; x <= maxX; x++) {
|
for (int x = minX; x <= maxX; x++) {
|
||||||
Debug.addMarker(
|
Debug.addMarker(
|
||||||
player,
|
player,
|
||||||
new BlockLocation(pos1.getWorldName(), x, minY, minZ),
|
new BlockLocation(pos1.getWorldName(), x, minY, minZ), "",
|
||||||
"",
|
color, time);
|
||||||
color,
|
|
||||||
time);
|
|
||||||
Debug.addMarker(
|
Debug.addMarker(
|
||||||
player,
|
player,
|
||||||
new BlockLocation(pos1.getWorldName(), x, minY, maxZ),
|
new BlockLocation(pos1.getWorldName(), x, minY, maxZ), "",
|
||||||
"",
|
color, time);
|
||||||
color,
|
|
||||||
time);
|
|
||||||
Debug.addMarker(
|
Debug.addMarker(
|
||||||
player,
|
player,
|
||||||
new BlockLocation(pos1.getWorldName(), x, maxY, minZ),
|
new BlockLocation(pos1.getWorldName(), x, maxY, minZ), "",
|
||||||
"",
|
color, time);
|
||||||
color,
|
|
||||||
time);
|
|
||||||
Debug.addMarker(
|
Debug.addMarker(
|
||||||
player,
|
player,
|
||||||
new BlockLocation(pos1.getWorldName(), x, maxY, maxZ),
|
new BlockLocation(pos1.getWorldName(), x, maxY, maxZ), "",
|
||||||
"",
|
color, time);
|
||||||
color,
|
|
||||||
time);
|
|
||||||
}
|
}
|
||||||
for (int z = minZ + 1; z < maxZ; z++) {
|
for (int z = minZ + 1; z < maxZ; z++) {
|
||||||
Debug.addMarker(
|
Debug.addMarker(
|
||||||
player,
|
player,
|
||||||
new BlockLocation(pos1.getWorldName(), minX, minY, z),
|
new BlockLocation(pos1.getWorldName(), minX, minY, z), "",
|
||||||
"",
|
color, time);
|
||||||
color,
|
|
||||||
time);
|
|
||||||
Debug.addMarker(
|
Debug.addMarker(
|
||||||
player,
|
player,
|
||||||
new BlockLocation(pos1.getWorldName(), maxX, minY, z),
|
new BlockLocation(pos1.getWorldName(), maxX, minY, z), "",
|
||||||
"",
|
color, time);
|
||||||
color,
|
|
||||||
time);
|
|
||||||
Debug.addMarker(
|
Debug.addMarker(
|
||||||
player,
|
player,
|
||||||
new BlockLocation(pos1.getWorldName(), minX, maxY, z),
|
new BlockLocation(pos1.getWorldName(), minX, maxY, z), "",
|
||||||
"",
|
color, time);
|
||||||
color,
|
|
||||||
time);
|
|
||||||
Debug.addMarker(
|
Debug.addMarker(
|
||||||
player,
|
player,
|
||||||
new BlockLocation(pos1.getWorldName(), maxX, maxY, z),
|
new BlockLocation(pos1.getWorldName(), maxX, maxY, z), "",
|
||||||
"",
|
color, time);
|
||||||
color,
|
|
||||||
time);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int y = minY + 1; y < maxY; y++) {
|
for (int y = minY + 1; y < maxY; y++) {
|
||||||
Debug.addMarker(
|
Debug.addMarker(
|
||||||
player,
|
player,
|
||||||
new BlockLocation(pos1.getWorldName(), minX, y, minZ),
|
new BlockLocation(pos1.getWorldName(), minX, y, minZ), "",
|
||||||
"",
|
color, time);
|
||||||
color,
|
|
||||||
time);
|
|
||||||
Debug.addMarker(
|
Debug.addMarker(
|
||||||
player,
|
player,
|
||||||
new BlockLocation(pos1.getWorldName(), maxX, y, minZ),
|
new BlockLocation(pos1.getWorldName(), maxX, y, minZ), "",
|
||||||
"",
|
color, time);
|
||||||
color,
|
|
||||||
time);
|
|
||||||
Debug.addMarker(
|
Debug.addMarker(
|
||||||
player,
|
player,
|
||||||
new BlockLocation(pos1.getWorldName(), minX, y, maxZ),
|
new BlockLocation(pos1.getWorldName(), minX, y, maxZ), "",
|
||||||
"",
|
color, time);
|
||||||
color,
|
|
||||||
time);
|
|
||||||
Debug.addMarker(
|
Debug.addMarker(
|
||||||
player,
|
player,
|
||||||
new BlockLocation(pos1.getWorldName(), maxX, y, maxZ),
|
new BlockLocation(pos1.getWorldName(), maxX, y, maxZ), "",
|
||||||
"",
|
color, time);
|
||||||
color,
|
|
||||||
time);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,15 +4,12 @@ import com.sekwah.advancedportals.core.AdvancedPortalsCore;
|
|||||||
import com.sekwah.advancedportals.core.commands.SubCommand;
|
import com.sekwah.advancedportals.core.commands.SubCommand;
|
||||||
import com.sekwah.advancedportals.core.connector.containers.CommandSenderContainer;
|
import com.sekwah.advancedportals.core.connector.containers.CommandSenderContainer;
|
||||||
import com.sekwah.advancedportals.core.util.Lang;
|
import com.sekwah.advancedportals.core.util.Lang;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class VersionSubCommand implements SubCommand {
|
public class VersionSubCommand implements SubCommand {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCommand(CommandSenderContainer sender, String[] args) {
|
public void onCommand(CommandSenderContainer sender, String[] args) {
|
||||||
sender.sendMessage(
|
sender.sendMessage(Lang.translate("messageprefix.positive")
|
||||||
Lang.translate("messageprefix.positive")
|
|
||||||
+ " Advanced Portals v"
|
+ " Advanced Portals v"
|
||||||
+ AdvancedPortalsCore.version);
|
+ AdvancedPortalsCore.version);
|
||||||
}
|
}
|
||||||
@ -23,7 +20,8 @@ public class VersionSubCommand implements SubCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> onTabComplete(CommandSenderContainer sender, String[] args) {
|
public List<String> onTabComplete(CommandSenderContainer sender,
|
||||||
|
String[] args) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,7 +3,6 @@ package com.sekwah.advancedportals.core.connector.commands;
|
|||||||
import com.sekwah.advancedportals.core.commands.CommandTemplate;
|
import com.sekwah.advancedportals.core.commands.CommandTemplate;
|
||||||
|
|
||||||
public abstract class CommandHandler {
|
public abstract class CommandHandler {
|
||||||
|
|
||||||
private final CommandTemplate commandExecutor;
|
private final CommandTemplate commandExecutor;
|
||||||
|
|
||||||
public CommandHandler(CommandTemplate commandExecutor) {
|
public CommandHandler(CommandTemplate commandExecutor) {
|
||||||
|
@ -3,7 +3,6 @@ package com.sekwah.advancedportals.core.connector.commands;
|
|||||||
import com.sekwah.advancedportals.core.commands.CommandTemplate;
|
import com.sekwah.advancedportals.core.commands.CommandTemplate;
|
||||||
|
|
||||||
public interface CommandRegister {
|
public interface CommandRegister {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registers the command to the appropriate system
|
* Registers the command to the appropriate system
|
||||||
*
|
*
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package com.sekwah.advancedportals.core.connector.containers;
|
package com.sekwah.advancedportals.core.connector.containers;
|
||||||
|
|
||||||
public interface CommandSenderContainer {
|
public interface CommandSenderContainer {
|
||||||
|
|
||||||
void sendMessage(String message);
|
void sendMessage(String message);
|
||||||
|
|
||||||
boolean isOp();
|
boolean isOp();
|
||||||
|
@ -5,7 +5,6 @@ import com.sekwah.advancedportals.core.serializeddata.PlayerLocation;
|
|||||||
import com.sekwah.advancedportals.core.serializeddata.Vector;
|
import com.sekwah.advancedportals.core.serializeddata.Vector;
|
||||||
|
|
||||||
public interface EntityContainer {
|
public interface EntityContainer {
|
||||||
|
|
||||||
PlayerLocation getLoc();
|
PlayerLocation getLoc();
|
||||||
|
|
||||||
double getHeight();
|
double getHeight();
|
||||||
|
@ -1,12 +1,13 @@
|
|||||||
package com.sekwah.advancedportals.core.connector.containers;
|
package com.sekwah.advancedportals.core.connector.containers;
|
||||||
|
|
||||||
import com.sekwah.advancedportals.core.serializeddata.BlockLocation;
|
import com.sekwah.advancedportals.core.serializeddata.BlockLocation;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
/** Just a temporary container for whenever advanced portals needs to get data from a player */
|
/**
|
||||||
|
* Just a temporary container for whenever advanced portals needs to get data
|
||||||
|
* from a player
|
||||||
|
*/
|
||||||
public interface PlayerContainer extends EntityContainer {
|
public interface PlayerContainer extends EntityContainer {
|
||||||
|
|
||||||
UUID getUUID();
|
UUID getUUID();
|
||||||
|
|
||||||
void sendMessage(String message);
|
void sendMessage(String message);
|
||||||
@ -28,7 +29,8 @@ public interface PlayerContainer extends EntityContainer {
|
|||||||
* @param material
|
* @param material
|
||||||
* @param data
|
* @param data
|
||||||
*/
|
*/
|
||||||
void sendFakeBlockWithData(BlockLocation blockPos, String material, byte data);
|
void sendFakeBlockWithData(BlockLocation blockPos, String material,
|
||||||
|
byte data);
|
||||||
|
|
||||||
void giveItem(String material, String itemName, String... itemDescription);
|
void giveItem(String material, String itemName, String... itemDescription);
|
||||||
|
|
||||||
|
@ -4,7 +4,6 @@ import java.util.List;
|
|||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public interface ServerContainer {
|
public interface ServerContainer {
|
||||||
|
|
||||||
WorldContainer getWorld(String name);
|
WorldContainer getWorld(String name);
|
||||||
|
|
||||||
PlayerContainer getPlayer(String name);
|
PlayerContainer getPlayer(String name);
|
||||||
|
@ -4,7 +4,6 @@ import com.sekwah.advancedportals.core.data.BlockAxis;
|
|||||||
import com.sekwah.advancedportals.core.serializeddata.BlockLocation;
|
import com.sekwah.advancedportals.core.serializeddata.BlockLocation;
|
||||||
|
|
||||||
public interface WorldContainer {
|
public interface WorldContainer {
|
||||||
|
|
||||||
void setBlock(BlockLocation location, String material);
|
void setBlock(BlockLocation location, String material);
|
||||||
|
|
||||||
String getBlock(BlockLocation location);
|
String getBlock(BlockLocation location);
|
||||||
|
@ -1,7 +1,3 @@
|
|||||||
package com.sekwah.advancedportals.core.data;
|
package com.sekwah.advancedportals.core.data;
|
||||||
|
|
||||||
public enum BlockAxis {
|
public enum BlockAxis { X, Y, Z }
|
||||||
X,
|
|
||||||
Y,
|
|
||||||
Z
|
|
||||||
}
|
|
||||||
|
@ -8,24 +8,23 @@ import com.sekwah.advancedportals.core.serializeddata.DataTag;
|
|||||||
import com.sekwah.advancedportals.core.serializeddata.PlayerLocation;
|
import com.sekwah.advancedportals.core.serializeddata.PlayerLocation;
|
||||||
import com.sekwah.advancedportals.core.warphandler.ActivationData;
|
import com.sekwah.advancedportals.core.warphandler.ActivationData;
|
||||||
import com.sekwah.advancedportals.core.warphandler.Tag;
|
import com.sekwah.advancedportals.core.warphandler.Tag;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Possibly look at adding the ability to add some tags to destinations such as permissions. Would
|
* Possibly look at adding the ability to add some tags to destinations such as
|
||||||
* make it easier to add permissions to block access to certain areas and such. Could be a different
|
* permissions. Would make it easier to add permissions to block access to
|
||||||
* permission system or just it takes the tags on the destination and automatically applies them
|
* certain areas and such. Could be a different permission system or just it
|
||||||
* when a portal wants to warp to there. (Of course it would not work cross server unless the data
|
* takes the tags on the destination and automatically applies them when a
|
||||||
* was communicated and checked first however that could affect performance and would definitely
|
* portal wants to warp to there. (Of course it would not work cross server
|
||||||
* affect speed)
|
* unless the data was communicated and checked first however that could affect
|
||||||
|
* performance and would definitely affect speed)
|
||||||
*
|
*
|
||||||
* @author sekwah41
|
* @author sekwah41
|
||||||
*/
|
*/
|
||||||
public class Destination implements TagTarget {
|
public class Destination implements TagTarget {
|
||||||
|
|
||||||
@Inject transient TagRegistry tagRegistry;
|
@Inject transient TagRegistry tagRegistry;
|
||||||
|
|
||||||
private PlayerLocation loc;
|
private PlayerLocation loc;
|
||||||
@ -53,7 +52,8 @@ public class Destination implements TagTarget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addArg(String argName, String argValues) {}
|
public void addArg(String argName, String argValues) {
|
||||||
|
}
|
||||||
|
|
||||||
public void setArgValues(DataTag portalTag) {
|
public void setArgValues(DataTag portalTag) {
|
||||||
this.setArgValues(portalTag.NAME, portalTag.VALUES);
|
this.setArgValues(portalTag.NAME, portalTag.VALUES);
|
||||||
@ -77,16 +77,19 @@ public class Destination implements TagTarget {
|
|||||||
destiTags[i++] = new DataTag(entry.getKey(), entry.getValue());
|
destiTags[i++] = new DataTag(entry.getKey(), entry.getValue());
|
||||||
}
|
}
|
||||||
for (DataTag destiTag : destiTags) {
|
for (DataTag destiTag : destiTags) {
|
||||||
Tag.Activation activationHandler = tagRegistry.getActivationHandler(destiTag.NAME);
|
Tag.Activation activationHandler =
|
||||||
|
tagRegistry.getActivationHandler(destiTag.NAME);
|
||||||
if (activationHandler != null) {
|
if (activationHandler != null) {
|
||||||
activationHandler.preActivated(
|
activationHandler.preActivated(
|
||||||
this, player, data, this.getArgValues(destiTag.NAME));
|
this, player, data, this.getArgValues(destiTag.NAME));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (DataTag destiTag : destiTags) {
|
for (DataTag destiTag : destiTags) {
|
||||||
Tag.Activation activationHandler = tagRegistry.getActivationHandler(destiTag.NAME);
|
Tag.Activation activationHandler =
|
||||||
|
tagRegistry.getActivationHandler(destiTag.NAME);
|
||||||
if (activationHandler != null) {
|
if (activationHandler != null) {
|
||||||
activationHandler.activated(this, player, data, this.getArgValues(destiTag.NAME));
|
activationHandler.activated(this, player, data,
|
||||||
|
this.getArgValues(destiTag.NAME));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -99,7 +102,8 @@ public class Destination implements TagTarget {
|
|||||||
destiTags[i++] = new DataTag(entry.getKey(), entry.getValue());
|
destiTags[i++] = new DataTag(entry.getKey(), entry.getValue());
|
||||||
}
|
}
|
||||||
for (DataTag destiTag : destiTags) {
|
for (DataTag destiTag : destiTags) {
|
||||||
Tag.Activation activationHandler = tagRegistry.getActivationHandler(destiTag.NAME);
|
Tag.Activation activationHandler =
|
||||||
|
tagRegistry.getActivationHandler(destiTag.NAME);
|
||||||
if (activationHandler != null) {
|
if (activationHandler != null) {
|
||||||
activationHandler.postActivated(
|
activationHandler.postActivated(
|
||||||
this, player, data, this.getArgValues(destiTag.NAME));
|
this, player, data, this.getArgValues(destiTag.NAME));
|
||||||
|
@ -3,19 +3,16 @@ package com.sekwah.advancedportals.core.effect;
|
|||||||
import com.sekwah.advancedportals.core.connector.containers.PlayerContainer;
|
import com.sekwah.advancedportals.core.connector.containers.PlayerContainer;
|
||||||
|
|
||||||
public interface WarpEffect {
|
public interface WarpEffect {
|
||||||
|
|
||||||
enum Action {
|
enum Action {
|
||||||
ENTER,
|
ENTER,
|
||||||
EXIT;
|
EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Sound extends WarpEffect {
|
interface Sound extends WarpEffect {
|
||||||
|
|
||||||
void onWarpSound(PlayerContainer player, Action action);
|
void onWarpSound(PlayerContainer player, Action action);
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Visual extends WarpEffect {
|
interface Visual extends WarpEffect {
|
||||||
|
|
||||||
void onWarpVisual(PlayerContainer player, Action action);
|
void onWarpVisual(PlayerContainer player, Action action);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,14 +17,11 @@ import com.sekwah.advancedportals.core.serializeddata.DataStorage;
|
|||||||
import com.sekwah.advancedportals.core.serializeddata.config.Config;
|
import com.sekwah.advancedportals.core.serializeddata.config.Config;
|
||||||
import com.sekwah.advancedportals.core.serializeddata.config.ConfigProvider;
|
import com.sekwah.advancedportals.core.serializeddata.config.ConfigProvider;
|
||||||
import com.sekwah.advancedportals.core.util.InfoLogger;
|
import com.sekwah.advancedportals.core.util.InfoLogger;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
public class AdvancedPortalsModule extends AbstractModule {
|
public class AdvancedPortalsModule extends AbstractModule {
|
||||||
|
|
||||||
private Injector injector;
|
private Injector injector;
|
||||||
private AdvancedPortalsCore advancedPortalsCore;
|
private AdvancedPortalsCore advancedPortalsCore;
|
||||||
private DataStorage dataStorage;
|
private DataStorage dataStorage;
|
||||||
@ -35,19 +32,31 @@ public class AdvancedPortalsModule extends AbstractModule {
|
|||||||
this.advancedPortalsCore = advancedPortalsCore;
|
this.advancedPortalsCore = advancedPortalsCore;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** https://github.com/google/guice/wiki/Bindings */
|
/**
|
||||||
|
* https://github.com/google/guice/wiki/Bindings
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected void configure() {
|
protected void configure() {
|
||||||
bind(IPortalRepository.class).to(PortalRepositoryImpl.class).in(Scopes.SINGLETON);
|
bind(IPortalRepository.class)
|
||||||
bind(IDestinationRepository.class).to(DestinationRepositoryImpl.class).in(Scopes.SINGLETON);
|
.to(PortalRepositoryImpl.class)
|
||||||
bind(IPlayerDataRepository.class).to(PlayerDataRepositoryImpl.class).in(Scopes.SINGLETON);
|
.in(Scopes.SINGLETON);
|
||||||
bind(ConfigRepository.class).to(ConfigRepositoryImpl.class).in(Scopes.SINGLETON);
|
bind(IDestinationRepository.class)
|
||||||
|
.to(DestinationRepositoryImpl.class)
|
||||||
|
.in(Scopes.SINGLETON);
|
||||||
|
bind(IPlayerDataRepository.class)
|
||||||
|
.to(PlayerDataRepositoryImpl.class)
|
||||||
|
.in(Scopes.SINGLETON);
|
||||||
|
bind(ConfigRepository.class)
|
||||||
|
.to(ConfigRepositoryImpl.class)
|
||||||
|
.in(Scopes.SINGLETON);
|
||||||
|
|
||||||
// Instances
|
// Instances
|
||||||
bind(AdvancedPortalsCore.class).toInstance(advancedPortalsCore);
|
bind(AdvancedPortalsCore.class).toInstance(advancedPortalsCore);
|
||||||
bind(InfoLogger.class).toInstance(advancedPortalsCore.getInfoLogger());
|
bind(InfoLogger.class).toInstance(advancedPortalsCore.getInfoLogger());
|
||||||
bind(DataStorage.class).toInstance(advancedPortalsCore.getDataStorage());
|
bind(DataStorage.class)
|
||||||
bind(ServerContainer.class).toInstance(advancedPortalsCore.getServerContainer());
|
.toInstance(advancedPortalsCore.getDataStorage());
|
||||||
|
bind(ServerContainer.class)
|
||||||
|
.toInstance(advancedPortalsCore.getServerContainer());
|
||||||
|
|
||||||
// Providers
|
// Providers
|
||||||
bind(Config.class).toProvider(ConfigProvider.class);
|
bind(Config.class).toProvider(ConfigProvider.class);
|
||||||
|
@ -2,22 +2,26 @@ package com.sekwah.advancedportals.core.permissions;
|
|||||||
|
|
||||||
import com.sekwah.advancedportals.core.connector.containers.CommandSenderContainer;
|
import com.sekwah.advancedportals.core.connector.containers.CommandSenderContainer;
|
||||||
import com.sekwah.advancedportals.core.connector.containers.PlayerContainer;
|
import com.sekwah.advancedportals.core.connector.containers.PlayerContainer;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class PortalPermissions {
|
public class PortalPermissions {
|
||||||
|
private static final PermissionBuilder PERMISSIONS =
|
||||||
|
new PermissionBuilder("advancedportals");
|
||||||
|
|
||||||
private static final PermissionBuilder PERMISSIONS = new PermissionBuilder("advancedportals");
|
public static final PermissionBuilder BUILD =
|
||||||
|
PERMISSIONS.createChild("build");
|
||||||
public static final PermissionBuilder BUILD = PERMISSIONS.createChild("build");
|
public static final PermissionBuilder DESTI =
|
||||||
public static final PermissionBuilder DESTI = PERMISSIONS.createChild("desti");
|
PERMISSIONS.createChild("desti");
|
||||||
public static final PermissionBuilder CREATE_PORTAL = PERMISSIONS.createChild("createportal");
|
public static final PermissionBuilder CREATE_PORTAL =
|
||||||
public static final PermissionBuilder LANG_UPDATE = PERMISSIONS.createChild("langupdate");
|
PERMISSIONS.createChild("createportal");
|
||||||
public static final PermissionBuilder RELOAD = PERMISSIONS.createChild("reload");
|
public static final PermissionBuilder LANG_UPDATE =
|
||||||
|
PERMISSIONS.createChild("langupdate");
|
||||||
|
public static final PermissionBuilder RELOAD =
|
||||||
|
PERMISSIONS.createChild("reload");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* this will not currently build the permissions for the files, but maybe at some point. It'll
|
* this will not currently build the permissions for the files, but maybe at
|
||||||
* just make it easier though.
|
* some point. It'll just make it easier though.
|
||||||
*/
|
*/
|
||||||
public static class PermissionBuilder {
|
public static class PermissionBuilder {
|
||||||
private final String permissionTag;
|
private final String permissionTag;
|
||||||
|
@ -13,14 +13,12 @@ import com.sekwah.advancedportals.core.tags.activation.TriggerBlockTag;
|
|||||||
import com.sekwah.advancedportals.core.util.Lang;
|
import com.sekwah.advancedportals.core.util.Lang;
|
||||||
import com.sekwah.advancedportals.core.warphandler.ActivationData;
|
import com.sekwah.advancedportals.core.warphandler.ActivationData;
|
||||||
import com.sekwah.advancedportals.core.warphandler.Tag;
|
import com.sekwah.advancedportals.core.warphandler.Tag;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author sekwah41
|
* @author sekwah41
|
||||||
*/
|
*/
|
||||||
public class AdvancedPortal implements TagTarget {
|
public class AdvancedPortal implements TagTarget {
|
||||||
|
|
||||||
@Inject private transient TagRegistry tagRegistry;
|
@Inject private transient TagRegistry tagRegistry;
|
||||||
|
|
||||||
private BlockLocation maxLoc;
|
private BlockLocation maxLoc;
|
||||||
@ -38,9 +36,7 @@ public class AdvancedPortal implements TagTarget {
|
|||||||
this.maxLoc = new BlockLocation();
|
this.maxLoc = new BlockLocation();
|
||||||
}
|
}
|
||||||
|
|
||||||
public AdvancedPortal(
|
public AdvancedPortal(BlockLocation minLoc, BlockLocation maxLoc,
|
||||||
BlockLocation minLoc,
|
|
||||||
BlockLocation maxLoc,
|
|
||||||
TagRegistry tagRegistry,
|
TagRegistry tagRegistry,
|
||||||
PlayerDataServices playerDataServices) {
|
PlayerDataServices playerDataServices) {
|
||||||
this.tagRegistry = tagRegistry;
|
this.tagRegistry = tagRegistry;
|
||||||
@ -105,24 +101,28 @@ public class AdvancedPortal implements TagTarget {
|
|||||||
}*/
|
}*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param player The player on the server attempting to use an advanced portal
|
* @param player The player on the server attempting to use an advanced
|
||||||
* @param moveActivated if the portal was activated by a move event (won't trigger knockback)
|
* portal
|
||||||
|
* @param moveActivated if the portal was activated by a move event (won't
|
||||||
|
* trigger knockback)
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public boolean activate(PlayerContainer player, boolean moveActivated) {
|
public boolean activate(PlayerContainer player, boolean moveActivated) {
|
||||||
var playerData = playerDataServices.getPlayerData(player);
|
var playerData = playerDataServices.getPlayerData(player);
|
||||||
if (playerData.isInPortal()) return false;
|
if (playerData.isInPortal())
|
||||||
|
return false;
|
||||||
playerData.setInPortal(true);
|
playerData.setInPortal(true);
|
||||||
if (playerData.hasJoinCooldown()) {
|
if (playerData.hasJoinCooldown()) {
|
||||||
var cooldown = (int) Math.ceil(playerData.getJoinCooldownLeft() / 1000D);
|
var cooldown =
|
||||||
player.sendMessage(
|
(int) Math.ceil(playerData.getJoinCooldownLeft() / 1000D);
|
||||||
Lang.translateInsertVariables(
|
player.sendMessage(Lang.translateInsertVariables(
|
||||||
"portal.cooldown.join",
|
"portal.cooldown.join", cooldown,
|
||||||
cooldown,
|
Lang.translate(cooldown == 1 ? "time.second"
|
||||||
Lang.translate(cooldown == 1 ? "time.second" : "time.seconds")));
|
: "time.seconds")));
|
||||||
if (configRepository.playFailSound()) {
|
if (configRepository.playFailSound()) {
|
||||||
var rand = new Random();
|
var rand = new Random();
|
||||||
player.playSound("block.portal.travel", 0.05f, rand.nextFloat() * 0.4F + 0.8F);
|
player.playSound("block.portal.travel", 0.05f,
|
||||||
|
rand.nextFloat() * 0.4F + 0.8F);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -135,25 +135,30 @@ public class AdvancedPortal implements TagTarget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (DataTag portalTag : portalTags) {
|
for (DataTag portalTag : portalTags) {
|
||||||
Tag.Activation activationHandler = tagRegistry.getActivationHandler(portalTag.NAME);
|
Tag.Activation activationHandler =
|
||||||
|
tagRegistry.getActivationHandler(portalTag.NAME);
|
||||||
if (activationHandler != null) {
|
if (activationHandler != null) {
|
||||||
if (!activationHandler.preActivated(
|
if (!activationHandler.preActivated(
|
||||||
this, player, data, this.getArgValues(portalTag.NAME))) {
|
this, player, data,
|
||||||
|
this.getArgValues(portalTag.NAME))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (DataTag portalTag : portalTags) {
|
for (DataTag portalTag : portalTags) {
|
||||||
Tag.Activation activationHandler = tagRegistry.getActivationHandler(portalTag.NAME);
|
Tag.Activation activationHandler =
|
||||||
|
tagRegistry.getActivationHandler(portalTag.NAME);
|
||||||
if (activationHandler != null) {
|
if (activationHandler != null) {
|
||||||
if (!activationHandler.activated(
|
if (!activationHandler.activated(
|
||||||
this, player, data, this.getArgValues(portalTag.NAME))) {
|
this, player, data,
|
||||||
|
this.getArgValues(portalTag.NAME))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (DataTag portalTag : portalTags) {
|
for (DataTag portalTag : portalTags) {
|
||||||
Tag.Activation activationHandler = tagRegistry.getActivationHandler(portalTag.NAME);
|
Tag.Activation activationHandler =
|
||||||
|
tagRegistry.getActivationHandler(portalTag.NAME);
|
||||||
if (activationHandler != null) {
|
if (activationHandler != null) {
|
||||||
activationHandler.postActivated(
|
activationHandler.postActivated(
|
||||||
this, player, data, this.getArgValues(portalTag.NAME));
|
this, player, data, this.getArgValues(portalTag.NAME));
|
||||||
|
@ -4,5 +4,6 @@ public enum CommandErrorCode {
|
|||||||
INSUFFICIENT_ARGUMENTS(""),
|
INSUFFICIENT_ARGUMENTS(""),
|
||||||
NO_PERMISSION("");
|
NO_PERMISSION("");
|
||||||
|
|
||||||
CommandErrorCode(String message) {}
|
CommandErrorCode(String message) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,14 +4,10 @@ import com.google.common.collect.ImmutableList;
|
|||||||
import com.sekwah.advancedportals.core.connector.containers.CommandSenderContainer;
|
import com.sekwah.advancedportals.core.connector.containers.CommandSenderContainer;
|
||||||
|
|
||||||
public interface CommandHandler {
|
public interface CommandHandler {
|
||||||
void onExecute(
|
void onExecute(String commandName, String parentCommand,
|
||||||
String commandName,
|
CommandSenderContainer sender, ImmutableList<String> args);
|
||||||
String parentCommand,
|
|
||||||
CommandSenderContainer sender,
|
|
||||||
ImmutableList<String> args);
|
|
||||||
|
|
||||||
default void onCommandFailure(
|
default void onCommandFailure(String[] command,
|
||||||
String[] command,
|
|
||||||
CommandSenderContainer sender,
|
CommandSenderContainer sender,
|
||||||
CommandException exception,
|
CommandException exception,
|
||||||
ImmutableList<String> args) {
|
ImmutableList<String> args) {
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package com.sekwah.advancedportals.core.registry;
|
package com.sekwah.advancedportals.core.registry;
|
||||||
|
|
||||||
|
|
||||||
import java.lang.reflect.ParameterizedType;
|
import java.lang.reflect.ParameterizedType;
|
||||||
|
|
||||||
public class RegisterBuilder<T extends CommandHandler> {
|
public class RegisterBuilder<T extends CommandHandler> {
|
||||||
@ -8,13 +7,13 @@ public class RegisterBuilder<T extends CommandHandler> {
|
|||||||
return new RegisterBuilder();
|
return new RegisterBuilder();
|
||||||
}
|
}
|
||||||
|
|
||||||
private RegisterBuilder() {}
|
private RegisterBuilder() {
|
||||||
|
}
|
||||||
|
|
||||||
private boolean allowPermissionInheritance;
|
private boolean allowPermissionInheritance;
|
||||||
private String scanDirectory;
|
private String scanDirectory;
|
||||||
private final Class<T> genericType =
|
private final Class<T> genericType =
|
||||||
(Class<T>)
|
(Class<T>) ((ParameterizedType) getClass().getGenericSuperclass())
|
||||||
((ParameterizedType) getClass().getGenericSuperclass())
|
|
||||||
.getActualTypeArguments()[0];
|
.getActualTypeArguments()[0];
|
||||||
|
|
||||||
public RegisterBuilder<T> inheritPermissions(boolean allowInheritance) {
|
public RegisterBuilder<T> inheritPermissions(boolean allowInheritance) {
|
||||||
|
@ -3,24 +3,26 @@ package com.sekwah.advancedportals.core.registry;
|
|||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
import com.sekwah.advancedportals.core.commands.SubCommand;
|
import com.sekwah.advancedportals.core.commands.SubCommand;
|
||||||
import com.sekwah.advancedportals.core.util.InfoLogger;
|
import com.sekwah.advancedportals.core.util.InfoLogger;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Do not register to here. Register to the sprcific subcommand registry classes.
|
* Do not register to here. Register to the sprcific subcommand registry
|
||||||
|
* classes.
|
||||||
*
|
*
|
||||||
* <p>Designed to let addons add new command sections to access, edit or add new functonality.
|
* <p>Designed to let addons add new command sections to access, edit or add
|
||||||
|
* new functonality.
|
||||||
*
|
*
|
||||||
* @author sekwah41
|
* @author sekwah41
|
||||||
*/
|
*/
|
||||||
public class SubCommandRegistry {
|
public class SubCommandRegistry {
|
||||||
|
|
||||||
protected Map<String, SubCommand> subCommandMap = new HashMap<>();
|
protected Map<String, SubCommand> subCommandMap = new HashMap<>();
|
||||||
|
|
||||||
/** List of subcommand names which should be in order alphabetically */
|
/**
|
||||||
|
* List of subcommand names which should be in order alphabetically
|
||||||
|
*/
|
||||||
protected ArrayList<String> subCommands = new ArrayList<>();
|
protected ArrayList<String> subCommands = new ArrayList<>();
|
||||||
|
|
||||||
@Inject private InfoLogger infoLogger;
|
@Inject private InfoLogger infoLogger;
|
||||||
@ -31,14 +33,15 @@ public class SubCommandRegistry {
|
|||||||
* @return if the subcommand is registered or not
|
* @return if the subcommand is registered or not
|
||||||
*/
|
*/
|
||||||
public boolean registerSubCommand(String arg, SubCommand subCommand) {
|
public boolean registerSubCommand(String arg, SubCommand subCommand) {
|
||||||
|
|
||||||
if (subCommand == null) {
|
if (subCommand == null) {
|
||||||
this.infoLogger.warning("The subcommand '" + arg + "' cannot be null.");
|
this.infoLogger.warning("The subcommand '" + arg
|
||||||
|
+ "' cannot be null.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.subCommandMap.containsKey(arg)) {
|
if (this.subCommandMap.containsKey(arg)) {
|
||||||
this.infoLogger.warning("The subcommand '" + arg + "' already exists.");
|
this.infoLogger.warning("The subcommand '" + arg
|
||||||
|
+ "' already exists.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -59,7 +62,8 @@ public class SubCommandRegistry {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* I may be wrong but for larger lists containsKey is faster with a hashmap than arraylist.
|
* I may be wrong but for larger lists containsKey is faster with a hashmap
|
||||||
|
* than arraylist.
|
||||||
*
|
*
|
||||||
* <p>Though im not sure at what size it becomes more efficient.
|
* <p>Though im not sure at what size it becomes more efficient.
|
||||||
*
|
*
|
||||||
|
@ -3,19 +3,16 @@ package com.sekwah.advancedportals.core.registry;
|
|||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
import com.sekwah.advancedportals.core.AdvancedPortalsCore;
|
import com.sekwah.advancedportals.core.AdvancedPortalsCore;
|
||||||
import com.sekwah.advancedportals.core.warphandler.Tag;
|
import com.sekwah.advancedportals.core.warphandler.Tag;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allows a portal to register a tag and add a handler. If a plugin wants to add functionality
|
* Allows a portal to register a tag and add a handler. If a plugin wants to
|
||||||
* to someone elses tag then they should use the events.
|
* add functionality to someone elses tag then they should use the events.
|
||||||
*
|
*
|
||||||
* @author sekwah41
|
* @author sekwah41
|
||||||
*/
|
*/
|
||||||
public class TagRegistry {
|
public class TagRegistry {
|
||||||
|
@Inject AdvancedPortalsCore portalsCore;
|
||||||
@Inject
|
|
||||||
AdvancedPortalsCore portalsCore;
|
|
||||||
|
|
||||||
private final ArrayList<String> literalTags = new ArrayList<>();
|
private final ArrayList<String> literalTags = new ArrayList<>();
|
||||||
|
|
||||||
@ -25,8 +22,7 @@ public class TagRegistry {
|
|||||||
private final Map<String, Tag.Creation> creationTags = new HashMap<>();
|
private final Map<String, Tag.Creation> creationTags = new HashMap<>();
|
||||||
private final Map<String, Tag.TagStatus> statusTags = new HashMap<>();
|
private final Map<String, Tag.TagStatus> statusTags = new HashMap<>();
|
||||||
|
|
||||||
@Inject
|
@Inject private AdvancedPortalsCore pluginCore;
|
||||||
private AdvancedPortalsCore pluginCore;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Portals to trigger when a portal is activated
|
* Portals to trigger when a portal is activated
|
||||||
@ -68,17 +64,19 @@ public class TagRegistry {
|
|||||||
this.tags.add(tag);
|
this.tags.add(tag);
|
||||||
|
|
||||||
// Check literal tags for clashes
|
// Check literal tags for clashes
|
||||||
if(this.literalTags.contains(tagName)) {
|
if (this.literalTags.contains(tagName)) {
|
||||||
this.portalsCore.getInfoLogger().warning("A tag with the name " + tagName + " already exists.");
|
this.portalsCore.getInfoLogger().warning(
|
||||||
|
"A tag with the name " + tagName + " already exists.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var aliases = tag.getAliases();
|
var aliases = tag.getAliases();
|
||||||
this.literalTags.add(tagName);
|
this.literalTags.add(tagName);
|
||||||
if(aliases != null) {
|
if (aliases != null) {
|
||||||
for (String alias : aliases) {
|
for (String alias : aliases) {
|
||||||
if(this.literalTags.contains(alias)) {
|
if (this.literalTags.contains(alias)) {
|
||||||
this.portalsCore.getInfoLogger().warning("A tag with the alias " + alias + " already exists.");
|
this.portalsCore.getInfoLogger().warning(
|
||||||
|
"A tag with the alias " + alias + " already exists.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -103,7 +101,6 @@ public class TagRegistry {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public List<Tag> getTags() {
|
public List<Tag> getTags() {
|
||||||
// TODO Make a copy of the list to prevent issues with modification
|
// TODO Make a copy of the list to prevent issues with modification
|
||||||
|
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
package com.sekwah.advancedportals.core.registry;
|
package com.sekwah.advancedportals.core.registry;
|
||||||
|
|
||||||
/** Something that a tag can be executed on. */
|
/**
|
||||||
|
* Something that a tag can be executed on.
|
||||||
|
*/
|
||||||
public interface TagTarget {
|
public interface TagTarget {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the values for the arg
|
* Get the values for the arg
|
||||||
*
|
*
|
||||||
|
@ -4,7 +4,6 @@ import com.google.inject.Inject;
|
|||||||
import com.sekwah.advancedportals.core.AdvancedPortalsCore;
|
import com.sekwah.advancedportals.core.AdvancedPortalsCore;
|
||||||
import com.sekwah.advancedportals.core.effect.WarpEffect;
|
import com.sekwah.advancedportals.core.effect.WarpEffect;
|
||||||
import com.sekwah.advancedportals.core.util.InfoLogger;
|
import com.sekwah.advancedportals.core.util.InfoLogger;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@ -12,15 +11,11 @@ import java.util.Map;
|
|||||||
* @author sekwah41
|
* @author sekwah41
|
||||||
*/
|
*/
|
||||||
public class WarpEffectRegistry {
|
public class WarpEffectRegistry {
|
||||||
|
|
||||||
|
|
||||||
private Map<String, WarpEffect> warpEffects = new HashMap();
|
private Map<String, WarpEffect> warpEffects = new HashMap();
|
||||||
|
|
||||||
@Inject
|
@Inject private AdvancedPortalsCore portalsCore;
|
||||||
private AdvancedPortalsCore portalsCore;
|
|
||||||
|
|
||||||
@Inject
|
@Inject private InfoLogger infoLogger;
|
||||||
private InfoLogger infoLogger;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register a new warp effect.
|
* Register a new warp effect.
|
||||||
@ -30,50 +25,49 @@ public class WarpEffectRegistry {
|
|||||||
* @return if the effect was registered
|
* @return if the effect was registered
|
||||||
*/
|
*/
|
||||||
public void registerEffect(String name, WarpEffect effect) {
|
public void registerEffect(String name, WarpEffect effect) {
|
||||||
|
if (name == null) {
|
||||||
if(name == null){
|
|
||||||
this.infoLogger.warning("Effect name cannot be null");
|
this.infoLogger.warning("Effect name cannot be null");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(this.warpEffects.containsKey(name)){
|
if (this.warpEffects.containsKey(name)) {
|
||||||
this.infoLogger.warning("Effect with the name: " + name + " already exists");
|
this.infoLogger.warning("Effect with the name: " + name
|
||||||
|
+ " already exists");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.warpEffects.put(name, effect);
|
this.warpEffects.put(name, effect);
|
||||||
}
|
}
|
||||||
|
|
||||||
public WarpEffect.Visual getVisualEffect(String name){
|
public WarpEffect.Visual getVisualEffect(String name) {
|
||||||
if(this.warpEffects.containsKey(name)) {
|
if (this.warpEffects.containsKey(name)) {
|
||||||
var effect = this.warpEffects.get(name);
|
var effect = this.warpEffects.get(name);
|
||||||
if(effect instanceof WarpEffect.Visual visual){
|
if (effect instanceof WarpEffect.Visual visual) {
|
||||||
return visual;
|
return visual;
|
||||||
}
|
} else {
|
||||||
else{
|
this.infoLogger.warning("Effect called " + name
|
||||||
this.infoLogger.warning("Effect called " + name + " is not a visual effect");
|
+ " is not a visual effect");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else{
|
this.infoLogger.warning("No effect called " + name
|
||||||
this.infoLogger.warning("No effect called " + name + " was registered");
|
+ " was registered");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public WarpEffect.Sound getSoundEffect(String name){
|
public WarpEffect.Sound getSoundEffect(String name) {
|
||||||
if(this.warpEffects.containsKey(name)) {
|
if (this.warpEffects.containsKey(name)) {
|
||||||
var effect = this.warpEffects.get(name);
|
var effect = this.warpEffects.get(name);
|
||||||
if(effect instanceof WarpEffect.Sound sound){
|
if (effect instanceof WarpEffect.Sound sound) {
|
||||||
return sound;
|
return sound;
|
||||||
|
} else {
|
||||||
|
this.infoLogger.warning("Effect called " + name
|
||||||
|
+ " is not a sound effect");
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
else{
|
} else {
|
||||||
this.infoLogger.warning("Effect called " + name + " is not a sound effect");
|
this.infoLogger.warning("No effect called " + name
|
||||||
|
+ " was registered");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
|
||||||
this.infoLogger.warning("No effect called " + name + " was registered");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,6 @@ package com.sekwah.advancedportals.core.repository;
|
|||||||
import com.sekwah.advancedportals.core.serializeddata.DataStorage;
|
import com.sekwah.advancedportals.core.serializeddata.DataStorage;
|
||||||
|
|
||||||
public interface ConfigRepository {
|
public interface ConfigRepository {
|
||||||
|
|
||||||
boolean getUseOnlySpecialAxe();
|
boolean getUseOnlySpecialAxe();
|
||||||
|
|
||||||
String getTranslation();
|
String getTranslation();
|
||||||
|
@ -3,7 +3,6 @@ package com.sekwah.advancedportals.core.repository;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public interface IJsonRepository<T> {
|
public interface IJsonRepository<T> {
|
||||||
|
|
||||||
boolean save(String name, T t);
|
boolean save(String name, T t);
|
||||||
|
|
||||||
boolean containsKey(String name);
|
boolean containsKey(String name);
|
||||||
|
@ -4,12 +4,10 @@ import com.google.inject.Singleton;
|
|||||||
import com.sekwah.advancedportals.core.repository.ConfigRepository;
|
import com.sekwah.advancedportals.core.repository.ConfigRepository;
|
||||||
import com.sekwah.advancedportals.core.serializeddata.DataStorage;
|
import com.sekwah.advancedportals.core.serializeddata.DataStorage;
|
||||||
import com.sekwah.advancedportals.core.serializeddata.config.Config;
|
import com.sekwah.advancedportals.core.serializeddata.config.Config;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
public class ConfigRepositoryImpl implements ConfigRepository {
|
public class ConfigRepositoryImpl implements ConfigRepository {
|
||||||
|
|
||||||
private HashMap<String, Config> configs;
|
private HashMap<String, Config> configs;
|
||||||
private Config config;
|
private Config config;
|
||||||
private DataStorage dataStorage;
|
private DataStorage dataStorage;
|
||||||
@ -19,11 +17,9 @@ public class ConfigRepositoryImpl implements ConfigRepository {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public <T> T getValue(String output) {
|
public <T> T getValue(String output) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return (T) configs.get(output);
|
return (T) configs.get(output);
|
||||||
} catch (ClassCastException ignored) {
|
} catch (ClassCastException ignored) {
|
||||||
|
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -5,10 +5,8 @@ import com.sekwah.advancedportals.core.destination.Destination;
|
|||||||
import com.sekwah.advancedportals.core.repository.IDestinationRepository;
|
import com.sekwah.advancedportals.core.repository.IDestinationRepository;
|
||||||
import com.sekwah.advancedportals.core.serializeddata.DataStorage;
|
import com.sekwah.advancedportals.core.serializeddata.DataStorage;
|
||||||
import com.sekwah.advancedportals.core.tags.activation.NameTag;
|
import com.sekwah.advancedportals.core.tags.activation.NameTag;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@ -19,7 +17,8 @@ public class DestinationRepositoryImpl implements IDestinationRepository {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean save(String name, Destination destination) {
|
public boolean save(String name, Destination destination) {
|
||||||
return dataStorage.storeFile(destination, fileLocation + name + ".yaml");
|
return dataStorage.storeFile(destination,
|
||||||
|
fileLocation + name + ".yaml");
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean containsKey(String name) {
|
public boolean containsKey(String name) {
|
||||||
@ -32,7 +31,8 @@ public class DestinationRepositoryImpl implements IDestinationRepository {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Destination get(String name) {
|
public Destination get(String name) {
|
||||||
return dataStorage.loadFile(Destination.class, fileLocation + name + ".yaml");
|
return dataStorage.loadFile(Destination.class,
|
||||||
|
fileLocation + name + ".yaml");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -49,7 +49,8 @@ public class DestinationRepositoryImpl implements IDestinationRepository {
|
|||||||
// Forces the name tag to be up-to-date on load
|
// Forces the name tag to be up-to-date on load
|
||||||
String[] name = destination.getArgValues(NameTag.TAG_NAME);
|
String[] name = destination.getArgValues(NameTag.TAG_NAME);
|
||||||
if (name != null && name.length > 0) {
|
if (name != null && name.length > 0) {
|
||||||
destination.setArgValues(NameTag.TAG_NAME, new String[] {fileName});
|
destination.setArgValues(NameTag.TAG_NAME,
|
||||||
|
new String[] {fileName});
|
||||||
}
|
}
|
||||||
destinations.add(destination);
|
destinations.add(destination);
|
||||||
}
|
}
|
||||||
|
@ -4,11 +4,9 @@ import com.google.inject.Inject;
|
|||||||
import com.sekwah.advancedportals.core.repository.IPlayerDataRepository;
|
import com.sekwah.advancedportals.core.repository.IPlayerDataRepository;
|
||||||
import com.sekwah.advancedportals.core.serializeddata.DataStorage;
|
import com.sekwah.advancedportals.core.serializeddata.DataStorage;
|
||||||
import com.sekwah.advancedportals.core.serializeddata.PlayerData;
|
import com.sekwah.advancedportals.core.serializeddata.PlayerData;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class PlayerDataRepositoryImpl implements IPlayerDataRepository {
|
public class PlayerDataRepositoryImpl implements IPlayerDataRepository {
|
||||||
|
|
||||||
private final String fileLocation = "playerData/";
|
private final String fileLocation = "playerData/";
|
||||||
|
|
||||||
@Inject DataStorage dataStorage;
|
@Inject DataStorage dataStorage;
|
||||||
@ -30,7 +28,8 @@ public class PlayerDataRepositoryImpl implements IPlayerDataRepository {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PlayerData get(String name) {
|
public PlayerData get(String name) {
|
||||||
return dataStorage.loadFile(PlayerData.class, fileLocation + name + ".yaml");
|
return dataStorage.loadFile(PlayerData.class,
|
||||||
|
fileLocation + name + ".yaml");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -7,21 +7,20 @@ import com.sekwah.advancedportals.core.portal.AdvancedPortal;
|
|||||||
import com.sekwah.advancedportals.core.repository.IPortalRepository;
|
import com.sekwah.advancedportals.core.repository.IPortalRepository;
|
||||||
import com.sekwah.advancedportals.core.serializeddata.DataStorage;
|
import com.sekwah.advancedportals.core.serializeddata.DataStorage;
|
||||||
import com.sekwah.advancedportals.core.tags.activation.NameTag;
|
import com.sekwah.advancedportals.core.tags.activation.NameTag;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
public class PortalRepositoryImpl implements IPortalRepository {
|
public class PortalRepositoryImpl implements IPortalRepository {
|
||||||
|
|
||||||
private final String fileLocation = "portals/";
|
private final String fileLocation = "portals/";
|
||||||
|
|
||||||
@Inject DataStorage dataStorage;
|
@Inject DataStorage dataStorage;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* In memory copy of the portal files as they will be accessed every movement tick.
|
* In memory copy of the portal files as they will be accessed every
|
||||||
|
* movement tick.
|
||||||
*
|
*
|
||||||
* <p>If we need to get it by name we can just load it from the file, but this is good for
|
* <p>If we need to get it by name we can just load it from the file, but
|
||||||
* looping fast for the player move events.
|
* this is good for looping fast for the player move events.
|
||||||
*/
|
*/
|
||||||
private List<AdvancedPortal> portals = new ArrayList<>();
|
private List<AdvancedPortal> portals = new ArrayList<>();
|
||||||
|
|
||||||
@ -42,9 +41,13 @@ public class PortalRepositoryImpl implements IPortalRepository {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AdvancedPortal get(String name) {
|
public AdvancedPortal get(String name) {
|
||||||
var portal = dataStorage.loadFile(AdvancedPortal.class, fileLocation + name + ".yaml");
|
var portal = dataStorage.loadFile(AdvancedPortal.class,
|
||||||
|
fileLocation + name + ".yaml");
|
||||||
if (portal != null) {
|
if (portal != null) {
|
||||||
AdvancedPortalsCore.getInstance().getModule().getInjector().injectMembers(portal);
|
AdvancedPortalsCore.getInstance()
|
||||||
|
.getModule()
|
||||||
|
.getInjector()
|
||||||
|
.injectMembers(portal);
|
||||||
}
|
}
|
||||||
return portal;
|
return portal;
|
||||||
}
|
}
|
||||||
@ -59,12 +62,14 @@ public class PortalRepositoryImpl implements IPortalRepository {
|
|||||||
List<AdvancedPortal> portals = new ArrayList<>();
|
List<AdvancedPortal> portals = new ArrayList<>();
|
||||||
List<String> allFiles = dataStorage.listAllFiles(fileLocation, false);
|
List<String> allFiles = dataStorage.listAllFiles(fileLocation, false);
|
||||||
for (String fileName : allFiles) {
|
for (String fileName : allFiles) {
|
||||||
AdvancedPortal portal =
|
AdvancedPortal portal = dataStorage.loadFile(
|
||||||
dataStorage.loadFile(AdvancedPortal.class, fileLocation + fileName);
|
AdvancedPortal.class, fileLocation + fileName);
|
||||||
// Forces the name tag to be up-to-date on load
|
// Forces the name tag to be up-to-date on load
|
||||||
String[] name = portal.getArgValues(NameTag.TAG_NAME);
|
String[] name = portal.getArgValues(NameTag.TAG_NAME);
|
||||||
if (name != null && name.length > 0) {
|
if (name != null && name.length > 0) {
|
||||||
portal.setArgValues(NameTag.TAG_NAME, new String[] {fileName.replace(".yaml", "")});
|
portal.setArgValues(
|
||||||
|
NameTag.TAG_NAME,
|
||||||
|
new String[] {fileName.replace(".yaml", "")});
|
||||||
}
|
}
|
||||||
portals.add(portal);
|
portals.add(portal);
|
||||||
}
|
}
|
||||||
|
@ -3,8 +3,8 @@ package com.sekwah.advancedportals.core.serializeddata;
|
|||||||
import com.sekwah.advancedportals.core.data.Direction;
|
import com.sekwah.advancedportals.core.data.Direction;
|
||||||
|
|
||||||
public class BlockLocation {
|
public class BlockLocation {
|
||||||
|
// These should be treated as final, they only are not for serialization
|
||||||
// These should be treated as final, they only are not for serialization purposes
|
// purposes
|
||||||
private final int posX;
|
private final int posX;
|
||||||
|
|
||||||
private final int posY;
|
private final int posY;
|
||||||
@ -51,8 +51,7 @@ public class BlockLocation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean equals(BlockLocation location) {
|
public boolean equals(BlockLocation location) {
|
||||||
return location.posX == this.posX
|
return location.posX == this.posX && location.posY == this.posY
|
||||||
&& location.posY == this.posY
|
|
||||||
&& location.posZ == this.posZ
|
&& location.posZ == this.posZ
|
||||||
&& location.worldName.equals(this.worldName);
|
&& location.worldName.equals(this.worldName);
|
||||||
}
|
}
|
||||||
@ -73,6 +72,7 @@ public class BlockLocation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public BlockLocation addY(int offsetY) {
|
public BlockLocation addY(int offsetY) {
|
||||||
return new BlockLocation(this.worldName, this.posX, (this.posY + offsetY), this.posZ);
|
return new BlockLocation(this.worldName, this.posX,
|
||||||
|
(this.posY + offsetY), this.posZ);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,22 +3,19 @@ package com.sekwah.advancedportals.core.serializeddata;
|
|||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
import com.sekwah.advancedportals.core.AdvancedPortalsCore;
|
import com.sekwah.advancedportals.core.AdvancedPortalsCore;
|
||||||
import com.sekwah.advancedportals.core.util.InfoLogger;
|
import com.sekwah.advancedportals.core.util.InfoLogger;
|
||||||
|
|
||||||
import org.yaml.snakeyaml.DumperOptions;
|
|
||||||
import org.yaml.snakeyaml.LoaderOptions;
|
|
||||||
import org.yaml.snakeyaml.Yaml;
|
|
||||||
import org.yaml.snakeyaml.inspector.TagInspector;
|
|
||||||
import org.yaml.snakeyaml.nodes.Tag;
|
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import org.yaml.snakeyaml.DumperOptions;
|
||||||
|
import org.yaml.snakeyaml.LoaderOptions;
|
||||||
|
import org.yaml.snakeyaml.Yaml;
|
||||||
|
import org.yaml.snakeyaml.inspector.TagInspector;
|
||||||
|
import org.yaml.snakeyaml.nodes.Tag;
|
||||||
|
|
||||||
public class DataStorage {
|
public class DataStorage {
|
||||||
|
|
||||||
private final File dataFolder;
|
private final File dataFolder;
|
||||||
|
|
||||||
@Inject private AdvancedPortalsCore portalsCore;
|
@Inject private AdvancedPortalsCore portalsCore;
|
||||||
@ -30,10 +27,10 @@ public class DataStorage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Yaml getYaml(Class<? extends Object> clazz) {
|
private Yaml getYaml(Class<? extends Object> clazz) {
|
||||||
|
|
||||||
LoaderOptions loaderOptions = new LoaderOptions();
|
LoaderOptions loaderOptions = new LoaderOptions();
|
||||||
|
|
||||||
TagInspector tagInspector = tag -> tag.getClassName().equals(clazz.getName());
|
TagInspector tagInspector =
|
||||||
|
tag -> tag.getClassName().equals(clazz.getName());
|
||||||
|
|
||||||
loaderOptions.setTagInspector(tagInspector);
|
loaderOptions.setTagInspector(tagInspector);
|
||||||
|
|
||||||
@ -44,7 +41,10 @@ public class DataStorage {
|
|||||||
representer.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
|
representer.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
|
||||||
var constructor = new ReflectiveConstructor(clazz, loaderOptions);
|
var constructor = new ReflectiveConstructor(clazz, loaderOptions);
|
||||||
|
|
||||||
AdvancedPortalsCore.getInstance().getModule().getInjector().injectMembers(constructor);
|
AdvancedPortalsCore.getInstance()
|
||||||
|
.getModule()
|
||||||
|
.getInjector()
|
||||||
|
.injectMembers(constructor);
|
||||||
|
|
||||||
return new Yaml(constructor, representer);
|
return new Yaml(constructor, representer);
|
||||||
}
|
}
|
||||||
@ -64,16 +64,15 @@ public class DataStorage {
|
|||||||
if (yamlResource == null) {
|
if (yamlResource == null) {
|
||||||
try {
|
try {
|
||||||
return dataHolder.getDeclaredConstructor().newInstance();
|
return dataHolder.getDeclaredConstructor().newInstance();
|
||||||
} catch (InstantiationException
|
} catch (InstantiationException | IllegalAccessException
|
||||||
| IllegalAccessException
|
| NoSuchMethodException | InvocationTargetException e) {
|
||||||
| NoSuchMethodException
|
|
||||||
| InvocationTargetException e) {
|
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
Yaml yaml = getYaml(dataHolder);
|
Yaml yaml = getYaml(dataHolder);
|
||||||
try (BufferedReader bufReader = new BufferedReader(new InputStreamReader(yamlResource))) {
|
try (BufferedReader bufReader =
|
||||||
|
new BufferedReader(new InputStreamReader(yamlResource))) {
|
||||||
return yaml.loadAs(bufReader, dataHolder);
|
return yaml.loadAs(bufReader, dataHolder);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
infoLogger.warning("Failed to load file: " + location);
|
infoLogger.warning("Failed to load file: " + location);
|
||||||
@ -85,7 +84,8 @@ public class DataStorage {
|
|||||||
public boolean storeFile(Object dataHolder, String location) {
|
public boolean storeFile(Object dataHolder, String location) {
|
||||||
Yaml yaml = getYaml(dataHolder.getClass());
|
Yaml yaml = getYaml(dataHolder.getClass());
|
||||||
File outFile = new File(this.dataFolder, location);
|
File outFile = new File(this.dataFolder, location);
|
||||||
if (!outFile.getParentFile().exists() && !outFile.getParentFile().mkdirs()) {
|
if (!outFile.getParentFile().exists()
|
||||||
|
&& !outFile.getParentFile().mkdirs()) {
|
||||||
infoLogger.warning("Failed to create folder for file: " + location);
|
infoLogger.warning("Failed to create folder for file: " + location);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,8 +103,8 @@ public class DataStorage {
|
|||||||
* Copies the specified file out of the plugin and into the plugins folder.
|
* Copies the specified file out of the plugin and into the plugins folder.
|
||||||
*
|
*
|
||||||
* @param fileLoc
|
* @param fileLoc
|
||||||
* @return if the file is copied, will be false if override is false and the file already
|
* @return if the file is copied, will be false if override is false and the
|
||||||
* existed.
|
* file already existed.
|
||||||
*/
|
*/
|
||||||
public boolean copyDefaultFile(String fileLoc, boolean overwrite) {
|
public boolean copyDefaultFile(String fileLoc, boolean overwrite) {
|
||||||
return this.copyDefaultFile(fileLoc, fileLoc, overwrite);
|
return this.copyDefaultFile(fileLoc, fileLoc, overwrite);
|
||||||
@ -115,10 +115,11 @@ public class DataStorage {
|
|||||||
*
|
*
|
||||||
* @param sourceLoc - location of the file in the jar
|
* @param sourceLoc - location of the file in the jar
|
||||||
* @param fileLoc - location to save the file
|
* @param fileLoc - location to save the file
|
||||||
* @return if the file is copied, will be false if override is false and the file already
|
* @return if the file is copied, will be false if override is false and the
|
||||||
* existed.
|
* file already existed.
|
||||||
*/
|
*/
|
||||||
public boolean copyDefaultFile(String sourceLoc, String fileLoc, boolean overwrite) {
|
public boolean copyDefaultFile(String sourceLoc, String fileLoc,
|
||||||
|
boolean overwrite) {
|
||||||
File outFile = new File(this.dataFolder, fileLoc);
|
File outFile = new File(this.dataFolder, fileLoc);
|
||||||
if (!outFile.exists()) {
|
if (!outFile.exists()) {
|
||||||
outFile.getParentFile().mkdirs();
|
outFile.getParentFile().mkdirs();
|
||||||
@ -126,7 +127,8 @@ public class DataStorage {
|
|||||||
if (!outFile.exists() || overwrite) {
|
if (!outFile.exists() || overwrite) {
|
||||||
try {
|
try {
|
||||||
InputStream inputStream =
|
InputStream inputStream =
|
||||||
this.getClass().getClassLoader().getResourceAsStream(sourceLoc);
|
this.getClass().getClassLoader().getResourceAsStream(
|
||||||
|
sourceLoc);
|
||||||
if (inputStream == null) {
|
if (inputStream == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -134,11 +136,10 @@ public class DataStorage {
|
|||||||
writeToFile(inputStream, outFile);
|
writeToFile(inputStream, outFile);
|
||||||
} catch (NullPointerException e) {
|
} catch (NullPointerException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
this.infoLogger.warning(
|
this.infoLogger.warning("Could not load " + sourceLoc
|
||||||
"Could not load "
|
|
||||||
+ sourceLoc
|
|
||||||
+ ". The file does"
|
+ ". The file does"
|
||||||
+ "not exist or there has been an error reading the file.");
|
+ ("not exist or there has been an "
|
||||||
|
+ "error reading the file."));
|
||||||
return false;
|
return false;
|
||||||
} catch (FileNotFoundException e) {
|
} catch (FileNotFoundException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@ -152,8 +153,8 @@ public class DataStorage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A method to try to grab the files from the plugin and if its in the plugin folder load from
|
* A method to try to grab the files from the plugin and if its in the
|
||||||
* there instead.
|
* plugin folder load from there instead.
|
||||||
*
|
*
|
||||||
* <p>
|
* <p>
|
||||||
*
|
*
|
||||||
@ -172,14 +173,14 @@ public class DataStorage {
|
|||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
copyDefaultFile(location, false);
|
copyDefaultFile(location, false);
|
||||||
return this.getClass().getClassLoader().getResourceAsStream(location);
|
return this.getClass().getClassLoader().getResourceAsStream(
|
||||||
|
location);
|
||||||
} catch (NullPointerException e) {
|
} catch (NullPointerException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
this.infoLogger.warning(
|
this.infoLogger.warning("Could not load " + location
|
||||||
"Could not load "
|
|
||||||
+ location
|
|
||||||
+ ". The file does"
|
+ ". The file does"
|
||||||
+ "not exist or there has been an error reading the file.");
|
+ ("not exist or there has been an "
|
||||||
|
+ "error reading the file."));
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -194,7 +195,8 @@ public class DataStorage {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void writeToFile(InputStream inputStream, File outFile) throws IOException {
|
private void writeToFile(InputStream inputStream, File outFile)
|
||||||
|
throws IOException {
|
||||||
try (FileOutputStream outStream = new FileOutputStream(outFile)) {
|
try (FileOutputStream outStream = new FileOutputStream(outFile)) {
|
||||||
byte[] buf = new byte[1024];
|
byte[] buf = new byte[1024];
|
||||||
int len;
|
int len;
|
||||||
@ -209,7 +211,8 @@ public class DataStorage {
|
|||||||
return new File(this.dataFolder, name).exists();
|
return new File(this.dataFolder, name).exists();
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<String> listAllFiles(String fileLocation, boolean trimExtension) {
|
public List<String> listAllFiles(String fileLocation,
|
||||||
|
boolean trimExtension) {
|
||||||
return listAllFiles(fileLocation, trimExtension, null);
|
return listAllFiles(fileLocation, trimExtension, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -219,7 +222,8 @@ public class DataStorage {
|
|||||||
* @param extension - if null will not filter by extension
|
* @param extension - if null will not filter by extension
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public List<String> listAllFiles(String fileLocation, boolean trimExtension, String extension) {
|
public List<String> listAllFiles(String fileLocation, boolean trimExtension,
|
||||||
|
String extension) {
|
||||||
File directory = new File(dataFolder, fileLocation);
|
File directory = new File(dataFolder, fileLocation);
|
||||||
List<String> list = new ArrayList<>();
|
List<String> list = new ArrayList<>();
|
||||||
|
|
||||||
@ -230,7 +234,8 @@ public class DataStorage {
|
|||||||
if (file.isFile()) {
|
if (file.isFile()) {
|
||||||
String fileName = file.getName();
|
String fileName = file.getName();
|
||||||
boolean extensionMatches =
|
boolean extensionMatches =
|
||||||
(extension == null || fileName.endsWith("." + extension));
|
(extension == null
|
||||||
|
|| fileName.endsWith("." + extension));
|
||||||
|
|
||||||
if (extensionMatches) {
|
if (extensionMatches) {
|
||||||
if (trimExtension) {
|
if (trimExtension) {
|
||||||
@ -245,7 +250,9 @@ public class DataStorage {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
infoLogger.warning("Directory does not exist or is not a directory: " + fileLocation);
|
infoLogger.warning(
|
||||||
|
"Directory does not exist or is not a directory: "
|
||||||
|
+ fileLocation);
|
||||||
}
|
}
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package com.sekwah.advancedportals.core.serializeddata;
|
package com.sekwah.advancedportals.core.serializeddata;
|
||||||
|
|
||||||
public class DataTag {
|
public class DataTag {
|
||||||
|
|
||||||
public final String NAME;
|
public final String NAME;
|
||||||
public final String[] VALUES;
|
public final String[] VALUES;
|
||||||
|
|
||||||
|
@ -3,32 +3,44 @@ package com.sekwah.advancedportals.core.serializeddata;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Possibly one of the only files in this package not designed to be serialised.
|
* Possibly one of the only files in this package not designed to be
|
||||||
|
* serialised.
|
||||||
*
|
*
|
||||||
* <p>Any temporary data about players will be stored here and cleaned up when the player leaves the
|
* <p>Any temporary data about players will be stored here and cleaned up when
|
||||||
* server.
|
* the player leaves the server.
|
||||||
*
|
*
|
||||||
* <p>This is not a place to store long term data e.g. if you want to make a player unable to use a
|
* <p>This is not a place to store long term data e.g. if you want to make a
|
||||||
* portal over hours/days.
|
* player unable to use a portal over hours/days.
|
||||||
*/
|
*/
|
||||||
public class PlayerData {
|
public class PlayerData {
|
||||||
|
/**
|
||||||
/** Portal selection position 1 */
|
* Portal selection position 1
|
||||||
|
*/
|
||||||
private BlockLocation pos1;
|
private BlockLocation pos1;
|
||||||
|
|
||||||
/** Portal selection position 2 */
|
/**
|
||||||
|
* Portal selection position 2
|
||||||
|
*/
|
||||||
private BlockLocation pos2;
|
private BlockLocation pos2;
|
||||||
|
|
||||||
/** If to show portals near the player */
|
/**
|
||||||
|
* If to show portals near the player
|
||||||
|
*/
|
||||||
private boolean portalVisible = false;
|
private boolean portalVisible = false;
|
||||||
|
|
||||||
/** If to show destination blocks near the player */
|
/**
|
||||||
|
* If to show destination blocks near the player
|
||||||
|
*/
|
||||||
private boolean destiVisible;
|
private boolean destiVisible;
|
||||||
|
|
||||||
/** If the player is in a portal. Stops re-triggering. */
|
/**
|
||||||
|
* If the player is in a portal. Stops re-triggering.
|
||||||
|
*/
|
||||||
private transient boolean isInPortal = false;
|
private transient boolean isInPortal = false;
|
||||||
|
|
||||||
/** The next time System.currentTimeMillis() a player can use a portal. */
|
/**
|
||||||
|
* The next time System.currentTimeMillis() a player can use a portal.
|
||||||
|
*/
|
||||||
private transient long joinCooldown;
|
private transient long joinCooldown;
|
||||||
|
|
||||||
private transient long netherPortalCooldown;
|
private transient long netherPortalCooldown;
|
||||||
@ -94,7 +106,8 @@ public class PlayerData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void setNetherPortalCooldown(long netherPortalCooldown) {
|
public void setNetherPortalCooldown(long netherPortalCooldown) {
|
||||||
this.netherPortalCooldown = System.currentTimeMillis() + netherPortalCooldown;
|
this.netherPortalCooldown =
|
||||||
|
System.currentTimeMillis() + netherPortalCooldown;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasJoinCooldown() {
|
public boolean hasJoinCooldown() {
|
||||||
@ -106,7 +119,8 @@ public class PlayerData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void setPortalCooldown(String portalName, long cooldown) {
|
public void setPortalCooldown(String portalName, long cooldown) {
|
||||||
perPortalCooldowns.put(portalName, System.currentTimeMillis() + cooldown);
|
perPortalCooldowns.put(portalName,
|
||||||
|
System.currentTimeMillis() + cooldown);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasPortalCooldown(String portalName) {
|
public boolean hasPortalCooldown(String portalName) {
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package com.sekwah.advancedportals.core.serializeddata;
|
package com.sekwah.advancedportals.core.serializeddata;
|
||||||
|
|
||||||
public class PlayerLocation extends WorldLocation {
|
public class PlayerLocation extends WorldLocation {
|
||||||
|
|
||||||
private final float yaw;
|
private final float yaw;
|
||||||
|
|
||||||
private final float pitch;
|
private final float pitch;
|
||||||
@ -12,14 +11,15 @@ public class PlayerLocation extends WorldLocation {
|
|||||||
this.pitch = 0;
|
this.pitch = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PlayerLocation(String worldName, double posX, double posY, double posZ) {
|
public PlayerLocation(String worldName, double posX, double posY,
|
||||||
|
double posZ) {
|
||||||
super(worldName, posX, posY, posZ);
|
super(worldName, posX, posY, posZ);
|
||||||
this.yaw = 0;
|
this.yaw = 0;
|
||||||
this.pitch = 0;
|
this.pitch = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PlayerLocation(
|
public PlayerLocation(String worldName, double posX, double posY,
|
||||||
String worldName, double posX, double posY, double posZ, float yaw, float pitch) {
|
double posZ, float yaw, float pitch) {
|
||||||
super(worldName, posX, posY, posZ);
|
super(worldName, posX, posY, posZ);
|
||||||
this.yaw = yaw;
|
this.yaw = yaw;
|
||||||
this.pitch = pitch;
|
this.pitch = pitch;
|
||||||
|
@ -1,23 +1,21 @@
|
|||||||
package com.sekwah.advancedportals.core.serializeddata;
|
package com.sekwah.advancedportals.core.serializeddata;
|
||||||
|
|
||||||
import com.sekwah.advancedportals.core.util.InfoLogger;
|
import com.sekwah.advancedportals.core.util.InfoLogger;
|
||||||
|
import java.lang.reflect.*;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import javax.inject.Inject;
|
||||||
import org.yaml.snakeyaml.LoaderOptions;
|
import org.yaml.snakeyaml.LoaderOptions;
|
||||||
import org.yaml.snakeyaml.constructor.Constructor;
|
import org.yaml.snakeyaml.constructor.Constructor;
|
||||||
import org.yaml.snakeyaml.nodes.*;
|
import org.yaml.snakeyaml.nodes.*;
|
||||||
import sun.misc.Unsafe;
|
import sun.misc.Unsafe;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
|
||||||
import java.lang.reflect.*;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public class ReflectiveConstructor<T> extends Constructor {
|
public class ReflectiveConstructor<T> extends Constructor {
|
||||||
private static final Unsafe unsafe = getUnsafe();
|
private static final Unsafe unsafe = getUnsafe();
|
||||||
private final Class<T> clazz;
|
private final Class<T> clazz;
|
||||||
|
|
||||||
@Inject
|
@Inject private InfoLogger infoLogger;
|
||||||
private InfoLogger infoLogger;
|
|
||||||
|
|
||||||
public ReflectiveConstructor(Class<T> clazz, LoaderOptions loadingConfig) {
|
public ReflectiveConstructor(Class<T> clazz, LoaderOptions loadingConfig) {
|
||||||
super(clazz, loadingConfig);
|
super(clazz, loadingConfig);
|
||||||
@ -34,10 +32,11 @@ public class ReflectiveConstructor<T> extends Constructor {
|
|||||||
return constructFromMappingNode(currentClass, (MappingNode) node);
|
return constructFromMappingNode(currentClass, (MappingNode) node);
|
||||||
} else if (node instanceof ScalarNode scalarNode) {
|
} else if (node instanceof ScalarNode scalarNode) {
|
||||||
return constructFromScalarNode(scalarNode);
|
return constructFromScalarNode(scalarNode);
|
||||||
} else if(node instanceof SequenceNode sequenceNode) {
|
} else if (node instanceof SequenceNode sequenceNode) {
|
||||||
return constructFromSequenceNode(sequenceNode);
|
return constructFromSequenceNode(sequenceNode);
|
||||||
} else {
|
} else {
|
||||||
infoLogger.warning("Unexpected node type encountered: " + node.getClass().getSimpleName());
|
infoLogger.warning("Unexpected node type encountered: "
|
||||||
|
+ node.getClass().getSimpleName());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -58,9 +57,10 @@ public class ReflectiveConstructor<T> extends Constructor {
|
|||||||
return array;
|
return array;
|
||||||
}
|
}
|
||||||
|
|
||||||
private <U> Object constructFromMappingNode(Class<U> currentClass, MappingNode mappingNode) {
|
private <U> Object constructFromMappingNode(Class<U> currentClass,
|
||||||
|
MappingNode mappingNode) {
|
||||||
// if the class is a hashmap, loop over the values and construct the objects
|
// if the class is a hashmap, loop over the values and construct the
|
||||||
|
// objects
|
||||||
if (currentClass.equals(HashMap.class)) {
|
if (currentClass.equals(HashMap.class)) {
|
||||||
Map<String, Object> values = new HashMap<>();
|
Map<String, Object> values = new HashMap<>();
|
||||||
for (NodeTuple tuple : mappingNode.getValue()) {
|
for (NodeTuple tuple : mappingNode.getValue()) {
|
||||||
@ -71,18 +71,23 @@ public class ReflectiveConstructor<T> extends Constructor {
|
|||||||
if (node instanceof ScalarNode scalarNode) {
|
if (node instanceof ScalarNode scalarNode) {
|
||||||
var constructedItem = constructFromScalarNode(scalarNode);
|
var constructedItem = constructFromScalarNode(scalarNode);
|
||||||
values.put(key, constructedItem);
|
values.put(key, constructedItem);
|
||||||
} else if(node instanceof SequenceNode sequenceNode) {
|
} else if (node instanceof SequenceNode sequenceNode) {
|
||||||
var constructedItem = constructFromSequenceNode(sequenceNode);
|
var constructedItem =
|
||||||
|
constructFromSequenceNode(sequenceNode);
|
||||||
values.put(key, constructedItem);
|
values.put(key, constructedItem);
|
||||||
} else if (node instanceof MappingNode mappingNodeChild) {
|
} else if (node instanceof MappingNode mappingNodeChild) {
|
||||||
try {
|
try {
|
||||||
Object value = constructFromMappingNode(Object.class, mappingNodeChild);
|
Object value = constructFromMappingNode(
|
||||||
|
Object.class, mappingNodeChild);
|
||||||
values.put(key, value);
|
values.put(key, value);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
infoLogger.warning("Failed to construct object from mapping node: " + e.getMessage());
|
infoLogger.warning(
|
||||||
|
"Failed to construct object from mapping node: "
|
||||||
|
+ e.getMessage());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
infoLogger.warning("Unexpected node type encountered: " + node.getClass().getSimpleName());
|
infoLogger.warning("Unexpected node type encountered: "
|
||||||
|
+ node.getClass().getSimpleName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return values;
|
return values;
|
||||||
@ -93,11 +98,14 @@ public class ReflectiveConstructor<T> extends Constructor {
|
|||||||
try {
|
try {
|
||||||
instance = currentClass.getDeclaredConstructor().newInstance();
|
instance = currentClass.getDeclaredConstructor().newInstance();
|
||||||
} catch (NoSuchMethodException e) {
|
} catch (NoSuchMethodException e) {
|
||||||
infoLogger.info("No default constructor found for " + currentClass.getName() + ", using unsafe allocation.");
|
infoLogger.info("No default constructor found for "
|
||||||
|
+ currentClass.getName()
|
||||||
|
+ ", using unsafe allocation.");
|
||||||
instance = unsafe.allocateInstance(currentClass);
|
instance = unsafe.allocateInstance(currentClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, Object> mappedValues = mapMappingNode(currentClass, mappingNode);
|
Map<String, Object> mappedValues =
|
||||||
|
mapMappingNode(currentClass, mappingNode);
|
||||||
|
|
||||||
Field[] fields = getAllFields(currentClass);
|
Field[] fields = getAllFields(currentClass);
|
||||||
for (Field field : fields) {
|
for (Field field : fields) {
|
||||||
@ -111,19 +119,28 @@ public class ReflectiveConstructor<T> extends Constructor {
|
|||||||
|
|
||||||
setField(instance, field, value);
|
setField(instance, field, value);
|
||||||
} else {
|
} else {
|
||||||
infoLogger.warning("Field " + field.getName() + " not found in mapping node " + instance.getClass().getName() + " will use default value.");
|
infoLogger.warning("Field " + field.getName()
|
||||||
|
+ " not found in mapping node "
|
||||||
|
+ instance.getClass().getName()
|
||||||
|
+ " will use default value.");
|
||||||
}
|
}
|
||||||
}
|
} catch (Exception e) {
|
||||||
catch (Exception e) {
|
infoLogger.warning("Failed to set field " + field.getName()
|
||||||
infoLogger.warning("Failed to set field " + field.getName() + " in " + currentClass.getName() + ": " + e.getMessage());
|
+ " in " + currentClass.getName()
|
||||||
|
+ ": " + e.getMessage());
|
||||||
infoLogger.error(e);
|
infoLogger.error(e);
|
||||||
throw new RuntimeException("Failed to set field " + field.getName() + " in " + currentClass.getName(), e);
|
throw new RuntimeException("Failed to set field "
|
||||||
|
+ field.getName() + " in "
|
||||||
|
+ currentClass.getName(),
|
||||||
|
e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return instance;
|
return instance;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
infoLogger.warning("Failed to instantiate " + currentClass.getName() + ": " + e.getMessage());
|
infoLogger.warning("Failed to instantiate " + currentClass.getName()
|
||||||
throw new RuntimeException("Failed to instantiate " + currentClass.getName(), e);
|
+ ": " + e.getMessage());
|
||||||
|
throw new RuntimeException(
|
||||||
|
"Failed to instantiate " + currentClass.getName(), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,7 +159,8 @@ public class ReflectiveConstructor<T> extends Constructor {
|
|||||||
return super.constructObject(scalarNode);
|
return super.constructObject(scalarNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Map<String, Object> mapMappingNode(Class<?> currentClass, MappingNode mappingNode) {
|
private Map<String, Object> mapMappingNode(Class<?> currentClass,
|
||||||
|
MappingNode mappingNode) {
|
||||||
Map<String, Object> values = new HashMap<>();
|
Map<String, Object> values = new HashMap<>();
|
||||||
for (NodeTuple tuple : mappingNode.getValue()) {
|
for (NodeTuple tuple : mappingNode.getValue()) {
|
||||||
var key = (String) super.constructObject(tuple.getKeyNode());
|
var key = (String) super.constructObject(tuple.getKeyNode());
|
||||||
@ -154,13 +172,16 @@ public class ReflectiveConstructor<T> extends Constructor {
|
|||||||
} else if (node instanceof MappingNode mappingNodeChild) {
|
} else if (node instanceof MappingNode mappingNodeChild) {
|
||||||
try {
|
try {
|
||||||
var field = currentClass.getDeclaredField(key);
|
var field = currentClass.getDeclaredField(key);
|
||||||
Object value = constructFromMappingNode(field.getType(), mappingNodeChild);
|
Object value = constructFromMappingNode(field.getType(),
|
||||||
|
mappingNodeChild);
|
||||||
values.put(key, value);
|
values.put(key, value);
|
||||||
} catch (NoSuchFieldException e) {
|
} catch (NoSuchFieldException e) {
|
||||||
infoLogger.warning("Field " + key + " not found on " + currentClass.getName());
|
infoLogger.warning("Field " + key + " not found on "
|
||||||
|
+ currentClass.getName());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
infoLogger.warning("Expected mapping node: " + node.getClass().getSimpleName());
|
infoLogger.warning("Expected mapping node: "
|
||||||
|
+ node.getClass().getSimpleName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return values;
|
return values;
|
||||||
@ -169,14 +190,14 @@ public class ReflectiveConstructor<T> extends Constructor {
|
|||||||
/**
|
/**
|
||||||
* Check and convert value types e.g. double to float
|
* Check and convert value types e.g. double to float
|
||||||
*/
|
*/
|
||||||
private void setField(Object instance, Field field, Object value) throws IllegalAccessException {
|
private void setField(Object instance, Field field, Object value)
|
||||||
|
throws IllegalAccessException {
|
||||||
// Check for numeric type compatibility and cast if necessary
|
// Check for numeric type compatibility and cast if necessary
|
||||||
if (field.getType() == float.class && value instanceof Double) {
|
if (field.getType() == float.class &&value instanceof Double) {
|
||||||
value = ((Double) value).floatValue();
|
value = ((Double) value).floatValue();
|
||||||
} else if (field.getType() == int.class && value instanceof Long) {
|
} else if (field.getType() == int.class &&value instanceof Long) {
|
||||||
value = ((Long) value).intValue();
|
value = ((Long) value).intValue();
|
||||||
} else if (field.getType() == short.class && value instanceof Integer) {
|
} else if (field.getType() == short.class &&value instanceof Integer) {
|
||||||
value = ((Integer) value).shortValue();
|
value = ((Integer) value).shortValue();
|
||||||
} else if (field.getType() == byte.class && value instanceof Integer) {
|
} else if (field.getType() == byte.class && value instanceof Integer) {
|
||||||
value = ((Integer) value).byteValue();
|
value = ((Integer) value).byteValue();
|
||||||
@ -186,7 +207,6 @@ public class ReflectiveConstructor<T> extends Constructor {
|
|||||||
field.set(instance, value);
|
field.set(instance, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static Unsafe getUnsafe() {
|
private static Unsafe getUnsafe() {
|
||||||
try {
|
try {
|
||||||
Field f = Unsafe.class.getDeclaredField("theUnsafe");
|
Field f = Unsafe.class.getDeclaredField("theUnsafe");
|
||||||
|
@ -5,7 +5,6 @@ import org.yaml.snakeyaml.introspector.BeanAccess;
|
|||||||
import org.yaml.snakeyaml.representer.Representer;
|
import org.yaml.snakeyaml.representer.Representer;
|
||||||
|
|
||||||
public class ReflectiveRepresenter extends Representer {
|
public class ReflectiveRepresenter extends Representer {
|
||||||
|
|
||||||
public ReflectiveRepresenter(DumperOptions options) {
|
public ReflectiveRepresenter(DumperOptions options) {
|
||||||
super(options);
|
super(options);
|
||||||
this.getPropertyUtils().setBeanAccess(BeanAccess.FIELD);
|
this.getPropertyUtils().setBeanAccess(BeanAccess.FIELD);
|
||||||
|
@ -1,18 +1,16 @@
|
|||||||
package com.sekwah.advancedportals.core.serializeddata;
|
package com.sekwah.advancedportals.core.serializeddata;
|
||||||
|
|
||||||
public class WorldLocation extends Vector {
|
public class WorldLocation extends Vector {
|
||||||
|
|
||||||
public final String worldName;
|
public final String worldName;
|
||||||
|
|
||||||
public WorldLocation(String worldName, double posX, double posY, double posZ) {
|
public WorldLocation(String worldName, double posX, double posY,
|
||||||
|
double posZ) {
|
||||||
super(posX, posY, posZ);
|
super(posX, posY, posZ);
|
||||||
this.worldName = worldName;
|
this.worldName = worldName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public BlockLocation toBlockPos() {
|
public BlockLocation toBlockPos() {
|
||||||
return new BlockLocation(
|
return new BlockLocation(this.worldName, (int) Math.floor(this.x),
|
||||||
this.worldName,
|
|
||||||
(int) Math.floor(this.x),
|
|
||||||
(int) Math.floor(this.y),
|
(int) Math.floor(this.y),
|
||||||
(int) Math.floor(this.z));
|
(int) Math.floor(this.z));
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
package com.sekwah.advancedportals.core.serializeddata.config;
|
package com.sekwah.advancedportals.core.serializeddata.config;
|
||||||
|
|
||||||
/** To store the data for config */
|
/**
|
||||||
|
* To store the data for config
|
||||||
|
*/
|
||||||
public class Config {
|
public class Config {
|
||||||
|
|
||||||
public boolean useOnlySpecialAxe = true;
|
public boolean useOnlySpecialAxe = true;
|
||||||
|
|
||||||
public String selectorMaterial = "IRON_AXE";
|
public String selectorMaterial = "IRON_AXE";
|
||||||
|
@ -1,7 +1,3 @@
|
|||||||
package com.sekwah.advancedportals.core.services;
|
package com.sekwah.advancedportals.core.services;
|
||||||
|
|
||||||
public enum Creation {
|
public enum Creation { SUCCESS, NAME_IN_USE, TAG_REJECTED }
|
||||||
SUCCESS,
|
|
||||||
NAME_IN_USE,
|
|
||||||
TAG_REJECTED
|
|
||||||
}
|
|
||||||
|
@ -9,17 +9,14 @@ import com.sekwah.advancedportals.core.serializeddata.DataTag;
|
|||||||
import com.sekwah.advancedportals.core.serializeddata.PlayerLocation;
|
import com.sekwah.advancedportals.core.serializeddata.PlayerLocation;
|
||||||
import com.sekwah.advancedportals.core.util.Lang;
|
import com.sekwah.advancedportals.core.util.Lang;
|
||||||
import com.sekwah.advancedportals.core.warphandler.Tag;
|
import com.sekwah.advancedportals.core.warphandler.Tag;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
public class DestinationServices {
|
public class DestinationServices {
|
||||||
|
|
||||||
@Inject private IDestinationRepository destinationRepository;
|
@Inject private IDestinationRepository destinationRepository;
|
||||||
|
|
||||||
@Inject TagRegistry tagRegistry;
|
@Inject TagRegistry tagRegistry;
|
||||||
@ -43,38 +40,40 @@ public class DestinationServices {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Destination createDesti(PlayerLocation playerLocation, List<DataTag> tags) {
|
public Destination createDesti(PlayerLocation playerLocation,
|
||||||
|
List<DataTag> tags) {
|
||||||
return createDesti(null, playerLocation, tags);
|
return createDesti(null, playerLocation, tags);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Destination createDesti(
|
public Destination createDesti(PlayerContainer player,
|
||||||
PlayerContainer player, PlayerLocation playerLocation, List<DataTag> tags) {
|
PlayerLocation playerLocation,
|
||||||
|
List<DataTag> tags) {
|
||||||
// Find the tag with the "name" NAME
|
// Find the tag with the "name" NAME
|
||||||
DataTag nameTag =
|
DataTag nameTag = tags.stream()
|
||||||
tags.stream().filter(tag -> tag.NAME.equals("name")).findFirst().orElse(null);
|
.filter(tag -> tag.NAME.equals("name"))
|
||||||
|
.findFirst()
|
||||||
|
.orElse(null);
|
||||||
|
|
||||||
String name = nameTag == null ? null : nameTag.VALUES[0];
|
String name = nameTag == null ? null : nameTag.VALUES[0];
|
||||||
|
|
||||||
// If the name is null, send an error saying that the name is required.
|
// If the name is null, send an error saying that the name is required.
|
||||||
if (nameTag == null) {
|
if (nameTag == null) {
|
||||||
if (player != null)
|
if (player != null)
|
||||||
player.sendMessage(
|
player.sendMessage(Lang.translate("messageprefix.negative")
|
||||||
Lang.translate("messageprefix.negative")
|
|
||||||
+ Lang.translate("desti.error.noname"));
|
+ Lang.translate("desti.error.noname"));
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (name == null || name.equals("")) {
|
if (name == null || name.equals("")) {
|
||||||
if (player != null)
|
if (player != null)
|
||||||
player.sendMessage(
|
player.sendMessage(Lang.translate("messageprefix.negative")
|
||||||
Lang.translate("messageprefix.negative")
|
|
||||||
+ Lang.translate("command.error.noname"));
|
+ Lang.translate("command.error.noname"));
|
||||||
return null;
|
return null;
|
||||||
} else if (this.destinationRepository.containsKey(name)) {
|
} else if (this.destinationRepository.containsKey(name)) {
|
||||||
if (player != null)
|
if (player != null)
|
||||||
player.sendMessage(
|
player.sendMessage(Lang.translate("messageprefix.negative")
|
||||||
Lang.translate("messageprefix.negative")
|
+ Lang.translateInsertVariables(
|
||||||
+ Lang.translateInsertVariables("command.error.nametaken", name));
|
"command.error.nametaken", name));
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -83,7 +82,8 @@ public class DestinationServices {
|
|||||||
desti.setArgValues(portalTag);
|
desti.setArgValues(portalTag);
|
||||||
}
|
}
|
||||||
for (DataTag destiTag : tags) {
|
for (DataTag destiTag : tags) {
|
||||||
Tag.Creation creation = tagRegistry.getCreationHandler(destiTag.NAME);
|
Tag.Creation creation =
|
||||||
|
tagRegistry.getCreationHandler(destiTag.NAME);
|
||||||
if (creation != null) {
|
if (creation != null) {
|
||||||
if (!creation.created(desti, player, destiTag.VALUES)) {
|
if (!creation.created(desti, player, destiTag.VALUES)) {
|
||||||
return null;
|
return null;
|
||||||
@ -98,13 +98,14 @@ public class DestinationServices {
|
|||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
player.sendMessage(
|
player.sendMessage(Lang.translate("messageprefix.negative")
|
||||||
Lang.translate("messageprefix.negative") + Lang.translate("desti.error.save"));
|
+ Lang.translate("desti.error.save"));
|
||||||
}
|
}
|
||||||
return desti;
|
return desti;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean removeDestination(String name, PlayerContainer playerContainer) {
|
public boolean removeDestination(String name,
|
||||||
|
PlayerContainer playerContainer) {
|
||||||
this.destinationCache.remove(name);
|
this.destinationCache.remove(name);
|
||||||
if (this.destinationRepository.containsKey(name)) {
|
if (this.destinationRepository.containsKey(name)) {
|
||||||
this.destinationRepository.delete(name);
|
this.destinationRepository.delete(name);
|
||||||
@ -117,9 +118,11 @@ public class DestinationServices {
|
|||||||
return destinationCache.get(name);
|
return destinationCache.get(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean teleportToDestination(String name, PlayerContainer playerContainer) {
|
public boolean teleportToDestination(String name,
|
||||||
|
PlayerContainer playerContainer) {
|
||||||
if (this.destinationRepository.containsKey(name)) {
|
if (this.destinationRepository.containsKey(name)) {
|
||||||
playerContainer.teleport(this.destinationRepository.get(name).getLoc());
|
playerContainer.teleport(
|
||||||
|
this.destinationRepository.get(name).getLoc());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -7,17 +7,16 @@ import com.sekwah.advancedportals.core.repository.IPlayerDataRepository;
|
|||||||
import com.sekwah.advancedportals.core.serializeddata.BlockLocation;
|
import com.sekwah.advancedportals.core.serializeddata.BlockLocation;
|
||||||
import com.sekwah.advancedportals.core.serializeddata.PlayerData;
|
import com.sekwah.advancedportals.core.serializeddata.PlayerData;
|
||||||
import com.sekwah.advancedportals.core.util.Lang;
|
import com.sekwah.advancedportals.core.util.Lang;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
public final class PlayerDataServices {
|
public final class PlayerDataServices {
|
||||||
|
/**
|
||||||
/** Possibly change to the cache map Aztec was talking about */
|
* Possibly change to the cache map Aztec was talking about
|
||||||
|
*/
|
||||||
private Map<UUID, PlayerData> tempDataMap = new HashMap<>();
|
private Map<UUID, PlayerData> tempDataMap = new HashMap<>();
|
||||||
|
|
||||||
@Inject private IPlayerDataRepository tempDataRepository;
|
@Inject private IPlayerDataRepository tempDataRepository;
|
||||||
@ -25,9 +24,7 @@ public final class PlayerDataServices {
|
|||||||
@Inject private ConfigRepository configRepository;
|
@Inject private ConfigRepository configRepository;
|
||||||
|
|
||||||
public PlayerData getPlayerData(PlayerContainer player) {
|
public PlayerData getPlayerData(PlayerContainer player) {
|
||||||
return tempDataMap.computeIfAbsent(
|
return tempDataMap.computeIfAbsent(player.getUUID(), uuid -> {
|
||||||
player.getUUID(),
|
|
||||||
uuid -> {
|
|
||||||
var tempData = tempDataRepository.get(player.getUUID().toString());
|
var tempData = tempDataRepository.get(player.getUUID().toString());
|
||||||
|
|
||||||
if (tempData == null) {
|
if (tempData == null) {
|
||||||
@ -43,24 +40,22 @@ public final class PlayerDataServices {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void playerLeave(PlayerContainer player) {
|
public void playerLeave(PlayerContainer player) {
|
||||||
tempDataRepository.save(player.getUUID().toString(), getPlayerData(player));
|
tempDataRepository.save(player.getUUID().toString(),
|
||||||
|
getPlayerData(player));
|
||||||
tempDataMap.remove(player.getUUID());
|
tempDataMap.remove(player.getUUID());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void playerSelectorActivate(
|
public void playerSelectorActivate(PlayerContainer player,
|
||||||
PlayerContainer player, BlockLocation blockLoc, boolean leftClick) {
|
BlockLocation blockLoc,
|
||||||
|
boolean leftClick) {
|
||||||
var tempData = getPlayerData(player);
|
var tempData = getPlayerData(player);
|
||||||
if (leftClick) {
|
if (leftClick) {
|
||||||
tempData.setPos1(blockLoc);
|
tempData.setPos1(blockLoc);
|
||||||
} else {
|
} else {
|
||||||
tempData.setPos2(blockLoc);
|
tempData.setPos2(blockLoc);
|
||||||
}
|
}
|
||||||
player.sendMessage(
|
player.sendMessage(Lang.translateInsertVariables(
|
||||||
Lang.translateInsertVariables(
|
"portal.selector.poschange", leftClick ? "1" : "2",
|
||||||
"portal.selector.poschange",
|
blockLoc.getPosX(), blockLoc.getPosY(), blockLoc.getPosZ()));
|
||||||
leftClick ? "1" : "2",
|
|
||||||
blockLoc.getPosX(),
|
|
||||||
blockLoc.getPosY(),
|
|
||||||
blockLoc.getPosZ()));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,14 +14,11 @@ import com.sekwah.advancedportals.core.tags.activation.NameTag;
|
|||||||
import com.sekwah.advancedportals.core.util.Lang;
|
import com.sekwah.advancedportals.core.util.Lang;
|
||||||
import com.sekwah.advancedportals.core.util.PlayerUtils;
|
import com.sekwah.advancedportals.core.util.PlayerUtils;
|
||||||
import com.sekwah.advancedportals.core.warphandler.Tag;
|
import com.sekwah.advancedportals.core.warphandler.Tag;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
public class PortalServices {
|
public class PortalServices {
|
||||||
|
|
||||||
@Inject private IPortalRepository portalRepository;
|
@Inject private IPortalRepository portalRepository;
|
||||||
|
|
||||||
@Inject private transient PlayerDataServices playerDataServices;
|
@Inject private transient PlayerDataServices playerDataServices;
|
||||||
@ -47,7 +44,8 @@ public class PortalServices {
|
|||||||
|
|
||||||
public boolean inPortalRegionProtected(BlockLocation loc) {
|
public boolean inPortalRegionProtected(BlockLocation loc) {
|
||||||
for (AdvancedPortal portal : portalCache.values()) {
|
for (AdvancedPortal portal : portalCache.values()) {
|
||||||
if (portal.isLocationInPortal(loc, configRepository.getProtectionRadius())) {
|
if (portal.isLocationInPortal(
|
||||||
|
loc, configRepository.getProtectionRadius())) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -56,7 +54,8 @@ public class PortalServices {
|
|||||||
|
|
||||||
public boolean inPortalRegionProtected(PlayerLocation loc) {
|
public boolean inPortalRegionProtected(PlayerLocation loc) {
|
||||||
for (AdvancedPortal portal : portalCache.values()) {
|
for (AdvancedPortal portal : portalCache.values()) {
|
||||||
if (portal.isLocationInPortal(loc, configRepository.getProtectionRadius())) {
|
if (portal.isLocationInPortal(
|
||||||
|
loc, configRepository.getProtectionRadius())) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -73,7 +72,6 @@ public class PortalServices {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void playerMove(PlayerContainer player, PlayerLocation toLoc) {
|
public void playerMove(PlayerContainer player, PlayerLocation toLoc) {
|
||||||
|
|
||||||
var blockLoc = toLoc.toBlockPos();
|
var blockLoc = toLoc.toBlockPos();
|
||||||
var blockEntityTopLoc = blockLoc.addY(player.getHeight());
|
var blockEntityTopLoc = blockLoc.addY(player.getHeight());
|
||||||
var world = player.getWorld();
|
var world = player.getWorld();
|
||||||
@ -82,7 +80,8 @@ public class PortalServices {
|
|||||||
|
|
||||||
var notInPortal = true;
|
var notInPortal = true;
|
||||||
for (AdvancedPortal portal : portalCache.values()) {
|
for (AdvancedPortal portal : portalCache.values()) {
|
||||||
if ((portal.isLocationInPortal(toLoc) && portal.isTriggerBlock(blockMaterial))
|
if ((portal.isLocationInPortal(toLoc)
|
||||||
|
&& portal.isTriggerBlock(blockMaterial))
|
||||||
|| (portal.isLocationInPortal(blockEntityTopLoc)
|
|| (portal.isLocationInPortal(blockEntityTopLoc)
|
||||||
&& portal.isTriggerBlock(blockEntityTopMaterial))) {
|
&& portal.isTriggerBlock(blockEntityTopMaterial))) {
|
||||||
notInPortal = false;
|
notInPortal = false;
|
||||||
@ -118,11 +117,13 @@ public class PortalServices {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AdvancedPortal createPortal(BlockLocation pos1, BlockLocation pos2, List<DataTag> tags) {
|
public AdvancedPortal createPortal(BlockLocation pos1, BlockLocation pos2,
|
||||||
|
List<DataTag> tags) {
|
||||||
return createPortal(null, pos1, pos2, tags);
|
return createPortal(null, pos1, pos2, tags);
|
||||||
}
|
}
|
||||||
|
|
||||||
public AdvancedPortal createPortal(PlayerContainer player, ArrayList<DataTag> tags) {
|
public AdvancedPortal createPortal(PlayerContainer player,
|
||||||
|
ArrayList<DataTag> tags) {
|
||||||
PlayerData tempData = playerDataServices.getPlayerData(player);
|
PlayerData tempData = playerDataServices.getPlayerData(player);
|
||||||
|
|
||||||
if (tempData.getPos1() == null || tempData.getPos2() == null) {
|
if (tempData.getPos1() == null || tempData.getPos2() == null) {
|
||||||
@ -132,21 +133,23 @@ public class PortalServices {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!tempData.getPos1().getWorldName().equals(tempData.getPos2().getWorldName())) {
|
if (!tempData.getPos1().getWorldName().equals(
|
||||||
|
tempData.getPos2().getWorldName())) {
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
Lang.translate("messageprefix.negative")
|
Lang.translate("messageprefix.negative")
|
||||||
+ Lang.translate("portal.error.selection.differentworlds"));
|
+ Lang.translate("portal.error.selection.differentworlds"));
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return createPortal(player, tempData.getPos1(), tempData.getPos2(), tags);
|
return createPortal(player, tempData.getPos1(), tempData.getPos2(),
|
||||||
|
tags);
|
||||||
}
|
}
|
||||||
|
|
||||||
public AdvancedPortal createPortal(
|
public AdvancedPortal createPortal(PlayerContainer player,
|
||||||
PlayerContainer player, BlockLocation pos1, BlockLocation pos2, List<DataTag> tags) {
|
BlockLocation pos1, BlockLocation pos2,
|
||||||
|
List<DataTag> tags) {
|
||||||
// Find the tag with the "name" NAME
|
// Find the tag with the "name" NAME
|
||||||
DataTag nameTag =
|
DataTag nameTag = tags.stream()
|
||||||
tags.stream()
|
|
||||||
.filter(tag -> tag.NAME.equals(NameTag.TAG_NAME))
|
.filter(tag -> tag.NAME.equals(NameTag.TAG_NAME))
|
||||||
.findFirst()
|
.findFirst()
|
||||||
.orElse(null);
|
.orElse(null);
|
||||||
@ -154,26 +157,27 @@ public class PortalServices {
|
|||||||
String name = nameTag == null ? null : nameTag.VALUES[0];
|
String name = nameTag == null ? null : nameTag.VALUES[0];
|
||||||
if (nameTag == null || name == null || name.isEmpty()) {
|
if (nameTag == null || name == null || name.isEmpty()) {
|
||||||
if (player != null)
|
if (player != null)
|
||||||
player.sendMessage(
|
player.sendMessage(Lang.translate("messageprefix.negative")
|
||||||
Lang.translate("messageprefix.negative")
|
|
||||||
+ Lang.translate("command.error.noname"));
|
+ Lang.translate("command.error.noname"));
|
||||||
return null;
|
return null;
|
||||||
} else if (this.portalRepository.containsKey(name)) {
|
} else if (this.portalRepository.containsKey(name)) {
|
||||||
if (player != null)
|
if (player != null)
|
||||||
player.sendMessage(
|
player.sendMessage(Lang.translate("messageprefix.negative")
|
||||||
Lang.translate("messageprefix.negative")
|
+ Lang.translateInsertVariables(
|
||||||
+ Lang.translateInsertVariables("command.error.nametaken", name));
|
"command.error.nametaken", name));
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
AdvancedPortal portal = new AdvancedPortal(pos1, pos2, tagRegistry, playerDataServices);
|
AdvancedPortal portal =
|
||||||
|
new AdvancedPortal(pos1, pos2, tagRegistry, playerDataServices);
|
||||||
|
|
||||||
for (DataTag portalTag : tags) {
|
for (DataTag portalTag : tags) {
|
||||||
portal.setArgValues(portalTag);
|
portal.setArgValues(portalTag);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (DataTag portalTag : tags) {
|
for (DataTag portalTag : tags) {
|
||||||
Tag.Creation creation = tagRegistry.getCreationHandler(portalTag.NAME);
|
Tag.Creation creation =
|
||||||
|
tagRegistry.getCreationHandler(portalTag.NAME);
|
||||||
if (creation != null) {
|
if (creation != null) {
|
||||||
if (!creation.created(portal, player, portalTag.VALUES)) {
|
if (!creation.created(portal, player, portalTag.VALUES)) {
|
||||||
return null;
|
return null;
|
||||||
@ -190,8 +194,7 @@ public class PortalServices {
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
if (player != null)
|
if (player != null)
|
||||||
player.sendMessage(
|
player.sendMessage(Lang.translate("messageprefix.negative")
|
||||||
Lang.translate("messageprefix.negative")
|
|
||||||
+ Lang.translate("portal.error.save"));
|
+ Lang.translate("portal.error.save"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,26 +13,20 @@ import com.sekwah.advancedportals.core.util.Lang;
|
|||||||
import com.sekwah.advancedportals.core.util.PlayerUtils;
|
import com.sekwah.advancedportals.core.util.PlayerUtils;
|
||||||
import com.sekwah.advancedportals.core.warphandler.ActivationData;
|
import com.sekwah.advancedportals.core.warphandler.ActivationData;
|
||||||
import com.sekwah.advancedportals.core.warphandler.Tag;
|
import com.sekwah.advancedportals.core.warphandler.Tag;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
public class CooldownTag implements Tag.Activation, Tag.Creation {
|
public class CooldownTag implements Tag.Activation, Tag.Creation {
|
||||||
|
@Inject transient PlayerDataServices playerDataServices;
|
||||||
|
|
||||||
@Inject
|
@Inject transient ConfigRepository configRepository;
|
||||||
transient PlayerDataServices playerDataServices;
|
|
||||||
|
|
||||||
@Inject
|
@Inject private InfoLogger infoLogger;
|
||||||
transient ConfigRepository configRepository;
|
|
||||||
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
private InfoLogger infoLogger;
|
|
||||||
|
|
||||||
public static String TAG_NAME = "cooldown";
|
public static String TAG_NAME = "cooldown";
|
||||||
|
|
||||||
private final TagType[] tagTypes = new TagType[]{ TagType.PORTAL };
|
private final TagType[] tagTypes = new TagType[] {TagType.PORTAL};
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TagType[] getTagTypes() {
|
public TagType[] getTagTypes() {
|
||||||
@ -56,16 +50,22 @@ public class CooldownTag implements Tag.Activation, Tag.Creation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean preActivated(TagTarget target, PlayerContainer player, ActivationData activationData, String[] argData) {
|
public boolean preActivated(TagTarget target, PlayerContainer player,
|
||||||
|
ActivationData activationData,
|
||||||
|
String[] argData) {
|
||||||
var playerData = playerDataServices.getPlayerData(player);
|
var playerData = playerDataServices.getPlayerData(player);
|
||||||
if(target instanceof AdvancedPortal portal) {
|
if (target instanceof AdvancedPortal portal) {
|
||||||
var portalName = portal.getName();
|
var portalName = portal.getName();
|
||||||
if(playerData.hasPortalCooldown(portalName)) {
|
if (playerData.hasPortalCooldown(portalName)) {
|
||||||
var cooldown = (int) Math.ceil(playerData.getPortalCooldownLeft(portalName) / 1000D);
|
var cooldown = (int) Math.ceil(
|
||||||
player.sendMessage(Lang.translateInsertVariables("portal.cooldown.individual", cooldown,
|
playerData.getPortalCooldownLeft(portalName) / 1000D);
|
||||||
Lang.translate(cooldown == 1 ? "time.second" : "time.seconds")));
|
player.sendMessage(Lang.translateInsertVariables(
|
||||||
if(configRepository.playFailSound()) {
|
"portal.cooldown.individual", cooldown,
|
||||||
player.playSound("block.portal.travel", 0.05f, new Random().nextFloat() * 0.4F + 0.8F);
|
Lang.translate(cooldown == 1 ? "time.second"
|
||||||
|
: "time.seconds")));
|
||||||
|
if (configRepository.playFailSound()) {
|
||||||
|
player.playSound("block.portal.travel", 0.05f,
|
||||||
|
new Random().nextFloat() * 0.4F + 0.8F);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -75,37 +75,44 @@ public class CooldownTag implements Tag.Activation, Tag.Creation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void postActivated(TagTarget target, PlayerContainer player, ActivationData activationData, String[] argData) {
|
public void postActivated(TagTarget target, PlayerContainer player,
|
||||||
if(activationData.hasActivated()) {
|
ActivationData activationData, String[] argData) {
|
||||||
if(target instanceof AdvancedPortal portal) {
|
if (activationData.hasActivated()) {
|
||||||
|
if (target instanceof AdvancedPortal portal) {
|
||||||
var playerData = playerDataServices.getPlayerData(player);
|
var playerData = playerDataServices.getPlayerData(player);
|
||||||
try {
|
try {
|
||||||
playerData.setPortalCooldown(portal.getName(), Integer.parseInt(argData[0]) * 1000);
|
playerData.setPortalCooldown(
|
||||||
|
portal.getName(), Integer.parseInt(argData[0]) * 1000);
|
||||||
} catch (NumberFormatException e) {
|
} catch (NumberFormatException e) {
|
||||||
infoLogger.warning("Cooldown tag failed to set cooldown for portal: " + portal.getName() + " with value: " + argData[0]);
|
infoLogger.warning(
|
||||||
|
"Cooldown tag failed to set cooldown for portal: "
|
||||||
|
+ portal.getName() + " with value: " + argData[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean activated(TagTarget target, PlayerContainer player, ActivationData activationData, String[] argData) {
|
public boolean activated(TagTarget target, PlayerContainer player,
|
||||||
|
ActivationData activationData, String[] argData) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean created(TagTarget target, PlayerContainer player, String[] argData) {
|
public boolean created(TagTarget target, PlayerContainer player,
|
||||||
|
String[] argData) {
|
||||||
try {
|
try {
|
||||||
Integer.parseInt(argData[0]);
|
Integer.parseInt(argData[0]);
|
||||||
} catch (NumberFormatException e) {
|
} catch (NumberFormatException e) {
|
||||||
player.sendMessage(Lang.translate("messageprefix.negative") + Lang.translate("tag.cooldown.fail"));
|
player.sendMessage(Lang.translate("messageprefix.negative")
|
||||||
|
+ Lang.translate("tag.cooldown.fail"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void destroyed(TagTarget target, PlayerContainer player, String[] argData) {
|
public void destroyed(TagTarget target, PlayerContainer player,
|
||||||
|
String[] argData) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,13 +10,10 @@ import com.sekwah.advancedportals.core.services.DestinationServices;
|
|||||||
import com.sekwah.advancedportals.core.util.Lang;
|
import com.sekwah.advancedportals.core.util.Lang;
|
||||||
import com.sekwah.advancedportals.core.warphandler.ActivationData;
|
import com.sekwah.advancedportals.core.warphandler.ActivationData;
|
||||||
import com.sekwah.advancedportals.core.warphandler.Tag;
|
import com.sekwah.advancedportals.core.warphandler.Tag;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
public class DestiTag implements Tag.Activation, Tag.AutoComplete, Tag.Split {
|
public class DestiTag implements Tag.Activation, Tag.AutoComplete, Tag.Split {
|
||||||
|
|
||||||
public static String TAG_NAME = "destination";
|
public static String TAG_NAME = "destination";
|
||||||
@Inject DestinationServices destinationServices;
|
@Inject DestinationServices destinationServices;
|
||||||
|
|
||||||
@ -45,8 +42,8 @@ public class DestiTag implements Tag.Activation, Tag.AutoComplete, Tag.Split {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean preActivated(
|
public boolean preActivated(TagTarget target, PlayerContainer player,
|
||||||
TagTarget target, PlayerContainer player, ActivationData activeData, String[] argData) {
|
ActivationData activeData, String[] argData) {
|
||||||
// Check that the destination exists.
|
// Check that the destination exists.
|
||||||
for (String destiName : destinationServices.getDestinationNames()) {
|
for (String destiName : destinationServices.getDestinationNames()) {
|
||||||
if (destiName.equalsIgnoreCase(argData[0])) {
|
if (destiName.equalsIgnoreCase(argData[0])) {
|
||||||
@ -57,19 +54,15 @@ public class DestiTag implements Tag.Activation, Tag.AutoComplete, Tag.Split {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void postActivated(
|
public void postActivated(TagTarget target, PlayerContainer player,
|
||||||
TagTarget target,
|
ActivationData activationData, String[] argData) {
|
||||||
PlayerContainer player,
|
}
|
||||||
ActivationData activationData,
|
|
||||||
String[] argData) {}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean activated(
|
public boolean activated(TagTarget target, PlayerContainer player,
|
||||||
TagTarget target,
|
ActivationData activationData, String[] argData) {
|
||||||
PlayerContainer player,
|
Destination destination =
|
||||||
ActivationData activationData,
|
destinationServices.getDestination(argData[0]);
|
||||||
String[] argData) {
|
|
||||||
Destination destination = destinationServices.getDestination(argData[0]);
|
|
||||||
if (destination != null) {
|
if (destination != null) {
|
||||||
var warpEffectVisual = warpEffectRegistry.getVisualEffect("ender");
|
var warpEffectVisual = warpEffectRegistry.getVisualEffect("ender");
|
||||||
if (warpEffectVisual != null) {
|
if (warpEffectVisual != null) {
|
||||||
|
@ -4,24 +4,23 @@ import com.sekwah.advancedportals.core.connector.containers.PlayerContainer;
|
|||||||
import com.sekwah.advancedportals.core.registry.TagTarget;
|
import com.sekwah.advancedportals.core.registry.TagTarget;
|
||||||
import com.sekwah.advancedportals.core.util.Lang;
|
import com.sekwah.advancedportals.core.util.Lang;
|
||||||
import com.sekwah.advancedportals.core.warphandler.Tag;
|
import com.sekwah.advancedportals.core.warphandler.Tag;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The name of the destination or portal.
|
* The name of the destination or portal.
|
||||||
*
|
*
|
||||||
* <p>Most of the implementation of this tag is external, this is just to allow for the tag to be
|
* <p>Most of the implementation of this tag is external, this is just to allow
|
||||||
* used.
|
* for the tag to be used.
|
||||||
*
|
*
|
||||||
* <p>Most tags shouldn't be like this unless they are to be paired with another tag.
|
* <p>Most tags shouldn't be like this unless they are to be paired with
|
||||||
|
* another tag.
|
||||||
*/
|
*/
|
||||||
public class NameTag implements Tag.AutoComplete, Tag.Creation {
|
public class NameTag implements Tag.AutoComplete, Tag.Creation {
|
||||||
|
|
||||||
public static String TAG_NAME = "name";
|
public static String TAG_NAME = "name";
|
||||||
|
|
||||||
private final TagType[] tagTypes = new TagType[] {TagType.PORTAL, TagType.DESTINATION};
|
private final TagType[] tagTypes =
|
||||||
|
new TagType[] {TagType.PORTAL, TagType.DESTINATION};
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TagType[] getTagTypes() {
|
public TagType[] getTagTypes() {
|
||||||
@ -55,12 +54,12 @@ public class NameTag implements Tag.AutoComplete, Tag.Creation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean created(TagTarget target, PlayerContainer player, String[] argData) {
|
public boolean created(TagTarget target, PlayerContainer player,
|
||||||
|
String[] argData) {
|
||||||
if (argData.length > 0) {
|
if (argData.length > 0) {
|
||||||
String name = argData[0];
|
String name = argData[0];
|
||||||
if (name.contains(" ")) {
|
if (name.contains(" ")) {
|
||||||
player.sendMessage(
|
player.sendMessage(Lang.translate("messageprefix.negative")
|
||||||
Lang.translate("messageprefix.negative")
|
|
||||||
+ Lang.translate("tag.name.error.nospaces"));
|
+ Lang.translate("tag.name.error.nospaces"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -69,5 +68,7 @@ public class NameTag implements Tag.AutoComplete, Tag.Creation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void destroyed(TagTarget target, PlayerContainer player, String[] argData) {}
|
public void destroyed(TagTarget target, PlayerContainer player,
|
||||||
|
String[] argData) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,12 +8,10 @@ import com.sekwah.advancedportals.core.util.InfoLogger;
|
|||||||
import com.sekwah.advancedportals.core.util.Lang;
|
import com.sekwah.advancedportals.core.util.Lang;
|
||||||
import com.sekwah.advancedportals.core.warphandler.ActivationData;
|
import com.sekwah.advancedportals.core.warphandler.ActivationData;
|
||||||
import com.sekwah.advancedportals.core.warphandler.Tag;
|
import com.sekwah.advancedportals.core.warphandler.Tag;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
public class PermissionTag implements Tag.Activation {
|
public class PermissionTag implements Tag.Activation {
|
||||||
|
|
||||||
@Inject transient PlayerDataServices playerDataServices;
|
@Inject transient PlayerDataServices playerDataServices;
|
||||||
|
|
||||||
@Inject transient ConfigRepository configRepository;
|
@Inject transient ConfigRepository configRepository;
|
||||||
@ -48,8 +46,8 @@ public class PermissionTag implements Tag.Activation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean preActivated(
|
public boolean preActivated(TagTarget target, PlayerContainer player,
|
||||||
TagTarget target, PlayerContainer player, ActivationData activeData, String[] argData) {
|
ActivationData activeData, String[] argData) {
|
||||||
if (!player.hasPermission(argData[1])) {
|
if (!player.hasPermission(argData[1])) {
|
||||||
player.sendMessage(Lang.translate("portal.error.nopermission"));
|
player.sendMessage(Lang.translate("portal.error.nopermission"));
|
||||||
return false;
|
return false;
|
||||||
@ -58,18 +56,13 @@ public class PermissionTag implements Tag.Activation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void postActivated(
|
public void postActivated(TagTarget target, PlayerContainer player,
|
||||||
TagTarget target,
|
ActivationData activationData, String[] argData) {
|
||||||
PlayerContainer player,
|
}
|
||||||
ActivationData activationData,
|
|
||||||
String[] argData) {}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean activated(
|
public boolean activated(TagTarget target, PlayerContainer player,
|
||||||
TagTarget target,
|
ActivationData activationData, String[] argData) {
|
||||||
PlayerContainer player,
|
|
||||||
ActivationData activationData,
|
|
||||||
String[] argData) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,13 +4,10 @@ import com.google.inject.Inject;
|
|||||||
import com.sekwah.advancedportals.core.connector.containers.ServerContainer;
|
import com.sekwah.advancedportals.core.connector.containers.ServerContainer;
|
||||||
import com.sekwah.advancedportals.core.util.Lang;
|
import com.sekwah.advancedportals.core.util.Lang;
|
||||||
import com.sekwah.advancedportals.core.warphandler.Tag;
|
import com.sekwah.advancedportals.core.warphandler.Tag;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
public class TriggerBlockTag implements Tag.AutoComplete, Tag.Split {
|
public class TriggerBlockTag implements Tag.AutoComplete, Tag.Split {
|
||||||
|
|
||||||
@Inject private ServerContainer serverContainer;
|
@Inject private ServerContainer serverContainer;
|
||||||
|
|
||||||
public static String TAG_NAME = "triggerblock";
|
public static String TAG_NAME = "triggerblock";
|
||||||
|
@ -2,31 +2,30 @@ package com.sekwah.advancedportals.core.util;
|
|||||||
|
|
||||||
import com.sekwah.advancedportals.core.connector.containers.PlayerContainer;
|
import com.sekwah.advancedportals.core.connector.containers.PlayerContainer;
|
||||||
import com.sekwah.advancedportals.core.serializeddata.BlockLocation;
|
import com.sekwah.advancedportals.core.serializeddata.BlockLocation;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
|
|
||||||
public class Debug {
|
public class Debug {
|
||||||
public static boolean addMarker(
|
public static boolean addMarker(PlayerContainer player,
|
||||||
PlayerContainer player,
|
BlockLocation blockPos, String name,
|
||||||
BlockLocation blockPos,
|
Color color, int milliseconds) {
|
||||||
String name,
|
|
||||||
Color color,
|
|
||||||
int milliseconds) {
|
|
||||||
FriendlyDataOutput out = new FriendlyDataOutput();
|
FriendlyDataOutput out = new FriendlyDataOutput();
|
||||||
out.writeBlock(blockPos);
|
out.writeBlock(blockPos);
|
||||||
out.writeInt(color(color));
|
out.writeInt(color(color));
|
||||||
out.writeUtf(name);
|
out.writeUtf(name);
|
||||||
out.writeInt(milliseconds);
|
out.writeInt(milliseconds);
|
||||||
return player.sendPacket("minecraft:debug/game_test_add_marker", out.toByteArray());
|
return player.sendPacket("minecraft:debug/game_test_add_marker",
|
||||||
|
out.toByteArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean clear(PlayerContainer player) {
|
public static boolean clear(PlayerContainer player) {
|
||||||
FriendlyDataOutput out = new FriendlyDataOutput();
|
FriendlyDataOutput out = new FriendlyDataOutput();
|
||||||
return player.sendPacket("minecraft:debug/game_test_clear", out.toByteArray());
|
return player.sendPacket("minecraft:debug/game_test_clear",
|
||||||
|
out.toByteArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int color(Color color) {
|
public static int color(Color color) {
|
||||||
return color(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha());
|
return color(color.getRed(), color.getGreen(), color.getBlue(),
|
||||||
|
color.getAlpha());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int color(int r, int g, int b) {
|
public static int color(int r, int g, int b) {
|
||||||
|
@ -1,16 +1,15 @@
|
|||||||
package com.sekwah.advancedportals.core.util;
|
package com.sekwah.advancedportals.core.util;
|
||||||
|
|
||||||
import com.sekwah.advancedportals.core.serializeddata.BlockLocation;
|
import com.sekwah.advancedportals.core.serializeddata.BlockLocation;
|
||||||
|
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import io.netty.buffer.Unpooled;
|
import io.netty.buffer.Unpooled;
|
||||||
import io.netty.handler.codec.EncoderException;
|
import io.netty.handler.codec.EncoderException;
|
||||||
|
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
/** Meant to be similar to FriendlyByteBuf if you have used that before. */
|
/**
|
||||||
|
* Meant to be similar to FriendlyByteBuf if you have used that before.
|
||||||
|
*/
|
||||||
public class FriendlyDataOutput {
|
public class FriendlyDataOutput {
|
||||||
|
|
||||||
private final ByteBuf dataOutput;
|
private final ByteBuf dataOutput;
|
||||||
|
|
||||||
public FriendlyDataOutput() {
|
public FriendlyDataOutput() {
|
||||||
@ -51,14 +50,16 @@ public class FriendlyDataOutput {
|
|||||||
|
|
||||||
public void writeUtf(String text, int maxLength) {
|
public void writeUtf(String text, int maxLength) {
|
||||||
if (text.length() > maxLength) {
|
if (text.length() > maxLength) {
|
||||||
throw new EncoderException(
|
throw new EncoderException("String too big (was " + text.length()
|
||||||
"String too big (was " + text.length() + " characters, max " + maxLength + ")");
|
+ " characters, max " + maxLength
|
||||||
|
+ ")");
|
||||||
} else {
|
} else {
|
||||||
byte[] abyte = text.getBytes(StandardCharsets.UTF_8);
|
byte[] abyte = text.getBytes(StandardCharsets.UTF_8);
|
||||||
int i = getMaxEncodedUtfLength(maxLength);
|
int i = getMaxEncodedUtfLength(maxLength);
|
||||||
if (abyte.length > i) {
|
if (abyte.length > i) {
|
||||||
throw new EncoderException(
|
throw new EncoderException("String too big (was " + abyte.length
|
||||||
"String too big (was " + abyte.length + " bytes encoded, max " + i + ")");
|
+ " bytes encoded, max " + i
|
||||||
|
+ ")");
|
||||||
} else {
|
} else {
|
||||||
this.writeVarInt(abyte.length);
|
this.writeVarInt(abyte.length);
|
||||||
this.writeBytes(abyte);
|
this.writeBytes(abyte);
|
||||||
@ -99,10 +100,11 @@ public class FriendlyDataOutput {
|
|||||||
|
|
||||||
// Only for block serialising and such
|
// Only for block serialising and such
|
||||||
private static final int PACKED_X_LENGTH =
|
private static final int PACKED_X_LENGTH =
|
||||||
26; // 1 + Mth.log2(Mth.smallestEncompassingPowerOfTwo(30000000)) (im not gonna add all
|
26; // 1 + Mth.log2(Mth.smallestEncompassingPowerOfTwo(30000000)) (im
|
||||||
// the mojang math stuff to calculate this.
|
// not gonna add all the mojang math stuff to calculate this.
|
||||||
private static final int PACKED_Z_LENGTH = PACKED_X_LENGTH;
|
private static final int PACKED_Z_LENGTH = PACKED_X_LENGTH;
|
||||||
public static final int PACKED_Y_LENGTH = 64 - PACKED_X_LENGTH - PACKED_Z_LENGTH;
|
public static final int PACKED_Y_LENGTH =
|
||||||
|
64 - PACKED_X_LENGTH - PACKED_Z_LENGTH;
|
||||||
private static final long PACKED_X_MASK = (1L << PACKED_X_LENGTH) - 1L;
|
private static final long PACKED_X_MASK = (1L << PACKED_X_LENGTH) - 1L;
|
||||||
private static final long PACKED_Y_MASK = (1L << PACKED_Y_LENGTH) - 1L;
|
private static final long PACKED_Y_MASK = (1L << PACKED_Y_LENGTH) - 1L;
|
||||||
private static final long PACKED_Z_MASK = (1L << PACKED_Z_LENGTH) - 1L;
|
private static final long PACKED_Z_MASK = (1L << PACKED_Z_LENGTH) - 1L;
|
||||||
@ -114,7 +116,6 @@ public class FriendlyDataOutput {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private long blockAsLong(BlockLocation blockLoc) {
|
private long blockAsLong(BlockLocation blockLoc) {
|
||||||
|
|
||||||
long i = 0L;
|
long i = 0L;
|
||||||
i |= ((long) blockLoc.getPosX() & PACKED_X_MASK) << X_OFFSET;
|
i |= ((long) blockLoc.getPosX() & PACKED_X_MASK) << X_OFFSET;
|
||||||
i |= ((long) blockLoc.getPosY() & PACKED_Y_MASK) << 0;
|
i |= ((long) blockLoc.getPosY() & PACKED_Y_MASK) << 0;
|
||||||
|
@ -2,36 +2,44 @@ package com.sekwah.advancedportals.core.util;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
/** For all delayed and repeating tasks. */
|
/**
|
||||||
|
* For all delayed and repeating tasks.
|
||||||
|
*/
|
||||||
@Singleton
|
@Singleton
|
||||||
public final class GameScheduler {
|
public final class GameScheduler {
|
||||||
|
private final ArrayList<DelayedGameTickEvent> newTickEvents =
|
||||||
private final ArrayList<DelayedGameTickEvent> newTickEvents = new ArrayList<>();
|
new ArrayList<>();
|
||||||
private final ArrayList<DelayedGameTickEvent> delayedTickEvents = new ArrayList<>();
|
private final ArrayList<DelayedGameTickEvent> delayedTickEvents =
|
||||||
|
new ArrayList<>();
|
||||||
|
|
||||||
public void tick() {
|
public void tick() {
|
||||||
this.delayedTickEvents.addAll(this.newTickEvents);
|
this.delayedTickEvents.addAll(this.newTickEvents);
|
||||||
this.newTickEvents.clear();
|
this.newTickEvents.clear();
|
||||||
Iterator<DelayedGameTickEvent> tickEventIterator = this.delayedTickEvents.iterator();
|
Iterator<DelayedGameTickEvent> tickEventIterator =
|
||||||
|
this.delayedTickEvents.iterator();
|
||||||
while (tickEventIterator.hasNext()) {
|
while (tickEventIterator.hasNext()) {
|
||||||
DelayedGameTickEvent event = tickEventIterator.next();
|
DelayedGameTickEvent event = tickEventIterator.next();
|
||||||
event.tick();
|
event.tick();
|
||||||
if (event.shouldRun()) {
|
if (event.shouldRun()) {
|
||||||
event.run();
|
event.run();
|
||||||
if (!(event instanceof DelayedGameIntervalEvent)) tickEventIterator.remove();
|
if (!(event instanceof DelayedGameIntervalEvent))
|
||||||
|
tickEventIterator.remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void delayedTickEvent(String name, Runnable consumer, int tickDelay) {
|
public void delayedTickEvent(String name, Runnable consumer,
|
||||||
this.newTickEvents.add(new DelayedGameTickEvent(name, consumer, tickDelay));
|
int tickDelay) {
|
||||||
|
this.newTickEvents.add(
|
||||||
|
new DelayedGameTickEvent(name, consumer, tickDelay));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void intervalTickEvent(String name, Runnable consumer, int tickDelay, int interval) {
|
public void intervalTickEvent(String name, Runnable consumer, int tickDelay,
|
||||||
this.newTickEvents.add(new DelayedGameIntervalEvent(name, consumer, tickDelay, interval));
|
int interval) {
|
||||||
|
this.newTickEvents.add(
|
||||||
|
new DelayedGameIntervalEvent(name, consumer, tickDelay, interval));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void clearAllEvents() {
|
public void clearAllEvents() {
|
||||||
@ -40,7 +48,6 @@ public final class GameScheduler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static class DelayedGameTickEvent {
|
public static class DelayedGameTickEvent {
|
||||||
|
|
||||||
// So we can find it later and remove it if needed
|
// So we can find it later and remove it if needed
|
||||||
public final String name;
|
public final String name;
|
||||||
public final Runnable consumer;
|
public final Runnable consumer;
|
||||||
@ -66,10 +73,10 @@ public final class GameScheduler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static class DelayedGameIntervalEvent extends DelayedGameTickEvent {
|
public static class DelayedGameIntervalEvent extends DelayedGameTickEvent {
|
||||||
|
|
||||||
public int interval;
|
public int interval;
|
||||||
|
|
||||||
public DelayedGameIntervalEvent(String name, Runnable consumer, int ticks, int interval) {
|
public DelayedGameIntervalEvent(String name, Runnable consumer,
|
||||||
|
int ticks, int interval) {
|
||||||
super(name, consumer, ticks);
|
super(name, consumer, ticks);
|
||||||
this.interval = interval;
|
this.interval = interval;
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package com.sekwah.advancedportals.core.util;
|
package com.sekwah.advancedportals.core.util;
|
||||||
|
|
||||||
public abstract class InfoLogger {
|
public abstract class InfoLogger {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Problematic messages
|
* Problematic messages
|
||||||
*
|
*
|
||||||
|
@ -2,7 +2,6 @@ package com.sekwah.advancedportals.core.util;
|
|||||||
|
|
||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
import com.sekwah.advancedportals.core.serializeddata.DataStorage;
|
import com.sekwah.advancedportals.core.serializeddata.DataStorage;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
@ -13,13 +12,12 @@ import java.util.Scanner;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @author sekwah41
|
* @author sekwah41
|
||||||
* <p>The language translation file for the game. Will always load english first so that if the
|
* <p>The language translation file for the game. Will always load english
|
||||||
* translations are missing any then they are still readable and can then be translated. (It's
|
* first so that if the translations are missing any then they are still
|
||||||
* better than a raw translate string)
|
* readable and can then be translated. (It's better than a raw translate
|
||||||
* <p>
|
* string) <p>
|
||||||
*/
|
*/
|
||||||
public class Lang {
|
public class Lang {
|
||||||
|
|
||||||
public static final Lang instance = new Lang();
|
public static final Lang instance = new Lang();
|
||||||
private final HashMap<String, String> languageMap = new HashMap<>();
|
private final HashMap<String, String> languageMap = new HashMap<>();
|
||||||
|
|
||||||
@ -39,8 +37,10 @@ public class Lang {
|
|||||||
public static String translate(String s) {
|
public static String translate(String s) {
|
||||||
if (instance.languageMap.containsKey(s)) {
|
if (instance.languageMap.containsKey(s)) {
|
||||||
String translation = instance.languageMap.get(s);
|
String translation = instance.languageMap.get(s);
|
||||||
// noinspection ALL (not sure what the specific warning is for escaped unicode)
|
// noinspection ALL (not sure what the specific warning is for
|
||||||
translation = translation.replaceAll("&([0-9a-frk-ox])", "\u00A7$1");
|
// escaped unicode)
|
||||||
|
translation =
|
||||||
|
translation.replaceAll("&([0-9a-frk-ox])", "\u00A7$1");
|
||||||
return translation;
|
return translation;
|
||||||
} else {
|
} else {
|
||||||
return s;
|
return s;
|
||||||
@ -50,13 +50,15 @@ public class Lang {
|
|||||||
public static String translateInsertVariables(String s, Object... args) {
|
public static String translateInsertVariables(String s, Object... args) {
|
||||||
String translation = translate(s);
|
String translation = translate(s);
|
||||||
for (int i = 1; i <= args.length; i++) {
|
for (int i = 1; i <= args.length; i++) {
|
||||||
translation = translation.replaceAll("%" + i + "\\$s", args[i - 1].toString());
|
translation = translation.replaceAll("%" + i + "\\$s",
|
||||||
|
args[i - 1].toString());
|
||||||
}
|
}
|
||||||
return translation;
|
return translation;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, String> getLanguageMap(String fileName) {
|
public Map<String, String> getLanguageMap(String fileName) {
|
||||||
InputStream stream = this.dataStorage.loadResource("lang/" + fileName + ".lang");
|
InputStream stream =
|
||||||
|
this.dataStorage.loadResource("lang/" + fileName + ".lang");
|
||||||
if (stream != null) {
|
if (stream != null) {
|
||||||
return Lang.parseLang(stream);
|
return Lang.parseLang(stream);
|
||||||
}
|
}
|
||||||
@ -65,7 +67,8 @@ public class Lang {
|
|||||||
|
|
||||||
public Map<String, String> getInternalLanguageMap(String fileName) {
|
public Map<String, String> getInternalLanguageMap(String fileName) {
|
||||||
InputStream stream =
|
InputStream stream =
|
||||||
this.getClass().getClassLoader().getResourceAsStream("lang/" + fileName + ".lang");
|
this.getClass().getClassLoader().getResourceAsStream(
|
||||||
|
"lang/" + fileName + ".lang");
|
||||||
if (stream != null) {
|
if (stream != null) {
|
||||||
return Lang.parseLang(stream);
|
return Lang.parseLang(stream);
|
||||||
}
|
}
|
||||||
@ -92,8 +95,8 @@ public class Lang {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The default font is not monospaced, so this will likely be a little thinner to be on the safe
|
* The default font is not monospaced, so this will likely be a little
|
||||||
* side
|
* thinner to be on the safe side
|
||||||
*
|
*
|
||||||
* @param title
|
* @param title
|
||||||
* @return
|
* @return
|
||||||
@ -103,29 +106,28 @@ public class Lang {
|
|||||||
|
|
||||||
int eachSide = titleLength / 2;
|
int eachSide = titleLength / 2;
|
||||||
|
|
||||||
return "\u00A7e" + "=".repeat(eachSide) + " " + title + " \u00A7e" + "=".repeat(eachSide);
|
return "\u00A7e"
|
||||||
|
+ "=".repeat(eachSide) + " " + title + " \u00A7e"
|
||||||
|
+ "=".repeat(eachSide);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void injectTranslations(String fileName) {
|
private void injectTranslations(String fileName) {
|
||||||
try {
|
try {
|
||||||
URL url =
|
URL url = Lang.instance.getClass().getClassLoader().getResource(
|
||||||
Lang.instance
|
"lang/" + fileName + ".lang");
|
||||||
.getClass()
|
|
||||||
.getClassLoader()
|
|
||||||
.getResource("lang/" + fileName + ".lang");
|
|
||||||
if (url != null) {
|
if (url != null) {
|
||||||
Map<String, String> initialMap = Lang.parseLang(url.openStream());
|
Map<String, String> initialMap =
|
||||||
|
Lang.parseLang(url.openStream());
|
||||||
Lang.instance.languageMap.putAll(initialMap);
|
Lang.instance.languageMap.putAll(initialMap);
|
||||||
} else {
|
} else {
|
||||||
this.infoLogger.warning(
|
this.infoLogger.warning("Could not load " + fileName
|
||||||
"Could not load "
|
+ (".lang from within Advanced Portals "
|
||||||
+ fileName
|
+ "as it doesn't exist."));
|
||||||
+ ".lang from within Advanced Portals as it doesn't exist.");
|
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
this.infoLogger.warning(
|
this.infoLogger.warning("Could not load " + fileName
|
||||||
"Could not load " + fileName + ".lang from within Advanced Portals.");
|
+ ".lang from within Advanced Portals.");
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, String> newLangMap = this.getLanguageMap(fileName);
|
Map<String, String> newLangMap = this.getLanguageMap(fileName);
|
||||||
|
@ -3,9 +3,11 @@ package com.sekwah.advancedportals.core.util;
|
|||||||
import com.sekwah.advancedportals.core.connector.containers.PlayerContainer;
|
import com.sekwah.advancedportals.core.connector.containers.PlayerContainer;
|
||||||
|
|
||||||
public class PlayerUtils {
|
public class PlayerUtils {
|
||||||
|
public static void throwPlayerBack(PlayerContainer player,
|
||||||
public static void throwPlayerBack(PlayerContainer player, double strength) {
|
double strength) {
|
||||||
var playerLoc = player.getLoc().getDirection();
|
var playerLoc = player.getLoc().getDirection();
|
||||||
player.setVelocity(playerLoc.setY(0).normalize().multiply(-1).setY(0.5).multiply(strength));
|
player.setVelocity(
|
||||||
|
playerLoc.setY(0).normalize().multiply(-1).setY(0.5).multiply(
|
||||||
|
strength));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
package com.sekwah.advancedportals.core.util;
|
package com.sekwah.advancedportals.core.util;
|
||||||
|
|
||||||
import com.sekwah.advancedportals.core.serializeddata.DataTag;
|
import com.sekwah.advancedportals.core.serializeddata.DataTag;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
||||||
public class TagReader {
|
public class TagReader {
|
||||||
|
|
||||||
public static boolean isClosedString(String[] args) {
|
public static boolean isClosedString(String[] args) {
|
||||||
StringBuilder currentValue = new StringBuilder();
|
StringBuilder currentValue = new StringBuilder();
|
||||||
boolean inQuotes = false;
|
boolean inQuotes = false;
|
||||||
|
@ -8,7 +8,6 @@ import com.sekwah.advancedportals.core.serializeddata.PlayerLocation;
|
|||||||
* @author sekwah41
|
* @author sekwah41
|
||||||
*/
|
*/
|
||||||
public class ActivationData {
|
public class ActivationData {
|
||||||
|
|
||||||
private boolean warpAllowed = true;
|
private boolean warpAllowed = true;
|
||||||
|
|
||||||
public final boolean moveActivated;
|
public final boolean moveActivated;
|
||||||
@ -28,15 +27,16 @@ public class ActivationData {
|
|||||||
public void setWarpStatus(WarpedStatus warped) {
|
public void setWarpStatus(WarpedStatus warped) {
|
||||||
if (this.warpStatus == WarpedStatus.WARPED) {
|
if (this.warpStatus == WarpedStatus.WARPED) {
|
||||||
return;
|
return;
|
||||||
} else if (this.warpStatus == WarpedStatus.ACTIVATED && warped != WarpedStatus.WARPED) {
|
} else if (this.warpStatus == WarpedStatus.ACTIVATED
|
||||||
|
&& warped != WarpedStatus.WARPED) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.warpStatus = warped;
|
this.warpStatus = warped;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* In case you need to set the status back down a step for whatever reason. However it is not
|
* In case you need to set the status back down a step for whatever reason.
|
||||||
* recommended.
|
* However it is not recommended.
|
||||||
*
|
*
|
||||||
* @param warped
|
* @param warped
|
||||||
*/
|
*/
|
||||||
@ -57,11 +57,20 @@ public class ActivationData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public enum WarpedStatus {
|
public enum WarpedStatus {
|
||||||
/** Player has moved or something major has happened. (only one of these should activate) */
|
/**
|
||||||
|
* Player has moved or something major has happened. (only one of these
|
||||||
|
* should activate)
|
||||||
|
*/
|
||||||
WARPED,
|
WARPED,
|
||||||
/** Shows that the portal has been activated even if a major function is not performed. */
|
/**
|
||||||
|
* Shows that the portal has been activated even if a major function is
|
||||||
|
* not performed.
|
||||||
|
*/
|
||||||
ACTIVATED,
|
ACTIVATED,
|
||||||
/** Nothing has activated on the portal (may need to come up with a new name) */
|
/**
|
||||||
|
* Nothing has activated on the portal (may need to come up with a new
|
||||||
|
* name)
|
||||||
|
*/
|
||||||
NOTACTIVATED;
|
NOTACTIVATED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,34 +2,32 @@ package com.sekwah.advancedportals.core.warphandler;
|
|||||||
|
|
||||||
import com.sekwah.advancedportals.core.connector.containers.PlayerContainer;
|
import com.sekwah.advancedportals.core.connector.containers.PlayerContainer;
|
||||||
import com.sekwah.advancedportals.core.registry.TagTarget;
|
import com.sekwah.advancedportals.core.registry.TagTarget;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If a tag can be used for any of them then either make it cast the target or if it doesn't need a
|
* If a tag can be used for any of them then either make it cast the target or
|
||||||
* target then the exact same tag can be registered into both and ignore the portal info.
|
* if it doesn't need a target then the exact same tag can be registered into
|
||||||
|
* both and ignore the portal info.
|
||||||
*
|
*
|
||||||
* <p>Will probably make better documentation on how to do so or some tutorial videos though take a
|
* <p>Will probably make better documentation on how to do so or some tutorial
|
||||||
* look at the source code on GitHub for how the current tags are added.
|
* videos though take a look at the source code on GitHub for how the current
|
||||||
|
* tags are added.
|
||||||
*
|
*
|
||||||
* <p>Also, not sure if its good practice or not in java however these all extend TagHandler, so
|
* <p>Also, not sure if its good practice or not in java however these all
|
||||||
* they can be accepted in 1 method nicer than if they didn't
|
* extend TagHandler, so they can be accepted in 1 method nicer than if they
|
||||||
|
* didn't
|
||||||
*
|
*
|
||||||
* @author sekwah41
|
* @author sekwah41
|
||||||
*/
|
*/
|
||||||
public interface Tag {
|
public interface Tag {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* By default, all tags should be able to use either.
|
* By default, all tags should be able to use either.
|
||||||
*
|
*
|
||||||
* <p>Though you may have use cases where you want to limit it to one or the other.
|
* <p>Though you may have use cases where you want to limit it to one or the
|
||||||
|
* other.
|
||||||
*/
|
*/
|
||||||
enum TagType {
|
enum TagType { PORTAL, DESTINATION }
|
||||||
PORTAL,
|
|
||||||
DESTINATION
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used to flag where the auto complete should show more or less info.
|
* Used to flag where the auto complete should show more or less info.
|
||||||
@ -40,41 +38,37 @@ public interface Tag {
|
|||||||
|
|
||||||
String getName();
|
String getName();
|
||||||
|
|
||||||
@Nullable
|
@Nullable String[] getAliases();
|
||||||
String[] getAliases();
|
|
||||||
|
|
||||||
String description();
|
String description();
|
||||||
|
|
||||||
interface AutoComplete extends Tag {
|
interface AutoComplete extends Tag {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is used to get the auto complete for the tag. This is called when the player is
|
* This is used to get the auto complete for the tag. This is called
|
||||||
* typing the tag.
|
* when the player is typing the tag.
|
||||||
*
|
*
|
||||||
* @param argData
|
* @param argData
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable List<String> autoComplete(String argData);
|
||||||
List<String> autoComplete(String argData);
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable String splitString();
|
||||||
String splitString();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Split extends Tag {
|
interface Split extends Tag {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is used to split the tag into the arguments if multiple are supported
|
* This is used to split the tag into the arguments if multiple are
|
||||||
|
* supported
|
||||||
*
|
*
|
||||||
* @return null if the tag does not support splitting
|
* @return null if the tag does not support splitting
|
||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable String splitString();
|
||||||
String splitString();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** The events for portal creation and destroying */
|
/**
|
||||||
|
* The events for portal creation and destroying
|
||||||
|
*/
|
||||||
interface Creation extends Tag {
|
interface Creation extends Tag {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Example if the player does not have access to use the tag.
|
* Example if the player does not have access to use the tag.
|
||||||
*
|
*
|
||||||
@ -82,45 +76,46 @@ public interface Tag {
|
|||||||
* @param argData
|
* @param argData
|
||||||
* @return If the tag is valid or allowed creation
|
* @return If the tag is valid or allowed creation
|
||||||
*/
|
*/
|
||||||
boolean created(TagTarget target, PlayerContainer player, String[] argData);
|
boolean created(TagTarget target, PlayerContainer player,
|
||||||
|
String[] argData);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Example if the player does not have access to remove the portal or destination.
|
* Example if the player does not have access to remove the portal or
|
||||||
|
* destination.
|
||||||
*
|
*
|
||||||
* @param player if null then removed by the server or a plugin
|
* @param player if null then removed by the server or a plugin
|
||||||
* @param argData
|
* @param argData
|
||||||
*/
|
*/
|
||||||
void destroyed(TagTarget target, PlayerContainer player, String[] argData);
|
void destroyed(TagTarget target, PlayerContainer player,
|
||||||
|
String[] argData);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Order of activation Portal and Desti: preActivated activated postActivated
|
* Order of activation Portal and Desti: preActivated activated
|
||||||
|
* postActivated
|
||||||
*
|
*
|
||||||
* <p>Order of them combined: Portal.preActivated Portal.activated - when desti tag is hit (if
|
* <p>Order of them combined: Portal.preActivated Portal.activated - when
|
||||||
* listed) then next two actions are activated - Desti.preActivate - Desti.activate
|
* desti tag is hit (if listed) then next two actions are activated -
|
||||||
* Portal.postActivate - when desti tag is hit (if listed) then the next action is activated -
|
* Desti.preActivate - Desti.activate Portal.postActivate - when desti tag
|
||||||
* Desti.postActivate
|
* is hit (if listed) then the next action is activated - Desti.postActivate
|
||||||
*/
|
*/
|
||||||
interface Activation extends Tag {
|
interface Activation extends Tag {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Activates before the main part of activation. This should be for prechecks e.g. if the
|
* Activates before the main part of activation. This should be for
|
||||||
* player has enough money before then taking the money in postActivated.
|
* prechecks e.g. if the player has enough money before then taking the
|
||||||
|
* money in postActivated.
|
||||||
*
|
*
|
||||||
* @param player
|
* @param player
|
||||||
* @param activeData
|
* @param activeData
|
||||||
* @param argData
|
* @param argData
|
||||||
* @return If the tag has allowed the warp
|
* @return If the tag has allowed the warp
|
||||||
*/
|
*/
|
||||||
boolean preActivated(
|
boolean preActivated(TagTarget target, PlayerContainer player,
|
||||||
TagTarget target,
|
ActivationData activeData, String[] argData);
|
||||||
PlayerContainer player,
|
|
||||||
ActivationData activeData,
|
|
||||||
String[] argData);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Activates after activation, should be used for actions such as removing money for a
|
* Activates after activation, should be used for actions such as
|
||||||
* teleport.
|
* removing money for a teleport.
|
||||||
*
|
*
|
||||||
* <p>Any actions to do with player location should be done in activate
|
* <p>Any actions to do with player location should be done in activate
|
||||||
*
|
*
|
||||||
@ -128,55 +123,57 @@ public interface Tag {
|
|||||||
* @param activationData
|
* @param activationData
|
||||||
* @param argData
|
* @param argData
|
||||||
*/
|
*/
|
||||||
void postActivated(
|
void postActivated(TagTarget target, PlayerContainer player,
|
||||||
TagTarget target,
|
ActivationData activationData, String[] argData);
|
||||||
PlayerContainer player,
|
|
||||||
ActivationData activationData,
|
|
||||||
String[] argData);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Activates if the portal is allowed from preActivating. Should be used to set the intended
|
* Activates if the portal is allowed from preActivating. Should be used
|
||||||
* warp location
|
* to set the intended warp location
|
||||||
*
|
*
|
||||||
* <p>You should do some second checks if it can be dependent on the preActivate, the
|
* <p>You should do some second checks if it can be dependent on the
|
||||||
* destination tags will also be triggered here if a desti is listed.
|
* preActivate, the destination tags will also be triggered here if a
|
||||||
|
* desti is listed.
|
||||||
*
|
*
|
||||||
* @param player
|
* @param player
|
||||||
* @param activationData
|
* @param activationData
|
||||||
* @param argData
|
* @param argData
|
||||||
* @return Action performed (only return false if the tag failed to do anything)
|
* @return Action performed (only return false if the tag failed to do
|
||||||
|
* anything)
|
||||||
*/
|
*/
|
||||||
boolean activated(
|
boolean activated(TagTarget target, PlayerContainer player,
|
||||||
TagTarget target,
|
ActivationData activationData, String[] argData);
|
||||||
PlayerContainer player,
|
|
||||||
ActivationData activationData,
|
|
||||||
String[] argData);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Triggers when a tag is added or removed from a portal or destination */
|
|
||||||
interface TagStatus extends Tag {
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If the user has access to add the tag (this does not include being added on creation)
|
* Triggers when a tag is added or removed from a portal or destination
|
||||||
|
*/
|
||||||
|
interface TagStatus extends Tag {
|
||||||
|
/**
|
||||||
|
* If the user has access to add the tag (this does not include being
|
||||||
|
* added on creation)
|
||||||
*
|
*
|
||||||
* @param target the target of the tag
|
* @param target the target of the tag
|
||||||
* @param player if null then removed by the server or a plugin
|
* @param player if null then removed by the server or a plugin
|
||||||
* @param argData the data for the tag
|
* @param argData the data for the tag
|
||||||
* @param index the index of the tag in the list (if it is the only tag it will be 0)
|
* @param index the index of the tag in the list (if it is the only tag
|
||||||
|
* it will be 0)
|
||||||
* @return if the tag will be added.
|
* @return if the tag will be added.
|
||||||
*/
|
*/
|
||||||
boolean tagAdded(TagTarget target, PlayerContainer player, int index, String argData);
|
boolean tagAdded(TagTarget target, PlayerContainer player, int index,
|
||||||
|
String argData);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If the user has access to remove the tag (this does not include being added on
|
* If the user has access to remove the tag (this does not include being
|
||||||
* destruction)
|
* added on destruction)
|
||||||
*
|
*
|
||||||
* @param target the target of the tag
|
* @param target the target of the tag
|
||||||
* @param player if null then removed by the server or a plugin
|
* @param player if null then removed by the server or a plugin
|
||||||
* @param argData the data of the tag to be removed
|
* @param argData the data of the tag to be removed
|
||||||
* @param index the index of the tag in the list (if it is the only tag it will be 0)
|
* @param index the index of the tag in the list (if it is the only tag
|
||||||
|
* it will be 0)
|
||||||
* @return if the tag will be removed.
|
* @return if the tag will be removed.
|
||||||
*/
|
*/
|
||||||
boolean tagRemoved(TagTarget target, PlayerContainer player, int index, String argData);
|
boolean tagRemoved(TagTarget target, PlayerContainer player, int index,
|
||||||
|
String argData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,9 +11,9 @@ import org.bukkit.plugin.java.JavaPlugin;
|
|||||||
|
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
public class AdvancedPortalsPlugin extends JavaPlugin {
|
public class AdvancedPortalsPlugin extends JavaPlugin {
|
||||||
|
|
||||||
private AdvancedPortalsCore portalsCore;
|
private AdvancedPortalsCore portalsCore;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -17,11 +17,9 @@ import org.bukkit.event.block.BlockPlaceEvent;
|
|||||||
import org.bukkit.event.entity.*;
|
import org.bukkit.event.entity.*;
|
||||||
import org.bukkit.event.player.*;
|
import org.bukkit.event.player.*;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Some of these will be passed to the core listener to handle the events, others it's easier to
|
* Some of these will be passed to the core listener to handle the events,
|
||||||
* just check directly.
|
* others it's easier to just check directly.
|
||||||
*/
|
*/
|
||||||
public class Listeners implements Listener {
|
public class Listeners implements Listener {
|
||||||
|
|
||||||
@ -76,7 +74,8 @@ public class Listeners implements Listener {
|
|||||||
|
|
||||||
@EventHandler(ignoreCancelled = true)
|
@EventHandler(ignoreCancelled = true)
|
||||||
public void spawnMobEvent(CreatureSpawnEvent event) {
|
public void spawnMobEvent(CreatureSpawnEvent event) {
|
||||||
if (event.getSpawnReason() == CreatureSpawnEvent.SpawnReason.NETHER_PORTAL
|
if (event.getSpawnReason()
|
||||||
|
== CreatureSpawnEvent.SpawnReason.NETHER_PORTAL
|
||||||
&& portalServices.inPortalRegionProtected(
|
&& portalServices.inPortalRegionProtected(
|
||||||
ContainerHelpers.toPlayerLocation(event.getLocation()))) {
|
ContainerHelpers.toPlayerLocation(event.getLocation()))) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
@ -90,18 +89,16 @@ public class Listeners implements Listener {
|
|||||||
if (!configRepository.getStopWaterFlow()) {
|
if (!configRepository.getStopWaterFlow()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!coreListeners.blockPlace(
|
if (!coreListeners.blockPlace(null,
|
||||||
null,
|
ContainerHelpers.toBlockLocation(
|
||||||
ContainerHelpers.toBlockLocation(event.getBlock().getLocation()),
|
event.getBlock().getLocation()),
|
||||||
event.getBlock().getType().toString(),
|
event.getBlock().getType().toString(),
|
||||||
null,
|
null, null)
|
||||||
null)
|
|| !coreListeners.blockPlace(null,
|
||||||
|| !coreListeners.blockPlace(
|
ContainerHelpers.toBlockLocation(
|
||||||
null,
|
event.getToBlock().getLocation()),
|
||||||
ContainerHelpers.toBlockLocation(event.getToBlock().getLocation()),
|
|
||||||
event.getBlock().getType().toString(),
|
event.getBlock().getType().toString(),
|
||||||
null,
|
null, null)) {
|
||||||
null)) {
|
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -111,7 +108,8 @@ public class Listeners implements Listener {
|
|||||||
var itemInHand = event.getPlayer().getItemInHand();
|
var itemInHand = event.getPlayer().getItemInHand();
|
||||||
if (!coreListeners.blockBreak(
|
if (!coreListeners.blockBreak(
|
||||||
new SpigotPlayerContainer(event.getPlayer()),
|
new SpigotPlayerContainer(event.getPlayer()),
|
||||||
ContainerHelpers.toBlockLocation(event.getBlock().getLocation()),
|
ContainerHelpers.toBlockLocation(
|
||||||
|
event.getBlock().getLocation()),
|
||||||
event.getBlock().getType().toString(),
|
event.getBlock().getType().toString(),
|
||||||
itemInHand == null ? null : itemInHand.getType().toString(),
|
itemInHand == null ? null : itemInHand.getType().toString(),
|
||||||
itemInHand == null || itemInHand.getItemMeta() == null
|
itemInHand == null || itemInHand.getItemMeta() == null
|
||||||
@ -123,7 +121,8 @@ public class Listeners implements Listener {
|
|||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGH)
|
@EventHandler(priority = EventPriority.HIGH)
|
||||||
public void onExplosion(EntityExplodeEvent event) {
|
public void onExplosion(EntityExplodeEvent event) {
|
||||||
if (!configRepository.getPortalProtection()) return;
|
if (!configRepository.getPortalProtection())
|
||||||
|
return;
|
||||||
|
|
||||||
List<Block> blockList = event.blockList();
|
List<Block> blockList = event.blockList();
|
||||||
for (int i = 0; i < blockList.size(); i++) {
|
for (int i = 0; i < blockList.size(); i++) {
|
||||||
|
@ -1,11 +1,9 @@
|
|||||||
package com.sekwah.advancedportals.spigot;
|
package com.sekwah.advancedportals.spigot;
|
||||||
|
|
||||||
import com.sekwah.advancedportals.core.util.InfoLogger;
|
import com.sekwah.advancedportals.core.util.InfoLogger;
|
||||||
|
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
public class SpigotInfoLogger extends InfoLogger {
|
public class SpigotInfoLogger extends InfoLogger {
|
||||||
|
|
||||||
private final AdvancedPortalsPlugin plugin;
|
private final AdvancedPortalsPlugin plugin;
|
||||||
|
|
||||||
public SpigotInfoLogger(AdvancedPortalsPlugin plugin) {
|
public SpigotInfoLogger(AdvancedPortalsPlugin plugin) {
|
||||||
|
@ -11,15 +11,12 @@ import com.sekwah.advancedportals.core.services.PortalServices;
|
|||||||
import com.sekwah.advancedportals.core.util.Lang;
|
import com.sekwah.advancedportals.core.util.Lang;
|
||||||
import com.sekwah.advancedportals.spigot.AdvancedPortalsPlugin;
|
import com.sekwah.advancedportals.spigot.AdvancedPortalsPlugin;
|
||||||
import com.sekwah.advancedportals.spigot.commands.subcommands.portal.update.ConfigAccessor;
|
import com.sekwah.advancedportals.spigot.commands.subcommands.portal.update.ConfigAccessor;
|
||||||
|
|
||||||
import org.bukkit.configuration.ConfigurationSection;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
|
|
||||||
public class UpdatePortalSubCommand implements SubCommand {
|
public class UpdatePortalSubCommand implements SubCommand {
|
||||||
|
|
||||||
@Inject PortalServices portalServices;
|
@Inject PortalServices portalServices;
|
||||||
|
|
||||||
@Inject DestinationServices destinationServices;
|
@Inject DestinationServices destinationServices;
|
||||||
@ -29,9 +26,9 @@ public class UpdatePortalSubCommand implements SubCommand {
|
|||||||
@Override
|
@Override
|
||||||
public void onCommand(CommandSenderContainer sender, String[] args) {
|
public void onCommand(CommandSenderContainer sender, String[] args) {
|
||||||
if (args.length > 1 && "confirm".equals(args[1])) {
|
if (args.length > 1 && "confirm".equals(args[1])) {
|
||||||
sender.sendMessage(
|
sender.sendMessage(Lang.translate("messageprefix.positive")
|
||||||
Lang.translate("messageprefix.positive")
|
+ Lang.translateInsertVariables(
|
||||||
+ Lang.translateInsertVariables("command.portal.update.confirm"));
|
"command.portal.update.confirm"));
|
||||||
int destinations = importDestinations();
|
int destinations = importDestinations();
|
||||||
int portals = importPortals();
|
int portals = importPortals();
|
||||||
sender.sendMessage(
|
sender.sendMessage(
|
||||||
@ -40,29 +37,27 @@ public class UpdatePortalSubCommand implements SubCommand {
|
|||||||
"command.portal.update.complete", portals, destinations));
|
"command.portal.update.complete", portals, destinations));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
sender.sendMessage(
|
sender.sendMessage(Lang.translate("messageprefix.positive")
|
||||||
Lang.translate("messageprefix.positive")
|
|
||||||
+ Lang.translateInsertVariables(
|
+ Lang.translateInsertVariables(
|
||||||
"command.portal.update", getPortalCount(), getDestinationCount()));
|
"command.portal.update", getPortalCount(),
|
||||||
|
getDestinationCount()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private int importPortals() {
|
private int importPortals() {
|
||||||
ConfigAccessor portalConfig =
|
ConfigAccessor portalConfig = new ConfigAccessor(
|
||||||
new ConfigAccessor(AdvancedPortalsPlugin.getInstance(), "portals.yaml");
|
AdvancedPortalsPlugin.getInstance(), "portals.yaml");
|
||||||
var config = portalConfig.getConfig();
|
var config = portalConfig.getConfig();
|
||||||
Set<String> portalSet = config.getKeys(false);
|
Set<String> portalSet = config.getKeys(false);
|
||||||
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
for (String portalName : portalSet) {
|
for (String portalName : portalSet) {
|
||||||
BlockLocation pos1 =
|
BlockLocation pos1 =
|
||||||
new BlockLocation(
|
new BlockLocation(config.getString(portalName + ".world"),
|
||||||
config.getString(portalName + ".world"),
|
|
||||||
config.getInt(portalName + ".pos1.X"),
|
config.getInt(portalName + ".pos1.X"),
|
||||||
config.getInt(portalName + ".pos1.Y"),
|
config.getInt(portalName + ".pos1.Y"),
|
||||||
config.getInt(portalName + ".pos1.Z"));
|
config.getInt(portalName + ".pos1.Z"));
|
||||||
BlockLocation pos2 =
|
BlockLocation pos2 =
|
||||||
new BlockLocation(
|
new BlockLocation(config.getString(portalName + ".world"),
|
||||||
config.getString(portalName + ".world"),
|
|
||||||
config.getInt(portalName + ".pos2.X"),
|
config.getInt(portalName + ".pos2.X"),
|
||||||
config.getInt(portalName + ".pos2.Y"),
|
config.getInt(portalName + ".pos2.Y"),
|
||||||
config.getInt(portalName + ".pos2.Z"));
|
config.getInt(portalName + ".pos2.Z"));
|
||||||
@ -73,12 +68,15 @@ public class UpdatePortalSubCommand implements SubCommand {
|
|||||||
args.add(new DataTag("triggerblock", triggerblock.split(",")));
|
args.add(new DataTag("triggerblock", triggerblock.split(",")));
|
||||||
// It's called bungee as that's the implementation behind it
|
// It's called bungee as that's the implementation behind it
|
||||||
var bungee = config.getString(portalName + ".bungee");
|
var bungee = config.getString(portalName + ".bungee");
|
||||||
if (bungee != null) args.add(new DataTag("bungee", bungee.split(",")));
|
if (bungee != null)
|
||||||
|
args.add(new DataTag("bungee", bungee.split(",")));
|
||||||
|
|
||||||
var destination = config.getString(portalName + ".destination");
|
var destination = config.getString(portalName + ".destination");
|
||||||
if (destination != null) args.add(new DataTag("destination", destination.split(",")));
|
if (destination != null)
|
||||||
|
args.add(new DataTag("destination", destination.split(",")));
|
||||||
|
|
||||||
ConfigurationSection portalConfigSection = config.getConfigurationSection(portalName);
|
ConfigurationSection portalConfigSection =
|
||||||
|
config.getConfigurationSection(portalName);
|
||||||
ConfigurationSection portalArgsConf =
|
ConfigurationSection portalArgsConf =
|
||||||
portalConfigSection.getConfigurationSection("portalArgs");
|
portalConfigSection.getConfigurationSection("portalArgs");
|
||||||
|
|
||||||
@ -87,8 +85,7 @@ public class UpdatePortalSubCommand implements SubCommand {
|
|||||||
for (Object argName : argsSet.toArray()) {
|
for (Object argName : argsSet.toArray()) {
|
||||||
// skip if it argName starts with command.
|
// skip if it argName starts with command.
|
||||||
if (portalArgsConf.isString(argName.toString())) {
|
if (portalArgsConf.isString(argName.toString())) {
|
||||||
args.add(
|
args.add(new DataTag(
|
||||||
new DataTag(
|
|
||||||
argName.toString(),
|
argName.toString(),
|
||||||
portalArgsConf.getString(argName.toString())));
|
portalArgsConf.getString(argName.toString())));
|
||||||
}
|
}
|
||||||
@ -104,7 +101,8 @@ public class UpdatePortalSubCommand implements SubCommand {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!commands.isEmpty()) {
|
if (!commands.isEmpty()) {
|
||||||
args.add(new DataTag("commands", commands.toArray(new String[0])));
|
args.add(
|
||||||
|
new DataTag("commands", commands.toArray(new String[0])));
|
||||||
}
|
}
|
||||||
args.stream()
|
args.stream()
|
||||||
.filter(dataTag -> dataTag.NAME.startsWith("command."))
|
.filter(dataTag -> dataTag.NAME.startsWith("command."))
|
||||||
@ -113,7 +111,8 @@ public class UpdatePortalSubCommand implements SubCommand {
|
|||||||
|
|
||||||
var portal = portalService.createPortal(pos1, pos2, args);
|
var portal = portalService.createPortal(pos1, pos2, args);
|
||||||
|
|
||||||
if (portal != null) count++;
|
if (portal != null)
|
||||||
|
count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
@ -129,16 +128,15 @@ public class UpdatePortalSubCommand implements SubCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public int importDestinations() {
|
public int importDestinations() {
|
||||||
ConfigAccessor destiConfig =
|
ConfigAccessor destiConfig = new ConfigAccessor(
|
||||||
new ConfigAccessor(AdvancedPortalsPlugin.getInstance(), "destinations.yaml");
|
AdvancedPortalsPlugin.getInstance(), "destinations.yaml");
|
||||||
var config = destiConfig.getConfig();
|
var config = destiConfig.getConfig();
|
||||||
Set<String> destiSet = config.getKeys(false);
|
Set<String> destiSet = config.getKeys(false);
|
||||||
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
for (String destiName : destiSet) {
|
for (String destiName : destiSet) {
|
||||||
var destiPos = destiName + ".pos";
|
var destiPos = destiName + ".pos";
|
||||||
var desti =
|
var desti = destinationServices.createDesti(
|
||||||
destinationServices.createDesti(
|
|
||||||
new PlayerLocation(
|
new PlayerLocation(
|
||||||
config.getString(destiName + ".world"),
|
config.getString(destiName + ".world"),
|
||||||
config.getDouble(destiPos + ".X"),
|
config.getDouble(destiPos + ".X"),
|
||||||
@ -147,14 +145,15 @@ public class UpdatePortalSubCommand implements SubCommand {
|
|||||||
(float) config.getDouble(destiPos + ".yaw"),
|
(float) config.getDouble(destiPos + ".yaw"),
|
||||||
(float) config.getDouble(destiPos + ".pitch")),
|
(float) config.getDouble(destiPos + ".pitch")),
|
||||||
List.of(new DataTag("name", destiName)));
|
List.of(new DataTag("name", destiName)));
|
||||||
if (desti != null) count++;
|
if (desti != null)
|
||||||
|
count++;
|
||||||
}
|
}
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getDestinationCount() {
|
public int getDestinationCount() {
|
||||||
ConfigAccessor destiConfig =
|
ConfigAccessor destiConfig = new ConfigAccessor(
|
||||||
new ConfigAccessor(AdvancedPortalsPlugin.getInstance(), "destinations.yaml");
|
AdvancedPortalsPlugin.getInstance(), "destinations.yaml");
|
||||||
var config = destiConfig.getConfig();
|
var config = destiConfig.getConfig();
|
||||||
Set<String> destiSet = config.getKeys(false);
|
Set<String> destiSet = config.getKeys(false);
|
||||||
|
|
||||||
@ -162,8 +161,8 @@ public class UpdatePortalSubCommand implements SubCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public int getPortalCount() {
|
public int getPortalCount() {
|
||||||
ConfigAccessor portalConfig =
|
ConfigAccessor portalConfig = new ConfigAccessor(
|
||||||
new ConfigAccessor(AdvancedPortalsPlugin.getInstance(), "portals.yaml");
|
AdvancedPortalsPlugin.getInstance(), "portals.yaml");
|
||||||
var config = portalConfig.getConfig();
|
var config = portalConfig.getConfig();
|
||||||
Set<String> portalSet = config.getKeys(false);
|
Set<String> portalSet = config.getKeys(false);
|
||||||
|
|
||||||
@ -176,7 +175,8 @@ public class UpdatePortalSubCommand implements SubCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> onTabComplete(CommandSenderContainer sender, String[] args) {
|
public List<String> onTabComplete(CommandSenderContainer sender,
|
||||||
|
String[] args) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,15 +1,13 @@
|
|||||||
package com.sekwah.advancedportals.spigot.commands.subcommands.portal.update;
|
package com.sekwah.advancedportals.spigot.commands.subcommands.portal.update;
|
||||||
|
|
||||||
import org.bukkit.configuration.file.FileConfiguration;
|
|
||||||
import org.bukkit.configuration.file.YamlConfiguration;
|
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
public class ConfigAccessor {
|
public class ConfigAccessor {
|
||||||
|
|
||||||
private final String fileName;
|
private final String fileName;
|
||||||
private final JavaPlugin plugin;
|
private final JavaPlugin plugin;
|
||||||
|
|
||||||
@ -25,7 +23,8 @@ public class ConfigAccessor {
|
|||||||
public void reloadConfig() {
|
public void reloadConfig() {
|
||||||
if (configFile == null) {
|
if (configFile == null) {
|
||||||
File dataFolder = plugin.getDataFolder();
|
File dataFolder = plugin.getDataFolder();
|
||||||
if (dataFolder == null) throw new IllegalStateException();
|
if (dataFolder == null)
|
||||||
|
throw new IllegalStateException();
|
||||||
configFile = new File(dataFolder, fileName);
|
configFile = new File(dataFolder, fileName);
|
||||||
}
|
}
|
||||||
fileConfiguration = YamlConfiguration.loadConfiguration(configFile);
|
fileConfiguration = YamlConfiguration.loadConfiguration(configFile);
|
||||||
@ -46,7 +45,8 @@ public class ConfigAccessor {
|
|||||||
try {
|
try {
|
||||||
getConfig().save(configFile);
|
getConfig().save(configFile);
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
plugin.getLogger().log(Level.SEVERE, "Could not save config to " + configFile, ex);
|
plugin.getLogger().log(
|
||||||
|
Level.SEVERE, "Could not save config to " + configFile, ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -58,8 +58,8 @@ public class ConfigAccessor {
|
|||||||
* this.plugin.saveResource(fileName, false); } }
|
* this.plugin.saveResource(fileName, false); } }
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// New save default config saving code, it checks if the needed config is in the jar file before
|
// New save default config saving code, it checks if the needed config is in
|
||||||
// overriding it.
|
// the jar file before overriding it.
|
||||||
public void saveDefaultConfig() {
|
public void saveDefaultConfig() {
|
||||||
if (configFile == null) {
|
if (configFile == null) {
|
||||||
configFile = new File(plugin.getDataFolder(), fileName);
|
configFile = new File(plugin.getDataFolder(), fileName);
|
||||||
|
@ -2,16 +2,13 @@ package com.sekwah.advancedportals.spigot.connector.command;
|
|||||||
|
|
||||||
import com.sekwah.advancedportals.core.commands.CommandTemplate;
|
import com.sekwah.advancedportals.core.commands.CommandTemplate;
|
||||||
import com.sekwah.advancedportals.spigot.connector.container.SpigotCommandSenderContainer;
|
import com.sekwah.advancedportals.spigot.connector.container.SpigotCommandSenderContainer;
|
||||||
|
import java.util.List;
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
import org.bukkit.command.CommandExecutor;
|
import org.bukkit.command.CommandExecutor;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.command.TabCompleter;
|
import org.bukkit.command.TabCompleter;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class SpigotCommandHandler implements CommandExecutor, TabCompleter {
|
public class SpigotCommandHandler implements CommandExecutor, TabCompleter {
|
||||||
|
|
||||||
private final CommandTemplate commandExecutor;
|
private final CommandTemplate commandExecutor;
|
||||||
|
|
||||||
public SpigotCommandHandler(CommandTemplate commandExecutor) {
|
public SpigotCommandHandler(CommandTemplate commandExecutor) {
|
||||||
@ -19,16 +16,18 @@ public class SpigotCommandHandler implements CommandExecutor, TabCompleter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onCommand(
|
public boolean onCommand(CommandSender commandSender, Command command,
|
||||||
CommandSender commandSender, Command command, String s, String[] args) {
|
String s, String[] args) {
|
||||||
this.commandExecutor.onCommand(
|
this.commandExecutor.onCommand(
|
||||||
new SpigotCommandSenderContainer(commandSender), command.getName(), args);
|
new SpigotCommandSenderContainer(commandSender), command.getName(),
|
||||||
|
args);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> onTabComplete(
|
public List<String> onTabComplete(CommandSender commandSender,
|
||||||
CommandSender commandSender, Command command, String s, String[] args) {
|
Command command, String s,
|
||||||
|
String[] args) {
|
||||||
return this.commandExecutor.onTabComplete(
|
return this.commandExecutor.onTabComplete(
|
||||||
new SpigotCommandSenderContainer(commandSender), args);
|
new SpigotCommandSenderContainer(commandSender), args);
|
||||||
}
|
}
|
||||||
|
@ -4,9 +4,10 @@ import com.sekwah.advancedportals.core.commands.CommandTemplate;
|
|||||||
import com.sekwah.advancedportals.core.connector.commands.CommandRegister;
|
import com.sekwah.advancedportals.core.connector.commands.CommandRegister;
|
||||||
import com.sekwah.advancedportals.spigot.AdvancedPortalsPlugin;
|
import com.sekwah.advancedportals.spigot.AdvancedPortalsPlugin;
|
||||||
|
|
||||||
/** Register the CommandTemplate files to the appropriate system */
|
/**
|
||||||
|
* Register the CommandTemplate files to the appropriate system
|
||||||
|
*/
|
||||||
public class SpigotCommandRegister implements CommandRegister {
|
public class SpigotCommandRegister implements CommandRegister {
|
||||||
|
|
||||||
private final AdvancedPortalsPlugin plugin;
|
private final AdvancedPortalsPlugin plugin;
|
||||||
|
|
||||||
public SpigotCommandRegister(AdvancedPortalsPlugin plugin) {
|
public SpigotCommandRegister(AdvancedPortalsPlugin plugin) {
|
||||||
@ -19,7 +20,9 @@ public class SpigotCommandRegister implements CommandRegister {
|
|||||||
* @param commandName
|
* @param commandName
|
||||||
* @param commandExecutor
|
* @param commandExecutor
|
||||||
*/
|
*/
|
||||||
public void registerCommand(String commandName, CommandTemplate commandExecutor) {
|
public void registerCommand(String commandName,
|
||||||
this.plugin.getCommand(commandName).setExecutor(new SpigotCommandHandler(commandExecutor));
|
CommandTemplate commandExecutor) {
|
||||||
|
this.plugin.getCommand(commandName)
|
||||||
|
.setExecutor(new SpigotCommandHandler(commandExecutor));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
package com.sekwah.advancedportals.spigot.connector.container;
|
package com.sekwah.advancedportals.spigot.connector.container;
|
||||||
|
|
||||||
import com.sekwah.advancedportals.core.connector.containers.CommandSenderContainer;
|
import com.sekwah.advancedportals.core.connector.containers.CommandSenderContainer;
|
||||||
|
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
public class SpigotCommandSenderContainer implements CommandSenderContainer {
|
public class SpigotCommandSenderContainer implements CommandSenderContainer {
|
||||||
|
|
||||||
private final CommandSender sender;
|
private final CommandSender sender;
|
||||||
|
|
||||||
public SpigotCommandSenderContainer(CommandSender commandSender) {
|
public SpigotCommandSenderContainer(CommandSender commandSender) {
|
||||||
|
@ -7,14 +7,15 @@ import com.sekwah.advancedportals.core.connector.containers.WorldContainer;
|
|||||||
import com.sekwah.advancedportals.core.serializeddata.BlockLocation;
|
import com.sekwah.advancedportals.core.serializeddata.BlockLocation;
|
||||||
import com.sekwah.advancedportals.core.serializeddata.PlayerLocation;
|
import com.sekwah.advancedportals.core.serializeddata.PlayerLocation;
|
||||||
import com.sekwah.advancedportals.core.serializeddata.Vector;
|
import com.sekwah.advancedportals.core.serializeddata.Vector;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
|
|
||||||
/** Just a temporary container for whenever advanced portals needs to get data from a player */
|
/**
|
||||||
|
* Just a temporary container for whenever advanced portals needs to get data
|
||||||
|
* from a player
|
||||||
|
*/
|
||||||
public class SpigotEntityContainer implements EntityContainer {
|
public class SpigotEntityContainer implements EntityContainer {
|
||||||
|
|
||||||
@Inject private AdvancedPortalsCore portalsCore;
|
@Inject private AdvancedPortalsCore portalsCore;
|
||||||
|
|
||||||
private final Entity entity;
|
private final Entity entity;
|
||||||
@ -26,20 +27,16 @@ public class SpigotEntityContainer implements EntityContainer {
|
|||||||
@Override
|
@Override
|
||||||
public PlayerLocation getLoc() {
|
public PlayerLocation getLoc() {
|
||||||
Location loc = this.entity.getLocation();
|
Location loc = this.entity.getLocation();
|
||||||
return new PlayerLocation(
|
return new PlayerLocation(loc.getWorld().getName(), loc.getX(),
|
||||||
loc.getWorld().getName(),
|
loc.getY(), loc.getZ(), loc.getYaw(),
|
||||||
loc.getX(),
|
|
||||||
loc.getY(),
|
|
||||||
loc.getZ(),
|
|
||||||
loc.getYaw(),
|
|
||||||
loc.getPitch());
|
loc.getPitch());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BlockLocation getBlockLoc() {
|
public BlockLocation getBlockLoc() {
|
||||||
Location loc = this.entity.getLocation();
|
Location loc = this.entity.getLocation();
|
||||||
return new BlockLocation(
|
return new BlockLocation(loc.getWorld().getName(), loc.getBlockX(),
|
||||||
loc.getWorld().getName(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ());
|
loc.getBlockY(), loc.getBlockZ());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -49,12 +46,9 @@ public class SpigotEntityContainer implements EntityContainer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean teleport(PlayerLocation location) {
|
public boolean teleport(PlayerLocation location) {
|
||||||
return this.entity.teleport(
|
return this.entity.teleport(new Location(
|
||||||
new Location(
|
Bukkit.getWorld(location.getWorldName()), location.getPosX(),
|
||||||
Bukkit.getWorld(location.getWorldName()),
|
location.getPosY(), location.getPosZ()));
|
||||||
location.getPosX(),
|
|
||||||
location.getPosY(),
|
|
||||||
location.getPosZ()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -74,7 +68,7 @@ public class SpigotEntityContainer implements EntityContainer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setVelocity(Vector vector) {
|
public void setVelocity(Vector vector) {
|
||||||
this.entity.setVelocity(
|
this.entity.setVelocity(new org.bukkit.util.Vector(
|
||||||
new org.bukkit.util.Vector(vector.getX(), vector.getY(), vector.getZ()));
|
vector.getX(), vector.getY(), vector.getZ()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,8 @@ import com.sekwah.advancedportals.core.serializeddata.BlockLocation;
|
|||||||
import com.sekwah.advancedportals.core.serializeddata.PlayerLocation;
|
import com.sekwah.advancedportals.core.serializeddata.PlayerLocation;
|
||||||
import com.sekwah.advancedportals.spigot.AdvancedPortalsPlugin;
|
import com.sekwah.advancedportals.spigot.AdvancedPortalsPlugin;
|
||||||
import com.sekwah.advancedportals.spigot.reflection.MinecraftCustomPayload;
|
import com.sekwah.advancedportals.spigot.reflection.MinecraftCustomPayload;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.UUID;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
@ -15,12 +16,12 @@ import org.bukkit.entity.Player;
|
|||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
|
||||||
import java.util.Arrays;
|
/**
|
||||||
import java.util.UUID;
|
* Just a temporary container for whenever advanced portals needs to get data
|
||||||
|
* from a player
|
||||||
/** Just a temporary container for whenever advanced portals needs to get data from a player */
|
*/
|
||||||
public class SpigotPlayerContainer extends SpigotEntityContainer implements PlayerContainer {
|
public class SpigotPlayerContainer
|
||||||
|
extends SpigotEntityContainer implements PlayerContainer {
|
||||||
@Inject private AdvancedPortalsCore portalsCore;
|
@Inject private AdvancedPortalsCore portalsCore;
|
||||||
|
|
||||||
private final Player player;
|
private final Player player;
|
||||||
@ -47,12 +48,9 @@ public class SpigotPlayerContainer extends SpigotEntityContainer implements Play
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean teleport(PlayerLocation location) {
|
public boolean teleport(PlayerLocation location) {
|
||||||
return this.player.teleport(
|
return this.player.teleport(new Location(
|
||||||
new Location(
|
Bukkit.getWorld(location.getWorldName()), location.getPosX(),
|
||||||
Bukkit.getWorld(location.getWorldName()),
|
location.getPosY(), location.getPosZ()));
|
||||||
location.getPosX(),
|
|
||||||
location.getPosY(),
|
|
||||||
location.getPosZ()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -65,7 +63,8 @@ public class SpigotPlayerContainer extends SpigotEntityContainer implements Play
|
|||||||
* @param material
|
* @param material
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void sendFakeBlock(BlockLocation blockPos, String material) {}
|
public void sendFakeBlock(BlockLocation blockPos, String material) {
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Only 1.12 and below supported
|
* Only 1.12 and below supported
|
||||||
@ -75,11 +74,15 @@ public class SpigotPlayerContainer extends SpigotEntityContainer implements Play
|
|||||||
* @param data
|
* @param data
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void sendFakeBlockWithData(BlockLocation blockPos, String material, byte data) {}
|
public void sendFakeBlockWithData(BlockLocation blockPos, String material,
|
||||||
|
byte data) {
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void giveItem(String material, String itemName, String... itemDescription) {
|
public void giveItem(String material, String itemName,
|
||||||
ItemStack regionselector = new ItemStack(Material.getMaterial(material));
|
String... itemDescription) {
|
||||||
|
ItemStack regionselector =
|
||||||
|
new ItemStack(Material.getMaterial(material));
|
||||||
ItemMeta selectorname = regionselector.getItemMeta();
|
ItemMeta selectorname = regionselector.getItemMeta();
|
||||||
selectorname.setDisplayName(itemName);
|
selectorname.setDisplayName(itemName);
|
||||||
selectorname.setLore(Arrays.asList(itemDescription));
|
selectorname.setLore(Arrays.asList(itemDescription));
|
||||||
@ -90,9 +93,11 @@ public class SpigotPlayerContainer extends SpigotEntityContainer implements Play
|
|||||||
@Override
|
@Override
|
||||||
public boolean sendPacket(String channel, byte[] bytes) {
|
public boolean sendPacket(String channel, byte[] bytes) {
|
||||||
if (channel.startsWith("minecraft:")) {
|
if (channel.startsWith("minecraft:")) {
|
||||||
return MinecraftCustomPayload.sendCustomPayload(player, channel, bytes);
|
return MinecraftCustomPayload.sendCustomPayload(player, channel,
|
||||||
|
bytes);
|
||||||
} else {
|
} else {
|
||||||
player.sendPluginMessage(AdvancedPortalsPlugin.getInstance(), channel, bytes);
|
player.sendPluginMessage(AdvancedPortalsPlugin.getInstance(),
|
||||||
|
channel, bytes);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -3,18 +3,19 @@ package com.sekwah.advancedportals.spigot.connector.container;
|
|||||||
import com.sekwah.advancedportals.core.connector.containers.PlayerContainer;
|
import com.sekwah.advancedportals.core.connector.containers.PlayerContainer;
|
||||||
import com.sekwah.advancedportals.core.connector.containers.ServerContainer;
|
import com.sekwah.advancedportals.core.connector.containers.ServerContainer;
|
||||||
import com.sekwah.advancedportals.core.connector.containers.WorldContainer;
|
import com.sekwah.advancedportals.core.connector.containers.WorldContainer;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.Server;
|
import org.bukkit.Server;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
public class SpigotServerContainer implements ServerContainer {
|
public class SpigotServerContainer implements ServerContainer {
|
||||||
|
|
||||||
private final Server server;
|
private final Server server;
|
||||||
private final List<String> triggerBlockList = Arrays.stream(Material.values()).filter(this::isAdvancedPortalBlock).map(Enum::name)
|
private final List<String> triggerBlockList =
|
||||||
|
Arrays.stream(Material.values())
|
||||||
|
.filter(this::isAdvancedPortalBlock)
|
||||||
|
.map(Enum::name)
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
public SpigotServerContainer(Server server) {
|
public SpigotServerContainer(Server server) {
|
||||||
@ -24,7 +25,7 @@ public class SpigotServerContainer implements ServerContainer {
|
|||||||
@Override
|
@Override
|
||||||
public WorldContainer getWorld(String name) {
|
public WorldContainer getWorld(String name) {
|
||||||
var world = server.getWorld(name);
|
var world = server.getWorld(name);
|
||||||
if(world != null) {
|
if (world != null) {
|
||||||
return new SpigotWorldContainer(world);
|
return new SpigotWorldContainer(world);
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
@ -34,7 +35,7 @@ public class SpigotServerContainer implements ServerContainer {
|
|||||||
@Override
|
@Override
|
||||||
public PlayerContainer getPlayer(String name) {
|
public PlayerContainer getPlayer(String name) {
|
||||||
var player = server.getPlayer(name);
|
var player = server.getPlayer(name);
|
||||||
if(player != null) {
|
if (player != null) {
|
||||||
return new SpigotPlayerContainer(player);
|
return new SpigotPlayerContainer(player);
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
@ -44,7 +45,7 @@ public class SpigotServerContainer implements ServerContainer {
|
|||||||
@Override
|
@Override
|
||||||
public PlayerContainer getPlayer(UUID name) {
|
public PlayerContainer getPlayer(UUID name) {
|
||||||
var player = server.getPlayer(name);
|
var player = server.getPlayer(name);
|
||||||
if(player != null) {
|
if (player != null) {
|
||||||
return new SpigotPlayerContainer(player);
|
return new SpigotPlayerContainer(player);
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
@ -58,9 +59,10 @@ public class SpigotServerContainer implements ServerContainer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PlayerContainer[] getPlayers() {
|
public PlayerContainer[] getPlayers() {
|
||||||
return server.getOnlinePlayers().stream()
|
return server.getOnlinePlayers()
|
||||||
|
.stream()
|
||||||
.map(SpigotPlayerContainer::new)
|
.map(SpigotPlayerContainer::new)
|
||||||
.toArray(PlayerContainer[]::new);
|
.toArray(PlayerContainer[] ::new);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if it's a material compatible with making portals
|
// Check if it's a material compatible with making portals
|
||||||
|
@ -9,7 +9,6 @@ import org.bukkit.World;
|
|||||||
import org.bukkit.block.data.Orientable;
|
import org.bukkit.block.data.Orientable;
|
||||||
|
|
||||||
public class SpigotWorldContainer implements WorldContainer {
|
public class SpigotWorldContainer implements WorldContainer {
|
||||||
|
|
||||||
private final World world;
|
private final World world;
|
||||||
|
|
||||||
public SpigotWorldContainer(World world) {
|
public SpigotWorldContainer(World world) {
|
||||||
@ -18,18 +17,27 @@ public class SpigotWorldContainer implements WorldContainer {
|
|||||||
|
|
||||||
public void setBlock(BlockLocation location, String material) {
|
public void setBlock(BlockLocation location, String material) {
|
||||||
Material mat = Material.getMaterial(material, false);
|
Material mat = Material.getMaterial(material, false);
|
||||||
if(mat != null) this.world.getBlockAt(location.getPosX(), location.getPosY(), location.getPosZ()).setType(mat);
|
if (mat != null)
|
||||||
|
this.world
|
||||||
|
.getBlockAt(location.getPosX(), location.getPosY(),
|
||||||
|
location.getPosZ())
|
||||||
|
.setType(mat);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getBlock(BlockLocation location) {
|
public String getBlock(BlockLocation location) {
|
||||||
return this.world.getBlockAt(location.getPosX(), location.getPosY(), location.getPosZ()).getType().toString();
|
return this.world
|
||||||
|
.getBlockAt(location.getPosX(), location.getPosY(),
|
||||||
|
location.getPosZ())
|
||||||
|
.getType()
|
||||||
|
.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BlockAxis getBlockAxis(BlockLocation location) {
|
public BlockAxis getBlockAxis(BlockLocation location) {
|
||||||
var block = world.getBlockAt(location.getPosX(), location.getPosY(), location.getPosZ());
|
var block = world.getBlockAt(location.getPosX(), location.getPosY(),
|
||||||
|
location.getPosZ());
|
||||||
var matData = block.getState().getBlockData();
|
var matData = block.getState().getBlockData();
|
||||||
if(matData instanceof Orientable rotatable) {
|
if (matData instanceof Orientable rotatable) {
|
||||||
try {
|
try {
|
||||||
return BlockAxis.valueOf(rotatable.getAxis().toString());
|
return BlockAxis.valueOf(rotatable.getAxis().toString());
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
@ -41,9 +49,10 @@ public class SpigotWorldContainer implements WorldContainer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setBlockAxis(BlockLocation location, BlockAxis axis) {
|
public void setBlockAxis(BlockLocation location, BlockAxis axis) {
|
||||||
var block = world.getBlockAt(location.getPosX(), location.getPosY(), location.getPosZ());
|
var block = world.getBlockAt(location.getPosX(), location.getPosY(),
|
||||||
|
location.getPosZ());
|
||||||
var matData = block.getState().getBlockData();
|
var matData = block.getState().getBlockData();
|
||||||
if(matData instanceof Orientable rotatable) {
|
if (matData instanceof Orientable rotatable) {
|
||||||
rotatable.setAxis(Axis.valueOf(axis.toString()));
|
rotatable.setAxis(Axis.valueOf(axis.toString()));
|
||||||
block.setBlockData(rotatable);
|
block.setBlockData(rotatable);
|
||||||
}
|
}
|
||||||
|
@ -3,14 +3,6 @@ package com.sekwah.advancedportals.spigot.metrics;
|
|||||||
import com.google.gson.JsonArray;
|
import com.google.gson.JsonArray;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import com.google.gson.JsonParser;
|
import com.google.gson.JsonParser;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.configuration.file.YamlConfiguration;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.plugin.Plugin;
|
|
||||||
import org.bukkit.plugin.RegisteredServiceProvider;
|
|
||||||
import org.bukkit.plugin.ServicePriority;
|
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
@ -20,8 +12,13 @@ import java.util.*;
|
|||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.zip.GZIPOutputStream;
|
import java.util.zip.GZIPOutputStream;
|
||||||
|
|
||||||
import javax.net.ssl.HttpsURLConnection;
|
import javax.net.ssl.HttpsURLConnection;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.plugin.Plugin;
|
||||||
|
import org.bukkit.plugin.RegisteredServiceProvider;
|
||||||
|
import org.bukkit.plugin.ServicePriority;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* bStats collects some data for plugin authors.
|
* bStats collects some data for plugin authors.
|
||||||
@ -30,28 +27,23 @@ import javax.net.ssl.HttpsURLConnection;
|
|||||||
*/
|
*/
|
||||||
@SuppressWarnings({"WeakerAccess", "unused"})
|
@SuppressWarnings({"WeakerAccess", "unused"})
|
||||||
public class Metrics {
|
public class Metrics {
|
||||||
|
|
||||||
static {
|
static {
|
||||||
// You can use the property to disable the check in your test environment
|
// You can use the property to disable the check in your test
|
||||||
|
// environment
|
||||||
if (System.getProperty("bstats.relocatecheck") == null
|
if (System.getProperty("bstats.relocatecheck") == null
|
||||||
|| !System.getProperty("bstats.relocatecheck").equals("false")) {
|
|| !System.getProperty("bstats.relocatecheck").equals("false")) {
|
||||||
// Maven's Relocate is clever and changes strings, too. So we have to use this little
|
// Maven's Relocate is clever and changes strings, too. So we have
|
||||||
// "trick" ... :D
|
// to use this little "trick" ... :D
|
||||||
final String defaultPackage =
|
final String defaultPackage = new String(
|
||||||
new String(
|
new byte[] {'o', 'r', 'g', '.', 'b', 's', 't', 'a', 't', 's',
|
||||||
new byte[] {
|
'.', 'b', 'u', 'k', 'k', 'i', 't'});
|
||||||
'o', 'r', 'g', '.', 'b', 's', 't', 'a', 't', 's', '.', 'b', 'u',
|
final String examplePackage = new String(new byte[] {
|
||||||
'k', 'k', 'i', 't'
|
'y', 'o', 'u', 'r', '.', 'p', 'a', 'c', 'k', 'a', 'g', 'e'});
|
||||||
});
|
// We want to make sure nobody just copy & pastes the example and
|
||||||
final String examplePackage =
|
// use the wrong package names
|
||||||
new String(
|
|
||||||
new byte[] {
|
|
||||||
'y', 'o', 'u', 'r', '.', 'p', 'a', 'c', 'k', 'a', 'g', 'e'
|
|
||||||
});
|
|
||||||
// We want to make sure nobody just copy & pastes the example and use the wrong package
|
|
||||||
// names
|
|
||||||
if (Metrics.class.getPackage().getName().equals(defaultPackage)
|
if (Metrics.class.getPackage().getName().equals(defaultPackage)
|
||||||
|| Metrics.class.getPackage().getName().equals(examplePackage)) {
|
|| Metrics.class.getPackage().getName().equals(
|
||||||
|
examplePackage)) {
|
||||||
throw new IllegalStateException(
|
throw new IllegalStateException(
|
||||||
"bStats Metrics class has not been relocated correctly!");
|
"bStats Metrics class has not been relocated correctly!");
|
||||||
}
|
}
|
||||||
@ -97,13 +89,14 @@ public class Metrics {
|
|||||||
this.plugin = plugin;
|
this.plugin = plugin;
|
||||||
|
|
||||||
// Get the config file
|
// Get the config file
|
||||||
File bStatsFolder = new File(plugin.getDataFolder().getParentFile(), "bStats");
|
File bStatsFolder =
|
||||||
|
new File(plugin.getDataFolder().getParentFile(), "bStats");
|
||||||
File configFile = new File(bStatsFolder, "config.yaml");
|
File configFile = new File(bStatsFolder, "config.yaml");
|
||||||
YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile);
|
YamlConfiguration config =
|
||||||
|
YamlConfiguration.loadConfiguration(configFile);
|
||||||
|
|
||||||
// Check if the config file exists
|
// Check if the config file exists
|
||||||
if (!config.isSet("serverUuid")) {
|
if (!config.isSet("serverUuid")) {
|
||||||
|
|
||||||
// Add default values
|
// Add default values
|
||||||
config.addDefault("enabled", true);
|
config.addDefault("enabled", true);
|
||||||
// Every server gets it's unique random id.
|
// Every server gets it's unique random id.
|
||||||
@ -118,7 +111,8 @@ public class Metrics {
|
|||||||
// Inform the server owners about bStats
|
// Inform the server owners about bStats
|
||||||
config.options()
|
config.options()
|
||||||
.header(
|
.header(
|
||||||
"bStats collects some data for plugin authors like how many servers are"
|
"bStats collects some data for plugin authors like how "
|
||||||
|
+ "many servers are"
|
||||||
+ " using their plugins.\n"
|
+ " using their plugins.\n"
|
||||||
+ "To honor their work, you should not disable it.\n"
|
+ "To honor their work, you should not disable it.\n"
|
||||||
+ "This has nearly no effect on the server performance!\n"
|
+ "This has nearly no effect on the server performance!\n"
|
||||||
@ -135,12 +129,15 @@ public class Metrics {
|
|||||||
serverUUID = config.getString("serverUuid");
|
serverUUID = config.getString("serverUuid");
|
||||||
logFailedRequests = config.getBoolean("logFailedRequests", false);
|
logFailedRequests = config.getBoolean("logFailedRequests", false);
|
||||||
logSentData = config.getBoolean("logSentData", false);
|
logSentData = config.getBoolean("logSentData", false);
|
||||||
logResponseStatusText = config.getBoolean("logResponseStatusText", false);
|
logResponseStatusText =
|
||||||
|
config.getBoolean("logResponseStatusText", false);
|
||||||
|
|
||||||
if (enabled) {
|
if (enabled) {
|
||||||
boolean found = false;
|
boolean found = false;
|
||||||
// Search for all other bStats Metrics classes to see if we are the first one
|
// Search for all other bStats Metrics classes to see if we are the
|
||||||
for (Class<?> service : Bukkit.getServicesManager().getKnownServices()) {
|
// first one
|
||||||
|
for (Class<?> service :
|
||||||
|
Bukkit.getServicesManager().getKnownServices()) {
|
||||||
try {
|
try {
|
||||||
service.getField("B_STATS_VERSION"); // Our identifier :)
|
service.getField("B_STATS_VERSION"); // Our identifier :)
|
||||||
found = true; // We aren't the first
|
found = true; // We aren't the first
|
||||||
@ -149,8 +146,8 @@ public class Metrics {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Register our service
|
// Register our service
|
||||||
Bukkit.getServicesManager()
|
Bukkit.getServicesManager().register(Metrics.class, this, plugin,
|
||||||
.register(Metrics.class, this, plugin, ServicePriority.Normal);
|
ServicePriority.Normal);
|
||||||
if (!found) {
|
if (!found) {
|
||||||
// We are the first!
|
// We are the first!
|
||||||
startSubmitting();
|
startSubmitting();
|
||||||
@ -179,33 +176,31 @@ public class Metrics {
|
|||||||
charts.add(chart);
|
charts.add(chart);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Starts the Scheduler which submits our data every 30 minutes. */
|
/**
|
||||||
|
* Starts the Scheduler which submits our data every 30 minutes.
|
||||||
|
*/
|
||||||
private void startSubmitting() {
|
private void startSubmitting() {
|
||||||
final Timer timer =
|
final Timer timer =
|
||||||
new Timer(
|
new Timer(true); // We use a timer cause the Bukkit
|
||||||
true); // We use a timer cause the Bukkit scheduler is affected by server
|
// scheduler is affected by server lags
|
||||||
// lags
|
timer.scheduleAtFixedRate(new TimerTask() {
|
||||||
timer.scheduleAtFixedRate(
|
|
||||||
new TimerTask() {
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
if (!plugin.isEnabled()) { // Plugin was disabled
|
if (!plugin.isEnabled()) { // Plugin was disabled
|
||||||
timer.cancel();
|
timer.cancel();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Nevertheless we want our code to run in the Bukkit main thread, so we
|
// Nevertheless we want our code to run in the Bukkit main
|
||||||
// have to use the Bukkit scheduler
|
// thread, so we have to use the Bukkit scheduler Don't be
|
||||||
// Don't be afraid! The connection to the bStats server is still async, only
|
// afraid! The connection to the bStats server is still async,
|
||||||
// the stats collection is sync ;)
|
// only the stats collection is sync ;)
|
||||||
Bukkit.getScheduler().runTask(plugin, () -> submitData());
|
Bukkit.getScheduler().runTask(plugin, () -> submitData());
|
||||||
}
|
}
|
||||||
},
|
}, 1000 * 60 * 5, 1000 * 60 * 30);
|
||||||
1000 * 60 * 5,
|
// Submit the data every 30 minutes, first time after 5 minutes to give
|
||||||
1000 * 60 * 30);
|
// other plugins enough time to start WARNING: Changing the frequency
|
||||||
// Submit the data every 30 minutes, first time after 5 minutes to give other plugins enough
|
// has no effect but your plugin WILL be blocked/deleted! WARNING: Just
|
||||||
// time to start
|
// don't do it!
|
||||||
// WARNING: Changing the frequency has no effect but your plugin WILL be blocked/deleted!
|
|
||||||
// WARNING: Just don't do it!
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -219,8 +214,10 @@ public class Metrics {
|
|||||||
String pluginName = plugin.getDescription().getName();
|
String pluginName = plugin.getDescription().getName();
|
||||||
String pluginVersion = plugin.getDescription().getVersion();
|
String pluginVersion = plugin.getDescription().getVersion();
|
||||||
|
|
||||||
data.addProperty("pluginName", pluginName); // Append the name of the plugin
|
data.addProperty("pluginName",
|
||||||
data.addProperty("pluginVersion", pluginVersion); // Append the version of the plugin
|
pluginName); // Append the name of the plugin
|
||||||
|
data.addProperty("pluginVersion",
|
||||||
|
pluginVersion); // Append the version of the plugin
|
||||||
JsonArray customCharts = new JsonArray();
|
JsonArray customCharts = new JsonArray();
|
||||||
for (CustomChart customChart : charts) {
|
for (CustomChart customChart : charts) {
|
||||||
// Add the data of the custom charts
|
// Add the data of the custom charts
|
||||||
@ -244,16 +241,18 @@ public class Metrics {
|
|||||||
// Minecraft specific data
|
// Minecraft specific data
|
||||||
int playerAmount;
|
int playerAmount;
|
||||||
try {
|
try {
|
||||||
// Around MC 1.8 the return type was changed to a collection from an array,
|
// Around MC 1.8 the return type was changed to a collection from an
|
||||||
// This fixes java.lang.NoSuchMethodError:
|
// array, This fixes java.lang.NoSuchMethodError:
|
||||||
// org.bukkit.Bukkit.getOnlinePlayers()Ljava/util/Collection;
|
// org.bukkit.Bukkit.getOnlinePlayers()Ljava/util/Collection;
|
||||||
Method onlinePlayersMethod =
|
Method onlinePlayersMethod = Class.forName("org.bukkit.Server")
|
||||||
Class.forName("org.bukkit.Server").getMethod("getOnlinePlayers");
|
.getMethod("getOnlinePlayers");
|
||||||
playerAmount =
|
playerAmount =
|
||||||
onlinePlayersMethod.getReturnType().equals(Collection.class)
|
onlinePlayersMethod.getReturnType().equals(Collection.class)
|
||||||
? ((Collection<?>) onlinePlayersMethod.invoke(Bukkit.getServer()))
|
? ((Collection<?>) onlinePlayersMethod.invoke(
|
||||||
|
Bukkit.getServer()))
|
||||||
.size()
|
.size()
|
||||||
: ((Player[]) onlinePlayersMethod.invoke(Bukkit.getServer())).length;
|
: ((Player[]) onlinePlayersMethod.invoke(Bukkit.getServer()))
|
||||||
|
.length;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
playerAmount =
|
playerAmount =
|
||||||
Bukkit.getOnlinePlayers()
|
Bukkit.getOnlinePlayers()
|
||||||
@ -288,21 +287,23 @@ public class Metrics {
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Collects the data and sends it afterwards. */
|
/**
|
||||||
|
* Collects the data and sends it afterwards.
|
||||||
|
*/
|
||||||
private void submitData() {
|
private void submitData() {
|
||||||
final JsonObject data = getServerData();
|
final JsonObject data = getServerData();
|
||||||
|
|
||||||
JsonArray pluginData = new JsonArray();
|
JsonArray pluginData = new JsonArray();
|
||||||
// Search for all other bStats Metrics classes to get their plugin data
|
// Search for all other bStats Metrics classes to get their plugin data
|
||||||
for (Class<?> service : Bukkit.getServicesManager().getKnownServices()) {
|
for (Class<?> service :
|
||||||
|
Bukkit.getServicesManager().getKnownServices()) {
|
||||||
try {
|
try {
|
||||||
service.getField("B_STATS_VERSION"); // Our identifier :)
|
service.getField("B_STATS_VERSION"); // Our identifier :)
|
||||||
|
|
||||||
for (RegisteredServiceProvider<?> provider :
|
for (RegisteredServiceProvider<?> provider :
|
||||||
Bukkit.getServicesManager().getRegistrations(service)) {
|
Bukkit.getServicesManager().getRegistrations(service)) {
|
||||||
try {
|
try {
|
||||||
Object plugin =
|
Object plugin = provider.getService()
|
||||||
provider.getService()
|
|
||||||
.getMethod("getPluginData")
|
.getMethod("getPluginData")
|
||||||
.invoke(provider.getProvider());
|
.invoke(provider.getProvider());
|
||||||
if (plugin instanceof JsonObject) {
|
if (plugin instanceof JsonObject) {
|
||||||
@ -311,30 +312,32 @@ public class Metrics {
|
|||||||
try {
|
try {
|
||||||
Class<?> jsonObjectJsonSimple =
|
Class<?> jsonObjectJsonSimple =
|
||||||
Class.forName("org.json.simple.JSONObject");
|
Class.forName("org.json.simple.JSONObject");
|
||||||
if (plugin.getClass().isAssignableFrom(jsonObjectJsonSimple)) {
|
if (plugin.getClass().isAssignableFrom(
|
||||||
|
jsonObjectJsonSimple)) {
|
||||||
Method jsonStringGetter =
|
Method jsonStringGetter =
|
||||||
jsonObjectJsonSimple.getDeclaredMethod("toJSONString");
|
jsonObjectJsonSimple.getDeclaredMethod(
|
||||||
|
"toJSONString");
|
||||||
jsonStringGetter.setAccessible(true);
|
jsonStringGetter.setAccessible(true);
|
||||||
String jsonString = (String) jsonStringGetter.invoke(plugin);
|
String jsonString =
|
||||||
JsonObject object =
|
(String) jsonStringGetter.invoke(
|
||||||
new JsonParser().parse(jsonString).getAsJsonObject();
|
plugin);
|
||||||
|
JsonObject object = new JsonParser()
|
||||||
|
.parse(jsonString)
|
||||||
|
.getAsJsonObject();
|
||||||
pluginData.add(object);
|
pluginData.add(object);
|
||||||
}
|
}
|
||||||
} catch (ClassNotFoundException e) {
|
} catch (ClassNotFoundException e) {
|
||||||
// minecraft version 1.14+
|
// minecraft version 1.14+
|
||||||
if (logFailedRequests) {
|
if (logFailedRequests) {
|
||||||
this.plugin
|
this.plugin.getLogger().log(
|
||||||
.getLogger()
|
|
||||||
.log(
|
|
||||||
Level.SEVERE,
|
Level.SEVERE,
|
||||||
"Encountered unexpected exception",
|
"Encountered unexpected exception", e);
|
||||||
e);
|
|
||||||
}
|
}
|
||||||
continue; // continue looping since we cannot do any other thing.
|
continue; // continue looping since we cannot do
|
||||||
|
// any other thing.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (NullPointerException
|
} catch (NullPointerException | NoSuchMethodException
|
||||||
| NoSuchMethodException
|
|
||||||
| IllegalAccessException
|
| IllegalAccessException
|
||||||
| InvocationTargetException ignored) {
|
| InvocationTargetException ignored) {
|
||||||
}
|
}
|
||||||
@ -346,8 +349,7 @@ public class Metrics {
|
|||||||
data.add("plugins", pluginData);
|
data.add("plugins", pluginData);
|
||||||
|
|
||||||
// Create a new thread for the connection to the bStats server
|
// Create a new thread for the connection to the bStats server
|
||||||
new Thread(
|
new Thread(new Runnable() {
|
||||||
new Runnable() {
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
try {
|
try {
|
||||||
@ -356,8 +358,7 @@ public class Metrics {
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// Something went wrong! :(
|
// Something went wrong! :(
|
||||||
if (logFailedRequests) {
|
if (logFailedRequests) {
|
||||||
plugin.getLogger()
|
plugin.getLogger().log(
|
||||||
.log(
|
|
||||||
Level.WARNING,
|
Level.WARNING,
|
||||||
"Could not submit plugin stats of "
|
"Could not submit plugin stats of "
|
||||||
+ plugin.getName(),
|
+ plugin.getName(),
|
||||||
@ -365,8 +366,7 @@ public class Metrics {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
}).start();
|
||||||
.start();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -376,7 +376,8 @@ public class Metrics {
|
|||||||
* @param data The data to send.
|
* @param data The data to send.
|
||||||
* @throws Exception If the request failed.
|
* @throws Exception If the request failed.
|
||||||
*/
|
*/
|
||||||
private static void sendData(Plugin plugin, JsonObject data) throws Exception {
|
private static void sendData(Plugin plugin, JsonObject data)
|
||||||
|
throws Exception {
|
||||||
if (data == null) {
|
if (data == null) {
|
||||||
throw new IllegalArgumentException("Data cannot be null!");
|
throw new IllegalArgumentException("Data cannot be null!");
|
||||||
}
|
}
|
||||||
@ -385,9 +386,11 @@ public class Metrics {
|
|||||||
"This method must not be called from the main thread!");
|
"This method must not be called from the main thread!");
|
||||||
}
|
}
|
||||||
if (logSentData) {
|
if (logSentData) {
|
||||||
plugin.getLogger().info("Sending data to bStats: " + data.toString());
|
plugin.getLogger().info("Sending data to bStats: "
|
||||||
|
+ data.toString());
|
||||||
}
|
}
|
||||||
HttpsURLConnection connection = (HttpsURLConnection) new URL(URL).openConnection();
|
HttpsURLConnection connection =
|
||||||
|
(HttpsURLConnection) new URL(URL).openConnection();
|
||||||
|
|
||||||
// Compress the data to save bandwidth
|
// Compress the data to save bandwidth
|
||||||
byte[] compressedData = compress(data.toString());
|
byte[] compressedData = compress(data.toString());
|
||||||
@ -396,21 +399,27 @@ public class Metrics {
|
|||||||
connection.setRequestMethod("POST");
|
connection.setRequestMethod("POST");
|
||||||
connection.addRequestProperty("Accept", "application/json");
|
connection.addRequestProperty("Accept", "application/json");
|
||||||
connection.addRequestProperty("Connection", "close");
|
connection.addRequestProperty("Connection", "close");
|
||||||
connection.addRequestProperty("Content-Encoding", "gzip"); // We gzip our request
|
connection.addRequestProperty("Content-Encoding",
|
||||||
connection.addRequestProperty("Content-Length", String.valueOf(compressedData.length));
|
"gzip"); // We gzip our request
|
||||||
|
connection.addRequestProperty("Content-Length",
|
||||||
|
String.valueOf(compressedData.length));
|
||||||
connection.setRequestProperty(
|
connection.setRequestProperty(
|
||||||
"Content-Type", "application/json"); // We send our data in JSON format
|
"Content-Type",
|
||||||
connection.setRequestProperty("User-Agent", "MC-Server/" + B_STATS_VERSION);
|
"application/json"); // We send our data in JSON format
|
||||||
|
connection.setRequestProperty("User-Agent",
|
||||||
|
"MC-Server/" + B_STATS_VERSION);
|
||||||
|
|
||||||
// Send data
|
// Send data
|
||||||
connection.setDoOutput(true);
|
connection.setDoOutput(true);
|
||||||
DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
|
DataOutputStream outputStream =
|
||||||
|
new DataOutputStream(connection.getOutputStream());
|
||||||
outputStream.write(compressedData);
|
outputStream.write(compressedData);
|
||||||
outputStream.flush();
|
outputStream.flush();
|
||||||
outputStream.close();
|
outputStream.close();
|
||||||
|
|
||||||
InputStream inputStream = connection.getInputStream();
|
InputStream inputStream = connection.getInputStream();
|
||||||
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
|
BufferedReader bufferedReader =
|
||||||
|
new BufferedReader(new InputStreamReader(inputStream));
|
||||||
|
|
||||||
StringBuilder builder = new StringBuilder();
|
StringBuilder builder = new StringBuilder();
|
||||||
String line;
|
String line;
|
||||||
@ -419,8 +428,9 @@ public class Metrics {
|
|||||||
}
|
}
|
||||||
bufferedReader.close();
|
bufferedReader.close();
|
||||||
if (logResponseStatusText) {
|
if (logResponseStatusText) {
|
||||||
plugin.getLogger()
|
plugin.getLogger().info(
|
||||||
.info("Sent data to bStats and received response: " + builder.toString());
|
"Sent data to bStats and received response: "
|
||||||
|
+ builder.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -442,9 +452,10 @@ public class Metrics {
|
|||||||
return outputStream.toByteArray();
|
return outputStream.toByteArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Represents a custom chart. */
|
/**
|
||||||
|
* Represents a custom chart.
|
||||||
|
*/
|
||||||
public abstract static class CustomChart {
|
public abstract static class CustomChart {
|
||||||
|
|
||||||
// The id of the chart
|
// The id of the chart
|
||||||
final String chartId;
|
final String chartId;
|
||||||
|
|
||||||
@ -455,7 +466,8 @@ public class Metrics {
|
|||||||
*/
|
*/
|
||||||
CustomChart(String chartId) {
|
CustomChart(String chartId) {
|
||||||
if (chartId == null || chartId.isEmpty()) {
|
if (chartId == null || chartId.isEmpty()) {
|
||||||
throw new IllegalArgumentException("ChartId cannot be null or empty!");
|
throw new IllegalArgumentException(
|
||||||
|
"ChartId cannot be null or empty!");
|
||||||
}
|
}
|
||||||
this.chartId = chartId;
|
this.chartId = chartId;
|
||||||
}
|
}
|
||||||
@ -472,10 +484,10 @@ public class Metrics {
|
|||||||
chart.add("data", data);
|
chart.add("data", data);
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
if (logFailedRequests) {
|
if (logFailedRequests) {
|
||||||
Bukkit.getLogger()
|
Bukkit.getLogger().log(
|
||||||
.log(
|
|
||||||
Level.WARNING,
|
Level.WARNING,
|
||||||
"Failed to get data for custom chart with id " + chartId,
|
"Failed to get data for custom chart with id "
|
||||||
|
+ chartId,
|
||||||
t);
|
t);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
@ -486,9 +498,10 @@ public class Metrics {
|
|||||||
protected abstract JsonObject getChartData() throws Exception;
|
protected abstract JsonObject getChartData() throws Exception;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Represents a custom simple pie. */
|
/**
|
||||||
|
* Represents a custom simple pie.
|
||||||
|
*/
|
||||||
public static class SimplePie extends CustomChart {
|
public static class SimplePie extends CustomChart {
|
||||||
|
|
||||||
private final Callable<String> callable;
|
private final Callable<String> callable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -515,9 +528,10 @@ public class Metrics {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Represents a custom advanced pie. */
|
/**
|
||||||
|
* Represents a custom advanced pie.
|
||||||
|
*/
|
||||||
public static class AdvancedPie extends CustomChart {
|
public static class AdvancedPie extends CustomChart {
|
||||||
|
|
||||||
private final Callable<Map<String, Integer>> callable;
|
private final Callable<Map<String, Integer>> callable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -526,7 +540,8 @@ public class Metrics {
|
|||||||
* @param chartId The id of the chart.
|
* @param chartId The id of the chart.
|
||||||
* @param callable The callable which is used to request the chart data.
|
* @param callable The callable which is used to request the chart data.
|
||||||
*/
|
*/
|
||||||
public AdvancedPie(String chartId, Callable<Map<String, Integer>> callable) {
|
public AdvancedPie(String chartId,
|
||||||
|
Callable<Map<String, Integer>> callable) {
|
||||||
super(chartId);
|
super(chartId);
|
||||||
this.callable = callable;
|
this.callable = callable;
|
||||||
}
|
}
|
||||||
@ -557,9 +572,10 @@ public class Metrics {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Represents a custom drilldown pie. */
|
/**
|
||||||
|
* Represents a custom drilldown pie.
|
||||||
|
*/
|
||||||
public static class DrilldownPie extends CustomChart {
|
public static class DrilldownPie extends CustomChart {
|
||||||
|
|
||||||
private final Callable<Map<String, Map<String, Integer>>> callable;
|
private final Callable<Map<String, Map<String, Integer>>> callable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -568,7 +584,9 @@ public class Metrics {
|
|||||||
* @param chartId The id of the chart.
|
* @param chartId The id of the chart.
|
||||||
* @param callable The callable which is used to request the chart data.
|
* @param callable The callable which is used to request the chart data.
|
||||||
*/
|
*/
|
||||||
public DrilldownPie(String chartId, Callable<Map<String, Map<String, Integer>>> callable) {
|
public DrilldownPie(
|
||||||
|
String chartId,
|
||||||
|
Callable<Map<String, Map<String, Integer>>> callable) {
|
||||||
super(chartId);
|
super(chartId);
|
||||||
this.callable = callable;
|
this.callable = callable;
|
||||||
}
|
}
|
||||||
@ -583,12 +601,14 @@ public class Metrics {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
boolean reallyAllSkipped = true;
|
boolean reallyAllSkipped = true;
|
||||||
for (Map.Entry<String, Map<String, Integer>> entryValues : map.entrySet()) {
|
for (Map.Entry<String, Map<String, Integer>> entryValues :
|
||||||
|
map.entrySet()) {
|
||||||
JsonObject value = new JsonObject();
|
JsonObject value = new JsonObject();
|
||||||
boolean allSkipped = true;
|
boolean allSkipped = true;
|
||||||
for (Map.Entry<String, Integer> valueEntry :
|
for (Map.Entry<String, Integer> valueEntry :
|
||||||
map.get(entryValues.getKey()).entrySet()) {
|
map.get(entryValues.getKey()).entrySet()) {
|
||||||
value.addProperty(valueEntry.getKey(), valueEntry.getValue());
|
value.addProperty(valueEntry.getKey(),
|
||||||
|
valueEntry.getValue());
|
||||||
allSkipped = false;
|
allSkipped = false;
|
||||||
}
|
}
|
||||||
if (!allSkipped) {
|
if (!allSkipped) {
|
||||||
@ -605,9 +625,10 @@ public class Metrics {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Represents a custom single line chart. */
|
/**
|
||||||
|
* Represents a custom single line chart.
|
||||||
|
*/
|
||||||
public static class SingleLineChart extends CustomChart {
|
public static class SingleLineChart extends CustomChart {
|
||||||
|
|
||||||
private final Callable<Integer> callable;
|
private final Callable<Integer> callable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -634,9 +655,10 @@ public class Metrics {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Represents a custom multi line chart. */
|
/**
|
||||||
|
* Represents a custom multi line chart.
|
||||||
|
*/
|
||||||
public static class MultiLineChart extends CustomChart {
|
public static class MultiLineChart extends CustomChart {
|
||||||
|
|
||||||
private final Callable<Map<String, Integer>> callable;
|
private final Callable<Map<String, Integer>> callable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -645,7 +667,8 @@ public class Metrics {
|
|||||||
* @param chartId The id of the chart.
|
* @param chartId The id of the chart.
|
||||||
* @param callable The callable which is used to request the chart data.
|
* @param callable The callable which is used to request the chart data.
|
||||||
*/
|
*/
|
||||||
public MultiLineChart(String chartId, Callable<Map<String, Integer>> callable) {
|
public MultiLineChart(String chartId,
|
||||||
|
Callable<Map<String, Integer>> callable) {
|
||||||
super(chartId);
|
super(chartId);
|
||||||
this.callable = callable;
|
this.callable = callable;
|
||||||
}
|
}
|
||||||
@ -676,9 +699,10 @@ public class Metrics {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Represents a custom simple bar chart. */
|
/**
|
||||||
|
* Represents a custom simple bar chart.
|
||||||
|
*/
|
||||||
public static class SimpleBarChart extends CustomChart {
|
public static class SimpleBarChart extends CustomChart {
|
||||||
|
|
||||||
private final Callable<Map<String, Integer>> callable;
|
private final Callable<Map<String, Integer>> callable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -687,7 +711,8 @@ public class Metrics {
|
|||||||
* @param chartId The id of the chart.
|
* @param chartId The id of the chart.
|
||||||
* @param callable The callable which is used to request the chart data.
|
* @param callable The callable which is used to request the chart data.
|
||||||
*/
|
*/
|
||||||
public SimpleBarChart(String chartId, Callable<Map<String, Integer>> callable) {
|
public SimpleBarChart(String chartId,
|
||||||
|
Callable<Map<String, Integer>> callable) {
|
||||||
super(chartId);
|
super(chartId);
|
||||||
this.callable = callable;
|
this.callable = callable;
|
||||||
}
|
}
|
||||||
@ -711,9 +736,10 @@ public class Metrics {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Represents a custom advanced bar chart. */
|
/**
|
||||||
|
* Represents a custom advanced bar chart.
|
||||||
|
*/
|
||||||
public static class AdvancedBarChart extends CustomChart {
|
public static class AdvancedBarChart extends CustomChart {
|
||||||
|
|
||||||
private final Callable<Map<String, int[]>> callable;
|
private final Callable<Map<String, int[]>> callable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -722,7 +748,8 @@ public class Metrics {
|
|||||||
* @param chartId The id of the chart.
|
* @param chartId The id of the chart.
|
||||||
* @param callable The callable which is used to request the chart data.
|
* @param callable The callable which is used to request the chart data.
|
||||||
*/
|
*/
|
||||||
public AdvancedBarChart(String chartId, Callable<Map<String, int[]>> callable) {
|
public AdvancedBarChart(String chartId,
|
||||||
|
Callable<Map<String, int[]>> callable) {
|
||||||
super(chartId);
|
super(chartId);
|
||||||
this.callable = callable;
|
this.callable = callable;
|
||||||
}
|
}
|
||||||
|
@ -1,37 +1,39 @@
|
|||||||
package com.sekwah.advancedportals.spigot.reflection;
|
package com.sekwah.advancedportals.spigot.reflection;
|
||||||
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Constructor;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Just a util class to force spigot to allow us to have fun with the minecraft: channel category
|
* Just a util class to force spigot to allow us to have fun with the
|
||||||
|
* minecraft: channel category
|
||||||
*
|
*
|
||||||
* <p>Atm at least this is just designed to be able to access debug/ for showing visuals of the
|
* <p>Atm at least this is just designed to be able to access debug/ for
|
||||||
* portals and such
|
* showing visuals of the portals and such
|
||||||
*/
|
*/
|
||||||
public class MinecraftCustomPayload {
|
public class MinecraftCustomPayload {
|
||||||
|
public static boolean sendCustomPayload(Player player, String channel,
|
||||||
public static boolean sendCustomPayload(Player player, String channel, byte[] data) {
|
byte[] data) {
|
||||||
try {
|
try {
|
||||||
// Access the MinecraftKey class using reflection
|
// Access the MinecraftKey class using reflection
|
||||||
Class<?> minecraftKeyClass = Class.forName("net.minecraft.resources.MinecraftKey");
|
Class<?> minecraftKeyClass =
|
||||||
Constructor<?> minecraftKeyConstructor = minecraftKeyClass.getConstructor(String.class);
|
Class.forName("net.minecraft.resources.MinecraftKey");
|
||||||
|
Constructor<?> minecraftKeyConstructor =
|
||||||
|
minecraftKeyClass.getConstructor(String.class);
|
||||||
|
|
||||||
// Create an instance of MinecraftKey with the channel name
|
// Create an instance of MinecraftKey with the channel name
|
||||||
Object minecraftKey = minecraftKeyConstructor.newInstance(channel);
|
Object minecraftKey = minecraftKeyConstructor.newInstance(channel);
|
||||||
|
|
||||||
// Access the sendCustomPayload method in the CraftPlayer class
|
// Access the sendCustomPayload method in the CraftPlayer class
|
||||||
Method sendCustomPayloadMethod =
|
Method sendCustomPayloadMethod =
|
||||||
player.getClass()
|
player.getClass().getDeclaredMethod(
|
||||||
.getDeclaredMethod(
|
|
||||||
"sendCustomPayload", minecraftKeyClass, byte[].class);
|
"sendCustomPayload", minecraftKeyClass, byte[].class);
|
||||||
|
|
||||||
// Make the private method accessible
|
// Make the private method accessible
|
||||||
sendCustomPayloadMethod.setAccessible(true);
|
sendCustomPayloadMethod.setAccessible(true);
|
||||||
|
|
||||||
// Invoke the sendCustomPayload method with the MinecraftKey and data
|
// Invoke the sendCustomPayload method with the MinecraftKey and
|
||||||
|
// data
|
||||||
sendCustomPayloadMethod.invoke(player, minecraftKey, data);
|
sendCustomPayloadMethod.invoke(player, minecraftKey, data);
|
||||||
|
|
||||||
return true; // Successfully sent the custom payload
|
return true; // Successfully sent the custom payload
|
||||||
|
@ -2,23 +2,17 @@ package com.sekwah.advancedportals.spigot.utils;
|
|||||||
|
|
||||||
import com.sekwah.advancedportals.core.serializeddata.BlockLocation;
|
import com.sekwah.advancedportals.core.serializeddata.BlockLocation;
|
||||||
import com.sekwah.advancedportals.core.serializeddata.PlayerLocation;
|
import com.sekwah.advancedportals.core.serializeddata.PlayerLocation;
|
||||||
|
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
|
|
||||||
public class ContainerHelpers {
|
public class ContainerHelpers {
|
||||||
|
|
||||||
public static PlayerLocation toPlayerLocation(Location loc) {
|
public static PlayerLocation toPlayerLocation(Location loc) {
|
||||||
return new PlayerLocation(
|
return new PlayerLocation(loc.getWorld().getName(), loc.getX(),
|
||||||
loc.getWorld().getName(),
|
loc.getY(), loc.getZ(), loc.getYaw(),
|
||||||
loc.getX(),
|
|
||||||
loc.getY(),
|
|
||||||
loc.getZ(),
|
|
||||||
loc.getYaw(),
|
|
||||||
loc.getPitch());
|
loc.getPitch());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static BlockLocation toBlockLocation(Location loc) {
|
public static BlockLocation toBlockLocation(Location loc) {
|
||||||
return new BlockLocation(
|
return new BlockLocation(loc.getWorld().getName(), loc.getBlockX(),
|
||||||
loc.getWorld().getName(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ());
|
loc.getBlockY(), loc.getBlockZ());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,27 +8,31 @@ import com.sekwah.advancedportals.spigot.connector.container.SpigotPlayerContain
|
|||||||
import org.bukkit.Effect;
|
import org.bukkit.Effect;
|
||||||
|
|
||||||
public class EnderWarpEffect implements WarpEffect.Visual, WarpEffect.Sound {
|
public class EnderWarpEffect implements WarpEffect.Visual, WarpEffect.Sound {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onWarpSound(PlayerContainer playerContainer, WarpEffect.Action action) {
|
public void onWarpSound(PlayerContainer playerContainer,
|
||||||
if(playerContainer instanceof SpigotPlayerContainer spigotPlayerContainer) {
|
WarpEffect.Action action) {
|
||||||
|
if (playerContainer
|
||||||
|
instanceof SpigotPlayerContainer spigotPlayerContainer) {
|
||||||
var player = spigotPlayerContainer.getPlayer();
|
var player = spigotPlayerContainer.getPlayer();
|
||||||
|
|
||||||
player.getWorld().playSound(player.getLocation(), "entity.enderman.teleport", 1, 1);
|
player.getWorld().playSound(player.getLocation(),
|
||||||
|
"entity.enderman.teleport", 1, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onWarpVisual(PlayerContainer playerContainer, WarpEffect.Action action) {
|
public void onWarpVisual(PlayerContainer playerContainer,
|
||||||
if(playerContainer instanceof SpigotPlayerContainer spigotPlayerContainer) {
|
WarpEffect.Action action) {
|
||||||
|
if (playerContainer
|
||||||
|
instanceof SpigotPlayerContainer spigotPlayerContainer) {
|
||||||
var player = spigotPlayerContainer.getPlayer();
|
var player = spigotPlayerContainer.getPlayer();
|
||||||
var world = player.getWorld();
|
var world = player.getWorld();
|
||||||
var loc = player.getLocation().clone();
|
var loc = player.getLocation().clone();
|
||||||
for(int i = 0; i < 10; i++){
|
for (int i = 0; i < 10; i++) {
|
||||||
world.playEffect(loc, Effect.ENDER_SIGNAL, 0);
|
world.playEffect(loc, Effect.ENDER_SIGNAL, 0);
|
||||||
}
|
}
|
||||||
loc.add(0D, 1D, 0D);
|
loc.add(0D, 1D, 0D);
|
||||||
for(int i = 0; i < 10; i++){
|
for (int i = 0; i < 10; i++) {
|
||||||
world.playEffect(loc, Effect.ENDER_SIGNAL, 0);
|
world.playEffect(loc, Effect.ENDER_SIGNAL, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,9 @@
|
|||||||
package com.sekwah.advancedportals.spigot.warpeffects;
|
package com.sekwah.advancedportals.spigot.warpeffects;
|
||||||
|
|
||||||
import com.sekwah.advancedportals.core.registry.WarpEffectRegistry;
|
import com.sekwah.advancedportals.core.registry.WarpEffectRegistry;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
public class SpigotWarpEffects {
|
public class SpigotWarpEffects {
|
||||||
|
|
||||||
@Inject private WarpEffectRegistry warpEffectRegistry;
|
@Inject private WarpEffectRegistry warpEffectRegistry;
|
||||||
|
|
||||||
public void registerEffects() {
|
public void registerEffects() {
|
||||||
|
Loading…
Reference in New Issue
Block a user