Skip to content

Commit 36301e6

Browse files
committed
レベリングシステム修正
1 parent d68a64d commit 36301e6

File tree

7 files changed

+105
-68
lines changed

7 files changed

+105
-68
lines changed

src/main/java/com/github/elic0de/thejpspit/spigot/leveler/Level.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,14 @@ public class Level {
77
private final int lev;
88
private final int neededXP;
99

10+
private final int totalXp;
11+
1012
private final ChatColor levelColor;
1113

12-
public Level(int lev, int neededXP, ChatColor color) {
14+
public Level(int lev, int neededXP, int totalXp , ChatColor color) {
1315
this.lev = lev;
1416
this.neededXP = neededXP;
17+
this.totalXp = totalXp;
1518
this.levelColor = color;
1619
}
1720

@@ -27,6 +30,10 @@ public int getLevel() {
2730
return lev;
2831
}
2932

33+
public int getTotalXp() {
34+
return totalXp;
35+
}
36+
3037
public int getNeededXP() {
3138
return neededXP;
3239
}

src/main/java/com/github/elic0de/thejpspit/spigot/leveler/Levels.java

Lines changed: 54 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -3,91 +3,100 @@
33
import com.github.elic0de.thejpspit.spigot.player.PitPlayer;
44
import java.util.ArrayList;
55
import java.util.Arrays;
6+
import java.util.HashMap;
67
import java.util.List;
78
import org.bukkit.ChatColor;
89

910
public class Levels {
1011

11-
private final static List<Level> LEVELS = new ArrayList<>(10);
12+
private final static HashMap<Integer,Level> LEVELS = new HashMap();
1213

1314
static {
1415
initialize(
15-
"1,15," + ChatColor.GRAY.name(),
16-
"10,30," + ChatColor.BLUE.name(),
17-
"20,50," + ChatColor.DARK_AQUA.name(),
18-
"30,75," + ChatColor.DARK_GREEN.name(),
19-
"40,125," + ChatColor.GREEN.name(),
20-
"50,250," + ChatColor.YELLOW.name(),
21-
"60,600," + ChatColor.GOLD.name(),
22-
"70,800," + ChatColor.RED.name(),
23-
"80,900," + ChatColor.DARK_RED.name(),
24-
"90,1000," + ChatColor.AQUA.name()
16+
"1,15,15," + ChatColor.GRAY.name(),
17+
"10,30,300," + ChatColor.BLUE.name(),
18+
"20,50,1000," + ChatColor.DARK_AQUA.name(),
19+
"30,75,2250," + ChatColor.DARK_GREEN.name(),
20+
"40,125,5000," + ChatColor.GREEN.name(),
21+
"50,250,12500," + ChatColor.YELLOW.name(),
22+
"60,600,36000," + ChatColor.GOLD.name(),
23+
"70,800,56000," + ChatColor.RED.name(),
24+
"80,900,72000," + ChatColor.DARK_RED.name(),
25+
"90,1000,90000," + ChatColor.AQUA.name()
2526
);
2627
}
2728

2829
private static void initialize(String... texts) {
2930
Arrays.stream(texts)
3031
.map(text -> text.split(","))
31-
.map(data -> new Level(Integer.parseInt(data[0]), Integer.parseInt(data[1]), ChatColor.valueOf(data[2])))
32-
.forEach(LEVELS::add);
32+
.map(data -> new Level(Integer.parseInt(data[0]), Integer.parseInt(data[1]),Integer.parseInt(data[2]), ChatColor.valueOf(data[3])))
33+
.forEach(level -> LEVELS.put(level.getLevel(), level));
3334

34-
// TODO
35-
Level level = LEVELS.get(0);
36-
for (int i = 1; i < LEVELS.get(LEVELS.size() - 1).getLevel() + 10; i++) {
35+
final HashMap<Integer,Level> addedLevels = new HashMap<>();
36+
for (Level level : LEVELS.values()) {
37+
final int l = level.getLevel();
3738
final int neededXp = level.getNeededXP();
3839
final ChatColor color = level.getLevelColor();
3940

40-
if (LEVELS.get(i) != null) {
41-
level = LEVELS.get(i);
42-
} else LEVELS.add(new Level(i, neededXp, color));
41+
int totalXp = level.getTotalXp();
42+
for (int i = 1; i < 10; i++){
43+
final int nextLevel = l + i;
44+
if (LEVELS.containsKey(nextLevel)) continue;
45+
totalXp += neededXp;
46+
addedLevels.put(nextLevel, new Level(nextLevel, neededXp, totalXp, color));
47+
}
4348
}
49+
LEVELS.putAll(addedLevels);
4450
}
4551

52+
/* public static int getPlayerLevel(int playerLevel) {
53+
if (LEVELS.containsKey(playerLevel)) {
54+
final Level level = LEVELS.get(playerLevel);
55+
return level.getLevel();
56+
}
57+
if (LEVELS.containsKey(LEVELS.size() - 1)) {
58+
final int maxLevel = LEVELS.get(LEVELS.size() - 1).getLevel();
59+
return maxLevel;
60+
}
61+
return 0;
62+
}*/
63+
4664
public static int getPlayerLevel(PitPlayer player) {
47-
final List<Integer> requirements = LEVELS.stream().map(Level::getNeededXP)
65+
final List<Integer> requirements = LEVELS.values().stream().map(Level::getTotalXp)
4866
.toList();
4967
int maxLevel = requirements.size();
5068
for (int i = 0; i < maxLevel; i++) {
5169
if (player.getXp() < requirements.get(i)) {
52-
return i;
70+
return i + 1;
5371
}
5472
}
5573
return maxLevel;
5674
}
5775

58-
public static int getPlayerNeededXP(PitPlayer player) {
59-
final List<Integer> requirements = LEVELS.stream().map(Level::getNeededXP)
60-
.toList();
61-
for (int requirement : requirements) {
62-
int amountToNextLevel = (int) (requirement - player.getXp());
63-
if (amountToNextLevel > 0) {
64-
return amountToNextLevel;
76+
public static int getPlayerNeededXP(int playerLevel, int currentXp) {
77+
if (LEVELS.containsKey(playerLevel)) {
78+
final Level level = LEVELS.get(playerLevel);
79+
final int requirementXp = level.getTotalXp() - currentXp;
80+
if (requirementXp > 0) {
81+
return requirementXp;
6582
}
6683
}
6784
return 0;
6885
}
6986

70-
public static int getLevelNeededXP(PitPlayer player) {
71-
final List<Integer> requirements = LEVELS.stream().map(Level::getNeededXP)
72-
.toList();
73-
for (int requirement : requirements) {
74-
int amountToNextLevel = (int) (requirement - player.getXp());
75-
if (amountToNextLevel > 0) {
76-
return requirement;
77-
}
87+
public static int getLevelTotalXP(int playerLevel) {
88+
if (LEVELS.containsKey(playerLevel)) {
89+
final Level level = LEVELS.get(playerLevel);
90+
return level.getTotalXp();
7891
}
7992
return 0;
8093
}
8194

82-
public static ChatColor getPlayerLevelColor(PitPlayer player) {
83-
final List<Integer> requirements = LEVELS.stream().map(Level::getNeededXP)
84-
.toList();
85-
int maxLevel = requirements.size();
86-
for (int i = 0; i < maxLevel; i++) {
87-
if (player.getXp() < requirements.get(i)) {
88-
return LEVELS.get(i).getLevelColor();
89-
}
95+
public static ChatColor getPlayerLevelColor(int playerLevel) {
96+
if (LEVELS.containsKey(playerLevel)) {
97+
final Level level = LEVELS.get(playerLevel);
98+
return level.getLevelColor();
9099
}
91-
return LEVELS.get(maxLevel).getLevelColor();
100+
return ChatColor.GRAY;
92101
}
93102
}

src/main/java/com/github/elic0de/thejpspit/spigot/listener/EventListener.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -132,16 +132,21 @@ public void onDrop(PlayerDropItemEvent event) {
132132
@EventHandler
133133
public void onDamage(EntityDamageByEntityEvent event) {
134134
if (event.getEntity() instanceof Player vitim) {
135+
if (event.getCause() == DamageCause.VOID) {
136+
plugin.getGame().death(PitPlayerManager.getPitPlayer(vitim));
137+
return;
138+
}
135139
if (event.getDamager() instanceof Player damager) {
136140
final PitPlayer victimPitPlayer = PitPlayerManager.getPitPlayer(vitim);
137141
final PitPlayer pitPlayer = PitPlayerManager.getPitPlayer(damager);
138-
if (event.getCause() == EntityDamageEvent.DamageCause.FALL) {
139-
event.setCancelled(true);
140-
return;
141-
}
142-
if (event.getCause() == DamageCause.PROJECTILE) {
143-
event.setDamage(event.getDamage() - (event.getDamage() / 0.8));
142+
switch (event.getCause()) {
143+
case FALL -> {
144+
event.setCancelled(true);
145+
return;
146+
}
147+
case PROJECTILE -> event.setDamage(event.getDamage() - (event.getDamage() / 0.8));
144148
}
149+
145150
pitPlayer.showHealth(victimPitPlayer);
146151
victimPitPlayer.setLastDamager(pitPlayer);
147152
}
@@ -166,8 +171,8 @@ public void onXpGain(PlayerExpChangeEvent event) {
166171

167172
@EventHandler
168173
public void on(PlayerInteractEvent event) {
169-
/*final PitPlayer pitPlayer = PitPlayerManager.getPitPlayer(event.getPlayer());
170-
pitPlayer.increaseStreaks();*/
174+
final PitPlayer pitPlayer = PitPlayerManager.getPitPlayer(event.getPlayer());
175+
pitPlayer.increaseXP();
171176
if (event.getHand() != EquipmentSlot.HAND) {
172177
return;
173178
}

src/main/java/com/github/elic0de/thejpspit/spigot/nms/PacketManager1_19_R1.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,7 @@ public static PacketManager1_19_R1 make() {
7070
getCBClass("entity.CraftEntity").getMethod("getHandle"),
7171
getMojangClass("world.entity.Entity").getMethod("getBukkitEntity"),
7272
getCBClass("CraftWorld").getMethod("getHandle"),
73-
getMojangClass("server.network.PlayerConnection")
74-
.getMethod("a", getMojangClass("network.protocol.Packet")),
73+
getMojangClass("server.network.PlayerConnection").getMethod("a", getMojangClass("network.protocol.Packet")),
7574
getMojangClass("server.level.EntityPlayer").getField("b")
7675
);
7776
} catch (ReflectiveOperationException e) {

src/main/java/com/github/elic0de/thejpspit/spigot/player/PitPlayer.java

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.util.stream.Stream;
1212
import org.bukkit.ChatColor;
1313
import org.bukkit.Material;
14+
import org.bukkit.Sound;
1415
import org.bukkit.attribute.Attribute;
1516
import org.bukkit.entity.Player;
1617
import org.bukkit.inventory.ItemStack;
@@ -35,16 +36,15 @@ public class PitPlayer {
3536
new ItemStack(Material.IRON_LEGGINGS),
3637
new ItemStack(Material.IRON_CHESTPLATE)
3738
};
39+
private int level;
3840
private long kills;
39-
4041
private long streaks;
4142
private long bestStreaks;
4243
private long deaths;
4344
private double rating;
4445
private double bestRating;
4546
private double xp;
4647
private final FastBoard board;
47-
4848
private PitPlayer lastDamager;
4949

5050
public PitPlayer(Player player) {
@@ -60,6 +60,7 @@ public PitPlayer(Player player) {
6060
this.xp = 0;
6161
this.board = new FastBoard(player);
6262
this.board.updateTitle(ChatColor.translateAlternateColorCodes('&', "&eTHE JPS PIT"));
63+
this.level = Levels.getPlayerLevel(this);
6364
}
6465

6566
public PitPlayer(Player player, long kills, long streaks, long bestStreaks, long deaths, double rating, double bestRating, double xp) {
@@ -75,6 +76,7 @@ public PitPlayer(Player player, long kills, long streaks, long bestStreaks, long
7576
this.xp = xp;
7677
this.board = new FastBoard(player);
7778
this.board.updateTitle(ChatColor.translateAlternateColorCodes('&', "&eTHE JPS PIT"));
79+
this.level = Levels.getPlayerLevel(this);
7880
}
7981

8082
public void addItem() {
@@ -153,18 +155,18 @@ public void sendStatus(PitPlayer player) {
153155
}
154156

155157
private void updateXpBar() {
156-
final float xp = Levels.getPlayerNeededXP(this);
157-
final float neededXp = Levels.getLevelNeededXP(this);
158-
final int level = Levels.getPlayerLevel(this);
158+
// TODO 一時保存しておく
159+
final float xp = Levels.getPlayerNeededXP(level, (int) this.xp);
160+
final float totalXp = Levels.getLevelTotalXP(level);
161+
159162
player.setLevel(level);
160-
player.setExp((neededXp - xp)/neededXp);
163+
player.setExp((totalXp - xp)/totalXp);
161164
}
162165

163166
public void updateDisplayName() {
164-
final int level = Levels.getPlayerLevel(this);
165-
final ChatColor color = Levels.getPlayerLevelColor(this);
167+
final ChatColor color = Levels.getPlayerLevelColor(level);
166168
player.setDisplayName("[" + color + level + ChatColor.RESET + "]" + " " + getName());
167-
player.setPlayerListName("[" + color + Levels.getPlayerLevel(this) + ChatColor.RESET + "]" + " " + getName());
169+
player.setPlayerListName("[" + color + level + ChatColor.RESET + "]" + " " + getName());
168170
}
169171

170172
public Player getPlayer() {
@@ -184,6 +186,10 @@ public PitPlayer getKiller() {
184186
return PitPlayerManager.getPitPlayer(player.getKiller());
185187
}
186188

189+
public int getLevel() {
190+
return level;
191+
}
192+
187193
public long getKills() {
188194
return kills;
189195
}
@@ -242,8 +248,17 @@ public void increaseDeaths() {
242248

243249
public void increaseXP() {
244250
this.xp++;
251+
252+
// レベルアップ
253+
if (Levels.getPlayerNeededXP(level, (int) xp) == 0) {
254+
final int nextLevel = level + 1;
255+
final int previousLevel = this.level;
256+
this.level = nextLevel;
257+
player.sendTitle("§b§lLEVEL UP!", previousLevel + " → " + nextLevel, 20,40, 20);
258+
player.playSound(player.getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 1f, 1f);
259+
updateDisplayName();
260+
}
245261
updateXpBar();
246-
updateDisplayName();
247262
}
248263

249264
public void increaseHealth() {

src/main/java/com/github/elic0de/thejpspit/spigot/scoreboard/GameScoreboard.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,9 @@ public List<String> boardLines(PitPlayer player) {
4848
"",
4949
"&ejapanpvpserver.net"
5050
).map(s ->
51-
s.replaceAll("%level%", Levels.getPlayerLevel(player) + "")
52-
.replaceAll("%neededXp%", Levels.getPlayerNeededXP(player) + "")
51+
s.replaceAll("%level%", Levels.getPlayerLevelColor(player.getLevel()) + "" + player.getLevel() + ChatColor.RESET)
52+
.replaceAll("%neededXp%", Levels.getPlayerNeededXP(player.getLevel(),
53+
(int) player.getXp()) + "")
5354
.replaceAll("%rating%", player.getRating() + "%")
5455
.replaceAll("%bestRating%", player.getBestRating() + "%")
5556
.replaceAll("%streaks%", player.getStreaks() + "")

src/main/resources/plugin.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ api-version: 1.19
55
author: 'Elic0de#0342'
66
softdepend:
77
- Vault
8+
- TheNewEconomy

0 commit comments

Comments
 (0)