Skip to content

Commit f26869f

Browse files
committed
Improved Freecam Mode and added central handling
1 parent 866489f commit f26869f

File tree

11 files changed

+187
-154
lines changed

11 files changed

+187
-154
lines changed

src/main/java/dev/lars/utilsmanager/UtilsManager.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import dev.lars.utilsmanager.entity.EntitySummons;
66
import dev.lars.utilsmanager.features.backpack.BackpackManager;
77
import dev.lars.utilsmanager.features.court.CourtManager;
8-
import dev.lars.utilsmanager.features.freecam.FreecamListener;
8+
import dev.lars.utilsmanager.features.freecam.FreeCamManager;
99
import dev.lars.utilsmanager.features.maintenance.MaintenanceManager;
1010
import dev.lars.utilsmanager.features.moderation.BanManager;
1111
import dev.lars.utilsmanager.features.moderation.KickManager;
@@ -46,7 +46,7 @@ public final class UtilsManager extends JavaPlugin {
4646
private CourtManager courtManager;
4747
private TeleporterListener teleporterListener;
4848
private BedListener bedListener;
49-
private FreecamListener freecamListener;
49+
private FreeCamManager freeCamManager;
5050
private DiscordBot discordBot;
5151
private KickManager kickManager;
5252
private MaintenanceManager maintenanceManager;
@@ -91,7 +91,7 @@ private void initializeManagers() {
9191
courtManager = new CourtManager();
9292
banManager = new BanManager();
9393
teleporterListener = new TeleporterListener();
94-
freecamListener = new FreecamListener();
94+
freeCamManager = new FreeCamManager();
9595
kickManager = new KickManager();
9696
maintenanceManager = new MaintenanceManager();
9797
playtimeManager = new PlaytimeManager();
@@ -170,8 +170,8 @@ public QuestManager getQuestManager() {
170170
return questManager;
171171
}
172172

173-
public FreecamListener getFreecamListener() {
174-
return freecamListener;
173+
public FreeCamManager getFreeCamManager() {
174+
return freeCamManager;
175175
}
176176

177177
public KickManager getKickManager() {

src/main/java/dev/lars/utilsmanager/commands/teleport/home/SetHomeCommand.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
import dev.lars.apimanager.apis.homeAPI.HomeAPI;
44
import dev.lars.apimanager.apis.languageAPI.LanguageAPI;
55
import dev.lars.utilsmanager.UtilsManager;
6-
import dev.lars.utilsmanager.features.freecam.FreecamListener;
6+
import dev.lars.utilsmanager.features.freecam.FreeCamLeaveListener;
7+
import dev.lars.utilsmanager.features.freecam.FreeCamManager;
78
import dev.lars.utilsmanager.utils.Statements;
89
import io.papermc.paper.command.brigadier.BasicCommand;
910
import io.papermc.paper.command.brigadier.CommandSourceStack;
@@ -30,9 +31,7 @@ public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) {
3031
return;
3132
}
3233

33-
FreecamListener freecamListener = UtilsManager.getInstance().getFreecamListener();
34-
35-
if (freecamListener.getFreeCamUser().containsKey(player.getName())) {
34+
if (UtilsManager.getInstance().getFreeCamManager().isFreeCamPlayer(player)) {
3635
if(LanguageAPI.getApi().getLanguage(player) == 2) {
3736
player.sendMessage(Statements.getPrefix().append(Component.text("Du kannst nicht im Freecam modus einen Home setzten!", NamedTextColor.RED)));
3837
} else {

src/main/java/dev/lars/utilsmanager/features/freecam/FreeCamCloseCommand.java

Lines changed: 0 additions & 53 deletions
This file was deleted.
Lines changed: 17 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package dev.lars.utilsmanager.features.freecam;
22

3-
import com.destroystokyo.paper.profile.PlayerProfile;
43
import dev.lars.apimanager.apis.languageAPI.LanguageAPI;
54
import dev.lars.utilsmanager.UtilsManager;
65
import dev.lars.utilsmanager.utils.Statements;
@@ -9,71 +8,42 @@
98
import net.kyori.adventure.text.Component;
109
import net.kyori.adventure.text.event.ClickEvent;
1110
import net.kyori.adventure.text.format.NamedTextColor;
12-
import org.bukkit.Bukkit;
13-
import org.bukkit.GameMode;
14-
import org.bukkit.Material;
15-
import org.bukkit.entity.ArmorStand;
16-
import org.bukkit.entity.EntityType;
1711
import org.bukkit.entity.Player;
18-
import org.bukkit.inventory.ItemStack;
19-
import org.bukkit.inventory.meta.SkullMeta;
2012
import org.jetbrains.annotations.NotNull;
2113

2214
public class FreeCamCommand implements BasicCommand {
2315

2416
@Override
25-
public void execute(@NotNull CommandSourceStack stack, @NotNull String[] args) {
17+
public void execute(@NotNull CommandSourceStack stack, @NotNull String @NotNull [] args) {
2618
if (!(stack.getExecutor() instanceof Player player)) {
2719
stack.getSender().sendMessage(Statements.getOnlyPlayers());
2820
return;
2921
}
30-
if (!player.hasPermission("utilsmanager.freecam")) {
22+
23+
if (!player.hasPermission("utilsmanager.feature.freecam")) {
3124
player.sendMessage(Statements.getNotAllowed(player));
3225
return;
3326
}
34-
FreecamListener freecamListener = UtilsManager.getInstance().getFreecamListener();
35-
if (freecamListener.getFreeCamUser().containsKey(player.getName())) {
27+
28+
FreeCamManager freeCamManager = UtilsManager.getInstance().getFreeCamManager();
29+
if (!freeCamManager.enterFreeCam(player)) {
3630
if (LanguageAPI.getApi().getLanguage(player) == 2) {
3731
player.sendMessage(Statements.getPrefix().append(Component.text("Du bist bereits im Kamera Modus!", NamedTextColor.RED)));
3832
} else {
3933
player.sendMessage(Statements.getPrefix().append(Component.text("You're already in the Freecam mode!", NamedTextColor.RED)));
4034
}
41-
return;
42-
}
43-
freecamListener.getFreeCamUser().put(player.getName(), player.getLocation());
44-
player.setGameMode(GameMode.SPECTATOR);
45-
46-
ArmorStand armorStand = (ArmorStand) Bukkit.getWorld("world").spawnEntity(player.getLocation(), EntityType.ARMOR_STAND);
47-
armorStand.setVisible(false);
48-
armorStand.setGravity(false);
49-
armorStand.setMarker(true);
50-
armorStand.setPersistent(false);
51-
ItemStack skull = new ItemStack(Material.PLAYER_HEAD);
52-
SkullMeta skullMeta = (SkullMeta) skull.getItemMeta();
53-
if (skullMeta != null) {
54-
PlayerProfile profile = Bukkit.createProfile(player.getUniqueId(), player.getName());
55-
skullMeta.setPlayerProfile(profile);
56-
skull.setItemMeta(skullMeta);
57-
}
58-
freecamListener.getFreeCamArmorStand().put(player.getUniqueId(), armorStand);
59-
60-
armorStand.getEquipment().setHelmet(skull);
61-
if (LanguageAPI.getApi().getLanguage(player) == 2) {
62-
player.sendMessage(Statements.getPrefix().append(Component.text("Du befindest dich nun im Kamera Modus. Benutzte ", NamedTextColor.GREEN))
63-
.append(Component.text("/freecamleave", NamedTextColor.AQUA).clickEvent(ClickEvent.runCommand("freecamleave")))
64-
.append(Component.text(" zum verlassen.", NamedTextColor.GREEN)));
65-
player.sendActionBar(Component.text("Drücke ", NamedTextColor.YELLOW)
66-
.append(Component.text("F", NamedTextColor.AQUA))
67-
.append(Component.text(" um den Freecam-Modus zu verlassen.", NamedTextColor.YELLOW))
68-
);
6935
} else {
70-
player.sendMessage(Statements.getPrefix().append(Component.text("You're now in the cam mode. Use ", NamedTextColor.GREEN))
71-
.append(Component.text("/freecamleave", NamedTextColor.AQUA).clickEvent(ClickEvent.runCommand("freecamleave")))
72-
.append(Component.text(" to leave.", NamedTextColor.GREEN)));
73-
player.sendActionBar(Component.text("Press ", NamedTextColor.YELLOW)
74-
.append(Component.text("F", NamedTextColor.AQUA))
75-
.append(Component.text(" to leave the freecam mode.", NamedTextColor.YELLOW))
76-
);
36+
if (LanguageAPI.getApi().getLanguage(player) == 2) {
37+
player.sendMessage(Statements.getPrefix().append(Component.text("Du befindest dich nun im Kamera Modus. Benutzte ", NamedTextColor.GREEN))
38+
.append(Component.text("/freecamleave", NamedTextColor.AQUA).clickEvent(ClickEvent.runCommand("/freecamleave")))
39+
.append(Component.text(" zum verlassen.", NamedTextColor.GREEN)));
40+
player.sendActionBar(Component.text("Mache einen Mausklick um den Freecam-Modus zu verlassen.", NamedTextColor.AQUA));
41+
} else {
42+
player.sendMessage(Statements.getPrefix().append(Component.text("You're now in the cam mode. Use ", NamedTextColor.GREEN))
43+
.append(Component.text("/freecamleave", NamedTextColor.AQUA).clickEvent(ClickEvent.runCommand("/freecamleave")))
44+
.append(Component.text(" to leave.", NamedTextColor.GREEN)));
45+
player.sendActionBar(Component.text("Click with the mouse to leave the freecam mode.", NamedTextColor.AQUA));
46+
}
7747
}
7848
}
7949
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package dev.lars.utilsmanager.features.freecam;
2+
3+
import dev.lars.apimanager.apis.languageAPI.LanguageAPI;
4+
import dev.lars.utilsmanager.UtilsManager;
5+
import dev.lars.utilsmanager.utils.Statements;
6+
import io.papermc.paper.command.brigadier.BasicCommand;
7+
import io.papermc.paper.command.brigadier.CommandSourceStack;
8+
import net.kyori.adventure.text.Component;
9+
import net.kyori.adventure.text.format.NamedTextColor;
10+
import org.bukkit.entity.Player;
11+
import org.jetbrains.annotations.NotNull;
12+
13+
public class FreeCamLeaveCommand implements BasicCommand {
14+
15+
@Override
16+
public void execute(@NotNull CommandSourceStack stack, @NotNull String @NotNull [] args) {
17+
if (!(stack.getExecutor() instanceof Player player)) {
18+
stack.getSender().sendMessage(Statements.getOnlyPlayers());
19+
return;
20+
}
21+
if (!player.hasPermission("utilsmanager.feature.freecam")) {
22+
player.sendMessage(Statements.getNotAllowed(player));
23+
return;
24+
}
25+
26+
FreeCamManager freeCamManager = UtilsManager.getInstance().getFreeCamManager();
27+
if (!freeCamManager.exitFreeCam(player)) {
28+
if (LanguageAPI.getApi().getLanguage(player) == 2) {
29+
player.sendMessage(Statements.getPrefix().append(Component.text("Du bist gar nicht im Kamera Modus!", NamedTextColor.RED)));
30+
} else {
31+
player.sendMessage(Statements.getPrefix().append(Component.text("You aren't in freecam mode!", NamedTextColor.RED)));
32+
}
33+
} else {
34+
if (LanguageAPI.getApi().getLanguage(player) == 2) {
35+
player.sendMessage(Statements.getPrefix().append(Component.text("Du bist nun zurück im Überlebens Modus.", NamedTextColor.GREEN)));
36+
} else {
37+
player.sendMessage(Statements.getPrefix().append(Component.text("You're now back in Survival mode.", NamedTextColor.GREEN)));
38+
}
39+
}
40+
}
41+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package dev.lars.utilsmanager.features.freecam;
2+
3+
import dev.lars.apimanager.apis.languageAPI.LanguageAPI;
4+
import dev.lars.utilsmanager.UtilsManager;
5+
import dev.lars.utilsmanager.utils.Statements;
6+
import net.kyori.adventure.text.Component;
7+
import net.kyori.adventure.text.format.NamedTextColor;
8+
import org.bukkit.GameMode;
9+
import org.bukkit.entity.Player;
10+
import org.bukkit.event.EventHandler;
11+
import org.bukkit.event.Listener;
12+
import org.bukkit.event.block.Action;
13+
import org.bukkit.event.player.PlayerInteractEvent;
14+
15+
public class FreeCamLeaveListener implements Listener {
16+
17+
@EventHandler
18+
public void onPlayerInteract(PlayerInteractEvent event) {
19+
Player player = event.getPlayer();
20+
if (player.getGameMode() != GameMode.SPECTATOR) return;
21+
if (player.getTargetEntity(6) != null) return;
22+
if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) {
23+
FreeCamManager freeCamManager = UtilsManager.getInstance().getFreeCamManager();
24+
if (freeCamManager.exitFreeCam(player)) {
25+
if (LanguageAPI.getApi().getLanguage(player) == 2) {
26+
player.sendMessage(Statements.getPrefix().append(Component.text("Du bist nun zurück im Überlebens Modus.", NamedTextColor.GREEN)));
27+
} else {
28+
player.sendMessage(Statements.getPrefix().append(Component.text("You're now back in Survival mode.", NamedTextColor.GREEN)));
29+
}
30+
event.setCancelled(true);
31+
}
32+
}
33+
}
34+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package dev.lars.utilsmanager.features.freecam;
2+
3+
import com.destroystokyo.paper.profile.PlayerProfile;
4+
import org.bukkit.*;
5+
import org.bukkit.block.Block;
6+
import org.bukkit.entity.ArmorStand;
7+
import org.bukkit.entity.EntityType;
8+
import org.bukkit.entity.Player;
9+
import org.bukkit.inventory.ItemStack;
10+
import org.bukkit.inventory.meta.SkullMeta;
11+
12+
import java.util.HashMap;
13+
import java.util.Map;
14+
import java.util.UUID;
15+
16+
public class FreeCamManager {
17+
public Map<UUID, Location> freeCamUser = new HashMap<>();
18+
public HashMap<UUID, ArmorStand> armorStandMap = new HashMap<>();
19+
20+
public boolean enterFreeCam(Player player) {
21+
if (freeCamUser.containsKey(player.getUniqueId())) {
22+
return false;
23+
} else {
24+
freeCamUser.put(player.getUniqueId(), player.getLocation());
25+
player.setGameMode(GameMode.SPECTATOR);
26+
27+
ArmorStand armorStand = (ArmorStand) player.getWorld().spawnEntity(player.getLocation(), EntityType.ARMOR_STAND);
28+
armorStand.setVisible(false);
29+
armorStand.setGravity(false);
30+
armorStand.setMarker(true);
31+
armorStand.setPersistent(false);
32+
ItemStack skull = new ItemStack(Material.PLAYER_HEAD);
33+
SkullMeta skullMeta = (SkullMeta) skull.getItemMeta();
34+
if (skullMeta != null) {
35+
PlayerProfile profile = Bukkit.createProfile(player.getUniqueId(), player.getName());
36+
skullMeta.setPlayerProfile(profile);
37+
skull.setItemMeta(skullMeta);
38+
}
39+
armorStandMap.put(player.getUniqueId(), armorStand);
40+
41+
armorStand.getEquipment().setHelmet(skull);
42+
return true;
43+
}
44+
}
45+
46+
public boolean exitFreeCam(Player player) {
47+
if (!freeCamUser.containsKey(player.getUniqueId())) {
48+
return false;
49+
} else {
50+
player.teleport(freeCamUser.get(player.getUniqueId()));
51+
52+
Block above = player.getLocation().add(0,1,0).getBlock();
53+
if (!above.isEmpty()) above.setType(Material.AIR);
54+
55+
player.setGameMode(GameMode.SURVIVAL);
56+
57+
ArmorStand armorStand = armorStandMap.remove(player.getUniqueId());
58+
freeCamUser.remove(player.getUniqueId());
59+
60+
if (armorStand != null && !armorStand.isDead()) {
61+
Chunk chunk = armorStand.getLocation().getChunk();
62+
boolean wasLoaded = chunk.isLoaded();
63+
if (!wasLoaded) chunk.load();
64+
65+
armorStand.remove();
66+
67+
if (!wasLoaded) chunk.unload();
68+
}
69+
return true;
70+
}
71+
}
72+
73+
public boolean isFreeCamPlayer(Player player) {
74+
return freeCamUser.containsKey(player.getUniqueId());
75+
}
76+
}

0 commit comments

Comments
 (0)