Files
TinkersConstruct/src/main/java/tconstruct/tools/TinkerToolEvents.java
T

455 lines
18 KiB
Java
Raw Normal View History

2014-06-06 19:46:05 -08:00
package tconstruct.tools;
2013-11-19 20:57:52 -08:00
2014-09-09 18:30:15 +10:00
import cpw.mods.fml.common.eventhandler.Event.Result;
import cpw.mods.fml.common.eventhandler.*;
import cpw.mods.fml.common.gameevent.PlayerEvent;
2014-09-09 18:30:15 +10:00
import cpw.mods.fml.common.gameevent.PlayerEvent.ItemCraftedEvent;
import java.util.List;
import net.minecraft.entity.*;
2014-10-07 22:43:06 +02:00
import net.minecraft.entity.item.EntityItem;
2014-09-09 18:30:15 +10:00
import net.minecraft.entity.monster.*;
import net.minecraft.entity.player.EntityPlayer;
2014-04-02 20:38:48 -04:00
import net.minecraft.entity.projectile.EntityArrow;
2013-12-31 16:37:46 -05:00
import net.minecraft.init.Items;
2014-09-09 18:30:15 +10:00
import net.minecraft.item.*;
import net.minecraft.nbt.NBTTagCompound;
2014-09-09 18:30:15 +10:00
import net.minecraft.util.*;
import net.minecraft.world.EnumDifficulty;
2014-09-09 18:30:15 +10:00
import net.minecraftforge.event.entity.living.*;
2014-10-07 22:43:06 +02:00
import net.minecraftforge.event.entity.player.PlayerDropsEvent;
2014-09-09 18:30:15 +10:00
import net.minecraftforge.oredict.*;
import net.minecraftforge.oredict.OreDictionary.OreRegisterEvent;
2013-07-31 13:08:18 -07:00
import tconstruct.TConstruct;
2014-07-06 22:59:44 -08:00
import tconstruct.armor.player.TPlayerStats;
2013-07-31 13:08:18 -07:00
import tconstruct.library.TConstructRegistry;
import tconstruct.library.event.*;
import tconstruct.library.tools.*;
2014-06-06 19:46:05 -08:00
import tconstruct.util.ItemHelper;
2013-10-01 19:44:04 -07:00
import tconstruct.util.config.PHConstruct;
2014-06-06 19:46:05 -08:00
public class TinkerToolEvents
{
2014-06-06 19:46:05 -08:00
@SubscribeEvent
public void onCrafting (ItemCraftedEvent event)
{
Item item = event.crafting.getItem();
if (!event.player.worldObj.isRemote)
{
if (item == Item.getItemFromBlock(TinkerTools.toolStationWood))
{
TPlayerStats stats = TPlayerStats.get(event.player);
if (!stats.materialManual)
{
stats.materialManual = true;
AbilityHelper.spawnItemAtPlayer(event.player, new ItemStack(TinkerTools.manualBook, 1, 1));
}
}
// slab pattern chest
if(item == Item.getItemFromBlock(TinkerTools.craftingSlabWood) && event.crafting.getItemDamage() == 4) {
// copy over NBT
for(int i = 0; i < event.craftMatrix.getSizeInventory(); i++) {
ItemStack stack = event.craftMatrix.getStackInSlot(i);
if(stack == null)
continue;
// regular pattern chest
if(stack.getItem() == Item.getItemFromBlock(TinkerTools.toolStationWood) && stack.getItemDamage() == 5)
{
event.crafting.setTagCompound(stack.getTagCompound());
break;
}
}
}
2014-06-06 19:46:05 -08:00
}
}
@SubscribeEvent
2014-09-09 18:30:15 +10:00
public void buildTool (ToolBuildEvent event)
{
// check if the handle is a bone
2014-09-09 18:30:15 +10:00
if (event.handleStack.getItem() == Items.bone)
{
event.handleStack = new ItemStack(TinkerTools.toolRod, 1, 5); // bone tool rod
return;
}
// check if the handle is a stick
List<ItemStack> sticks = OreDictionary.getOres("stickWood");
2014-09-09 18:30:15 +10:00
for (ItemStack stick : sticks)
if (OreDictionary.itemMatches(stick, event.handleStack, false))
{
event.handleStack = new ItemStack(TinkerTools.toolRod, 1, 0); // wooden tool rod
return;
}
}
2013-12-31 20:24:06 -05:00
@SubscribeEvent
2013-11-04 00:33:39 +01:00
public void craftTool (ToolCraftEvent.NormalTool event)
{
NBTTagCompound toolTag = event.toolTag.getCompoundTag("InfiTool");
2014-06-04 21:44:48 -08:00
if (PHConstruct.denyMattock && event.tool == TinkerTools.mattock)
{
int head = toolTag.getInteger("Head");
int handle = toolTag.getInteger("Handle");
int accessory = toolTag.getInteger("Accessory");
if (!allowCrafting(head, handle, accessory))
{
event.setResult(Result.DENY);
return;
}
}
// bonus modifiers
handlePaper(toolTag, event.tool);
handleThaumium(toolTag, event.tool);
2014-06-04 21:44:48 -08:00
if (event.tool == TinkerTools.battlesign)
2014-04-02 20:38:48 -04:00
{
int modifiers = toolTag.getInteger("Modifiers");
modifiers += 1;
toolTag.setInteger("Modifiers", modifiers);
}
}
2014-09-09 18:30:15 +10:00
private void handlePaper (NBTTagCompound toolTag, ToolCore tool)
{
int modifiers = toolTag.getInteger("Modifiers");
if (toolTag.getInteger("Head") == TinkerTools.MaterialID.Paper)
modifiers++;
if (toolTag.getInteger("Handle") == TinkerTools.MaterialID.Paper)
modifiers++;
if (toolTag.getInteger("Accessory") == TinkerTools.MaterialID.Paper)
modifiers++;
if (toolTag.getInteger("Extra") == TinkerTools.MaterialID.Paper)
modifiers++;
// 2 part tools gain 2 modifiers for the head
2014-09-09 18:30:15 +10:00
if (tool.getPartAmount() == 2 && toolTag.getInteger("Head") == TinkerTools.MaterialID.Paper)
modifiers++;
toolTag.setInteger("Modifiers", modifiers);
}
2014-09-09 18:30:15 +10:00
private void handleThaumium (NBTTagCompound toolTag, ToolCore tool)
{
// count thaumic parts
int thaum = 0;
if (toolTag.getInteger("Head") == TinkerTools.MaterialID.Thaumium)
thaum++;
if (toolTag.getInteger("Handle") == TinkerTools.MaterialID.Thaumium)
thaum++;
if (toolTag.getInteger("Accessory") == TinkerTools.MaterialID.Thaumium)
thaum++;
if (toolTag.getInteger("Extra") == TinkerTools.MaterialID.Thaumium)
thaum++;
// each part gives 0.5 modifiers, rounded up
2014-09-09 18:30:15 +10:00
int bonusModifiers = (int) Math.ceil((double) thaum / 2d);
// 2-part tools get 1 modifier per part
2014-09-09 18:30:15 +10:00
if (tool.getPartAmount() == 2)
bonusModifiers = thaum;
int modifiers = toolTag.getInteger("Modifiers");
modifiers += bonusModifiers;
toolTag.setInteger("Modifiers", modifiers);
}
2013-11-04 00:33:39 +01:00
private boolean allowCrafting (int head, int handle, int accessory)
{
int[] nonMetals = { 0, 1, 3, 4, 5, 6, 7, 8, 9, 17 };
for (int i = 0; i < nonMetals.length; i++)
{
if (head == nonMetals[i] || handle == nonMetals[i] || accessory == nonMetals[i])
return false;
}
return true;
}
2013-12-31 20:24:06 -05:00
@SubscribeEvent
2013-11-04 00:33:39 +01:00
public void craftPart (PartBuilderEvent.NormalPart event)
{
2014-06-04 21:44:48 -08:00
if (event.pattern.getItem() == TinkerTools.woodPattern && event.pattern.getItemDamage() == 23)
{
ItemStack result = craftBowString(event.material);
if (result != null)
{
event.overrideResult(new ItemStack[] { result, null });
}
}
2014-06-04 21:44:48 -08:00
if (event.pattern.getItem() == TinkerTools.woodPattern && event.pattern.getItemDamage() == 24)
{
ItemStack result = craftFletching(event.material);
if (result != null)
{
event.overrideResult(new ItemStack[] { result, null });
}
}
}
2013-11-04 00:33:39 +01:00
public static ItemStack craftBowString (ItemStack stack)
{
if (stack.stackSize < 3)
return null;
BowstringMaterial mat = (BowstringMaterial) TConstructRegistry.getCustomMaterial(stack, BowstringMaterial.class);
if (mat != null)
return mat.craftingItem.copy();
return null;
}
2013-11-04 00:33:39 +01:00
public static ItemStack craftFletching (ItemStack stack)
{
FletchingMaterial mat = (FletchingMaterial) TConstructRegistry.getCustomMaterial(stack, FletchingMaterial.class);
// maybe it's a leaf fletchling
2014-09-09 18:30:15 +10:00
if (mat == null)
mat = (FletchingMaterial) TConstructRegistry.getCustomMaterial(stack, FletchlingLeafMaterial.class);
if (mat != null)
return mat.craftingItem.copy();
return null;
}
2014-04-02 20:38:48 -04:00
@SubscribeEvent
public void onAttack (LivingAttackEvent event)
{
//System.out.println("Damage: "+event.ammount);
if (event.entityLiving instanceof EntityPlayer)
{
EntityPlayer player = (EntityPlayer) event.entityLiving;
//Cutlass
ItemStack stack = player.getCurrentEquippedItem();
2014-06-04 21:44:48 -08:00
if (stack != null && stack.getItem() == TinkerTools.battlesign && player.isUsingItem())
2013-08-16 13:51:33 -07:00
{
2014-04-02 20:38:48 -04:00
DamageSource source = event.source;
if (!source.isUnblockable() && !source.isMagicDamage() && !source.isExplosion())
{
if (source instanceof EntityDamageSourceIndirect)
{
2014-06-06 19:46:05 -08:00
if (TConstruct.random.nextInt(3) == 0)
2014-04-02 20:38:48 -04:00
{
Entity attacker = source.getEntity();
Entity projectile = ((EntityDamageSourceIndirect) source).getSourceOfDamage();
projectile.motionX *= -1;
projectile.motionZ *= -1;
projectile.setDead();
event.setCanceled(true);
if (projectile.getClass() == EntityArrow.class && !player.worldObj.isRemote)
{
EntityArrow reflection = null;
if (attacker instanceof EntityLivingBase)
reflection = new EntityArrow(player.worldObj, (EntityLivingBase) attacker, 0);
else
reflection = new EntityArrow(player.worldObj, player, 0);
Vec3 look = player.getLookVec();
reflection.posX = projectile.posX;
reflection.posY = projectile.posY;
reflection.posZ = projectile.posZ;
reflection.motionX = (projectile.motionX + (look.xCoord * 8)) / 6;
reflection.motionY = (projectile.motionY + (look.yCoord * 8)) / 6;
reflection.motionZ = (projectile.motionZ + (look.zCoord * 8)) / 6;
reflection.damage = ((EntityArrow) projectile).damage;
player.worldObj.spawnEntityInWorld(reflection);
}
}
}
else
{
Entity attacker = source.getEntity();
2014-09-09 18:30:15 +10:00
if (attacker != null)
2014-05-27 22:57:30 -04:00
{
attacker.attackEntityFrom(DamageSource.causeThornsDamage(player), event.ammount);
}
2014-04-02 20:38:48 -04:00
}
}
2013-08-16 13:51:33 -07:00
}
}
}
2014-09-09 18:30:15 +10:00
2013-12-31 20:24:06 -05:00
@SubscribeEvent
2013-11-04 00:33:39 +01:00
public void onLivingDrop (LivingDropsEvent event)
{
2013-11-19 20:57:52 -08:00
if (event.entityLiving == null)
return;
2013-12-11 23:47:07 -05:00
if (event.recentlyHit)
{
if (event.entityLiving.getClass() == EntitySkeleton.class)
{
EntitySkeleton enemy = (EntitySkeleton) event.entityLiving;
if (event.source.damageType.equals("player"))
{
EntityPlayer player = (EntityPlayer) event.source.getEntity();
ItemStack stack = player.getCurrentEquippedItem();
if (stack != null && stack.hasTagCompound() && stack.getItem() instanceof ToolCore)
{
int beheading = stack.getTagCompound().getCompoundTag("InfiTool").getInteger("Beheading");
2014-06-04 21:44:48 -08:00
if (stack.getItem() == TinkerTools.cleaver)
beheading += 2;
2014-06-06 19:46:05 -08:00
if (beheading > 0 && TConstruct.random.nextInt(100) < beheading * 10)
{
2014-06-06 19:46:05 -08:00
ItemHelper.addDrops(event, new ItemStack(Items.skull, 1, enemy.getSkeletonType()));
}
}
}
2014-06-06 19:46:05 -08:00
if (enemy.getSkeletonType() == 1 && TConstruct.random.nextInt(Math.max(1, 5 - event.lootingLevel)) == 0)
{
2014-06-06 19:46:05 -08:00
ItemHelper.addDrops(event, new ItemStack(TinkerTools.materials, 1, 8));
}
}
if (event.entityLiving.getClass() == EntityZombie.class)
{
EntityZombie enemy = (EntityZombie) event.entityLiving;
if (event.source.damageType.equals("player"))
{
EntityPlayer player = (EntityPlayer) event.source.getEntity();
ItemStack stack = player.getCurrentEquippedItem();
if (stack != null && stack.hasTagCompound() && stack.getItem() instanceof ToolCore)
{
int beheading = stack.getTagCompound().getCompoundTag("InfiTool").getInteger("Beheading");
2014-06-04 21:44:48 -08:00
if (stack != null && stack.hasTagCompound() && stack.getItem() == TinkerTools.cleaver)
beheading += 2;
2014-06-06 19:46:05 -08:00
if (beheading > 0 && TConstruct.random.nextInt(100) < beheading * 10)
{
2014-06-06 19:46:05 -08:00
ItemHelper.addDrops(event, new ItemStack(Items.skull, 1, 2));
}
}
2014-06-06 19:46:05 -08:00
if (stack != null && stack.hasTagCompound() && stack.getItem() == TinkerTools.cleaver && TConstruct.random.nextInt(100) < 10)
{
2014-06-06 19:46:05 -08:00
ItemHelper.addDrops(event, new ItemStack(Items.skull, 1, 2));
}
}
}
if (event.entityLiving.getClass() == EntityCreeper.class)
{
EntityCreeper enemy = (EntityCreeper) event.entityLiving;
if (event.source.damageType.equals("player"))
{
EntityPlayer player = (EntityPlayer) event.source.getEntity();
ItemStack stack = player.getCurrentEquippedItem();
if (stack != null && stack.hasTagCompound() && stack.getItem() instanceof ToolCore)
{
int beheading = stack.getTagCompound().getCompoundTag("InfiTool").getInteger("Beheading");
2014-06-04 21:44:48 -08:00
if (stack.getItem() == TinkerTools.cleaver)
beheading += 2;
2014-06-06 19:46:05 -08:00
if (beheading > 0 && TConstruct.random.nextInt(100) < beheading * 5)
{
2014-06-06 19:46:05 -08:00
ItemHelper.addDrops(event, new ItemStack(Items.skull, 1, 4));
}
}
}
}
}
if (event.entityLiving instanceof EntityPlayer)
{
EntityPlayer player = (EntityPlayer) event.entityLiving;
if (PHConstruct.dropPlayerHeads)
{
2013-12-31 20:24:06 -05:00
ItemStack dropStack = new ItemStack(Items.skull, 1, 3);
NBTTagCompound nametag = new NBTTagCompound();
2014-01-07 15:07:07 -05:00
nametag.setString("SkullOwner", player.getDisplayName());
2014-02-04 21:21:50 -05:00
dropStack.setTagCompound(nametag);
2014-06-06 19:46:05 -08:00
ItemHelper.addDrops(event, dropStack);
}
else if (event.source.damageType.equals("player"))
{
EntityPlayer source = (EntityPlayer) event.source.getEntity();
ItemStack stack = source.getCurrentEquippedItem();
if (stack != null && stack.hasTagCompound() && stack.getItem() instanceof ToolCore)
{
int beheading = stack.getTagCompound().getCompoundTag("InfiTool").getInteger("Beheading");
2014-06-04 21:44:48 -08:00
if (stack.getItem() == TinkerTools.cleaver)
beheading += 2;
2014-06-06 19:46:05 -08:00
if (beheading > 0 && TConstruct.random.nextInt(100) < beheading * 50)
{
2013-12-31 20:24:06 -05:00
ItemStack dropStack = new ItemStack(Items.skull, 1, 3);
NBTTagCompound nametag = new NBTTagCompound();
2014-01-07 15:07:07 -05:00
nametag.setString("SkullOwner", player.getDisplayName());
2014-02-04 21:21:50 -05:00
dropStack.setTagCompound(nametag);
2014-06-06 19:46:05 -08:00
ItemHelper.addDrops(event, dropStack);
}
}
}
}
}
2014-09-09 18:30:15 +10:00
2013-12-31 20:24:06 -05:00
@SubscribeEvent
2013-11-04 00:33:39 +01:00
public void registerOre (OreRegisterEvent evt)
{
2013-12-11 23:47:07 -05:00
if (evt.Name.equals("crystalQuartz"))
{
2014-06-04 21:44:48 -08:00
TinkerTools.modAttack.addStackToMatchList(evt.Ore, 2);
}
else if (evt.Name.equals("crystalCertusQuartz"))
{
2014-06-04 21:44:48 -08:00
TinkerTools.modAttack.addStackToMatchList(evt.Ore, 24);
}
}
2014-10-07 22:43:06 +02:00
2014-10-07 22:43:06 +02:00
@SubscribeEvent
public void damageToolsOnDeath (PlayerDropsEvent event)
{
if(!PHConstruct.deathPenality)
return;
EnumDifficulty difficulty = event.entityPlayer.worldObj.difficultySetting;
// easy and peaceful don't punish
if(difficulty == EnumDifficulty.PEACEFUL || difficulty == EnumDifficulty.EASY)
return;
int punishment = 20; // normal has 5%
if(difficulty == EnumDifficulty.HARD)
punishment = 10; // hard has 10%
// check if we have to reduce it
// did the player live long enough to receive derp-protection?
// (yes, you receive protection every time you log in. we're that nice.)
int derp = 1;
if(event.entityPlayer.ticksExisted < 60*5*20 ) {
derp = TPlayerStats.get(event.entityPlayer).derpLevel;
if(derp <= 0) derp = 1;
punishment *= derp;
}
boolean damaged = false;
2014-10-07 22:43:06 +02:00
for(EntityItem drop : event.drops)
{
// we're only interested in tools
if(!(drop.getEntityItem().getItem() instanceof ToolCore) || !drop.getEntityItem().hasTagCompound())
continue;
// damage tools by 10% of their total durability!
NBTTagCompound tags = drop.getEntityItem().getTagCompound().getCompoundTag("InfiTool");
int dur = tags.getInteger("TotalDurability");
dur /= punishment;
2014-10-07 22:43:06 +02:00
AbilityHelper.damageTool(drop.getEntityItem(), dur, event.entityPlayer, true);
damaged = true;
2014-10-07 22:43:06 +02:00
}
if(damaged) {
derp++;
}
// increase derplevel by 1. Minimal derp level is 1.
TPlayerStats.get(event.entityPlayer).derpLevel = derp+1;
2014-10-07 22:43:06 +02:00
}
}