@Override public ProjectileLauncherNBT buildTagData(List<Material> materials) { ProjectileLauncherNBT data = new ProjectileLauncherNBT(); HeadMaterialStats head1 = materials.get(0).getStatsOrUnknown(MaterialTypes.HEAD); HeadMaterialStats head2 = materials.get(1).getStatsOrUnknown(MaterialTypes.HEAD); BowMaterialStats limb1 = materials.get(0).getStatsOrUnknown(MaterialTypes.BOW); BowMaterialStats limb2 = materials.get(1).getStatsOrUnknown(MaterialTypes.BOW); BowStringMaterialStats bowstring = materials.get(2).getStatsOrUnknown(MaterialTypes.BOWSTRING); data.head(head1, head2); data.limb(limb1, limb2); data.bowstring(bowstring); return data; }
protected ProjectileLauncherNBT getData(ItemStack stack) { return ProjectileLauncherNBT.from(stack); }
@Override public void applyEffect(NBTTagCompound rootCompound, NBTTagCompound modifierTag) { super.applyEffect(rootCompound, modifierTag); // add the attack speed boost ToolNBT data = TagUtil.getToolStats(rootCompound); // apply using the base value of 1.0f, as otherwise this will apply twice on tools with multiple lightweight parts data.attackSpeedMultiplier = 1.0f + bonus; TagUtil.setToolTag(rootCompound, data.get()); if(TinkerUtil.hasCategory(rootCompound, Category.LAUNCHER)) { ProjectileLauncherNBT launcherData = new ProjectileLauncherNBT(TagUtil.getToolTag(rootCompound)); launcherData.drawSpeed += launcherData.drawSpeed * bonus; TagUtil.setToolTag(rootCompound, launcherData.get()); } }
public static ProjectileLauncherNBT from(ItemStack itemStack) { return new ProjectileLauncherNBT(TagUtil.getToolTag(itemStack)); } }
@Override public void applyEffect(NBTTagCompound rootCompound, NBTTagCompound modifierTag) { ModifierNBT.IntegerNBT modData = ModifierNBT.readInteger(modifierTag); Set<Category> categories = ImmutableSet.copyOf(TagUtil.getCategories(rootCompound)); boolean harvest = categories.contains(Category.HARVEST); boolean weapon = categories.contains(Category.WEAPON); boolean launcher = categories.contains(Category.LAUNCHER); ToolNBT data = TagUtil.getToolStats(rootCompound); int level = modData.current / max; // only boost mining speed if we have a harvest tool if(harvest) { applyHarvestBoost(modData, data, level); } // attack speed: each total level adds 0.2 to the modifier, though individual redstone piece above the level add 0.004 each // so in short: 0.004 per redstone if(weapon) { data.attackSpeedMultiplier += getSpeedBonus(modData); } TagUtil.setToolTag(rootCompound, data.get()); // bow speed: if(launcher) { ProjectileLauncherNBT launcherData = new ProjectileLauncherNBT(TagUtil.getToolTag(rootCompound)); launcherData.drawSpeed += launcherData.drawSpeed * getDrawspeedBonus(modData); TagUtil.setToolTag(rootCompound, launcherData.get()); } }
@Override public ProjectileLauncherNBT buildTagData(List<Material> materials) { ProjectileLauncherNBT data = new ProjectileLauncherNBT(); HandleMaterialStats body = materials.get(0).getStatsOrUnknown(MaterialTypes.HANDLE); ExtraMaterialStats bodyExtra = materials.get(0).getStatsOrUnknown(MaterialTypes.EXTRA); HeadMaterialStats head = materials.get(1).getStatsOrUnknown(MaterialTypes.HEAD); BowMaterialStats limb = materials.get(1).getStatsOrUnknown(MaterialTypes.BOW); ExtraMaterialStats binding = materials.get(2).getStatsOrUnknown(MaterialTypes.EXTRA); BowStringMaterialStats bowstring = materials.get(3).getStatsOrUnknown(MaterialTypes.BOWSTRING); data.head(head); data.limb(limb); data.extra(binding, bodyExtra); data.handle(body); data.bowstring(bowstring); data.bonusDamage *= 1.5f; return data; }
public TooltipBuilder addRange() { tips.add(BowMaterialStats.formatRange(ProjectileLauncherNBT.from(stack).range)); return this; }
@Override public ProjectileLauncherNBT buildTagData(List<Material> materials) { ProjectileLauncherNBT data = new ProjectileLauncherNBT(); HeadMaterialStats head1 = materials.get(0).getStatsOrUnknown(MaterialTypes.HEAD); HeadMaterialStats head2 = materials.get(1).getStatsOrUnknown(MaterialTypes.HEAD); BowMaterialStats limb1 = materials.get(0).getStatsOrUnknown(MaterialTypes.BOW); BowMaterialStats limb2 = materials.get(1).getStatsOrUnknown(MaterialTypes.BOW); ExtraMaterialStats grip = materials.get(2).getStatsOrUnknown(MaterialTypes.EXTRA); BowStringMaterialStats bowstring = materials.get(3).getStatsOrUnknown(MaterialTypes.BOWSTRING); data.head(head1, head2); data.limb(limb1, limb2); data.extra(grip); data.bowstring(bowstring); data.durability *= DURABILITY_MODIFIER; return data; } }
protected float getDrawbackProgress(ItemStack itemStack, int timePassed) { float drawProgress = ProjectileLauncherNBT.from(itemStack).drawSpeed * (float) timePassed; return Math.min(1f, drawProgress / (float) getDrawTime()); }
public TooltipBuilder addProjectileBonusDamage() { tips.add(BowMaterialStats.formatDamage(ProjectileLauncherNBT.from(stack).bonusDamage)); return this; }
public TooltipBuilder addDrawSpeed() { float speed = ProjectileLauncherNBT.from(stack).drawSpeed; // convert speed per tick to seconds drawtime if(stack.getItem() instanceof BowCore) { speed = (float)((BowCore) stack.getItem()).getDrawTime()/(20f * speed); } tips.add(BowMaterialStats.formatDrawspeed(speed)); return this; }
@Override public void modifyProjectileAttributes(Multimap<String, AttributeModifier> projectileAttributes, @Nullable ItemStack launcher, ItemStack projectile, float power) { double dmg = baseProjectileDamage() * power; dmg += ProjectileLauncherNBT.from(launcher).bonusDamage; if(dmg != 0) { projectileAttributes.put(SharedMonsterAttributes.ATTACK_DAMAGE.getName(), new AttributeModifier(LAUNCHER_BONUS_DAMAGE, "Launcher bonus damage", dmg, 0)); } if(projectileDamageModifier() != 0f) { projectileAttributes.put(SharedMonsterAttributes.ATTACK_DAMAGE.getName(), new AttributeModifier(LAUNCHER_DAMAGE_MODIFIER, "Launcher damage modifier", projectileDamageModifier() - 1f, 1)); } }
public void shootProjectile(@Nonnull ItemStack ammoIn, @Nonnull ItemStack bow, World worldIn, EntityPlayer player, int useTime) { float progress = getDrawbackProgress(bow, useTime); float power = ItemBow.getArrowVelocity((int)(progress * 20f)) * progress * baseProjectileSpeed(); power *= ProjectileLauncherNBT.from(bow).range;