Skip to content

Commit 7235ca0

Browse files
committed
merge(version): add version 1.2.0
2 parents 973e180 + 6f6aa7d commit 7235ca0

File tree

9 files changed

+260
-28
lines changed

9 files changed

+260
-28
lines changed

README.md

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,14 @@ Pour créer des ascenseurs rapides pour les défenseurs :
4848

4949
## 🛠 Commandes
5050

51-
| Commande | Description | Permission |
52-
| :--- |:------------------------------------------------------------------| :--- |
53-
| `/sd start` | Lance le compte à rebours de la partie. | OP |
54-
| `/sd banner` | Définit la bannière ciblée comme objectif. | OP |
55-
| `/sd defenseur` | Définit votre position comme spawn défenseur. | OP |
56-
| `/sd tpplate <high/low>` | Configure les plaques de TP. | OP |
57-
| `/sd revive <joueur> [team]` | Ressuscite un joueur mort. et l'ajoute dans la team (si spécifié) | OP |
51+
| Commande | Description | Permission |
52+
|:-----------------------------|:----------------------------------------------------------------------------------------------------------| :--- |
53+
| `/sd start` | Lance le compte à rebours de la partie. | OP |
54+
| `/sd banner` | Définit la bannière ciblée comme objectif. | OP |
55+
| `/sd defenseur` | Définit votre position comme spawn défenseur. | OP |
56+
| `/sd tpplate <high/low>` | Configure les plaques de TP. | OP |
57+
| `/sd revive <joueur> [team]` | Ressuscite un joueur mort. et l'ajoute dans la team (si spécifié) | OP |
58+
| `/sd invsee <joueur>` | Permet d'ouvrir l'inventaire du joueur et de le modifier (uniquement si l'OP est dans la team spectateur) | OP |
5859

5960
## 🏗 Architecture du code (Pour les dévs)
6061

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>fr.lliksel</groupId>
88
<artifactId>skydefender</artifactId>
9-
<version>1.1.0</version>
9+
<version>1.2.0</version>
1010

1111
<properties>
1212
<maven.compiler.release>8</maven.compiler.release>

src/main/java/fr/lliksel/skydefender/SkyDefender.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import fr.lliksel.skydefender.manager.GameManager;
1313
import fr.lliksel.skydefender.manager.ScoreboardManager;
1414
import fr.lliksel.skydefender.manager.TeamManager;
15+
import fr.lliksel.skydefender.manager.InvSeeManager;
1516
import fr.lliksel.skydefender.manager.ScenarioManager;
1617
import org.bukkit.ChatColor;
1718
import org.bukkit.Difficulty;
@@ -26,6 +27,7 @@ public class SkyDefender extends JavaPlugin {
2627
private GameConfigManager gameConfigManager;
2728
private ChatInputManager chatInputManager;
2829
private ScenarioManager scenarioManager;
30+
private InvSeeManager invSeeManager;
2931

3032
@Override
3133
public void onEnable() {
@@ -34,8 +36,9 @@ public void onEnable() {
3436

3537
this.chatInputManager = new ChatInputManager(this);
3638
this.gameConfigManager = new GameConfigManager(configManager);
37-
this.teamManager = new TeamManager(configManager); // Uses getPlugin inside
39+
this.teamManager = new TeamManager(configManager);
3840
this.scenarioManager = new ScenarioManager(this);
41+
this.invSeeManager = new InvSeeManager(this);
3942
this.gameManager = new GameManager(this, this.teamManager, configManager, this.gameConfigManager);
4043
this.scoreboardManager = new ScoreboardManager(this, this.gameManager, this.teamManager);
4144

@@ -87,4 +90,8 @@ public ChatInputManager getChatInputManager() {
8790
public ScenarioManager getScenarioManager() {
8891
return scenarioManager;
8992
}
93+
94+
public InvSeeManager getInvSeeManager() {
95+
return invSeeManager;
96+
}
9097
}

src/main/java/fr/lliksel/skydefender/commands/CommandSd.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public CommandSd(SkyDefender plugin, GameManager gameManager, ConfigManager conf
3737
@Override
3838
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
3939
if (args.length == 0) {
40-
sender.sendMessage(ChatColor.RED + "Usage: /sd <infos|start|banner|defenseur|tpplate|revive|scenarios>");
40+
sender.sendMessage(ChatColor.RED + "Usage: /sd <infos|start|banner|defenseur|tpplate|revive|scenarios|invsee>");
4141
return true;
4242
}
4343

@@ -191,6 +191,34 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
191191
return true;
192192
}
193193

194+
if (args[0].equalsIgnoreCase("invsee")) {
195+
if (!(sender instanceof Player)) {
196+
sender.sendMessage("Seul un joueur peut voir un inventaire.");
197+
return true;
198+
}
199+
200+
Player player = (Player) sender;
201+
Optional<GameTeam> teamOpt = this.teamManager.getPlayerTeam(player);
202+
203+
if (!player.isOp() || !teamOpt.isPresent() || !teamOpt.get().getName().equalsIgnoreCase("Spectateur")) {
204+
sender.sendMessage(ChatColor.RED + "Uniquement un spectateur qui est op peut voir les inventaires des joueurs.");
205+
return true;
206+
}
207+
208+
if (args.length < 2) {
209+
sender.sendMessage(ChatColor.RED + "Usage: /sd invsee <joueur>");
210+
return true;
211+
}
212+
Player target = Bukkit.getPlayer(args[1]);
213+
if (target == null) {
214+
sender.sendMessage(ChatColor.RED + "Le joueur n'est pas connecté.");
215+
return true;
216+
}
217+
218+
plugin.getInvSeeManager().openInvSee((Player) sender, target);
219+
return true;
220+
}
221+
194222
return false;
195223
}
196224
}

src/main/java/fr/lliksel/skydefender/listeners/GameListener.java

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,11 @@ public void onBlockBreak(BlockBreakEvent event) {
140140
return;
141141
}
142142

143-
Bukkit.broadcastMessage(ChatColor.GOLD + "La bannière a été détruite par " + player.getDisplayName() + " !");
144-
Bukkit.broadcastMessage(ChatColor.GOLD + "L'équipe \"" + playerTeamOpt.get().getColor() + playerTeamOpt.get().getName() + ChatColor.GOLD + "\" remporte la victoire !");
143+
Bukkit.broadcastMessage(ChatColor.GOLD + "[Sky Defender] " + ChatColor.RED + "La bannière a été détruite par " + player.getDisplayName() + ChatColor.RED + " !");
144+
145+
if (playerTeamOpt.isPresent()) {
146+
broadcastWin(playerTeamOpt.get());
147+
}
145148
gameManager.setGameState(GameState.FINISH);
146149
}
147150

@@ -150,6 +153,7 @@ public void onPlayerDeath(PlayerDeathEvent event) {
150153
if (gameManager.isState(GameState.PLAYING)) {
151154
Player player = event.getEntity();
152155
Player killer = player.getKiller();
156+
String originalDeathMessage = event.getDeathMessage();
153157

154158
if (killer != null) {
155159
gameManager.addKill(killer);
@@ -158,25 +162,54 @@ public void onPlayerDeath(PlayerDeathEvent event) {
158162
event.setDeathMessage(null);
159163
this.teamManager.removePlayerFromTeamWhenDeath(player);
160164

161-
// Mise en spectateur
162165
this.teamManager.addPlayerToTeam(player, "Spectateur", true);
163166
player.setGameMode(GameMode.SPECTATOR);
164167

165-
Bukkit.broadcastMessage("[Sky Defender] " + player.getDisplayName() + " est mort.");
168+
Bukkit.broadcastMessage(ChatColor.GOLD + "[Sky Defender] " + ChatColor.RED + player.getDisplayName() + " est mort.");
169+
170+
if (originalDeathMessage != null) {
171+
String logMessage = ChatColor.GRAY + "[Log] " + originalDeathMessage;
172+
for (Player p : Bukkit.getOnlinePlayers()) {
173+
Optional<GameTeam> team = teamManager.getPlayerTeam(p);
174+
if (p.isOp() || (team.isPresent() && team.get().getName().equalsIgnoreCase("Spectateur"))) {
175+
p.sendMessage(logMessage);
176+
}
177+
}
178+
}
179+
166180
player.getWorld().strikeLightningEffect(player.getLocation().subtract(0, -5, 0));
167181
for (Player onlinePlayer : Bukkit.getOnlinePlayers()) {
168182
onlinePlayer.playSound(onlinePlayer.getLocation(), Sound.ENTITY_WITHER_SPAWN, 1, 1);
169183
}
170184

171-
// Vérification de la victoire des défenseurs
172185
if (teamManager.getAttackerCount() == 0) {
173186
Optional<GameTeam> defenders = teamManager.getTeamByName("Defenseurs");
174-
if (defenders.isPresent() && !defenders.get().getPlayers().isEmpty()) {
175-
Bukkit.broadcastMessage(ChatColor.BLUE + "Les Défenseurs ont éliminé tous les attaquants !");
176-
Bukkit.broadcastMessage(ChatColor.BLUE + "Les Défenseurs remportent la victoire !");
187+
if (defenders.isPresent()) {
188+
Bukkit.broadcastMessage(ChatColor.GOLD + "[Sky Defender] " + ChatColor.BLUE + "Les Défenseurs ont éliminé tous les attaquants !");
189+
broadcastWin(defenders.get());
177190
gameManager.setGameState(GameState.FINISH);
178191
}
179192
}
180193
}
181194
}
195+
196+
private void broadcastWin(GameTeam winningTeam) {
197+
String prefix = ChatColor.GOLD + "[Sky Defender] ";
198+
199+
for (Player p : Bukkit.getOnlinePlayers()) {
200+
p.sendTitle(ChatColor.GOLD + "VICTOIRE", winningTeam.getColor() + winningTeam.getName(), 10, 100, 20);
201+
p.playSound(p.getLocation(), Sound.UI_TOAST_CHALLENGE_COMPLETE, 1, 1);
202+
}
203+
204+
Bukkit.broadcastMessage(prefix + ChatColor.GREEN + "L'équipe " + winningTeam.getColor() + winningTeam.getName() + ChatColor.GREEN + " remporte la partie !");
205+
206+
StringBuilder winners = new StringBuilder();
207+
for (UUID uuid : winningTeam.getPlayers()) {
208+
Player p = Bukkit.getPlayer(uuid);
209+
String name = (p != null) ? p.getName() : "Déconnecté";
210+
if (winners.length() > 0) winners.append(ChatColor.GRAY + ", ");
211+
winners.append(winningTeam.getColor()).append(name);
212+
}
213+
Bukkit.broadcastMessage(prefix + ChatColor.GRAY + "Joueurs: " + winners.toString());
214+
}
182215
}

src/main/java/fr/lliksel/skydefender/manager/GameManager.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -74,15 +74,15 @@ public void setGameState(GameState gameState) {
7474
if (this.gameState == gameState) return;
7575

7676
this.gameState = gameState;
77+
String prefix = ChatColor.GOLD + "[Sky Defender] ";
7778

78-
// Logique déclenchée lors du CHANGEMENT d'état
7979
switch (this.gameState) {
8080
case WAITING:
81-
Bukkit.broadcastMessage(ChatColor.YELLOW + "[Sky Defender] En attente de joueurs...");
81+
Bukkit.broadcastMessage(prefix + ChatColor.YELLOW + "En attente de joueurs...");
8282
break;
8383

8484
case STARTING:
85-
Bukkit.broadcastMessage(ChatColor.GOLD + "[Sky Defender] Le jeu va démarrer !");
85+
Bukkit.broadcastMessage(prefix + ChatColor.GREEN + "Le jeu va démarrer !");
8686
new org.bukkit.scheduler.BukkitRunnable() {
8787
int countdown = 10;
8888

@@ -98,8 +98,9 @@ public void run() {
9898
player.sendTitle(
9999
ChatColor.GOLD + "Démarrage dans",
100100
ChatColor.YELLOW + String.valueOf(countdown),
101-
10, 20, 10
101+
0, 20, 10
102102
);
103+
player.playSound(player.getLocation(), Sound.BLOCK_NOTE_BLOCK_PLING, 1, 1);
103104
}
104105
countdown--;
105106
}
@@ -108,33 +109,33 @@ public void run() {
108109

109110
case PLAYING:
110111
this.gameStartTime = System.currentTimeMillis();
111-
Bukkit.broadcastMessage(ChatColor.GREEN + "[Sky Defender] La partie commence ! Bonne chance.");
112+
Bukkit.broadcastMessage(prefix + ChatColor.GREEN + "La partie commence ! Bonne chance.");
112113
startGameLogic();
113114

114115
// PvP Timer
115116
int pvpTime = gameConfigManager.getPvpTimeMinutes();
116117
if (pvpTime > 0) {
117-
Bukkit.broadcastMessage(ChatColor.GOLD + "Le PvP sera activé dans " + pvpTime + " minutes.");
118+
Bukkit.broadcastMessage(prefix + ChatColor.YELLOW + "Le PvP sera activé dans " + pvpTime + " minutes.");
118119
for (World world : Bukkit.getWorlds()) world.setPVP(false);
119120

120121
new org.bukkit.scheduler.BukkitRunnable() {
121122
@Override
122123
public void run() {
123124
if (isState(GameState.PLAYING)) {
124125
for (World world : Bukkit.getWorlds()) world.setPVP(true);
125-
Bukkit.broadcastMessage(ChatColor.RED + "Le PvP est maintenant ACTIF !");
126+
Bukkit.broadcastMessage(prefix + ChatColor.RED + "Le PvP est maintenant ACTIF !");
127+
for(Player p : Bukkit.getOnlinePlayers()) p.playSound(p.getLocation(), Sound.ENTITY_ENDER_DRAGON_GROWL, 1, 1);
126128
}
127129
}
128130
}.runTaskLater(plugin, pvpTime * 60 * 20L);
129131
} else {
130132
for (World world : Bukkit.getWorlds()) world.setPVP(true);
131-
Bukkit.broadcastMessage(ChatColor.RED + "Le PvP est ACTIF !");
133+
Bukkit.broadcastMessage(prefix + ChatColor.RED + "Le PvP est ACTIF !");
132134
}
133135
break;
134136

135137
case FINISH:
136-
Bukkit.broadcastMessage(ChatColor.RED + "[Sky Defender] La partie est terminée !");
137-
// TODO: Téléporter les joueurs au lobby, arrêter les tâches, etc.
138+
Bukkit.broadcastMessage(prefix + ChatColor.RED + "La partie est terminée !");
138139
break;
139140
}
140141
}
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
package fr.lliksel.skydefender.manager;
2+
3+
import fr.lliksel.skydefender.SkyDefender;
4+
import org.bukkit.Bukkit;
5+
import org.bukkit.Material;
6+
import org.bukkit.entity.Player;
7+
import org.bukkit.event.EventHandler;
8+
import org.bukkit.event.Listener;
9+
import org.bukkit.event.inventory.InventoryClickEvent;
10+
import org.bukkit.event.inventory.InventoryCloseEvent;
11+
import org.bukkit.event.inventory.InventoryDragEvent;
12+
import org.bukkit.inventory.Inventory;
13+
import org.bukkit.inventory.ItemStack;
14+
import org.bukkit.inventory.meta.ItemMeta;
15+
16+
import java.util.HashMap;
17+
import java.util.UUID;
18+
19+
public class InvSeeManager implements Listener {
20+
21+
private final SkyDefender plugin;
22+
private final HashMap<UUID, UUID> viewers = new HashMap<>();
23+
24+
public InvSeeManager(SkyDefender plugin) {
25+
this.plugin = plugin;
26+
plugin.getServer().getPluginManager().registerEvents(this, plugin);
27+
}
28+
29+
public void openInvSee(Player viewer, Player target) {
30+
Inventory gui = Bukkit.createInventory(null, 54, "Inv: " + target.getName());
31+
32+
ItemStack separatorTop = new ItemStack(Material.GRAY_STAINED_GLASS_PANE);
33+
ItemMeta metaTop = separatorTop.getItemMeta();
34+
if (metaTop != null) {
35+
metaTop.setDisplayName("§7⬅ Armure | Main Secondaire ➡");
36+
separatorTop.setItemMeta(metaTop);
37+
}
38+
39+
ItemStack separatorBottom = new ItemStack(Material.BLACK_STAINED_GLASS_PANE);
40+
ItemMeta metaBottom = separatorBottom.getItemMeta();
41+
if (metaBottom != null) {
42+
metaBottom.setDisplayName("§7⬆ Inventaire | Hotbar ⬇");
43+
separatorBottom.setItemMeta(metaBottom);
44+
}
45+
46+
for(int i=4; i<8; i++) gui.setItem(i, separatorTop);
47+
for(int i=36; i<45; i++) gui.setItem(i, separatorBottom);
48+
49+
ItemStack[] armor = target.getInventory().getArmorContents();
50+
gui.setItem(0, armor[3]); // Helmet
51+
gui.setItem(1, armor[2]); // Chest
52+
gui.setItem(2, armor[1]); // Leggings
53+
gui.setItem(3, armor[0]); // Boots
54+
55+
gui.setItem(8, target.getInventory().getItemInOffHand());
56+
57+
ItemStack[] contents = target.getInventory().getContents();
58+
59+
for (int i = 9; i < 36; i++) {
60+
if (i < contents.length) gui.setItem(i, contents[i]);
61+
}
62+
63+
for (int i = 0; i < 9; i++) {
64+
if (i < contents.length) gui.setItem(45 + i, contents[i]);
65+
}
66+
67+
viewers.put(viewer.getUniqueId(), target.getUniqueId());
68+
viewer.openInventory(gui);
69+
}
70+
71+
@EventHandler
72+
public void onClick(InventoryClickEvent event) {
73+
if (!(event.getWhoClicked() instanceof Player)) return;
74+
Player admin = (Player) event.getWhoClicked();
75+
76+
if (!viewers.containsKey(admin.getUniqueId())) return;
77+
78+
if (event.getClickedInventory() != null && event.getClickedInventory().equals(event.getView().getTopInventory())) {
79+
int slot = event.getSlot();
80+
if ((slot >= 4 && slot < 8) || (slot >= 36 && slot < 45)) {
81+
event.setCancelled(true);
82+
return;
83+
}
84+
}
85+
86+
Bukkit.getScheduler().runTask(plugin, () -> updateTargetInventory(admin, event.getInventory()));
87+
}
88+
89+
@EventHandler
90+
public void onDrag(InventoryDragEvent event) {
91+
if (!(event.getWhoClicked() instanceof Player)) return;
92+
Player admin = (Player) event.getWhoClicked();
93+
if (viewers.containsKey(admin.getUniqueId())) {
94+
Bukkit.getScheduler().runTask(plugin, () -> updateTargetInventory(admin, event.getInventory()));
95+
}
96+
}
97+
98+
@EventHandler
99+
public void onClose(InventoryCloseEvent event) {
100+
viewers.remove(event.getPlayer().getUniqueId());
101+
}
102+
103+
private void updateTargetInventory(Player admin, Inventory gui) {
104+
UUID targetUUID = viewers.get(admin.getUniqueId());
105+
Player target = Bukkit.getPlayer(targetUUID);
106+
107+
if (target == null || !target.isOnline()) {
108+
return;
109+
}
110+
111+
ItemStack[] armor = target.getInventory().getArmorContents();
112+
armor[3] = gui.getItem(0);
113+
armor[2] = gui.getItem(1);
114+
armor[1] = gui.getItem(2);
115+
armor[0] = gui.getItem(3);
116+
target.getInventory().setArmorContents(armor);
117+
118+
target.getInventory().setItemInOffHand(gui.getItem(8));
119+
120+
for (int i = 9; i < 36; i++) {
121+
target.getInventory().setItem(i, gui.getItem(i));
122+
}
123+
124+
for (int i = 0; i < 9; i++) {
125+
target.getInventory().setItem(i, gui.getItem(45 + i));
126+
}
127+
128+
target.updateInventory();
129+
}
130+
}

0 commit comments

Comments
 (0)