Skip to content

Commit

Permalink
Merge pull request #372 from SymmetricDevs/mt-env-survival-fixes
Browse files Browse the repository at this point in the history
MTBO's environmental survival fixes
  • Loading branch information
bruberu authored Jan 18, 2025
2 parents f685d03 + 650f9fd commit 00ef8d4
Show file tree
Hide file tree
Showing 11 changed files with 130 additions and 67 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public interface IBreathingArmorLogic extends ISpecialArmorLogic {
boolean mayBreatheWith(ItemStack stack, EntityPlayer player);


double tryTick(ItemStack stack, EntityPlayer player);
double getDamageAbsorbed(ItemStack stack, EntityPlayer player);

default ISpecialArmor.ArmorProperties getProperties(EntityLivingBase player, @NotNull ItemStack armor, DamageSource source, double damage,
EntityEquipmentSlot equipmentSlot) {
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/supersymmetry/api/items/IBreathingItem.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@
public interface IBreathingItem {
boolean isValid(ItemStack stack, EntityPlayer player);

double tryTick(ItemStack stack, EntityPlayer player);
double getDamageAbsorbed(ItemStack stack, EntityPlayer player);
}
35 changes: 34 additions & 1 deletion src/main/java/supersymmetry/common/EventHandlers.java
Original file line number Diff line number Diff line change
@@ -1,23 +1,32 @@
package supersymmetry.common;

import gregtech.api.items.armor.ArmorMetaItem;
import gregtech.api.util.GTTeleporter;
import gregtech.api.util.TeleportHandler;
import gregtech.common.items.MetaItems;
import gregtechfoodoption.item.GTFOMetaItem;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.server.management.PlayerList;
import net.minecraft.util.DamageSource;
import net.minecraft.world.World;
import net.minecraft.world.WorldServer;
import net.minecraftforge.event.entity.living.LivingFallEvent;
import net.minecraftforge.event.world.BlockEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.PlayerEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
import supersymmetry.Supersymmetry;
import supersymmetry.common.entities.EntityDropPod;
import supersymmetry.common.event.DimensionBreathabilityHandler;
import supersymmetry.common.event.MobHordeWorldData;
import supersymmetry.common.item.SuSyArmorItem;

@Mod.EventBusSubscriber(modid = Supersymmetry.MODID)
public class EventHandlers {
Expand All @@ -31,7 +40,7 @@ public static void onPlayerLoggedIn(PlayerEvent.PlayerLoggedInEvent event) {
NBTTagCompound playerData = event.player.getEntityData();
NBTTagCompound data = playerData.hasKey(EntityPlayer.PERSISTED_NBT_TAG) ? playerData.getCompoundTag(EntityPlayer.PERSISTED_NBT_TAG) : new NBTTagCompound();

if(!event.player.getEntityWorld().isRemote && !data.getBoolean(FIRST_SPAWN)) {
if (!event.player.getEntityWorld().isRemote && !data.getBoolean(FIRST_SPAWN)) {

data.setBoolean(FIRST_SPAWN, true);
playerData.setTag(EntityPlayer.PERSISTED_NBT_TAG, data);
Expand Down Expand Up @@ -88,4 +97,28 @@ public static void onPlayerTick(TickEvent.PlayerTickEvent event) {
DimensionBreathabilityHandler.tickPlayer(event.player);
}
}

@SubscribeEvent(priority = EventPriority.NORMAL)
public static void onEntityLivingFallEventStart(LivingFallEvent event) {
Entity armor = event.getEntity();
if (armor instanceof EntityPlayer player) {
ItemStack boots = player.getItemStackFromSlot(EntityEquipmentSlot.FEET);
if (!boots.isEmpty() && boots.getItem() instanceof SuSyArmorItem) {
if (player.fallDistance > 3.2F) {
player.fallDistance = 0;
}
}
}
}

@SubscribeEvent(priority = EventPriority.LOWEST)
public static void onEntityLivingFallEvent(LivingFallEvent event) {
Entity armor = event.getEntity();
if (armor instanceof EntityPlayer player) {
ItemStack boots = player.getItemStackFromSlot(EntityEquipmentSlot.FEET);
if (!boots.isEmpty() && boots.getItem() instanceof SuSyArmorItem) {
player.fallDistance = event.getDistance();
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
import java.util.Objects;
import java.util.Optional;

import static net.minecraft.inventory.EntityEquipmentSlot.*;
import static net.minecraft.inventory.EntityEquipmentSlot.HEAD;

public final class DimensionBreathabilityHandler {

Expand All @@ -22,6 +22,8 @@ public final class DimensionBreathabilityHandler {
public static final int BENEATH_ID = 10;
public static final int NETHER_ID = -1;

public static final double ABSORB_ALL = -1;

private DimensionBreathabilityHandler() {}

public static void loadConfig() {
Expand Down Expand Up @@ -57,10 +59,9 @@ public static void tickPlayer(EntityPlayer player) {
if (isInHazardousEnvironment(player)) {
if (player.getItemStackFromSlot(HEAD).getItem() instanceof SuSyArmorItem item) {
if (item.isValid(player.getItemStackFromSlot(HEAD), player)) {
double damageAbsorbed = item.tryTick(player.getItemStackFromSlot(HEAD), player);
if (damageAbsorbed > 0) {
dimensionBreathabilityMap.get(player.dimension).damagePlayer(player, damageAbsorbed);
}
double damageAbsorbed = item.getDamageAbsorbed(player.getItemStackFromSlot(HEAD), player);
if (damageAbsorbed != ABSORB_ALL)
dimensionBreathabilityMap.get(player.dimension).damagePlayer(player, damageAbsorbed);
return;
}
}
Expand All @@ -81,9 +82,9 @@ public BreathabilityInfo(DamageSource damageType, double defaultDamage) {
public void damagePlayer(EntityPlayer player) {
player.attackEntityFrom(damageType, (float) defaultDamage);
}
public void damagePlayer(EntityPlayer player, double amount) {
if (defaultDamage > amount) {
player.attackEntityFrom(damageType, (float) defaultDamage - (float) amount);
public void damagePlayer(EntityPlayer player, double amountAbsorbed) {
if (defaultDamage > amountAbsorbed) {
player.attackEntityFrom(damageType, (float) defaultDamage - (float) amountAbsorbed);
}
}

Expand Down
4 changes: 2 additions & 2 deletions src/main/java/supersymmetry/common/item/SuSyArmorItem.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ public boolean isValid(ItemStack stack, EntityPlayer player) {
}

@Override
public double tryTick(ItemStack stack, EntityPlayer player) {
return getItem(stack).armorLogic.tryTick(stack, player);
public double getDamageAbsorbed(ItemStack stack, EntityPlayer player) {
return getItem(stack).armorLogic.getDamageAbsorbed(stack, player);
}

public class SuSyArmorMetaValueItem extends ArmorMetaItem<SuSyArmorMetaValueItem>.ArmorMetaValueItem {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,16 @@

import static net.minecraft.inventory.EntityEquipmentSlot.*;
import static supersymmetry.api.util.SuSyUtility.susyId;
import static supersymmetry.common.event.DimensionBreathabilityHandler.ABSORB_ALL;

public class AdvancedBreathingApparatus extends BreathingApparatus implements ITextureRegistrar {
private final double hoursOfLife;
private final String name;
private final int tier;
private final double relativeAbsorption;

private static final double DEFAULT_ABSORPTION = 0;

public AdvancedBreathingApparatus(EntityEquipmentSlot slot, double hoursOfLife, String name, int tier, double relativeAbsorption) {
super(slot);
this.hoursOfLife = hoursOfLife;
Expand Down Expand Up @@ -59,7 +62,7 @@ public boolean mayBreatheWith(ItemStack stack, EntityPlayer player) {
}

@Override
public double tryTick(ItemStack stack, EntityPlayer player) {
public double getDamageAbsorbed(ItemStack stack, EntityPlayer player) {
this.handleDamage(stack, player);

ItemStack chest = player.getItemStackFromSlot(CHEST);
Expand All @@ -85,7 +88,7 @@ public double tryTick(ItemStack stack, EntityPlayer player) {
}

if (tank.getOxygen(chest) <= 0) {
return 0.0625;
return DEFAULT_ABSORPTION;
} else {
tank.changeOxygen(chest, -1.);
}
Expand All @@ -95,11 +98,11 @@ public double tryTick(ItemStack stack, EntityPlayer player) {
case 1:
return 1;
case 2:
return 2;
return ABSORB_ALL;
}
}
}
return 0.0625;
return DEFAULT_ABSORPTION;
}


Expand Down Expand Up @@ -153,9 +156,10 @@ public float getHeatResistance() {
@Override
public ISpecialArmor.ArmorProperties getProperties(EntityLivingBase player, @NotNull ItemStack armor, DamageSource source,
double damage, EntityEquipmentSlot equipmentSlot) {
int damageLimit = Integer.MAX_VALUE;
if (source.isUnblockable()) return new ISpecialArmor.ArmorProperties(0, 0.0, 0);
return new ISpecialArmor.ArmorProperties(0, getAbsorption(armor) * relativeAbsorption, damageLimit);
ISpecialArmor.ArmorProperties prop = new ISpecialArmor.ArmorProperties(0, 0.0, 0);
if (source.isUnblockable()) return prop;
prop.Armor = getAbsorption(armor) * relativeAbsorption * 20;
return prop;
}

protected float getAbsorption(ItemStack itemStack) {
Expand All @@ -171,18 +175,7 @@ protected float getAbsorption(EntityEquipmentSlot slot) {
};
}


public void addInformation(ItemStack stack, List<String> strings) {

if (getEquipmentSlot(stack) == CHEST) {
int maxOxygen = (int) getMaxOxygen(stack);
if (maxOxygen == -1) {
strings.add(I18n.format("supersymmetry.unlimited_oxygen"));
} else {
int oxygen = (int) getOxygen(stack);
strings.add(I18n.format("supersymmetry.oxygen", oxygen, maxOxygen));
}
}
if (hoursOfLife > 0) {
double lifetime = 60 * 60 * hoursOfLife;
int secondsRemaining = (int) (lifetime - getDamage(stack) * lifetime);
Expand All @@ -196,19 +189,6 @@ public void addInformation(ItemStack stack, List<String> strings) {
strings.add(I18n.format("attribute.modifier.plus.0", armor, I18n.format("attribute.name.generic.armor")));
}

void changeOxygen(ItemStack stack, double oxygenChange) {
if (getMaxOxygen(stack) == -1) {
return;
}
super.changeOxygen(stack, oxygenChange);
}

double getOxygen(ItemStack stack) {
if (getMaxOxygen(stack) == -1) {
return 12000;
}
return super.getOxygen(stack);
}

@Override
public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package supersymmetry.common.item.armor;

import net.minecraft.client.resources.I18n;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.item.ItemStack;

import java.util.List;

public class AdvancedBreathingTank extends AdvancedBreathingApparatus {
public final static double INFINITE_OXYGEN = -1;
public final double maxOxygen;


public AdvancedBreathingTank(double hoursOfLife, String name, int tier, double relativeAbsorption, double maxOxygen) {
super(EntityEquipmentSlot.CHEST, hoursOfLife, name, tier, relativeAbsorption);
this.maxOxygen = maxOxygen;
}

@Override
public void addInformation(ItemStack stack, List<String> strings) {
int maxOxygen = (int) getMaxOxygen(stack);
if (maxOxygen == INFINITE_OXYGEN) {
strings.add(I18n.format("supersymmetry.unlimited_oxygen"));
} else {
int oxygen = (int) getOxygen(stack);
strings.add(I18n.format("supersymmetry.oxygen", oxygen, maxOxygen));
}
super.addInformation(stack, strings);
}

public void changeOxygen(ItemStack stack, double oxygenChange) {
if (getMaxOxygen(stack) == INFINITE_OXYGEN) {
return;
}
super.changeOxygen(stack, oxygenChange);
}

public double getOxygen(ItemStack stack) {
if (getMaxOxygen(stack) == INFINITE_OXYGEN) {
return 12000;
}
return super.getOxygen(stack);
}

@Override
double getMaxOxygen(ItemStack stack) {
return this.maxOxygen;
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,16 @@

import static net.minecraft.inventory.EntityEquipmentSlot.CHEST;
import static supersymmetry.api.util.SuSyUtility.susyId;
import static supersymmetry.common.event.DimensionBreathabilityHandler.ABSORB_ALL;

public class BreathingApparatus implements IBreathingArmorLogic, IItemDurabilityManager, ITextureRegistrar {
@SideOnly(Side.CLIENT)
protected ModelBiped model;

protected final EntityEquipmentSlot SLOT;

private static final double DEFAULT_ABSORPTION = 0;

public BreathingApparatus(EntityEquipmentSlot slot) {
SLOT = slot;
}
Expand Down Expand Up @@ -63,26 +66,26 @@ public boolean mayBreatheWith(ItemStack stack, EntityPlayer player) {
ItemStack chest = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST);
if (chest.getItem() instanceof SuSyArmorItem item) {
if (item.getItem(chest).getArmorLogic() instanceof BreathingApparatus tank) {
return tank.getOxygen(stack) > 0;
return tank.getOxygen(chest) > 0;
}
}
return false;
}

@Override
public double tryTick(ItemStack stack, EntityPlayer player) {
public double getDamageAbsorbed(ItemStack stack, EntityPlayer player) {
if (!DimensionBreathabilityHandler.isInHazardousEnvironment(player)) {
return 0.5;
return ABSORB_ALL;
}

ItemStack chest = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST);
if (chest.getItem() instanceof SuSyArmorItem item) {
if (item.getItem(chest).getArmorLogic() instanceof BreathingApparatus tank) {
tank.changeOxygen(stack, -1);
return 0.5;
tank.changeOxygen(chest, -1);
return ABSORB_ALL;
}
}
return 0.0625;
return DEFAULT_ABSORPTION;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,10 @@

import java.util.List;

import static supersymmetry.common.event.DimensionBreathabilityHandler.ABSORB_ALL;

public class SimpleGasMask implements IBreathingArmorLogic, IItemDurabilityManager {
public static final double LIFETIME = 1200;
public static final double LIFETIME = 600;
@Override
public EntityEquipmentSlot getEquipmentSlot(ItemStack itemStack) {
return EntityEquipmentSlot.HEAD;
Expand All @@ -39,14 +41,13 @@ public boolean mayBreatheWith(ItemStack stack, EntityPlayer player) {
return player.dimension == DimensionBreathabilityHandler.BENEATH_ID && getDamage(stack) < 1;
}


@Override
public boolean isValidArmor(ItemStack itemStack, Entity entity, EntityEquipmentSlot equipmentSlot) {
return true;
}

@Override
public double tryTick(ItemStack stack, EntityPlayer player) {
public double getDamageAbsorbed(ItemStack stack, EntityPlayer player) {
if (DimensionBreathabilityHandler.isInHazardousEnvironment(player)) {
changeDamage(stack, 1. / LIFETIME); // It's actually ticked every overall second, not just every tick.
}
Expand All @@ -55,7 +56,7 @@ public double tryTick(ItemStack stack, EntityPlayer player) {
stack.shrink(1);
player.setItemStackToSlot(EntityEquipmentSlot.HEAD, ItemStack.EMPTY);
}
return 0;
return ABSORB_ALL;
}

@Override
Expand Down
Loading

0 comments on commit 00ef8d4

Please sign in to comment.