summaryrefslogtreecommitdiff
path: root/src/main/java/com/sosnitzka/taiga/traits
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/sosnitzka/taiga/traits')
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitAnalysing.java6
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitArcane.java30
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitBlind.java4
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitBright.java25
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitCascade.java2
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitCatcher.java113
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitCongenial.java78
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitCursed.java58
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitCurvature.java66
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitDark.java5
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitDecay.java115
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitDiffuse.java26
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitDissolving.java12
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitFragile.java13
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitGarishly.java17
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitGlimmer.java4
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitHaunted.java37
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitHeroic.java2
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitHollow.java4
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitInstable.java8
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitMelting.java21
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitNatureBound.java33
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitOrganizing.java29
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitPorted.java67
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitProgressiveStats.java115
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitPulverizing.java7
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitRandomize.java177
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitResonance.java6
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitReviving.java31
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitSofty.java37
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitSoulEater.java70
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitTantrum.java105
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitTemplate.java17
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitTraditional.java39
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitUncertain.java66
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitVortex.java17
-rw-r--r--src/main/java/com/sosnitzka/taiga/traits/TraitWhirl.java98
37 files changed, 1068 insertions, 492 deletions
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitAnalysing.java b/src/main/java/com/sosnitzka/taiga/traits/TraitAnalysing.java
index a9e6d77..283c431 100644
--- a/src/main/java/com/sosnitzka/taiga/traits/TraitAnalysing.java
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitAnalysing.java
@@ -43,7 +43,7 @@ public class TraitAnalysing extends AbstractTrait {
@SubscribeEvent
public void onMobDrops(LivingDropsEvent event) {
World w = event.getEntity().getEntityWorld();
- if (event.getSource().getEntity() instanceof EntityPlayer) {
+ if (random.nextFloat() < .1f && event.getSource().getEntity() instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) event.getSource().getEntity();
if (!w.isRemote && event.getEntity() instanceof EntityMob && TinkerUtil.hasTrait(TagUtil.getTagSafe(player.getHeldItemMainhand()), identifier)) {
event.getDrops().clear();
@@ -52,13 +52,13 @@ public class TraitAnalysing extends AbstractTrait {
}
private int getUpdateXP(int xp) {
- float exp = random.nextFloat() * random.nextFloat() * random.nextFloat() * (xp + 18) * 50;
+ float exp = random.nextFloat() * random.nextFloat() * random.nextFloat() * (xp + random.nextInt(xp) * (1 + random.nextFloat()));
return Math.round(exp);
}
@Override
public void blockHarvestDrops(ItemStack tool, BlockEvent.HarvestDropsEvent event) {
- if (random.nextFloat() < 0.85) {
+ if (random.nextFloat() < 0.1) {
event.getDrops().clear();
}
}
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitArcane.java b/src/main/java/com/sosnitzka/taiga/traits/TraitArcane.java
index c61cc28..3009b67 100644
--- a/src/main/java/com/sosnitzka/taiga/traits/TraitArcane.java
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitArcane.java
@@ -1,12 +1,19 @@
package com.sosnitzka.taiga.traits;
import net.minecraft.block.state.IBlockState;
+import net.minecraft.entity.EntityCreature;
import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.entity.living.LivingDeathEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import slimeknights.tconstruct.library.traits.AbstractTrait;
+import slimeknights.tconstruct.library.utils.TagUtil;
+import slimeknights.tconstruct.library.utils.TinkerUtil;
import slimeknights.tconstruct.library.utils.ToolHelper;
import static com.sosnitzka.taiga.util.Utils.isNight;
@@ -15,21 +22,36 @@ public class TraitArcane extends AbstractTrait {
public TraitArcane() {
super("arcane", TextFormatting.DARK_PURPLE);
+ MinecraftForge.EVENT_BUS.register(this);
}
@Override
public void afterBlockBreak(ItemStack tool, World world, IBlockState state, BlockPos pos, EntityLivingBase player, boolean wasEffective) {
int time = (int) world.getWorldTime();
- if (random.nextFloat() <= 0.1 && isNight(time)) {
- ToolHelper.healTool(tool, random.nextInt(15) + 1, null);
+ if (random.nextFloat() <= 0.05 && isNight(time)) {
+ ToolHelper.healTool(tool, random.nextInt(8) + 1, null);
}
}
@Override
public void afterHit(ItemStack tool, EntityLivingBase player, EntityLivingBase target, float damage, boolean wasCritical, boolean wasHit) {
int time = (int) player.getEntityWorld().getWorldTime();
- if (random.nextFloat() <= 0.1 && isNight(time)) {
- ToolHelper.healTool(tool, random.nextInt(15) + 1, null);
+ if (random.nextFloat() <= 0.05 && isNight(time)) {
+ ToolHelper.healTool(tool, random.nextInt(8) + 1, null);
+ }
+ }
+
+
+ @SubscribeEvent
+ public void onEntityKill(LivingDeathEvent e) {
+ World w = e.getEntity().getEntityWorld();
+ if (!w.isRemote && e.getSource().getEntity() != null) {
+ if (e.getSource().getEntity() instanceof EntityPlayer && e.getEntity() instanceof EntityCreature) {
+ ItemStack tool = ((EntityPlayer) e.getSource().getEntity()).getHeldItemMainhand();
+ if (isNight((int) w.getWorldTime()) && random.nextFloat() < 0.1 && TinkerUtil.hasTrait(TagUtil.getTagSafe(tool), identifier)) {
+ ToolHelper.healTool(tool, random.nextInt(16), null);
+ }
+ }
}
}
}
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitBlind.java b/src/main/java/com/sosnitzka/taiga/traits/TraitBlind.java
index f061387..62a41bc 100644
--- a/src/main/java/com/sosnitzka/taiga/traits/TraitBlind.java
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitBlind.java
@@ -21,7 +21,7 @@ public class TraitBlind extends AbstractTrait {
@Override
public void afterBlockBreak(ItemStack tool, World world, IBlockState state, BlockPos pos, EntityLivingBase player, boolean wasEffective) {
int time = (int) world.getWorldTime();
- if (random.nextFloat() <= 0.05 || (random.nextFloat() <= 0.1 && isNight(time))) {
+ if (random.nextFloat() <= 0.01 || (random.nextFloat() <= 0.03 && isNight(time))) {
if (random.nextBoolean())
player.addPotionEffect(new PotionEffect(MobEffects.BLINDNESS, random.nextInt(200) + 100));
else
@@ -32,7 +32,7 @@ public class TraitBlind extends AbstractTrait {
@Override
public void afterHit(ItemStack tool, EntityLivingBase player, EntityLivingBase target, float damage, boolean wasCritical, boolean wasHit) {
int time = (int) player.getEntityWorld().getWorldTime();
- if (random.nextFloat() <= 0.05 || (random.nextFloat() <= 0.1 && isNight(time))) {
+ if (random.nextFloat() <= 0.01 || (random.nextFloat() <= 0.03 && isNight(time))) {
if (random.nextBoolean())
player.addPotionEffect(new PotionEffect(MobEffects.BLINDNESS, random.nextInt(400) + 200));
else
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitBright.java b/src/main/java/com/sosnitzka/taiga/traits/TraitBright.java
index 1182c90..2db80a5 100644
--- a/src/main/java/com/sosnitzka/taiga/traits/TraitBright.java
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitBright.java
@@ -1,22 +1,22 @@
package com.sosnitzka.taiga.traits;
-import net.minecraft.entity.Entity;
+import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.EntityLivingBase;
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.init.MobEffects;
import net.minecraft.item.ItemStack;
import net.minecraft.potion.PotionEffect;
+import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
import slimeknights.tconstruct.library.traits.AbstractTrait;
-import slimeknights.tconstruct.library.utils.TagUtil;
-import slimeknights.tconstruct.library.utils.TinkerUtil;
import static com.sosnitzka.taiga.util.Utils.isNight;
+import static net.minecraft.init.MobEffects.GLOWING;
public class TraitBright extends AbstractTrait {
+ private static final float chance = 0.90f;
+
public TraitBright() {
super("bright", TextFormatting.DARK_GRAY);
}
@@ -25,19 +25,16 @@ public class TraitBright extends AbstractTrait {
public float damage(ItemStack tool, EntityLivingBase player, EntityLivingBase target, float damage, float newDamage, boolean isCritical) {
int time = (int) target.getEntityWorld().getWorldTime();
if (!isNight(time)) {
- newDamage += damage / 2f;
- }
+ newDamage = damage * (1 + random.nextFloat() / 2f);
+ } else newDamage = damage / (1 + random.nextFloat() / 3f);
return super.damage(tool, player, target, damage, newDamage, isCritical);
-
}
+
@Override
- public void onUpdate(ItemStack item, World world, Entity entity, int i, boolean b) {
- if (entity instanceof EntityPlayer) {
- EntityPlayer e = (EntityPlayer) entity;
- if (TinkerUtil.hasTrait(TagUtil.getTagSafe(e.getHeldItemMainhand()), identifier)) {
- e.addPotionEffect(new PotionEffect(MobEffects.GLOWING, 100));
- }
+ public void afterBlockBreak(ItemStack tool, World world, IBlockState state, BlockPos pos, EntityLivingBase player, boolean wasEffective) {
+ if (random.nextFloat() >= chance) {
+ player.addPotionEffect(new PotionEffect(GLOWING, 200));
}
}
}
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitCascade.java b/src/main/java/com/sosnitzka/taiga/traits/TraitCascade.java
index 72f2e0b..02403d7 100644
--- a/src/main/java/com/sosnitzka/taiga/traits/TraitCascade.java
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitCascade.java
@@ -36,7 +36,7 @@ public class TraitCascade extends AbstractTrait {
sx = x = nextBlock.getX();
sy = y = nextBlock.getY();
sz = z = nextBlock.getZ();
- ToolHelper.damageTool(tool, random.nextInt(2), player);
+ ToolHelper.damageTool(tool, 1, player);
} else {
x = sx;
y = sy;
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitCatcher.java b/src/main/java/com/sosnitzka/taiga/traits/TraitCatcher.java
new file mode 100644
index 0000000..ae64b52
--- /dev/null
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitCatcher.java
@@ -0,0 +1,113 @@
+package com.sosnitzka.taiga.traits;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLiving;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.init.SoundEvents;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.text.TextFormatting;
+import net.minecraft.world.World;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.entity.player.ItemTooltipEvent;
+import net.minecraftforge.event.entity.player.PlayerInteractEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import slimeknights.tconstruct.library.traits.AbstractTrait;
+import slimeknights.tconstruct.library.utils.TagUtil;
+import slimeknights.tconstruct.library.utils.TinkerUtil;
+import slimeknights.tconstruct.library.utils.ToolHelper;
+
+
+public class TraitCatcher extends AbstractTrait {
+
+ public static int chance = 1;
+ public static float costMulti = 0.25f;
+
+ public TraitCatcher() {
+ super(TraitCatcher.class.getSimpleName().toLowerCase().substring(5), TextFormatting.RED);
+ MinecraftForge.EVENT_BUS.register(this);
+ }
+
+ @Override
+ public void onHit(ItemStack tool, EntityLivingBase player, EntityLivingBase target, float damage, boolean isCritical) {
+ World w = player.worldObj;
+ if (!w.isRemote && random.nextInt((int) target.getMaxHealth()) <= chance && target instanceof EntityLiving) {
+ NBTTagCompound tag = TagUtil.getExtraTag(tool);
+ Data data = Data.read(tag);
+ if (data.mobClass.isEmpty()) {
+ data.mobClass = target.getClass().getName();
+ data.mobName = target.getName();
+ data.write(tag);
+ TagUtil.setEnchantEffect(tool, true);
+ TagUtil.setExtraTag(tool, tag);
+ player.playSound(SoundEvents.ENTITY_ENDERMEN_TELEPORT, 1.0F, 1.0F);
+ target.setDropItemsWhenDead(false);
+ target.setDead();
+ }
+ }
+ }
+
+ @SubscribeEvent
+ public void onRightClickItem(PlayerInteractEvent.RightClickItem event) {
+ World w = event.getWorld();
+ BlockPos pos = event.getEntityPlayer().getPosition();
+ ItemStack tool = event.getEntityPlayer().getHeldItemMainhand();
+ if (!w.isRemote && TinkerUtil.hasTrait(TagUtil.getTagSafe(tool), identifier)) {
+ NBTTagCompound tag = TagUtil.getExtraTag(tool);
+ Data data = Data.read(tag);
+ if (!data.mobClass.isEmpty()) {
+ Entity ent = null;
+ try {
+ ent = (Entity) Class.forName(data.mobClass).getConstructor(World.class).newInstance(w);
+ } catch (Exception e) {
+ System.out.println(e.toString());
+ }
+
+ if (ent != null) {
+ ent.setPosition(pos.getX(), pos.getY(), pos.getZ()); // TODO: set to player view target
+ w.spawnEntityInWorld(ent);
+ event.getEntityPlayer().playSound(SoundEvents.ENTITY_ENDERMEN_TELEPORT, 1.0F, 1.0F);
+ data.mobClass = "";
+ data.mobName = "";
+ data.write(tag);
+ TagUtil.setExtraTag(tool, tag);
+ TagUtil.setEnchantEffect(tool, false);
+ ToolHelper.damageTool(tool, random.nextInt((int) (ToolHelper.getCurrentDurability(tool) * costMulti)), event.getEntityPlayer());
+ }
+ }
+ }
+ }
+
+
+ @SubscribeEvent
+ public void onItemTooltip(ItemTooltipEvent e) {
+ ItemStack tool = e.getItemStack();
+ if (TinkerUtil.hasTrait(TagUtil.getTagSafe(tool), identifier)) {
+ NBTTagCompound tag = TagUtil.getExtraTag(tool);
+ Data data = Data.read(tag);
+ if (!data.mobClass.isEmpty())
+ e.getToolTip().add(TextFormatting.DARK_PURPLE + "Captured: " + TextFormatting.LIGHT_PURPLE + data.mobName);
+ }
+ }
+
+ public static class Data {
+ String mobClass;
+ String mobName;
+
+ public static Data read(NBTTagCompound tag) {
+ Data data = new Data();
+ data.mobName = tag.getString("mobName");
+ data.mobClass = tag.getString("mobClass");
+ return data;
+ }
+
+ public void write(NBTTagCompound tag) {
+ tag.setString("mobClass", mobClass);
+ tag.setString("mobName", mobName);
+ }
+ }
+}
+
+
+
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitCongenial.java b/src/main/java/com/sosnitzka/taiga/traits/TraitCongenial.java
new file mode 100644
index 0000000..fed3c36
--- /dev/null
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitCongenial.java
@@ -0,0 +1,78 @@
+package com.sosnitzka.taiga.traits;
+
+import com.sosnitzka.taiga.util.Utils;
+import net.minecraft.entity.EntityCreature;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.text.TextFormatting;
+import net.minecraft.world.World;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.entity.living.LivingDeathEvent;
+import net.minecraftforge.event.entity.player.ItemTooltipEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import slimeknights.tconstruct.library.traits.AbstractTrait;
+import slimeknights.tconstruct.library.utils.TagUtil;
+import slimeknights.tconstruct.library.utils.TinkerUtil;
+
+
+public class TraitCongenial extends AbstractTrait {
+
+
+ public TraitCongenial() {
+ super(TraitCongenial.class.getSimpleName().toLowerCase().substring(5), TextFormatting.RED);
+ MinecraftForge.EVENT_BUS.register(this);
+ }
+
+ @SubscribeEvent
+ public void onEntityKill(LivingDeathEvent e) {
+ if (e.getSource().getEntity() instanceof EntityPlayer && !e.getSource().getEntity().worldObj.isRemote && e.getEntity() instanceof EntityCreature) {
+ if (TinkerUtil.hasTrait(TagUtil.getTagSafe(((EntityPlayer) e.getSource().getEntity()).getHeldItemMainhand()), identifier)) {
+ ItemStack tool = ((EntityPlayer) e.getSource().getEntity()).getHeldItemMainhand();
+ String name = e.getEntity().getName();
+ NBTTagCompound tag = TagUtil.getExtraTag(tool);
+ Utils.GeneralNBTData data = Utils.GeneralNBTData.read(tag);
+ if (!data.name.isEmpty()) {
+ return;
+ }
+ data.name = name;
+ data.write(tag);
+ assert tool != null;
+ TagUtil.setExtraTag(tool, tag);
+ }
+ }
+ }
+
+ @Override
+ public float damage(ItemStack tool, EntityLivingBase player, EntityLivingBase target, float damage, float newDamage, boolean isCritical) {
+ World w = player.getEntityWorld();
+ if (!w.isRemote) {
+ NBTTagCompound tag = TagUtil.getExtraTag(tool);
+ Utils.GeneralNBTData data = Utils.GeneralNBTData.read(tag);
+ if (data.name.isEmpty()) {
+ return damage;
+ }
+ if (!data.name.equals(target.getName())) {
+ return damage / (random.nextInt(5) + 5);
+ }
+ float x = (1 + random.nextFloat() * 9);
+ return damage * x;
+ }
+ return damage;
+ }
+
+ @SubscribeEvent
+ public void onItemTooltip(ItemTooltipEvent e) {
+ ItemStack tool = e.getItemStack();
+ if (TinkerUtil.hasTrait(TagUtil.getTagSafe(tool), identifier)) {
+ NBTTagCompound tag = TagUtil.getExtraTag(tool);
+ Utils.GeneralNBTData data = Utils.GeneralNBTData.read(tag);
+ if (data.name.isEmpty()) e.getToolTip().add(TextFormatting.LIGHT_PURPLE + "Unbound");
+ else {
+ e.getToolTip().add(TextFormatting.DARK_PURPLE + "Bound to: " + TextFormatting.LIGHT_PURPLE + data.name);
+ }
+ }
+ }
+
+}
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitCursed.java b/src/main/java/com/sosnitzka/taiga/traits/TraitCursed.java
new file mode 100644
index 0000000..297eb9f
--- /dev/null
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitCursed.java
@@ -0,0 +1,58 @@
+package com.sosnitzka.taiga.traits;
+
+import com.sosnitzka.taiga.util.Utils;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.DamageSource;
+import net.minecraft.util.text.TextFormatting;
+import net.minecraft.world.World;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.entity.player.ItemTooltipEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import slimeknights.tconstruct.library.traits.AbstractTrait;
+import slimeknights.tconstruct.library.utils.TagUtil;
+import slimeknights.tconstruct.library.utils.TinkerUtil;
+
+
+public class TraitCursed extends AbstractTrait {
+
+ private static int chance = 60 * 1000;
+
+ public TraitCursed() {
+ super(TraitCursed.class.getSimpleName().toLowerCase().substring(5), TextFormatting.RED);
+ MinecraftForge.EVENT_BUS.register(this);
+ }
+
+ @Override
+ public void onUpdate(ItemStack tool, World world, Entity entity, int itemSlot, boolean isSelected) {
+
+ NBTTagCompound tag = TagUtil.getExtraTag(tool);
+ Utils.GeneralNBTData data = Utils.GeneralNBTData.read(tag);
+ if (random.nextInt((chance + data.curse) / (data.curse + 1)) == 1) {
+ if (isSelected) data.curse += 10;
+ else data.curse++;
+ entity.attackEntityFrom(new DamageSource("Curse"), random.nextFloat() * ((EntityPlayer) entity).getHealth() / 2);
+ }
+
+ data.write(tag);
+ TagUtil.setExtraTag(tool, tag);
+
+
+ }
+
+ @SubscribeEvent
+ public void onItemTooltip(ItemTooltipEvent e) {
+ ItemStack tool = e.getItemStack();
+ if (TinkerUtil.hasTrait(TagUtil.getTagSafe(tool), identifier)) {
+ NBTTagCompound tag = TagUtil.getExtraTag(tool);
+ Utils.GeneralNBTData data = Utils.GeneralNBTData.read(tag);
+ if (data.curse != 0) {
+ e.getToolTip().add(TextFormatting.DARK_PURPLE + "Curse: " + TextFormatting.WHITE + data.curse);
+ }
+ }
+ }
+
+
+}
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitCurvature.java b/src/main/java/com/sosnitzka/taiga/traits/TraitCurvature.java
index 521eb0a..eebd275 100644
--- a/src/main/java/com/sosnitzka/taiga/traits/TraitCurvature.java
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitCurvature.java
@@ -1,5 +1,7 @@
package com.sosnitzka.taiga.traits;
+import com.google.common.collect.Lists;
+import com.sosnitzka.taiga.util.Utils;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityItem;
@@ -10,76 +12,74 @@ import net.minecraft.init.Items;
import net.minecraft.init.SoundEvents;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.text.TextComponentString;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.entity.living.LivingDropsEvent;
+import net.minecraftforge.event.world.BlockEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import slimeknights.tconstruct.library.traits.AbstractTrait;
import slimeknights.tconstruct.library.utils.TagUtil;
import slimeknights.tconstruct.library.utils.TinkerUtil;
+import java.util.List;
+
public class TraitCurvature extends AbstractTrait {
+ public static int chance = 5;
+ public static int distance = 10;
+
public TraitCurvature() {
- super("curvature", TextFormatting.BLACK);
+ super("curvature", TextFormatting.DARK_PURPLE);
MinecraftForge.EVENT_BUS.register(this);
}
@Override
- public void afterBlockBreak(ItemStack tool, World world, IBlockState state, BlockPos pos, EntityLivingBase player, boolean wasEffective) {
- if (player.worldObj.isRemote) {
- return;
- }
- if (random.nextFloat() <= 0.01 && world.provider.getDimension() != -1) {
- teleport(player, world);
- player.playSound(SoundEvents.ENTITY_ENDERMEN_TELEPORT, 1.0F, 1.0F);
+ public void blockHarvestDrops(ItemStack tool, BlockEvent.HarvestDropsEvent event) {
+ if (!event.getWorld().isRemote && random.nextFloat() < 0.05) {
+ List<IBlockState> blockstates = Lists.newArrayList(Blocks.STONE.getDefaultState(), Blocks.NETHERRACK.getDefaultState(), Blocks.END_STONE.getDefaultState(), Blocks.AIR.getDefaultState(), Blocks.DIRT.getDefaultState());
+ IBlockState mainstate = event.getState();
+ if (blockstates.contains(mainstate)) return;
+ for (int i = 0; i < chance; i++) {
+ int x = event.getPos().getX() + Utils.nextInt(random, -distance, distance);
+ int y = event.getPos().getY() + Utils.nextInt(random, -distance, distance);
+ int z = event.getPos().getZ() + Utils.nextInt(random, -distance, distance);
+ BlockPos cPos = new BlockPos(x, y, z);
+ IBlockState state = event.getWorld().getBlockState(cPos);
+ if (blockstates.contains(state)) {
+ event.getDrops().clear();
+ event.getWorld().setBlockState(cPos, mainstate);
+ event.getHarvester().playSound(SoundEvents.ENTITY_ENDERMEN_TELEPORT, 1.0F, 1.0F);
+ event.getHarvester().addChatComponentMessage(new TextComponentString("Teleported to: " + x + " " + y + " " + z));
+ return;
+ }
+
+ }
+
}
}
-
@Override
public void afterHit(ItemStack tool, EntityLivingBase player, EntityLivingBase target, float damage, boolean wasCritical, boolean wasHit) {
- if (random.nextFloat() <= 0.3) {
+ if (random.nextFloat() <= 0.15) {
target.playSound(SoundEvents.ENTITY_ENDERMEN_TELEPORT, 1.0F, 1.0F);
changePos(player, target);
}
}
-
@SubscribeEvent
public void onMobDrops(LivingDropsEvent event) {
World w = event.getEntity().getEntityWorld();
if (!w.isRemote && event.getSource().getEntity() instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) event.getSource().getEntity();
if (event.getEntity() instanceof EntityMob && TinkerUtil.hasTrait(TagUtil.getTagSafe(player.getHeldItemMainhand()), identifier)) {
- ItemStack i = new ItemStack(Items.ENDER_PEARL, random.nextInt(3));
+ ItemStack i = new ItemStack(Items.ENDER_PEARL, random.nextInt(2));
event.getDrops().add(0, new EntityItem(w, event.getEntity().posX, event.getEntity().posY, event.getEntity().posZ, i));
}
}
}
- private void teleport(EntityLivingBase e, World w) {
- int x = e.getPosition().getX() + random.nextInt(250) - 125;
- int y = e.getPosition().getY();
- int z = e.getPosition().getZ() + random.nextInt(250) - 125;
-
- // TODO: Make this a proper search for top block (if there is one)
- while (w.getBlockState(new BlockPos(x, y, z)).getBlock() != Blocks.AIR) {
- y++;
- }
- while (w.getBlockState(new BlockPos(x, y - 1, z)).getBlock() == Blocks.AIR) {
- if (y <= 0) {
- y = 1;
- break;
- }
-
- y--;
- }
-
- e.setPosition(x, y, z);
- }
-
private void changePos(EntityLivingBase player, EntityLivingBase target) {
BlockPos pp = new BlockPos(player.getPosition());
BlockPos tp = new BlockPos(target.getPosition());
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitDark.java b/src/main/java/com/sosnitzka/taiga/traits/TraitDark.java
index f665d49..87d0741 100644
--- a/src/main/java/com/sosnitzka/taiga/traits/TraitDark.java
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitDark.java
@@ -18,9 +18,8 @@ public class TraitDark extends AbstractTrait {
public float damage(ItemStack tool, EntityLivingBase player, EntityLivingBase target, float damage, float newDamage, boolean isCritical) {
int time = (int) target.getEntityWorld().getWorldTime();
if (isNight(time)) {
- newDamage += damage / 2f;
- }
+ newDamage = damage * (1 + random.nextFloat() / 2f);
+ } else newDamage = damage / (1 + random.nextFloat() / 3f);
return super.damage(tool, player, target, damage, newDamage, isCritical);
-
}
}
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitDecay.java b/src/main/java/com/sosnitzka/taiga/traits/TraitDecay.java
new file mode 100644
index 0000000..3109dca
--- /dev/null
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitDecay.java
@@ -0,0 +1,115 @@
+package com.sosnitzka.taiga.traits;
+
+import com.google.common.collect.ImmutableList;
+import net.minecraft.entity.Entity;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.text.TextFormatting;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.FakePlayer;
+import slimeknights.tconstruct.library.materials.HeadMaterialStats;
+import slimeknights.tconstruct.library.tools.ToolNBT;
+import slimeknights.tconstruct.library.utils.TagUtil;
+
+import java.util.List;
+
+/**
+ * Gives the tool bonus stats on crafting.
+ * The bonus stats are distributed over time and are more or less random.
+ * The stats that will be rewarded are already designated on the first time the tool is crafted
+ */
+public class TraitDecay extends TraitProgressiveStats {
+
+ protected static int TICK_PER_STAT = 24;
+ protected static int DURABILITY_STEP = 10;
+ protected static float SPEED_STEP = 0.05f;
+ protected static float ATTACK_STEP = 0.05f;
+
+ public TraitDecay() {
+ super("decay", TextFormatting.GREEN);
+ }
+
+ @Override
+ public void applyEffect(NBTTagCompound rootCompound, NBTTagCompound modifierTag) {
+ // check if we have stats already distributed, and if not add them
+ if (!hasPool(rootCompound)) {
+ // ok, we need new stats. Let the fun begin!
+ StatNBT data = new StatNBT();
+
+ int statPoints = 800; // we distribute a whopping X points worth of stats!
+ for (; statPoints > 0; statPoints--) {
+ switch (random.nextInt(3)) {
+ // durability
+ case 0:
+ data.durability += DURABILITY_STEP;
+ break;
+ // speed
+ case 1:
+ data.speed += SPEED_STEP;
+ break;
+ // attack
+ case 2:
+ data.attack += ATTACK_STEP;
+ break;
+ }
+ }
+
+ setPool(rootCompound, data);
+ }
+
+ super.applyEffect(rootCompound, modifierTag);
+ }
+
+ @Override
+ public void onUpdate(ItemStack tool, World world, Entity entity, int itemSlot, boolean isSelected) {
+ if (entity instanceof FakePlayer || entity.worldObj.isRemote) {
+ return;
+ }
+ // every 3.6 seconds we distribute one stat. This means 1h = 1000 applications
+ if (entity.ticksExisted % TICK_PER_STAT > 0) {
+ return;
+ }
+
+ // we don't update if the player is currently breaking a block because that'd reset it
+ if (playerIsBreakingBlock(entity)) {
+ return;
+ }
+
+ NBTTagCompound root = TagUtil.getTagSafe(tool);
+ StatNBT distributed = getBonus(root);
+ ToolNBT data = TagUtil.getToolStats(tool);
+
+ // attack
+ if (entity.ticksExisted % (TICK_PER_STAT * 3) == 0) {
+ float A = ATTACK_STEP * random.nextFloat();
+ data.attack -= A;
+ distributed.attack -= A;
+ }
+ // speed
+ else if (entity.ticksExisted % (TICK_PER_STAT * 2) == 0) {
+ float S = SPEED_STEP * random.nextFloat();
+ data.speed -= S;
+ distributed.speed -= S;
+ }
+ // durability
+ else {
+ int D = random.nextInt(DURABILITY_STEP) + 1;
+ data.durability -= D;
+ distributed.durability -= D;
+ }
+
+ // update tool stats
+ TagUtil.setToolTag(root, data.get());
+ // update statistics on distributed stats
+ setBonus(root, distributed);
+ }
+
+ @Override
+ public List<String> getExtraInfo(ItemStack tool, NBTTagCompound modifierTag) {
+ StatNBT pool = getBonus(TagUtil.getTagSafe(tool));
+
+ return ImmutableList.of(HeadMaterialStats.formatDurability(pool.durability),
+ HeadMaterialStats.formatMiningSpeed(pool.speed),
+ HeadMaterialStats.formatAttack(pool.attack));
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitDiffuse.java b/src/main/java/com/sosnitzka/taiga/traits/TraitDiffuse.java
index bf5fd42..25fddc6 100644
--- a/src/main/java/com/sosnitzka/taiga/traits/TraitDiffuse.java
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitDiffuse.java
@@ -1,13 +1,12 @@
package com.sosnitzka.taiga.traits;
-import net.minecraft.entity.monster.EntityMob;
+import net.minecraft.entity.EntityCreature;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.entity.living.LivingDropsEvent;
-import net.minecraftforge.event.entity.living.LivingExperienceDropEvent;
import net.minecraftforge.event.world.BlockEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import slimeknights.tconstruct.library.traits.AbstractTrait;
@@ -22,19 +21,10 @@ public class TraitDiffuse extends AbstractTrait {
}
@SubscribeEvent
- public void onXpDrop(LivingExperienceDropEvent event) {
- EntityPlayer player = event.getAttackingPlayer();
- if (!event.getEntity().getEntityWorld().isRemote && player != null && TinkerUtil.hasTrait(TagUtil.getTagSafe(player.getHeldItemMainhand()), this.identifier)) {
- event.setDroppedExperience(0);
- }
-
- }
-
- @SubscribeEvent
public void onBlockBreak(BlockEvent.BreakEvent event) {
EntityPlayer player = event.getPlayer();
if (!player.getEntityWorld().isRemote && TinkerUtil.hasTrait(TagUtil.getTagSafe(player.getHeldItemMainhand()), this.identifier)) {
- event.setExpToDrop(this.getUpdateXP(event.getExpToDrop()));
+ event.setExpToDrop((int) this.getUpdateXP(event.getExpToDrop()));
}
}
@@ -43,22 +33,22 @@ public class TraitDiffuse extends AbstractTrait {
World w = event.getEntity().getEntityWorld();
if (!w.isRemote && event.getSource().getEntity() instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) event.getSource().getEntity();
- if (event.getEntity() instanceof EntityMob && TinkerUtil.hasTrait(TagUtil.getTagSafe(player.getHeldItemMainhand()), identifier)) {
+ if (event.getEntity() instanceof EntityCreature && TinkerUtil.hasTrait(TagUtil.getTagSafe(player.getHeldItemMainhand()), identifier)) {
event.getDrops().clear();
}
}
}
- private int getUpdateXP(int xp) {
- float exp = random.nextFloat() * random.nextFloat() * random.nextFloat() * (xp + random.nextInt(10));
- if (random.nextBoolean())
- return Math.round(exp);
+ private float getUpdateXP(int xp) {
+ float exp = random.nextFloat() * random.nextFloat() * random.nextFloat() * (xp + random.nextFloat() * xp);
+ if (random.nextFloat() <= 0.25)
+ return exp;
else return 0;
}
@Override
public void blockHarvestDrops(ItemStack tool, BlockEvent.HarvestDropsEvent event) {
- if (random.nextFloat() < 0.75) {
+ if (random.nextFloat() < 0.35) {
event.getDrops().clear();
}
}
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitDissolving.java b/src/main/java/com/sosnitzka/taiga/traits/TraitDissolving.java
index e6c9c8e..18ddd61 100644
--- a/src/main/java/com/sosnitzka/taiga/traits/TraitDissolving.java
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitDissolving.java
@@ -18,16 +18,18 @@ public class TraitDissolving extends AbstractTrait {
}
// high chance to remove XP, low chance to double,triple or quatruple dropped Experience
+
@SubscribeEvent
public void onXpDrop(LivingExperienceDropEvent event) {
if (!event.getEntity().getEntityWorld().isRemote) {
EntityPlayer player = event.getAttackingPlayer();
float r = random.nextFloat();
- if (r <= 0.75 && player != null && TinkerUtil.hasTrait(TagUtil.getTagSafe(player.getHeldItemMainhand()), this.identifier)) {
- event.setDroppedExperience(0);
- }
- if (r > 0.95 && player != null && TinkerUtil.hasTrait(TagUtil.getTagSafe(player.getHeldItemMainhand()), this.identifier)) {
- event.setDroppedExperience(event.getDroppedExperience() * (random.nextInt(3) + 2));
+ if (player != null && TinkerUtil.hasTrait(TagUtil.getTagSafe(player.getHeldItemMainhand()), this.identifier)) {
+ if (r <= 0.80) {
+ event.setDroppedExperience(0);
+ } else {
+ event.setDroppedExperience(event.getDroppedExperience() * (random.nextInt(3) + 2));
+ }
}
}
}
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitFragile.java b/src/main/java/com/sosnitzka/taiga/traits/TraitFragile.java
index cb536f9..440e776 100644
--- a/src/main/java/com/sosnitzka/taiga/traits/TraitFragile.java
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitFragile.java
@@ -24,6 +24,7 @@ public class TraitFragile extends AbstractTrait {
float b = 0.99F * calcBonus(tool);
if (!world.isRemote && tool.canHarvestBlock(state) && f <= b) {
if (random.nextBoolean()) ToolHelper.damageTool(tool, random.nextInt(3), player);
+ else ToolHelper.healTool(tool, random.nextInt(3), player);
}
} else {
float f = random.nextFloat();
@@ -41,20 +42,18 @@ public class TraitFragile extends AbstractTrait {
if (r == 2) z += d;
BlockPos nextBlock = new BlockPos(x, y, z);
if (world.getBlockState(nextBlock) == world.getBlockState(pos)) {
- Block block = Blocks.STONE;
- int ib = random.nextInt(3);
+ Block block = null;
+ int ib = random.nextInt(2);
switch (ib) {
case 0:
block = Blocks.COBBLESTONE;
break;
case 1:
- block = Blocks.MOSSY_COBBLESTONE;
- break;
- case 2:
- block = Blocks.GRAVEL;
- break;
+ if (random.nextFloat() <= 0.9) block = Blocks.GRAVEL;
+ else block = Blocks.MOSSY_COBBLESTONE;
}
f = random.nextFloat();
+ assert block != null;
if (f < 0.85) {
world.setBlockState(nextBlock, block.getDefaultState());
} else if (f > 95) {
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitGarishly.java b/src/main/java/com/sosnitzka/taiga/traits/TraitGarishly.java
index dd327ce..26ea54f 100644
--- a/src/main/java/com/sosnitzka/taiga/traits/TraitGarishly.java
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitGarishly.java
@@ -18,8 +18,6 @@ import slimeknights.tconstruct.library.utils.TagUtil;
import slimeknights.tconstruct.library.utils.TinkerUtil;
import slimeknights.tconstruct.library.utils.ToolHelper;
-import static com.sosnitzka.taiga.Items.*;
-
public class TraitGarishly extends AbstractTrait {
public TraitGarishly() {
@@ -34,7 +32,7 @@ public class TraitGarishly extends AbstractTrait {
EntityPlayer player = (EntityPlayer) event.getSource().getEntity();
if (event.getEntity() instanceof EntityMob && TinkerUtil.hasTrait(TagUtil.getTagSafe(player.getHeldItemMainhand()), identifier)) {
- int r = random.nextInt(6);
+ int r = random.nextInt(2);
ItemStack i = null;
switch (r) {
case 0:
@@ -44,17 +42,8 @@ public class TraitGarishly extends AbstractTrait {
i = new ItemStack(Items.BLAZE_ROD, random.nextInt(3));
break;
case 2:
- i = new ItemStack(glimmerstone_dust, random.nextInt(3));
- break;
- case 3:
- i = new ItemStack(luminar_dust, random.nextInt(3));
- break;
- case 4:
i = new ItemStack(Items.COAL, random.nextInt(3));
break;
- case 5:
- i = new ItemStack(lignite, random.nextInt(3));
- break;
}
assert i != null;
event.getDrops().add(0, new EntityItem(w, event.getEntity().posX, event.getEntity().posY, event.getEntity().posZ, i));
@@ -65,8 +54,8 @@ public class TraitGarishly extends AbstractTrait {
@Override
public void blockHarvestDrops(ItemStack tool, BlockEvent.HarvestDropsEvent event) {
float r = random.nextFloat();
- if (r > 0.5f) event.getDrops().clear();
- else if (r < 0.1 && event.getWorld().getBlockState(event.getPos()).getMaterial() == Material.ROCK) {
+ if (random.nextBoolean()) event.getDrops().clear();
+ else if (r < 0.25 && event.getWorld().getBlockState(event.getPos()).getMaterial() == Material.ROCK) {
@SuppressWarnings("ConstantConditions") ItemStack stack = new ItemStack(Item.getItemFromBlock(event.getWorld().getBlockState(event.getPos()).getBlock()), random.nextInt(3));
event.getDrops().add(0, stack);
ToolHelper.damageTool(tool, random.nextInt(6) + 1, event.getHarvester());
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitGlimmer.java b/src/main/java/com/sosnitzka/taiga/traits/TraitGlimmer.java
index 2c10852..90f1e3b 100644
--- a/src/main/java/com/sosnitzka/taiga/traits/TraitGlimmer.java
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitGlimmer.java
@@ -34,14 +34,14 @@ public class TraitGlimmer extends AbstractTrait {
@Override
public void afterBlockBreak(ItemStack tool, World world, IBlockState state, BlockPos pos, EntityLivingBase player, boolean wasEffective) {
- if (random.nextFloat() <= 0.08) {
+ if (random.nextFloat() <= 0.05) {
player.addPotionEffect(new PotionEffect(MobEffects.NIGHT_VISION, random.nextInt(600) + 300));
}
}
@Override
public void afterHit(ItemStack tool, EntityLivingBase player, EntityLivingBase target, float damage, boolean wasCritical, boolean wasHit) {
- if (random.nextFloat() <= 0.08) {
+ if (random.nextFloat() <= 0.05) {
player.addPotionEffect(new PotionEffect(MobEffects.NIGHT_VISION, random.nextInt(600) + 300));
}
}
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitHaunted.java b/src/main/java/com/sosnitzka/taiga/traits/TraitHaunted.java
deleted file mode 100644
index c43b054..0000000
--- a/src/main/java/com/sosnitzka/taiga/traits/TraitHaunted.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.sosnitzka.taiga.traits;
-
-import com.sosnitzka.taiga.util.EntityAIPermanentPanic;
-import net.minecraft.entity.EntityCreature;
-import net.minecraft.entity.EntityLiving;
-import net.minecraft.entity.EntityLivingBase;
-import net.minecraft.entity.monster.*;
-import net.minecraft.entity.passive.*;
-import net.minecraft.item.ItemStack;
-import net.minecraft.util.text.TextFormatting;
-import net.minecraftforge.common.MinecraftForge;
-import slimeknights.tconstruct.library.traits.AbstractTrait;
-
-import static com.sosnitzka.taiga.util.Utils.isNight;
-
-public class TraitHaunted extends AbstractTrait {
-
- public TraitHaunted() {
- super("haunted", TextFormatting.DARK_GRAY);
- MinecraftForge.EVENT_BUS.register(this);
- }
-
- // Just several tested Vanilla-Mobs, e.g. no ghasts, bats or skeletons
- @Override
- public void onHit(ItemStack tool, EntityLivingBase player, EntityLivingBase target, float damage, boolean isCritical) {
- int time = (int) player.getEntityWorld().getWorldTime();
- if (random.nextFloat() <= 0.1 || (random.nextFloat() <= 0.3 && isNight(time)))
- if (target instanceof EntityCow || target instanceof EntityZombie || target instanceof EntityWolf || target instanceof EntityPig || target instanceof EntitySpider ||
- target instanceof EntityVillager || target instanceof EntitySheep || target instanceof EntityEnderman || target instanceof EntityEndermite ||
- target instanceof EntityBlaze || target instanceof EntityWitch || target instanceof EntityHorse) {
- ((EntityLiving) target).tasks.taskEntries.clear();
- ((EntityLiving) target).targetTasks.taskEntries.clear();
- ((EntityLiving) target).tasks.addTask(0, new EntityAIPermanentPanic((EntityCreature) target, target.getAIMoveSpeed() + 3.5D));
-
- }
- }
-}
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitHeroic.java b/src/main/java/com/sosnitzka/taiga/traits/TraitHeroic.java
index 7654255..f72f7e9 100644
--- a/src/main/java/com/sosnitzka/taiga/traits/TraitHeroic.java
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitHeroic.java
@@ -19,6 +19,6 @@ public class TraitHeroic extends AbstractTrait {
float calc = newDamage + (newDamage / 2) / (durability * durabilitymax / (durabilitymax - durability - 1));
if ((float) durability < (float) (0.10 * durabilitymax) || player.getHealth() < player.getMaxHealth() / 8 || (target.getHealth() == target.getMaxHealth() && random.nextFloat() > 0.8)) {
return super.damage(tool, player, target, damage, calc, isCritical);
- } else return super.damage(tool, player, target, damage, newDamage, isCritical);
+ } else return super.damage(tool, player, target, damage, newDamage * 0.9f, isCritical);
}
}
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitHollow.java b/src/main/java/com/sosnitzka/taiga/traits/TraitHollow.java
index 9da8d22..1b43176 100644
--- a/src/main/java/com/sosnitzka/taiga/traits/TraitHollow.java
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitHollow.java
@@ -28,10 +28,10 @@ public class TraitHollow extends AbstractTrait {
@Override
public void onHit(ItemStack tool, EntityLivingBase player, EntityLivingBase target, float damage, boolean isCritical) {
int time = (int) player.getEntityWorld().getWorldTime();
- if (random.nextFloat() <= 0.2 || (random.nextFloat() <= 0.2 && isNight(time))) {
+ if (random.nextFloat() <= 0.01 || (random.nextFloat() <= 0.03 && isNight(time))) {
((EntityLiving) target).setNoAI(true);
target.playSound(SoundEvents.ENTITY_ENDERMEN_TELEPORT, 1.0F, 1.0F);
- if (target.getMaxHealth() < 200) {
+ if (target.getMaxHealth() < 250) {
target.setHealth(target.getMaxHealth() * (1.8f - random.nextFloat() * 0.4f));
}
}
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitInstable.java b/src/main/java/com/sosnitzka/taiga/traits/TraitInstable.java
index ad25bcd..f95f891 100644
--- a/src/main/java/com/sosnitzka/taiga/traits/TraitInstable.java
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitInstable.java
@@ -36,7 +36,7 @@ public class TraitInstable extends AbstractTrait {
explode(world, player, pos.getX(), pos.getY(), pos.getZ());
} else explode(world, null, pos.getX(), pos.getY(), pos.getZ());
}
- ToolHelper.damageTool(tool, 11 + random.nextInt(10), player);
+ ToolHelper.damageTool(tool, random.nextInt(10) + 2, player);
}
}
@@ -49,17 +49,17 @@ public class TraitInstable extends AbstractTrait {
explode(player.getEntityWorld(), player, pos.getX(), pos.getY(), pos.getZ());
} else explode(player.getEntityWorld(), target, pos.getX(), pos.getY(), pos.getZ());
}
- ToolHelper.damageTool(tool, 3 + random.nextInt(18), player);
+ ToolHelper.damageTool(tool, 2 + random.nextInt(10), player);
}
}
@SubscribeEvent
public void onMobDrops(LivingDropsEvent event) {
World w = event.getEntity().getEntityWorld();
- if (!w.isRemote && event.getSource().getEntity() instanceof EntityPlayer) {
+ if (random.nextFloat() < 0.05 && !w.isRemote && event.getSource().getEntity() instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) event.getSource().getEntity();
if (event.getEntity() instanceof EntityMob && TinkerUtil.hasTrait(TagUtil.getTagSafe(player.getHeldItemMainhand()), identifier)) {
- ItemStack i = new ItemStack(Items.GUNPOWDER, random.nextInt(4));
+ ItemStack i = new ItemStack(Items.GUNPOWDER, random.nextInt(2));
event.getDrops().add(0, new EntityItem(w, event.getEntity().posX, event.getEntity().posY, event.getEntity().posZ, i));
}
}
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitMelting.java b/src/main/java/com/sosnitzka/taiga/traits/TraitMelting.java
index 13d1081..354d77f 100644
--- a/src/main/java/com/sosnitzka/taiga/traits/TraitMelting.java
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitMelting.java
@@ -2,24 +2,31 @@ package com.sosnitzka.taiga.traits;
import net.minecraft.block.Block;
import net.minecraft.init.Blocks;
-import net.minecraft.item.ItemStack;
import net.minecraft.util.text.TextFormatting;
+import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.world.BlockEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import slimeknights.tconstruct.library.traits.AbstractTrait;
+import slimeknights.tconstruct.library.utils.TagUtil;
+import slimeknights.tconstruct.library.utils.TinkerUtil;
public class TraitMelting extends AbstractTrait {
public TraitMelting() {
super("melting", TextFormatting.YELLOW);
+ MinecraftForge.EVENT_BUS.register(this);
}
- @Override
- public void blockHarvestDrops(ItemStack tool, BlockEvent.HarvestDropsEvent event) {
- float r = random.nextFloat();
- Block b = event.getWorld().getBlockState(event.getPos()).getBlock();
- if (r <= 0.01 && (b == Blocks.STONE || b == Blocks.COBBLESTONE || b == Blocks.NETHERRACK)) {
- event.getWorld().setBlockState(event.getPos(), Blocks.LAVA.getDefaultState());
+
+ @SubscribeEvent
+ public void blockbreak(BlockEvent.BreakEvent e) {
+ Block b = e.getWorld().getBlockState(e.getPos()).getBlock();
+ if (TinkerUtil.hasTrait(TagUtil.getTagSafe(e.getPlayer().getHeldItemMainhand()), identifier)) {
+ if (!e.getWorld().isRemote && random.nextFloat() <= 0.025 && (b == Blocks.STONE || b == Blocks.COBBLESTONE || b == Blocks.NETHERRACK || b == Blocks.OBSIDIAN)) {
+ e.setCanceled(true);
+ e.getWorld().setBlockState(e.getPos(), Blocks.LAVA.getDefaultState());
+ }
}
}
}
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitNatureBound.java b/src/main/java/com/sosnitzka/taiga/traits/TraitNatureBound.java
index b18d361..53f4d86 100644
--- a/src/main/java/com/sosnitzka/taiga/traits/TraitNatureBound.java
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitNatureBound.java
@@ -1,19 +1,13 @@
package com.sosnitzka.taiga.traits;
-import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
-import net.minecraft.init.Blocks;
-import net.minecraft.init.SoundEvents;
import net.minecraft.item.ItemStack;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
-import net.minecraftforge.event.world.BlockEvent;
-import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import slimeknights.tconstruct.library.traits.AbstractTrait;
-import slimeknights.tconstruct.library.utils.TagUtil;
-import slimeknights.tconstruct.library.utils.TinkerUtil;
import slimeknights.tconstruct.library.utils.ToolHelper;
@@ -26,26 +20,19 @@ public class TraitNatureBound extends AbstractTrait {
@Override
public int onToolHeal(ItemStack tool, int amount, int newAmount, EntityLivingBase entity) {
- // 5% less durability repaired!
- return newAmount - amount * 5 / 100;
+ // 10% less durability repaired!
+ return newAmount - amount * 10 / 100;
}
@Override
public void onUpdate(ItemStack tool, World world, Entity entity, int itemSlot, boolean isSelected) {
- // *20 because 20 ticks in a second
- int chance = 20;
- if (!world.isRemote && entity instanceof EntityLivingBase && random.nextInt(30 * chance) == 0) {
- ToolHelper.healTool(tool, random.nextInt(9) + 1, (EntityLivingBase) entity);
- }
-
- }
-
- @SubscribeEvent
- public void onBlockBreak(BlockEvent.BreakEvent e) {
- Block b = e.getWorld().getBlockState(e.getPos()).getBlock();
- if (!e.getWorld().isRemote && TinkerUtil.hasTrait(TagUtil.getTagSafe(e.getPlayer().getHeldItemMainhand()), identifier) && random.nextFloat() <= .07 && (b == Blocks.DIRT || b == Blocks.GRASS || b == Blocks.LOG || b == Blocks.LOG2 || b == Blocks.STONE)) {
- e.setCanceled(true);
- e.getPlayer().playSound(SoundEvents.ENTITY_ENDERMEN_TELEPORT, 1.0F, 1.0F);
+ // * 20 because 20 ticks in a second
+ int chance = 20 * 20;
+ Material m = world.getBlockState(entity.getPosition().down()).getMaterial();
+ if (!world.isRemote && entity instanceof EntityLivingBase && random.nextInt(chance) == 0) {
+ if (m.equals(Material.GRASS) || m.equals(Material.LEAVES)) {
+ ToolHelper.healTool(tool, random.nextInt(2) + 1, (EntityLivingBase) entity);
+ } else ToolHelper.damageTool(tool, 1, (EntityLivingBase) entity);
}
}
}
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitOrganizing.java b/src/main/java/com/sosnitzka/taiga/traits/TraitOrganizing.java
deleted file mode 100644
index f3a279b..0000000
--- a/src/main/java/com/sosnitzka/taiga/traits/TraitOrganizing.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.sosnitzka.taiga.traits;
-
-import net.minecraft.block.material.Material;
-import net.minecraft.block.state.IBlockState;
-import net.minecraft.entity.EntityLivingBase;
-import net.minecraft.init.Blocks;
-import net.minecraft.item.ItemStack;
-import net.minecraft.util.math.BlockPos;
-import net.minecraft.util.text.TextFormatting;
-import net.minecraft.world.World;
-import slimeknights.tconstruct.library.traits.AbstractTrait;
-import slimeknights.tconstruct.library.utils.ToolHelper;
-
-public class TraitOrganizing extends AbstractTrait {
-
- private static final float chance = 0.02f;
-
- public TraitOrganizing() {
- super("organizing", TextFormatting.GREEN);
- }
-
- @Override
- public void afterBlockBreak(ItemStack tool, World world, IBlockState state, BlockPos pos, EntityLivingBase player, boolean wasEffective) {
- if (!world.isRemote && (state.getMaterial() == Material.ROCK) && random.nextFloat() < chance) {
- world.setBlockState(pos, Blocks.LOG.getDefaultState());
- ToolHelper.healTool(tool, random.nextInt(5), player);
- }
- }
-} \ No newline at end of file
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitPorted.java b/src/main/java/com/sosnitzka/taiga/traits/TraitPorted.java
new file mode 100644
index 0000000..6760383
--- /dev/null
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitPorted.java
@@ -0,0 +1,67 @@
+package com.sosnitzka.taiga.traits;
+
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.SoundEvents;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.text.TextFormatting;
+import net.minecraft.world.World;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.entity.player.PlayerInteractEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import slimeknights.tconstruct.library.traits.AbstractTrait;
+import slimeknights.tconstruct.library.utils.TagUtil;
+import slimeknights.tconstruct.library.utils.TinkerUtil;
+import slimeknights.tconstruct.library.utils.ToolHelper;
+
+
+public class TraitPorted extends AbstractTrait {
+ public static int distance = 10;
+
+ public TraitPorted() {
+ super("ported", TextFormatting.DARK_PURPLE);
+ MinecraftForge.EVENT_BUS.register(this);
+ }
+
+ @SubscribeEvent
+ public void onItemRightClick(PlayerInteractEvent.RightClickItem e) {
+ ItemStack tool = e.getEntityPlayer().getHeldItemMainhand();
+ if (TinkerUtil.hasTrait(TagUtil.getTagSafe(tool), identifier))
+ teleport(e.getEntityPlayer(), e.getWorld());
+ }
+
+ @Override
+ public void afterBlockBreak(ItemStack tool, World world, IBlockState state, BlockPos pos, EntityLivingBase player, boolean wasEffective) {
+ if (random.nextFloat() <= 0.005) {
+ player.playSound(SoundEvents.ENTITY_ENDERMEN_TELEPORT, 1.0F, 1.0F);
+ teleport(player, world);
+ }
+ }
+
+
+ @Override
+ public void afterHit(ItemStack tool, EntityLivingBase player, EntityLivingBase target, float damage, boolean wasCritical, boolean wasHit) {
+ if (random.nextFloat() <= 0.005) {
+ target.playSound(SoundEvents.ENTITY_ENDERMEN_TELEPORT, 1.0F, 1.0F);
+ teleport(player, player.getEntityWorld());
+ }
+ }
+
+ private void teleport(EntityLivingBase e, World w) {
+ BlockPos tPos = new BlockPos(e.getPosition().up(distance));
+ if (e.getPosition().getY() >= 128) {
+ return;
+ }
+
+ while (!w.getBlockState(tPos).equals(Blocks.AIR.getDefaultState()) && tPos.getY() <= 128) {
+ tPos = tPos.up();
+ }
+ if (!w.getBlockState(tPos).equals(Blocks.AIR.getDefaultState())) {
+ return;
+ }
+ e.setPosition(tPos.getX(), tPos.getY(), tPos.getZ());
+ ToolHelper.damageTool(e.getHeldItemMainhand(), ToolHelper.getCurrentDurability(e.getHeldItemMainhand()) / 2 + 1, e);
+ }
+}
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitProgressiveStats.java b/src/main/java/com/sosnitzka/taiga/traits/TraitProgressiveStats.java
new file mode 100644
index 0000000..d9af33d
--- /dev/null
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitProgressiveStats.java
@@ -0,0 +1,115 @@
+package com.sosnitzka.taiga.traits;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.text.TextFormatting;
+import slimeknights.tconstruct.library.modifiers.ModifierNBT;
+import slimeknights.tconstruct.library.tools.ToolNBT;
+import slimeknights.tconstruct.library.traits.AbstractTrait;
+import slimeknights.tconstruct.library.utils.TagUtil;
+
+/**
+ * Base class for tools that progressively gain/award stats.
+ * The modifier persists 2 different stat-data on the tool:
+ * - A 'pool' of stats to award
+ * - A 'bonus' of already awarded stats
+ * <p>
+ * The modifier reapplies the 'bonus' stats on application.
+ * The pool is not touched inheritly but only provided for the logic of the deriving trait.
+ */
+public abstract class TraitProgressiveStats extends AbstractTrait {
+
+ protected final String pool_key; // Key to the tag that contains the free unassigned
+ protected final String applied_key; // Key to the tag that contains the already applied bonus stats
+
+ public TraitProgressiveStats(String identifier, TextFormatting color) {
+ super(identifier, color);
+
+ pool_key = identifier + "StatPool";
+ applied_key = identifier + "StatBonus";
+ }
+
+ public TraitProgressiveStats(String identifier, int color) {
+ super(identifier, color);
+
+ pool_key = identifier + "StatPool";
+ applied_key = identifier + "StatBonus";
+ }
+
+ /* Modifier management */
+
+ protected static StatNBT getStats(NBTTagCompound root, String key) {
+ return ModifierNBT.readTag(TagUtil.getTagSafe(TagUtil.getExtraTag(root), key), StatNBT.class);
+ }
+
+ protected static void setStats(NBTTagCompound root, StatNBT data, String key) {
+ NBTTagCompound extra = TagUtil.getExtraTag(root);
+ NBTTagCompound tag = new NBTTagCompound();
+ data.write(tag);
+ extra.setTag(key, tag);
+ TagUtil.setExtraTag(root, extra);
+ }
+
+ @Override
+ public void applyEffect(NBTTagCompound rootCompound, NBTTagCompound modifierTag) {
+ super.applyEffect(rootCompound, modifierTag);
+ // called on tool loading only
+ // we just apply the saved bonus stats
+ ToolNBT data = TagUtil.getToolStats(rootCompound);
+ StatNBT bonus = getBonus(rootCompound);
+
+ data.durability += bonus.durability;
+ data.speed += bonus.speed;
+ data.attack += bonus.attack;
+
+ TagUtil.setToolTag(rootCompound, data.get());
+ }
+
+ protected boolean hasPool(NBTTagCompound root) {
+ return TagUtil.getExtraTag(root).hasKey(pool_key);
+ }
+
+ protected StatNBT getPool(NBTTagCompound root) {
+ return getStats(root, pool_key);
+ }
+
+ protected void setPool(NBTTagCompound root, StatNBT data) {
+ setStats(root, data, pool_key);
+ }
+
+ protected StatNBT getBonus(NBTTagCompound root) {
+ return getStats(root, applied_key);
+ }
+
+ protected void setBonus(NBTTagCompound root, StatNBT data) {
+ setStats(root, data, applied_key);
+ }
+
+ protected boolean playerIsBreakingBlock(Entity entity) {
+ return false;
+ }
+
+ public static class StatNBT extends ModifierNBT {
+
+ // statpool
+ public int durability;
+ public float attack;
+ public float speed;
+
+ @Override
+ public void read(NBTTagCompound tag) {
+ super.read(tag);
+ durability = tag.getInteger("durability");
+ attack = tag.getFloat("attack");
+ speed = tag.getFloat("speed");
+ }
+
+ @Override
+ public void write(NBTTagCompound tag) {
+ super.write(tag);
+ tag.setInteger("durability", durability);
+ tag.setFloat("attack", attack);
+ tag.setFloat("speed", speed);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitPulverizing.java b/src/main/java/com/sosnitzka/taiga/traits/TraitPulverizing.java
index ea81437..466c715 100644
--- a/src/main/java/com/sosnitzka/taiga/traits/TraitPulverizing.java
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitPulverizing.java
@@ -16,16 +16,15 @@ public class TraitPulverizing extends AbstractTrait {
@Override
public void miningSpeed(ItemStack tool, PlayerEvent.BreakSpeed event) {
if (ToolHelper.isToolEffective2(tool, event.getState())) {
- event.setNewSpeed((float) (event.getNewSpeed() + calcBonus(tool)));
+ event.setNewSpeed((float) (event.getNewSpeed() * calcBonus(tool)));
}
}
private double calcBonus(ItemStack tool) {
int durability = ToolHelper.getCurrentDurability(tool);
int maxDurability = ToolHelper.getMaxDurability(tool);
- float speed = ToolHelper.getMiningSpeedStat(tool);
- tool.setItemDamage(tool.getItemDamage() + 1);
- return speed * (maxDurability - maxDurability / 10) / (durability);
+ return (1 + .9f * (maxDurability - durability) / maxDurability);
+ // Min 1.0; Max 1.9
}
@Override
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitRandomize.java b/src/main/java/com/sosnitzka/taiga/traits/TraitRandomize.java
deleted file mode 100644
index 423e6ef..0000000
--- a/src/main/java/com/sosnitzka/taiga/traits/TraitRandomize.java
+++ /dev/null
@@ -1,177 +0,0 @@
-package com.sosnitzka.taiga.traits;
-
-import net.minecraft.entity.Entity;
-import net.minecraft.entity.EntityLiving;
-import net.minecraft.entity.EntityLivingBase;
-import net.minecraft.entity.item.EntityTNTPrimed;
-import net.minecraft.entity.monster.*;
-import net.minecraft.entity.passive.*;
-import net.minecraft.init.Blocks;
-import net.minecraft.init.SoundEvents;
-import net.minecraft.item.Item;
-import net.minecraft.item.ItemStack;
-import net.minecraft.util.text.TextFormatting;
-import net.minecraft.world.World;
-import net.minecraftforge.event.entity.player.PlayerEvent;
-import net.minecraftforge.event.world.BlockEvent;
-import slimeknights.tconstruct.library.traits.AbstractTrait;
-import slimeknights.tconstruct.library.utils.ToolHelper;
-import slimeknights.tconstruct.world.entity.EntityBlueSlime;
-
-import static com.sosnitzka.taiga.Blocks.*;
-import static slimeknights.tconstruct.shared.TinkerCommons.oreArdite;
-import static slimeknights.tconstruct.shared.TinkerCommons.oreCobalt;
-
-public class TraitRandomize extends AbstractTrait {
-
- public TraitRandomize() {
- super("randomize", TextFormatting.DARK_RED);
- }
-
- @Override
- public void miningSpeed(ItemStack tool, PlayerEvent.BreakSpeed event) {
- if (ToolHelper.isToolEffective2(tool, event.getState())) {
- event.setNewSpeed(event.getNewSpeed() + random.nextFloat() * 2);
- }
- }
-
- @Override
- public void onHit(ItemStack tool, EntityLivingBase player, EntityLivingBase target, float damage, boolean isCritical) {
- if (random.nextFloat() <= .15 && target instanceof EntityLiving) {
- World w = player.getEntityWorld();
- Entity e = new EntityCow(w);
- target.playSound(SoundEvents.ENTITY_ENDERMEN_TELEPORT, 1.0F, 1.0F);
- if (!w.isRemote) {
- int i = random.nextInt(22);
- switch (i) {
- case 0:
- e = new EntityCow(w);
- break;
- case 1:
- e = new EntityPig(w);
- break;
- case 2:
- e = new EntityHorse(w);
- break;
- case 3:
- e = new EntityChicken(w);
- break;
- case 4:
- e = new EntityVillager(w);
- break;
- case 5:
- e = new EntityEnderman(w);
- break;
- case 6:
- e = new EntityPolarBear(w);
- break;
- case 7:
- e = new EntityIronGolem(w);
- break;
- case 8:
- e = new EntitySilverfish(w);
- break;
- case 9:
- e = new EntityCaveSpider(w);
- break;
- case 10:
- e = new EntityWolf(w);
- break;
- case 11:
- e = new EntityWitch(w);
- break;
- case 12:
- e = new EntityTNTPrimed(w);
- break;
- case 13:
- e = new EntityGhast(w);
- break;
- case 14:
- e = new EntitySpider(w);
- break;
- case 15:
- e = new EntitySkeleton(w);
- break;
- case 16:
- e = new EntityMagmaCube(w);
- break;
- case 17:
- e = new EntitySlime(w);
- break;
- case 18:
- e = new EntityBlueSlime(w);
- break;
- case 19:
- e = new EntityBat(w);
- break;
- case 20:
- e = new EntityPigZombie(w);
- break;
- case 21:
- e = new EntityBlaze(w);
- break;
- }
- e.setPosition(target.getPosition().getX(), target.getPosition().getY() + 0.1f, target.getPosition().getZ());
- e.setCustomNameTag("Missingno");
- if (e instanceof EntityLiving)
- ((EntityLiving) e).setHealth(((EntityLiving) e).getHealth() * (random.nextInt(5) + 1));
- w.spawnEntityInWorld(e);
- target.setDead();
- }
- }
- }
-
- @SuppressWarnings("ConstantConditions")
- @Override
- public void blockHarvestDrops(ItemStack tool, BlockEvent.HarvestDropsEvent event) {
- float r = random.nextFloat();
- if (r > 0.95f) event.getDrops().clear();
- if (event.getDrops() != null) {
- if (r < 0.4f && (event.getDrops().get(0).getItem() == Item.getItemFromBlock(Blocks.IRON_ORE) || event.getDrops().get(0).getItem() == Item.getItemFromBlock(Blocks.GOLD_ORE))) {
- ItemStack change = new ItemStack(Item.getItemFromBlock(Blocks.IRON_ORE));
- int i = random.nextInt(12);
- switch (i) {
- case 0:
- change = new ItemStack(Item.getItemFromBlock(Blocks.GOLD_ORE));
- break;
- case 1:
- change = new ItemStack(Item.getItemFromBlock(Blocks.REDSTONE_ORE));
- break;
- case 2:
- change = new ItemStack(Item.getItemFromBlock(Blocks.LAPIS_ORE));
- break;
- case 3:
- change = new ItemStack(Item.getItemFromBlock(Blocks.DIAMOND_ORE));
- break;
- case 4:
- change = new ItemStack(Item.getItemFromBlock(Blocks.QUARTZ_ORE));
- break;
- case 5:
- change = new ItemStack(oreCobalt.getItem());
- break;
- case 6:
- change = new ItemStack(oreArdite.getItem());
- break;
- case 7:
- change = new ItemStack(titaniteOre);
- break;
- case 8:
- change = new ItemStack(bismuthOre);
- break;
- case 9:
- change = new ItemStack(tiberiumOre);
- break;
- case 10:
- change = new ItemStack(eterniteOre);
- break;
- case 11:
- change = new ItemStack(Item.getItemFromBlock(Blocks.IRON_ORE));
- break;
- }
- event.getDrops().set(0, change);
-
-
- }
- }
- }
-}
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitResonance.java b/src/main/java/com/sosnitzka/taiga/traits/TraitResonance.java
index 52e0712..6e87d26 100644
--- a/src/main/java/com/sosnitzka/taiga/traits/TraitResonance.java
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitResonance.java
@@ -8,14 +8,16 @@ import slimeknights.tconstruct.library.traits.AbstractTrait;
public class TraitResonance extends AbstractTrait {
+ public static float chance = 0.33f;
+
public TraitResonance() {
super("resonance", TextFormatting.AQUA);
}
@Override
public void afterHit(ItemStack tool, EntityLivingBase player, EntityLivingBase target, float damage, boolean wasCritical, boolean wasHit) {
- if (random.nextFloat() <= .33) {
- target.knockBack(target, random.nextFloat() * random.nextFloat() * 12, player.posX - target.posX, player.posZ - target.posZ);
+ if (random.nextFloat() <= chance) {
+ target.knockBack(target, random.nextFloat() * random.nextFloat() * 10, player.posX - target.posX, player.posZ - target.posZ);
}
}
}
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitReviving.java b/src/main/java/com/sosnitzka/taiga/traits/TraitReviving.java
index 55a6578..de47dee 100644
--- a/src/main/java/com/sosnitzka/taiga/traits/TraitReviving.java
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitReviving.java
@@ -1,13 +1,11 @@
package com.sosnitzka.taiga.traits;
-import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityCreature;
import net.minecraft.entity.EntityList;
-import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.monster.EntitySkeleton;
import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.item.ItemStack;
+import net.minecraft.init.SoundEvents;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
@@ -17,13 +15,13 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import slimeknights.tconstruct.library.traits.AbstractTrait;
import slimeknights.tconstruct.library.utils.TagUtil;
import slimeknights.tconstruct.library.utils.TinkerUtil;
-import slimeknights.tconstruct.library.utils.ToolHelper;
-
-import static com.sosnitzka.taiga.util.Utils.isNight;
public class TraitReviving extends AbstractTrait {
+
+ public final float chance = 0.15f;
+
public TraitReviving() {
super("reviving", TextFormatting.DARK_PURPLE);
MinecraftForge.EVENT_BUS.register(this);
@@ -35,36 +33,19 @@ public class TraitReviving extends AbstractTrait {
World w = e.getEntity().getEntityWorld();
if (!w.isRemote && e.getSource().getEntity() != null) {
if (e.getSource().getEntity() instanceof EntityPlayer && e.getEntity() instanceof EntityCreature) {
- if (isNight((int) w.getWorldTime()) && random.nextFloat() > 0.85 && TinkerUtil.hasTrait(TagUtil.getTagSafe(((EntityPlayer) e.getSource().getEntity()).getHeldItemMainhand()), identifier)) {
+ if (random.nextFloat() <= chance && TinkerUtil.hasTrait(TagUtil.getTagSafe(((EntityPlayer) e.getSource().getEntity()).getHeldItemMainhand()), identifier)) {
String name = EntityList.getEntityString(e.getEntity());
-
Entity ent = EntityList.createEntityByName(name, w);
if (ent != null) {
if (ent instanceof EntitySkeleton && e.getEntity() instanceof EntitySkeleton) {
((EntitySkeleton) ent).setSkeletonType(((EntitySkeleton) e.getEntity()).getSkeletonType());
}
-
ent.setPosition(pos.getX(), pos.getY(), pos.getZ());
w.spawnEntityInWorld(ent);
+ e.getSource().getEntity().playSound(SoundEvents.AMBIENT_CAVE, 1.0F, 1.0F);
}
}
}
}
}
-
- @Override
- public void afterBlockBreak(ItemStack tool, World world, IBlockState state, BlockPos pos, EntityLivingBase player, boolean wasEffective) {
- int time = (int) world.getWorldTime();
- if (random.nextFloat() <= 0.1 && isNight(time)) {
- ToolHelper.healTool(tool, random.nextInt(15) + 1, null);
- }
- }
-
- @Override
- public void afterHit(ItemStack tool, EntityLivingBase player, EntityLivingBase target, float damage, boolean wasCritical, boolean wasHit) {
- int time = (int) player.getEntityWorld().getWorldTime();
- if (random.nextFloat() <= 0.1 && isNight(time)) {
- ToolHelper.healTool(tool, random.nextInt(15) + 1, null);
- }
- }
}
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitSofty.java b/src/main/java/com/sosnitzka/taiga/traits/TraitSofty.java
index d4db53a..e78410c 100644
--- a/src/main/java/com/sosnitzka/taiga/traits/TraitSofty.java
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitSofty.java
@@ -1,28 +1,49 @@
package com.sosnitzka.taiga.traits;
-import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
-import net.minecraft.entity.EntityLivingBase;
import net.minecraft.item.ItemStack;
-import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.entity.player.PlayerEvent;
+import net.minecraftforge.event.world.BlockEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import slimeknights.tconstruct.library.traits.AbstractTrait;
+import slimeknights.tconstruct.library.utils.TagUtil;
+import slimeknights.tconstruct.library.utils.TinkerUtil;
import slimeknights.tconstruct.library.utils.ToolHelper;
public class TraitSofty extends AbstractTrait {
- private static final float chance = 0.2f;
+
+ private static final float chance = 0.1f;
+ private static final float speedmulti = 1.3f;
public TraitSofty() {
- super("softy", TextFormatting.AQUA);
+ super("softy", TextFormatting.GRAY);
MinecraftForge.EVENT_BUS.register(this);
}
+ @SubscribeEvent
+ public void blockbreak(BlockEvent.BreakEvent e) {
+ float r = random.nextFloat();
+ float hardness = e.getWorld().getBlockState(e.getPos()).getBlockHardness(e.getWorld(), e.getPos());
+ if (TinkerUtil.hasTrait(TagUtil.getTagSafe(e.getPlayer().getHeldItemMainhand()), identifier)) {
+ if (!e.getWorld().isRemote && r <= chance && hardness >= 1.0f) {
+ e.setCanceled(true);
+ ToolHelper.damageTool(e.getPlayer().getHeldItemMainhand(), random.nextInt(3) + 1, e.getPlayer());
+ }
+ }
+ }
+
@Override
- public void afterBlockBreak(ItemStack tool, World world, IBlockState state, BlockPos pos, EntityLivingBase player, boolean wasEffective) {
- if (!world.isRemote && state.getMaterial().equals(Material.GROUND) && random.nextFloat() < chance) {
- ToolHelper.healTool(tool, random.nextInt(10), player);
+ public void miningSpeed(ItemStack tool, PlayerEvent.BreakSpeed event) {
+ World w = event.getEntity().getEntityWorld();
+ IBlockState state = w.getBlockState(event.getPos());
+ float speed = event.getOriginalSpeed();
+ if (!w.isRemote) {
+ if (state.getBlockHardness(w, event.getPos()) <= 1.0f) {
+ event.setNewSpeed(speed * speedmulti);
+ }
}
}
}
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitSoulEater.java b/src/main/java/com/sosnitzka/taiga/traits/TraitSoulEater.java
new file mode 100644
index 0000000..57653a7
--- /dev/null
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitSoulEater.java
@@ -0,0 +1,70 @@
+package com.sosnitzka.taiga.traits;
+
+import com.sosnitzka.taiga.util.Utils;
+import net.minecraft.entity.EntityLiving;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.text.TextFormatting;
+import net.minecraft.world.World;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.entity.living.LivingDeathEvent;
+import net.minecraftforge.event.entity.player.ItemTooltipEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import slimeknights.tconstruct.library.traits.AbstractTrait;
+import slimeknights.tconstruct.library.utils.TagUtil;
+import slimeknights.tconstruct.library.utils.TinkerUtil;
+
+
+public class TraitSoulEater extends AbstractTrait {
+
+ private static float divisor = 20000f;
+
+ public TraitSoulEater() {
+ super(TraitSoulEater.class.getSimpleName().toLowerCase().substring(5), TextFormatting.RED);
+ MinecraftForge.EVENT_BUS.register(this);
+ }
+
+ @SubscribeEvent
+ public void onTargetKilled(LivingDeathEvent event) {
+ if (event.getSource().getEntity() instanceof EntityPlayer && event.getEntity() instanceof EntityLiving) {
+ World w = event.getSource().getEntity().worldObj;
+ ItemStack tool = ((EntityPlayer) event.getSource().getEntity()).getHeldItemMainhand();
+ if (!w.isRemote && TinkerUtil.hasTrait(TagUtil.getTagSafe(tool), identifier)) {
+ NBTTagCompound tag = TagUtil.getExtraTag(tool);
+ Utils.GeneralNBTData data = Utils.GeneralNBTData.read(tag);
+ float health = ((EntityLiving) event.getEntity()).getMaxHealth();
+ data.killcount += 1;
+ data.health = health;
+ float bonus = Math.round(random.nextFloat() * health * 100) / divisor;
+ data.bonus += bonus;
+ data.bonus = (float) Math.round(data.bonus * 100f) / 100f;
+ data.write(tag);
+ TagUtil.setExtraTag(tool, tag);
+ }
+ }
+ }
+
+ @Override
+ public float damage(ItemStack tool, EntityLivingBase player, EntityLivingBase target, float damage, float newDamage, boolean isCritical) {
+ NBTTagCompound tag = TagUtil.getExtraTag(tool);
+ Utils.GeneralNBTData data = Utils.GeneralNBTData.read(tag);
+ float bonus = data.bonus;
+ return newDamage + bonus;
+ }
+
+ @SubscribeEvent
+ public void onItemTooltip(ItemTooltipEvent e) {
+ ItemStack tool = e.getItemStack();
+ if (TinkerUtil.hasTrait(TagUtil.getTagSafe(tool), identifier)) {
+ NBTTagCompound tag = TagUtil.getExtraTag(tool);
+ Utils.GeneralNBTData data = Utils.GeneralNBTData.read(tag);
+ if (data.killcount != 0) {
+ e.getToolTip().add(TextFormatting.WHITE + "Killed: " + TextFormatting.WHITE + data.killcount);
+ e.getToolTip().add(TextFormatting.WHITE + "Bonus: " + TextFormatting.WHITE + data.bonus);
+ }
+ }
+ }
+
+}
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitTantrum.java b/src/main/java/com/sosnitzka/taiga/traits/TraitTantrum.java
new file mode 100644
index 0000000..a0bb62f
--- /dev/null
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitTantrum.java
@@ -0,0 +1,105 @@
+package com.sosnitzka.taiga.traits;
+
+import com.sosnitzka.taiga.util.Utils;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.text.TextFormatting;
+import net.minecraft.world.World;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.entity.player.ItemTooltipEvent;
+import net.minecraftforge.event.entity.player.PlayerInteractEvent;
+import net.minecraftforge.event.world.BlockEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import slimeknights.tconstruct.common.Sounds;
+import slimeknights.tconstruct.library.traits.AbstractTrait;
+import slimeknights.tconstruct.library.utils.TagUtil;
+import slimeknights.tconstruct.library.utils.TinkerUtil;
+
+import static com.sosnitzka.taiga.Blocks.tiberiumOre;
+
+public class TraitTantrum extends AbstractTrait {
+
+ /*
+ * Collects tiberium, to release it for an explosion
+ */
+
+ public static float max_charges = 12f;
+ public static float max_power = 5;
+
+ public TraitTantrum() {
+ super("tantrum", TextFormatting.RED);
+ MinecraftForge.EVENT_BUS.register(this);
+ }
+
+ @Override
+ public void blockHarvestDrops(ItemStack tool, BlockEvent.HarvestDropsEvent event) {
+ World w = event.getWorld();
+ if (!w.isRemote) {
+ if (event.getState().getBlock().equals(tiberiumOre)) {
+ event.getDrops().clear();
+ NBTTagCompound tag = TagUtil.getExtraTag(tool);
+ Data data = Data.read(tag);
+ if (data.amount >= max_charges) {
+ return;
+ }
+ data.amount += (0.25f + Utils.round2(random.nextDouble() / 4));
+ if (data.amount >= max_charges) {
+ TagUtil.setEnchantEffect(tool, true);
+ if (event.getHarvester() instanceof EntityPlayerMP) {
+ Sounds.PlaySoundForPlayer(event.getHarvester(), Sounds.shocking_discharge, 1f, 0.8f + .2f * random.nextFloat());
+ }
+ }
+ data.write(tag);
+ TagUtil.setExtraTag(tool, tag);
+ }
+ }
+ }
+
+ @SubscribeEvent
+ public void RightClickItem(PlayerInteractEvent.RightClickItem event) {
+ World w = event.getWorld();
+ BlockPos pos = event.getPos();
+ ItemStack tool = event.getEntityPlayer().getHeldItemMainhand();
+ if (!w.isRemote && TinkerUtil.hasTrait(TagUtil.getTagSafe(tool), identifier)) {
+ NBTTagCompound tag = TagUtil.getExtraTag(tool);
+ Data data = Data.read(tag);
+ if (data.amount > 1f) {
+ double d = Math.min(Utils.round2(random.nextDouble() * data.amount), max_power);
+ w.newExplosion(event.getEntityPlayer(), pos.getX(), pos.getY(), pos.getZ(), (float) Math.pow((double) 1.2f, d), false, true);
+ data.amount -= d;
+ data.write(tag);
+ TagUtil.setExtraTag(tool, tag);
+ TagUtil.setEnchantEffect(tool, false);
+ }
+ }
+ }
+
+ @SubscribeEvent
+ public void onItemTooltip(ItemTooltipEvent e) {
+ ItemStack tool = e.getItemStack();
+ if (TinkerUtil.hasTrait(TagUtil.getTagSafe(tool), identifier)) {
+ NBTTagCompound tag = TagUtil.getExtraTag(tool);
+ Data data = Data.read(tag);
+ e.getToolTip().add(TextFormatting.RED + "Charge: " + data.amount);
+ }
+ }
+
+ public static class Data {
+
+ float amount;
+
+ public static Data read(NBTTagCompound tag) {
+ Data data = new Data();
+ data.amount = tag.getFloat("amount");
+ return data;
+ }
+
+ public void write(NBTTagCompound tag) {
+ tag.setFloat("amount", amount);
+ }
+ }
+
+
+}
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitTemplate.java b/src/main/java/com/sosnitzka/taiga/traits/TraitTemplate.java
new file mode 100644
index 0000000..281c4f2
--- /dev/null
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitTemplate.java
@@ -0,0 +1,17 @@
+package com.sosnitzka.taiga.traits;
+
+import net.minecraft.util.text.TextFormatting;
+import net.minecraftforge.common.MinecraftForge;
+import slimeknights.tconstruct.library.traits.AbstractTrait;
+
+
+public class TraitTemplate extends AbstractTrait {
+
+
+ public TraitTemplate() {
+ super(TraitTemplate.class.getSimpleName().toLowerCase().substring(5), TextFormatting.RED);
+ MinecraftForge.EVENT_BUS.register(this);
+ }
+
+
+}
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitTraditional.java b/src/main/java/com/sosnitzka/taiga/traits/TraitTraditional.java
index e8626e5..c422524 100644
--- a/src/main/java/com/sosnitzka/taiga/traits/TraitTraditional.java
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitTraditional.java
@@ -1,14 +1,49 @@
package com.sosnitzka.taiga.traits;
-import net.minecraft.util.text.TextFormatting;
+import net.minecraft.entity.EntityCreature;
+import net.minecraft.entity.EntityList;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.entity.living.LivingDeathEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import slimeknights.tconstruct.library.traits.AbstractTrait;
+import slimeknights.tconstruct.library.utils.TagUtil;
+import slimeknights.tconstruct.library.utils.TinkerUtil;
public class TraitTraditional extends AbstractTrait {
+
public TraitTraditional() {
- super("traditional", TextFormatting.GREEN);
+ super("traditional", 0xff33ff);
MinecraftForge.EVENT_BUS.register(this);
}
+
+ @SubscribeEvent
+ public void onEntityKill(LivingDeathEvent e) {
+ World w = e.getEntity().getEntityWorld();
+ if (!w.isRemote && e.getSource().getEntity() instanceof EntityPlayer && e.getEntity() instanceof EntityCreature) {
+ if (TinkerUtil.hasTrait(TagUtil.getTagSafe(((EntityPlayer) e.getSource().getEntity()).getHeldItemMainhand()), identifier)) {
+ String name = EntityList.getEntityString(e.getEntity());
+ }
+ }
+ }
+
+ public static class Data {
+
+ String mobname;
+
+ public static Data read(NBTTagCompound tag) {
+ Data data = new Data();
+ data.mobname = tag.getString("mob");
+ return data;
+ }
+
+ public void write(NBTTagCompound tag) {
+ tag.setString("amount", mobname);
+ }
+ }
+
}
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitUncertain.java b/src/main/java/com/sosnitzka/taiga/traits/TraitUncertain.java
index f91031f..f7ca5ab 100644
--- a/src/main/java/com/sosnitzka/taiga/traits/TraitUncertain.java
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitUncertain.java
@@ -1,79 +1,15 @@
package com.sosnitzka.taiga.traits;
-import net.minecraft.block.state.IBlockState;
-import net.minecraft.entity.Entity;
-import net.minecraft.entity.EntityLivingBase;
-import net.minecraft.entity.item.EntityItem;
-import net.minecraft.entity.monster.EntityMob;
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.init.Items;
-import net.minecraft.item.ItemStack;
-import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextFormatting;
-import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
-import net.minecraftforge.event.entity.living.LivingDropsEvent;
-import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import slimeknights.tconstruct.library.traits.AbstractTrait;
-import slimeknights.tconstruct.library.utils.TagUtil;
-import slimeknights.tconstruct.library.utils.TinkerUtil;
-import slimeknights.tconstruct.library.utils.ToolHelper;
-
-import static com.sosnitzka.taiga.Items.glimmerstone_dust;
-import static com.sosnitzka.taiga.Items.tiberiumShardInstable;
-import static com.sosnitzka.taiga.Items.tiberium_nugget;
public class TraitUncertain extends AbstractTrait {
public TraitUncertain() {
- super("uncertain", TextFormatting.RED);
+ super(TraitUncertain.class.getName().toLowerCase().substring(4), TextFormatting.RED);
MinecraftForge.EVENT_BUS.register(this);
}
-
- @Override
- public void afterBlockBreak(ItemStack tool, World world, IBlockState state, BlockPos pos, EntityLivingBase player, boolean wasEffective) {
- if (random.nextFloat() <= 0.05) {
- if (!world.isRemote) {
- if (random.nextFloat() > 0.1f) {
- explode(world, player, pos.getX(), pos.getY(), pos.getZ());
- } else explode(world, null, pos.getX(), pos.getY(), pos.getZ());
- }
- ToolHelper.damageTool(tool, random.nextInt(5) + 1, null);
- }
- }
-
- @SubscribeEvent
- public void onMobDrops(LivingDropsEvent event) {
- World w = event.getEntity().getEntityWorld();
- if (!w.isRemote && event.getSource().getEntity() instanceof EntityPlayer) {
- EntityPlayer player = (EntityPlayer) event.getSource().getEntity();
- if (event.getEntity() instanceof EntityMob && TinkerUtil.hasTrait(TagUtil.getTagSafe(player.getHeldItemMainhand()), identifier)) {
- ItemStack i = new ItemStack(Items.COAL, random.nextInt(4));
- if (random.nextBoolean()) {
- int r = random.nextInt(4);
- switch (r) {
- case 0:
- i = new ItemStack(Items.GUNPOWDER, random.nextInt(4));
- break;
- case 1:
- i = new ItemStack(tiberiumShardInstable, random.nextInt(4));
- break;
- case 2:
- i = new ItemStack(tiberium_nugget, random.nextInt(12));
- break;
- case 3:
- i = new ItemStack(glimmerstone_dust, random.nextInt(4));
- break;
- }
- }
- event.getDrops().add(0, new EntityItem(w, event.getEntity().posX, event.getEntity().posY, event.getEntity().posZ, i));
- }
- }
- }
-
- private void explode(World w, Entity e, double x, double y, double z) {
- w.newExplosion(e, x, y, z, 1.2f + random.nextFloat() * 4, random.nextBoolean(), true);
- }
}
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitVortex.java b/src/main/java/com/sosnitzka/taiga/traits/TraitVortex.java
new file mode 100644
index 0000000..54880ff
--- /dev/null
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitVortex.java
@@ -0,0 +1,17 @@
+package com.sosnitzka.taiga.traits;
+
+import net.minecraft.util.text.TextFormatting;
+import net.minecraftforge.common.MinecraftForge;
+import slimeknights.tconstruct.library.traits.AbstractTrait;
+
+
+public class TraitVortex extends AbstractTrait {
+
+
+ public TraitVortex() {
+ super(TraitVortex.class.getSimpleName().toLowerCase().substring(5), TextFormatting.DARK_PURPLE);
+ MinecraftForge.EVENT_BUS.register(this);
+ }
+
+
+}
diff --git a/src/main/java/com/sosnitzka/taiga/traits/TraitWhirl.java b/src/main/java/com/sosnitzka/taiga/traits/TraitWhirl.java
new file mode 100644
index 0000000..829c73f
--- /dev/null
+++ b/src/main/java/com/sosnitzka/taiga/traits/TraitWhirl.java
@@ -0,0 +1,98 @@
+package com.sosnitzka.taiga.traits;
+
+import com.sosnitzka.taiga.util.Utils;
+import net.minecraft.entity.Entity;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.math.MathHelper;
+import net.minecraft.util.text.TextFormatting;
+import net.minecraft.world.World;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.common.util.FakePlayer;
+import net.minecraftforge.event.entity.player.ItemTooltipEvent;
+import net.minecraftforge.event.entity.player.PlayerInteractEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import slimeknights.tconstruct.library.traits.AbstractTrait;
+import slimeknights.tconstruct.library.utils.TagUtil;
+import slimeknights.tconstruct.library.utils.TinkerUtil;
+import slimeknights.tconstruct.library.utils.ToolHelper;
+
+
+public class TraitWhirl extends AbstractTrait {
+
+ protected static int TICK_PER_STAT = 36;
+
+ public TraitWhirl() {
+ super(TraitWhirl.class.getSimpleName().toLowerCase().substring(5), TextFormatting.DARK_BLUE);
+ MinecraftForge.EVENT_BUS.register(this);
+ }
+
+ @Override
+ public void onUpdate(ItemStack tool, World world, Entity entity, int itemSlot, boolean isSelected) {
+
+ if (entity instanceof FakePlayer || entity.worldObj.isRemote) {
+ return;
+ }
+
+ if (entity.ticksExisted % TICK_PER_STAT > 0) {
+ return;
+ }
+
+ NBTTagCompound tag = TagUtil.getExtraTag(tool);
+ Utils.GeneralNBTData data = Utils.GeneralNBTData.read(tag);
+ data.radius += random.nextFloat() * 0.5f;
+ if (data.radius >= 1) {
+ TagUtil.setEnchantEffect(tool, true);
+ }
+ data.write(tag);
+ TagUtil.setExtraTag(tool, tag);
+ }
+
+ @SubscribeEvent
+ public void onRightClickItem(PlayerInteractEvent.RightClickItem event) {
+ World w = event.getWorld();
+ ItemStack tool = event.getEntityPlayer().getHeldItemMainhand();
+ if (!w.isRemote && TinkerUtil.hasTrait(TagUtil.getTagSafe(tool), identifier)) {
+ NBTTagCompound tag = TagUtil.getExtraTag(tool);
+ Utils.GeneralNBTData data = Utils.GeneralNBTData.read(tag);
+ if ((int) data.radius >= 1) {
+ int r = Math.min((int) data.radius, 8);
+ for (int x = -r; x <= r; x++) {
+ for (int y = -r; y <= r; y++) {
+ for (int z = -r; z <= r; z++) {
+ if (MathHelper.sqrt_double(x * x + y * y + z * z) > r) {
+ continue;
+ }
+ BlockPos nPos = new BlockPos(event.getPos().getX() + x, event.getPos().getY() + y, event.getPos().getZ() + z);
+ if (!(event.getWorld().getBlockState(nPos).equals(Blocks.WATER.getDefaultState()) || event.getWorld().getBlockState(nPos).equals(Blocks.FLOWING_WATER.getDefaultState())))
+ continue;
+ event.getWorld().destroyBlock(nPos, false);
+ }
+ }
+ }
+ data.radius -= r;
+ data.write(tag);
+ TagUtil.setExtraTag(tool, tag);
+ TagUtil.setEnchantEffect(tool, false);
+ ToolHelper.damageTool(tool, 2 * r, event.getEntityPlayer());
+ }
+
+ }
+ }
+
+
+ @SubscribeEvent
+ public void onItemTooltip(ItemTooltipEvent e) {
+ ItemStack tool = e.getItemStack();
+ if (TinkerUtil.hasTrait(TagUtil.getTagSafe(tool), identifier)) {
+ NBTTagCompound tag = TagUtil.getExtraTag(tool);
+ Utils.GeneralNBTData data = Utils.GeneralNBTData.read(tag);
+ if (data.radius > 0) {
+ e.getToolTip().add(TextFormatting.BLUE + "Actual Radius: " + TextFormatting.WHITE + Math.round(data.radius * 100) / 100);
+ }
+ }
+ }
+
+}