mirror of
https://github.com/Sollace/Unicopia.git
synced 2025-03-28 22:07:46 +01:00
Implement the clingy enchantment
This commit is contained in:
parent
b18cc97c19
commit
fbbbe9a5c1
3 changed files with 73 additions and 4 deletions
|
@ -1,15 +1,26 @@
|
||||||
package com.minelittlepony.unicopia.entity;
|
package com.minelittlepony.unicopia.entity;
|
||||||
|
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
import com.minelittlepony.unicopia.Owned;
|
import com.minelittlepony.unicopia.Owned;
|
||||||
import com.minelittlepony.unicopia.Race;
|
import com.minelittlepony.unicopia.Race;
|
||||||
|
import com.minelittlepony.unicopia.item.enchantment.UEnchantments;
|
||||||
|
import com.minelittlepony.unicopia.util.VecHelper;
|
||||||
|
|
||||||
|
import net.minecraft.enchantment.EnchantmentHelper;
|
||||||
import net.minecraft.entity.ItemEntity;
|
import net.minecraft.entity.ItemEntity;
|
||||||
|
import net.minecraft.entity.MovementType;
|
||||||
import net.minecraft.entity.data.DataTracker;
|
import net.minecraft.entity.data.DataTracker;
|
||||||
import net.minecraft.entity.data.TrackedData;
|
import net.minecraft.entity.data.TrackedData;
|
||||||
import net.minecraft.entity.data.TrackedDataHandlerRegistry;
|
import net.minecraft.entity.data.TrackedDataHandlerRegistry;
|
||||||
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
|
import net.minecraft.particle.ParticleEffect;
|
||||||
|
import net.minecraft.particle.ParticleTypes;
|
||||||
import net.minecraft.util.ActionResult;
|
import net.minecraft.util.ActionResult;
|
||||||
|
import net.minecraft.util.math.Vec3d;
|
||||||
|
|
||||||
public class ItemImpl implements Equine<ItemEntity>, Owned<ItemEntity> {
|
public class ItemImpl implements Equine<ItemEntity>, Owned<ItemEntity> {
|
||||||
private static final TrackedData<Integer> ITEM_RACE = DataTracker.registerData(ItemEntity.class, TrackedDataHandlerRegistry.INTEGER);
|
private static final TrackedData<Integer> ITEM_RACE = DataTracker.registerData(ItemEntity.class, TrackedDataHandlerRegistry.INTEGER);
|
||||||
|
@ -42,8 +53,41 @@ public class ItemImpl implements Equine<ItemEntity>, Owned<ItemEntity> {
|
||||||
|
|
||||||
ItemStack stack = owner.getStack();
|
ItemStack stack = owner.getStack();
|
||||||
|
|
||||||
if (!stack.isEmpty() && stack.getItem() instanceof TickableItem) {
|
if (!stack.isEmpty()) {
|
||||||
return ((TickableItem)stack.getItem()).onGroundTick((IItemEntity)owner) == ActionResult.SUCCESS;
|
|
||||||
|
Item item = stack.getItem();
|
||||||
|
ClingyItem clingy = item instanceof ClingyItem ? (ClingyItem)item : ClingyItem.DEFAULT;
|
||||||
|
|
||||||
|
IItemEntity i = (IItemEntity)owner;
|
||||||
|
|
||||||
|
if (clingy.isClingy(stack)) {
|
||||||
|
Random rng = owner.world.random;
|
||||||
|
|
||||||
|
owner.world.addParticle(clingy.getParticleEffect((IItemEntity)owner),
|
||||||
|
owner.getX() + rng.nextFloat() - 0.5,
|
||||||
|
owner.getY() + rng.nextFloat() - 0.5,
|
||||||
|
owner.getZ() + rng.nextFloat() - 0.5,
|
||||||
|
0, 0, 0
|
||||||
|
);
|
||||||
|
|
||||||
|
Vec3d position = owner.getPos();
|
||||||
|
VecHelper.findInRange(owner, owner.world, owner.getPos(), clingy.getFollowDistance(i), e -> e instanceof PlayerEntity)
|
||||||
|
.stream()
|
||||||
|
.sorted((a, b) -> (int)(a.getPos().distanceTo(position) - b.getPos().distanceTo(position)))
|
||||||
|
.findFirst()
|
||||||
|
.ifPresent(player -> {
|
||||||
|
owner.move(MovementType.SELF, player.getPos().subtract(owner.getPos()).multiply(clingy.getFollowSpeed(i)));
|
||||||
|
if (owner.horizontalCollision) {
|
||||||
|
owner.move(MovementType.SELF, new Vec3d(0, owner.verticalCollision ? -0.3 : 0.3, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
clingy.interactWithPlayer(i, (PlayerEntity)player);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stack.getItem() instanceof TickableItem) {
|
||||||
|
return ((TickableItem)stack.getItem()).onGroundTick(i) == ActionResult.SUCCESS;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -70,7 +114,6 @@ public class ItemImpl implements Equine<ItemEntity>, Owned<ItemEntity> {
|
||||||
physics.toNBT(compound);
|
physics.toNBT(compound);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void fromNBT(CompoundTag compound) {
|
public void fromNBT(CompoundTag compound) {
|
||||||
setSpecies(Race.fromName(compound.getString("owner_species")));
|
setSpecies(Race.fromName(compound.getString("owner_species")));
|
||||||
|
@ -90,4 +133,28 @@ public class ItemImpl implements Equine<ItemEntity>, Owned<ItemEntity> {
|
||||||
public interface TickableItem {
|
public interface TickableItem {
|
||||||
ActionResult onGroundTick(IItemEntity entity);
|
ActionResult onGroundTick(IItemEntity entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public interface ClingyItem {
|
||||||
|
ClingyItem DEFAULT = stack -> {
|
||||||
|
return EnchantmentHelper.getLevel(UEnchantments.CLINGY, stack) > 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
boolean isClingy(ItemStack stack);
|
||||||
|
|
||||||
|
default ParticleEffect getParticleEffect(IItemEntity entity) {
|
||||||
|
return ParticleTypes.AMBIENT_ENTITY_EFFECT;
|
||||||
|
}
|
||||||
|
|
||||||
|
default float getFollowDistance(IItemEntity entity) {
|
||||||
|
return 6 * (1 + EnchantmentHelper.getLevel(UEnchantments.CLINGY, entity.get().getMaster().getStack()));
|
||||||
|
}
|
||||||
|
|
||||||
|
default float getFollowSpeed(IItemEntity entity) {
|
||||||
|
return Math.min(1, 0.02F * (1 + EnchantmentHelper.getLevel(UEnchantments.CLINGY, entity.get().getMaster().getStack())));
|
||||||
|
}
|
||||||
|
|
||||||
|
default void interactWithPlayer(IItemEntity entity, PlayerEntity player) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,7 +75,7 @@ public interface UEnchantments {
|
||||||
/**
|
/**
|
||||||
* This item just wants to be held.
|
* This item just wants to be held.
|
||||||
*/
|
*/
|
||||||
Enchantment CLINGY = register("clingy", new SimpleEnchantment(Rarity.VERY_RARE, true, 1, EquipmentSlot.values()));
|
Enchantment CLINGY = register("clingy", new SimpleEnchantment(Rarity.VERY_RARE, true, 6, EquipmentSlot.values()));
|
||||||
|
|
||||||
static void bootstrap() { }
|
static void bootstrap() { }
|
||||||
|
|
||||||
|
|
|
@ -166,6 +166,8 @@
|
||||||
|
|
||||||
"enchantment.unicopia.gem_location": "Gem Locator",
|
"enchantment.unicopia.gem_location": "Gem Locator",
|
||||||
"enchantment.unicopia.padded": "Padded",
|
"enchantment.unicopia.padded": "Padded",
|
||||||
|
"enchantment.unicopia.clingy": "Clings",
|
||||||
|
"enchantment.unicopia.repulsion": "Repulsive",
|
||||||
"enchantment.unicopia.heavy": "Heavy",
|
"enchantment.unicopia.heavy": "Heavy",
|
||||||
"enchantment.unicopia.collaborator": "Collaborator",
|
"enchantment.unicopia.collaborator": "Collaborator",
|
||||||
"enchantment.unicopia.desired": "Want It Need It",
|
"enchantment.unicopia.desired": "Want It Need It",
|
||||||
|
|
Loading…
Add table
Reference in a new issue