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
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);
|
|
}
|
|
}
|