Skip to content

Commit bc7e95a

Browse files
authored
Merge pull request #568 from ItzKatze/master
feat: tons of enchants added
2 parents 4c44381 + 4c021ce commit bc7e95a

30 files changed

Lines changed: 1719 additions & 10 deletions

configuration/skyblock/collections/combat.yml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ collections:
1717
- type: XP
1818
data:
1919
xp: 4
20+
- type: CUSTOM_AWARD
21+
data:
22+
customAward: FIRE_ASPECT_DISCOUNT
2023
- amount: 1000
2124
rewards:
2225
- type: XP
@@ -345,6 +348,9 @@ collections:
345348
- type: XP
346349
data:
347350
xp: 4
351+
- type: CUSTOM_AWARD
352+
data:
353+
customAward: VAMPIRISM_DISCOUNT
348354
- amount: 5000
349355
rewards:
350356
- type: XP
@@ -413,6 +419,9 @@ collections:
413419
- type: XP
414420
data:
415421
xp: 4
422+
- type: CUSTOM_AWARD
423+
data:
424+
customAward: THUNDERLORD_DISCOUNT
416425
- amount: 5000
417426
rewards:
418427
- type: XP
@@ -593,6 +602,9 @@ collections:
593602
- type: XP
594603
data:
595604
xp: 4
605+
- type: CUSTOM_AWARD
606+
data:
607+
customAward: KNOCKBACK_DISCOUNT
596608
- amount: 1000
597609
rewards:
598610
- type: XP
@@ -680,6 +692,9 @@ collections:
680692
- type: XP
681693
data:
682694
xp: 4
695+
- type: CUSTOM_AWARD
696+
data:
697+
customAward: VENOMOUS_DISCOUNT
683698
- amount: 10000
684699
rewards:
685700
- type: XP

configuration/skyblock/collections/fishing.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,9 @@ collections:
386386
- type: XP
387387
data:
388388
xp: 4
389+
- type: CUSTOM_AWARD
390+
data:
391+
customAward: CLEAVE_DISCOUNT
389392
- amount: 150
390393
rewards:
391394
- type: XP

configuration/skyblock/collections/mining.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,9 @@ collections:
379379
- type: XP
380380
data:
381381
xp: 4
382+
- type: CUSTOM_AWARD
383+
data:
384+
customAward: EXPERIENCE_DISCOUNT
382385
- amount: 2000
383386
rewards:
384387
- type: XP
@@ -1301,6 +1304,9 @@ collections:
13011304
- type: XP
13021305
data:
13031306
xp: 4
1307+
- type: CUSTOM_AWARD
1308+
data:
1309+
customAward: LETHALITY_DISCOUNT
13041310
- amount: 250
13051311
rewards:
13061312
- type: XP

type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/collection/CustomCollectionAward.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,17 @@ public enum CustomCollectionAward {
2727
BANE_OF_ARTHROPODS_DISCOUNT("§9Bane of Arthropods §7Exp Discount §a(-25%)"),
2828
CUBISM_DISCOUNT("§9Cubism §7Exp Discount §a(-25%)"),
2929
FORTUNE_DISCOUNT("§9Fortune §7Exp Discount §a(-25%)"),
30+
CLEAVE_DISCOUNT("§9Cleave §7Exp Discount §a(-25%)"),
31+
LIFE_STEAL_DISCOUNT("§9Life Steal §7Exp Discount §a(-25%)"),
32+
PROSECUTE_DISCOUNT("§9Prosecute §7Exp Discount §a(-25%)"),
33+
THUNDERBOLT_DISCOUNT("§9Thunderbolt §7Exp Discount §a(-25%)"),
34+
EXPERIENCE_DISCOUNT("§9Experience §7Exp Discount §a(-25%)"),
35+
FIRE_ASPECT_DISCOUNT("§9Fire Aspect §7Exp Discount §a(-25%)"),
36+
KNOCKBACK_DISCOUNT("§9Knockback §7Exp Discount §a(-25%)"),
37+
LETHALITY_DISCOUNT("§9Lethality §7Exp Discount §a(-25%)"),
38+
THUNDERLORD_DISCOUNT("§9Thunderlord §7Exp Discount §a(-25%)"),
39+
VAMPIRISM_DISCOUNT("§9Vampirism §7Exp Discount §a(-25%)"),
40+
VENOMOUS_DISCOUNT("§9Venomous §7Exp Discount §a(-25%)"),
3041

3142
// BAGS
3243
QUIVER("§aQuiver"),

type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/enchantment/EnchantmentType.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99
import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer;
1010
import org.jetbrains.annotations.Nullable;
1111

12-
import java.util.List;
13-
1412
@Getter
1513
public enum EnchantmentType {
1614
SHARPNESS(EnchantmentSharpness.class),
@@ -32,6 +30,20 @@ public enum EnchantmentType {
3230
BANE_OF_ARTHROPODS(EnchantmentBaneOfArthropods.class),
3331
CUBISM(EnchantmentCubism.class),
3432
FORTUNE(EnchantmentFortune.class),
33+
CLEAVE(EnchantmentCleave.class),
34+
EXPERIENCE(EnchantmentExperience.class),
35+
FIRE_ASPECT(EnchantmentFireAspect.class),
36+
KNOCKBACK(EnchantmentKnockback.class),
37+
LETHALITY(EnchantmentLethality.class),
38+
LIFE_STEAL(EnchantmentLifeSteal.class),
39+
DRAIN(EnchantmentDrain.class),
40+
MANA_STEAL(EnchantmentManaSteal.class),
41+
PROSECUTE(EnchantmentProsecute.class),
42+
THUNDERBOLT(EnchantmentThunderbolt.class),
43+
THUNDERLORD(EnchantmentThunderlord.class),
44+
VAMPIRISM(EnchantmentVampirism.class),
45+
VENOMOUS(EnchantmentVenomous.class),
46+
VICIOUS(EnchantmentVicious.class),
3547
;
3648

3749
private final Class<? extends Ench> clazz;
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package net.swofty.type.skyblockgeneric.enchantment.abstr;
2+
3+
import net.minestom.server.entity.LivingEntity;
4+
import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer;
5+
6+
public interface DamageEventEnchant {
7+
default void onDamageDealt(SkyBlockPlayer player, LivingEntity target, double damageDealt, int level) {
8+
}
9+
}
10+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package net.swofty.type.skyblockgeneric.enchantment.abstr;
2+
3+
import net.swofty.type.skyblockgeneric.entity.mob.SkyBlockMob;
4+
import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer;
5+
6+
public interface KillEventEnchant {
7+
default void onMobKilled(SkyBlockPlayer player, SkyBlockMob killedMob, int level) {
8+
}
9+
}
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
package net.swofty.type.skyblockgeneric.enchantment.debuff;
2+
3+
import lombok.Getter;
4+
import net.minestom.server.MinecraftServer;
5+
import net.minestom.server.timer.TaskSchedule;
6+
import net.swofty.type.skyblockgeneric.entity.mob.SkyBlockMob;
7+
8+
import java.util.Map;
9+
import java.util.UUID;
10+
import java.util.concurrent.ConcurrentHashMap;
11+
12+
public class LethalityDebuff {
13+
14+
public static final double[] DEFENSE_REDUCTION_PERCENTAGES = new double[]{0.012, 0.024, 0.036, 0.048, 0.06, 0.09};
15+
16+
private static final int MAX_STACKS = 4;
17+
18+
private static final int STACK_DURATION_SECONDS = 4;
19+
20+
private static final Map<UUID, LethalityStacks> activeDebuffs = new ConcurrentHashMap<>();
21+
22+
public static void applyStack(SkyBlockMob mob, int level) {
23+
if (level < 1 || level > 6) return;
24+
25+
UUID mobId = mob.getUuid();
26+
double defenseReduction = DEFENSE_REDUCTION_PERCENTAGES[level - 1];
27+
28+
LethalityStacks stacks = activeDebuffs.computeIfAbsent(mobId, k -> new LethalityStacks());
29+
30+
if (stacks.getStackCount() < MAX_STACKS) {
31+
stacks.addStack(defenseReduction);
32+
} else {
33+
stacks.replaceOldestStack(defenseReduction);
34+
}
35+
36+
if (stacks.getStackCount() == 1) {
37+
scheduleCleanup(mobId);
38+
}
39+
}
40+
41+
public static double getTotalDefenseReduction(UUID mobId) {
42+
LethalityStacks stacks = activeDebuffs.get(mobId);
43+
return stacks != null ? stacks.getTotalReduction() : 0.0;
44+
}
45+
46+
private static void scheduleCleanup(UUID mobId) {
47+
MinecraftServer.getSchedulerManager().scheduleTask(() -> {
48+
LethalityStacks stacks = activeDebuffs.get(mobId);
49+
if (stacks != null) {
50+
stacks.removeExpiredStacks();
51+
if (stacks.getStackCount() == 0) {
52+
activeDebuffs.remove(mobId);
53+
} else {
54+
scheduleCleanup(mobId);
55+
}
56+
}
57+
}, TaskSchedule.seconds(STACK_DURATION_SECONDS), TaskSchedule.stop());
58+
}
59+
60+
private static class LethalityStacks {
61+
private final LethalityStack[] stacks = new LethalityStack[MAX_STACKS];
62+
@Getter
63+
private int stackCount = 0;
64+
65+
public void addStack(double defenseReduction) {
66+
if (stackCount < MAX_STACKS) {
67+
stacks[stackCount] = new LethalityStack(defenseReduction);
68+
stackCount++;
69+
}
70+
}
71+
72+
public void replaceOldestStack(double defenseReduction) {
73+
if (stackCount > 0) {
74+
System.arraycopy(stacks, 1, stacks, 0, stackCount - 1);
75+
stacks[stackCount - 1] = new LethalityStack(defenseReduction);
76+
}
77+
}
78+
79+
public void removeExpiredStacks() {
80+
long currentTime = System.currentTimeMillis();
81+
int newCount = 0;
82+
83+
for (int i = 0; i < stackCount; i++) {
84+
if (!stacks[i].isExpired(currentTime)) {
85+
stacks[newCount] = stacks[i];
86+
newCount++;
87+
}
88+
}
89+
90+
stackCount = newCount;
91+
}
92+
93+
public double getTotalReduction() {
94+
double total = 0.0;
95+
long currentTime = System.currentTimeMillis();
96+
97+
for (int i = 0; i < stackCount; i++) {
98+
if (!stacks[i].isExpired(currentTime)) {
99+
total += stacks[i].getDefenseReduction();
100+
}
101+
}
102+
103+
return total;
104+
}
105+
}
106+
107+
private static class LethalityStack {
108+
@Getter
109+
private final double defenseReduction;
110+
private final long expirationTime;
111+
112+
public LethalityStack(double defenseReduction) {
113+
this.defenseReduction = defenseReduction;
114+
this.expirationTime = System.currentTimeMillis() + (STACK_DURATION_SECONDS * 1000L);
115+
}
116+
117+
public boolean isExpired(long currentTime) {
118+
return currentTime > expirationTime;
119+
}
120+
}
121+
}
122+
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package net.swofty.type.skyblockgeneric.enchantment.debuff;
2+
3+
import net.minestom.server.entity.EntityType;
4+
import net.minestom.server.entity.LivingEntity;
5+
import net.minestom.server.entity.damage.Damage;
6+
import net.minestom.server.entity.damage.DamageType;
7+
import net.swofty.type.skyblockgeneric.entity.mob.SkyBlockMob;
8+
import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer;
9+
import net.swofty.type.skyblockgeneric.utility.DamageIndicator;
10+
11+
import java.util.Map;
12+
import java.util.UUID;
13+
import java.util.concurrent.ConcurrentHashMap;
14+
15+
16+
public class ThunderboltTracker {
17+
18+
public static final double[] THUNDERBOLT_DAMAGE_PERCENTAGES = new double[]{0.04, 0.08, 0.12, 0.16, 0.20, 0.25, 0.30};
19+
public static final double[] THUNDERLORD_DAMAGE_PERCENTAGES = new double[]{0.08, 0.16, 0.24, 0.32, 0.40, 0.50, 0.60};
20+
21+
private static final int HITS_PER_LIGHTNING = 3;
22+
23+
// Map<playerId, Map<mobId, hitCount>> - tracks hits per mob per player
24+
private static final Map<UUID, Map<UUID, Integer>> playerMobHitCounters = new ConcurrentHashMap<>();
25+
26+
public enum LightningType {
27+
THUNDERBOLT,
28+
THUNDERLORD
29+
}
30+
31+
public static void registerHit(SkyBlockPlayer player, LivingEntity target, double damageDealt, int level, LightningType type) {
32+
if (level < 1 || level > 7) return;
33+
if (!(target instanceof SkyBlockMob)) return;
34+
35+
UUID playerId = player.getUuid();
36+
UUID mobId = target.getUuid();
37+
38+
// Get or create the player's mob hit counter map
39+
Map<UUID, Integer> mobCounters = playerMobHitCounters.computeIfAbsent(playerId, k -> new ConcurrentHashMap<>());
40+
41+
// Increment hit counter for this specific mob
42+
int currentHits = mobCounters.getOrDefault(mobId, 0);
43+
currentHits++;
44+
45+
if (currentHits >= HITS_PER_LIGHTNING) {
46+
triggerLightningStrike(player, target, damageDealt, level, type);
47+
mobCounters.remove(mobId); // Reset counter for this mob
48+
} else {
49+
mobCounters.put(mobId, currentHits);
50+
}
51+
}
52+
53+
private static void triggerLightningStrike(SkyBlockPlayer player, LivingEntity originalTarget, double baseDamage, int level, LightningType type) {
54+
if (!(originalTarget instanceof SkyBlockMob)) return;
55+
56+
double[] damagePercentages = (type == LightningType.THUNDERBOLT) ? THUNDERBOLT_DAMAGE_PERCENTAGES : THUNDERLORD_DAMAGE_PERCENTAGES;
57+
double damagePercentage = damagePercentages[level - 1];
58+
double lightningDamage = baseDamage * damagePercentage;
59+
60+
if (lightningDamage <= 0) return;
61+
62+
originalTarget.damage(new Damage(DamageType.PLAYER_ATTACK, player, player, player.getPosition(), (float) lightningDamage));
63+
64+
new DamageIndicator()
65+
.damage((float) lightningDamage)
66+
.pos(originalTarget.getPosition())
67+
.critical(false)
68+
.display(originalTarget.getInstance());
69+
70+
LivingEntity lightningBolt = new LivingEntity(EntityType.LIGHTNING_BOLT);
71+
lightningBolt.setInstance(originalTarget.getInstance(), originalTarget.getPosition());
72+
lightningBolt.scheduleRemove(java.time.Duration.ofSeconds(1));
73+
}
74+
75+
/**
76+
* Cleans up hit counters for a specific mob (call when mob dies or is removed)
77+
*/
78+
public static void cleanupMobCounters(UUID mobId) {
79+
for (Map<UUID, Integer> mobCounters : playerMobHitCounters.values()) {
80+
mobCounters.remove(mobId);
81+
}
82+
}
83+
84+
}
85+

0 commit comments

Comments
 (0)