mirror of
https://github.com/GTNewHorizons/Botania.git
synced 2026-11-13 16:54:06 +00:00
Leaving this unfinished since I really don't feel like doing much more today.
This commit is contained in:
1 parent
d0041babdd
commit
d03d1f1ced
8 files changed
+208
No files matched your search
@@ -82,6 +82,7 @@ public final class BotaniaCreativeTab extends CreativeTabs {
|
||||
addItem(ModItems.fireRod);
|
||||
addItem(ModItems.diviningRod);
|
||||
addItem(ModItems.gravityRod);
|
||||
addItem(ModItems.missileRod);
|
||||
addItem(ModItems.virus);
|
||||
addItem(ModItems.slingshot);
|
||||
addItem(ModItems.vineBall);
|
||||
|
||||
@@ -0,0 +1,115 @@
|
||||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Nov 24, 2014, 5:58:22 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.common.entity;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import vazkii.botania.api.BotaniaAPI;
|
||||
import vazkii.botania.api.mana.IManaCollisionGhost;
|
||||
import vazkii.botania.common.Botania;
|
||||
import vazkii.botania.common.core.helper.Vector3;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockBush;
|
||||
import net.minecraft.block.BlockLeaves;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.EntityLiving;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.entity.monster.IMob;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.entity.projectile.EntityThrowable;
|
||||
import net.minecraft.util.AxisAlignedBB;
|
||||
import net.minecraft.util.DamageSource;
|
||||
import net.minecraft.util.MovingObjectPosition;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class EntityMagicMissile extends EntityThrowable {
|
||||
|
||||
EntityLivingBase target;
|
||||
|
||||
public EntityMagicMissile(World world) {
|
||||
super(world);
|
||||
setSize(0F, 0F);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUpdate() {
|
||||
super.onUpdate();
|
||||
|
||||
if(!worldObj.isRemote && !getTarget()) {
|
||||
setDead();
|
||||
return;
|
||||
}
|
||||
|
||||
Vector3 thisVec = Vector3.fromEntityCenter(this);
|
||||
Vector3 oldPos = new Vector3(lastTickPosX, lastTickPosY, lastTickPosZ);
|
||||
Vector3 diff = thisVec.copy().sub(oldPos);
|
||||
Vector3 step = diff.copy().normalize().multiply(0.05);
|
||||
int steps = (int) (diff.mag() / step.mag());
|
||||
Vector3 particlePos = oldPos.copy();
|
||||
|
||||
for(int i = 0; i < steps; i++) {
|
||||
Botania.proxy.sparkleFX(worldObj, particlePos.x, particlePos.y, particlePos.z, 1F, 0.4F, 1F, 0.8F, 2);
|
||||
if(worldObj.rand.nextInt(steps) <= 1)
|
||||
Botania.proxy.sparkleFX(worldObj, particlePos.x + (Math.random() - 0.5) * 0.4, particlePos.y + (Math.random() - 0.5) * 0.4, particlePos.z + (Math.random() - 0.5) * 0.4, 1F, 0.4F, 1F, 0.8F, 2);
|
||||
|
||||
particlePos.add(step);
|
||||
}
|
||||
|
||||
if(!worldObj.isRemote) {
|
||||
Vector3 targetVec = Vector3.fromEntityCenter(target);
|
||||
Vector3 motionVec = targetVec.copy().sub(thisVec).normalize().multiply(0.6);
|
||||
motionX = motionVec.x;
|
||||
motionY = motionVec.y;
|
||||
if(ticksExisted < 10)
|
||||
motionY = Math.abs(motionY);
|
||||
motionZ = motionVec.z;
|
||||
|
||||
List<EntityLivingBase> targetList = worldObj.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(posX - 0.5, posY - 0.5, posZ - 0.5, posX + 0.5, posY + 0.5, posZ + 0.5));
|
||||
if(targetList.contains(target) && target != null) {
|
||||
EntityLivingBase thrower = getThrower();
|
||||
EntityPlayer player = thrower instanceof EntityPlayer ? (EntityPlayer) thrower : null;
|
||||
target.attackEntityFrom(player == null ? DamageSource.generic : DamageSource.causePlayerDamage(player), 5);
|
||||
setDead();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean getTarget() {
|
||||
if(target != null && target.getHealth() > 0 && !target.isDead && worldObj.getLoadedEntityList().contains(target))
|
||||
return true;
|
||||
target = null;
|
||||
|
||||
double range = 12;
|
||||
List<IMob> entities = worldObj.getEntitiesWithinAABB(IMob.class, AxisAlignedBB.getBoundingBox(posX - range, posY - range, posZ - range, posX + range, posY + range, posZ + range));
|
||||
while(entities.size() > 0) {
|
||||
IMob mob = entities.get(worldObj.rand.nextInt(entities.size()));
|
||||
if(!(mob instanceof EntityLivingBase)) { // Just in case...
|
||||
entities.remove(mob);
|
||||
continue;
|
||||
}
|
||||
|
||||
target = (EntityLivingBase) mob;
|
||||
break;
|
||||
}
|
||||
|
||||
return target != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onImpact(MovingObjectPosition pos) {
|
||||
Block block = worldObj.getBlock(pos.blockX, pos.blockY, pos.blockZ);
|
||||
|
||||
if(!(block instanceof BlockBush) && !(block instanceof BlockLeaves) && (pos.entityHit == null || target == pos.entityHit))
|
||||
setDead();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -19,6 +19,7 @@ public final class ModEntities {
|
||||
|
||||
public static void init() {
|
||||
int id = 0;
|
||||
|
||||
EntityRegistry.registerModEntity(EntityManaBurst.class, LibEntityNames.MANA_BURST, id++, Botania.instance, 64, 10, true);
|
||||
EntityRegistry.registerModEntity(EntitySignalFlare.class, LibEntityNames.SIGNAL_FLARE, id++, Botania.instance, 2048, 10, false);
|
||||
EntityRegistry.registerModEntity(EntityPixie.class, LibEntityNames.PIXIE, id++, Botania.instance, 16, 3, true);
|
||||
@@ -28,6 +29,7 @@ public final class ModEntities {
|
||||
EntityRegistry.registerModEntity(EntityMagicLandmine.class, LibEntityNames.MAGIC_LANDMINE, id++, Botania.instance, 128, 40, false);
|
||||
EntityRegistry.registerModEntity(EntitySpark.class, LibEntityNames.SPARK, id++, Botania.instance, 64, 10, false);
|
||||
EntityRegistry.registerModEntity(EntityThrownItem.class, LibEntityNames.THROWN_ITEM, id++, Botania.instance, 64, 20, true);
|
||||
EntityRegistry.registerModEntity(EntityMagicMissile.class, LibEntityNames.MAGIC_MISSILE, id++, Botania.instance, 64, 10, true);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -79,6 +79,7 @@ import vazkii.botania.common.item.rod.ItemDirtRod;
|
||||
import vazkii.botania.common.item.rod.ItemDiviningRod;
|
||||
import vazkii.botania.common.item.rod.ItemFireRod;
|
||||
import vazkii.botania.common.item.rod.ItemGravityRod;
|
||||
import vazkii.botania.common.item.rod.ItemMissileRod;
|
||||
import vazkii.botania.common.item.rod.ItemRainbowRod;
|
||||
import vazkii.botania.common.item.rod.ItemSkyDirtRod;
|
||||
import vazkii.botania.common.item.rod.ItemTerraformRod;
|
||||
@@ -180,6 +181,7 @@ public final class ModItems {
|
||||
public static Item brewVial;
|
||||
public static Item brewFlask;
|
||||
public static Item bloodPendant;
|
||||
public static Item missileRod;
|
||||
|
||||
public static void init() {
|
||||
lexicon = new ItemLexicon();
|
||||
@@ -274,6 +276,7 @@ public final class ModItems {
|
||||
brewVial = new ItemBrewVial();
|
||||
brewFlask = new ItemBrewFlask();
|
||||
bloodPendant = new ItemBloodPendant();
|
||||
missileRod = new ItemMissileRod();
|
||||
|
||||
OreDictionary.registerOre(LibOreDict.LEXICON, lexicon);
|
||||
for(int i = 0; i < 16; i++) {
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
/**
|
||||
* This class was created by <Vazkii>. It's distributed as
|
||||
* part of the Botania Mod. Get the Source Code in github:
|
||||
* https://github.com/Vazkii/Botania
|
||||
*
|
||||
* Botania is Open Source and distributed under a
|
||||
* Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License
|
||||
* (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB)
|
||||
*
|
||||
* File Created @ [Nov 24, 2014, 5:58:16 PM (GMT)]
|
||||
*/
|
||||
package vazkii.botania.common.item.rod;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockFlower;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.item.EnumAction;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.ChunkCoordinates;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.util.ForgeDirection;
|
||||
import net.minecraftforge.oredict.OreDictionary;
|
||||
import vazkii.botania.api.mana.IManaUsingItem;
|
||||
import vazkii.botania.api.mana.ManaItemHandler;
|
||||
import vazkii.botania.api.subtile.ISpecialFlower;
|
||||
import vazkii.botania.common.Botania;
|
||||
import vazkii.botania.common.entity.EntityMagicMissile;
|
||||
import vazkii.botania.common.item.ItemMod;
|
||||
import vazkii.botania.common.item.rod.ItemTerraformRod.CoordsWithBlock;
|
||||
import vazkii.botania.common.lib.LibItemNames;
|
||||
import vazkii.botania.common.lib.LibMisc;
|
||||
|
||||
public class ItemMissileRod extends ItemMod implements IManaUsingItem {
|
||||
|
||||
private static final int COST_PER = 120;
|
||||
|
||||
public ItemMissileRod() {
|
||||
super();
|
||||
setMaxStackSize(1);
|
||||
setUnlocalizedName(LibItemNames.MISSILE_ROD);
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumAction getItemUseAction(ItemStack par1ItemStack) {
|
||||
return EnumAction.bow;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxItemUseDuration(ItemStack par1ItemStack) {
|
||||
return 72000;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUsingTick(ItemStack stack, EntityPlayer player, int count) {
|
||||
if(count != getMaxItemUseDuration(stack) && count % 2 == 0 && !player.worldObj.isRemote && ManaItemHandler.requestManaExact(stack, player, COST_PER, false)) {
|
||||
EntityMagicMissile missile = new EntityMagicMissile(player.worldObj);
|
||||
missile.setPosition(player.posX + (Math.random() - 0.5 * 0.1), player.posY + 2.4 + (Math.random() - 0.5 * 0.1), player.posZ + (Math.random() - 0.5 * 0.1));
|
||||
if(missile.getTarget()) {
|
||||
player.worldObj.spawnEntityInWorld(missile);
|
||||
ManaItemHandler.requestManaExact(stack, player, COST_PER, true);
|
||||
}
|
||||
Botania.proxy.sparkleFX(player.worldObj, player.posX, player.posY + 2.4, player.posZ, 1F, 0.4F, 1F, 6F, 6);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) {
|
||||
par3EntityPlayer.setItemInUse(par1ItemStack, getMaxItemUseDuration(par1ItemStack));
|
||||
return par1ItemStack;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isFull3D() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean usesMana(ItemStack stack) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -24,5 +24,6 @@ public final class LibEntityNames {
|
||||
public static final String MAGIC_LANDMINE = LibResources.PREFIX_MOD + "magicLandmine";
|
||||
public static final String SPARK = LibResources.PREFIX_MOD + "spark";
|
||||
public static final String THROWN_ITEM = LibResources.PREFIX_MOD + "thrownItem";
|
||||
public static final String MAGIC_MISSILE = LibResources.PREFIX_MOD + "magicMissile";
|
||||
|
||||
}
|
||||
@@ -106,6 +106,7 @@ public final class LibItemNames {
|
||||
public static final String BREW_VIAL = "brewVial";
|
||||
public static final String BREW_FLASK = "brewFlask";
|
||||
public static final String BLOOD_PENDANT = "bloodPendant";
|
||||
public static final String MISSILE_ROD = "missileRod";
|
||||
|
||||
public static final String[] LENS_NAMES = new String[] {
|
||||
"lensNormal",
|
||||
|
||||
Reference in new issue
Block a user