Unicopia/src/main/java/com/minelittlepony/unicopia/item/ZapAppleItem.java

152 lines
5.6 KiB
Java
Raw Normal View History

package com.minelittlepony.unicopia.item;
2020-01-27 11:05:22 +01:00
import static com.minelittlepony.unicopia.item.toxin.Toxin.INNERT;
2020-09-27 20:07:55 +02:00
import java.util.Optional;
2020-04-26 10:10:37 +02:00
import com.minelittlepony.unicopia.UTags;
2022-03-26 20:34:15 +01:00
import com.minelittlepony.unicopia.Unicopia;
2021-08-19 00:49:02 +02:00
import com.minelittlepony.unicopia.advancement.UCriteria;
2022-03-26 20:34:15 +01:00
import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.item.toxin.Ailment;
import com.minelittlepony.unicopia.item.toxin.Toxic;
import com.minelittlepony.unicopia.item.toxin.ToxicHolder;
import com.minelittlepony.unicopia.item.toxin.Toxicity;
import com.minelittlepony.unicopia.particle.ParticleUtils;
import com.minelittlepony.unicopia.particle.UParticles;
import com.minelittlepony.unicopia.util.MagicalDamageSource;
2020-09-27 20:07:55 +02:00
import com.minelittlepony.unicopia.util.RayTraceHelper;
2022-03-26 20:34:15 +01:00
import com.minelittlepony.unicopia.util.Registries;
2020-01-27 11:05:22 +01:00
import net.minecraft.entity.Entity;
2020-06-26 11:44:47 +02:00
import net.minecraft.entity.EntityType;
2020-01-27 11:05:22 +01:00
import net.minecraft.entity.LightningEntity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.mob.CreeperEntity;
import net.minecraft.entity.passive.PigEntity;
import net.minecraft.entity.passive.VillagerEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
2020-01-27 11:05:22 +01:00
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack;
2020-09-27 20:07:55 +02:00
import net.minecraft.predicate.entity.EntityPredicates;
2021-08-19 00:49:02 +02:00
import net.minecraft.server.network.ServerPlayerEntity;
2020-01-27 11:05:22 +01:00
import net.minecraft.server.world.ServerWorld;
import net.minecraft.text.Text;
2020-01-27 11:05:22 +01:00
import net.minecraft.util.ActionResult;
2020-06-26 11:44:47 +02:00
import net.minecraft.util.collection.DefaultedList;
import net.minecraft.util.math.Vec3d;
2020-01-27 11:05:22 +01:00
import net.minecraft.util.Hand;
import net.minecraft.util.Rarity;
import net.minecraft.util.TypedActionResult;
import net.minecraft.util.registry.Registry;
import net.minecraft.world.World;
import net.minecraft.world.event.GameEvent;
2020-01-27 11:05:22 +01:00
public class ZapAppleItem extends Item implements ChameleonItem, ToxicHolder {
private static final Optional<Toxic> TOXIC = Optional.of(new Toxic.Builder(Ailment.of(Toxicity.SEVERE, INNERT)).build("zap"));
private static final Optional<Toxic> HIDDEN_TOXIC = Optional.of(new Toxic.Builder(Ailment.of(Toxicity.SAFE, INNERT)).build("zap_hidden"));
2020-01-27 11:05:22 +01:00
public ZapAppleItem(Settings settings) {
super(settings);
2020-01-27 11:05:22 +01:00
}
@Override
public TypedActionResult<ItemStack> use(World world, PlayerEntity player, Hand hand) {
2020-09-27 20:07:55 +02:00
ItemStack stack = player.getStackInHand(hand);
2020-01-27 11:05:22 +01:00
Optional<Entity> entity = RayTraceHelper.doTrace(player, 5, 1, EntityPredicates.CAN_COLLIDE.and(e -> canFeedTo(stack, e))).getEntity();
2020-01-27 11:05:22 +01:00
2020-09-27 20:07:55 +02:00
if (entity.isPresent()) {
return onFedTo(stack, player, entity.get());
2020-01-27 11:05:22 +01:00
}
return super.use(world, player, hand);
}
@Override
public ItemStack finishUsing(ItemStack stack, World w, LivingEntity player) {
stack = super.finishUsing(stack, w, player);
player.damage(MagicalDamageSource.ZAP_APPLE, 120);
if (w instanceof ServerWorld) {
2020-06-26 11:44:47 +02:00
LightningEntity lightning = EntityType.LIGHTNING_BOLT.create(w);
lightning.refreshPositionAfterTeleport(player.getX(), player.getY(), player.getZ());
2020-06-26 11:44:47 +02:00
player.onStruckByLightning((ServerWorld)w, lightning);
2021-08-19 00:49:02 +02:00
if (player instanceof PlayerEntity) {
UCriteria.EAT_TRICK_APPLE.trigger((PlayerEntity)player);
}
2020-01-27 11:05:22 +01:00
}
player.emitGameEvent(GameEvent.LIGHTNING_STRIKE);
ParticleUtils.spawnParticle(w, UParticles.LIGHTNING_BOLT, player.getPos(), Vec3d.ZERO);
2020-01-27 11:05:22 +01:00
return stack;
}
public boolean canFeedTo(ItemStack stack, Entity e) {
return e instanceof VillagerEntity
|| e instanceof CreeperEntity
|| e instanceof PigEntity;
}
public TypedActionResult<ItemStack> onFedTo(ItemStack stack, PlayerEntity player, Entity e) {
2020-06-26 11:44:47 +02:00
LightningEntity lightning = EntityType.LIGHTNING_BOLT.create(e.world);
2021-08-19 00:49:02 +02:00
lightning.refreshPositionAfterTeleport(e.getX(), e.getY(), e.getZ());
lightning.setCosmetic(true);
if (player instanceof ServerPlayerEntity) {
lightning.setChanneler((ServerPlayerEntity)player);
}
2020-06-26 11:44:47 +02:00
if (e.world instanceof ServerWorld) {
e.onStruckByLightning((ServerWorld)e.world, lightning);
2021-08-19 00:49:02 +02:00
UCriteria.FEED_TRICK_APPLE.trigger(player);
}
2021-08-19 00:49:02 +02:00
player.world.spawnEntity(lightning);
2020-01-27 11:05:22 +01:00
2021-08-04 15:38:03 +02:00
if (!player.getAbilities().creativeMode) {
2020-01-27 11:05:22 +01:00
stack.decrement(1);
}
return new TypedActionResult<>(ActionResult.SUCCESS, stack);
}
@Override
public void appendStacks(ItemGroup tab, DefaultedList<ItemStack> items) {
super.appendStacks(tab, items);
if (isIn(tab)) {
2022-06-23 16:24:45 +02:00
Unicopia.SIDE.getPony().map(Pony::getReferenceWorld)
2022-03-26 20:34:15 +01:00
.stream()
.flatMap(world -> Registries.valuesForTag(world, UTags.APPLES))
.filter(a -> a != this).forEach(item -> {
ItemStack stack = new ItemStack(this);
stack.getOrCreateNbt().putString("appearance", Registry.ITEM.getId(item).toString());
items.add(stack);
});
2020-01-27 11:05:22 +01:00
}
}
@Override
public Text getName(ItemStack stack) {
return hasAppearance(stack) ? getAppearanceStack(stack).getName() : super.getName(stack);
2020-01-27 11:05:22 +01:00
}
@Override
public Optional<Toxic> getToxic(ItemStack stack) {
return hasAppearance(stack) ? TOXIC : HIDDEN_TOXIC;
2020-01-27 11:05:22 +01:00
}
@Override
public Rarity getRarity(ItemStack stack) {
if (hasAppearance(stack)) {
2020-01-27 11:05:22 +01:00
return Rarity.EPIC;
}
return Rarity.RARE;
}
}