2
0
Fork 0
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

209 lines
14 KiB
Java

package com.zivilon.cinder_loe.util;
import com.zivilon.cinder_loe.CinderLoE;
import com.zivilon.cinder_loe.entity.npc.dwarf.*;
import com.zivilon.cinder_loe.mixins.MixinLOTREntityNPC;
import com.zivilon.cinder_loe.droptables.*;
import com.zivilon.cinder_loe.droptables.DropTable.*;
import com.zivilon.cinder_loe.util.IMixinEntityPlayer;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.init.Items;
import net.minecraft.nbt.*;
import net.minecraft.potion.Potion;
import net.minecraft.util.MathHelper;
import net.minecraft.util.ChatComponentTranslation;
import lotr.common.LOTRMod;
import lotr.common.item.LOTRItemArmor;
import lotr.common.item.LOTRMaterial;
import lotr.common.entity.npc.*;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class PickpocketUtils {
public static Random random = new Random();
public static boolean can_pickpocket(EntityPlayer player, LOTREntityNPC target) {
if (!player.isSneaking()) return false;
DropTable table = ((ILootableEntity)(Object)target).get_drop_table();
if (table == null) {
return false;
}
List<DropInstance> drops = table.drop_list;
boolean has_pickpocket_drops = drops.stream().anyMatch(drop ->
drop.conditions != null &&
Arrays.stream(drop.conditions).anyMatch(DropContext.PICKPOCKET::equals)
);
if (!has_pickpocket_drops) {
return false;
}
if (((IMixinEntityPlayer)player).get_last_pickpocket_attempt() > (int)(System.currentTimeMillis() / 1000L - 1) || ((ILootableEntity)(Object)target).get_last_pickpocket() > (int)(System.currentTimeMillis() / 1000L - 4)) {
if (random.nextInt(10000) == 1) {
player.addChatMessage(new ChatComponentTranslation("pickpocket.cooldown_alt"));
} else {
player.addChatMessage(new ChatComponentTranslation("pickpocket.cooldown"));
}
return false;
}
return true;
}
public static boolean pickpocket(EntityPlayer player, LOTREntityNPC target) {
ILootableEntity npc = (ILootableEntity)(Object)target;
float penalty = 1.0F;
if (!is_behind(player, (EntityLivingBase)target)) penalty -= 0.4F;
if (npc.get_last_pickpocket() > (int)(System.currentTimeMillis() / 1000L - 60)) penalty -= 0.4F;
if (is_invisible(player)) penalty += 0.4F;
if (is_cloaked(player)) penalty += 0.2F;
boolean success = random.nextFloat() < npc.get_pickpocket_chance() * penalty;
return success;
}
public static boolean is_behind(EntityPlayer player, EntityLivingBase entity) {
float npcYaw = entity.rotationYaw % 360;
float playerYaw = player.rotationYaw % 360;
float angleDiff = MathHelper.wrapAngleTo180_float(npcYaw - playerYaw);
boolean is_behind = Math.abs(angleDiff) < 30F;
return is_behind;
}
public static boolean is_invisible(EntityPlayer player) {
boolean invisible = player.isPotionActive(Potion.invisibility);
return (invisible && !wearing_armor(player));
}
public static boolean is_cloaked(EntityPlayer player) {
ItemStack[] equipment = player.inventory.armorInventory;
for (ItemStack armor : equipment) {
if (armor == null) return false;
Item item = armor.getItem();
if (!(item instanceof LOTRItemArmor) || ((LOTRItemArmor)item).getLOTRArmorMaterial() != LOTRMaterial.HITHLAIN)
return false;
}
return true;
}
public static boolean wearing_armor(EntityPlayer player) {
ItemStack[] equipment = player.inventory.armorInventory;
for (ItemStack armor : equipment) {
if (armor != null) return true;
}
return false;
}
/* Comment when done. Here only for reference
public SingleItemDrop(Item item, NBTTagCompound nbt, float chance, int min, int max, boolean looting_quantity, boolean looting_chance, DropContext[] conditions) {
public SingleItemDrop(Item item, NBTTagCompound nbt, float chance, DropContext[] conditions) {
public ItemGroup(float chance, int min, int max, boolean looting_chance, DropContext[] conditions, ItemGroupEntry... drops) {
public ItemGroupEntry(Item item, NBTTagCompound nbt, int weight, int min_amount, int max_amount, boolean looting_quantity) {
public ItemGroupEntry(Item item, NBTTagCompound nbt, int weight) {
*/
public static void assign_drop_table(LOTREntityNPC entity) {
if (entity instanceof LOTRTradeable || entity instanceof LOTRUnitTradeable) return;
((ILootableEntity)entity).set_pickpocket_chance(0.8F);
DropTable table = new DropTable();
DropContext[] default_context = new DropContext[] {DropContext.PICKPOCKET};
table.drop_list.add(new SingleItemDrop(LOTRMod.silverCoin, null, 1.0F, 8, 32, false, false, default_context));
if (entity instanceof LOTREntityMan) {
table.drop_list.add(new SingleItemDrop(Items.cooked_chicken, null, 0.2F, 1, 3, false, false, default_context));
table.drop_list.add(new SingleItemDrop(Items.book, null, 0.2F, 1, 3, false, false, default_context));
table.drop_list.add(new SingleItemDrop(Items.bread, null, 0.2F, default_context));
table.drop_list.add(new SingleItemDrop(CinderLoE.spiceHuman, null, 0.01F, default_context));
} else if (entity instanceof LOTREntityOrc) {
table.drop_list.add(new SingleItemDrop(LOTRMod.orcSteel, null, 0.05F, 1, 3, false, false, default_context));
table.drop_list.add(new SingleItemDrop(LOTRMod.maggotyBread, null, 0.2F, default_context));
table.drop_list.add(new SingleItemDrop(LOTRMod.manFlesh, null, 0.2F, default_context));
table.drop_list.add(new SingleItemDrop(LOTRMod.elfBone, null, 0.2F, default_context));
table.drop_list.add(new SingleItemDrop(Items.bone, null, 0.2F, default_context));
table.drop_list.add(new SingleItemDrop(CinderLoE.spiceOrcish, null, 0.01F, default_context));
} else if (entity instanceof LOTREntityElf) {
table.drop_list.add(new SingleItemDrop(LOTRMod.quenditeCrystal, null, 0.01F, default_context));
table.drop_list.add(new SingleItemDrop(LOTRMod.lembas, null, 0.05F, default_context));
table.drop_list.add(new SingleItemDrop(Item.getItemFromBlock(LOTRMod.niphredil), null, 0.1F, default_context));
table.drop_list.add(new SingleItemDrop(Item.getItemFromBlock(LOTRMod.elanor), null, 0.1F, default_context));
table.drop_list.add(new SingleItemDrop(LOTRMod.mallornNut, null, 0.05F, default_context));
table.drop_list.add(new SingleItemDrop(CinderLoE.spiceElven, null, 0.01F, default_context));
} else if (entity instanceof LOTREntityDwarf) {
table.drop_list.add(new SingleItemDrop(CinderLoE.spiceDwarven, null, 0.01F, default_context));
ItemGroupEntry amethyst = new ItemGroupEntry(LOTRMod.amethyst, null, 5);
ItemGroupEntry topaz = new ItemGroupEntry(LOTRMod.topaz, null, 4);
ItemGroupEntry amber = new ItemGroupEntry(LOTRMod.amber, null, 4);
ItemGroupEntry opal = new ItemGroupEntry(LOTRMod.opal, null, 4);
ItemGroupEntry sapphire = new ItemGroupEntry(LOTRMod.sapphire, null, 3);
ItemGroupEntry ruby = new ItemGroupEntry(LOTRMod.ruby, null, 3);
ItemGroupEntry emerald = new ItemGroupEntry(LOTRMod.emerald, null, 2);
ItemGroupEntry diamond = new ItemGroupEntry(LOTRMod.diamond, null, 1);
ItemGroup gem_drop = new ItemGroup(0.1F, 1, 1, false, default_context, amethyst, topaz, amber, opal, sapphire, ruby, emerald, diamond);
table.drop_list.add(new SingleItemDrop(Items.coal, null, 0.1F, default_context));
table.drop_list.add(new SingleItemDrop(Items.gold_nugget, null, 0.025F, default_context));
table.drop_list.add(new SingleItemDrop(LOTRMod.ironNugget, null, 0.1F, default_context));
}
if (entity instanceof LOTREntityTauredain) {
NBTTagCompound nbt = new NBTTagCompound();
nbt.setTag("display", new NBTTagCompound());
nbt.getCompoundTag("display").setString("Name", "§fChocolate chip cookie");
table.drop_list.add(new SingleItemDrop(Items.cookie, nbt, 0.001F, default_context));
} else if (entity instanceof LOTREntityRanger || entity instanceof LOTREntityGulfHaradrim || entity instanceof LOTREntityHarnedhrim || entity instanceof LOTREntityRohanMan) {
table.drop_list.add(new SingleItemDrop(Items.leather, null, 1.0F, 1, 3, false, false, default_context));
} else if (entity instanceof LOTREntityNomad) {
table.drop_list.add(new SingleItemDrop(Item.getItemFromBlock(LOTRMod.driedReeds), null, 1.0F, 1, 3, false, false, default_context));
table.drop_list.add(new SingleItemDrop(LOTRMod.camelRaw, null, 1.0F, 1, 3, false, false, default_context));
table.drop_list.add(new SingleItemDrop(LOTRMod.camelCooked, null, 1.0F, 1, 3, false, false, default_context));
}
if (entity instanceof LOTREntityNearHaradrimBase || entity instanceof LOTREntityMoredain || entity instanceof LOTREntityTauredain) {
table.drop_list.add(new SingleItemDrop(LOTRMod.bronze, null, 1.0F, 1, 3, false, false, default_context));
} else if (entity instanceof LOTREntityAngmarHillman || entity instanceof LOTREntityBreeMan || entity instanceof LOTREntityDaleMan || entity instanceof LOTREntityDorwinionMan || entity instanceof LOTREntityDunedain || entity instanceof LOTREntityDunlending || entity instanceof LOTREntityEasterling || entity instanceof LOTREntityGondorMan || entity instanceof LOTREntityRohanMan) {
table.drop_list.add(new SingleItemDrop(Items.iron_ingot, null, 1.0F, 1, 3, false, false, default_context));
} else if (entity instanceof LOTREntityHalfTroll) {
table.drop_list.add(new SingleItemDrop(LOTRMod.gemsbokHide, null, 1.0F, 1, 3, false, false, default_context));
table.drop_list.add(new SingleItemDrop(LOTRMod.gemsbokHorn, null, 1.0F, 1, 3, false, false, default_context));
table.drop_list.add(new SingleItemDrop(Items.string, null, 1.0F, 2, 8, false, false, default_context));
} else if (entity instanceof LOTREntityMordorOrc) {
table.drop_list.add(new SingleItemDrop(LOTRMod.nauriteGem, null, 1.0F, default_context));
table.drop_list.add(new SingleItemDrop(LOTRMod.blackUrukSteel, null, 1.0F, 1, 3, false, false, default_context));
} else if (entity instanceof LOTREntityDolGuldurOrc) {
table.drop_list.add(new SingleItemDrop(LOTRMod.mysteryWeb, null, 1.0F, default_context));
} else if (entity instanceof LOTREntityGundabadOrc) {
table.drop_list.add(new SingleItemDrop(LOTRMod.urukSteel, null, 1.0F, 1, 3, false, false, default_context));
table.drop_list.add(new SingleItemDrop(LOTRMod.dwarfBone, null, 1.0F, default_context));
} else if (entity instanceof LOTREntityUrukHai) {
table.drop_list.add(new SingleItemDrop(LOTRMod.urukSteel, null, 1.0F, 1, 3, false, false, default_context));
} else if (entity instanceof LOTREntityDwarf && !(entity instanceof LOTREntityBlueDwarf) && !(entity instanceof RedDwarfWarrior) && !(entity instanceof RedDwarfBannerBearer) && !(entity instanceof RedDwarfArbalest)) {
table.drop_list.add(new SingleItemDrop(LOTRMod.dwarfSteel, null, 1.0F, 1, 3, false, false, default_context));
} else if (entity instanceof LOTREntityBlueDwarf) {
table.drop_list.add(new SingleItemDrop(LOTRMod.blueDwarfSteel, null, 1.0F, 1, 3, false, false, default_context));
} else if (entity instanceof RedDwarfWarrior || entity instanceof RedDwarfBannerBearer || entity instanceof RedDwarfArbalest) {
table.drop_list.add(new SingleItemDrop(CinderLoE.redDwarfSteel, null, 1.0F, 1, 3, false, false, default_context));
} else if (entity instanceof LOTREntityTree) {
table.drop_list.add(new SingleItemDrop(Items.stick, null, 1.0F, 8, 32, false, false, default_context));
table.drop_list.add(new SingleItemDrop(Item.getItemFromBlock(LOTRMod.fangornPlant), null, 1.0F, 1, 3, false, false, default_context));
table.drop_list.add(new SingleItemDrop(Item.getItemFromBlock(LOTRMod.fangornRiverweed), null, 1.0F, 1, 3, false, false, default_context));
} else if (entity instanceof LOTREntityHobbit || entity instanceof LOTREntityGandalf) {
table.drop_list.add(new SingleItemDrop(LOTRMod.hobbitPipe, null, 1.0F, default_context));
table.drop_list.add(new SingleItemDrop(LOTRMod.pipeweed, null, 1.0F, 1, 3, false, false, default_context));
table.drop_list.add(new SingleItemDrop(LOTRMod.hobbitPancake, null, 1.0F, 1, 3, false, false, default_context));
table.drop_list.add(new SingleItemDrop(LOTRMod.mugCider, null, 1.0F, 1, 3, false, false, default_context));
table.drop_list.add(new SingleItemDrop(LOTRMod.mushroomPie, null, 1.0F, 1, 3, false, false, default_context));
table.drop_list.add(new SingleItemDrop(Items.mushroom_stew, null, 1.0F, 1, 3, false, false, default_context));
table.drop_list.add(new SingleItemDrop(Items.apple, null, 1.0F, 1, 3, false, false, default_context));
table.drop_list.add(new SingleItemDrop(Items.cake, null, 1.0F, 1, 3, false, false, default_context));
} else if (entity instanceof LOTREntityUtumnoOrc) {
table.drop_list.add(new SingleItemDrop(LOTRMod.mithrilNugget, null, 1.0F, default_context));
table.drop_list.add(new SingleItemDrop(LOTRMod.chilling, null, 0.0001F, default_context));
}
((ILootableEntity)entity).set_drop_table(table);
}
}