ModularPowersuits/src/main/java/net/machinemuse/powersuits/event/MovementManager.java

101 lines
4.7 KiB
Java

package net.machinemuse.powersuits.event;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.relauncher.Side;
import net.machinemuse.api.ModuleManager;
import net.machinemuse.general.sound.SoundDictionary;
import net.machinemuse.numina.basemod.NuminaConfig;
import net.machinemuse.numina.sound.Musique;
import net.machinemuse.powersuits.item.ItemPowerArmor;
import net.machinemuse.powersuits.powermodule.movement.JumpAssistModule;
import net.machinemuse.powersuits.powermodule.movement.ShockAbsorberModule;
import net.machinemuse.utils.ElectricItemUtils;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraftforge.event.entity.living.LivingEvent.LivingJumpEvent;
import net.minecraftforge.event.entity.living.LivingFallEvent;
import java.util.HashMap;
import java.util.Map;
public class MovementManager {
public static Map<String, Double> playerJumpMultipliers = new HashMap();
public static double getPlayerJumpMultiplier(EntityPlayer player) {
if (playerJumpMultipliers.containsKey(player.getCommandSenderName())) {
return playerJumpMultipliers.get(player.getCommandSenderName());
} else {
return 0;
}
}
public static void setPlayerJumpTicks(EntityPlayer player, double number) {
playerJumpMultipliers.put(player.getCommandSenderName(), number);
}
@SubscribeEvent
public void handleLivingJumpEvent(LivingJumpEvent event) {
if (event.entityLiving instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) event.entityLiving;
ItemStack stack = player.getCurrentArmor(1);
if (stack != null && stack.getItem() instanceof ItemPowerArmor
&& ModuleManager.itemHasActiveModule(stack, JumpAssistModule.MODULE_JUMP_ASSIST)) {
double jumpAssist = ModuleManager.computeModularProperty(stack, JumpAssistModule.JUMP_MULTIPLIER) * 2;
double drain = ModuleManager.computeModularProperty(stack, JumpAssistModule.JUMP_ENERGY_CONSUMPTION);
double avail = ElectricItemUtils.getPlayerEnergy(player);
if ((FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) && NuminaConfig.useSounds()) {
Musique.playerSound(player, SoundDictionary.SOUND_JUMP_ASSIST, (float) (jumpAssist / 8.0), 1, false);
}
if (drain < avail) {
ElectricItemUtils.drainPlayerEnergy(player, drain);
setPlayerJumpTicks(player, jumpAssist);
double jumpCompensationRatio = ModuleManager.computeModularProperty(stack, JumpAssistModule.JUMP_FOOD_COMPENSATION);
if (player.isSprinting()) {
player.getFoodStats().addExhaustion((float) (-0.8 * jumpCompensationRatio));
} else {
player.getFoodStats().addExhaustion((float) (-0.2 * jumpCompensationRatio));
}
}
}
}
}
@SubscribeEvent
public void handleFallEvent(LivingFallEvent event) {
if (event.entityLiving instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) event.entityLiving;
ItemStack boots = player.getCurrentArmor(0);
if (boots != null) {
if (ModuleManager.itemHasActiveModule(boots, ShockAbsorberModule.MODULE_SHOCK_ABSORBER) && event.distance > 3) {
double distanceAbsorb = event.distance * ModuleManager.computeModularProperty(boots, ShockAbsorberModule.SHOCK_ABSORB_MULTIPLIER);
if ((FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) && NuminaConfig.useSounds()) {
Musique.playerSound(player, SoundDictionary.SOUND_GUI_INSTALL, (float) (distanceAbsorb), 1, false);
}
double drain = distanceAbsorb * ModuleManager.computeModularProperty(boots, ShockAbsorberModule.SHOCK_ABSORB_ENERGY_CONSUMPTION);
double avail = ElectricItemUtils.getPlayerEnergy(player);
if (drain < avail) {
ElectricItemUtils.drainPlayerEnergy(player, drain);
event.distance -= distanceAbsorb;
}
}
}
}
}
/**
* Gravity, in meters per tick per tick.
*/
public static final double DEFAULT_GRAVITY = -0.0784000015258789;
public static double computeFallHeightFromVelocity(double velocity) {
double ticks = velocity / DEFAULT_GRAVITY;
double distance = -0.5 * DEFAULT_GRAVITY * ticks * ticks;
return distance;
}
}