Skip to content
Draft
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -116,3 +116,4 @@ buildNumber.properties
# Common working directory
run/
/libs/
/.claude/settings.local.json
30 changes: 11 additions & 19 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ plugins {
}

group = 'com.bitaspire'
version = '1.0.4'
version = '1.1.2'

repositories {
mavenLocal()
Expand Down Expand Up @@ -42,7 +42,7 @@ dependencies {
compileOnly "org.spigotmc:spigot-api:1.16.5-R0.1-SNAPSHOT"

// Core dependency
implementation 'com.github.Kihsomray:CyberCore:1.3.32'
implementation files('libs/CyberCore.jar')

// Lombok
compileOnly "org.projectlombok:lombok:1.18.38"
Expand All @@ -54,15 +54,16 @@ dependencies {
compileOnly files('libs/RivalPickaxesAPI.jar')

// Database
compileOnly 'com.zaxxer:HikariCP:3.4.5'
compileOnly 'mysql:mysql-connector-java:8.0.21'
compileOnly 'org.xerial:sqlite-jdbc:3.36.0.3'
compileOnly 'org.postgresql:postgresql:42.7.7'
compileOnly 'com.zaxxer:HikariCP:7.0.2'
compileOnly 'com.mysql:mysql-connector-j:9.5.0'
compileOnly 'org.xerial:sqlite-jdbc:3.51.1.0'
compileOnly 'org.postgresql:postgresql:42.7.8'

// Misc utils
implementation 'org.bstats:bstats-bukkit:3.0.2'
implementation 'me.croabeast:YAML-API:1.1'
implementation 'me.croabeast:GlobalScheduler:1.0'
implementation 'me.croabeast.expr4j:core:1.0'
implementation 'me.croabeast.expr4j:big-decimal:1.0'
implementation 'me.croabeast.expr4j:double:1.0'

compileOnly 'ch.obermuhlner:big-math:2.3.2'
compileOnly 'org.apache.commons:commons-lang3:3.18.0'
}
Expand Down Expand Up @@ -99,15 +100,6 @@ tasks.build.dependsOn(tasks.shadowJar)
tasks {
shadowJar {
archiveClassifier.set('')

exclude(
'META-INF/**', 'org/apache/commons/**', 'org/intellij/**',
'org/jetbrains/**', 'me/croabeast/file/plugin/YAMLPlugin.*'
)

relocate('org.bstats', 'com.bitaspire.libs.bstats')
relocate('me.croabeast.common', 'com.bitaspire.libs.file')
relocate('me.croabeast', 'com.bitaspire.libs')
relocate('net.zerotoil.dev', 'com.bitaspire.libs')
exclude('META-INF/**', 'org/apache/commons/**', 'org/intellij/**', 'org/jetbrains/**', 'me/croabeast/file/plugin/YAMLPlugin.*')
}
}
78 changes: 46 additions & 32 deletions src/main/java/com/bitaspire/cyberlevels/BaseSystem.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
package com.bitaspire.cyberlevels;

import com.bitaspire.cyberlevels.user.UserManager;
import com.bitaspire.libs.formula.expression.ExpressionBuilder;
import com.bitaspire.cyberlevels.cache.Cache;
import com.bitaspire.cyberlevels.cache.Lang;
import com.bitaspire.cyberlevels.level.*;
import com.bitaspire.cyberlevels.user.LevelUser;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import me.croabeast.beanslib.Beans;
import me.croabeast.expr4j.expression.Builder;
import org.apache.commons.lang3.StringUtils;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
Expand All @@ -34,6 +33,7 @@ abstract class BaseSystem<N extends Number> implements LevelSystem<N> {
private final long startLevel, maxLevel;
private final int startExp;

private final Operator<N> operator;
private final Formula<N> formula;

private final Map<Long, Formula<N>> formulas = new ConcurrentHashMap<>();
Expand All @@ -55,13 +55,15 @@ abstract class BaseSystem<N extends Number> implements LevelSystem<N> {
startLevel = cache.levels().getStartLevel();
maxLevel = cache.levels().getMaxLevel();

operator = createOperator();
formula = createFormula(cache.levels().getFormula());
cache.levels().getCustomFormulas().forEach((k, v) -> formulas.put(k, createFormula(v)));

rewardMap.putAll(cache.rewards().getRewards());
if (cache.config().isRoundingEnabled()) formatter = new DecimalFormatter<>(this);
}

abstract Operator<N> createOperator();
abstract Formula<N> createFormula(String formula);

@Override
Expand Down Expand Up @@ -155,7 +157,7 @@ public String replacePlaceholders(String string, UUID uuid, boolean safeForFormu
string = StringUtils.replaceEach(string, k, v);
}

return Beans.formatPlaceholders(data.isOnline() ? data.getPlayer() : null, string);
return main.library().replace(data.isOnline() ? data.getPlayer() : null, string);
}

@NotNull
Expand Down Expand Up @@ -214,9 +216,7 @@ public Map<String, AntiAbuse> getAntiAbuses() {
@NotNull
LevelUser<N> createUser(UUID uuid) {
Player player = Bukkit.getPlayer(uuid);
return player == null ?
new OfflineUser<>(this, Bukkit.getOfflinePlayer(uuid)) :
new OnlineUser<>(this, player);
return player == null ? createOffline(uuid) : new OnlineUser<>(this, player);
}

@NotNull
Expand Down Expand Up @@ -266,7 +266,7 @@ abstract class BaseFormula<T extends Number> implements Formula<T> {
@Getter
private final String asString;

abstract ExpressionBuilder<T> builder();
abstract Builder<T> builder();

@NotNull
public T evaluate(UUID uuid) {
Expand All @@ -277,6 +277,7 @@ public T evaluate(UUID uuid) {
try {
return builder().build(parsed).evaluate();
} catch (Throwable t) {
t.printStackTrace();
return operator.fromDouble(0.0);
}
}
Expand Down Expand Up @@ -304,14 +305,14 @@ public void update() {
List<LevelUser<T>> users = userManager.getUsersList();
updating = true;

Bukkit.getScheduler().runTaskAsynchronously(main, () -> {
main.scheduler().runTaskAsynchronously(() -> {
List<Entry<T>> list = new ArrayList<>();
for (LevelUser<T> user : users) list.add(toEntry(user));

list.sort(Comparator.naturalOrder());
List<Entry<T>> top10 = list.subList(0, Math.min(10, list.size()));

Bukkit.getScheduler().runTask(main, () -> {
main.scheduler().runTask(() -> {
topTenPlayers.clear();
topTenPlayers.addAll(top10);
updating = false;
Expand All @@ -321,23 +322,31 @@ public void update() {

@Override
public LevelUser<T> getTopPlayer(int position) {
return updating || position < 1 || position > 10 ? null : userManager.getUser(topTenPlayers.get(position - 1).getUuid());
}
if (updating || position < 1 || position > 10) return null;

@Override
public int checkPosition(Player player) {
UUID uuid = player.getUniqueId();
int index = position - 1;
List<Entry<T>> snapshot = new ArrayList<>(topTenPlayers);
if (index >= snapshot.size()) return null;

return userManager.getUser(snapshot.get(index).getUuid());
}

int check(UUID uuid) {
for (int i = 0; i < topTenPlayers.size(); i++)
if (uuid.equals(topTenPlayers.get(i).getUuid()))
return i + 1;

return -1;
}

@Override
public int checkPosition(Player player) {
return check(player.getUniqueId());
}

@Override
public int checkPosition(LevelUser<T> user) {
return checkPosition(user.getPlayer());
return check(user.getUuid());
}

abstract Entry<T> toEntry(LevelUser<T> user);
Expand All @@ -362,10 +371,10 @@ abstract class Entry<X extends Number> implements Comparable<Entry<X>> {
}

void updateLeaderboard() {
if (!main.isEnabled() || leaderboard == null) return;
if (!main.isEnabled() || leaderboard == null ||
!cache.config().isLeaderboardEnabled()) return;

if (cache.config().leaderboardInstantUpdate() && !leaderboard.isUpdating())
leaderboard.update();
if (!leaderboard.isUpdating()) leaderboard.update();
}

abstract class BaseUser<T extends Number> implements LevelUser<T> {
Expand Down Expand Up @@ -398,6 +407,8 @@ public void setHighestRewardedLevel(long value) {
}

void sendLevelReward(long level) {
if (!isOnline()) return;

if (!cache.config().preventDuplicateRewards()) {
getRewards(level).forEach(r -> r.giveAll(getPlayer()));
return;
Expand Down Expand Up @@ -427,12 +438,12 @@ void updateLevel(long newLevel, boolean sendMessage, boolean giveRewards) {

if (operator.compare(exp, operator.zero()) < 0) exp = operator.zero();

if (sendMessage) {
if (sendMessage && isOnline()) {
long diff = level - oldLevel;
if (diff > 0) {
cache.lang().sendMessage(getPlayer(), Lang::getGainedLevels, "gainedLevels", diff);
cache.lang().sendMessage(getPlayer(), Lang::getGainedLevels, new String[] {"gainedLevels", "level"}, diff, level);
} else if (diff < 0) {
cache.lang().sendMessage(getPlayer(), Lang::getLostLevels, "lostLevels", Math.abs(diff));
cache.lang().sendMessage(getPlayer(), Lang::getLostLevels, new String[] {"lostLevels", "level"}, Math.abs(diff), level);
}
}

Expand Down Expand Up @@ -460,6 +471,7 @@ public void removeLevel(long amount) {
private void changeExp(T amount, T difference, boolean sendMessage, boolean doMultiplier, boolean checkLeaderboard) {
if (operator.compare(amount, operator.zero()) == 0) return;

long startingLevel = level;
if (operator.compare(amount, operator.zero()) > 0 && level >= getMaxLevel())
return;

Expand All @@ -468,7 +480,6 @@ private void changeExp(T amount, T difference, boolean sendMessage, boolean doMu
amount = operator.multiply(amount, operator.fromDouble(getMultiplier()));

final T totalAmount = amount;
long levelsChanged = 0;

if (operator.compare(amount, operator.zero()) > 0) {
while (operator.compare(operator.add(exp, amount), rawRequiredExp()) >= 0) {
Expand All @@ -480,7 +491,6 @@ private void changeExp(T amount, T difference, boolean sendMessage, boolean doMu
amount = operator.add(operator.subtract(amount, rawRequiredExp()), exp);
exp = operator.zero();
level++;
levelsChanged++;
sendLevelReward(level);
}

Expand All @@ -492,7 +502,6 @@ private void changeExp(T amount, T difference, boolean sendMessage, boolean doMu
while (operator.compare(amount, exp) > 0 && level > getStartLevel()) {
amount = operator.subtract(amount, exp);
level--;
levelsChanged--;
exp = rawRequiredExp();
}
exp = operator.subtract(exp, amount);
Expand All @@ -506,7 +515,7 @@ private void changeExp(T amount, T difference, boolean sendMessage, boolean doMu
T displayTotal = (cache.config().stackComboExp() && System.currentTimeMillis() - lastTime <= 650)
? operator.add(amount, lastAmount) : amount;

if (sendMessage) {
if (sendMessage && isOnline()) {
T diff = operator.subtract(Objects.equals(displayTotal, operator.zero()) ? operator.zero() : displayTotal, difference);

if (operator.compare(totalAmount, operator.zero()) > 0) {
Expand All @@ -520,12 +529,6 @@ private void changeExp(T amount, T difference, boolean sendMessage, boolean doMu
system.roundString(operator.abs(diff)), system.roundString(operator.abs(totalAmount))
);
}

if (levelsChanged > 0) {
cache.lang().sendMessage(getPlayer(), Lang::getGainedLevels, "gainedLevels", levelsChanged);
} else if (levelsChanged < 0) {
cache.lang().sendMessage(getPlayer(), Lang::getLostLevels, "lostLevels", Math.abs(levelsChanged));
}
}

lastAmount = displayTotal;
Expand All @@ -534,6 +537,15 @@ private void changeExp(T amount, T difference, boolean sendMessage, boolean doMu
level = Math.max(getStartLevel(), Math.min(level, getMaxLevel()));
if (operator.compare(exp, operator.zero()) < 0) exp = operator.zero();

if (sendMessage && isOnline()) {
long levelDifference = level - startingLevel;
if (levelDifference > 0) {
cache.lang().sendMessage(getPlayer(), Lang::getGainedLevels, new String[] {"gainedLevels", "level"}, levelDifference, level);
} else if (levelDifference < 0) {
cache.lang().sendMessage(getPlayer(), Lang::getLostLevels, new String[] {"lostLevels", "level"}, Math.abs(levelDifference), level);
}
}

if (checkLeaderboard) system.updateLeaderboard();
}

Expand Down Expand Up @@ -606,6 +618,7 @@ public String getProgressBar() {

@Override
public boolean hasParentPerm(String permission, boolean checkOp) {
if (!isOnline()) return false;
if (checkOp && getPlayer().isOp()) return true;

for (PermissionAttachmentInfo node : getPlayer().getEffectivePermissions()) {
Expand All @@ -619,8 +632,9 @@ public boolean hasParentPerm(String permission, boolean checkOp) {

@Override
public double getMultiplier() {
double multiplier = 0;
if (!isOnline()) return 1;

double multiplier = 0;
for (PermissionAttachmentInfo perm : getPlayer().getEffectivePermissions()) {
if (!perm.getValue()) continue;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,27 +1,28 @@
package com.bitaspire.cyberlevels;

import com.bitaspire.cyberlevels.user.UserManager;
import com.bitaspire.libs.formula.BigDecimalExpressionBuilder;
import com.bitaspire.cyberlevels.level.Formula;
import com.bitaspire.cyberlevels.level.Operator;
import com.bitaspire.cyberlevels.user.LevelUser;
import com.bitaspire.libs.formula.expression.ExpressionBuilder;
import lombok.Getter;
import me.croabeast.expr4j.BigDecimalBuilder;
import me.croabeast.expr4j.expression.Builder;
import org.jetbrains.annotations.NotNull;

import java.math.BigDecimal;
import java.math.RoundingMode;

@Getter
final class BigDecimalLevelSystem extends BaseSystem<BigDecimal> {
final class BigDecimalSystem extends BaseSystem<BigDecimal> {

private final Operator<BigDecimal> operator;

BigDecimalLevelSystem(CyberLevels main) {
BigDecimalSystem(CyberLevels main) {
super(main);
setLeaderboardFunction(BigDecimalLeaderboard::new);
}

operator = new Operator<BigDecimal>() {
@Override
Operator<BigDecimal> createOperator() {
return new Operator<BigDecimal>() {
@Override
public BigDecimal zero() {
return BigDecimal.ZERO;
Expand Down Expand Up @@ -119,10 +120,10 @@ public int compareTo(@NotNull Entry<BigDecimal> other) {

@Override
Formula<BigDecimal> createFormula(String string) {
return new BaseFormula<BigDecimal>(operator, string) {
return new BaseFormula<BigDecimal>(getOperator(), string) {
@NotNull
ExpressionBuilder<BigDecimal> builder() {
return new BigDecimalExpressionBuilder();
Builder<BigDecimal> builder() {
return new BigDecimalBuilder();
}
};
}
Expand Down
Loading