Skip to content

Commit 1bf4412

Browse files
Merge branch 'mcMMO-Dev:master' into dev/1.21.4
2 parents 7c879cc + 9eb8f4e commit 1bf4412

14 files changed

Lines changed: 144 additions & 121 deletions

File tree

Changelog.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
1+
Version 2.2.039
2+
Added StackOverflow safeguards for abilities dealing damage in mcMMO
3+
Improved compatibility with MythicMobs/ModelEngine
4+
Improved compatibility with AdvancedEnchantments
5+
16
Version 2.2.038
27
Fix potion match failing for non-english locales
8+
FoliaLib Performance improvements (thanks SirSalad)
9+
Fixed situations where Rupture could never end which affected server performance
310

411
Version 2.2.037
512
Fixed bug where Alchemy was not matching potions correctly and producing incorrect results (Thanks TheBentoBox)

pom.xml

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<modelVersion>4.0.0</modelVersion>
33
<groupId>com.gmail.nossr50.mcMMO</groupId>
44
<artifactId>mcMMO</artifactId>
5-
<version>2.2.038-SNAPSHOT</version>
5+
<version>2.2.040-SNAPSHOT</version>
66
<name>mcMMO</name>
77
<url>https://github.com/mcMMO-Dev/mcMMO</url>
88
<scm>
@@ -171,7 +171,7 @@
171171
<include>net.kyori:option</include>
172172
<include>net.kyori:adventure-text-serializer-craftbukkit</include>
173173
<include>co.aikar:acf-bukkit</include>
174-
<include>com.github.technicallycoded:FoliaLib</include>
174+
<include>com.tcoded:FoliaLib</include>
175175
</includes>
176176
</artifactSet>
177177
<relocations>
@@ -277,6 +277,10 @@
277277
<id>jitpack</id>
278278
<url>https://jitpack.io</url>
279279
</repository>
280+
<repository>
281+
<id>tcoded-releases</id>
282+
<url>https://repo.tcoded.com/releases/</url>
283+
</repository>
280284
</repositories>
281285
<dependencies>
282286
<!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
@@ -462,9 +466,9 @@
462466
<scope>compile</scope>
463467
</dependency>
464468
<dependency>
465-
<groupId>com.github.technicallycoded</groupId>
469+
<groupId>com.tcoded</groupId>
466470
<artifactId>FoliaLib</artifactId>
467-
<version>dev-SNAPSHOT</version>
471+
<version>0.5.1</version>
468472
<scope>compile</scope>
469473
</dependency>
470474
</dependencies>

src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.gmail.nossr50.mcMMO;
2222
import com.gmail.nossr50.party.ShareHandler;
2323
import com.gmail.nossr50.runnables.skills.AbilityDisableTask;
24+
import com.gmail.nossr50.runnables.skills.RuptureTask;
2425
import com.gmail.nossr50.runnables.skills.ToolLowerTask;
2526
import com.gmail.nossr50.skills.SkillManager;
2627
import com.gmail.nossr50.skills.acrobatics.AcrobaticsManager;
@@ -1144,14 +1145,17 @@ public FixedMetadataValue getPlayerMetadata() {
11441145
* @param syncSave if true, data is saved synchronously
11451146
*/
11461147
public void logout(boolean syncSave) {
1147-
Player thisPlayer = getPlayer();
1148-
if (getPlayer().hasMetadata(MetadataConstants.METADATA_KEY_RUPTURE)) {
1149-
RuptureTaskMeta ruptureTaskMeta = (RuptureTaskMeta) getPlayer().getMetadata(MetadataConstants.METADATA_KEY_RUPTURE).get(0);
1150-
1151-
//Punish a logout
1152-
ruptureTaskMeta.getRuptureTimerTask().endRupture();
1153-
ruptureTaskMeta.getRuptureTimerTask().endRupture();
1154-
ruptureTaskMeta.getRuptureTimerTask().endRupture();
1148+
final Player thisPlayer = getPlayer();
1149+
if (getPlayer() != null && getPlayer().hasMetadata(MetadataConstants.METADATA_KEY_RUPTURE)) {
1150+
final RuptureTaskMeta ruptureTaskMeta
1151+
= (RuptureTaskMeta) getPlayer().getMetadata(MetadataConstants.METADATA_KEY_RUPTURE).get(0);
1152+
if (ruptureTaskMeta != null) {
1153+
final RuptureTask ruptureTimerTask = ruptureTaskMeta.getRuptureTimerTask();
1154+
if(ruptureTimerTask != null) {
1155+
ruptureTimerTask.cancel();
1156+
}
1157+
getPlayer().removeMetadata(MetadataConstants.METADATA_KEY_RUPTURE, mcMMO.p);
1158+
}
11551159
}
11561160

11571161
cleanup();

src/main/java/com/gmail/nossr50/listeners/EntityListener.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -296,10 +296,6 @@ public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
296296
// However, for entities, we do not wanna cancel this event to allow plugins to observe changes
297297
// properly
298298

299-
if (CombatUtils.isProcessingNoInvulnDamage()) {
300-
return;
301-
}
302-
303299
if (event.getEntity() instanceof ArmorStand) {
304300
return;
305301
}
@@ -662,7 +658,7 @@ else if (livingEntity instanceof Tameable pet) {
662658
*/
663659
@EventHandler(priority = EventPriority.LOWEST)
664660
public void onEntityDeathLowest(EntityDeathEvent event) {
665-
LivingEntity entity = event.getEntity();
661+
final LivingEntity entity = event.getEntity();
666662

667663
// Clear metadata for Slimes/Magma Cubes after transformation events take place, otherwise small spawned slimes will not have any tags
668664
if (TRANSFORMABLE_ENTITIES.contains(entity.getType())) {
@@ -680,7 +676,7 @@ public void onEntityDeathLowest(EntityDeathEvent event) {
680676
*/
681677
@EventHandler(ignoreCancelled = true)
682678
public void onEntityDeath(EntityDeathEvent event) {
683-
LivingEntity entity = event.getEntity();
679+
final LivingEntity entity = event.getEntity();
684680

685681
if (mcMMO.getTransientEntityTracker().isTransient(entity)) {
686682
mcMMO.getTransientEntityTracker().killSummonAndCleanMobFlags(entity, null, false);

src/main/java/com/gmail/nossr50/listeners/PlayerListener.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import com.gmail.nossr50.events.McMMOReplaceVanillaTreasureEvent;
1111
import com.gmail.nossr50.locale.LocaleLoader;
1212
import com.gmail.nossr50.mcMMO;
13-
import com.gmail.nossr50.party.ShareHandler;
1413
import com.gmail.nossr50.runnables.MobHealthDisplayUpdaterTask;
1514
import com.gmail.nossr50.runnables.player.PlayerProfileLoadingTask;
1615
import com.gmail.nossr50.skills.fishing.FishingManager;
@@ -26,8 +25,6 @@
2625
import com.gmail.nossr50.util.scoreboards.ScoreboardManager;
2726
import com.gmail.nossr50.util.skills.RankUtils;
2827
import com.gmail.nossr50.util.skills.SkillUtils;
29-
import com.gmail.nossr50.util.sounds.SoundManager;
30-
import com.gmail.nossr50.util.sounds.SoundType;
3128
import com.gmail.nossr50.worldguard.WorldGuardManager;
3229
import com.gmail.nossr50.worldguard.WorldGuardUtils;
3330
import org.bukkit.Bukkit;

src/main/java/com/gmail/nossr50/mcMMO.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import com.gmail.nossr50.util.upgrade.UpgradeManager;
5050
import com.gmail.nossr50.worldguard.WorldGuardManager;
5151
import com.tcoded.folialib.FoliaLib;
52+
import com.tcoded.folialib.impl.FoliaImplementation;
5253
import com.tcoded.folialib.util.InvalidTickDelayNotifier;
5354
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
5455
import net.shatteredlands.shatt.backup.ZipLibrary;
@@ -161,7 +162,11 @@ public void onEnable() {
161162

162163
//Folia lib plugin instance
163164
foliaLib = new FoliaLib(this);
164-
InvalidTickDelayNotifier.disableNotifications = true;
165+
foliaLib.getOptions().disableNotifications();
166+
// Performance optimization
167+
// This makes the scheduler behave differently between Spigot/Legacy-Paper & Folia/Modern-Paper
168+
foliaLib.getOptions().disableIsValidOnNonFolia();
169+
165170

166171
setupFilePaths();
167172
generalConfig = new GeneralConfig(getDataFolder()); //Load before skillTools

src/main/java/com/gmail/nossr50/runnables/skills/RuptureTask.java

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ public class RuptureTask extends CancellableRunnable {
2828
private int damageTickTracker;
2929
private int animationTick;
3030
private final double pureTickDamage;
31+
// failsafe to ensure Rupture always exits and does not run forever
32+
private int totalTicks = 0;
33+
private final int totalTickCeiling;
3134

3235
/**
3336
* Constructor for the RuptureTask class.
@@ -41,7 +44,7 @@ public RuptureTask(@NotNull McMMOPlayer ruptureSource, @NotNull LivingEntity tar
4144
this.ruptureSource = ruptureSource;
4245
this.targetEntity = targetEntity;
4346
this.expireTick = mcMMO.p.getAdvancedConfig().getRuptureDurationSeconds(targetEntity instanceof Player) * 20;
44-
47+
this.totalTickCeiling = Math.min(this.expireTick, 200);
4548
this.ruptureTick = 0;
4649
this.damageTickTracker = 0;
4750
this.animationTick = ANIMATION_TICK_INTERVAL; //Play an animation right away
@@ -68,6 +71,14 @@ public RuptureTask(@NotNull McMMOPlayer ruptureSource, @NotNull LivingEntity tar
6871

6972
@Override
7073
public void run() {
74+
// always increment the fail-safe
75+
totalTicks++;
76+
77+
if (totalTicks >= totalTickCeiling) {
78+
this.cancel();
79+
return;
80+
}
81+
7182
//Check validity
7283
if (targetEntity.isValid()) {
7384
ruptureTick += 1; //Advance rupture tick by 1.
@@ -78,7 +89,6 @@ public void run() {
7889
if (ruptureTick < expireTick) {
7990
//Is it time to damage?
8091
if (damageTickTracker >= DAMAGE_TICK_INTERVAL) {
81-
8292
damageTickTracker = 0; //Reset timer
8393
if (applyRupture()) return;
8494

@@ -92,8 +102,8 @@ public void run() {
92102
endRupture();
93103
}
94104
} else {
95-
targetEntity.removeMetadata(MetadataConstants.METADATA_KEY_RUPTURE, mcMMO.p);
96105
this.cancel(); //Task no longer needed
106+
targetEntity.removeMetadata(MetadataConstants.METADATA_KEY_RUPTURE, mcMMO.p);
97107
}
98108
}
99109

@@ -152,7 +162,7 @@ public void refreshRupture() {
152162
ruptureTick = 0;
153163
}
154164

155-
public void endRupture() {
165+
private void endRupture() {
156166
targetEntity.removeMetadata(MetadataConstants.METADATA_KEY_RUPTURE, mcMMO.p);
157167
this.cancel(); //Task no longer needed
158168
}
@@ -171,6 +181,20 @@ private double calculateAdjustedTickDamage() {
171181
return tickDamage;
172182
}
173183

184+
@Override
185+
public final boolean equals(Object o) {
186+
if (!(o instanceof RuptureTask that)) return false;
187+
188+
return ruptureSource.equals(that.ruptureSource) && targetEntity.equals(that.targetEntity);
189+
}
190+
191+
@Override
192+
public int hashCode() {
193+
int result = ruptureSource.hashCode();
194+
result = 31 * result + targetEntity.hashCode();
195+
return result;
196+
}
197+
174198
@Override
175199
public String toString() {
176200
return "RuptureTask{" +
@@ -179,25 +203,10 @@ public String toString() {
179203
", expireTick=" + expireTick +
180204
", ruptureTick=" + ruptureTick +
181205
", damageTickTracker=" + damageTickTracker +
206+
", animationTick=" + animationTick +
182207
", pureTickDamage=" + pureTickDamage +
208+
", totalTicks=" + totalTicks +
209+
", totalTickCeiling=" + totalTickCeiling +
183210
'}';
184211
}
185-
186-
@Override
187-
public boolean equals(Object o) {
188-
if (this == o) return true;
189-
if (o == null || getClass() != o.getClass()) return false;
190-
RuptureTask that = (RuptureTask) o;
191-
return expireTick == that.expireTick
192-
&& ruptureTick == that.ruptureTick
193-
&& damageTickTracker == that.damageTickTracker
194-
&& Double.compare(that.pureTickDamage, pureTickDamage) == 0
195-
&& Objects.equal(ruptureSource, that.ruptureSource) && Objects.equal(targetEntity, that.targetEntity);
196-
}
197-
198-
@Override
199-
public int hashCode() {
200-
return Objects.hashCode(ruptureSource, targetEntity, expireTick,
201-
ruptureTick, damageTickTracker, pureTickDamage);
202-
}
203212
}

src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -572,7 +572,8 @@ public void shakeCheck(@NotNull LivingEntity target) {
572572

573573
ItemUtils.spawnItem(getPlayer(), target.getLocation(), drop, ItemSpawnReason.FISHING_SHAKE_TREASURE);
574574
// Make it so you can shake a mob no more than 4 times.
575-
CombatUtils.dealDamage(target, Math.min(Math.max(target.getMaxHealth() / 4, 1), 10), getPlayer());
575+
double dmg = Math.min(Math.max(target.getMaxHealth() / 4, 1), 10);
576+
CombatUtils.safeDealDamage(target, dmg, getPlayer());
576577
applyXpGain(ExperienceConfig.getInstance().getFishingShakeXP(), XPGainReason.PVE);
577578
}
578579
}

src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import com.gmail.nossr50.mcMMO;
1111
import com.gmail.nossr50.runnables.skills.RuptureTask;
1212
import com.gmail.nossr50.skills.SkillManager;
13-
import com.gmail.nossr50.util.ItemUtils;
1413
import com.gmail.nossr50.util.MetadataConstants;
1514
import com.gmail.nossr50.util.Permissions;
1615
import com.gmail.nossr50.util.player.NotificationManager;
@@ -20,7 +19,6 @@
2019
import org.bukkit.entity.Entity;
2120
import org.bukkit.entity.LivingEntity;
2221
import org.bukkit.entity.Player;
23-
import org.bukkit.inventory.ItemStack;
2422
import org.jetbrains.annotations.NotNull;
2523

2624
public class SwordsManager extends SkillManager {
@@ -124,12 +122,14 @@ public double getStabDamage() {
124122
*/
125123
public void counterAttackChecks(@NotNull LivingEntity attacker, double damage) {
126124
if (ProbabilityUtil.isSkillRNGSuccessful(SubSkillType.SWORDS_COUNTER_ATTACK, mmoPlayer)) {
127-
CombatUtils.dealDamage(attacker, damage / Swords.counterAttackModifier, getPlayer());
125+
CombatUtils.safeDealDamage(attacker, damage / Swords.counterAttackModifier, getPlayer());
128126

129-
NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Countered");
127+
NotificationManager.sendPlayerInformation(getPlayer(),
128+
NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Countered");
130129

131130
if (attacker instanceof Player) {
132-
NotificationManager.sendPlayerInformation((Player)attacker, NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Counter.Hit");
131+
NotificationManager.sendPlayerInformation((Player)attacker,
132+
NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Counter.Hit");
133133
}
134134
}
135135
}

src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,8 @@ public void processTreeFeller(Block startingBlock) {
163163
double health = player.getHealth();
164164

165165
if (health > 1) {
166-
CombatUtils.dealDamage(player, Misc.getRandom().nextInt((int) (health - 1)));
166+
int dmg = Misc.getRandom().nextInt((int) (health - 1));
167+
CombatUtils.safeDealDamage(player, dmg);
167168
}
168169

169170
return;

0 commit comments

Comments
 (0)