Skip to content

Commit a99977f

Browse files
authored
Merge pull request #22 from IroriPowered/work/crash-fixes
draft: potential crash fixes
2 parents 8e08540 + 4cfc5f8 commit a99977f

2 files changed

Lines changed: 44 additions & 49 deletions

File tree

src/main/java/com/azuredoom/levelingcore/systems/level/MobLevelSystem.java

Lines changed: 44 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
import java.util.Locale;
1919
import java.util.concurrent.ConcurrentLinkedQueue;
20-
import java.util.concurrent.atomic.AtomicBoolean;
2120
import java.util.concurrent.atomic.AtomicLong;
2221

2322
import com.azuredoom.levelingcore.LevelingCore;
@@ -37,12 +36,12 @@ public class MobLevelSystem extends EntityTickingSystem<EntityStore> {
3736

3837
private final ConcurrentLinkedQueue<PendingUpdate> pending = new ConcurrentLinkedQueue<>();
3938

40-
private final AtomicBoolean drainScheduled = new AtomicBoolean(false);
41-
4239
private static final int MAX_UPDATES_PER_DRAIN = 1000;
4340

4441
private final Config<GUIConfig> config;
4542

43+
private boolean drainScheduled = false;
44+
4645
public MobLevelSystem(Config<GUIConfig> config) {
4746
this.config = config;
4847
}
@@ -95,65 +94,64 @@ public void tick(
9594

9695
data.lastRecalcMs = nowMs;
9796

98-
pending.add(new PendingUpdate(npc, transform, store, data));
97+
pending.add(new PendingUpdate(npc, transform, data));
9998

100-
if (drainScheduled.compareAndSet(false, true)) {
101-
store.getExternalData().getWorld().execute(() -> drainPending(store));
99+
if (!drainScheduled) {
100+
drainScheduled = true;
101+
drainPending(store);
102102
}
103103
}
104104

105105
private void drainPending(@NonNullDecl Store<EntityStore> store) {
106-
store.getExternalData().getWorld().execute(() -> {
107-
try {
108-
var mobMaxLevel = computeMobMaxLevel();
106+
try {
107+
var mobMaxLevel = computeMobMaxLevel();
109108

110-
var processed = 0;
111-
PendingUpdate u;
109+
var processed = 0;
110+
PendingUpdate u;
112111

113-
while (processed < MAX_UPDATES_PER_DRAIN && (u = pending.poll()) != null) {
114-
var npc = u.npc();
115-
var transform = u.transform();
116-
var store1 = u.store();
117-
var data = u.data();
112+
while (processed < MAX_UPDATES_PER_DRAIN && (u = pending.poll()) != null) {
113+
var npc = u.npc();
114+
var transform = u.transform();
115+
var data = u.data();
118116

119-
if (data.locked)
120-
continue;
117+
if (data.locked)
118+
continue;
121119

122-
var newLevel = Math.max(
123-
1,
124-
Math.min(mobMaxLevel, MobLevelingUtil.computeDynamicLevel(config, npc, transform, store1))
125-
);
120+
var newLevel = Math.max(
121+
1,
122+
Math.min(mobMaxLevel, MobLevelingUtil.computeDynamicLevel(config, npc, transform, store))
123+
);
126124

127-
if (newLevel != data.level) {
128-
data.level = newLevel;
129-
}
125+
if (newLevel != data.level) {
126+
data.level = newLevel;
127+
}
130128

131-
if (!data.locked) {
132-
data.level = Math.max(
133-
1,
134-
Math.min(
135-
mobMaxLevel,
136-
MobLevelingUtil.computeDynamicLevel(config, npc, transform, store1)
137-
)
138-
);
139-
}
129+
if (!data.locked) {
130+
data.level = Math.max(
131+
1,
132+
Math.min(
133+
mobMaxLevel,
134+
MobLevelingUtil.computeDynamicLevel(config, npc, transform, store)
135+
)
136+
);
137+
}
140138

141-
if (data.level != data.lastAppliedLevel) {
142-
if (MobLevelingUtil.applyMobScaling(config, npc, data.level, store1)) {
143-
data.lastAppliedLevel = data.level;
144-
}
139+
if (data.level != data.lastAppliedLevel) {
140+
if (MobLevelingUtil.applyMobScaling(config, npc, data.level, store)) {
141+
data.lastAppliedLevel = data.level;
145142
}
146-
147-
processed++;
148143
}
149-
} finally {
150-
drainScheduled.set(false);
151144

152-
if (!pending.isEmpty() && drainScheduled.compareAndSet(false, true)) {
153-
store.getExternalData().getWorld().execute(() -> drainPending(store));
154-
}
145+
processed++;
146+
}
147+
} finally {
148+
if (!pending.isEmpty()) {
149+
drainScheduled = true;
150+
drainPending(store);
151+
} else {
152+
drainScheduled = false;
155153
}
156-
});
154+
}
157155
}
158156

159157
private int computeMobMaxLevel() {
Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
package com.azuredoom.levelingcore.utils;
22

3-
import com.hypixel.hytale.component.Store;
43
import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
5-
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
64
import com.hypixel.hytale.server.npc.entities.NPCEntity;
75

86
import com.azuredoom.levelingcore.level.mobs.MobLevelData;
97

108
public record PendingUpdate(
119
NPCEntity npc,
1210
TransformComponent transform,
13-
Store<EntityStore> store,
1411
MobLevelData data
1512
) {}

0 commit comments

Comments
 (0)