101 lines
4.7 KiB
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;
|
|
}
|
|
}
|