Added a way to obtain both the rain cloud and storm cloud jars

This commit is contained in:
Sollace 2021-02-19 18:10:49 +02:00
parent fc5b50a975
commit 52f62516fa
5 changed files with 132 additions and 1 deletions

View file

@ -26,6 +26,7 @@ public interface Abilities {
// pegasus // pegasus
Ability<?> RAINBOOM = register(new PegasusRainboomAbility(), "rainboom", AbilitySlot.PRIMARY); Ability<?> RAINBOOM = register(new PegasusRainboomAbility(), "rainboom", AbilitySlot.PRIMARY);
Ability<?> CAPTURE_CLOUD = register(new PegasusCaptureStormAbility(), "capture_cloud", AbilitySlot.SECONDARY);
// pegasus / bat / alicorn / changeling // pegasus / bat / alicorn / changeling
Ability<?> CARRY = register(new CarryAbility(), "carry", AbilitySlot.PASSIVE); Ability<?> CARRY = register(new CarryAbility(), "carry", AbilitySlot.PASSIVE);

View file

@ -0,0 +1,124 @@
package com.minelittlepony.unicopia.ability;
import javax.annotation.Nullable;
import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.ability.data.Hit;
import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.item.UItems;
import com.minelittlepony.unicopia.particle.MagicParticleEffect;
import net.minecraft.item.ItemStack;
import net.minecraft.network.packet.s2c.play.GameStateChangeS2CPacket;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.Hand;
import net.minecraft.world.World;
import net.minecraft.world.level.ServerWorldProperties;
/**
* Pegasus ability to capture a storm and store it in a jar
*/
public class PegasusCaptureStormAbility implements Ability<Hit> {
@Override
public int getWarmupTime(Pony player) {
return 9;
}
@Override
public int getCooldownTime(Pony player) {
return 6;
}
@Override
public boolean canUse(Race race) {
return race.canInteractWithClouds();
}
@Nullable
@Override
public Hit tryActivate(Pony player) {
if (!player.getMaster().isCreative() && player.getMagicalReserves().getMana().getPercentFill() < 0.2F) {
return null;
}
return Hit.INSTANCE;
}
@Override
public Hit.Serializer<Hit> getSerializer() {
return Hit.SERIALIZER;
}
@Override
public double getCostEstimate(Pony player) {
return player.getMagicalReserves().getMana().getMax() * 0.9F;
}
@Override
public void apply(Pony player, Hit data) {
World w = player.getWorld();
ItemStack stack = player.getMaster().getStackInHand(Hand.MAIN_HAND);
boolean thundering = w.isThundering();
if (stack.getItem() != UItems.EMPTY_JAR) {
tell(player, "ability.unicopia.empty_hooves");
} else if (!w.isSkyVisible(player.getOrigin())) {
tell(player, "ability.unicopia.indoors");
} else if (!(w.isRaining() || thundering)) {
tell(player, "ability.unicopia.clear_skies");
} else if (player.getOrigin().getY() < 120) {
tell(player, "ability.unicopia.too_low");
} else {
if (!player.getMaster().abilities.creativeMode) {
stack.decrement(1);
}
if (thundering && w.random.nextBoolean()) {
player.getMaster().giveItemStack(UItems.STORM_CLOUD_JAR.getDefaultStack());
if (w instanceof ServerWorld) {
ServerWorldProperties props = (ServerWorldProperties)w.getLevelProperties();
int timer = (int)Math.floor(props.getRainTime() * 0.1);
props.setThundering(timer > 0);
props.setClearWeatherTime((int)(w.random.nextFloat() * 150000));
props.setThunderTime(timer);
((ServerWorld)w).getServer().getPlayerManager().sendToDimension(new GameStateChangeS2CPacket(GameStateChangeS2CPacket.THUNDER_GRADIENT_CHANGED, w.getRainGradient(1)), w.getRegistryKey());
}
} else {
player.getMaster().giveItemStack(UItems.RAIN_CLOUD_JAR.getDefaultStack());
if (w instanceof ServerWorld) {
ServerWorldProperties props = (ServerWorldProperties)w.getLevelProperties();
int timer = (int)Math.floor(props.getRainTime() * 0.1);
props.setRaining(timer > 0);
props.setClearWeatherTime((int)(w.random.nextFloat() * 150000));
props.setRainTime(timer);
((ServerWorld)w).getServer().getPlayerManager().sendToDimension(new GameStateChangeS2CPacket(GameStateChangeS2CPacket.RAIN_GRADIENT_CHANGED, w.getRainGradient(1)), w.getRegistryKey());
}
}
}
}
private void tell(Pony player, String translation) {
player.getMaster().sendMessage(new TranslatableText(translation), true);
}
@Override
public void preApply(Pony player, AbilitySlot slot) {
player.getMagicalReserves().getExertion().add(6);
}
@Override
public void postApply(Pony player, AbilitySlot slot) {
player.spawnParticles(MagicParticleEffect.UNICORN, 5);
}
}

View file

@ -13,7 +13,7 @@ import com.minelittlepony.unicopia.particle.UParticles;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
/** /**
* Changeling ability to restore health from mobs * Pegasus ability to perform rainbooms
*/ */
public class PegasusRainboomAbility implements Ability<Hit> { public class PegasusRainboomAbility implements Ability<Hit> {

View file

@ -2,6 +2,11 @@
"block.unicopia.bed.not_safe": "You may not rest here, there are enemies nearby", "block.unicopia.bed.not_safe": "You may not rest here, there are enemies nearby",
"ability.unicopia.empty_hooves": "I need to find a jar",
"ability.unicopia.indoors": "I can't see the sky from here",
"ability.unicopia.too_low": "I need to get higher up",
"ability.unicopia.clear_skies": "The skies already look pretty clear",
"itemGroup.unicopia.items": "Unicopia - Misc.", "itemGroup.unicopia.items": "Unicopia - Misc.",
"itemGroup.unicopia.horsefeed": "Unicopia - Horse Feed", "itemGroup.unicopia.horsefeed": "Unicopia - Horse Feed",
@ -151,6 +156,7 @@
"ability.unicopia.hang": "Cling to Ceiling", "ability.unicopia.hang": "Cling to Ceiling",
"ability.unicopia.eee": "Deafening Screech", "ability.unicopia.eee": "Deafening Screech",
"ability.unicopia.feed": "Collect Love", "ability.unicopia.feed": "Collect Love",
"ability.unicopia.capture_cloud": "Cloudbust",
"ability.unicopia.disguise": "Shapeshift", "ability.unicopia.disguise": "Shapeshift",
"ability.unicopia.rainboom": "Sonic Rainboom", "ability.unicopia.rainboom": "Sonic Rainboom",

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB