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.

332 lines
13 KiB
Java

package com.zivilon.cinder_loe.util;
import com.zivilon.cinder_loe.CinderLoE;
import com.zivilon.cinder_loe.client.render.item.RenderHelper;
import com.zivilon.cinder_loe.mixins.MixinEntity;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import java.util.UUID;
import lotr.common.LOTRCreativeTabs;
import lotr.common.world.biome.LOTRBiome;
import lotr.common.item.LOTRItemArmor;
import lotr.common.item.LOTRMaterial;
import lotr.common.enchant.LOTREnchantment;
import lotr.common.enchant.LOTREnchantmentHelper;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.SharedMonsterAttributes;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemArmor;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemSword;
import net.minecraft.nbt.NBTBase;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.nbt.NBTTagString;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.server.MinecraftServer;
public class Utilities {
public static int[] LOTRIntCache = null;
public static LOTRBiome reflected_river;
public static LOTRBiome reflected_taiga;
public static LOTRCreativeTabs reflected_tab_block;
public static List<String> badEnchants = new ArrayList<>();
public static Map<String, LOTREnchantment> upgradedEnchants = new HashMap<>();
static {
badEnchants.add("weak1");
badEnchants.add("weak2");
badEnchants.add("weak3");
badEnchants.add("weak4");
badEnchants.add("meleeSlow1");
badEnchants.add("meleeUnreach1");
badEnchants.add("toolSlow1");
badEnchants.add("protectWeak1");
badEnchants.add("protectWeak2");
badEnchants.add("rangedWeak1");
badEnchants.add("rangedWeak2");
badEnchants.add("rangedWeak3");
badEnchants.add("protectRangedWeak1");
badEnchants.add("protectRangedWeak2");
upgradedEnchants.put("strong1", LOTREnchantment.strong1);
upgradedEnchants.put("strong2", LOTREnchantment.strong3);
upgradedEnchants.put("strong3", LOTREnchantment.strong4);
upgradedEnchants.put("durable1", LOTREnchantment.durable2);
upgradedEnchants.put("durable2", LOTREnchantment.durable3);
upgradedEnchants.put("knockback1", LOTREnchantment.knockback2);
upgradedEnchants.put("toolSpeed1", LOTREnchantment.toolSpeed2);
upgradedEnchants.put("toolSpeed2", LOTREnchantment.toolSpeed3);
upgradedEnchants.put("toolSpeed3", LOTREnchantment.toolSpeed4);
upgradedEnchants.put("looting1", LOTREnchantment.looting2);
upgradedEnchants.put("looting2", LOTREnchantment.looting3);
upgradedEnchants.put("protect1", LOTREnchantment.protect2);
upgradedEnchants.put("protectFire1", LOTREnchantment.protectFire2);
upgradedEnchants.put("protectFire2", LOTREnchantment.protectFire3);
upgradedEnchants.put("protectFall1", LOTREnchantment.protectFall2);
upgradedEnchants.put("protectFall2", LOTREnchantment.protectFall3);
upgradedEnchants.put("protectRanged1", LOTREnchantment.protectRanged2);
upgradedEnchants.put("protectRanged2", LOTREnchantment.protectRanged3);
upgradedEnchants.put("rangedStrong1", LOTREnchantment.rangedStrong2);
upgradedEnchants.put("rangedStrong2", LOTREnchantment.rangedStrong3);
upgradedEnchants.put("rangedKnockback1", LOTREnchantment.rangedKnockback2);
}
public static void initialize_reflects() {
try {
Field river_field = LOTRBiome.class.getField("river");
reflected_river = (LOTRBiome)river_field.get(null);
Field taiga_field = LOTRBiome.class.getField("taiga");
reflected_taiga = (LOTRBiome)taiga_field.get(null);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
}
public static void pre_init_reflects() {
try {
Field tabBlockField = LOTRCreativeTabs.class.getField("tabBlock");
reflected_tab_block = (LOTRCreativeTabs)tabBlockField.get(null);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
}
public static EntityPlayerMP getPlayerByUUID(UUID playerUUID) {
MinecraftServer server = MinecraftServer.getServer(); // Get the server instance
if (server == null) {
return null; // Server instance is not available
}
// Iterate through the list of online players and match UUID
for (Object obj : server.getConfigurationManager().playerEntityList) {
if (obj instanceof EntityPlayerMP) {
EntityPlayerMP player = (EntityPlayerMP) obj;
if (player.getUniqueID().equals(playerUUID)) {
return player;
}
} else {
System.err.println("[CinderCore] Player list having non-players, WHAT?!?!?!");
}
}
return null; // Player not found or not online
}
public static String toSnakeCase(String input) {
if (input == null || input.isEmpty()) {
return input;
}
StringBuilder builder = new StringBuilder();
char[] chars = input.toCharArray();
builder.append(Character.toLowerCase(chars[0]));
for (int i = 1; i < chars.length; i++) {
char c = chars[i];
if (Character.isUpperCase(c)) {
builder.append('_').append(Character.toLowerCase(c));
} else {
builder.append(c);
}
}
return builder.toString();
}
public static void writeLog(String message) {
try (BufferedWriter writer = new BufferedWriter(new FileWriter("custom_log.txt", true))) {
LocalDateTime now = LocalDateTime.now();
String timestamp = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
writer.write(timestamp + " - " + message + "\n");
} catch (IOException e) {
e.printStackTrace();
}
}
public static EntityPlayer getPlayerByName(String player_name) {
MinecraftServer server = MinecraftServer.getServer();
if (server == null) {
return null;
}
for (Object obj : server.getConfigurationManager().playerEntityList) {
if (obj instanceof EntityPlayerMP) {
EntityPlayer player = (EntityPlayer)obj;
String found_name = player.getCommandSenderName();
if (found_name.equals(player_name)) {
return player;
}
}
}
return null; // Player not found or not online
}
public static boolean hasFireWeapon(String player_name) {
EntityPlayer player = getPlayerByName(player_name);
if (player == null) {
System.out.println("[CinderLoE] Warning! Player not found: " + player_name);
return false;
}
ItemStack held_item = player.getHeldItem();
boolean has_fire = LOTREnchantmentHelper.hasEnchant(held_item, LOTREnchantment.fire);
return has_fire;
}
public static boolean has_fire_weapon(Entity entity) {
if (!(entity instanceof EntityLivingBase)) return false;
ItemStack held_item = ((EntityLivingBase)entity).getHeldItem();
return LOTREnchantmentHelper.hasEnchant(held_item, LOTREnchantment.fire);
}
public static double calculate_melee_damage_on_entity(EntityLivingBase target, EntityLivingBase attacker) {
if (attacker == null) return 0.0D;
if (attacker.getEntityAttribute(SharedMonsterAttributes.attackDamage) == null) return 0.0D;
double attribute = attacker.getEntityAttribute(SharedMonsterAttributes.attackDamage).getAttributeValue();
double enchantments = EnchantmentHelper.getEnchantmentModifierLiving(attacker, target);
boolean is_critical = !attacker.onGround && attacker.motionY < 0.0D && !attacker.isInWater() && !attacker.isRiding();
double critical = 0.0D;
if (is_critical) {
PotionEffect strength_effect = attacker.getActivePotionEffect(Potion.damageBoost);
if (strength_effect == null) {
critical = Math.min((attribute + enchantments) * 1.5D, 7.0D);
} else {
int level = strength_effect.getAmplifier() + 1;
critical = Math.min((attribute + enchantments) * 1.5D, 7.0D * (1.0D + 0.5D * level));
}
}
return attribute + enchantments + critical;
}
public static boolean isArrayEmpty(int[] array) {
for (int value : array) {
if (value != 0) return false;
}
return true;
}
public static void setInvulnerable(Entity entity, boolean invulnerable) {
((MixinEntity)entity).setInvulnerable(invulnerable);
}
public static void setLOTREnchant(ItemStack itemstack, LOTREnchantment ench) {
NBTTagList tags = getItemEnchantTags(itemstack, true);
if (tags != null) {
String enchName = ench.enchantName;
tags.appendTag((NBTBase)new NBTTagString(enchName));
}
}
public static NBTTagList getItemEnchantTags(ItemStack itemstack, boolean create) {
NBTTagCompound itemData = itemstack.getTagCompound();
NBTTagList tags = null;
if (itemData != null && itemData.hasKey("LOTREnch")) {
tags = itemData.getTagList("LOTREnch", 8);
} else if (create) {
if (itemData == null) {
itemData = new NBTTagCompound();
itemstack.setTagCompound(itemData);
}
tags = new NBTTagList();
itemData.setTag("LOTREnch", (NBTBase)tags);
}
return tags;
}
public static void setAppliedRandomEnchants(ItemStack itemstack) {
if (!itemstack.hasTagCompound())
itemstack.setTagCompound(new NBTTagCompound());
itemstack.getTagCompound().setBoolean("LOTRRandomEnch", true);
}
public static void knockback(EntityLivingBase target, EntityLivingBase attacker, double knockback_strength) {
// Calculate direction of knockback
double dx = attacker.posX - target.posX;
double dz = attacker.posZ - target.posZ;
// Normalize the direction vector
double distance = Math.sqrt(dx * dx + dz * dz);
if (distance != 0) {
dx /= distance;
dz /= distance;
}
// Apply knockback manually
target.motionX -= dx * knockback_strength;
target.motionZ -= dz * knockback_strength;
// Ensure the motion is applied
target.velocityChanged = true;
}
public static boolean isBadEnch(LOTREnchantment ench) {
if (ench == null) return false;
String ench_name = ench.enchantName;
if (badEnchants.contains(ench_name)) {
return true;
}
return false;
}
public static LOTREnchantment upgradeEnch(ItemStack item, LOTREnchantment ench) {
if (ench == null) return ench;
if (ench != LOTREnchantment.protect1) {
LOTREnchantment return_ench = upgradedEnchants.get(ench.enchantName);
if (return_ench == null) return_ench = ench;
return return_ench;
}
int armor_piece = ((ItemArmor)item.getItem()).armorType;
int prot = ((ItemArmor)item.getItem()).damageReduceAmount;
LOTREnchantment return_value = ench;
switch(armor_piece) {
case 0:
if (prot < 2) return_value = upgradedEnchants.get(ench.enchantName);
break;
case 1:
if (prot < 7) return_value = upgradedEnchants.get(ench.enchantName);
break;
case 2:
if (prot < 5) return_value = upgradedEnchants.get(ench.enchantName);
break;
case 3:
if (prot < 2) return_value = upgradedEnchants.get(ench.enchantName);
break;
default:
break;
}
return return_value;
}
public static <T> boolean array_contains_array(T[] superarray, T[] subarray) {
for (T subobj : subarray) {
if (subobj == null || Arrays.stream(superarray).anyMatch(subobj::equals)) continue;
return false;
}
return true;
}
}