Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions src/main/java/moe/sebiann/system/Classes/TpaRequest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package moe.sebiann.system.Classes;

import moe.sebiann.system.Enums.TpaType;

import java.util.UUID;

public class TpaRequest {

UUID requester;
UUID target;
TpaType type;

//<editor-fold desc="Constructors">
/**
* Makes a new TPA-Request (TPA, Not TPA-HERE)
* @param requester The person who will be teleported
* @param target The person who will be teleported to
*/
public TpaRequest(UUID requester, UUID target) {
this.requester = requester;
this.target = target;
this.type = TpaType.TPA_THERE;
}

/**
* Makes a new TPA-Request
* @param requester The person who will be teleported
* @param target The person who will be teleported to
* @param type The type of request it is TPA or TPA-here
*/
public TpaRequest(UUID requester, UUID target, TpaType type) {
this.requester = requester;
this.target = target;
this.type = type;
}
//</editor-fold>

//<editor-fold desc="Getters">
public UUID getRequester() {
return requester;
}

public UUID getTarget() {
return target;
}

public TpaType getType() {
return type;
}
//</editor-fold>
}
6 changes: 6 additions & 0 deletions src/main/java/moe/sebiann/system/Enums/TpaType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package moe.sebiann.system.Enums;

public enum TpaType {
TPA_THERE,
TPA_HERE
}
1 change: 1 addition & 0 deletions src/main/java/moe/sebiann/system/SystemHomes.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ void registerCommands(){
manager.registerCommand(new HomeCommands());
manager.registerCommand(new WarpCommands());
manager.registerCommand(new SpawnCommand());
manager.registerCommand(new TpaCommands());
}

void commandCompletions(){
Expand Down
234 changes: 234 additions & 0 deletions src/main/java/moe/sebiann/system/commands/TpaCommands.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,234 @@
package moe.sebiann.system.commands;

import co.aikar.commands.BaseCommand;
import co.aikar.commands.annotation.CommandAlias;
import co.aikar.commands.annotation.CommandCompletion;
import moe.sebiann.system.Classes.TpaRequest;
import moe.sebiann.system.Enums.TpaType;
import moe.sebiann.system.SystemHomes;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.event.ClickEvent;
import net.kyori.adventure.text.event.HoverEvent;
import net.kyori.adventure.text.format.TextColor;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

import java.util.ArrayList;
import java.util.List;

public class TpaCommands extends BaseCommand {

List<TpaRequest> tpaRequests = new ArrayList<>();

@CommandAlias("tpa")
@CommandCompletion("@players")
public void tpa(CommandSender sender, String[] args) {
if (!(sender instanceof Player player)) {
sender.sendMessage(Component.text("Only a player can run this command.").color(TextColor.fromHexString("#FF5555")));
return;
}
if(args.length < 1) {
player.sendMessage(Component.text("Please mention a player you'd want to teleport to.").color(TextColor.fromHexString("#FF5555")));
return;
}

Player target = Bukkit.getPlayer(args[0]);
if(target == null) {
player.sendMessage(Component.text("You can not teleport to an offline player.").color(TextColor.fromHexString("#FF5555")));
return;
}
if(target.getUniqueId().equals(player.getUniqueId())) {
player.sendMessage(Component.text("You can not teleport to yourself.").color(TextColor.fromHexString("#FF5555")));
return;
}

for(TpaRequest r : tpaRequests) {
if(r.getRequester().equals(player.getUniqueId())) {
player.sendMessage(Component.text("You already have an outgoing TPA request to this player").color(TextColor.fromHexString("#FF5555")));
return;
}
}

TpaRequest tpaRequest = new TpaRequest(player.getUniqueId(), target.getUniqueId());
tpaRequests.add(tpaRequest);

int timeoutTime = SystemHomes.plugin.getConfig().getInt("warp.request_timeout", 30);
deleteTpaAfterDelay(player, target, timeoutTime, tpaRequest);

player.sendMessage(Component.text("Teleport request sent to ").color(TextColor.fromHexString("#55FF55"))
.append(Component.text(target.getName()).color(TextColor.fromHexString("#00AA00")))
.append(Component.text(".\nRequest will time out in ").color(TextColor.fromHexString("#55FF55")))
.append(Component.text(timeoutTime).color(TextColor.fromHexString("#00AA00")))
.append(Component.text(" seconds.").color(TextColor.fromHexString("#55FF55"))));

target.sendMessage(Component.text(player.getName()).color(TextColor.fromHexString("#00AA00"))
.append(Component.text(" has requested to teleport to you.").color(TextColor.fromHexString("#55FF55")))
.append(Component.text("\nWrite /tpaccept to accept this request.").color(TextColor.fromHexString("#55FF55"))
.clickEvent(ClickEvent.runCommand("/tpaccept"))
.hoverEvent(HoverEvent.showText(Component.text("Accepts the TPA request").color(TextColor.fromHexString("#55FF55")))))
.append(Component.text("\nWrite /tpdeny to deny this request.").color(TextColor.fromHexString("#FF5555"))
.clickEvent(ClickEvent.runCommand("/tpdeny"))
.hoverEvent(HoverEvent.showText(Component.text("Denies the TPA request").color(TextColor.fromHexString("#FF5555"))))));
}

@CommandAlias("tpahere")
@CommandCompletion("@players")
@SuppressWarnings("DuplicatedCode")
public void tpahere(CommandSender sender, String[] args) {
if (!(sender instanceof Player player)) {
sender.sendMessage(Component.text("Only a player can run this command.").color(TextColor.fromHexString("#FF5555")));
return;
}
if(args.length < 1) {
player.sendMessage(Component.text("Please mention a player you'd want to teleport to.").color(TextColor.fromHexString("#FF5555")));
return;
}

Player target = Bukkit.getPlayer(args[0]);
if(target == null) {
player.sendMessage(Component.text("You can not teleport to an offline player.").color(TextColor.fromHexString("#FF5555")));
return;
}
if(target.getUniqueId().equals(player.getUniqueId())) {
player.sendMessage(Component.text("You can not teleport to yourself.").color(TextColor.fromHexString("#FF5555")));
return;
}

TpaRequest tpaRequest = new TpaRequest(player.getUniqueId(), target.getUniqueId(), TpaType.TPA_HERE);
tpaRequests.add(tpaRequest);

int timeoutTime = SystemHomes.plugin.getConfig().getInt("tpa.request_timeout", 30);
deleteTpaAfterDelay(player, target, timeoutTime, tpaRequest);

player.sendMessage(Component.text("Teleport request sent to ").color(TextColor.fromHexString("#55FF55"))
.append(Component.text(target.getName()).color(TextColor.fromHexString("#00AA00")))
.append(Component.text(".\nRequest will time out in ").color(TextColor.fromHexString("#55FF55")))
.append(Component.text(timeoutTime).color(TextColor.fromHexString("#00AA00")))
.append(Component.text(" seconds.").color(TextColor.fromHexString("#55FF55"))));

target.sendMessage(Component.text(player.getName()).color(TextColor.fromHexString("#00AA00"))
.append(Component.text(" has requested you to teleport to them.").color(TextColor.fromHexString("#55FF55")))
.append(Component.text("\nWrite /tpaccept to accept this request.").color(TextColor.fromHexString("#55FF55"))
.clickEvent(ClickEvent.runCommand("/tpaccept"))
.hoverEvent(HoverEvent.showText(Component.text("Accepts the TPA request").color(TextColor.fromHexString("#55FF55")))))
.append(Component.text("\nWrite /tpdeny to deny this request.").color(TextColor.fromHexString("#FF5555"))
.clickEvent(ClickEvent.runCommand("/tpdeny"))
.hoverEvent(HoverEvent.showText(Component.text("Denies the TPA request").color(TextColor.fromHexString("#FF5555"))))));
}

@CommandAlias("tpaccept|tpyes")
@SuppressWarnings("DuplicatedCode")
public void tpaccept(CommandSender sender) {
if (!(sender instanceof Player player)) {
sender.sendMessage(Component.text("Only a player can run this command.").color(TextColor.fromHexString("#FF5555")));
return;
}

TpaRequest tpaRequest = null;
for(TpaRequest r : tpaRequests) {
if(r.getTarget().equals(player.getUniqueId())) {
tpaRequest = r;
break;
}
}
if(tpaRequest == null){
player.sendMessage(Component.text("You don't have any outgoing TPA requests.").color(TextColor.fromHexString("#FF5555")));
return;
}
Player target = Bukkit.getPlayer(tpaRequest.getRequester());

if(target == null) {
player.sendMessage(Component.text("Player is no longer online.").color(TextColor.fromHexString("#FF5555")));
tpaRequests.remove(tpaRequest);
return;
}
int tpTime = SystemHomes.plugin.getConfig().getInt("tpa.teleport_delay", 2);
tpaRequests.remove(tpaRequest);

if (tpaRequest.getType() == TpaType.TPA_HERE) {
player.sendMessage(Component.text("TPA request to ").color(TextColor.fromHexString("#55FF55"))
.append(Component.text(target.getName()).color(TextColor.fromHexString("#00AA00")))
.append(Component.text(" has been accepted.\nYou will be teleported in ").color(TextColor.fromHexString("#55FF55")))
.append(Component.text(tpTime).color(TextColor.fromHexString("#00AA00")))
.append(Component.text(" seconds.").color(TextColor.fromHexString("#55FF55"))));

target.sendMessage(Component.text("The TPA request from ").color(TextColor.fromHexString("#55FF55"))
.append(Component.text(player.getName()).color(TextColor.fromHexString("#00AA00")))
.append(Component.text(" has been accepted.\nThey will be teleported to you in ").color(TextColor.fromHexString("#55FF55")))
.append(Component.text(tpTime).color(TextColor.fromHexString("#00AA00")))
.append(Component.text(" seconds.").color(TextColor.fromHexString("#55FF55"))));

Bukkit.getScheduler().runTaskLater(SystemHomes.plugin, () -> {
player.teleport(target);
}, tpTime * 20L);

} else if (tpaRequest.getType() == TpaType.TPA_THERE) {
target.sendMessage(Component.text("TPA request to ").color(TextColor.fromHexString("#55FF55"))
.append(Component.text(player.getName()).color(TextColor.fromHexString("#00AA00")))
.append(Component.text(" has been accepted.\nYou will be teleported in ").color(TextColor.fromHexString("#55FF55")))
.append(Component.text(tpTime).color(TextColor.fromHexString("#00AA00")))
.append(Component.text(" seconds.").color(TextColor.fromHexString("#55FF55"))));

player.sendMessage(Component.text("The TPA request from ").color(TextColor.fromHexString("#55FF55"))
.append(Component.text(target.getName()).color(TextColor.fromHexString("#00AA00")))
.append(Component.text(" has been accepted.\nThey will be teleported to you in ").color(TextColor.fromHexString("#55FF55")))
.append(Component.text(tpTime).color(TextColor.fromHexString("#00AA00")))
.append(Component.text(" seconds.").color(TextColor.fromHexString("#55FF55"))));

Bukkit.getScheduler().runTaskLater(SystemHomes.plugin, () -> {
target.teleport(player);
}, tpTime * 20L);
}
}

@CommandAlias("tpdeny|tpno")
@SuppressWarnings("DuplicatedCode")
public void tpdeny(CommandSender sender, String[] args) {
if (!(sender instanceof Player player)) {
sender.sendMessage(Component.text("Only a player can run this command.").color(TextColor.fromHexString("#FF5555")));
return;
}

TpaRequest tpaRequest = null;
for(TpaRequest r : tpaRequests) {
if(r.getTarget().equals(player.getUniqueId())) {
tpaRequest = r;
break;
}
}
if(tpaRequest == null){
player.sendMessage(Component.text("You don't have any outgoing TPA requests.").color(TextColor.fromHexString("#FF5555")));
return;
}
Player target = Bukkit.getPlayer(tpaRequest.getRequester());
OfflinePlayer targetOffline = Bukkit.getOfflinePlayer(tpaRequest.getRequester());

tpaRequests.remove(tpaRequest);

player.sendMessage(Component.text("Declined ").color(TextColor.fromHexString("#FF5555"))
.append(Component.text(targetOffline.getName() == null ? "Unknown" : targetOffline.getName()).color(TextColor.fromHexString("#AA0000")))
.append(Component.text("'s TPA request.").color(TextColor.fromHexString("#FF5555"))));

if(target != null){
target.sendMessage(Component.text(player.getName()).color(TextColor.fromHexString("#AA0000"))
.append(Component.text(" declined your TPA request.").color(TextColor.fromHexString("#FF5555"))));
}
}

private void deleteTpaAfterDelay(Player player, Player target, int requestTimeout, TpaRequest tpaRequest) {
Bukkit.getScheduler().runTaskLater(SystemHomes.plugin, () -> {
if(tpaRequests.remove(tpaRequest)){
player.sendMessage(Component.text("TPA Request to ").color(TextColor.fromHexString("#FF5555"))
.append(Component.text(target.getName()).color(TextColor.fromHexString("#AA0000")))
.append(Component.text(" has timed out.").color(TextColor.fromHexString("#FF5555"))));

target.sendMessage(Component.text("TPA Request from ").color(TextColor.fromHexString("#FF5555"))
.append(Component.text(player.getName()).color(TextColor.fromHexString("#AA0000")))
.append(Component.text(" has timed out.").color(TextColor.fromHexString("#FF5555"))));
}
}, requestTimeout * 20L);
}

}
3 changes: 2 additions & 1 deletion src/main/resources/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ home:
warp:
teleport_delay: 2
tpa:
teleport_delay: 2
teleport_delay: 2
request_timeout: 30
Loading