Remembered after the fact to add the new stuff too.

This commit is contained in:
WayofTime 2016-07-13 17:19:02 -04:00
parent e3b3d69d1d
commit ee71072969
8 changed files with 580 additions and 0 deletions

View file

@ -0,0 +1,15 @@
package WayofTime.bloodmagic.client.render.entity;
import net.minecraft.client.renderer.entity.Render;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraftforge.fml.client.registry.IRenderFactory;
import WayofTime.bloodmagic.entity.projectile.EntityMeteor;
public class MeteorRenderFactory implements IRenderFactory<EntityMeteor>
{
@Override
public Render<? super EntityMeteor> createRenderFor(RenderManager manager)
{
return new RenderEntityMeteor(manager);
}
}

View file

@ -0,0 +1,56 @@
package WayofTime.bloodmagic.client.render.entity;
import net.minecraft.client.model.ModelBase;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.entity.Render;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.util.ResourceLocation;
import WayofTime.bloodmagic.api.Constants;
import WayofTime.bloodmagic.client.render.model.ModelMeteor;
import WayofTime.bloodmagic.entity.projectile.EntityMeteor;
public class RenderEntityMeteor extends Render<EntityMeteor>
{
public ModelBase model = new ModelMeteor();
private float scale = 1;
private static final ResourceLocation resource = new ResourceLocation(Constants.Mod.MODID, "textures/models/Meteor.png");
public RenderEntityMeteor(RenderManager renderManagerIn)
{
super(renderManagerIn);
}
@Override
public void doRender(EntityMeteor entity, double x, double y, double z, float entityYaw, float partialTicks)
{
// GlStateManager.pushMatrix();
// GlStateManager.translate((float) x, (float) y, (float) z);
// GlStateManager.enableRescaleNormal();
// GlStateManager.scale(0.5F, 0.5F, 0.5F);
// GlStateManager.rotate(-this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F);
// GlStateManager.rotate(this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F);
// this.bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE);
// this.renderItem.renderItem(ItemComponent.getStack(ItemComponent.REAGENT_BLOODLIGHT), ItemCameraTransforms.TransformType.GROUND);
// GlStateManager.disableRescaleNormal();
// GlStateManager.popMatrix();
GlStateManager.pushMatrix();
GlStateManager.translate((float) x, (float) y, (float) z);
GlStateManager.enableRescaleNormal();
GlStateManager.scale(scale, scale, scale);
this.bindTexture(this.getEntityTexture(entity));
// GL11.glRotatef(entity.prevRotationYaw + (entity.rotationYaw - entity.prevRotationYaw) * f1, 0.0F, 1.0F, 0.0F);
// GL11.glRotatef(180.0f - entity.prevRotationPitch + (entity.rotationPitch - entity.prevRotationPitch) * f1, 1.0F, 0.0F, 0.0f);
model.render(entity, 0, (float) x, (float) y, (float) z, entityYaw, partialTicks);
GlStateManager.disableRescaleNormal();
GlStateManager.popMatrix();
super.doRender(entity, x, y, z, entityYaw, partialTicks);
}
@Override
protected ResourceLocation getEntityTexture(EntityMeteor entity)
{
return resource;
}
}

View file

@ -0,0 +1,95 @@
package WayofTime.bloodmagic.client.render.model;
import net.minecraft.client.model.ModelBase;
import net.minecraft.client.model.ModelRenderer;
import net.minecraft.entity.Entity;
/**
* This is a direct copy of the meteor model from 1.7.10. As such it probably
* needs to be... better.
*
*/
public class ModelMeteor extends ModelBase
{
//fields
ModelRenderer Shape1;
ModelRenderer Shape2;
ModelRenderer Shape3;
ModelRenderer Shape4;
ModelRenderer Shape5;
ModelRenderer Shape6;
ModelRenderer Shape7;
public ModelMeteor()
{
textureWidth = 64;
textureHeight = 64;
Shape1 = new ModelRenderer(this, 0, 0);
Shape1.addBox(-8F, -8F, -8F, 16, 16, 16);
Shape1.setRotationPoint(0F, 0F, 0F);
Shape1.setTextureSize(64, 64);
Shape1.mirror = true;
setRotation(Shape1, 0F, 0F, 0F);
Shape2 = new ModelRenderer(this, 0, 32);
Shape2.addBox(3F, -10F, -1F, 12, 12, 12);
Shape2.setRotationPoint(0F, 0F, 0F);
Shape2.setTextureSize(64, 64);
Shape2.mirror = true;
setRotation(Shape2, 0F, 0F, 0F);
Shape3 = new ModelRenderer(this, 0, 32);
Shape3.addBox(0F, 0F, -10F, 12, 12, 12);
Shape3.setRotationPoint(0F, 0F, 0F);
Shape3.setTextureSize(64, 64);
Shape3.mirror = true;
setRotation(Shape3, 0F, 0F, 0F);
Shape4 = new ModelRenderer(this, 0, 32);
Shape4.addBox(1F, 2F, 2F, 12, 12, 12);
Shape4.setRotationPoint(0F, 0F, 0F);
Shape4.setTextureSize(64, 64);
Shape4.mirror = true;
setRotation(Shape4, 0F, 0F, 0F);
Shape5 = new ModelRenderer(this, 0, 32);
Shape5.addBox(-12F, -5F, 0F, 12, 12, 12);
Shape5.setRotationPoint(0F, 0F, 0F);
Shape5.setTextureSize(64, 64);
Shape5.mirror = true;
setRotation(Shape5, 0F, 0F, 0F);
Shape6 = new ModelRenderer(this, 0, 32);
Shape6.addBox(-13F, -2F, -11F, 12, 12, 12);
Shape6.setRotationPoint(0F, 0F, 0F);
Shape6.setTextureSize(64, 64);
Shape6.mirror = true;
setRotation(Shape6, 0F, 0F, 0F);
Shape7 = new ModelRenderer(this, 0, 32);
Shape7.addBox(-6F, -14F, -9F, 12, 12, 12);
Shape7.setRotationPoint(0F, 0F, 0F);
Shape7.setTextureSize(64, 64);
Shape7.mirror = true;
setRotation(Shape7, 0F, 0F, 0F);
}
public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5)
{
super.render(entity, f, f1, f2, f3, f4, f5);
setRotationAngles(f, f1, f2, f3, f4, f5, entity);
Shape1.render(f5);
Shape2.render(f5);
Shape3.render(f5);
Shape4.render(f5);
Shape5.render(f5);
Shape6.render(f5);
Shape7.render(f5);
}
private void setRotation(ModelRenderer model, float x, float y, float z)
{
model.rotateAngleX = x;
model.rotateAngleY = y;
model.rotateAngleZ = z;
}
public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity)
{
super.setRotationAngles(f, f1, f2, f3, f4, f5, entity);
}
}

View file

@ -0,0 +1,138 @@
package WayofTime.bloodmagic.entity.projectile;
import lombok.Setter;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.projectile.EntityThrowable;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.DamageSource;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.registry.IThrowableEntity;
import WayofTime.bloodmagic.api.Constants;
import WayofTime.bloodmagic.meteor.MeteorRegistry;
public class EntityMeteor extends EntityThrowable implements IThrowableEntity
{
protected int ticksInAir = 0;
protected int maxTicksInAir = 600;
@Setter
public ItemStack meteorStack;
public EntityMeteor(World world)
{
super(world);
}
public EntityMeteor(World world, double x, double y, double z, double velX, double velY, double velZ)
{
super(world);
this.setSize(1F, 1F);
this.setPosition(x, y, z);
motionX = velX;
motionY = velY;
motionZ = velZ;
}
@Override
protected float getGravityVelocity()
{
return 0.03F;
}
@Override
public void onUpdate()
{
super.onUpdate();
if (this.ticksExisted > this.maxTicksInAir)
{
setDead();
}
}
@Override
protected void onImpact(RayTraceResult mop)
{
if (mop.typeOfHit == RayTraceResult.Type.ENTITY && mop.entityHit != null)
{
this.onImpact(mop.entityHit);
} else if (mop.typeOfHit == RayTraceResult.Type.BLOCK)
{
generateMeteor(mop.getBlockPos());
}
this.setDead();
}
protected void onImpact(Entity mop)
{
if (mop instanceof EntityLivingBase)
{
doDamage(100, mop);
}
generateMeteor(mop.getPosition());
// spawnHitParticles("magicCrit", 8);
this.setDead();
}
protected void doDamage(int i, Entity mop)
{
mop.attackEntityFrom(this.getDamageSource(), i);
}
public void generateMeteor(BlockPos pos)
{
MeteorRegistry.generateMeteorForItem(meteorStack, worldObj, pos, Blocks.STONE.getDefaultState());
}
public DamageSource getDamageSource()
{
return DamageSource.anvil;
}
@Override
public void writeEntityToNBT(NBTTagCompound nbt)
{
super.writeEntityToNBT(nbt);
nbt.setInteger(Constants.NBT.PROJECTILE_TICKS_IN_AIR, ticksInAir);
nbt.setInteger(Constants.NBT.PROJECTILE_MAX_TICKS_IN_AIR, maxTicksInAir);
if (meteorStack != null)
{
meteorStack.writeToNBT(nbt);
}
}
@Override
public void readEntityFromNBT(NBTTagCompound nbt)
{
super.readEntityFromNBT(nbt);
ticksInAir = nbt.getInteger(Constants.NBT.PROJECTILE_TICKS_IN_AIR);
maxTicksInAir = nbt.getInteger(Constants.NBT.PROJECTILE_MAX_TICKS_IN_AIR);
meteorStack = ItemStack.loadItemStackFromNBT(nbt);
}
@Override
protected boolean canTriggerWalking()
{
return false;
}
@Override
public boolean canBeCollidedWith()
{
return false;
}
@Override
public void setThrower(Entity entity)
{
}
}

View file

@ -0,0 +1,41 @@
package WayofTime.bloodmagic.meteor;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraftforge.oredict.OreDictionary;
@Getter
@Setter
@AllArgsConstructor
public class MeteorComponent
{
public int weight;
public String oreName;
public IBlockState getStateFromOre()
{
List<ItemStack> list = OreDictionary.getOres(oreName);
if (list != null && !list.isEmpty())
{
for (ItemStack stack : list)
{
if (stack != null && stack.getItem() instanceof ItemBlock)
{
Block block = ((ItemBlock) stack.getItem()).getBlock();
IBlockState state = block.getStateFromMeta(stack.getItemDamage());
return state;
}
}
}
return null;
}
}

View file

@ -0,0 +1,74 @@
package WayofTime.bloodmagic.meteor;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import lombok.AllArgsConstructor;
import net.minecraft.block.state.IBlockState;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import WayofTime.bloodmagic.util.Utils;
@AllArgsConstructor
public class MeteorHolder
{
public static Random rand = new Random();
public List<MeteorComponent> components = new ArrayList<MeteorComponent>();
public float explosionStrength;
public int radius;
public int maxWeight = 1000;
public void generateMeteor(World world, BlockPos pos, IBlockState fillerBlock)
{
world.newExplosion(null, pos.getX(), pos.getY(), pos.getZ(), explosionStrength, true, true);
for (int i = -radius; i <= radius; i++)
{
for (int j = -radius; j <= radius; j++)
{
for (int k = -radius; k <= radius; k++)
{
if (i * i + j * j + k * k > (radius + 0.5) * (radius + 0.5))
{
continue;
}
BlockPos newPos = pos.add(i, j, k);
IBlockState state = world.getBlockState(newPos);
if (world.isAirBlock(newPos) || Utils.isBlockLiquid(state))
{
IBlockState placedState = getRandomOreFromComponents(fillerBlock);
world.setBlockState(newPos, placedState);
}
}
}
}
}
public IBlockState getRandomOreFromComponents(IBlockState fillerBlock)
{
int goal = rand.nextInt(maxWeight);
for (MeteorComponent component : components)
{
goal -= component.getWeight();
if (goal < 0)
{
IBlockState state = component.getStateFromOre();
if (state != null)
{
return state;
} else
{
return fillerBlock;
}
}
}
return fillerBlock;
}
}

View file

@ -0,0 +1,53 @@
package WayofTime.bloodmagic.meteor;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.minecraft.block.state.IBlockState;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import WayofTime.bloodmagic.api.ItemStackWrapper;
public class MeteorRegistry
{
public static Map<ItemStackWrapper, MeteorHolder> meteorMap = new HashMap<ItemStackWrapper, MeteorHolder>();
public static void registerMeteor(ItemStack stack, MeteorHolder holder)
{
ItemStackWrapper wrapper = ItemStackWrapper.getHolder(stack);
if (wrapper != null)
{
meteorMap.put(wrapper, holder);
}
}
public static void registerMeteor(ItemStack stack, List<MeteorComponent> componentList, float explosionStrength, int radius, int maxWeight)
{
MeteorHolder holder = new MeteorHolder(componentList, explosionStrength, radius, maxWeight);
registerMeteor(stack, holder);
}
public static boolean hasMeteorForItem(ItemStack stack)
{
ItemStackWrapper wrapper = ItemStackWrapper.getHolder(stack);
return wrapper != null && meteorMap.containsKey(wrapper);
}
public static MeteorHolder getMeteorForItem(ItemStack stack)
{
ItemStackWrapper wrapper = ItemStackWrapper.getHolder(stack);
return wrapper != null ? meteorMap.get(wrapper) : null;
}
public static void generateMeteorForItem(ItemStack stack, World world, BlockPos pos, IBlockState fillerBlock)
{
MeteorHolder holder = getMeteorForItem(stack);
if (holder != null)
{
holder.generateMeteor(world, pos, fillerBlock);
}
}
}

View file

@ -0,0 +1,108 @@
package WayofTime.bloodmagic.ritual;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import WayofTime.bloodmagic.api.Constants;
import WayofTime.bloodmagic.api.ritual.AreaDescriptor;
import WayofTime.bloodmagic.api.ritual.EnumRuneType;
import WayofTime.bloodmagic.api.ritual.IMasterRitualStone;
import WayofTime.bloodmagic.api.ritual.Ritual;
import WayofTime.bloodmagic.api.ritual.RitualComponent;
import WayofTime.bloodmagic.entity.projectile.EntityMeteor;
import WayofTime.bloodmagic.meteor.MeteorRegistry;
public class RitualMeteor extends Ritual
{
public static final String ITEM_RANGE = "itemRange";
public RitualMeteor()
{
super("ritualMeteor", 0, 1000000, "ritual." + Constants.Mod.MODID + ".meteorRitual");
addBlockRange(ITEM_RANGE, new AreaDescriptor.Rectangle(new BlockPos(0, 1, 0), 1));
setMaximumVolumeAndDistanceOfRange(ITEM_RANGE, 0, 10, 10);
}
@Override
public void performRitual(IMasterRitualStone masterRitualStone)
{
World world = masterRitualStone.getWorldObj();
BlockPos pos = masterRitualStone.getBlockPos();
AreaDescriptor itemDetectionRange = getBlockRange(ITEM_RANGE);
List<EntityItem> itemList = world.getEntitiesWithinAABB(EntityItem.class, itemDetectionRange.getAABB(pos));
for (EntityItem entityItem : itemList)
{
ItemStack stack = entityItem.getEntityItem();
if (MeteorRegistry.hasMeteorForItem(stack))
{
EntityMeteor meteor = new EntityMeteor(world, pos.getX(), 260, pos.getZ(), 0, -0.1, 0);
meteor.setMeteorStack(stack.copy());
world.spawnEntityInWorld(meteor);
entityItem.setDead();
masterRitualStone.setActive(false);
}
}
}
@Override
public int getRefreshTime()
{
return 1;
}
@Override
public int getRefreshCost()
{
return 0;
}
@Override
public ArrayList<RitualComponent> getComponents()
{
ArrayList<RitualComponent> components = new ArrayList<RitualComponent>();
this.addParallelRunes(components, 2, 0, EnumRuneType.FIRE);
this.addOffsetRunes(components, 3, 1, 0, EnumRuneType.AIR);
this.addOffsetRunes(components, 4, 2, 0, EnumRuneType.AIR);
this.addOffsetRunes(components, 5, 3, 0, EnumRuneType.DUSK);
this.addCornerRunes(components, 4, 0, EnumRuneType.DUSK);
for (int i = 4; i <= 6; i++)
{
this.addParallelRunes(components, 4, 0, EnumRuneType.EARTH);
}
this.addParallelRunes(components, 8, 0, EnumRuneType.EARTH);
this.addParallelRunes(components, 8, 1, EnumRuneType.EARTH);
this.addParallelRunes(components, 7, 1, EnumRuneType.EARTH);
this.addParallelRunes(components, 7, 2, EnumRuneType.EARTH);
this.addParallelRunes(components, 6, 2, EnumRuneType.FIRE);
this.addParallelRunes(components, 6, 3, EnumRuneType.WATER);
this.addParallelRunes(components, 5, 3, EnumRuneType.WATER);
this.addParallelRunes(components, 5, 4, EnumRuneType.AIR);
this.addOffsetRunes(components, 1, 4, 4, EnumRuneType.AIR);
this.addParallelRunes(components, 4, 4, EnumRuneType.AIR);
this.addOffsetRunes(components, 2, 4, 4, EnumRuneType.WATER);
this.addOffsetRunes(components, 2, 3, 4, EnumRuneType.FIRE);
this.addCornerRunes(components, 3, 4, EnumRuneType.FIRE);
return components;
}
@Override
public Ritual getNewCopy()
{
return new RitualMeteor();
}
}