package zmaster587.advancedRocketry.util; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.WeakHashMap; import zmaster587.advancedRocketry.AdvancedRocketry; import zmaster587.advancedRocketry.api.AdvancedRocketryAPI; import zmaster587.advancedRocketry.api.IGravityManager; import zmaster587.advancedRocketry.api.IPlanetaryProvider; import zmaster587.advancedRocketry.dimension.DimensionManager; import zmaster587.advancedRocketry.world.provider.WorldProviderSpace; import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; public class GravityHandler implements IGravityManager { static Class gcWorldProvider; static Method gcGetGravity; static { AdvancedRocketryAPI.gravityManager = new GravityHandler(); try { gcWorldProvider = Class.forName("micdoodle8.mods.galacticraft.api.world.IGalacticraftWorldProvider"); AdvancedRocketry.logger.info("GC IGalacticraftWorldProvider found"); gcGetGravity = gcWorldProvider.getMethod("getGravity"); } catch(ClassNotFoundException e){ gcWorldProvider = null; AdvancedRocketry.logger.info("GC IGalacticraftWorldProvider not found"); } catch(NoSuchMethodException e){ gcWorldProvider = null; AdvancedRocketry.logger.info("GC IGalacticraftWorldProvider not found"); } } private static WeakHashMap<Entity, Double> entityMap = new WeakHashMap<Entity, Double>(); public static void applyGravity(Entity entity) { if(!entity.isInWater() || entity instanceof EntityItem) { if(!(entity instanceof EntityPlayer) || !((EntityPlayer)entity).capabilities.isFlying) { if(DimensionManager.getInstance().isDimensionCreated(entity.worldObj.provider.dimensionId) || entity.worldObj.provider instanceof WorldProviderSpace) { double gravMult; if(entity.worldObj.provider instanceof IPlanetaryProvider) gravMult = ((IPlanetaryProvider)entity.worldObj.provider).getGravitationalMultiplier((int)entity.posX, (int)entity.posZ); else gravMult = DimensionManager.getInstance().getDimensionProperties(entity.worldObj.provider.dimensionId).gravitationalMultiplier; if(entity instanceof EntityItem) entity.motionY -= gravMult*0.04f; else entity.motionY -= gravMult*0.075f; return; } else { //GC handling if(gcWorldProvider != null && gcWorldProvider.isAssignableFrom(entity.worldObj.provider.getClass())) { try { entity.motionY -= 0.075f - (float)gcGetGravity.invoke(entity.worldObj.provider); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { e.printStackTrace(); } } else { if(entity instanceof EntityItem) entity.motionY -= 0.04f; else entity.motionY -= 0.08D; } } } } } @Override public void setGravityMultiplier(Entity entity, double multiplier) { entityMap.put(entity, multiplier); } @Override public void clearGravityEffect(Entity entity) { entityMap.remove(entity); } }