First working alpha

This commit is contained in:
Martin Prokoph
2022-08-15 23:41:45 +02:00
parent c66f9a680e
commit 5d62e8620c
42 changed files with 1039 additions and 0 deletions

View File

@@ -0,0 +1,88 @@
package eu.midnightdust.celestria;
import com.mojang.brigadier.arguments.IntegerArgumentType;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import eu.midnightdust.lib.util.MidnightColorUtil;
import eu.midnightdust.celestria.config.CelestriaConfig;
import eu.midnightdust.celestria.effect.InsomniaStatusEffect;
import io.netty.buffer.Unpooled;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
import net.minecraft.command.argument.EntityArgumentType;
import net.minecraft.entity.effect.StatusEffect;
import net.minecraft.entity.effect.StatusEffectCategory;
import net.minecraft.entity.effect.StatusEffectInstance;
import net.minecraft.entity.effect.StatusEffects;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.server.command.CommandManager;
import net.minecraft.server.command.ServerCommandSource;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.random.Random;
import net.minecraft.util.registry.Registry;
import java.util.Collection;
public class Celestria implements ModInitializer {
public static final String MOD_ID = "celestria";
public static final Identifier SHOOTING_STAR_PACKET = new Identifier(MOD_ID, "shooting_star");
public static final Identifier WELCOME_PACKET = new Identifier(MOD_ID, "welcome");
public static final StatusEffect INSOMNIA = new InsomniaStatusEffect(StatusEffectCategory.HARMFUL, MidnightColorUtil.hex2Rgb("88A9C8").getRGB());
public static int shootingStarCooldown = 0;
private int prevPlayerAmount = 0;
public void onInitialize() {
CelestriaConfig.init(MOD_ID, CelestriaConfig.class);
Registry.register(Registry.STATUS_EFFECT, new Identifier(MOD_ID, "insomnia"), INSOMNIA);
LiteralArgumentBuilder<ServerCommandSource> command = CommandManager.literal("shootingStar");
var commandPlayers = command.then(CommandManager.argument("players", EntityArgumentType.players()));
var commandX = commandPlayers.then(CommandManager.argument("x", IntegerArgumentType.integer(90, 180)));
var commandY = commandX.then(CommandManager.argument("y", IntegerArgumentType.integer(0, 360)));
var commandType = commandY.then(CommandManager.argument("type", IntegerArgumentType.integer(0, 3)));
LiteralArgumentBuilder<ServerCommandSource> finalized = CommandManager.literal("celestria").requires(source -> source.hasPermissionLevel(2)).then(commandType).executes(ctx ->
createShootingStar(EntityArgumentType.getPlayers(ctx, "players"),
IntegerArgumentType.getInteger(ctx, "x"), IntegerArgumentType.getInteger(ctx, "y"), IntegerArgumentType.getInteger(ctx, "type")));
CommandRegistrationCallback.EVENT.register((dispatcher, dedicated, registrationEnvironment) -> dispatcher.register(finalized));
ServerTickEvents.END_WORLD_TICK.register(world -> {
if (shootingStarCooldown > 0) --shootingStarCooldown;
if (world.getPlayers().size() > prevPlayerAmount) {
world.getPlayers().forEach(player -> ServerPlayNetworking.send(player, WELCOME_PACKET, new PacketByteBuf(Unpooled.buffer())));
prevPlayerAmount = world.getPlayers().size();
}
if (world.isNight() && world.getMoonPhase() == 0) {
for (ServerPlayerEntity player : world.getPlayers()) {
if (world.random.nextInt(CelestriaConfig.insomniaChance) == 0) {
player.addStatusEffect(new StatusEffectInstance(INSOMNIA, CelestriaConfig.insomniaDuration, 0, true, false, true));
}
}
}
if (world.isNight() && Celestria.shootingStarCooldown <= 0 && world.random.nextInt(CelestriaConfig.shootingStarChance) == 0) {
int x = world.random.nextBetween(100, 150);
int y = world.random.nextInt(360);
int type = world.random.nextInt(3);
createShootingStar(world.getPlayers(), x, y, type);
Celestria.shootingStarCooldown = CelestriaConfig.shootingStarCooldownLength;
}
});
}
public int createShootingStar(Collection<ServerPlayerEntity> players, int x, int y, int type) {
int[] array = new int[3];
array[0] = x;
array[1] = y;
array[2] = type;
PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer());
passedData.writeIntArray(array);
int message = Random.create().nextInt(CelestriaConfig.shootingStarMessages.size());
players.forEach(player -> {
player.addStatusEffect(new StatusEffectInstance(StatusEffects.LUCK, CelestriaConfig.shootingStarLuckDuration, 0, true, false, true));
ServerPlayNetworking.send(player, SHOOTING_STAR_PACKET, passedData);
if (CelestriaConfig.sendChatMessages) player.sendMessageToClient(Text.literal("§f§l[§7§lC§8§le§7§ll§f§le§7§ls§8§lt§7§lr§f§li§7§la§8§l] ").append(Text.translatable(CelestriaConfig.shootingStarMessages.get(message))),false);
});
return 1;
}
}

View File

@@ -0,0 +1,56 @@
package eu.midnightdust.celestria;
import eu.midnightdust.celestria.config.CelestriaConfig;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.fabricmc.fabric.api.resource.ResourceManagerHelper;
import net.fabricmc.fabric.api.resource.ResourcePackActivationType;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.util.Identifier;
public class CelestriaClient implements ClientModInitializer {
private static boolean clientOnlyMode = true;
public static int shootingStarProgress = 0;
public static int shootingStarType = 0;
public static int shootingStarX = 0;
public static int shootingStarY = 0;
@Override
public void onInitializeClient() {
FabricLoader.getInstance().getModContainer(Celestria.MOD_ID).ifPresent(modContainer -> {
ResourceManagerHelper.registerBuiltinResourcePack(new Identifier(Celestria.MOD_ID,"realistic"), modContainer, ResourcePackActivationType.NORMAL);
ResourceManagerHelper.registerBuiltinResourcePack(new Identifier(Celestria.MOD_ID,"pixelperfect"), modContainer, ResourcePackActivationType.NORMAL);
});
ClientPlayNetworking.registerGlobalReceiver(Celestria.SHOOTING_STAR_PACKET,
(client, handler, attachedData, packetSender) -> {
int[] array = attachedData.readIntArray(3);
client.execute(() -> {
if (client.world != null) {
CelestriaClient.clientOnlyMode = false; // If the welcome packet wasn't received correctly for some reason, disable clientOnlyMode on shooting star occurrence
CelestriaClient.shootingStarX = array[0];
CelestriaClient.shootingStarY = array[1];
CelestriaClient.shootingStarType = array[2];
CelestriaClient.shootingStarProgress = 100 + shootingStarType * 10;
}
});
});
ClientPlayNetworking.registerGlobalReceiver(Celestria.WELCOME_PACKET,
(client, handler, attachedData, packetSender) -> client.execute(() -> CelestriaClient.clientOnlyMode = false));
ClientTickEvents.END_CLIENT_TICK.register(client -> {
if (shootingStarProgress > 0) --shootingStarProgress;
if (CelestriaClient.clientOnlyMode && client.world != null) {
if (Celestria.shootingStarCooldown > 0) --Celestria.shootingStarCooldown;
if (client.world.isNight() && Celestria.shootingStarCooldown <= 0 && client.world.random.nextInt(CelestriaConfig.shootingStarChance) == 0) {
CelestriaClient.shootingStarX = client.world.random.nextBetween(100, 150);
CelestriaClient.shootingStarY = client.world.random.nextInt(360);
CelestriaClient.shootingStarType = client.world.random.nextInt(3);
CelestriaClient.shootingStarProgress = 100 + shootingStarType * 10;
Celestria.shootingStarCooldown = CelestriaConfig.shootingStarCooldownLength;
}
}
});
ClientPlayConnectionEvents.DISCONNECT.register((handler, client) -> CelestriaClient.clientOnlyMode = true);
}
}

View File

@@ -0,0 +1,17 @@
package eu.midnightdust.celestria.config;
import com.google.common.collect.Lists;
import eu.midnightdust.lib.config.MidnightConfig;
import java.util.List;
public class CelestriaConfig extends MidnightConfig {
@Entry public static boolean sendChatMessages = true;
@Entry public static int shootingStarChance = 10000;
@Entry public static int shootingStarCooldownLength = 1000;
@Entry public static int shootingStarLuckDuration = 1000;
@Entry public static int insomniaChance = 30000;
@Entry public static int insomniaDuration = 1000;
@Entry public static List<String> shootingStarMessages = Lists.newArrayList("celestria.shootingStar.1", "celestria.shootingStar.2", "celestria.shootingStar.3");
@Entry public static List<String> insomniaMessages = Lists.newArrayList("celestria.insomnia.1", "celestria.insomnia.2");
}

View File

@@ -0,0 +1,10 @@
package eu.midnightdust.celestria.effect;
import net.minecraft.entity.effect.StatusEffect;
import net.minecraft.entity.effect.StatusEffectCategory;
public class InsomniaStatusEffect extends StatusEffect {
public InsomniaStatusEffect(StatusEffectCategory statusEffectCategory, int color) {
super(statusEffectCategory, color);
}
}

View File

@@ -0,0 +1,29 @@
package eu.midnightdust.celestria.mixin;
import eu.midnightdust.celestria.Celestria;
import eu.midnightdust.celestria.config.CelestriaConfig;
import net.minecraft.block.BedBlock;
import net.minecraft.block.BlockState;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.Text;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand;
import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.math.BlockPos;
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;
@Mixin(BedBlock.class)
public abstract class MixinBedBlock {
@Inject(at = @At("HEAD"), method = "onUse", cancellable = true)
public void celestria$onBedUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit, CallbackInfoReturnable<ActionResult> cir) {
if (!world.isClient() && player instanceof ServerPlayerEntity serverPlayer && player.hasStatusEffect(Celestria.INSOMNIA)) {
if (CelestriaConfig.sendChatMessages) serverPlayer.sendMessageToClient(Text.literal("§f§l[§7§lC§8§le§7§ll§f§le§7§ls§8§lt§7§lr§f§li§7§la§8§l] ").append(Text.translatable(CelestriaConfig.insomniaMessages.get(world.random.nextInt(CelestriaConfig.insomniaMessages.size())))),false);
cir.setReturnValue(ActionResult.FAIL);
}
}
}

View File

@@ -0,0 +1,25 @@
package eu.midnightdust.celestria.mixin;
import eu.midnightdust.celestria.render.ShootingStarRenderer;
import net.minecraft.client.render.*;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.util.math.Matrix4f;
import org.jetbrains.annotations.Nullable;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(WorldRenderer.class)
public abstract class MixinWorldRenderer {
@Unique private final ShootingStarRenderer shootingStarRenderer = new ShootingStarRenderer();
@Shadow @Nullable private ClientWorld world;
@Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/util/profiler/Profiler;swap(Ljava/lang/String;)V", ordinal = 6, shift = At.Shift.BEFORE), method = "render")
public void celestria$renderShootingStars(MatrixStack matrices, float tickDelta, long limitTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightmapTextureManager lightmapTextureManager, Matrix4f positionMatrix, CallbackInfo ci) {
shootingStarRenderer.renderShootingStar(world, matrices);
}
}

View File

@@ -0,0 +1,42 @@
package eu.midnightdust.celestria.render;
import com.mojang.blaze3d.systems.RenderSystem;
import eu.midnightdust.celestria.Celestria;
import eu.midnightdust.celestria.CelestriaClient;
import eu.midnightdust.lib.util.MidnightMathUtil;
import net.minecraft.client.render.*;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.Matrix4f;
import net.minecraft.util.math.Vec3f;
public class ShootingStarRenderer {
public void renderShootingStar(ClientWorld world, MatrixStack matrices) {
if (world != null && CelestriaClient.shootingStarProgress > 0) {
world.getProfiler().swap("shooting_star");
matrices.push();
matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(MidnightMathUtil.isEven(CelestriaClient.shootingStarType) ? CelestriaClient.shootingStarY + CelestriaClient.shootingStarProgress : CelestriaClient.shootingStarY - CelestriaClient.shootingStarProgress));
matrices.multiply(Vec3f.POSITIVE_X.getDegreesQuaternion(CelestriaClient.shootingStarX));
Matrix4f matrix4f = matrices.peek().getPositionMatrix();
Tessellator tessellator = Tessellator.getInstance();
BufferBuilder bufferBuilder = tessellator.getBuffer();
RenderSystem.enableTexture();
RenderSystem.defaultBlendFunc();
RenderSystem.enableDepthTest();
RenderSystem.enableBlend();
float alpha = (float) (Math.log(CelestriaClient.shootingStarProgress) / 5f);
RenderSystem.setShaderColor(1,1,1,alpha);
RenderSystem.setShader(GameRenderer::getPositionTexShader);
RenderSystem.setShaderTexture(0, new Identifier(Celestria.MOD_ID, "textures/environment/shooting_star"+(CelestriaClient.shootingStarType+1)+".png"));
bufferBuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_TEXTURE);
bufferBuilder.vertex(matrix4f, -20.0F, -100.0F, 20.0F).texture(0.0F, 0.0F).next();
bufferBuilder.vertex(matrix4f, 20.0F, -100.0F, 20.0F).texture(1.0F, 0.0F).next();
bufferBuilder.vertex(matrix4f, 20.0F, -100.0F, -20.0F).texture(1.0F, 1.0F).next();
bufferBuilder.vertex(matrix4f, -20.0F, -100.0F, -20.0F).texture(0.0F, 1.0F).next();
BufferRenderer.drawWithShader(bufferBuilder.end());
RenderSystem.disableTexture();
matrices.pop();
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -0,0 +1,17 @@
{
"celestria.midnightconfig.title": "Celestria Konfiguration",
"celestria.midnightconfig.sendChatMessages": "Sende Chat Nachrichten bei Events",
"celestria.midnightconfig.shootingStarChance": "Sternschnuppen-Wahrscheinlichkeit",
"celestria.midnightconfig.shootingStarCooldownLength": "Sternschnuppen Cooldown Länge",
"celestria.midnightconfig.shootingStarLuckDuration": "Sternschnuppen Glück Effektlänge",
"celestria.midnightconfig.shootingStarMessages": "Sternschnuppen-Nachrichten",
"celestria.midnightconfig.insomniaChance": "Schlaflosigkeits-Wahrscheinlichkeit",
"celestria.midnightconfig.insomniaMessages": "Schlaflosigkeits-Nachrichten",
"celestria.midnightconfig.insomniaDuration": "Schlaflosigkeit Effektlänge",
"celestria.shootingStar.1": "§eOh, schau! Eine Sternschnuppe ist erschienen und hat dir Glück gebracht!",
"celestria.shootingStar.2": "§6Wow, eine Sternschnuppe ist erschienen, wünsch dir was!",
"celestria.shootingStar.3": "§2♪ Can we pretend that airplanes in the night sky are like shooting stars... ♫\n§3Oh warte, da ist ja eine echte Sternschnuppe!",
"celestria.insomnia.1": "§cDu hast Angst vor dem Vollmond, also kannst du einfach nicht einschlafen...",
"celestria.insomnia.2": "§3Ouuwwwh... Du hörst seltsame Geräusche und kannst deine Augen nicht schließen",
"celestria.mob_effect.insomnia": "Schlaflosigkeit"
}

View File

@@ -0,0 +1,17 @@
{
"celestria.midnightconfig.title": "Celestria Config",
"celestria.midnightconfig.sendChatMessages": "Send Chat Messages on Events",
"celestria.midnightconfig.shootingStarChance": "Shooting Star Chance",
"celestria.midnightconfig.shootingStarCooldownLength": "Shooting Star Cooldown Length",
"celestria.midnightconfig.shootingStarLuckDuration": "Shooting Star Luck Duration",
"celestria.midnightconfig.shootingStarMessages": "Shooting Star Messages",
"celestria.midnightconfig.insomniaChance": "Insomnia Chance",
"celestria.midnightconfig.insomniaMessages": "Insomnia Messages",
"celestria.midnightconfig.insomniaDuration": "Insomnia Effect Duration",
"celestria.shootingStar.1": "§eOh, look! A shooting star appeared and blessed you with good luck!",
"celestria.shootingStar.2": "§6Wow, a shooting star appeared, make a wish!",
"celestria.shootingStar.3": "§2♪ Can we pretend that airplanes in the night sky are like shooting stars... ♫\n§3Oh wait, there's a real one!",
"celestria.insomnia.1": "§cYou're afraid of the full moon, so you just can't find no rest...",
"celestria.insomnia.2": "§3Ouuwwwh... You hear strange noises from afar and can't close your eyes",
"celestria.mob_effect.insomnia": "Insomnia"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -0,0 +1,14 @@
{
"required": true,
"package": "eu.midnightdust.celestria.mixin",
"compatibilityLevel": "JAVA_17",
"client": [
"MixinWorldRenderer"
],
"mixins": [
"MixinBedBlock"
],
"injectors": {
"defaultRequire": 1
}
}

View File

@@ -0,0 +1,34 @@
{
"schemaVersion": 1,
"id": "celestria",
"version": "${version}",
"name": "Celestria",
"description": "Adds celestrial events, such as shooting stars and occasional insomnia from full moon.",
"authors": [
"Motschen",
"TeamMidnightDust"
],
"contact": {
"homepage": "https://www.midnightdust.eu/",
"sources": "https://github.com/TeamMidnightDust/Celestria",
"issues": "https://github.com/TeamMidnightDust/Celestria/issues"
},
"license": "MIT",
"icon": "assets/celestria/icon.png",
"environment": "*",
"entrypoints": {
"main": [
"eu.midnightdust.celestria.Celestria"
],
"client": [
"eu.midnightdust.celestria.CelestriaClient"
]
},
"mixins": [
"celestria.mixins.json"
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

@@ -0,0 +1,6 @@
{
"pack": {
"pack_format": 9,
"description": "Makes the shooting star texture consistent with vanilla stars"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

@@ -0,0 +1,2 @@
https://www.pngkey.com/maxpic/u2a9o0o0o0y3u2u2/
https://picsart.com/i/sticker-275568554020211

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

View File

@@ -0,0 +1,6 @@
{
"pack": {
"pack_format": 9,
"description": "Makes the shooting star textures appear realistic"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB