teleport during event + extraEffects addon

- portals addon can force ignore delay and cooldowns
- Rtp commands were moved after a command was actually executed, fixing addons reload
This commit is contained in:
SuperRonanCraft 2020-11-19 17:30:43 -05:00
parent 212b000a35
commit 462b2fa6be
17 changed files with 352 additions and 22 deletions

View File

@ -4,6 +4,7 @@ import me.SuperRonanCraft.BetterRTP.BetterRTP;
import me.SuperRonanCraft.BetterRTPAddons.addons.flashback.AddonFlashback;
import me.SuperRonanCraft.BetterRTPAddons.addons.interfaces.AddonInterface;
import me.SuperRonanCraft.BetterRTPAddons.addons.logger.AddonLogger;
import me.SuperRonanCraft.BetterRTPAddons.addons.magicStick.AddonMagicStick;
import me.SuperRonanCraft.BetterRTPAddons.addons.portals.AddonPortals;
import java.util.ArrayList;
@ -39,6 +40,7 @@ public class AddonsHandler {
FLASH_BACK(new AddonFlashback()),
PORTALS(new AddonPortals()),
//INTERFACES(new AddonInterface())
MAGICSTICK(new AddonMagicStick()),
;
Addon addon;

View File

@ -0,0 +1,58 @@
package me.SuperRonanCraft.BetterRTPAddons.addons.extraEffects;
import me.SuperRonanCraft.BetterRTPAddons.Addon;
import me.SuperRonanCraft.BetterRTPAddons.util.Files;
import org.bukkit.event.Listener;
import java.util.ArrayList;
import java.util.List;
public class AddonExtraEffects implements Addon {
private final String name = "ExtraEffects";
private final List<Effects> effects = new ArrayList<>(); //List of enabled effects
@Override
public boolean isEnabled() {
return getFile(Files.FILETYPE.CONFIG).getBoolean(name + ".Enabled");
}
@Override
public void load() {
this.effects.clear();
for (Effects effect : Effects.values())
if (effect.isEnabled()) {
effect.load();
this.effects.add(effect);
}
}
@Override
public void unload() {
for (Effects effect : this.effects)
effect.unload();
this.effects.clear();
}
enum Effects {
SKYHIGH(new ExtraEffectsEffect_Skyhigh());
private final ExtraEffectsEffect effect;
Effects(ExtraEffectsEffect effect) {
this.effect = effect;
}
boolean isEnabled() {
return effect.isEnabled();
}
void load() {
effect.load();
}
void unload() {
effect.unload();
}
}
}

View File

@ -0,0 +1,11 @@
package me.SuperRonanCraft.BetterRTPAddons.addons.extraEffects;
public interface ExtraEffectsEffect {
void load();
boolean isEnabled();
void unload();
}

View File

@ -0,0 +1,36 @@
package me.SuperRonanCraft.BetterRTPAddons.addons.extraEffects;
import me.SuperRonanCraft.BetterRTP.references.customEvents.RTP_TeleportEvent;
import me.SuperRonanCraft.BetterRTPAddons.Main;
import me.SuperRonanCraft.BetterRTPAddons.util.Files;
import org.bukkit.event.EventHandler;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
//Teleport the player VERY high into the sky
public class ExtraEffectsEffect_Skyhigh implements ExtraEffectsEffect, Listener {
private int offset;
@Override
public void load() {
Files.FILETYPE file = Main.getInstance().getFiles().getType(Files.FILETYPE.CONFIG);
this.offset = file.getInt("ExtraEffects.YOffset.Offset");
Main.getInstance().getServer().getPluginManager().registerEvents(this, Main.getInstance());
}
@Override
public boolean isEnabled() {
return Main.getInstance().getFiles().getType(Files.FILETYPE.CONFIG).getBoolean("ExtraEffects.YOffset.Enabled");
}
@Override
public void unload() {
HandlerList.unregisterAll(this);
}
@EventHandler
void tpEvent(RTP_TeleportEvent e) {
e.changeLocation(e.getLocation().add(0, offset, 0));
}
}

View File

@ -106,10 +106,10 @@ public class FlashbackDatabase extends Database {
);
UUID id = p.getUniqueId();
ps.setString(1, id.toString());
ps.setInt(2, timeGoal.intValue());
ps.setLong(2, timeGoal);
String serialLocation = LocSerialization.getStringFromLocation(oldLocation);
ps.setString(3, serialLocation);
ps.setInt(4, timeGoal.intValue());
ps.setLong(4, timeGoal);
ps.setString(5, serialLocation);
ps.executeUpdate();
} catch (SQLException ex) {

View File

@ -0,0 +1,28 @@
package me.SuperRonanCraft.BetterRTPAddons.addons.magicStick;
import me.SuperRonanCraft.BetterRTP.BetterRTP;
import me.SuperRonanCraft.BetterRTPAddons.Addon;
import me.SuperRonanCraft.BetterRTPAddons.Main;
import me.SuperRonanCraft.BetterRTPAddons.addons.magicStick.cmds.MagicStickCommand;
import me.SuperRonanCraft.BetterRTPAddons.util.Files;
public class AddonMagicStick implements Addon {
public MagicStickMessages msgs = new MagicStickMessages();
MagicStickCommand cmd = new MagicStickCommand(this);
@Override
public boolean isEnabled() {
return Main.getInstance().getFiles().getType(Files.FILETYPE.CONFIG).getBoolean("MagicStick.Enabled");
}
@Override
public void load() {
BetterRTP.getInstance().getCmd().registerCommand(cmd, false);
}
@Override
public void unload() {
}
}

View File

@ -0,0 +1,17 @@
package me.SuperRonanCraft.BetterRTPAddons.addons.magicStick;
import me.SuperRonanCraft.BetterRTPAddons.AddonsMessages;
import org.bukkit.command.CommandSender;
public class MagicStickMessages implements AddonsMessages {
private static final String preM = "MagicStick.";
public String getHelp() {
return getLang().getString("Help.MagicStick");
}
//Give
public void getGive(CommandSender sendi, String name) {
sms(sendi, getLang().getString(preM + "Give").replace("%name%", name));
}
}

View File

@ -0,0 +1,67 @@
package me.SuperRonanCraft.BetterRTPAddons.addons.magicStick.cmds;
import me.SuperRonanCraft.BetterRTP.BetterRTP;
import me.SuperRonanCraft.BetterRTP.player.commands.RTPCommand;
import me.SuperRonanCraft.BetterRTP.player.commands.RTPCommandHelpable;
import me.SuperRonanCraft.BetterRTPAddons.addons.magicStick.AddonMagicStick;
import org.bukkit.command.CommandSender;
import java.util.ArrayList;
import java.util.List;
public class MagicStickCommand implements RTPCommand, RTPCommandHelpable {
AddonMagicStick pl;
public MagicStickCommand(AddonMagicStick pl) {
this.pl = pl;
}
public String getName() {
return "magicstick";
}
@Override
public void execute(CommandSender sendi, String label, String[] args) {
if (args.length > 1)
for (subCmd subCmd : subCmd.values()) {
if (args[1].equalsIgnoreCase(subCmd.name())) {
subCmd.cmd.execute(sendi, label, args, pl);
return;
}
}
sendi.sendMessage("Invalid argument!");
}
@Override
public List<String> tabComplete(CommandSender sendi, String[] args) {
List<String> list = new ArrayList<>();
if (args.length == 2)
for (subCmd subCmd : subCmd.values()) {
if (subCmd.name().toLowerCase().startsWith(args[1].toLowerCase())) {
list.add(subCmd.name().toLowerCase());
}
}
return list;
}
@Override
public boolean permission(CommandSender sendi) {
return BetterRTP.getInstance().getPerms().checkPerm("betterrtp.addon.portals", sendi);
}
@Override
public String getHelp() {
return pl.msgs.getHelp();
}
private enum subCmd {
GIVE(new MagicStickCommand_Give());
MagicStickCommands cmd;
subCmd(MagicStickCommands cmd) {
this.cmd = cmd;
}
}
}

View File

@ -0,0 +1,14 @@
package me.SuperRonanCraft.BetterRTPAddons.addons.magicStick.cmds;
import me.SuperRonanCraft.BetterRTPAddons.addons.magicStick.AddonMagicStick;
import me.SuperRonanCraft.BetterRTPAddons.addons.portals.AddonPortals;
import me.SuperRonanCraft.BetterRTPAddons.addons.portals.region.PortalsRegionInfo;
import org.bukkit.command.CommandSender;
public class MagicStickCommand_Give implements MagicStickCommands {
@Override
public void execute(CommandSender sendi, String label, String[] args, AddonMagicStick addon) {
sendi.sendMessage("magicstick give command!");
}
}

View File

@ -0,0 +1,10 @@
package me.SuperRonanCraft.BetterRTPAddons.addons.magicStick.cmds;
import me.SuperRonanCraft.BetterRTPAddons.addons.magicStick.AddonMagicStick;
import org.bukkit.command.CommandSender;
public interface MagicStickCommands {
void execute(CommandSender sendi, String label, String[] args, AddonMagicStick addonPortals);
}

View File

@ -24,7 +24,7 @@ public class AddonPortals implements Addon {
public void load() {
BetterRTP.getInstance().getCmd().registerCommand(cmd, false);
database.load(PortalsDatabase.Columns.values());
events.register();
events.load();
portalsCache.load();
}

View File

@ -5,6 +5,7 @@ import me.SuperRonanCraft.BetterRTP.player.rtp.RTP_TYPE;
import me.SuperRonanCraft.BetterRTP.references.customEvents.RTP_TeleportPostEvent;
import me.SuperRonanCraft.BetterRTPAddons.Main;
import me.SuperRonanCraft.BetterRTPAddons.addons.portals.region.PortalsRegionInfo;
import me.SuperRonanCraft.BetterRTPAddons.util.Files;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@ -20,13 +21,16 @@ public class PortalsEvents implements Listener {
AddonPortals addonPortals;
private final HashMap<Player, PortalsRegionInfo> playerPortaling = new HashMap<>();
private boolean ignoreDelay, ignoreCooldown;
PortalsEvents(AddonPortals addonPortals) {
this.addonPortals = addonPortals;
}
public void register() {
public void load() {
Main.getInstance().getServer().getPluginManager().registerEvents(this, Main.getInstance());
ignoreDelay = Main.getInstance().getFiles().getType(Files.FILETYPE.CONFIG).getBoolean("Portals.IgnoreDelay");
ignoreCooldown = Main.getInstance().getFiles().getType(Files.FILETYPE.CONFIG).getBoolean("Portals.IgnoreCooldown");
}
public void unregiter() {
@ -52,7 +56,7 @@ public class PortalsEvents implements Listener {
&& ploc.getBlockY() >= Math.min(loc1.getBlockY(), loc2.getBlockY())) {
playerPortaling.put(e.getPlayer(), portal);
BetterRTP.getInstance().getCmd().tp(e.getPlayer(), e.getPlayer(),
e.getPlayer().getWorld().getName(), null, RTP_TYPE.ADDON);
e.getPlayer().getWorld().getName(), null, RTP_TYPE.ADDON, ignoreCooldown, ignoreDelay);
return;
}
}

View File

@ -1,5 +1,6 @@
Language-File: 'en.yml'
#Addon Flashback
##Addon Flashback
Flashback:
Enabled: true
Timer:
@ -7,11 +8,37 @@ Flashback:
Warnings: #Warning messages to send to a player when X amount of time is left
- 5: "&eYou have 5 seconds left! Grab all your materials quick!"
- 1: "&eHang on!"
#Addon Logger
##Addon Logger
Logger:
Enabled: true
LogToConsole: true
Format: 'yyyy-MM-dd HH:mm:ss'
#Addon Portals
##Addon Portals
Portals:
Enabled: true
Enabled: true
IgnoreDelay: true
IgnoreCooldown: true
##Addon ExtraEffects
ExtraEffects:
Enabled: true
YOffset:
Enabled: true
Offset: 50
##Addon MagicStick
MagicStick:
Enabled: false
GiveFirstJoin:
Enabled: true
Amount: 1
Item:
Name: '&d&lMagic RTP Stick &8(Right-Click)'
Material: 'Stick'
Lore:
- ''
- '&7Right click this stick and unlock'
- '&7a brand new adventure!'
Take: true

View File

@ -17,6 +17,8 @@ Portals:
Prefix: '&e&m-----&6&l BetterRTP &7&lAddons &8| Portals List &e&m-----'
Portal: ' &7- &6%name% &8| &7%location%'
None: '&7There are no portals! &8Create one with `/rtp portals create`'
MagicStick:
Give: '&7Magic Stick has been given to &a%player%'
Usage:
Portals:
@ -24,4 +26,5 @@ Usage:
Help:
Portals: ' &7- &e/%command% portals <loc1, loc2, create> &7- Setup an rtp portal'
Portals: ' &7- &e/%command% portals <loc1, loc2, create> &7- Setup an rtp portal'
MagicStick: ' &7- &e/%command% magicstick give [player] &7- Give a magic stick to a player'

View File

@ -48,9 +48,9 @@ public class Commands {
for (RTPCommand cmd : commands) {
if (cmd.getName().equalsIgnoreCase(args[0])) {
if (cmd.permission(sendi)) {
cmd.execute(sendi, label, args);
//Command Event
Bukkit.getServer().getPluginManager().callEvent(new RTP_CommandEvent(sendi, cmd));
cmd.execute(sendi, label, args);
} else
noPerm(sendi);
return;
@ -137,21 +137,32 @@ public class Commands {
}
public void tp(Player player, CommandSender sendi, String world, List<String> biomes, RTP_TYPE rtpType) {
if (checkDelay(sendi, player)) { //Cooling down or rtp'ing
boolean delay = false;
if (sendi == player) //Forced?
if (pl.getSettings().delayEnabled && delayTimer > 0) //Delay enabled?
if (!pl.getPerms().getBypassDelay(player)) //Can bypass?
delay = true;
pl.getRTP().start(player, sendi, world, biomes, delay, rtpType);
this.tp(player, sendi, world, biomes, rtpType, false, false);
}
public void tp(Player player, CommandSender sendi, String world, List<String> biomes, RTP_TYPE rtpType, boolean ignoreCooldown, boolean ignoreDelay) {
if (checkRTPing(player, sendi)) { //Is RTP'ing
if (!ignoreCooldown || checkCooldown(sendi, player)) { //Is Cooling down
boolean delay = false;
if (!ignoreDelay && sendi == player) //Forced?
if (pl.getSettings().delayEnabled && delayTimer > 0) //Delay enabled?
if (!pl.getPerms().getBypassDelay(player)) //Can bypass?
delay = true;
pl.getRTP().start(player, sendi, world, biomes, delay, rtpType);
}
}
}
private boolean checkDelay(CommandSender sendi, Player player) {
private boolean checkRTPing(Player player, CommandSender sendi) {
if (rtping.containsKey(player.getUniqueId()) && rtping.get(player.getUniqueId())) {
pl.getText().getAlready(sendi);
return false;
} else if (sendi != player || pl.getPerms().getBypassCooldown(player)) { //Bypassing/Forced?
}
return true;
}
private boolean checkCooldown(CommandSender sendi, Player player) {
if (sendi != player || pl.getPerms().getBypassCooldown(player)) { //Bypassing/Forced?
return true;
} else if (cooldowns.enabled) { //Cooling down?
UUID id = player.getUniqueId();

View File

@ -41,17 +41,20 @@ public class RTPTeleport {
// CompletableFuture.allOf(asyncChunks.toArray(new CompletableFuture[] {})).cancel(true);
// }
void sendPlayer(final CommandSender sendi, final Player p, final Location loc, final int price,
void sendPlayer(final CommandSender sendi, final Player p, final Location location, final int price,
final int attempts) throws NullPointerException {
Location oldLoc = p.getLocation();
loadingTeleport(p, sendi); //Send loading message to player who requested
List<CompletableFuture<Chunk>> asyncChunks = getChunks(loc); //Get a list of chunks
List<CompletableFuture<Chunk>> asyncChunks = getChunks(location); //Get a list of chunks
//playerLoads.put(p, asyncChunks);
CompletableFuture.allOf(asyncChunks.toArray(new CompletableFuture[] {})).thenRun(() -> { //Async chunk load
new BukkitRunnable() { //Run synchronously
@Override
public void run() {
try {
RTP_TeleportEvent event = new RTP_TeleportEvent(p, location);
getPl().getServer().getPluginManager().callEvent(event);
Location loc = event.getLocation();
PaperLib.teleportAsync(p, loc).thenRun(new BukkitRunnable() { //Async teleport
@Override
public void run() {

View File

@ -0,0 +1,39 @@
package me.SuperRonanCraft.BetterRTP.references.customEvents;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
public class RTP_TeleportEvent extends Event {
Player p;
Location loc;
private static final HandlerList handler = new HandlerList();
public RTP_TeleportEvent(Player p, Location loc) {
this.p = p;
this.loc = loc;
}
public Player getPlayer() {
return p;
}
public Location getLocation() {
return loc;
}
@Override
public HandlerList getHandlers() {
return handler;
}
public static HandlerList getHandlerList() {
return handler;
}
public void changeLocation(Location loc) {
this.loc = loc;
}
}