Unicopia/src/main/java/com/minelittlepony/unicopia/power/IPower.java

128 lines
3.8 KiB
Java
Raw Normal View History

2018-09-12 01:29:49 +02:00
package com.minelittlepony.unicopia.power;
import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.client.particle.Particles;
import com.minelittlepony.unicopia.input.IKeyBind;
import com.minelittlepony.unicopia.player.IPlayer;
import com.minelittlepony.util.shape.IShape;
import com.minelittlepony.util.shape.Sphere;
2018-09-12 01:29:49 +02:00
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.DamageSource;
import net.minecraft.util.math.Vec3d;
2018-09-12 01:29:49 +02:00
import net.minecraft.world.World;
public interface IPower<T extends IData> extends IKeyBind {
/**
* Subtracts a given food amount from the player.
* Harms the player if there is not enough enough hunger available.
*/
static boolean takeFromPlayer(EntityPlayer player, double foodSubtract) {
if (!player.capabilities.isCreativeMode) {
int food = (int)(player.getFoodStats().getFoodLevel() - foodSubtract);
if (food < 0) {
player.getFoodStats().addStats(-player.getFoodStats().getFoodLevel(), 0);
player.attackEntityFrom(DamageSource.MAGIC, -food);
} else {
player.getFoodStats().addStats((int)-foodSubtract, 0);
}
}
return player.getHealth() > 0;
}
static double getPlayerEyeYPos(EntityPlayer player) {
if (player.getEntityWorld().isRemote) {
return player.posY + player.getEyeHeight() - player.getYOffset();
}
return player.posY + player.getEyeHeight() - 1;
}
static void spawnParticles(int particleId, IPlayer player, int count) {
EntityPlayer entity = player.getOwner();
double halfDist = entity.getEyeHeight() / 1.5;
double middle = entity.getEntityBoundingBox().minY + halfDist;
2018-09-12 01:29:49 +02:00
IShape shape = new Sphere(false, (float)halfDist);
2018-09-12 01:29:49 +02:00
for (int i = 0; i < count; i++) {
Vec3d point = shape.computePoint(entity.getEntityWorld().rand);
2018-09-12 01:29:49 +02:00
Particles.instance().spawnParticle(particleId, false,
entity.posX + point.x,
middle + point.y,
entity.posZ + point.z,
0, 0, 0);
2018-09-12 01:29:49 +02:00
}
}
@Override
default String getKeyCategory() {
return "unicopia.category.name";
}
/**
* Returns the number of ticks the player must hold the ability key to trigger this ability.
*/
int getWarmupTime(IPlayer player);
/**
* Returns the number of ticks allowed for cooldown
*/
int getCooldownTime(IPlayer player);
/**
* Called to check preconditions for activating the ability.
*
* @param w The world
* @param player The player
* @return True to allow activation
*/
default boolean canActivate(World w, IPlayer player) {
return true;
}
/**
* Checks if the given race is permitted to use this ability
* @param playerSpecies The player's species
*/
boolean canUse(Race playerSpecies);
/**
* Called on the client to activate the ability.
*
* @param player The player activating the ability
* @param w The player's world
* @return Data to be sent, or null if activation failed
*/
T tryActivate(EntityPlayer player, World w);
Class<T> getPackageType();
/**
* Called to actually apply the ability.
* Only called on the server side.
*
* @param player The player that triggered the ability
* @param data Data previously sent from the client
*/
void apply(EntityPlayer player, T data);
/**
* Called just before the ability is activated.
* @param player The current player
*/
void preApply(IPlayer player);
2018-09-12 01:29:49 +02:00
/**
* Called every tick until the cooldown timer runs out.
* @param player The current player
*/
void postApply(IPlayer player);
2018-09-12 01:29:49 +02:00
}