459 lines
13 KiB
Java
459 lines
13 KiB
Java
|
package WayofTime.alchemicalWizardry.api.soulNetwork;
|
||
|
|
||
|
import java.util.UUID;
|
||
|
|
||
|
import net.minecraft.entity.player.EntityPlayer;
|
||
|
import net.minecraft.item.ItemStack;
|
||
|
import net.minecraft.nbt.NBTTagCompound;
|
||
|
import net.minecraft.potion.Potion;
|
||
|
import net.minecraft.potion.PotionEffect;
|
||
|
import net.minecraft.server.MinecraftServer;
|
||
|
import net.minecraft.util.DamageSource;
|
||
|
import net.minecraft.world.World;
|
||
|
import net.minecraftforge.common.MinecraftForge;
|
||
|
import WayofTime.alchemicalWizardry.api.event.AddToNetworkEvent;
|
||
|
import WayofTime.alchemicalWizardry.api.event.ItemBindEvent;
|
||
|
import WayofTime.alchemicalWizardry.api.event.ItemDrainInContainerEvent;
|
||
|
import WayofTime.alchemicalWizardry.api.event.ItemDrainNetworkEvent;
|
||
|
|
||
|
import com.mojang.authlib.GameProfile;
|
||
|
|
||
|
import cpw.mods.fml.common.eventhandler.Event;
|
||
|
import cpw.mods.fml.common.eventhandler.Event.Result;
|
||
|
|
||
|
public class SoulNetworkHandler
|
||
|
{
|
||
|
public static UUID getUUIDFromPlayer(EntityPlayer player)
|
||
|
{
|
||
|
return player.getPersistentID();
|
||
|
}
|
||
|
|
||
|
public static EntityPlayer getPlayerFromUUID(UUID uuid)
|
||
|
{
|
||
|
MinecraftServer server = MinecraftServer.getServer();
|
||
|
GameProfile gameProfile;
|
||
|
gameProfile = server.func_152358_ax().func_152652_a(uuid);
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
public static boolean syphonFromNetworkWhileInContainer(ItemStack ist, int damageToBeDone)
|
||
|
{
|
||
|
String ownerName = "";
|
||
|
if (ist.getTagCompound() != null && !(ist.getTagCompound().getString("ownerName").equals("")))
|
||
|
{
|
||
|
ownerName = ist.getTagCompound().getString("ownerName");
|
||
|
}
|
||
|
|
||
|
ItemDrainInContainerEvent event = new ItemDrainInContainerEvent(ist, ownerName, damageToBeDone);
|
||
|
|
||
|
if(MinecraftForge.EVENT_BUS.post(event) || event.getResult() == Result.DENY)
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return syphonFromNetwork(event.ownerNetwork, event.drainAmount) >= damageToBeDone;
|
||
|
}
|
||
|
|
||
|
public static int getCurrentMaxOrb(String ownerName)
|
||
|
{
|
||
|
if (MinecraftServer.getServer() == null)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
World world = MinecraftServer.getServer().worldServers[0];
|
||
|
LifeEssenceNetwork data = (LifeEssenceNetwork) world.loadItemData(LifeEssenceNetwork.class, ownerName);
|
||
|
|
||
|
if (data == null)
|
||
|
{
|
||
|
data = new LifeEssenceNetwork(ownerName);
|
||
|
world.setItemData(ownerName, data);
|
||
|
}
|
||
|
|
||
|
return data.maxOrb;
|
||
|
}
|
||
|
|
||
|
public static void setMaxOrbToMax(String ownerName, int maxOrb)
|
||
|
{
|
||
|
if (MinecraftServer.getServer() == null)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
World world = MinecraftServer.getServer().worldServers[0];
|
||
|
LifeEssenceNetwork data = (LifeEssenceNetwork) world.loadItemData(LifeEssenceNetwork.class, ownerName);
|
||
|
|
||
|
if (data == null)
|
||
|
{
|
||
|
data = new LifeEssenceNetwork(ownerName);
|
||
|
world.setItemData(ownerName, data);
|
||
|
}
|
||
|
|
||
|
data.maxOrb = Math.max(maxOrb, data.maxOrb);
|
||
|
data.markDirty();
|
||
|
}
|
||
|
|
||
|
public static int getMaximumForOrbTier(int maxOrb)
|
||
|
{
|
||
|
switch(maxOrb)
|
||
|
{
|
||
|
case 1:
|
||
|
return 5000;
|
||
|
case 2:
|
||
|
return 25000;
|
||
|
case 3:
|
||
|
return 150000;
|
||
|
case 4:
|
||
|
return 1000000;
|
||
|
case 5:
|
||
|
return 10000000;
|
||
|
case 6:
|
||
|
return 30000000;
|
||
|
default:
|
||
|
return 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static int syphonFromNetwork(ItemStack ist, int damageToBeDone)
|
||
|
{
|
||
|
if (ist.getTagCompound() != null && !(ist.getTagCompound().getString("ownerName").equals("")))
|
||
|
{
|
||
|
String ownerName = ist.getTagCompound().getString("ownerName");
|
||
|
|
||
|
return syphonFromNetwork(ownerName, damageToBeDone);
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
public static int syphonFromNetwork(String ownerName, int damageToBeDone)
|
||
|
{
|
||
|
if (MinecraftServer.getServer() == null)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
World world = MinecraftServer.getServer().worldServers[0];
|
||
|
LifeEssenceNetwork data = (LifeEssenceNetwork) world.loadItemData(LifeEssenceNetwork.class, ownerName);
|
||
|
|
||
|
if (data == null)
|
||
|
{
|
||
|
data = new LifeEssenceNetwork(ownerName);
|
||
|
world.setItemData(ownerName, data);
|
||
|
}
|
||
|
|
||
|
if (data.currentEssence >= damageToBeDone)
|
||
|
{
|
||
|
data.currentEssence -= damageToBeDone;
|
||
|
data.markDirty();
|
||
|
return damageToBeDone;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Master method used to syphon from the player's network, and will damage them accordingly if they do not have enough LP.
|
||
|
* Does not drain on the client side.
|
||
|
*
|
||
|
* @param ist Owned itemStack
|
||
|
* @param player Player using the item
|
||
|
* @param damageToBeDone
|
||
|
* @return True if the action should be executed and false if it should not. Always returns false if client-sided.
|
||
|
*/
|
||
|
public static boolean syphonAndDamageFromNetwork(ItemStack ist, EntityPlayer player, int drain)
|
||
|
{
|
||
|
if (player.worldObj.isRemote)
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if (ist.getTagCompound() != null && !(ist.getTagCompound().getString("ownerName").equals("")))
|
||
|
{
|
||
|
String ownerName = ist.getTagCompound().getString("ownerName");
|
||
|
|
||
|
ItemDrainNetworkEvent event = new ItemDrainNetworkEvent(player, ownerName, ist, drain);
|
||
|
|
||
|
if(MinecraftForge.EVENT_BUS.post(event))
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
int drainAmount = syphonFromNetwork(event.ownerNetwork, event.drainAmount);
|
||
|
if(drainAmount == 0 || event.shouldDamage)
|
||
|
{
|
||
|
hurtPlayer(player, event.damageAmount);
|
||
|
}
|
||
|
|
||
|
return (event.getResult() != Event.Result.DENY); //The event has been told to prevent the action but allow all repercussions of using the item.
|
||
|
}
|
||
|
|
||
|
int amount = SoulNetworkHandler.syphonFromNetwork(ist, drain);
|
||
|
|
||
|
hurtPlayer(player, drain - amount);
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
public static boolean syphonAndDamageFromNetwork(String ownerName, EntityPlayer player, int damageToBeDone)
|
||
|
{
|
||
|
if (player.worldObj.isRemote)
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
World world = player.worldObj;
|
||
|
if (world != null)
|
||
|
{
|
||
|
double posX = player.posX;
|
||
|
double posY = player.posY;
|
||
|
double posZ = player.posZ;
|
||
|
|
||
|
world.playSoundEffect((double) ((float) player.posX + 0.5F), (double) ((float) player.posY + 0.5F), (double) ((float) player.posZ + 0.5F), "random.fizz", 0.5F, 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F);
|
||
|
}
|
||
|
|
||
|
int amount = SoulNetworkHandler.syphonFromNetwork(ownerName, damageToBeDone);
|
||
|
|
||
|
hurtPlayer(player, damageToBeDone - amount);
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
public static boolean canSyphonFromOnlyNetwork(ItemStack ist, int damageToBeDone)
|
||
|
{
|
||
|
if (ist.getTagCompound() != null && !(ist.getTagCompound().getString("ownerName").equals("")))
|
||
|
{
|
||
|
String ownerName = ist.getTagCompound().getString("ownerName");
|
||
|
|
||
|
return canSyphonFromOnlyNetwork(ownerName, damageToBeDone);
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
public static boolean canSyphonFromOnlyNetwork(String ownerName, int damageToBeDone)
|
||
|
{
|
||
|
if (MinecraftServer.getServer() == null)
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
World world = MinecraftServer.getServer().worldServers[0];
|
||
|
LifeEssenceNetwork data = (LifeEssenceNetwork) world.loadItemData(LifeEssenceNetwork.class, ownerName);
|
||
|
|
||
|
if (data == null)
|
||
|
{
|
||
|
data = new LifeEssenceNetwork(ownerName);
|
||
|
world.setItemData(ownerName, data);
|
||
|
}
|
||
|
|
||
|
return data.currentEssence >= damageToBeDone;
|
||
|
}
|
||
|
|
||
|
public static int getCurrentEssence(String ownerName)
|
||
|
{
|
||
|
if (MinecraftServer.getServer() == null)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
World world = MinecraftServer.getServer().worldServers[0];
|
||
|
LifeEssenceNetwork data = (LifeEssenceNetwork) world.loadItemData(LifeEssenceNetwork.class, ownerName);
|
||
|
|
||
|
if (data == null)
|
||
|
{
|
||
|
data = new LifeEssenceNetwork(ownerName);
|
||
|
world.setItemData(ownerName, data);
|
||
|
}
|
||
|
|
||
|
return data.currentEssence;
|
||
|
}
|
||
|
|
||
|
public static void setCurrentEssence(String ownerName, int essence)
|
||
|
{
|
||
|
if (MinecraftServer.getServer() == null)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
World world = MinecraftServer.getServer().worldServers[0];
|
||
|
LifeEssenceNetwork data = (LifeEssenceNetwork) world.loadItemData(LifeEssenceNetwork.class, ownerName);
|
||
|
|
||
|
if (data == null)
|
||
|
{
|
||
|
data = new LifeEssenceNetwork(ownerName);
|
||
|
world.setItemData(ownerName, data);
|
||
|
}
|
||
|
|
||
|
data.currentEssence = essence;
|
||
|
data.markDirty();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* A method to add to an owner's network up to a maximum value.
|
||
|
*
|
||
|
* @param ownerName
|
||
|
* @param addedEssence
|
||
|
* @param maximum
|
||
|
* @return amount added to the network
|
||
|
*/
|
||
|
public static int addCurrentEssenceToMaximum(String ownerName, int addedEssence, int maximum)
|
||
|
{
|
||
|
AddToNetworkEvent event = new AddToNetworkEvent(ownerName, addedEssence, maximum);
|
||
|
|
||
|
if(MinecraftForge.EVENT_BUS.post(event))
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
if (MinecraftServer.getServer() == null)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
World world = MinecraftServer.getServer().worldServers[0];
|
||
|
LifeEssenceNetwork data = (LifeEssenceNetwork) world.loadItemData(LifeEssenceNetwork.class, event.ownerNetwork);
|
||
|
|
||
|
if (data == null)
|
||
|
{
|
||
|
data = new LifeEssenceNetwork(event.ownerNetwork);
|
||
|
world.setItemData(event.ownerNetwork, data);
|
||
|
}
|
||
|
|
||
|
int currEss = data.currentEssence;
|
||
|
|
||
|
if (currEss >= event.maximum)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
int newEss = Math.min(event.maximum, currEss + event.addedAmount);
|
||
|
if(event.getResult() != Event.Result.DENY)
|
||
|
{
|
||
|
data.currentEssence = newEss;
|
||
|
}
|
||
|
|
||
|
return newEss - currEss;
|
||
|
}
|
||
|
|
||
|
public static void hurtPlayer(EntityPlayer user, int energySyphoned)
|
||
|
{
|
||
|
if (energySyphoned < 100 && energySyphoned > 0)
|
||
|
{
|
||
|
if (!user.capabilities.isCreativeMode)
|
||
|
{
|
||
|
user.setHealth((user.getHealth() - 1));
|
||
|
|
||
|
if (user.getHealth() <= 0.0005f)
|
||
|
{
|
||
|
user.onDeath(DamageSource.generic);
|
||
|
}
|
||
|
}
|
||
|
} else if (energySyphoned >= 100)
|
||
|
{
|
||
|
if (!user.capabilities.isCreativeMode)
|
||
|
{
|
||
|
for (int i = 0; i < ((energySyphoned + 99) / 100); i++)
|
||
|
{
|
||
|
user.setHealth((user.getHealth() - 1));
|
||
|
|
||
|
if (user.getHealth() <= 0.0005f)
|
||
|
{
|
||
|
user.onDeath(DamageSource.generic);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static void hurtPlayer(EntityPlayer user, float damage)
|
||
|
{
|
||
|
if (!user.capabilities.isCreativeMode)
|
||
|
{
|
||
|
user.setHealth((user.getHealth() - damage));
|
||
|
|
||
|
if (user.getHealth() <= 0.0005f)
|
||
|
{
|
||
|
user.onDeath(DamageSource.generic);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static void checkAndSetItemOwner(ItemStack item, EntityPlayer player)
|
||
|
{
|
||
|
if (item.stackTagCompound == null)
|
||
|
{
|
||
|
item.setTagCompound(new NBTTagCompound());
|
||
|
}
|
||
|
|
||
|
if (item.stackTagCompound.getString("ownerName").equals(""))
|
||
|
{
|
||
|
ItemBindEvent event = new ItemBindEvent(player, SoulNetworkHandler.getUsername(player), item);
|
||
|
|
||
|
if(!MinecraftForge.EVENT_BUS.post(event))
|
||
|
{
|
||
|
item.stackTagCompound.setString("ownerName", event.key);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static void checkAndSetItemOwner(ItemStack item, String ownerName)
|
||
|
{
|
||
|
if (item.stackTagCompound == null)
|
||
|
{
|
||
|
item.setTagCompound(new NBTTagCompound());
|
||
|
}
|
||
|
|
||
|
if (item.stackTagCompound.getString("ownerName").equals(""))
|
||
|
{
|
||
|
item.stackTagCompound.setString("ownerName", ownerName);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static String getUsername(EntityPlayer player)
|
||
|
{
|
||
|
return player.getDisplayName();
|
||
|
}
|
||
|
|
||
|
public static EntityPlayer getPlayerForUsername(String str)
|
||
|
{
|
||
|
if (MinecraftServer.getServer() == null)
|
||
|
{
|
||
|
return null;
|
||
|
}
|
||
|
return MinecraftServer.getServer().getConfigurationManager().func_152612_a(str);
|
||
|
}
|
||
|
|
||
|
public static void causeNauseaToPlayer(ItemStack stack)
|
||
|
{
|
||
|
if (stack.getTagCompound() != null && !(stack.getTagCompound().getString("ownerName").equals("")))
|
||
|
{
|
||
|
String ownerName = stack.getTagCompound().getString("ownerName");
|
||
|
|
||
|
SoulNetworkHandler.causeNauseaToPlayer(ownerName);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static void causeNauseaToPlayer(String ownerName)
|
||
|
{
|
||
|
EntityPlayer entityOwner = SoulNetworkHandler.getPlayerForUsername(ownerName);
|
||
|
|
||
|
if (entityOwner == null)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80));
|
||
|
}
|
||
|
|
||
|
public static String getOwnerName(ItemStack item)
|
||
|
{
|
||
|
if (item.stackTagCompound == null)
|
||
|
{
|
||
|
item.setTagCompound(new NBTTagCompound());
|
||
|
}
|
||
|
|
||
|
return item.stackTagCompound.getString("ownerName");
|
||
|
}
|
||
|
}
|