2018-09-12 01:29:49 +02:00
|
|
|
package com.minelittlepony.unicopia.power;
|
|
|
|
|
2019-02-02 17:50:15 +01:00
|
|
|
import javax.annotation.Nullable;
|
|
|
|
|
2018-09-12 01:29:49 +02:00
|
|
|
import com.minelittlepony.unicopia.Race;
|
|
|
|
import com.minelittlepony.unicopia.input.IKeyBind;
|
2019-01-28 18:42:18 +01:00
|
|
|
import com.minelittlepony.unicopia.particle.Particles;
|
2018-09-12 01:29:49 +02:00
|
|
|
import com.minelittlepony.unicopia.player.IPlayer;
|
2018-09-12 22:37:06 +02:00
|
|
|
import com.minelittlepony.util.shape.IShape;
|
|
|
|
import com.minelittlepony.util.shape.Sphere;
|
2018-09-12 01:29:49 +02:00
|
|
|
|
2019-02-07 12:32:55 +01:00
|
|
|
import net.minecraft.entity.Entity;
|
2018-09-12 22:37:06 +02:00
|
|
|
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 {
|
|
|
|
|
2019-02-21 17:57:05 +01:00
|
|
|
static void spawnParticles(int particleId, Entity entity, int count, int...args) {
|
2018-09-13 14:04:24 +02:00
|
|
|
double halfDist = entity.getEyeHeight() / 1.5;
|
|
|
|
double middle = entity.getEntityBoundingBox().minY + halfDist;
|
2018-09-12 01:29:49 +02:00
|
|
|
|
2019-02-12 15:34:21 +01:00
|
|
|
IShape shape = new Sphere(false, (float)halfDist + entity.width);
|
2018-09-12 22:37:06 +02:00
|
|
|
|
2018-09-12 01:29:49 +02:00
|
|
|
for (int i = 0; i < count; i++) {
|
2018-09-13 14:04:24 +02:00
|
|
|
Vec3d point = shape.computePoint(entity.getEntityWorld().rand);
|
2018-09-12 01:29:49 +02:00
|
|
|
|
|
|
|
Particles.instance().spawnParticle(particleId, false,
|
2018-09-13 14:04:24 +02:00
|
|
|
entity.posX + point.x,
|
2018-09-12 22:37:06 +02:00
|
|
|
middle + point.y,
|
2018-09-13 14:04:24 +02:00
|
|
|
entity.posZ + point.z,
|
2019-02-21 17:57:05 +01:00
|
|
|
0, 0, 0, args);
|
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
|
|
|
|
* @return Data to be sent, or null if activation failed
|
|
|
|
*/
|
2019-02-02 17:50:15 +01:00
|
|
|
@Nullable
|
2019-02-03 10:45:45 +01:00
|
|
|
T tryActivate(IPlayer player);
|
2018-09-12 01:29:49 +02:00
|
|
|
|
|
|
|
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
|
|
|
|
*/
|
2019-02-03 10:45:45 +01:00
|
|
|
void apply(IPlayer player, T data);
|
2018-09-12 01:29:49 +02:00
|
|
|
|
|
|
|
/**
|
2019-02-03 10:45:45 +01:00
|
|
|
* Called every tick until the warmup timer runs out.
|
2018-09-12 01:29:49 +02:00
|
|
|
* @param player The current player
|
|
|
|
*/
|
2018-09-13 14:04:24 +02:00
|
|
|
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
|
|
|
|
*/
|
2018-09-13 14:04:24 +02:00
|
|
|
void postApply(IPlayer player);
|
2018-09-12 01:29:49 +02:00
|
|
|
|
|
|
|
}
|