Added demon chests, started working on loot system, improved demon AI

This commit is contained in:
WayofTime 2014-11-27 07:55:04 -05:00
parent 98e7d6ede7
commit 37d0fc69f1
16 changed files with 376 additions and 74 deletions

View file

@ -1,9 +1,47 @@
package WayofTime.alchemicalWizardry; package WayofTime.alchemicalWizardry;
import WayofTime.alchemicalWizardry.common.block.*;
import WayofTime.alchemicalWizardry.common.items.*;
import cpw.mods.fml.common.registry.GameRegistry;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import WayofTime.alchemicalWizardry.common.block.ArmourForge;
import WayofTime.alchemicalWizardry.common.block.BlockAlchemicCalcinator;
import WayofTime.alchemicalWizardry.common.block.BlockAltar;
import WayofTime.alchemicalWizardry.common.block.BlockBelljar;
import WayofTime.alchemicalWizardry.common.block.BlockBloodLightSource;
import WayofTime.alchemicalWizardry.common.block.BlockConduit;
import WayofTime.alchemicalWizardry.common.block.BlockDemonPortal;
import WayofTime.alchemicalWizardry.common.block.BlockHomHeart;
import WayofTime.alchemicalWizardry.common.block.BlockMasterStone;
import WayofTime.alchemicalWizardry.common.block.BlockPedestal;
import WayofTime.alchemicalWizardry.common.block.BlockPlinth;
import WayofTime.alchemicalWizardry.common.block.BlockReagentConduit;
import WayofTime.alchemicalWizardry.common.block.BlockSchematicSaver;
import WayofTime.alchemicalWizardry.common.block.BlockSocket;
import WayofTime.alchemicalWizardry.common.block.BlockSpectralContainer;
import WayofTime.alchemicalWizardry.common.block.BlockSpellEffect;
import WayofTime.alchemicalWizardry.common.block.BlockSpellEnhancement;
import WayofTime.alchemicalWizardry.common.block.BlockSpellModifier;
import WayofTime.alchemicalWizardry.common.block.BlockSpellParadigm;
import WayofTime.alchemicalWizardry.common.block.BlockTeleposer;
import WayofTime.alchemicalWizardry.common.block.BlockWritingTable;
import WayofTime.alchemicalWizardry.common.block.BloodRune;
import WayofTime.alchemicalWizardry.common.block.BloodStoneBrick;
import WayofTime.alchemicalWizardry.common.block.EfficiencyRune;
import WayofTime.alchemicalWizardry.common.block.EmptySocket;
import WayofTime.alchemicalWizardry.common.block.ImperfectRitualStone;
import WayofTime.alchemicalWizardry.common.block.LargeBloodStoneBrick;
import WayofTime.alchemicalWizardry.common.block.LifeEssenceBlock;
import WayofTime.alchemicalWizardry.common.block.RitualStone;
import WayofTime.alchemicalWizardry.common.block.RuneOfSacrifice;
import WayofTime.alchemicalWizardry.common.block.RuneOfSelfSacrifice;
import WayofTime.alchemicalWizardry.common.block.SpectralBlock;
import WayofTime.alchemicalWizardry.common.block.SpeedRune;
import WayofTime.alchemicalWizardry.common.demonVillage.tileEntity.BlockDemonChest;
import WayofTime.alchemicalWizardry.common.items.ItemBlockCrystalBelljar;
import WayofTime.alchemicalWizardry.common.items.ItemBloodRuneBlock;
import WayofTime.alchemicalWizardry.common.items.ItemSpellEffectBlock;
import WayofTime.alchemicalWizardry.common.items.ItemSpellEnhancementBlock;
import WayofTime.alchemicalWizardry.common.items.ItemSpellModifierBlock;
import WayofTime.alchemicalWizardry.common.items.ItemSpellParadigmBlock;
import cpw.mods.fml.common.registry.GameRegistry;
/** /**
* Created with IntelliJ IDEA. * Created with IntelliJ IDEA.
@ -48,6 +86,7 @@ public class ModBlocks
public static Block blockReagentConduit; public static Block blockReagentConduit;
public static Block blockAlchemicCalcinator; public static Block blockAlchemicCalcinator;
public static Block blockCrystalBelljar; public static Block blockCrystalBelljar;
public static Block blockDemonChest;
public static void init() public static void init()
{ {
@ -83,6 +122,7 @@ public class ModBlocks
blockReagentConduit = new BlockReagentConduit(); blockReagentConduit = new BlockReagentConduit();
blockAlchemicCalcinator = new BlockAlchemicCalcinator(); blockAlchemicCalcinator = new BlockAlchemicCalcinator();
blockCrystalBelljar = new BlockBelljar(); blockCrystalBelljar = new BlockBelljar();
blockDemonChest = new BlockDemonChest();
blockLifeEssence = new LifeEssenceBlock(); blockLifeEssence = new LifeEssenceBlock();
} }
@ -125,6 +165,7 @@ public class ModBlocks
GameRegistry.registerBlock(ModBlocks.blockReagentConduit, "blockReagentConduit"); GameRegistry.registerBlock(ModBlocks.blockReagentConduit, "blockReagentConduit");
GameRegistry.registerBlock(ModBlocks.blockAlchemicCalcinator, "blockAlchemicCalcinator"); GameRegistry.registerBlock(ModBlocks.blockAlchemicCalcinator, "blockAlchemicCalcinator");
GameRegistry.registerBlock(ModBlocks.blockCrystalBelljar, ItemBlockCrystalBelljar.class, "blockCrystalBelljar"); GameRegistry.registerBlock(ModBlocks.blockCrystalBelljar, ItemBlockCrystalBelljar.class, "blockCrystalBelljar");
GameRegistry.registerBlock(ModBlocks.blockDemonChest, "blockDemonChest");
} }
public static void registerBlocksInInit() public static void registerBlocksInInit()

View file

@ -1,17 +1,24 @@
package WayofTime.alchemicalWizardry.common.demonVillage; package WayofTime.alchemicalWizardry.common.demonVillage;
import WayofTime.alchemicalWizardry.common.Int3;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.GameRegistry.UniqueIdentifier;
import net.minecraft.block.Block;
import net.minecraft.block.BlockStairs;
import net.minecraft.init.Blocks;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.block.BlockLadder;
import net.minecraft.block.BlockStairs;
import net.minecraft.init.Blocks;
import net.minecraft.inventory.IInventory;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import WayofTime.alchemicalWizardry.common.Int3;
import WayofTime.alchemicalWizardry.common.demonVillage.loot.DemonVillageLootRegistry;
import WayofTime.alchemicalWizardry.common.demonVillage.tileEntity.IBlockPortalNode;
import WayofTime.alchemicalWizardry.common.demonVillage.tileEntity.ITilePortalNode;
import WayofTime.alchemicalWizardry.common.demonVillage.tileEntity.TEDemonPortal;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.GameRegistry.UniqueIdentifier;
public class BlockSet public class BlockSet
{ {
protected String blockid; protected String blockid;
@ -80,6 +87,28 @@ public class BlockSet
metadata = southUpSet; metadata = southUpSet;
break; break;
} }
}else if(block instanceof BlockLadder)
{
int[] northSet = new int[]{2, 3, 0, 1};
int[] eastSet = new int[]{1, 0, 2, 3};
int[] southSet = new int[]{3, 2, 1, 0};
int[] westSet = new int[]{0, 1, 3, 2};
switch (meta)
{
case 0:
metadata = westSet;
break;
case 1:
metadata = eastSet;
break;
case 2:
metadata = northSet;
break;
case 3:
metadata = southSet;
break;
}
} }
} }
@ -141,7 +170,7 @@ public class BlockSet
} }
} }
public void buildAtIndex(World world, int xCoord, int yCoord, int zCoord, ForgeDirection dir, int index) public void buildAtIndex(TEDemonPortal teDemonPortal, World world, int xCoord, int yCoord, int zCoord, ForgeDirection dir, int index, boolean populateInventories, int tier)
{ {
Block block = this.getBlock(); Block block = this.getBlock();
if (index >= positions.size() || block == null) if (index >= positions.size() || block == null)
@ -177,13 +206,34 @@ public class BlockSet
} }
world.setBlock(xCoord + xOff, yCoord + yOff, zCoord + zOff, block, meta, 3); world.setBlock(xCoord + xOff, yCoord + yOff, zCoord + zOff, block, meta, 3);
if(populateInventories)
{
this.populateIfIInventory(world, xCoord + xOff, yCoord + yOff, zCoord + zOff, tier);
}
if(block instanceof IBlockPortalNode)
{
TileEntity tile = world.getTileEntity(xCoord + xOff, yCoord + yOff, zCoord + zOff);
if(tile instanceof ITilePortalNode)
{
((ITilePortalNode) tile).setPortalLocation(teDemonPortal);
}
}
} }
public void buildAll(World world, int xCoord, int yCoord, int zCoord, ForgeDirection dir) public void populateIfIInventory(World world, int x, int y, int z, int tier)
{
TileEntity tile = world.getTileEntity(x, y, z);
if(tile instanceof IInventory)
{
DemonVillageLootRegistry.populateChest((IInventory)tile, tier);
}
}
public void buildAll(TEDemonPortal teDemonPortal, World world, int xCoord, int yCoord, int zCoord, ForgeDirection dir, boolean populateInventories, int tier)
{ {
for (int i = 0; i < positions.size(); i++) for (int i = 0; i < positions.size(); i++)
{ {
this.buildAtIndex(world, xCoord, yCoord, zCoord, dir, i); this.buildAtIndex(teDemonPortal, world, xCoord, yCoord, zCoord, dir, i, populateInventories, tier);
} }
} }

View file

@ -1,14 +1,15 @@
package WayofTime.alchemicalWizardry.common.demonVillage; package WayofTime.alchemicalWizardry.common.demonVillage;
import WayofTime.alchemicalWizardry.ModBlocks;
import WayofTime.alchemicalWizardry.common.Int3;
import net.minecraft.block.Block;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import WayofTime.alchemicalWizardry.ModBlocks;
import WayofTime.alchemicalWizardry.common.Int3;
import WayofTime.alchemicalWizardry.common.demonVillage.tileEntity.TEDemonPortal;
public class BuildingSchematic public class BuildingSchematic
{ {
public String name; public String name;
@ -51,11 +52,11 @@ public class BuildingSchematic
blockList.add(set); blockList.add(set);
} }
public void buildAll(World world, int xCoord, int yCoord, int zCoord, ForgeDirection dir) public void buildAll(TEDemonPortal teDemonPortal, World world, int xCoord, int yCoord, int zCoord, ForgeDirection dir, boolean populateInventories)
{ {
for (BlockSet set : blockList) for (BlockSet set : blockList)
{ {
set.buildAll(world, xCoord, yCoord, zCoord, dir); set.buildAll(teDemonPortal, world, xCoord, yCoord, zCoord, dir, populateInventories, this.buildingTier);
} }
} }

View file

@ -1,8 +1,9 @@
package WayofTime.alchemicalWizardry.common.demonVillage; package WayofTime.alchemicalWizardry.common.demonVillage;
import WayofTime.alchemicalWizardry.common.Int3;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
import WayofTime.alchemicalWizardry.common.Int3;
import WayofTime.alchemicalWizardry.common.demonVillage.tileEntity.TEDemonPortal;
public class DemonBuilding public class DemonBuilding
{ {
@ -34,9 +35,9 @@ public class DemonBuilding
return area.doesContainAll(master, gridX, gridZ, dir); return area.doesContainAll(master, gridX, gridZ, dir);
} }
public void buildAll(World world, int xCoord, int yCoord, int zCoord, ForgeDirection dir) public void buildAll(TEDemonPortal teDemonPortal, World world, int xCoord, int yCoord, int zCoord, ForgeDirection dir, boolean populateInventories)
{ {
schematic.buildAll(world, xCoord, yCoord, zCoord, dir); schematic.buildAll(teDemonPortal, world, xCoord, yCoord, zCoord, dir, populateInventories);
} }
public void setAllGridSpaces(int xInit, int zInit, int yLevel, ForgeDirection dir, int type, GridSpaceHolder master) public void setAllGridSpaces(int xInit, int zInit, int yLevel, ForgeDirection dir, int type, GridSpaceHolder master)

View file

@ -1,12 +1,8 @@
package WayofTime.alchemicalWizardry.common.demonVillage.ai; package WayofTime.alchemicalWizardry.common.demonVillage.ai;
import java.util.Iterator;
import java.util.List;
import net.minecraft.entity.EntityCreature; import net.minecraft.entity.EntityCreature;
import net.minecraft.entity.ai.EntityAIHurtByTarget; import net.minecraft.entity.ai.EntityAIHurtByTarget;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import WayofTime.alchemicalWizardry.common.Int3; import WayofTime.alchemicalWizardry.common.Int3;
import WayofTime.alchemicalWizardry.common.demonVillage.demonHoard.demon.IHoardDemon; import WayofTime.alchemicalWizardry.common.demonVillage.demonHoard.demon.IHoardDemon;
import WayofTime.alchemicalWizardry.common.demonVillage.tileEntity.TEDemonPortal; import WayofTime.alchemicalWizardry.common.demonVillage.tileEntity.TEDemonPortal;
@ -24,11 +20,6 @@ public class EntityDemonAIHurtByTarget extends EntityAIHurtByTarget
@Override @Override
public void startExecuting() public void startExecuting()
{
this.taskOwner.setAttackTarget(this.taskOwner.getAITarget());
this.revengeTimer = this.taskOwner.func_142015_aE();
if (this.entityCallsForHelp && this.taskOwner instanceof IHoardDemon)
{ {
Int3 portalPosition = ((IHoardDemon)this.taskOwner).getPortalLocation(); Int3 portalPosition = ((IHoardDemon)this.taskOwner).getPortalLocation();
if(portalPosition == null) if(portalPosition == null)
@ -38,24 +29,36 @@ public class EntityDemonAIHurtByTarget extends EntityAIHurtByTarget
} }
TileEntity portal = this.taskOwner.worldObj.getTileEntity(portalPosition.xCoord, portalPosition.yCoord, portalPosition.zCoord); TileEntity portal = this.taskOwner.worldObj.getTileEntity(portalPosition.xCoord, portalPosition.yCoord, portalPosition.zCoord);
if((this.taskOwner.getAITarget() instanceof IHoardDemon && portalPosition.equals(((IHoardDemon)this.taskOwner.getAITarget()).getPortalLocation())))
{
return;
}
this.taskOwner.setAttackTarget(this.taskOwner.getAITarget());
this.revengeTimer = this.taskOwner.func_142015_aE();
if (this.entityCallsForHelp && this.taskOwner instanceof IHoardDemon)
{
if(portal instanceof TEDemonPortal) if(portal instanceof TEDemonPortal)
{ {
((TEDemonPortal) portal).notifyDemons(taskOwner, this.taskOwner.getAITarget(), 25); ((TEDemonPortal) portal).notifyDemons(taskOwner, this.taskOwner.getAITarget(), 25);
} }
double d0 = this.getTargetDistance(); // double d0 = this.getTargetDistance();
List list = this.taskOwner.worldObj.getEntitiesWithinAABB(this.taskOwner.getClass(), AxisAlignedBB.getBoundingBox(this.taskOwner.posX, this.taskOwner.posY, this.taskOwner.posZ, this.taskOwner.posX + 1.0D, this.taskOwner.posY + 1.0D, this.taskOwner.posZ + 1.0D).expand(d0, 10.0D, d0)); // List list = this.taskOwner.worldObj.getEntitiesWithinAABB(this.taskOwner.getClass(), AxisAlignedBB.getBoundingBox(this.taskOwner.posX, this.taskOwner.posY, this.taskOwner.posZ, this.taskOwner.posX + 1.0D, this.taskOwner.posY + 1.0D, this.taskOwner.posZ + 1.0D).expand(d0, 10.0D, d0));
Iterator iterator = list.iterator(); // Iterator iterator = list.iterator();
//
while (iterator.hasNext()) // while (iterator.hasNext())
{ // {
EntityCreature entitycreature = (EntityCreature)iterator.next(); // EntityCreature entitycreature = (EntityCreature)iterator.next();
//
if (this.taskOwner != entitycreature && entitycreature.getAttackTarget() == null && !entitycreature.isOnSameTeam(this.taskOwner.getAITarget())) // if (this.taskOwner != entitycreature && entitycreature.getAttackTarget() == null && !entitycreature.isOnSameTeam(this.taskOwner.getAITarget()))
{ // {
entitycreature.setAttackTarget(this.taskOwner.getAITarget()); // entitycreature.setAttackTarget(this.taskOwner.getAITarget());
} // }
} // }
} }
super.startExecuting(); super.startExecuting();

View file

@ -1,5 +1,6 @@
package WayofTime.alchemicalWizardry.common.demonVillage.demonHoard; package WayofTime.alchemicalWizardry.common.demonVillage.demonHoard;
import WayofTime.alchemicalWizardry.common.demonVillage.tileEntity.TEDemonPortal;
import net.minecraft.world.World; import net.minecraft.world.World;
public abstract class DemonHoardPacket public abstract class DemonHoardPacket
@ -9,7 +10,7 @@ public abstract class DemonHoardPacket
} }
public abstract int summonDemons(World world, int x, int y, int z, DemonType type, int tier, boolean spawnGuardian); public abstract int summonDemons(TEDemonPortal teDemonPortal, World world, int x, int y, int z, DemonType type, int tier, boolean spawnGuardian);
public abstract boolean canFitType(DemonType type); public abstract boolean canFitType(DemonType type);

View file

@ -1,8 +1,9 @@
package WayofTime.alchemicalWizardry.common.demonVillage.demonHoard; package WayofTime.alchemicalWizardry.common.demonVillage.demonHoard;
import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase;
import net.minecraft.world.World; import net.minecraft.world.World;
import WayofTime.alchemicalWizardry.common.entity.mob.EntityFallenAngel; import WayofTime.alchemicalWizardry.common.demonVillage.demonHoard.demon.EntityMinorDemonGrunt;
import WayofTime.alchemicalWizardry.common.demonVillage.tileEntity.TEDemonPortal;
public class DemonPacketAngel extends DemonHoardPacket public class DemonPacketAngel extends DemonHoardPacket
{ {
@ -19,12 +20,15 @@ public class DemonPacketAngel extends DemonHoardPacket
} }
@Override @Override
public int summonDemons(World world, int x, int y, int z, DemonType type, int tier, boolean spawnGuardian) public int summonDemons(TEDemonPortal teDemonPortal, World world, int x, int y, int z, DemonType type, int tier, boolean spawnGuardian)
{ {
Entity entity = new EntityFallenAngel(world); EntityLivingBase entity = new EntityMinorDemonGrunt(world);
entity.setPosition(x, y, z); entity.setPosition(x, y, z);
world.spawnEntityInWorld(entity); world.spawnEntityInWorld(entity);
teDemonPortal.enthrallDemon(entity);
return 1; return 1;
} }
} }

View file

@ -4,6 +4,7 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import WayofTime.alchemicalWizardry.common.demonVillage.tileEntity.TEDemonPortal;
import net.minecraft.world.World; import net.minecraft.world.World;
public class DemonPacketRegistry public class DemonPacketRegistry
@ -61,18 +62,18 @@ public class DemonPacketRegistry
return ""; return "";
} }
public static int spawnDemons(World world, int x, int y, int z, DemonType type, int tier, boolean spawnGuardian) public static int spawnDemons(TEDemonPortal teDemonPortal, World world, int x, int y, int z, DemonType type, int tier, boolean spawnGuardian)
{ {
return spawnDemons(world, x, y, z, getDemonPacketName(type, tier, spawnGuardian), type, tier, spawnGuardian); return spawnDemons(teDemonPortal, world, x, y, z, getDemonPacketName(type, tier, spawnGuardian), type, tier, spawnGuardian);
} }
public static int spawnDemons(World world, int x, int y, int z, String name, DemonType type, int tier, boolean spawnGuardian) public static int spawnDemons(TEDemonPortal teDemonPortal, World world, int x, int y, int z, String name, DemonType type, int tier, boolean spawnGuardian)
{ {
DemonHoardPacket packet = packetMap.get(name); DemonHoardPacket packet = packetMap.get(name);
if(packet != null) if(packet != null)
{ {
return packet.summonDemons(world, x, y, z, type, tier, spawnGuardian); return packet.summonDemons(teDemonPortal, world, x, y, z, type, tier, spawnGuardian);
} }
return 0; return 0;

View file

@ -5,7 +5,6 @@ import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.SharedMonsterAttributes;
import net.minecraft.entity.ai.EntityAIAttackOnCollide; import net.minecraft.entity.ai.EntityAIAttackOnCollide;
import net.minecraft.entity.ai.EntityAIFollowOwner; import net.minecraft.entity.ai.EntityAIFollowOwner;
import net.minecraft.entity.ai.EntityAIHurtByTarget;
import net.minecraft.entity.ai.EntityAILookIdle; import net.minecraft.entity.ai.EntityAILookIdle;
import net.minecraft.entity.ai.EntityAIOwnerHurtByTarget; import net.minecraft.entity.ai.EntityAIOwnerHurtByTarget;
import net.minecraft.entity.ai.EntityAIOwnerHurtTarget; import net.minecraft.entity.ai.EntityAIOwnerHurtTarget;
@ -21,13 +20,16 @@ import net.minecraft.item.ItemFood;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.pathfinding.PathEntity; import net.minecraft.pathfinding.PathEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.DamageSource; import net.minecraft.util.DamageSource;
import net.minecraft.world.World; import net.minecraft.world.World;
import WayofTime.alchemicalWizardry.ModItems; import WayofTime.alchemicalWizardry.ModItems;
import WayofTime.alchemicalWizardry.common.EntityAITargetAggro; import WayofTime.alchemicalWizardry.common.EntityAITargetAggro;
import WayofTime.alchemicalWizardry.common.Int3; import WayofTime.alchemicalWizardry.common.Int3;
import WayofTime.alchemicalWizardry.common.demonVillage.ai.EntityAIOccasionalRangedAttack; import WayofTime.alchemicalWizardry.common.demonVillage.ai.EntityAIOccasionalRangedAttack;
import WayofTime.alchemicalWizardry.common.demonVillage.ai.EntityDemonAIHurtByTarget;
import WayofTime.alchemicalWizardry.common.demonVillage.ai.IOccasionalRangedAttackMob; import WayofTime.alchemicalWizardry.common.demonVillage.ai.IOccasionalRangedAttackMob;
import WayofTime.alchemicalWizardry.common.demonVillage.tileEntity.TEDemonPortal;
import WayofTime.alchemicalWizardry.common.entity.mob.EntityDemon; import WayofTime.alchemicalWizardry.common.entity.mob.EntityDemon;
import WayofTime.alchemicalWizardry.common.entity.projectile.HolyProjectile; import WayofTime.alchemicalWizardry.common.entity.projectile.HolyProjectile;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper;
@ -37,11 +39,13 @@ public class EntityMinorDemonGrunt extends EntityDemon implements IOccasionalRan
private EntityAIOccasionalRangedAttack aiArrowAttack = new EntityAIOccasionalRangedAttack(this, 1.0D, 40, 40, 15.0F, 5); private EntityAIOccasionalRangedAttack aiArrowAttack = new EntityAIOccasionalRangedAttack(this, 1.0D, 40, 40, 15.0F, 5);
private EntityAIAttackOnCollide aiAttackOnCollide = new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.2D, false); private EntityAIAttackOnCollide aiAttackOnCollide = new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.2D, false);
private boolean isAngry = false; private boolean isAngry = true;
private Int3 demonPortal; private Int3 demonPortal;
private static float maxTamedHealth = 50.0F; private static float maxTamedHealth = 200.0F;
private static float maxUntamedHealth = 50.0F; private static float maxUntamedHealth = 200.0F;
private boolean enthralled = false;
public EntityMinorDemonGrunt(World par1World) public EntityMinorDemonGrunt(World par1World)
{ {
@ -56,7 +60,7 @@ public class EntityMinorDemonGrunt extends EntityDemon implements IOccasionalRan
this.tasks.addTask(6, new EntityAILookIdle(this)); this.tasks.addTask(6, new EntityAILookIdle(this));
this.targetTasks.addTask(1, new EntityAIOwnerHurtByTarget(this)); this.targetTasks.addTask(1, new EntityAIOwnerHurtByTarget(this));
this.targetTasks.addTask(2, new EntityAIOwnerHurtTarget(this)); this.targetTasks.addTask(2, new EntityAIOwnerHurtTarget(this));
this.targetTasks.addTask(3, new EntityAIHurtByTarget(this, true)); this.targetTasks.addTask(3, new EntityDemonAIHurtByTarget(this, true));
this.targetTasks.addTask(4, new EntityAITargetAggro(this, EntityPlayer.class, 0, false)); this.targetTasks.addTask(4, new EntityAITargetAggro(this, EntityPlayer.class, 0, false));
this.setAggro(false); this.setAggro(false);
this.setTamed(false); this.setTamed(false);
@ -215,6 +219,15 @@ public class EntityMinorDemonGrunt extends EntityDemon implements IOccasionalRan
@Override @Override
public void onUpdate() public void onUpdate()
{ {
if(!this.enthralled)
{
TileEntity tile = this.worldObj.getTileEntity(this.demonPortal.xCoord, this.demonPortal.yCoord, this.demonPortal.zCoord);
if(tile instanceof TEDemonPortal)
{
((TEDemonPortal) tile).enthrallDemon(this);
this.enthralled = true;
}
}
super.onUpdate(); super.onUpdate();
} }
@ -437,4 +450,11 @@ public class EntityMinorDemonGrunt extends EntityDemon implements IOccasionalRan
{ {
return true; return true;
} }
@Override
public boolean thrallDemon(TEDemonPortal teDemonPortal)
{
this.setPortalLocation(new Int3(teDemonPortal.xCoord, teDemonPortal.yCoord, teDemonPortal.zCoord));
return true;
}
} }

View file

@ -1,9 +1,11 @@
package WayofTime.alchemicalWizardry.common.demonVillage.demonHoard.demon; package WayofTime.alchemicalWizardry.common.demonVillage.demonHoard.demon;
import WayofTime.alchemicalWizardry.common.Int3; import WayofTime.alchemicalWizardry.common.Int3;
import WayofTime.alchemicalWizardry.common.demonVillage.tileEntity.TEDemonPortal;
public interface IHoardDemon public interface IHoardDemon
{ {
public void setPortalLocation(Int3 position); public void setPortalLocation(Int3 position);
public Int3 getPortalLocation(); public Int3 getPortalLocation();
public boolean thrallDemon(TEDemonPortal teDemonPortal);
} }

View file

@ -0,0 +1,34 @@
package WayofTime.alchemicalWizardry.common.demonVillage.loot;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import net.minecraft.init.Items;
import net.minecraft.inventory.IInventory;
import net.minecraft.util.WeightedRandomChestContent;
public class DemonVillageLootRegistry
{
public static ArrayList<WeightedRandomChestContent> list = new ArrayList();
static
{
list.add(new WeightedRandomChestContent(Items.iron_ingot, 0, 1, 5, 10));
}
public static void populateChest(IInventory tile, int tier)
{
WeightedRandomChestContent.generateChestContents(new Random(), toArray(list), tile, 10);
}
public static WeightedRandomChestContent[] toArray(List<WeightedRandomChestContent> aList)
{
int size = aList.size();
WeightedRandomChestContent[] contents = new WeightedRandomChestContent[size];
contents = aList.toArray(contents);
return contents;
}
}

View file

@ -0,0 +1,36 @@
package WayofTime.alchemicalWizardry.common.demonVillage.tileEntity;
import net.minecraft.block.BlockChest;
import net.minecraft.inventory.IInventory;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import WayofTime.alchemicalWizardry.AlchemicalWizardry;
public class BlockDemonChest extends BlockChest implements IBlockPortalNode
{
public BlockDemonChest()
{
super(0);
this.setHardness(2.5F).setStepSound(soundTypeWood).setBlockName("demonChest");
this.setCreativeTab(AlchemicalWizardry.tabBloodMagic);
}
public IInventory func_149951_m(World world, int x, int y, int z)
{
IInventory object = (IInventory)world.getTileEntity(x, y, z);
return object;
}
@Override
public TileEntity createNewTileEntity(World var1, int var2)
{
return new TEDemonChest();
}
// @Override
// public boolean canPlaceBlockAt(World p_149742_1_, int p_149742_2_, int p_149742_3_, int p_149742_4_)
// {
// return true;
// }
}

View file

@ -0,0 +1,6 @@
package WayofTime.alchemicalWizardry.common.demonVillage.tileEntity;
public interface IBlockPortalNode
{
}

View file

@ -0,0 +1,6 @@
package WayofTime.alchemicalWizardry.common.demonVillage.tileEntity;
public interface ITilePortalNode
{
public void setPortalLocation(TEDemonPortal teDemonPortal);
}

View file

@ -0,0 +1,69 @@
package WayofTime.alchemicalWizardry.common.demonVillage.tileEntity;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityChest;
import WayofTime.alchemicalWizardry.common.Int3;
public class TEDemonChest extends TileEntityChest implements ITilePortalNode
{
public Int3 portalLocation = new Int3(0,0,0);
@Override
public String getInventoryName()
{
return "Demon's Chest";
}
@Override
public void readFromNBT(NBTTagCompound tag)
{
super.readFromNBT(tag);
NBTTagCompound portalTag = tag.getCompoundTag("portalLocation");
portalLocation = Int3.readFromNBT(portalTag);
}
@Override
public void writeToNBT(NBTTagCompound tag)
{
super.writeToNBT(tag);
NBTTagCompound portalTag = portalLocation.writeToNBT(new NBTTagCompound());
tag.setTag("portalLocation", portalTag);
}
@Override
public void checkForAdjacentChests()
{
return;
}
@Override
public void setPortalLocation(TEDemonPortal teDemonPortal)
{
if(teDemonPortal != null)
{
portalLocation = new Int3(teDemonPortal.xCoord, teDemonPortal.yCoord, teDemonPortal.zCoord);
}
}
public TEDemonPortal getDemonPortal()
{
TileEntity tile = worldObj.getTileEntity(portalLocation.xCoord, portalLocation.yCoord, portalLocation.zCoord);
if(tile instanceof TEDemonPortal)
{
return (TEDemonPortal)tile;
}
return null;
}
public void notifyPortalOfInteraction()
{
TEDemonPortal portal = this.getDemonPortal();
if(portal == null)
{
return;
}
portal.notifyDemons(xCoord, yCoord, zCoord, 25);
}
}

View file

@ -33,7 +33,7 @@ public class TEDemonPortal extends TileEntity
public static int buildingGridDelay = 25; public static int buildingGridDelay = 25;
public static int roadGridDelay = 10; public static int roadGridDelay = 10;
public static int demonHoardDelay = 10; public static int demonHoardDelay = 40;
public static int[] tierCostList = new int[]{1000, 5000, 10000}; public static int[] tierCostList = new int[]{1000, 5000, 10000};
@ -202,7 +202,6 @@ public class TEDemonPortal extends TileEntity
public void notifyDemons(EntityLivingBase demon, EntityLivingBase target, double radius) //TODO public void notifyDemons(EntityLivingBase demon, EntityLivingBase target, double radius) //TODO
{ {
// if (this.taskOwner != entitycreature && entitycreature.getAttackTarget() == null && !entitycreature.isOnSameTeam(this.taskOwner.getAITarget()))
for(IHoardDemon thrallDemon : this.hoardList) for(IHoardDemon thrallDemon : this.hoardList)
{ {
if(thrallDemon instanceof EntityCreature) if(thrallDemon instanceof EntityCreature)
@ -220,6 +219,30 @@ public class TEDemonPortal extends TileEntity
if((xi-xf)*(xi-xf) + (yi-yf)*(yi-yf) + (zi-zf)*(zi-zf) <= radius*radius) if((xi-xf)*(xi-xf) + (yi-yf)*(yi-yf) + (zi-zf)*(zi-zf) <= radius*radius)
{ {
((EntityCreature) thrallDemon).setAttackTarget(target); ((EntityCreature) thrallDemon).setAttackTarget(target);
}else
{
((EntityCreature) thrallDemon).getNavigator().tryMoveToEntityLiving(target, 2);
}
}
}
}
}
public void notifyDemons(int xf, int yf, int zf, double radius)
{
for(IHoardDemon thrallDemon : this.hoardList)
{
if(thrallDemon instanceof EntityCreature)
{
if(((EntityCreature) thrallDemon).getAttackTarget() == null)
{
double xi = ((EntityCreature) thrallDemon).posX;
double yi = ((EntityCreature) thrallDemon).posY;
double zi = ((EntityCreature) thrallDemon).posZ;
if((xi-xf)*(xi-xf) + (yi-yf)*(yi-yf) + (zi-zf)*(zi-zf) <= radius*radius)
{
((EntityCreature) thrallDemon).getNavigator().tryMoveToXYZ(xf, yf, zf, 2);
} }
} }
} }
@ -229,10 +252,14 @@ public class TEDemonPortal extends TileEntity
public void enthrallDemon(EntityLivingBase demon) public void enthrallDemon(EntityLivingBase demon)
{ {
if(demon instanceof IHoardDemon) if(demon instanceof IHoardDemon)
{
boolean enthrall = ((IHoardDemon) demon).thrallDemon(this);
if(enthrall)
{ {
this.hoardList.add((IHoardDemon)demon); this.hoardList.add((IHoardDemon)demon);
} }
} }
}
public void initialize() public void initialize()
{ {
@ -312,7 +339,7 @@ public class TEDemonPortal extends TileEntity
if(this.demonHoardCooldown <= 0) if(this.demonHoardCooldown <= 0)
{ {
int complexityCost = this.createRandomDemonHoard(tier, DemonType.FIRE, this.isLockedDown()); int complexityCost = this.createRandomDemonHoard(this, tier, DemonType.FIRE, this.isLockedDown());
if(complexityCost > 0) if(complexityCost > 0)
{ {
this.demonHoardCooldown = TEDemonPortal.demonHoardDelay * complexityCost; this.demonHoardCooldown = TEDemonPortal.demonHoardDelay * complexityCost;
@ -441,7 +468,7 @@ public class TEDemonPortal extends TileEntity
par1NBTTagCompound.setInteger("lockdownTimer", this.lockdownTimer); par1NBTTagCompound.setInteger("lockdownTimer", this.lockdownTimer);
} }
public int createRandomDemonHoard(int tier, DemonType type, boolean spawnGuardian) public int createRandomDemonHoard(TEDemonPortal teDemonPortal, int tier, DemonType type, boolean spawnGuardian)
{ {
int next = rand.nextInt(4); int next = rand.nextInt(4);
ForgeDirection dir; ForgeDirection dir;
@ -470,7 +497,7 @@ public class TEDemonPortal extends TileEntity
return 0; return 0;
} }
return DemonPacketRegistry.spawnDemons(worldObj, xCoord + road.xCoord * 5, yCoord + road.yCoord, zCoord + road.zCoord * 5, type, tier, spawnGuardian); return DemonPacketRegistry.spawnDemons(teDemonPortal, worldObj, xCoord + road.xCoord * 5, road.yCoord + 1, zCoord + road.zCoord * 5, type, tier, spawnGuardian);
} }
public int createRandomRoad() //Return the number of road spaces public int createRandomRoad() //Return the number of road spaces
@ -1190,7 +1217,7 @@ public class TEDemonPortal extends TileEntity
case 2: case 2:
build.destroyAllInField(worldObj, xCoord + (x) * 5, yLevel, zCoord + (z) * 5, chosenDirection.getOpposite()); build.destroyAllInField(worldObj, xCoord + (x) * 5, yLevel, zCoord + (z) * 5, chosenDirection.getOpposite());
build.buildAll(worldObj, xCoord + (x) * 5, yLevel, zCoord + (z) * 5, chosenDirection.getOpposite()); build.buildAll(this, worldObj, xCoord + (x) * 5, yLevel, zCoord + (z) * 5, chosenDirection.getOpposite(), true);
build.setAllGridSpaces(x, z, yLevel, chosenDirection.getOpposite(), GridSpace.MAIN_PORTAL, grid); build.setAllGridSpaces(x, z, yLevel, chosenDirection.getOpposite(), GridSpace.MAIN_PORTAL, grid);
this.loadGSH(grid); this.loadGSH(grid);
break; break;
@ -1300,7 +1327,7 @@ public class TEDemonPortal extends TileEntity
int zOff = offsetSpace.zCoord; int zOff = offsetSpace.zCoord;
build.destroyAllInField(worldObj, xCoord + (x + xOff) * 5, yLevel, zCoord + (z + zOff) * 5, chosenDirection.getOpposite()); build.destroyAllInField(worldObj, xCoord + (x + xOff) * 5, yLevel, zCoord + (z + zOff) * 5, chosenDirection.getOpposite());
build.buildAll(worldObj, xCoord + (x + xOff) * 5, yLevel, zCoord + (z + zOff) * 5, chosenDirection.getOpposite()); build.buildAll(this, worldObj, xCoord + (x + xOff) * 5, yLevel, zCoord + (z + zOff) * 5, chosenDirection.getOpposite(), true);
build.setAllGridSpaces(x + xOff, z + zOff, yLevel, chosenDirection.getOpposite(), GridSpace.HOUSE, grid); build.setAllGridSpaces(x + xOff, z + zOff, yLevel, chosenDirection.getOpposite(), GridSpace.HOUSE, grid);
this.loadGSH(grid); this.loadGSH(grid);