diff --git a/common/src/main/java/org/vivecraft/CommonDataHolder.java b/common/src/main/java/org/vivecraft/CommonDataHolder.java index f36326a16..78d110817 100644 --- a/common/src/main/java/org/vivecraft/CommonDataHolder.java +++ b/common/src/main/java/org/vivecraft/CommonDataHolder.java @@ -10,7 +10,7 @@ public CommonDataHolder() { String mcVersion = ""; String modVersion = ""; if (Xplat.isModLoadedSuccess()) { - String[] version = Xplat.getModVersion().split("-"); + String[] version = Xplat.getModVersion().split("-", 2); mcVersion = version[0]; modVersion = version[1]; } diff --git a/common/src/main/java/org/vivecraft/crafting/VivecraftCrafting.java b/common/src/main/java/org/vivecraft/crafting/VivecraftCrafting.java deleted file mode 100644 index 940183060..000000000 --- a/common/src/main/java/org/vivecraft/crafting/VivecraftCrafting.java +++ /dev/null @@ -1,196 +0,0 @@ -package org.vivecraft.crafting; - -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonSyntaxException; -import net.minecraft.core.NonNullList; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.GsonHelper; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.item.crafting.RecipeSerializer; -import net.minecraft.world.item.crafting.ShapedRecipe; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; - -public class VivecraftCrafting extends ShapedRecipe { - - public static final Serializer SERIALIZER = new Serializer(); - - public VivecraftCrafting(ResourceLocation resourceLocation, String string, int i, int j, NonNullList nonNullList, ItemStack itemStack) { - super(resourceLocation, string, i, j, nonNullList, itemStack); - } - - @Override - public RecipeSerializer getSerializer() { - return SERIALIZER; - } - - static NonNullList dissolvePattern(String[] strings, Map map, int i, int j) { - NonNullList nonNullList = NonNullList.withSize(i * j, Ingredient.EMPTY); - HashSet set = Sets.newHashSet(map.keySet()); - set.remove(" "); - for (int k = 0; k < strings.length; ++k) { - for (int l = 0; l < strings[k].length(); ++l) { - String string = strings[k].substring(l, l + 1); - Ingredient ingredient = map.get(string); - if (ingredient == null) { - throw new JsonSyntaxException("Pattern references symbol '" + string + "' but it's not defined in the key"); - } - set.remove(string); - nonNullList.set(l + i * k, ingredient); - } - } - if (!set.isEmpty()) { - throw new JsonSyntaxException("Key defines symbols that aren't used in pattern: " + set); - } - return nonNullList; - } - - - static String[] shrink(String ... strings) { - int i = Integer.MAX_VALUE; - int j = 0; - int k = 0; - int l = 0; - for (int m = 0; m < strings.length; ++m) { - String string = strings[m]; - i = Math.min(i, VivecraftCrafting.firstNonSpace(string)); - int n = VivecraftCrafting.lastNonSpace(string); - j = Math.max(j, n); - if (n < 0) { - if (k == m) { - ++k; - } - ++l; - continue; - } - l = 0; - } - if (strings.length == l) { - return new String[0]; - } - String[] strings2 = new String[strings.length - l - k]; - for (int o = 0; o < strings2.length; ++o) { - strings2[o] = strings[o + k].substring(i, j + 1); - } - return strings2; - } - - private static int firstNonSpace(String string) { - int i; - for (i = 0; i < string.length() && string.charAt(i) == ' '; ++i) { - } - return i; - } - - private static int lastNonSpace(String string) { - int i; - for (i = string.length() - 1; i >= 0 && string.charAt(i) == ' '; --i) { - } - return i; - } - - static String[] patternFromJson(JsonArray jsonArray) { - String[] strings = new String[jsonArray.size()]; - if (strings.length > 3) { - throw new JsonSyntaxException("Invalid pattern: too many rows, 3 is maximum"); - } - if (strings.length == 0) { - throw new JsonSyntaxException("Invalid pattern: empty pattern not allowed"); - } - for (int i = 0; i < strings.length; ++i) { - String string = GsonHelper.convertToString(jsonArray.get(i), "pattern[" + i + "]"); - if (string.length() > 3) { - throw new JsonSyntaxException("Invalid pattern: too many columns, 3 is maximum"); - } - if (i > 0 && strings[0].length() != string.length()) { - throw new JsonSyntaxException("Invalid pattern: each row must be the same width"); - } - strings[i] = string; - } - return strings; - } - - static Map keyFromJson(JsonObject jsonObject) { - HashMap map = Maps.newHashMap(); - for (Map.Entry entry : jsonObject.entrySet()) { - if (entry.getKey().length() != 1) { - throw new JsonSyntaxException("Invalid key entry: '" + entry.getKey() + "' is an invalid symbol (must be 1 character only)."); - } - if (" ".equals(entry.getKey())) { - throw new JsonSyntaxException("Invalid key entry: ' ' is a reserved symbol."); - } - map.put(entry.getKey(), Ingredient.fromJson(entry.getValue())); - } - map.put(" ", Ingredient.EMPTY); - return map; - } - - public static class Serializer implements RecipeSerializer { - - @Override - public VivecraftCrafting fromJson(ResourceLocation resourceLocation, JsonObject jsonObject) { - String string = GsonHelper.getAsString(jsonObject, "group", ""); - Map map = VivecraftCrafting.keyFromJson(GsonHelper.getAsJsonObject(jsonObject, "key")); - String[] strings = VivecraftCrafting.shrink(VivecraftCrafting.patternFromJson(GsonHelper.getAsJsonArray(jsonObject, "pattern"))); - int i = strings[0].length(); - int j = strings.length; - NonNullList nonNullList = VivecraftCrafting.dissolvePattern(strings, map, i, j); - ItemStack itemStack = ShapedRecipe.itemStackFromJson(GsonHelper.getAsJsonObject(jsonObject, "result")); - String name = jsonObject.get("name").getAsString(); - itemStack.setHoverName(new TranslatableComponent(name)); - int flags = jsonObject.get("hideflags").getAsInt(); - boolean unbreakable = jsonObject.get("unbreakable").getAsBoolean(); - itemStack.getOrCreateTag().putBoolean("Unbreakable", unbreakable); - itemStack.getOrCreateTag().putInt("HideFlags", flags); - return new VivecraftCrafting(resourceLocation, string, i, j, nonNullList, itemStack); - } - - @Override - public VivecraftCrafting fromNetwork(ResourceLocation resourceLocation, FriendlyByteBuf friendlyByteBuf) { - int i = friendlyByteBuf.readVarInt(); - int j = friendlyByteBuf.readVarInt(); - String string = friendlyByteBuf.readUtf(); - NonNullList nonNullList = NonNullList.withSize(i * j, Ingredient.EMPTY); - for (int k = 0; k < nonNullList.size(); ++k) { - nonNullList.set(k, Ingredient.fromNetwork(friendlyByteBuf)); - } - ItemStack itemStack = friendlyByteBuf.readItem(); - return new VivecraftCrafting(resourceLocation, string, i, j, nonNullList, itemStack); - } - - @Override - public void toNetwork(FriendlyByteBuf friendlyByteBuf, VivecraftCrafting recipe) { - friendlyByteBuf.writeVarInt(recipe.getWidth()); - friendlyByteBuf.writeVarInt(recipe.getHeight()); - friendlyByteBuf.writeUtf(recipe.getGroup()); - for (Ingredient ingredient : recipe.getIngredients()) { - ingredient.toNetwork(friendlyByteBuf); - } - friendlyByteBuf.writeItem(recipe.getResultItem()); - } - - //Forge - private ResourceLocation name = null; - public Object setRegistryName(ResourceLocation arg){ - name = arg; - return this; - } - - public ResourceLocation getRegistryName(){ - return name; - } - - public Class getRegistryType(){ - return Serializer.class; - } - } -} diff --git a/common/src/main/java/org/vivecraft/mixin/client/renderer/LevelRendererVRMixin.java b/common/src/main/java/org/vivecraft/mixin/client/renderer/LevelRendererVRMixin.java index d0b308b41..e4105120d 100644 --- a/common/src/main/java/org/vivecraft/mixin/client/renderer/LevelRendererVRMixin.java +++ b/common/src/main/java/org/vivecraft/mixin/client/renderer/LevelRendererVRMixin.java @@ -113,7 +113,7 @@ public int rainZ() { @Override public Entity getRenderedEntity() { - return this.capturedEntity; + return this.renderedEntity; } @Redirect(at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Mth;floor(D)I", ordinal = 0), method = "renderSnowAndRain") diff --git a/common/src/main/java/org/vivecraft/mixin/world/item/ItemVRMixin.java b/common/src/main/java/org/vivecraft/mixin/world/item/ItemVRMixin.java new file mode 100644 index 000000000..f897378b7 --- /dev/null +++ b/common/src/main/java/org/vivecraft/mixin/world/item/ItemVRMixin.java @@ -0,0 +1,25 @@ +package org.vivecraft.mixin.world.item; + +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +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; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +@Mixin(Item.class) +public class ItemVRMixin { + + @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;canEat(Z)Z", shift = At.Shift.BEFORE), method = "use", locals = LocalCapture.CAPTURE_FAILHARD, cancellable = true) + private void alwaysAllowEasterEggEating(Level level, Player player, InteractionHand interactionHand, CallbackInfoReturnable> cir, ItemStack itemStack) { + if (itemStack.getHoverName().getString().equals("EAT ME")) { + player.startUsingItem(interactionHand); + cir.setReturnValue(InteractionResultHolder.consume(itemStack)); + } + } +} diff --git a/common/src/main/java/org/vivecraft/mixin/world/item/ItemsMixin.java b/common/src/main/java/org/vivecraft/mixin/world/item/ItemsMixin.java deleted file mode 100644 index 36f119c2e..000000000 --- a/common/src/main/java/org/vivecraft/mixin/world/item/ItemsMixin.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.vivecraft.mixin.world.item; - -import net.minecraft.world.item.Items; -import net.minecraft.world.item.crafting.RecipeSerializer; -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.CallbackInfo; -import org.vivecraft.crafting.VivecraftCrafting; - -@Mixin(Items.class) -public class ItemsMixin { - - @Inject(at = @At("HEAD"), method = "") - private static void addCrafting(CallbackInfo ci) { - RecipeSerializer.register("vivecraft:vivecraft_crafting", VivecraftCrafting.SERIALIZER); - } -} diff --git a/common/src/main/java/org/vivecraft/mixin/world/item/crafting/ShapedRecipeMixin.java b/common/src/main/java/org/vivecraft/mixin/world/item/crafting/ShapedRecipeMixin.java index d0b7d4373..a4498c5ec 100644 --- a/common/src/main/java/org/vivecraft/mixin/world/item/crafting/ShapedRecipeMixin.java +++ b/common/src/main/java/org/vivecraft/mixin/world/item/crafting/ShapedRecipeMixin.java @@ -31,21 +31,14 @@ private static Item getVivecraftVanillaItem(JsonObject jsonObject, String resour return Registry.ITEM.getOptional(new ResourceLocation(vanillaItem)).orElseThrow(() -> new JsonSyntaxException("Unknown item '" + vanillaItem + "'")); } - @Group(name = "item to custom itemStack", min = 1, max = 1) - @Inject(method = "itemStackFromJson", at = @At(value = "INVOKE", target = "Lcom/google/gson/JsonObject;has(Ljava/lang/String;)Z", shift = At.Shift.BEFORE, remap = false), locals = LocalCapture.CAPTURE_FAILHARD, cancellable = true, expect = 0) - private static void customizeVanillaItemStackFabric(JsonObject jsonObject, CallbackInfoReturnable cir, Item vanillaItem){ - if (GsonHelper.getAsString(jsonObject, "item").startsWith("vivecraft")) { - cir.setReturnValue(customizeVanillaItemStack(jsonObject, vanillaItem)); - } - } - @Group(name = "item to custom itemStack", min = 1, max = 1) - @Inject(method = "m_151274_", at = @At("HEAD"), cancellable = true, remap = false, expect = 0) - private static void customizeVanillaItemStackForge(JsonObject jsonObject, CallbackInfoReturnable cir){ + @Inject(method = "itemStackFromJson", at = @At("HEAD"), cancellable = true) + private static void customizeVanillaItemStackFabric(JsonObject jsonObject, CallbackInfoReturnable cir){ if (GsonHelper.getAsString(jsonObject, "item").startsWith("vivecraft")) { Item vanillaItem = getVivecraftVanillaItem(jsonObject, GsonHelper.getAsString(jsonObject, "item")); cir.setReturnValue(customizeVanillaItemStack(jsonObject, vanillaItem)); } } + private static ItemStack customizeVanillaItemStack(JsonObject jsonObject, Item vanillaItem){ if (jsonObject.has("data")) { throw new JsonParseException("Disallowed data tag found"); diff --git a/common/src/main/resources/assets/vivecraft/lang/en_us.json b/common/src/main/resources/assets/vivecraft/lang/en_us.json index 860104035..fe560c7de 100644 --- a/common/src/main/resources/assets/vivecraft/lang/en_us.json +++ b/common/src/main/resources/assets/vivecraft/lang/en_us.json @@ -384,7 +384,7 @@ "vivecraft.options.shaderguirender.aftertranslucent": "Translucent", "vivecraft.options.shaderguirender.beforetranslucentsolid": "Opaque", "_comment_m5": "Option names", - "vivecraft.options.LOW_HEALTH_INDICATOR": "health indicator", + "vivecraft.options.LOW_HEALTH_INDICATOR": "Health Indicator", "vivecraft.options.SHADER_GUI_RENDER": "Shaders GUI", "_comment_m6": "Option tooltips", "vivecraft.options.LOW_HEALTH_INDICATOR.tooltip": "Pulses the screen red, when at low health, to indicate your current health status", diff --git a/common/src/main/resources/vivecraft.nonvr.mixins.json b/common/src/main/resources/vivecraft.nonvr.mixins.json index d93219929..c621a184b 100644 --- a/common/src/main/resources/vivecraft.nonvr.mixins.json +++ b/common/src/main/resources/vivecraft.nonvr.mixins.json @@ -18,7 +18,6 @@ "world.entity.monster.EndermanFreezeWhenLookedAtMixin", "world.item.CrossbowItemMixin", - "world.item.ItemsMixin", "world.item.crafting.ShapedRecipeMixin" ], "client": [ diff --git a/common/src/main/resources/vivecraft.vr.mixins.json b/common/src/main/resources/vivecraft.vr.mixins.json index 623be7999..1a64eead7 100644 --- a/common/src/main/resources/vivecraft.vr.mixins.json +++ b/common/src/main/resources/vivecraft.vr.mixins.json @@ -46,6 +46,7 @@ "client.renderer.NoSodiumLevelRendererVRMixin", "world.entity.vehicle.BoatMixin", + "world.item.ItemVRMixin", "world.item.PotionItemVRMixin" ], "server": [ diff --git a/forge/src/main/java/org/vivecraft/forge/Vivecraft.java b/forge/src/main/java/org/vivecraft/forge/Vivecraft.java index 6ae98d501..d56c84a5e 100644 --- a/forge/src/main/java/org/vivecraft/forge/Vivecraft.java +++ b/forge/src/main/java/org/vivecraft/forge/Vivecraft.java @@ -1,12 +1,18 @@ package org.vivecraft.forge; +import net.minecraftforge.fml.IExtensionPoint; +import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.network.NetworkConstants; @Mod(Vivecraft.MODID) public class Vivecraft { public static final String MODID = "vivecraft"; public Vivecraft() { - + ModLoadingContext.get().registerExtensionPoint(IExtensionPoint.DisplayTest.class, ()-> new IExtensionPoint.DisplayTest( + ()->NetworkConstants.IGNORESERVERONLY, // only needed on server, client is optional + (s,b)->true // any version is good + )); } }