Skip to content

Commit

Permalink
Fix normal sleep fatigue replenishing
Browse files Browse the repository at this point in the history
  • Loading branch information
Su5eD committed Jun 24, 2022
1 parent 1b0a372 commit e42eb3d
Show file tree
Hide file tree
Showing 6 changed files with 40 additions and 36 deletions.
2 changes: 1 addition & 1 deletion src/main/java/dev/su5ed/somnia/SomniaConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ public CommonConfig(ForgeConfigSpec.Builder builder) {
.comment("Fatigue is incremented by this number every tick")
.define("fatigueRate", 0.00208);
fatigueReplenishRate = builder
.comment("Fatigue is decreased by this number while you sleep (every tick)")
.comment("Fatigue is decreased by this number every tick while you sleep")
.define("fatigueReplenishRate", 0.00833);
fatigueSideEffects = builder
.comment("Enables fatigue side effects")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.util.Mth;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.effect.MobEffect;
import net.minecraft.world.effect.MobEffectInstance;
Expand All @@ -29,56 +30,52 @@
import java.util.stream.Stream;

@Mod.EventBusSubscriber(modid = Somnia.MODID)
public final class FatigueEventHandler {
public final class SomniaEventHandler {

@SubscribeEvent
public static void onPlayerTick(TickEvent.PlayerTickEvent event) {
if (event.phase != TickEvent.Phase.START || event.player.level.isClientSide || (!event.player.isAlive() || event.player.isCreative() || event.player.isSpectator() && !event.player.isSleeping())) return;
if (event.phase != TickEvent.Phase.START || event.player.level.isClientSide || !event.player.isAlive() || event.player.isCreative() || event.player.isSpectator() && !event.player.isSleeping()) return;

event.player.getCapability(CapabilityFatigue.INSTANCE).ifPresent(props -> {
double fatigue = props.getFatigue();
double extraFatigueRate = props.getExtraFatigueRate();
double replenishedFatigue = props.getReplenishedFatigue();
boolean isSleeping = props.sleepOverride() || event.player.isSleeping();

double fatigueRate = SomniaConfig.COMMON.fatigueRate.get();
double fatigueReplenishRate = SomniaConfig.COMMON.fatigueReplenishRate.get();

double fatigue = props.getFatigue();
double extraFatigueRate = props.getExtraFatigueRate();
double replenishedFatigue = props.getReplenishedFatigue();

if (isSleeping) {
fatigue -= fatigueReplenishRate;
double share = fatigueReplenishRate / fatigueRate;
double replenish = fatigueReplenishRate * share;
extraFatigueRate -= fatigueReplenishRate / share / replenishedFatigue / 10;

fatigue -= fatigueReplenishRate;
extraFatigueRate -= fatigueRate / replenishedFatigue / 10;
replenishedFatigue -= replenish;
} else {
double rate = fatigueRate;
double adjustedRate = fatigueRate;

MobEffectInstance wakefulness = event.player.getEffect(SomniaObjects.AWAKENING_EFFECT.get());
if (wakefulness != null) {
rate -= wakefulness.getAmplifier() == 0 ? rate / 4 : rate / 3;
adjustedRate -= wakefulness.getAmplifier() == 0 ? adjustedRate / 4 : adjustedRate / 3;
}

MobEffectInstance insomnia = event.player.getEffect(SomniaObjects.INSOMNIA_EFFECT.get());
if (insomnia != null) {
rate += insomnia.getAmplifier() == 0 ? rate / 2 : rate;
adjustedRate += insomnia.getAmplifier() == 0 ? adjustedRate / 2 : adjustedRate;
}
fatigue += rate + props.getExtraFatigueRate();
fatigue += adjustedRate + props.getExtraFatigueRate();
}

if (fatigue > 100) fatigue = 100;
else if (fatigue < 0) fatigue = 0;

if (replenishedFatigue > 100) replenishedFatigue = 100;
else if (replenishedFatigue < 0) replenishedFatigue = 0;

fatigue = Mth.clamp(fatigue, 0, 100);
replenishedFatigue = Mth.clamp(replenishedFatigue, 0, 100);
if (extraFatigueRate < 0) extraFatigueRate = 0;

props.setFatigue(fatigue);
props.setReplenishedFatigue(replenishedFatigue);
props.setExtraFatigueRate(extraFatigueRate);

if (props.updateFatigueCounter() >= 100) {
props.resetFatigueCounter();
if (props.updateFatigueCounter()) {
SomniaNetwork.sendToClient(new FatigueUpdatePacket(fatigue), (ServerPlayer) event.player);

if (SomniaConfig.COMMON.fatigueSideEffects.get()) {
Expand Down Expand Up @@ -149,5 +146,5 @@ public static void onLivingEntityUseItem(LivingEntityUseItemEvent.Finish event)
}
}

private FatigueEventHandler() {}
private SomniaEventHandler() {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ private void tickLevel() {

ForgeEventFactory.onPreWorldTick(this.level, server::haveTime);

this.level.players().forEach(ServerPlayer::tick);
this.level.players().forEach(ServerPlayer::doTick);
this.level.tick(server::haveTime);

ForgeEventFactory.onPostWorldTick(this.level, server::haveTime);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,14 @@
import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.LevelAccessor;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.event.entity.living.LivingAttackEvent;
import net.minecraftforge.event.entity.player.PlayerSetSpawnEvent;
import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent;
import net.minecraftforge.event.entity.player.PlayerWakeUpEvent;
import net.minecraftforge.event.entity.player.SleepingTimeCheckEvent;
import net.minecraftforge.event.world.SleepFinishedTimeEvent;
import net.minecraftforge.eventbus.api.Event;
import net.minecraftforge.eventbus.api.EventPriority;
import net.minecraftforge.eventbus.api.SubscribeEvent;
Expand Down Expand Up @@ -54,14 +56,26 @@ public static void onPlayerSleepInBed(PlayerSleepInBedEvent event) {

if (Compat.isSleepingInBag(player)) InjectHooks.updateWakeTime((ServerPlayer) player);
}

@SubscribeEvent
public static void onSleepFinished(SleepFinishedTimeEvent event) {
LevelAccessor level = event.getWorld();

level.players().stream()
.filter(Player::isSleepingLongEnough)
.forEach(player -> player.getCapability(CapabilityFatigue.INSTANCE)
.filter(props -> props.shouldSleepNormally() || DarkUtilsCompat.hasSleepCharm(player))
.ifPresent(props -> {
long timeSlept = event.getNewTime() - level.dayTime();
double replenish = SomniaConfig.COMMON.fatigueReplenishRate.get() * timeSlept;
props.setFatigue(props.getFatigue() - replenish);
}));
}

@SubscribeEvent
public static void onWakeUp(PlayerWakeUpEvent event) {
Player player = event.getPlayer();
player.getCapability(CapabilityFatigue.INSTANCE).ifPresent(props -> {
if (props.shouldSleepNormally() || DarkUtilsCompat.hasSleepCharm(player)) {
props.setFatigue(props.getFatigue() - SomniaUtil.getFatigueToReplenish(player));
}
props.maxFatigueCounter();
props.setResetSpawn(true);
props.setSleepNormally(false);
Expand Down
9 changes: 2 additions & 7 deletions src/main/java/dev/su5ed/somnia/capability/Fatigue.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,8 @@ public void setSideEffectStage(int stage) {
}

@Override
public int updateFatigueCounter() {
return ++fatigueUpdateCounter;
}

@Override
public void resetFatigueCounter() {
this.fatigueUpdateCounter = 0;
public boolean updateFatigueCounter() {
return fatigueUpdateCounter++ % 100 == 0;
}

@Override
Expand Down
4 changes: 1 addition & 3 deletions src/main/java/dev/su5ed/somnia/capability/IFatigue.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,7 @@ public interface IFatigue extends INBTSerializable<CompoundTag> {

void setSideEffectStage(int stage);

int updateFatigueCounter();

void resetFatigueCounter();
boolean updateFatigueCounter();

void maxFatigueCounter();

Expand Down

0 comments on commit e42eb3d

Please sign in to comment.