Skip to content

Commit

Permalink
stuff
Browse files Browse the repository at this point in the history
  • Loading branch information
TropheusJ committed Apr 1, 2024
1 parent 4c3bb98 commit 6b7be23
Show file tree
Hide file tree
Showing 8 changed files with 288 additions and 0 deletions.
43 changes: 43 additions & 0 deletions src/main/java/io/github/tropheusj/krill/Krill.java
Original file line number Diff line number Diff line change
@@ -1,18 +1,61 @@
package io.github.tropheusj.krill;

import io.github.tropheusj.krill.arrow.KrillArrowEntity;
import io.github.tropheusj.krill.entity.KrillEntity;
import net.fabricmc.api.ModInitializer;

import net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityTypeBuilder;
import net.minecraft.client.renderer.item.ItemProperties;
import net.minecraft.core.Registry;
import net.minecraft.core.component.DataComponents;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation;

import net.minecraft.world.effect.MobEffect;
import net.minecraft.world.effect.MobEffectCategory;
import net.minecraft.world.entity.EntityDimensions;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.MobCategory;
import net.minecraft.world.entity.ai.attributes.AttributeModifier;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ArrowItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.component.ChargedProjectiles;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Krill implements ModInitializer {
public static final String ID = "krill";
public static final Logger LOGGER = LoggerFactory.getLogger(ID);

public static final EntityType<KrillEntity> KRILL_TYPE = FabricEntityTypeBuilder.create()
.entityFactory(KrillEntity::new)
.spawnGroup(MobCategory.WATER_AMBIENT)
.dimensions(EntityDimensions.fixed(0.5f, 0.5f))
.build();

public static final EntityType<KrillArrowEntity> KRILL_ARROW_TYPE = FabricEntityTypeBuilder.create()
.entityFactory(KrillArrowEntity::new)
.dimensions(EntityDimensions.fixed(0.5f, 0.5f))
.build();

public static final Item KRILL_ARROW = new ArrowItem(new Item.Properties());

public static final MobEffect KRILLED = new MobEffect(MobEffectCategory.BENEFICIAL, 1){}.addAttributeModifier(
Attributes.SCALE, "5876bde6-b02e-42e9-84c4-e3317b37cb26",
-0.66, AttributeModifier.Operation.ADD_VALUE
);

@Override
public void onInitialize() {
Registry.register(BuiltInRegistries.ENTITY_TYPE, id("krill"), KRILL_TYPE);
Registry.register(BuiltInRegistries.ENTITY_TYPE, id("krill_arrow"), KRILL_ARROW_TYPE);
Registry.register(BuiltInRegistries.ITEM, id("krill_arrow"), KRILL_ARROW);
Registry.register(BuiltInRegistries.MOB_EFFECT, id("krilled"), KRILLED);
}

public static ResourceLocation id(String path) {
Expand Down
22 changes: 22 additions & 0 deletions src/main/java/io/github/tropheusj/krill/KrillClient.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package io.github.tropheusj.krill;

import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry;
import net.minecraft.client.renderer.entity.NoopRenderer;
import net.minecraft.client.renderer.item.ItemProperties;
import net.minecraft.core.component.DataComponents;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.component.ChargedProjectiles;

public class KrillClient implements ClientModInitializer {
@Override
public void onInitializeClient() {
ItemProperties.register(Items.CROSSBOW, Krill.id("krill"), (stack, level, entity, i) -> {
ChargedProjectiles projectiles = stack.get(DataComponents.CHARGED_PROJECTILES);
return projectiles != null && projectiles.contains(Items.FIREWORK_ROCKET) ? 1 : 0;
});

EntityRendererRegistry.register(Krill.KRILL_TYPE, NoopRenderer::new);
EntityRendererRegistry.register(Krill.KRILL_ARROW_TYPE, NoopRenderer::new);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package io.github.tropheusj.krill.arrow;

import io.github.tropheusj.krill.Krill;
import io.github.tropheusj.krill.entity.KrillEntity;
import io.github.tropheusj.krill.entity.Krilling;
import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.entity.projectile.AbstractArrow;
import net.minecraft.world.entity.projectile.Arrow;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.Level;

import net.minecraft.world.phys.BlockHitResult;

import net.minecraft.world.phys.EntityHitResult;

import org.jetbrains.annotations.NotNull;

public class KrillArrowEntity extends AbstractArrow {
public KrillArrowEntity(EntityType<? extends KrillArrowEntity> entityType, Level level) {
super(entityType, level);
}

@Override
protected void onHitBlock(BlockHitResult hit) {
super.onHitBlock(hit);
// free him
BlockPos offset = hit.getBlockPos().relative(hit.getDirection());
KrillEntity krill = Krill.KRILL_TYPE.create(this.level());
if (krill != null) {
krill.moveTo(offset, 0, 0);
this.level().addFreshEntity(krill);
}
}

@Override
protected void onHitEntity(EntityHitResult hit) {
super.onHitEntity(hit);
if (this.level().isClientSide)
return;
if (this.ownedBy(hit.getEntity())) {
// krilled self
}
if (hit.getEntity() instanceof LivingEntity living)
Krilling.transform(living);
}

@Override
@NotNull
protected ItemStack getDefaultPickupItem() {
return new ItemStack(Items.ARROW);
}
}
52 changes: 52 additions & 0 deletions src/main/java/io/github/tropheusj/krill/command/KrillCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package io.github.tropheusj.krill.command;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterators;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;

import io.github.tropheusj.krill.Krill;
import io.github.tropheusj.krill.entity.Krilling;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.Commands;
import net.minecraft.commands.arguments.EntityArgument;
import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;

import java.util.Collection;

import static net.minecraft.commands.Commands.argument;
import static net.minecraft.commands.Commands.literal;

public class KrillCommand {
public static LiteralArgumentBuilder<CommandSourceStack> build() {
return literal("kill")
.requires(source -> source.hasPermission(2))
.executes(ctx -> krill(ctx.getSource(), ImmutableList.of(ctx.getSource().getEntityOrException())))
.then(argument("targets", EntityArgument.entities())
.executes(ctx -> krill(ctx.getSource(), EntityArgument.getEntities(ctx, "targets")))
);
}

private static int krill(CommandSourceStack source, Collection<? extends Entity> collection) {
for (Entity entity : collection) {
if (entity instanceof LivingEntity living)
Krilling.transform(living);
}

Component feedback = getFeedback(collection);
source.sendSuccess(() -> feedback, true);
return collection.size();
}

private static Component getFeedback(Collection<? extends Entity> entities) {
int count = entities.size();
if (count == 1) {
Entity entity = entities.iterator().next();
Component name = entity.getDisplayName();
return Component.translatable("commands.krill.success.single", name);
} else {
return Component.translatable("commands.krill.success.multiple", count);
}
}
}
45 changes: 45 additions & 0 deletions src/main/java/io/github/tropheusj/krill/entity/KrillEntity.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package io.github.tropheusj.krill.entity;

import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.AgeableMob;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.ExperienceOrb;
import net.minecraft.world.entity.npc.AbstractVillager;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.trading.ItemCost;
import net.minecraft.world.item.trading.MerchantOffer;
import net.minecraft.world.level.Level;

import org.jetbrains.annotations.Nullable;

public class KrillEntity extends AbstractVillager {
public KrillEntity(EntityType<? extends KrillEntity> type, Level level) {
super(type, level);
}

@Override
protected void rewardTradeXp(MerchantOffer merchantOffer) {
if (merchantOffer.shouldRewardExp()) {
int i = 3 + this.random.nextInt(4);
this.level().addFreshEntity(new ExperienceOrb(
this.level(), this.getX(), this.getY() + 0.5, this.getZ(), i
));
}
}

@Override
protected void updateTrades() {
this.getOffers().add(new MerchantOffer(
new ItemCost(Items.AMBER_GEM),
new ItemStack(Items.POISONOUS_POTATO_FRIES),
7, 1, 1
));
}

@Nullable
@Override
public AgeableMob getBreedOffspring(ServerLevel serverLevel, AgeableMob ageableMob) {
return null;
}
}
63 changes: 63 additions & 0 deletions src/main/java/io/github/tropheusj/krill/entity/Krilling.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package io.github.tropheusj.krill.entity;

import io.github.tropheusj.krill.Krill;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Holder;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.world.effect.MobEffect;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;

public class Krilling {
public static void transform(LivingEntity entity) {
if (!(entity.level() instanceof ServerLevel level))
throw new IllegalStateException();

// particles
AABB bounds = entity.getBoundingBox();
BlockPos.betweenClosedStream(bounds).forEach(pos -> {
Vec3 center = Vec3.atCenterOf(pos);
level.sendParticles(
ParticleTypes.POOF,
center.x, center.y, center.z,
7, // count
0.5, 0.5, 0.5, // offset
0.1 // max speed
);
});

// sound
level.playSound(
null, entity.blockPosition(),
SoundEvents.ZOMBIE_VILLAGER_CURE,
entity.getSoundSource(),
1 + entity.getRandom().nextFloat(),
(float) (entity.getRandom().nextFloat() * 0.7 + 0.3)
);

if (entity instanceof ServerPlayer player) {
transformPlayer(player);
return;
}

// replace existing entity
KrillEntity krill = Krill.KRILL_TYPE.create(level);
if (krill != null) {
krill.setPos(entity.position());
level.addFreshEntity(krill);
entity.discard();
}
}

private static void transformPlayer(ServerPlayer player) {
// apply status effect
Holder<MobEffect> holder = BuiltInRegistries.MOB_EFFECT.wrapAsHolder(Krill.KRILLED);
player.addEffect(new MobEffectInstance(holder, 30 * 20));
}
}
4 changes: 4 additions & 0 deletions src/main/resources/assets/krill/lang/en_us.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"commands.krill.success.single": "Krilled %s",
"commands.krill.success.multiple": "Krilled %s entities"
}
3 changes: 3 additions & 0 deletions src/main/resources/fabric.mod.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@
"entrypoints": {
"main": [
"io.github.tropheusj.krill.Krill"
],
"client": [
"io.github.tropheusj.krill.KrillClient"
]
},
"mixins": [
Expand Down

0 comments on commit 6b7be23

Please sign in to comment.