Add behaviour for sheep

This commit is contained in:
Sollace 2020-09-24 19:08:06 +02:00
parent 63cc8903c9
commit 2bb6df8b1b
13 changed files with 133 additions and 22 deletions

View file

@ -268,7 +268,7 @@ public class DisguiseSpell extends AbstractSpell implements AttachableSpell, Sup
entity.tick();
}
behaviour.update(source, entity);
behaviour.update(source, entity, this);
if (source instanceof Pony) {
Pony player = (Pony)source;

View file

@ -1,6 +1,7 @@
package com.minelittlepony.unicopia.entity.behaviour;
import com.minelittlepony.unicopia.ability.magic.Caster;
import com.minelittlepony.unicopia.ability.magic.Spell;
import com.minelittlepony.unicopia.entity.player.Pony;
import net.minecraft.entity.Entity;
@ -20,7 +21,7 @@ public class ChickenBehaviour extends EntityBehaviour<ChickenEntity> {
}
@Override
public void update(Caster<?> source, ChickenEntity entity) {
public void update(Caster<?> source, ChickenEntity entity, Spell spell) {
entity.eggLayTime = Integer.MAX_VALUE;
if (source instanceof Pony) {

View file

@ -1,11 +1,13 @@
package com.minelittlepony.unicopia.entity.behaviour;
import com.minelittlepony.unicopia.ability.magic.Caster;
import com.minelittlepony.unicopia.ability.magic.Spell;
import net.minecraft.entity.mob.CreeperEntity;
public class CreeperBehaviour extends EntityBehaviour<CreeperEntity> {
@Override
public void update(Caster<?> source, CreeperEntity entity) {
public void update(Caster<?> source, CreeperEntity entity, Spell spell) {
if (source.getEntity().isSneaking()) {
entity.setFuseSpeed(1);
} else {

View file

@ -1,6 +1,7 @@
package com.minelittlepony.unicopia.entity.behaviour;
import com.minelittlepony.unicopia.ability.magic.Caster;
import com.minelittlepony.unicopia.ability.magic.Spell;
import net.minecraft.block.Blocks;
import net.minecraft.entity.mob.EndermanEntity;
@ -10,7 +11,7 @@ import net.minecraft.util.Hand;
public class EndermanBehaviour extends EntityBehaviour<EndermanEntity> {
@Override
public void update(Caster<?> source, EndermanEntity entity) {
public void update(Caster<?> source, EndermanEntity entity, Spell spell) {
if (source.getOwner().isSneaking() || source.getOwner().isSprinting()) {
entity.setTarget(entity);
} else {

View file

@ -5,6 +5,7 @@ import java.util.function.Supplier;
import javax.annotation.Nullable;
import com.minelittlepony.unicopia.ability.magic.Caster;
import com.minelittlepony.unicopia.ability.magic.Spell;
import com.minelittlepony.unicopia.ability.magic.spell.DisguiseSpell;
import com.minelittlepony.unicopia.util.Registries;
@ -24,7 +25,7 @@ public class EntityBehaviour<T extends Entity> {
private static final EntityBehaviour<Entity> DEFAULT = new EntityBehaviour<>();
private static final Registry<EntityBehaviour<?>> REGISTRY = Registries.createSimple(new Identifier("unicopia", "entity_behaviour"));
public void update(Caster<?> source, T entity) {
public void update(Caster<?> source, T entity, Spell spell) {
}
@ -175,6 +176,7 @@ public class EntityBehaviour<T extends Entity> {
}
static {
register(SheepBehaviour::new, EntityType.SHEEP);
register(EndermanBehaviour::new, EntityType.ENDERMAN);
register(SpellcastingIllagerBehaviour::new, EntityType.ILLUSIONER, EntityType.EVOKER);
register(ShulkerBehaviour::new, EntityType.SHULKER);

View file

@ -1,6 +1,7 @@
package com.minelittlepony.unicopia.entity.behaviour;
import com.minelittlepony.unicopia.ability.magic.Caster;
import com.minelittlepony.unicopia.ability.magic.Spell;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.sound.MovingMinecartSoundInstance;
@ -18,7 +19,7 @@ public class MinecartBehaviour extends EntityBehaviour<AbstractMinecartEntity> {
}
@Override
public void update(Caster<?> source, AbstractMinecartEntity entity) {
public void update(Caster<?> source, AbstractMinecartEntity entity, Spell spell) {
entity.yaw -= 90;
entity.prevYaw -= 90;

View file

@ -0,0 +1,77 @@
package com.minelittlepony.unicopia.entity.behaviour;
import java.util.Random;
import com.minelittlepony.unicopia.ability.magic.Caster;
import com.minelittlepony.unicopia.ability.magic.Spell;
import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.mixin.MixinSheepEntity;
import com.minelittlepony.unicopia.util.WorldEvent;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.entity.ItemEntity;
import net.minecraft.entity.passive.SheepEntity;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.sound.SoundCategory;
import net.minecraft.sound.SoundEvents;
import net.minecraft.util.math.BlockPos;
public class SheepBehaviour extends EntityBehaviour<SheepEntity> {
@Override
public void update(Caster<?> source, SheepEntity entity, Spell spell) {
if (source instanceof Pony) {
Pony player = (Pony)source;
if (player.sneakingChanged()) {
BlockPos pos = entity.getBlockPos().down();
BlockState state = entity.world.getBlockState(pos);
boolean grass = state.isOf(Blocks.GRASS_BLOCK);
if (player.getOwner().isSneaking()) {
if (grass && entity.world.isClient && entity.isSheared()) {
entity.handleStatus((byte)10);
}
} else {
if (entity.isSheared() && grass) {
WorldEvent.play(WorldEvent.DESTROY_BLOCK, entity.world, pos, state);
entity.world.setBlockState(pos, Blocks.DIRT.getDefaultState(), 2);
entity.onEatingGrass();
} else if (!entity.isSheared()) {
ItemStack dropType = new ItemStack(MixinSheepEntity.getDrops().get(entity.getColor()).asItem());
player.getOwner().playSound(SoundEvents.ENTITY_SHEEP_SHEAR, SoundCategory.PLAYERS, 1, 1);
entity.setSheared(true);
Random rng = entity.world.random;
PlayerInventory inv = player.getOwner().inventory;
int dropAmount = rng.nextInt(3);
int slot;
do {
slot = inv.method_7371(dropType);
if (slot < 0) {
break;
}
inv.removeStack(slot, 1);
ItemEntity itemEntity = entity.dropItem(dropType.getItem(), 1);
if (itemEntity != null) {
itemEntity.setVelocity(itemEntity.getVelocity().add(
(rng.nextFloat() - rng.nextFloat()) * 0.1F,
rng.nextFloat() * 0.05F,
(rng.nextFloat() - rng.nextFloat()) * 0.1F
));
itemEntity.setPickupDelay(40);
}
} while (dropAmount-- > 0);
}
spell.setDirty(true);
}
}
}
}
}

View file

@ -1,6 +1,7 @@
package com.minelittlepony.unicopia.entity.behaviour;
import com.minelittlepony.unicopia.ability.magic.Caster;
import com.minelittlepony.unicopia.ability.magic.Spell;
import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.mixin.MixinShulkerEntity;
@ -15,7 +16,7 @@ import net.minecraft.util.math.Vec3d;
public class ShulkerBehaviour extends EntityBehaviour<ShulkerEntity> {
@Override
public void update(Caster<?> source, ShulkerEntity shulker) {
public void update(Caster<?> source, ShulkerEntity shulker, Spell spell) {
shulker.yaw = 0;
shulker.prevBodyYaw = 0;
shulker.bodyYaw = 0;

View file

@ -1,6 +1,7 @@
package com.minelittlepony.unicopia.entity.behaviour;
import com.minelittlepony.unicopia.ability.magic.Caster;
import com.minelittlepony.unicopia.ability.magic.Spell;
import com.minelittlepony.unicopia.block.state.StateMaps;
import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.util.WorldEvent;
@ -11,7 +12,7 @@ import net.minecraft.util.math.BlockPos;
public class SilverfishBehaviour extends EntityBehaviour<SilverfishEntity> {
@Override
public void update(Caster<?> source, SilverfishEntity entity) {
public void update(Caster<?> source, SilverfishEntity entity, Spell spell) {
if (source instanceof Pony && !source.isClient()) {
Pony player = (Pony)source;

View file

@ -1,13 +1,14 @@
package com.minelittlepony.unicopia.entity.behaviour;
import com.minelittlepony.unicopia.ability.magic.Caster;
import com.minelittlepony.unicopia.ability.magic.Spell;
import com.minelittlepony.unicopia.entity.player.Pony;
import net.minecraft.entity.mob.SpellcastingIllagerEntity;
public class SpellcastingIllagerBehaviour extends EntityBehaviour<SpellcastingIllagerEntity> {
@Override
public void update(Caster<?> source, SpellcastingIllagerEntity entity) {
public void update(Caster<?> source, SpellcastingIllagerEntity entity, Spell s) {
if (source instanceof Pony) {
Pony player = (Pony)source;

View file

@ -0,0 +1,18 @@
package com.minelittlepony.unicopia.mixin;
import java.util.Map;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import net.minecraft.entity.passive.SheepEntity;
import net.minecraft.item.ItemConvertible;
import net.minecraft.util.DyeColor;
@Mixin(SheepEntity.class)
public interface MixinSheepEntity {
@Accessor("DROPS")
static Map<DyeColor, ItemConvertible> getDrops() {
return null;
}
}

View file

@ -27,6 +27,9 @@ public class EffectSync {
private final TrackedData<CompoundTag> param;
@Nullable
private CompoundTag lastValue;
public EffectSync(Caster<?> owned, TrackedData<CompoundTag> param) {
this.owned = owned;
this.param = param;
@ -68,14 +71,18 @@ public class EffectSync {
@SuppressWarnings("unchecked")
public <E extends Spell> E get(Class<E> type, boolean update) {
if (!update) {
if (effect == null || type == null || type.isAssignableFrom(effect.getClass())) {
return (E)effect;
}
return null;
if (update) {
sync();
}
if (effect == null || type == null || type.isAssignableFrom(effect.getClass())) {
return (E)effect;
}
return null;
}
private void sync() {
CompoundTag comp = owned.getEntity().getDataTracker().get(param);
if (comp == null || !comp.contains("effect_id")) {
@ -83,6 +90,7 @@ public class EffectSync {
effect.setDead();
effect = null;
}
return;
} else {
String id = comp.getString("effect_id");
@ -92,17 +100,14 @@ public class EffectSync {
}
effect = SpellRegistry.instance().createEffectFromNBT(comp);
} else if (owned.getEntity().world.isClient()) {
effect.fromNBT(comp);
if (lastValue != comp || !(comp == null || comp.equals(lastValue))) {
lastValue = comp;
effect.fromNBT(comp);
}
} else if (effect.isDirty()) {
set(effect);
}
}
if (effect == null || type == null || type.isAssignableFrom(effect.getClass())) {
return (E)effect;
}
return null;
}
public void set(@Nullable Spell effect) {

View file

@ -13,6 +13,7 @@
"MixinPlayerEntity",
"MixinProjectileEntity",
"MixinServerPlayerEntity",
"MixinSheepEntity",
"MixinShulkerEntity",
"MixinTargetPredicate"
],