June 16, 2025
did a few things now: fixed a bug with capturing the gazer with the pod item while its pathfinding to a pod block, updated the helmet (finally!) to being the right side up, and made it possible for the gazer pod item to be placed down as a gazer pod block. Here are all the commits I made today! Overall, very productive day, not sure how much there is left, mostly just QoL and niche stuff, making it more clean and professional, less buggy, more consistent, etc.
i gotta go EAT so heres a picture of my git commits with all the stuff. i made the gazer pod feature only spawn on crimson nylium so it doesnt spawn on trees, fixed gazer spawning and discarding by making it do so only on the server side, and added sounds to entering pod and exiting pod. I also identified a problem with capturing the gazer with a pod item while its pathfinding to a pod block
now it should only spawn on crimson nylium, instead of on top of the trees. it seems to always spawn next to a crimson nylium block too though. they are might be some desync between client and server (honestly i expected as much) which i'll need to investigate and fix before a full release
So i had to mess with a part of modding that i've never really touched before: datapacks. After a decent bit of research on the minecraft wiki, I figured it out, but i couldnt get the pods to spawn. Turns out, they WERE spawning, just on the nether roof. From there I had more problems so I just looked at how Minecraft configured stuff like crimson fungi to spawn in the crimson forest. After some more messing around, I got it to work. They now spawn very infrequently in the crimson forests. It also seems like they might be lagging the client a lot so i gotta fix that. Also they usually spawn on the trees and occasionally inside them.
modified the block model and texture to include a new bone: the gazer. I made it show the gazer inside the pod while it has a gazer and show an empty pod when it doesnt
Added config. the parameters are: enable tooltips, label display distance, enable hover animation, minimal mode. Minimal Mode basically only shows the hologram when you're looking at the item instead of all the time, and only shows tooltips when you're both looking at the item and sneaking. This will be version 4.0.0.
So I'd been trying to fix the destroy block particles for the GazerPodBlock and nothings worked so I decided to just overwrite them and make my own destroy particles. I think it looks a bit better and more nether themed.
Here's a picture or video for you so you can see how much effort and features went into this app! (This showcase does not include me selecting a profile picture by clicking on my pic on the profile page bc i do not want to show you my embarassing photo gallery)
Just released the apk on github. I'm calling it quits for now, gotta ship at some point and i dont think i can get any major update out so im going to stop wasting time on this (at least until after SoM).
Another important update. The pod block can only be mined with silk touch pickaxes and the mining speed now correctly matches that of netherrack. it also drops a gazer pod item with the correct nbt data (different depending on if the pod block had a gazer or not)
ok i made the gazer pod entity into a block (technically a block entity). i had to change a few things but it works pretty much the same way. the one new problem is that when its mined, the destroy particles are from purple and black null texture minecraft uses, instead of colors from the gazer pod block's texture
commit message: fetch messages again when user sends their own message and cap the messages at 50, also used realtime to fetch chatrooms instead of fetching constantly at intervals. I think the Realtime problem might be on Appwrite's side. People have been complaining in their discord that the Realtime API is very unstable and constantly stops working. I might have to ship without it working. I'm going to move on to making push notifications (if i have the time before SoM ends)
nvm it actually doesnt work :< it either doesnt connect or just doesnt get updates. i've tried everything, no luck. might need to switch back to using the web sdk.
FIXED REALTIME! heard on Discord that it was fixed but i had to do some other things first. Expo Go (the iOS app to test Expo apps) wouldnt work bc i needed to update my Expo to version 54, and then i switched from using the web SDK for Appwrite to the React Native SDK. there was something wrong with the way i was using expo constants for env vars. I'm not entirely sure how i fixed the Realtime, but i think it was bc of the switch from Appwrite to react-native-appwrite and also the fact that i made a React Native iOS platform on the Appwrite console for the project. im just happy its finally working after so long.
gazer pod entity and item now only receive gazer after animation, fixed bug with controlling gazer. took a while bc i ran into a ton of bugs caused by the old code, which really didnt like how i was doing it now. now i just need to switch to using a block instead of an entity for the pod and then make it use a different model when there is a gazer in it
I tried making the delta movement of the gazer stop after it completes its pathfinding, not sure if it really works better but its pretty accurate already. Rn I'm trying to make both the item and the pod entity update with whether or not they have a gazer only after the animation so theres no weird confusions.
started working on adding config. I think some time from the last time i shipped didnt count since i didnt devlog it. Don't worry, it did not take me 45 minutes to start adding config. although i did run into a little bug where intellij started telling me that a method was deprecated for 1.21.1 even though i was using 1.20.1. I'm also not exactly sure what the config should include. Probably whether or not tooltips are shown when hovered and maybe distance until it disappears, maybe size, etc. I also want to add a simple feature where tooltips only show up when u sneak or something like that and then add config for that too ig. Here's the Kaupenjoe vid i watched to learn how to make config
nvm i figured it out! I just looked at Minecraft's code for the Bee reall intensely for like 10 minutes and found this line in its constructor: this.moveControl = new FlyingMoveControl(this, 20, true); It works really great now. I guess the pathfinding didn't seem to be working because the Path it found was one that goes up and over the obstacle since its the shortest but the moveControl wouldnt allow it to fly over so it just went forward into the wall. Now I need to switch the GazerPodEntity to a block bc its better for the design
Ok so i kind of improved some of the GazerEntity's navigation but I can't make it pathfind properly for some reason. It won't really go around obstacles at all and never changes its y-level even if its target is below it. And there are no videos or anything else that talks about how to do this. THE POD WAS SUPPOSED TO BE THE EASY PART.
Ok i fixed the client-server mismatch with discarding the gazer for real this time. I accidentally removed the client side discard called in the animation controls and so the only thing changing it was on the server bc it used the timer on the server thread. There's still a client-server mismatch with whether the gazer pod entity has a gazer or not but everything still works fine. Here's my todo list for the Gazer Pod. I thought this was gonna be easy part :(
fixed the gazer dying (technically entering pod problem). it was bc of only the client getting the discard method called like i suspected. bc i wanted the discard to be called only after the animation finished, i put it with the animation logic, but that only gets called client-side i guess. Anyway, instead of doing it after the animation finished i just used a small timer. Now I'm running into some bugs with using the pod entity and item together.
Almost forgot about the gazer pod entity so i started on that recently. Shouldn't be too hard but im worried about the problem from earlier about the gazer's not actually getting discarded properly. I wonder if maybe that's only getting triggered on the client side because it happens after the animation; it would explain a lot.
upgraded expo, removed some unecessary or no longer used code and tried fixing Realtime (i thought it might have just been that i was using rows and columns when looking at the request when it was switched to tables and columns" a week ago with Appwrites new TablesDB but that wasnt it). also fixed something with the babel plugins
Cool project, i like it :)
Added the profile pics to the messages and cleaned up the styles that i (and Copilot) had been writing within the components' HTML. Right now on my list is mostly under the hood stuff: upgrade expo, switch to the react native sdk for appwrite, fix Realtime and find out how it works for the react native sdk. Oh also I removed some code which fetches display names from the database by making it use already fetched data.
Started making places use the new profile pics. Started with the list of chatrooms, making the avatars be listed on each chatroom card instead of participant name. I did a similar thing inside the chatroom screen by replacing the list of participants in the header with the avatars. I also noticed that when I switched to Appwrite a while back I forgot to implement the email verification and password reset. I was working on another project using Appwrite and was going to implement it there and realized I didnt know how to and had never done it. So thats another thing on the todo list, along with fixing Realtime and switching to the react native sdk for appwrite
Added profile picture uploading. I was running into some errors earlier though about uploading the file. I got frustrated and ended up just asking Github Copilot. It made it manually POST to the appwrite REST API instead of using the SDK and formatted the image. It said the problem was that I was suing the web SDK instead of the react native SDK. I didn't want to switch to the react native SDK bc i would have to change how Appwrite Realtime works in my app.
Major update! I added the bubble renderer that I've used in one of my other mods: https://modrinth.com/mod/speech-bubbles. Then I realized that the image I had in my head for what the box/bubble should look like was actually what the Minecraft tooltips look like. Which got me thinking: why dont I just use the tooltip info Minecraft gives me for each item. I wouldn't have to create my own code to get info about different types of items. So I made the texture look like tooltips and the info is directly from the tooltips so the mod is more like tooltip holograms
Spent a while fixing a little bug with the logo not showing. Had to do with the fact that I referred to it in an image src with its file path instead of importing it. Tried adding a create account and email verification but it wasnt working. I took a look at using OAuth2 with Google but i didnt want to do all that. I undid the previous changes and just added the create account button so at least anybody can create an account and use the website now.
Finally got the layout looking a bit better. Added the logo and some icons. The add buttons for groups and quotes look a lot better now and are better placed. I also really like where the quiz and leaderboard buttons are now since they're no longer in the way of the quotes. I also added a delete button for the quotes. Now that I'm finally happy with the layout, time to work on the create account part for the login page, and the quizzes and leaderboard
The hologram now show more information when hovered. Right now, it just shows enchantments and durability but I plan to add more such as hunger and saturation for food, the mod that an item is from, and maybe even a preview of the contents of for example of shulker box or bundle. I also want to change the box. Right now it uses multiple boxes in the background of the text and i want to switch to one box that i can use a texture for, for better customization (I've already done this before so shouldnt be too hard). Eventually, I'll probably also add config.
Made it impossible to attack other mobs when in control of the gazer, made the right click make a little more sense (before, the hand would move regardless of if you actually clicked on the gazer, giving a false sense of whether it was clicked or not). I also added the item to the creative mode tab with the necessary nbt data.
Made the overlay when wearing the gazer pod. Looks crappy but I'm not the artist. Spent the rest of the time trying to figure out two things: why whenever i do /kill @e[type=inhabitants:gazer] does it say it killed more entities than however many i spawned and why can't i control the gazer when i save and quit and get back in. Didn't get anywhere with those two problems unfortunately, but it's possible I fixed some other problems without realizing it since I switched from usnig IDs to UUIDs for most of the handling of gazerIds from the GazerPodItem
I'm lazy and need to go to sleep, here's my commit message instead:
ownership stays after quitting and other bug fix attempts
use UUID instead of int ID for gazerId in GazerPodItem, use EntityDataAccessor for enteringPod flag too, modify other goals to work with FollowPodHolderGoal
and this still doesn't work:
Did a lot of small but important things today: added animations and made gazer go toward owner when entering pod, added flipbook animations, and switched from just using variables to using synced EntityDataAccessors for better client-server syncing. Here's a video of the whole thing. There might be a small problem with the goal that makes the gazer go to the owner when entering pod and also the right click is misleading bc it always shows success even when you don't right click on the gazer.
Added the textures and made them change depending on whether the pod has a gazer or not. btw, i didn't mention, apparently the pod is supposed to go the other way on your head so your head goes through the hole and it looks like a hat so i have to fix that later. Also prevented it from being equipped as a helmet if it contains a gazer.
Ok so I spent about an hour and a little setting up the behavior with the entity and item and how it's used as a helmet. And then, IntelliJ stopped working. It was some weird JDK problem. IntelliJ just messed some stuff up, I have no idea why. Anyway, after spending like half an hour fixing that, I finished up the mechanics with the gazer pod and gazer. Now I'm going to just do some polishing, check any potential edge cases, get the texture to change depending on whether or not the pod has a gazer, and then show the team. Oh and get the animations working. I don't know why I didn't do that earlier.
Things are coming along well. I changed the colors again because I want to test out other colors (in case you didn't notice, they're almost the same colors and styles as Supabase and Appwrite use in their websites). Got most of the stuff working with Appwrite. I need to work on better navigation later. Maybe add a sidebar for the groups instead of having separate pages. Also, since this was vibe-coded, I'm going to look through it all so there aren't problems later bc GitHub Copilot was stupid.
So i made the pod item a helmet now and added a keybind to start controlling the gazer. Haven't finished it yet so its not committed but heres a picture of the pod on my head taken from the third person perspective of the gazer
implemented raytracing so that items behind blocks don't render holograms. also added caching for labels which are only recalculated when the item stack changes and for the raytracing result which is recalculated every 5 ticks. The cache is also cleaned every 30 seconds of any item drops that no longer exist. Here's a picture of the LOS (Line of Sight) check happening and the cache getting cleaned.
Added frustum culling so it only renders holograms for drops in view. Here's a picture. 1 hologram was rendered while i was facing the item drop and when i turned around it went to 0.
Well i fixed the bug from earlier, it wasn't exactly chunk loading that was the problem but it was distance from the player. i tried to make dynamic chunk loading for the gazer when it was being controlled but it doesnt work. i'm going to start working on the actual behavior for the mob now instead and get back to that later.
After ONE WHOLE HOUR of debugging and trying different things, I know what's really happening. I was explaining the problem to my brother who only knows basic python and he immediately said to me, Oh, it's out of render distance, isn't it? Brain short-circuits bruh. The desync wasn't really the problem although it could have caused problems anyway. The desync no longer happens, at least not enough, and i completely forgot what i changed. Now I'm probably either going to find a way to keep chunks loaded where the gazer is or have the player lose connection to the gazer and make it a game mechanic. Here's a screenshot of the client sending a GazerControlPacket and the server receiving it but not moving or updating the Gazer.
Ok so now the player can control the gazer, it just switches to the gazers pov and uses the player's control and sends those inputs to the server for use. It seemed to be working great and was only a little jerky, but I just discovered something TERRIBLE. The client and server's positions for the gazer are not synced. This leads to the gazer getting stuck and glitching into blocks and the camera sticking there but the gazer keeps moving. As the gazer is used, the differences between client and server slowly accumulate. I kind of assumed client and server would be synced but I forgot that I was sending packets with the client's input not the client's position for the gazer. I don't really want to rely on the client for this since its not very secure and open for hacking but nobody would do that on a mod, right??? I'll have to use the gazer's movement, not position, because changing position every tick would appear very laggy. Here's a screenshot of the logs that shows the syncing problem:
got the camera and some control stuff working. it doesn't feel the smoothest but its not laggy. i could have used the passenger system for this but just switching the camera seemed easiest and i want to stick with that. im working on yaw and pitch now and then moving relative to the yaw and pitch. I would upload a video or picture of it working but I already launched Rocket League so... here's some code ig
Began working on the Gazer. It's a very unique mob and probably going to be very tough to implement but things are going well so far. Basically you can control it and use it to scout. I have a good structure for how the entities AI will work and the camera and movement setup should work. For the first time, Minecraft actually has something for switching to a mob's camera already. I'm having some trouble with server and client differences and ownership between Gazer Entity, the player, and the Gazer Pod Item which the player uses to interact with the Gazer.
Minecraft mod that adds fictional fauna. More can be found on the Github page and in the Team Obsidian Discord: https://discord.gg/xyUefhk8
### Demo email and password email: [email protected] password: hackclub *If you find any bugs pls message me on Slack: mattseq* ### Inspiration My friends at school started writing down quotes, mostly really funny out-of-context ones, with the promise that at the end of the semester we'd all get together with all our quotes and play a Kahoot to guess who said which one. ### Pitch “Everyone has that one friend who drops the funniest roast, the most random out-of-context line, or the perfect piece of wisdom. But those quotes usually get lost. **Quotient** is a quote bank that makes saving and sharing those moments effortless — and turns them into games. Build your own quote bank, join groups to pool sayings together, and play quizzes. It’s part memory vault, part trivia night, and all about the joy of collecting and playing with words.” ### Tech Stack Made with React and Framer Motion. Appwrite as BaaS and for hosting.
So today I did something very important. I learned how to use cloud functions. I just made a basic one that replaces the KLIPY api call so the api key isnt built into the app. I also ran into a bug I saw earlier: ERROR [TypeError: Cannot read property 'getItem' of undefined]. I got really frustrated because it literally gives me no information so I asked Github Copilot which told me to switch from appwrite to react-native-appwrite but if i do that, appwrite's realtime doesnt work. It doesn't seem to actually affect anything in the app and it doesnt crash it either so I'm leaving it for now. I also added a nice README with a description, setup instructions and acknowledgements.
Finished the whole mod ig. It was really simple, I have some ideas for more features but they don't really fit this mod's name so I'm probably going to make another one that has a broader scope. Anyway, Modrinth and Curseforge are already reviewing it so I guess I'll ship it once that's done.
I spent all of yesterday switching the app from using Firebase to using Appwrite as its BaaS. I did this for three reasons: Appwrite is open-source and I can self-host it or put it on Nest; With Github Education, I can get the Appwrite Pro Plan for free; and Appwrite allows me free access to things like cloud functions, storage for files, push notifications and messaging, etc. It's a little lower level than Firebase and I had some problems with connecting it to the Appwrite Console and setting up Realtime for subscribing to new chat messages. I still haven't set up permissions (which is like Firebase's security rules) because it keeps giving errors and I don't know why. Also SoM was down yesterday so I couldn't make a devlog which is why this one's a little long.
### Pitch V!be is a chat app where every message is a GIF — no text allowed. It turns conversations into a creative game of wit and timing, where picking the perfect animation is the key to getting your message across. Ready to speak a whole new language? V!be is your playground. ### Showcase If you don't want to go to the trouble of installing this app or if you do not have an Android device, don't worry! You can still see the app in full in the latest devlog i posted, which includes a full video of almost every feature. ### AI Usage AI was used for all READMEs, some frontend code, and a few times i got frustrated. Not vibe-coding (except maybe frontend), just snippets and help. I would classify it as 40% AI
Client-side Minecraft mod that adds holograms for item drops with item and stack count and displays tooltip info when looked at. Includes performance features such as frustum culling, raytracing, and caching.
This was widely regarded as a great move by everyone.