nyan cat
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
package dev.tggamesyt.szar.client;
|
||||
|
||||
import dev.tggamesyt.szar.NyanEntity;
|
||||
import net.minecraft.client.model.*;
|
||||
import net.minecraft.client.render.VertexConsumer;
|
||||
import net.minecraft.client.render.entity.model.EntityModel;
|
||||
import net.minecraft.client.util.math.MatrixStack;
|
||||
|
||||
// Made with Blockbench 5.0.3
|
||||
// Exported for Minecraft version 1.17+ for Yarn
|
||||
// Paste this class into your mod and generate all required imports
|
||||
public class NyanCatEntityModel extends EntityModel<NyanEntity> {
|
||||
private final ModelPart bb_main;
|
||||
public NyanCatEntityModel(ModelPart root) {
|
||||
this.bb_main = root.getChild("bb_main");
|
||||
}
|
||||
public static TexturedModelData getTexturedModelData() {
|
||||
ModelData modelData = new ModelData();
|
||||
ModelPartData modelPartData = modelData.getRoot();
|
||||
ModelPartData bb_main = modelPartData.addChild("bb_main", ModelPartBuilder.create().uv(0, -35).cuboid(0.0F, -21.0F, -17.0F, 0.0F, 21.0F, 35.0F, new Dilation(0.0F)), ModelTransform.pivot(0.0F, 24.0F, 0.0F));
|
||||
return TexturedModelData.of(modelData, 128, 128);
|
||||
}
|
||||
@Override
|
||||
public void setAngles(NyanEntity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) {
|
||||
}
|
||||
@Override
|
||||
public void render(MatrixStack matrices, VertexConsumer vertexConsumer, int light, int overlay, float red, float green, float blue, float alpha) {
|
||||
bb_main.render(matrices, vertexConsumer, light, overlay, red, green, blue, alpha);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package dev.tggamesyt.szar.client;
|
||||
|
||||
import dev.tggamesyt.szar.NyanEntity;
|
||||
import net.minecraft.client.render.entity.EntityRendererFactory;
|
||||
import net.minecraft.client.render.entity.MobEntityRenderer;
|
||||
import net.minecraft.client.render.entity.model.EntityModel;
|
||||
import net.minecraft.client.util.math.MatrixStack;
|
||||
import net.minecraft.util.Identifier;
|
||||
|
||||
public class NyanEntityRenderer extends MobEntityRenderer<NyanEntity, NyanCatEntityModel> {
|
||||
|
||||
private static final Identifier[] TEXTURES = new Identifier[12];
|
||||
|
||||
static {
|
||||
for (int i = 0; i < 12; i++) {
|
||||
TEXTURES[i] = new Identifier("szar", "textures/entity/nyan_cat_textures/nyan_" + (i + 1) + ".png");
|
||||
}
|
||||
}
|
||||
|
||||
public NyanEntityRenderer(EntityRendererFactory.Context context) {
|
||||
super(context, new NyanCatEntityModel(context.getPart(SzarClient.NYAN)), 0.5f);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Identifier getTexture(NyanEntity entity) {
|
||||
// Use age to cycle textures every 2 ticks
|
||||
int index = (entity.age/ 1) % TEXTURES.length; // age is in ticks
|
||||
return TEXTURES[index];
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package dev.tggamesyt.szar.client;
|
||||
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import dev.tggamesyt.szar.NyanEntity;
|
||||
import dev.tggamesyt.szar.PlaneEntity;
|
||||
import dev.tggamesyt.szar.Szar;
|
||||
import dev.tggamesyt.szar.PlaneAnimation;
|
||||
@@ -17,17 +18,22 @@ import net.minecraft.client.option.KeyBinding;
|
||||
import net.minecraft.client.render.entity.FlyingItemEntityRenderer;
|
||||
import net.minecraft.client.render.entity.animation.Animation;
|
||||
import net.minecraft.client.render.entity.model.EntityModelLayer;
|
||||
import net.minecraft.client.sound.PositionedSoundInstance;
|
||||
import net.minecraft.client.sound.SoundInstance;
|
||||
import net.minecraft.client.sound.SoundManager;
|
||||
import net.minecraft.client.util.InputUtil;
|
||||
import net.minecraft.client.render.*;
|
||||
import net.minecraft.client.world.ClientWorld;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.sound.SoundCategory;
|
||||
import net.minecraft.sound.SoundEvent;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.math.Box;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraft.util.math.random.Random;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import java.util.*;
|
||||
|
||||
import static dev.tggamesyt.szar.Szar.HitterEntityType;
|
||||
import static dev.tggamesyt.szar.Szar.PLANE_ANIM_PACKET;
|
||||
@@ -37,12 +43,78 @@ public class SzarClient implements ClientModInitializer {
|
||||
private static final Map<KeyBinding, KeyBinding> activeScramble = new HashMap<>();
|
||||
public static final EntityModelLayer PLANE =
|
||||
new EntityModelLayer(
|
||||
new Identifier("szar", "plane"),
|
||||
new Identifier(Szar.MOD_ID, "plane"),
|
||||
"main"
|
||||
);
|
||||
|
||||
public static final EntityModelLayer NYAN =
|
||||
new EntityModelLayer(
|
||||
new Identifier(Szar.MOD_ID, "nyan_cat"),
|
||||
"main"
|
||||
);
|
||||
// Outside of your tick handler
|
||||
private final Map<NyanEntity, PositionedSoundInstance> activeSounds = new HashMap<>();
|
||||
private static final SoundEvent NYAN_LOOP = SoundEvent.of(new Identifier("szar", "nyan_cat_loop"));
|
||||
private static final SoundEvent NYAN_START = SoundEvent.of(new Identifier("szar", "nyan_cat_first_loop"));
|
||||
int startOffset = 10; // first tick when start sound plays
|
||||
int startLength = 39; // length of one start sound
|
||||
int loopLength = 542; // ticks per loop
|
||||
@Override
|
||||
public void onInitializeClient() {
|
||||
ClientTickEvents.END_CLIENT_TICK.register(client -> {
|
||||
if (client.world == null) return;
|
||||
|
||||
SoundManager soundManager = client.getSoundManager();
|
||||
Box box = new Box(client.player.getX()-128, client.player.getY()-128, client.player.getZ()-128,
|
||||
client.player.getX()+128, client.player.getY()+128, client.player.getZ()+128);
|
||||
|
||||
|
||||
for (NyanEntity nyan : client.world.getEntitiesByClass(NyanEntity.class, box, e -> true)) {
|
||||
// Skip dead ones (just in case)
|
||||
if (!nyan.isAlive()) continue;
|
||||
|
||||
int age = nyan.age;
|
||||
|
||||
// Play first start
|
||||
if (age == 10) {
|
||||
PositionedSoundInstance start1 = PositionedSoundInstance.ambient(
|
||||
NYAN_START, Random.create(),
|
||||
nyan.getX(), nyan.getY(), nyan.getZ()
|
||||
);
|
||||
client.getSoundManager().play(start1);
|
||||
activeSounds.put(nyan, start1);
|
||||
}
|
||||
|
||||
// Play second start
|
||||
if (age == 49) {
|
||||
PositionedSoundInstance start2 = PositionedSoundInstance.ambient(
|
||||
NYAN_START, Random.create(),
|
||||
nyan.getX(), nyan.getY(), nyan.getZ()
|
||||
);
|
||||
client.getSoundManager().play(start2);
|
||||
activeSounds.put(nyan, start2);
|
||||
}
|
||||
|
||||
// Play looping
|
||||
if (age >= 88 && (age - 88) % 542 == 0) {
|
||||
PositionedSoundInstance loop = PositionedSoundInstance.ambient(
|
||||
NYAN_LOOP, Random.create(),
|
||||
nyan.getX(), nyan.getY(), nyan.getZ()
|
||||
);
|
||||
client.getSoundManager().play(loop);
|
||||
activeSounds.put(nyan, loop);
|
||||
}
|
||||
}
|
||||
Iterator<Map.Entry<NyanEntity, PositionedSoundInstance>> it = activeSounds.entrySet().iterator();
|
||||
while (it.hasNext()) {
|
||||
Map.Entry<NyanEntity, PositionedSoundInstance> entry = it.next();
|
||||
NyanEntity nyan = entry.getKey();
|
||||
if (!nyan.isAlive()) {
|
||||
client.getSoundManager().stop(entry.getValue()); // stop the sound immediately
|
||||
it.remove(); // remove from map
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
ClientPlayNetworking.registerGlobalReceiver(
|
||||
PLANE_ANIM_PACKET,
|
||||
(client, handler, buf, sender) -> {
|
||||
@@ -112,7 +184,14 @@ public class SzarClient implements ClientModInitializer {
|
||||
PLANE,
|
||||
PlaneEntityModel::getTexturedModelData
|
||||
);
|
||||
|
||||
EntityRendererRegistry.register(
|
||||
Szar.NyanEntityType,
|
||||
NyanEntityRenderer::new
|
||||
);
|
||||
EntityModelLayerRegistry.registerModelLayer(
|
||||
NYAN,
|
||||
NyanCatEntityModel::getTexturedModelData
|
||||
);
|
||||
EntityRendererRegistry.register(
|
||||
Szar.GYPSY_ENTITY_TYPE,
|
||||
GypsyEntityRenderer::new
|
||||
|
||||
Reference in New Issue
Block a user