1.0.1
All checks were successful
SlightlyVanilla/pipeline/head This commit looks good

Update Mappings
Add Throwable Spawn Eggs
This commit is contained in:
TheBrokenRail 2020-03-19 17:33:44 -04:00
parent 819c1a0577
commit 59a8c4c869
15 changed files with 134 additions and 7 deletions

View File

@ -1,4 +1,8 @@
# Changelog # Changelog
**1.0.1**
* Update Mappings
* Add Throwable Spawn Eggs
**1.0** **1.0**
* Initial Release * Initial Release

View File

@ -8,6 +8,7 @@ Suggest more tweaks in the issue tracker!
* Use Respawn Anchor in Any Dimension * Use Respawn Anchor in Any Dimension
* Instantly Kill In Creative Mode * Instantly Kill In Creative Mode
* Throwable Slimeballs * Throwable Slimeballs
* Throwable Spawn Eggs
## Changelog ## Changelog
[View Changelog](CHANGELOG.md) [View Changelog](CHANGELOG.md)

View File

@ -6,11 +6,11 @@ org.gradle.jvmargs = -Xmx1G
minecraft_version = 20w12a minecraft_version = 20w12a
curseforge_id = 368420 curseforge_id = 368420
simple_minecraft_version = 1.16-Snapshot simple_minecraft_version = 1.16-Snapshot
yarn_build = 12 yarn_build = 14
fabric_loader_version = 0.7.8+build.187 fabric_loader_version = 0.7.8+build.189
# Mod Properties # Mod Properties
mod_version = 1.0.0 mod_version = 1.0.1
maven_group = com.thebrokenrail maven_group = com.thebrokenrail
archives_base_name = slightlyvanilla archives_base_name = slightlyvanilla

View File

@ -8,4 +8,5 @@ public class ModConfig implements ConfigData {
public boolean useRespawnAnchorInAnyDimension = true; public boolean useRespawnAnchorInAnyDimension = true;
public boolean instantlyKillInCreative = true; public boolean instantlyKillInCreative = true;
public boolean throwableSlimeballs = true; public boolean throwableSlimeballs = true;
public boolean throwableSpawnEggs = true;
} }

View File

@ -1,6 +1,7 @@
package com.thebrokenrail.slightlyvanilla; package com.thebrokenrail.slightlyvanilla;
import com.thebrokenrail.slightlyvanilla.entity.SlimeballEntity; import com.thebrokenrail.slightlyvanilla.entity.SlimeballEntity;
import com.thebrokenrail.slightlyvanilla.entity.SpawnEggEntity;
import me.sargunvohra.mcmods.autoconfig1u.AutoConfig; import me.sargunvohra.mcmods.autoconfig1u.AutoConfig;
import me.sargunvohra.mcmods.autoconfig1u.serializer.GsonConfigSerializer; import me.sargunvohra.mcmods.autoconfig1u.serializer.GsonConfigSerializer;
import net.fabricmc.api.ModInitializer; import net.fabricmc.api.ModInitializer;
@ -8,11 +9,14 @@ import net.fabricmc.fabric.api.entity.FabricEntityTypeBuilder;
import net.minecraft.entity.EntityCategory; import net.minecraft.entity.EntityCategory;
import net.minecraft.entity.EntityDimensions; import net.minecraft.entity.EntityDimensions;
import net.minecraft.entity.EntityType; import net.minecraft.entity.EntityType;
import net.minecraft.util.Identifier;
import net.minecraft.util.registry.Registry;
public class SlightlyVanilla implements ModInitializer { public class SlightlyVanilla implements ModInitializer {
public static final String NAMESPACE = "slightlyvanilla"; public static final String NAMESPACE = "slightlyvanilla";
public static EntityType<SlimeballEntity> SLIMEBALL_ENTITY; public static EntityType<SlimeballEntity> SLIMEBALL_ENTITY;
public static EntityType<SpawnEggEntity> SPAWN_EGG_ENTITY;
public static ModConfig getConfig() { public static ModConfig getConfig() {
return AutoConfig.getConfigHolder(ModConfig.class).getConfig(); return AutoConfig.getConfigHolder(ModConfig.class).getConfig();
@ -23,5 +27,9 @@ public class SlightlyVanilla implements ModInitializer {
AutoConfig.register(ModConfig.class, GsonConfigSerializer::new); AutoConfig.register(ModConfig.class, GsonConfigSerializer::new);
SLIMEBALL_ENTITY = FabricEntityTypeBuilder.create(EntityCategory.MISC, (EntityType.EntityFactory<SlimeballEntity>) SlimeballEntity::new).size(EntityDimensions.fixed(0.25f, 0.25f)).build(); SLIMEBALL_ENTITY = FabricEntityTypeBuilder.create(EntityCategory.MISC, (EntityType.EntityFactory<SlimeballEntity>) SlimeballEntity::new).size(EntityDimensions.fixed(0.25f, 0.25f)).build();
SPAWN_EGG_ENTITY = FabricEntityTypeBuilder.create(EntityCategory.MISC, (EntityType.EntityFactory<SpawnEggEntity>) SpawnEggEntity::new).size(EntityDimensions.fixed(0.25f, 0.25f)).build();
Registry.register(Registry.ENTITY_TYPE, new Identifier(NAMESPACE, "slimeball"), SLIMEBALL_ENTITY);
Registry.register(Registry.ENTITY_TYPE, new Identifier(NAMESPACE, "spawn_egg"), SPAWN_EGG_ENTITY);
} }
} }

View File

@ -3,6 +3,7 @@ package com.thebrokenrail.slightlyvanilla.client;
import com.thebrokenrail.slightlyvanilla.SlightlyVanilla; import com.thebrokenrail.slightlyvanilla.SlightlyVanilla;
import com.thebrokenrail.slightlyvanilla.ModConfig; import com.thebrokenrail.slightlyvanilla.ModConfig;
import com.thebrokenrail.slightlyvanilla.entity.SlimeballEntity; import com.thebrokenrail.slightlyvanilla.entity.SlimeballEntity;
import com.thebrokenrail.slightlyvanilla.entity.SpawnEggEntity;
import io.github.prospector.modmenu.api.ConfigScreenFactory; import io.github.prospector.modmenu.api.ConfigScreenFactory;
import io.github.prospector.modmenu.api.ModMenuApi; import io.github.prospector.modmenu.api.ModMenuApi;
import me.sargunvohra.mcmods.autoconfig1u.AutoConfig; import me.sargunvohra.mcmods.autoconfig1u.AutoConfig;
@ -15,6 +16,7 @@ public class SlightlyVanillaClient implements ClientModInitializer, ModMenuApi {
@Override @Override
public void onInitializeClient() { public void onInitializeClient() {
EntityRendererRegistry.INSTANCE.register(SlightlyVanilla.SLIMEBALL_ENTITY, (entityRenderDispatcher, context) -> new FlyingItemEntityRenderer<SlimeballEntity>(entityRenderDispatcher, context.getItemRenderer())); EntityRendererRegistry.INSTANCE.register(SlightlyVanilla.SLIMEBALL_ENTITY, (entityRenderDispatcher, context) -> new FlyingItemEntityRenderer<SlimeballEntity>(entityRenderDispatcher, context.getItemRenderer()));
EntityRendererRegistry.INSTANCE.register(SlightlyVanilla.SPAWN_EGG_ENTITY, (entityRenderDispatcher, context) -> new FlyingItemEntityRenderer<SpawnEggEntity>(entityRenderDispatcher, context.getItemRenderer()));
} }
@Override @Override

View File

@ -9,6 +9,7 @@ import net.minecraft.entity.projectile.thrown.ThrownItemEntity;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.item.Items; import net.minecraft.item.Items;
import net.minecraft.item.SpawnEggItem;
import net.minecraft.network.Packet; import net.minecraft.network.Packet;
import net.minecraft.network.packet.s2c.play.EntitySpawnS2CPacket; import net.minecraft.network.packet.s2c.play.EntitySpawnS2CPacket;
import net.minecraft.particle.ItemStackParticleEffect; import net.minecraft.particle.ItemStackParticleEffect;
@ -36,8 +37,7 @@ public class SlimeballEntity extends ThrownItemEntity {
@Environment(EnvType.CLIENT) @Environment(EnvType.CLIENT)
private ParticleEffect getParticleParameters() { private ParticleEffect getParticleParameters() {
ItemStack itemStack = getItem(); return ParticleTypes.ITEM_SLIME;
return itemStack.isEmpty() ? ParticleTypes.ITEM_SLIME : new ItemStackParticleEffect(ParticleTypes.ITEM, itemStack);
} }
@Environment(EnvType.CLIENT) @Environment(EnvType.CLIENT)

View File

@ -0,0 +1,69 @@
package com.thebrokenrail.slightlyvanilla.entity;
import com.thebrokenrail.slightlyvanilla.SlightlyVanilla;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.SpawnType;
import net.minecraft.entity.projectile.thrown.ThrownItemEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.item.SpawnEggItem;
import net.minecraft.network.Packet;
import net.minecraft.network.packet.s2c.play.EntitySpawnS2CPacket;
import net.minecraft.particle.ItemStackParticleEffect;
import net.minecraft.particle.ParticleEffect;
import net.minecraft.particle.ParticleTypes;
import net.minecraft.util.hit.HitResult;
import net.minecraft.world.World;
public class SpawnEggEntity extends ThrownItemEntity {
public SpawnEggEntity(EntityType<SpawnEggEntity> entityType, World world) {
super(entityType, world);
}
public SpawnEggEntity(World world, LivingEntity owner) {
super(SlightlyVanilla.SPAWN_EGG_ENTITY, owner, world);
}
public SpawnEggEntity(World world, double x, double y, double z) {
super(SlightlyVanilla.SPAWN_EGG_ENTITY, x, y, z, world);
}
protected Item getDefaultItem() {
return Items.PIG_SPAWN_EGG;
}
@Environment(EnvType.CLIENT)
private ParticleEffect getParticleParameters() {
return new ItemStackParticleEffect(ParticleTypes.ITEM, getStack());
}
@Environment(EnvType.CLIENT)
public void handleStatus(byte status) {
if (status == 3) {
ParticleEffect particleEffect = getParticleParameters();
for (int i = 0; i < 8; ++i) {
world.addParticle(particleEffect, getX(), getY(), getZ(), 0.0D, 0.0D, 0.0D);
}
}
}
protected void onCollision(HitResult hitResult) {
super.onCollision(hitResult);
if (!world.isClient()) {
world.sendEntityStatus(this, (byte) 3);
EntityType<?> entityType = ((SpawnEggItem) getStack().getItem()).getEntityType(getStack().getTag());
entityType.spawnFromItemStack(world, getItem(), null, getBlockPos(), SpawnType.SPAWN_EGG, false, false);
remove();
}
}
@Override
public Packet<?> createSpawnPacket() {
return new EntitySpawnS2CPacket(this);
}
}

View File

@ -2,6 +2,7 @@ package com.thebrokenrail.slightlyvanilla.mixin;
import com.thebrokenrail.slightlyvanilla.SlightlyVanilla; import com.thebrokenrail.slightlyvanilla.SlightlyVanilla;
import com.thebrokenrail.slightlyvanilla.entity.SlimeballEntity; import com.thebrokenrail.slightlyvanilla.entity.SlimeballEntity;
import com.thebrokenrail.slightlyvanilla.entity.SpawnEggEntity;
import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.client.network.ClientPlayNetworkHandler;
import net.minecraft.client.world.ClientWorld; import net.minecraft.client.world.ClientWorld;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
@ -26,6 +27,8 @@ public class MixinClientPlayNetworkHandler {
if (entityType == SlightlyVanilla.SLIMEBALL_ENTITY) { if (entityType == SlightlyVanilla.SLIMEBALL_ENTITY) {
entity = new SlimeballEntity(world, packet.getX(), packet.getY(), packet.getZ()); entity = new SlimeballEntity(world, packet.getX(), packet.getY(), packet.getZ());
} else if (entityType == SlightlyVanilla.SPAWN_EGG_ENTITY) {
entity = new SpawnEggEntity(world, packet.getX(), packet.getY(), packet.getZ());
} }
if (entity != null) { if (entity != null) {

View File

@ -15,6 +15,7 @@ import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@SuppressWarnings("unused")
@Mixin(Item.class) @Mixin(Item.class)
public class MixinItem { public class MixinItem {
@Inject(at = @At("HEAD"), method = "use", cancellable = true) @Inject(at = @At("HEAD"), method = "use", cancellable = true)

View File

@ -10,6 +10,7 @@ import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@SuppressWarnings("unused")
@Mixin(PlayerEntity.class) @Mixin(PlayerEntity.class)
public class MixinPlayerEntity { public class MixinPlayerEntity {
@Inject(at = @At("HEAD"), method = "attack", cancellable = true) @Inject(at = @At("HEAD"), method = "attack", cancellable = true)

View File

@ -8,6 +8,7 @@ import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.Redirect;
@SuppressWarnings("unused")
@Mixin(RespawnAnchorBlock.class) @Mixin(RespawnAnchorBlock.class)
public class MixinRespawnAnchorBlock { public class MixinRespawnAnchorBlock {
@Redirect(at = @At(value = "INVOKE", target = "Lnet/minecraft/world/dimension/Dimension;getType()Lnet/minecraft/world/dimension/DimensionType;", ordinal = 0), method = "onUse") @Redirect(at = @At(value = "INVOKE", target = "Lnet/minecraft/world/dimension/Dimension;getType()Lnet/minecraft/world/dimension/DimensionType;", ordinal = 0), method = "onUse")

View File

@ -0,0 +1,33 @@
package com.thebrokenrail.slightlyvanilla.mixin;
import com.thebrokenrail.slightlyvanilla.SlightlyVanilla;
import com.thebrokenrail.slightlyvanilla.entity.SpawnEggEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.item.SpawnEggItem;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand;
import net.minecraft.util.TypedActionResult;
import net.minecraft.world.World;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@SuppressWarnings("unused")
@Mixin(SpawnEggItem.class)
public class MixinSpawnEggItem {
@Inject(at = @At("RETURN"), method = "use", cancellable = true)
public void use(World world, PlayerEntity user, Hand hand, CallbackInfoReturnable<TypedActionResult<ItemStack>> info) {
if (SlightlyVanilla.getConfig().throwableSpawnEggs && info.getReturnValue().getResult() == ActionResult.PASS) {
ItemStack stack = user.getStackInHand(hand);
if (!world.isClient()) {
SpawnEggEntity entity = new SpawnEggEntity(world, user);
entity.setItem(stack);
entity.setProperties(user, user.pitch, user.yaw, 0.0f, 1.5f, 1.0f);
world.spawnEntity(entity);
}
info.setReturnValue(new TypedActionResult<>(ActionResult.SUCCESS, stack));
}
}
}

View File

@ -2,5 +2,7 @@
"text.autoconfig.slightlyvanilla.title": "SlightlyVanilla Tweaks", "text.autoconfig.slightlyvanilla.title": "SlightlyVanilla Tweaks",
"text.autoconfig.slightlyvanilla.option.useRespawnAnchorInAnyDimension": "Use Respawn Anchor In Any Dimension", "text.autoconfig.slightlyvanilla.option.useRespawnAnchorInAnyDimension": "Use Respawn Anchor In Any Dimension",
"text.autoconfig.slightlyvanilla.option.instantlyKillInCreative": "Instantly Kill In Creative Mode", "text.autoconfig.slightlyvanilla.option.instantlyKillInCreative": "Instantly Kill In Creative Mode",
"text.autoconfig.slightlyvanilla.option.throwableSlimeballs": "Throwable Slimeballs" "text.autoconfig.slightlyvanilla.option.throwableSlimeballs": "Throwable Slimeballs",
"entity.slightlyvanilla.slimeball": "Slimeball",
"entity.slightlyvanilla.spawn_egg": "Spawn Egg"
} }

View File

@ -8,7 +8,8 @@
"mixins": [ "mixins": [
"MixinRespawnAnchorBlock", "MixinRespawnAnchorBlock",
"MixinPlayerEntity", "MixinPlayerEntity",
"MixinItem" "MixinItem",
"MixinSpawnEggItem"
], ],
"injectors": { "injectors": {
"defaultRequire": 1 "defaultRequire": 1