Skip to content

Commit df66391

Browse files
committed
pitchat実装
1 parent 50218e3 commit df66391

File tree

10 files changed

+268
-37
lines changed

10 files changed

+268
-37
lines changed

src/main/java/com/github/elic0de/thejpspit/TheJpsPit.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import co.aikar.commands.PaperCommandManager;
44
import com.fatboyindustrial.gsonjavatime.Converters;
5+
import com.github.elic0de.thejpspit.command.PitChatCommand;
56
import com.github.elic0de.thejpspit.command.PitCommand;
67
import com.github.elic0de.thejpspit.command.SpawnCommand;
78
import com.github.elic0de.thejpspit.config.PitPreferences;
@@ -134,7 +135,6 @@ public void onEnable() {
134135
if (updateNeeded) {
135136
database.updateUserData(pitPlayer);
136137
}
137-
138138
});
139139
}
140140

@@ -169,6 +169,7 @@ private void registerCommands() {
169169

170170
commandManager.registerCommand(new PitCommand());
171171
commandManager.registerCommand(new SpawnCommand());
172+
commandManager.registerCommand(new PitChatCommand());
172173
}
173174

174175
private void registerListener() {
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.github.elic0de.thejpspit.command;
2+
3+
import co.aikar.commands.BaseCommand;
4+
import co.aikar.commands.annotation.CommandAlias;
5+
import com.github.elic0de.thejpspit.TheJpsPit;
6+
import com.github.elic0de.thejpspit.gui.PitChatMenu;
7+
import com.github.elic0de.thejpspit.player.PitPlayer;
8+
import com.github.elic0de.thejpspit.player.PitPlayerManager;
9+
import org.bukkit.entity.Player;
10+
11+
public class PitChatCommand extends BaseCommand {
12+
private final TheJpsPit pit = TheJpsPit.getInstance();
13+
14+
@CommandAlias("pitchat")
15+
public void onChat(Player player) {
16+
final PitPlayer pitPlayer = PitPlayerManager.getPitPlayer(player);
17+
PitChatMenu.create(pit, "PitChat").show(pitPlayer);
18+
}
19+
}

src/main/java/com/github/elic0de/thejpspit/command/PitCommand.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import co.aikar.commands.annotation.Subcommand;
88
import co.aikar.commands.bukkit.contexts.OnlinePlayer;
99
import com.github.elic0de.thejpspit.TheJpsPit;
10+
import com.github.elic0de.thejpspit.gui.PitChatMenu;
1011
import com.github.elic0de.thejpspit.item.ItemManager;
1112
import com.github.elic0de.thejpspit.item.PitItemEntry;
1213
import com.github.elic0de.thejpspit.player.PitPlayer;

src/main/java/com/github/elic0de/thejpspit/database/SqLiteDatabase.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.github.elic0de.thejpspit.config.PitPreferences;
55
import com.github.elic0de.thejpspit.player.OfflinePitPlayer;
66
import com.github.elic0de.thejpspit.player.PitPlayer;
7+
import com.github.elic0de.thejpspit.player.Preferences;
78
import java.io.File;
89
import java.io.IOException;
910
import java.io.InputStream;
@@ -141,22 +142,24 @@ public Optional<PitPlayer> getPitPlayer(Player player) {
141142
public Optional<PitPlayer> getPitPlayer(UUID uuid) {
142143
try (PreparedStatement statement = getConnection().prepareStatement(
143144
formatStatementTables("""
144-
SELECT `kills`, `streaks`, `bestStreaks`, `deaths`, `rating`, `bestRating`, `xp`
145+
SELECT `kills`, `streaks`, `bestStreaks`, `deaths`, `rating`, `bestRating`, `xp`, `preferences`
145146
FROM `%players_table%`
146147
WHERE `uuid`=?"""))) {
147148

148149
statement.setString(1, uuid.toString());
149150

150151
final ResultSet resultSet = statement.executeQuery();
151152
if (resultSet.next()) {
153+
final String preferences = new String(resultSet.getBytes("preferences"), StandardCharsets.UTF_8);
152154
return Optional.of(new PitPlayer(Bukkit.getPlayer(uuid),
153155
resultSet.getLong("kills"),
154156
resultSet.getLong("streaks"),
155157
resultSet.getLong("bestStreaks"),
156158
resultSet.getLong("deaths"),
157159
resultSet.getDouble("rating"),
158160
resultSet.getDouble("bestRating"),
159-
resultSet.getDouble("xp")
161+
resultSet.getDouble("xp"),
162+
Optional.of(plugin.getGson().fromJson(preferences, Preferences.class))
160163
));
161164
}
162165
} catch (SQLException e) {
@@ -247,11 +250,12 @@ public void createPitPlayer(Player player) {
247250
try {
248251
try (PreparedStatement statement = getConnection().prepareStatement(
249252
formatStatementTables("""
250-
INSERT INTO `%players_table%` (`uuid`,`username`)
251-
VALUES (?,?);"""))) {
253+
INSERT INTO `%players_table%` (`uuid`,`username`,`preferences`)
254+
VALUES (?,?,?);"""))) {
252255

253256
statement.setString(1, player.getUniqueId().toString());
254257
statement.setString(2, player.getName());
258+
statement.setBytes(3, plugin.getGson().toJson(Preferences.getDefaults()).getBytes(StandardCharsets.UTF_8));
255259
statement.executeUpdate();
256260
}
257261
} catch (SQLException e) {
@@ -283,7 +287,7 @@ public void updateUserData(PitPlayer player) {
283287
try (PreparedStatement statement = getConnection().prepareStatement(
284288
formatStatementTables("""
285289
UPDATE `%players_table%`
286-
SET `kills`=?, `streaks`=?, `bestStreaks`=?, `deaths`=?, `rating`=?, `bestRating`=?, `xp`=?
290+
SET `kills`=?, `streaks`=?, `bestStreaks`=?, `deaths`=?, `rating`=?, `bestRating`=?, `xp`=?, `preferences`=?
287291
WHERE `uuid`=?"""))) {
288292

289293
statement.setLong(1, player.getKills());
@@ -293,7 +297,8 @@ public void updateUserData(PitPlayer player) {
293297
statement.setDouble(5, player.getRating());
294298
statement.setDouble(6, player.getBestRating());
295299
statement.setDouble(7, player.getXp());
296-
statement.setString(8, player.getUniqueId().toString());
300+
statement.setBytes(8, plugin.getGson().toJson(player.getPreferences().get()).getBytes(StandardCharsets.UTF_8));
301+
statement.setString(9, player.getUniqueId().toString());
297302
statement.executeUpdate();
298303
}
299304

src/main/java/com/github/elic0de/thejpspit/game/Game.java

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public void death(PitPlayer player) {
5959
final long streaks = player.getStreaks();
6060

6161
if (streaks > 4) {
62-
broadcast("&c【PIT】&a%killer%&7が&c%vitim%の&c%streaks%ストリーク&7を止めました!"
62+
streakBroadcast("&c【PIT】&a%killer%&7が&c%vitim%の&c%streaks%ストリーク&7を止めました!"
6363
.replaceAll("%killer%", killer.getName())
6464
.replaceAll("%vitim%", player.getName())
6565
.replaceAll("%streaks%", streaks + "")
@@ -83,22 +83,34 @@ public void death(PitPlayer player) {
8383

8484
pit.getAssistKillHelper().death(player);
8585

86-
player.sendMessage("&c【PIT】%player%に倒されました(KDレート:%rating%)"
87-
.replaceAll("%player%", killer.getName())
88-
.replaceAll("%rating%", killer.getRating() + "%")
89-
);
90-
killer.sendMessage("&b【PIT】%player%を倒しました(KDレート:%rating%)"
91-
.replaceAll("%player%", player.getName())
92-
.replaceAll("%rating%", player.getRating() + "%")
93-
);
86+
player.getPreferences().ifPresent(preferences -> {
87+
if (preferences.isDeathMessage()) {
88+
player.sendMessage("&c【PIT】%player%に倒されました(KDレート:%rating%)"
89+
.replaceAll("%player%", killer.getName())
90+
.replaceAll("%rating%", killer.getRating() + "%")
91+
);
92+
}
93+
});
94+
killer.getPreferences().ifPresent(preferences -> {
95+
if (preferences.isKillMessage()) {
96+
killer.sendMessage("&b【PIT】%player%を倒しました(KDレート:%rating%)"
97+
.replaceAll("%player%", player.getName())
98+
.replaceAll("%rating%", player.getRating() + "%")
99+
);
100+
}
101+
});
94102

95103
player.setLastDamager(null);
96104
pit.getDatabase().updateUserData(player);
97105
}
98106

99-
public void broadcast(String message) {
107+
public void streakBroadcast(String message) {
100108
for (PitPlayer pitPlayer : getPitPlayers()) {
101-
pitPlayer.sendMessage(message);
109+
pitPlayer.getPreferences().ifPresent(preferences -> {
110+
if (preferences.isStreaksMessage()) {
111+
pitPlayer.sendMessage(message);
112+
}
113+
});
102114
}
103115
}
104116

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
package com.github.elic0de.thejpspit.gui;
2+
3+
import com.github.elic0de.thejpspit.TheJpsPit;
4+
import com.github.elic0de.thejpspit.hook.EconomyHook;
5+
import com.github.elic0de.thejpspit.item.PitItemEntry;
6+
import com.github.elic0de.thejpspit.player.PitPlayer;
7+
import com.github.elic0de.thejpspit.player.PitPlayerManager;
8+
import de.themoep.inventorygui.DynamicGuiElement;
9+
import de.themoep.inventorygui.InventoryGui;
10+
import de.themoep.inventorygui.StaticGuiElement;
11+
import java.math.BigDecimal;
12+
import java.util.concurrent.atomic.AtomicBoolean;
13+
import org.bukkit.Material;
14+
import org.bukkit.entity.Player;
15+
import org.bukkit.event.inventory.ClickType;
16+
import org.bukkit.inventory.Inventory;
17+
import org.bukkit.inventory.ItemStack;
18+
19+
public class PitChatMenu {
20+
21+
private static final String[] MENU_LAYOUT = {
22+
" ",
23+
" SCBofLc ",
24+
" ",
25+
" x "
26+
};
27+
28+
private final InventoryGui menu;
29+
30+
private PitChatMenu(TheJpsPit plugin, String title) {
31+
this.menu = new InventoryGui(plugin, title, MENU_LAYOUT);
32+
// Add filler items
33+
this.menu.setFiller(new ItemStack(Material.BLACK_STAINED_GLASS_PANE, 1));
34+
// Add pagination handling
35+
this.menu.addElement(
36+
toggleButton('C', PitChatType.KILL, new ItemStack(Material.REDSTONE),
37+
"キルメッセージ", "&7プレイヤーをキルした際のメッセージ"));
38+
this.menu.addElement(
39+
toggleButton('B', PitChatType.DEATH, new ItemStack(Material.SKELETON_SKULL),
40+
"デスメッセージ", "&7死亡した際のメッセージ"));
41+
this.menu.addElement(
42+
toggleButton('o', PitChatType.STREAKS, new ItemStack(Material.GOLDEN_APPLE),
43+
"ストリークメッセージ", "&7ストリーク"));
44+
this.menu.addElement(closeButton());
45+
}
46+
47+
private DynamicGuiElement toggleButton(char symbol, PitChatType type, ItemStack itemStack,
48+
String title, String desc) {
49+
return new DynamicGuiElement(symbol, (viewer) -> {
50+
final PitPlayer pitPlayer = PitPlayerManager.getPitPlayer((Player) viewer);
51+
AtomicBoolean toggle = new AtomicBoolean(true);
52+
pitPlayer.getPreferences().ifPresent(preferences -> {
53+
switch (type) {
54+
case KILL -> toggle.set(preferences.isKillMessage());
55+
case DEATH -> toggle.set(preferences.isDeathMessage());
56+
case STREAKS -> toggle.set(preferences.isStreaksMessage());
57+
}
58+
});
59+
return new StaticGuiElement(symbol, itemStack,
60+
click -> {
61+
pitPlayer.getPreferences().ifPresent(preferences -> {
62+
switch (type) {
63+
case KILL -> preferences.setKillMessage(!toggle.get());
64+
case DEATH -> preferences.setDeathMessage(!toggle.get());
65+
case STREAKS -> preferences.setStreaksMessage(!toggle.get());
66+
}
67+
});
68+
click.getGui().draw();
69+
return true;
70+
},
71+
title,
72+
desc,
73+
" ",
74+
toggle.get() ? "&aON" : "&cOFF"
75+
);
76+
});
77+
}
78+
79+
private StaticGuiElement closeButton() {
80+
return new StaticGuiElement('x', new ItemStack(Material.BARRIER),
81+
click -> {
82+
click.getWhoClicked().closeInventory();
83+
return true;
84+
},
85+
"&c閉じる"
86+
);
87+
}
88+
89+
private DynamicGuiElement getItemElement(PitItemEntry pitItemEntry) {
90+
return new DynamicGuiElement(pitItemEntry.getSlotChar(), (viewer) -> {
91+
final PitPlayer pitPlayer = PitPlayerManager.getPitPlayer((Player) viewer);
92+
return new StaticGuiElement(pitItemEntry.getSlotChar(), pitItemEntry.getItemStack(), click -> {
93+
if (click.getType() == ClickType.DOUBLE_CLICK) return true;
94+
if (TheJpsPit.getInstance().getEconomyHook().isEmpty()) {
95+
TheJpsPit.getInstance().getLogger().warning("経済プラグインが見つかりませんでした");
96+
return true;
97+
}
98+
99+
final Player player = pitPlayer.getPlayer();
100+
final Inventory inventory = player.getInventory();
101+
final EconomyHook economyHook = TheJpsPit.getInstance().getEconomyHook().get();
102+
103+
if (!economyHook.hasMoney(pitPlayer, BigDecimal.valueOf(pitItemEntry.getPrice()))) {
104+
pitPlayer.sendMessage("&c【PIT】所持金が足りません!");
105+
return true;
106+
}
107+
108+
if (inventory.firstEmpty() == -1) {
109+
pitPlayer.sendMessage("&c【PIT】インベントリが満杯で購入できません!");
110+
return true;
111+
}
112+
113+
if (pitPlayer.getLevel() < pitItemEntry.getRequiredLevel()) {
114+
pitPlayer.sendMessage("&c【PIT】レベルが足りません!");
115+
return true;
116+
}
117+
118+
economyHook.takeMoney(pitPlayer, BigDecimal.valueOf(pitItemEntry.getPrice()));
119+
inventory.addItem(pitItemEntry.getItemStack());
120+
player.updateInventory();
121+
122+
return true;
123+
}, pitItemEntry.getLore());
124+
});
125+
}
126+
127+
public static PitChatMenu create(TheJpsPit plugin, String title) {
128+
return new PitChatMenu(plugin, title);
129+
}
130+
131+
public void show(PitPlayer player) {
132+
menu.show(player.getPlayer());
133+
}
134+
135+
public enum PitChatType {
136+
KILL,
137+
DEATH,
138+
STREAKS
139+
}
140+
}

0 commit comments

Comments
 (0)