fixed occasional crashes with offline players and readded oxygen loss on sprinting/jumping

This commit is contained in:
illuc 2026-02-25 21:17:19 +02:00
parent 6a717093b2
commit 4018b122dc
2 changed files with 48 additions and 18 deletions

View file

@ -23,7 +23,7 @@ public class OfflinePlayerEvents {
public static void onPlayerLogOut(PlayerEvent.PlayerLoggedOutEvent event) { public static void onPlayerLogOut(PlayerEvent.PlayerLoggedOutEvent event) {
ServerPlayer player = (ServerPlayer) event.getEntity(); ServerPlayer player = (ServerPlayer) event.getEntity();
System.out.println("event triggered"); //System.out.println("event triggered");
player.level().addFreshEntity(OfflinePlayerEntity.createFromPlayer(player)); player.level().addFreshEntity(OfflinePlayerEntity.createFromPlayer(player));
} }
@ -34,14 +34,14 @@ public class OfflinePlayerEvents {
return; return;
} }
ServerPlayer player = (ServerPlayer) event.getEntity(); ServerPlayer player = (ServerPlayer) event.getEntity();
System.out.println("event triggered"); //System.out.println("event triggered");
boolean foundPlayer = false; boolean foundPlayer = false;
for (ServerLevel world : player.level().getServer().getAllLevels()) { for (ServerLevel world : player.level().getServer().getAllLevels()) {
Optional<OfflinePlayerEntity> persistentPlayer = findPersistentPlayer(world, player.getUUID()); Optional<OfflinePlayerEntity> persistentPlayer = findPersistentPlayer(world, player.getUUID());
if (persistentPlayer.isPresent()) { if (persistentPlayer.isPresent()) {
System.out.println("Player present"); //System.out.println("Player present");
OfflinePlayerEntity p = persistentPlayer.get(); OfflinePlayerEntity p = persistentPlayer.get();
p.toPlayer(player); p.toPlayer(player);
p.remove(Entity.RemovalReason.DISCARDED); p.remove(Entity.RemovalReason.DISCARDED);
@ -50,7 +50,7 @@ public class OfflinePlayerEvents {
} }
} }
if (!foundPlayer) { if (!foundPlayer) {
System.out.println("Player not found!"); //System.out.println("Player not found!");
} }
} }
@ -88,21 +88,23 @@ public class OfflinePlayerEvents {
float passDamage = damage; float passDamage = damage;
ph.applyPain(randLimb, ph.painFromDamage((float)((double)passDamage * (Math.random() / (double)2.0F + (double)1.0F)))); if (event.getSource().getEntity() instanceof Player fp) { //pmo why do some damage things need a player and some dont
ph.applyMuscleDamage(randLimb, (float)((double)passDamage * (Math.random() / (double)2.0F + (double)0.5F)), (Player) event.getSource().getEntity()); ph.applyPain(randLimb, ph.painFromDamage((float) ((double) passDamage * (Math.random() / (double) 2.0F + (double) 1.0F))));
ph.applySkinDamage(randLimb, (float)((double)passDamage * (Math.random() / (double)2.0F + (double)0.5F))); ph.applyMuscleDamage(randLimb, (float) ((double) passDamage * (Math.random() / (double) 2.0F + (double) 0.5F)), fp);
if (Math.random() < (double)i * 0.2) { ph.applySkinDamage(randLimb, (float) ((double) passDamage * (Math.random() / (double) 2.0F + (double) 0.5F)));
ph.applyPain(randLimb, ph.painFromDamage((float)((double)passDamage * (Math.random() / (double)2.0F + (double)1.5F)))); if (Math.random() < (double) i * 0.2) {
ph.applyMuscleDamage(randLimb, (float)((double)passDamage * (Math.random() / (double)2.0F + (double)0.7F)), (Player) event.getSource().getEntity()); ph.applyPain(randLimb, ph.painFromDamage((float) ((double) passDamage * (Math.random() / (double) 2.0F + (double) 1.5F))));
ph.applySkinDamage(randLimb, (float)((double)passDamage * (Math.random() / (double)2.0F + (double)0.7F))); ph.applyMuscleDamage(randLimb, (float) ((double) passDamage * (Math.random() / (double) 2.0F + (double) 0.7F)), fp);
ph.applyBleedDamage(randLimb, (float)((double)passDamage * (Math.random() / (double)2.0F + (double)0.7F)), null); ph.applySkinDamage(randLimb, (float) ((double) passDamage * (Math.random() / (double) 2.0F + (double) 0.7F)));
damage -= damage_pass; ph.applyBleedDamage(randLimb, (float) ((double) passDamage * (Math.random() / (double) 2.0F + (double) 0.7F)), fp);
} damage -= damage_pass;
}
damage -= damage_pass; damage -= damage_pass;
boolean amputated = ph.handleAmputation(randLimb, passDamage, 26.0F, (Player) event.getSource().getEntity()); boolean amputated = ph.handleAmputation(randLimb, passDamage, 26.0F, fp);
if (amputated) { if (amputated) {
damage /= 4.0F; damage /= 4.0F;
}
} }
} }

View file

@ -0,0 +1,28 @@
package xyz.illuc.neuralgiacore.events;
import net.adinvas.prototype_pain.PlayerHealthProvider;
import net.minecraft.server.level.ServerPlayer;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.event.entity.living.LivingEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
public class RunOutOfBreathEvents {
@SubscribeEvent
public static void onLivingJumpEvent(LivingEvent.LivingJumpEvent event) {
if (!(event.getEntity() instanceof ServerPlayer player))return;
player.getCapability(PlayerHealthProvider.PLAYER_HEALTH_DATA, null).ifPresent(cap-> {
cap.setOxygen(cap.getOxygen() - 3);
} );
}
@SubscribeEvent
public static void onSprintEvent(TickEvent.PlayerTickEvent event) {
if (!(event.player instanceof ServerPlayer player))return;
player.getCapability(PlayerHealthProvider.PLAYER_HEALTH_DATA, null).ifPresent(cap-> {
if (player.isSprinting() && !player.isSwimming()){
cap.setOxygen(cap.getOxygen() - 0.15f);
}
});
}
}