compresses files using gzip now.
Log in to leave a comment
i thought this would be a lot harder but honestly it was easy. first i watched some videos on how git works, this series by Brief was amazing: https://www.youtube.com/watch?v=fWMKue-WBok&list=PL9lx0DXCC4BNUby5H58y6s2TQVLadV8v7. git actually has a really elegant solution to storing snapshots of files efficiently and exploiting file structure to do so. i wont elaborate on the details, you can watch the video if you like. so far its only around 130 lines of python, but i only have basic commits using the whole object system. im not sure how much i want anvil to be similar to git tho, i might make a remote server like github but using locks so only one person can push changes at a time. thats how it used to be done and it means i dont have to implement merges and all those more complicated stuff. also i just want to experiment around with various version control ideas. heres a picture of one of those objects, specifically a tree that references other blobs with their hash
Log in to leave a comment
releasing the mod today! its not entirely complete, the commit jsons arent compressed, block changes arent stashed at intervals so it might take a lot of memory after a lot of block changes. i improved the commands, wrote the README, etc. i also learned github actions yesterday, so i set up one that automatically creates issues from any TODO comments, which was cool, although not that useful for a small project
Log in to leave a comment
ok just finished up. changes are now automatically stashed and unstashed when stopping and starting the server so they’re never lost. i also added a status command as well, so its a bit more obvious whats going on. as promised, i recorded a video demo but it was too large to attach to this devlog so here’s a google drive link: https://drive.google.com/file/d/1O23bMkSVQa4SZZll06KLZY89ol3WN7id/view?usp=sharing
Log in to leave a comment
forgot to devlog for a while. i’ve most of the basics working. block tracking works (just for placing and breaking blocks), i can commit those changes and rollback to the previous commit. its not the most optimized vcs, it doesnt have hashing, buckets, file compression, or objects + trees, and it records block changes at the same position multiple times, but it does work. besides it doesnt have to store as much as git since its storing deltas not whole snapshots. im too lazy to record it but i will on the next devlog, promise. rn im working on stashing block changes if the server is turned off or at a fixed interval to prevent it from taking up too much memory
Log in to leave a comment
just got started with setting up my environment. i cloned a plugin template off of github. its pretty well made, it basically looks inside your hytale game files and uses server.jar from there, and when u run it i runs server.jar with your mods. then you can just join with your client. had to make a small change to the build.gradle bc my hytale files dont exist in the default location, they exist on another drive. i also got started with some of the block tracking using events. i found this repo where someone already made git for minecraft (which was my original idea a few months ago) https://github.com/rayyankhan47/Blockbase which is helpful to base it off of
Log in to leave a comment
added a initialization endpoint so that an admin can be created when the service first starts. had to make this bc only admins have permissions to create users but when the service first starts and there are no admins, its otherwise impossible to create an admin, which results in a weird permission paradox. the initialization endpoint only works when there’s no admins already in the db. i also added a README, finally.
Log in to leave a comment
took me 2 + 1/2 hours to add paintings. yep. u read that right. there was no kaupenjoe tutorial for adding paintings in 1.20.1 even though he made one for fricking custom signs (cmon kaupenjoe get your priorities straight). anyway i was digging through source code and also looked at the 1.18 tutorial. i eventually found a solution in kaupenjoe’s discord. i was partially correct but i did need to make a placeable.json file after registering the painting variants. heres some pictures of my code and also the paintings in game.
took me like 30 minutes to switch from h2 to postgres. it was so stupid bc i put a colon instead of a slash in the database url. i was just running a postgres docker container on my rpi instead of the laptop im using. eventually i should make a docker-compose.yml to include the db. it was surprisingly easy to switch databases, all you need to do is change the url name and add the postgres driver as a dependency.
Log in to leave a comment
added jwt auth filter. basically it just extracts stuff like roles from the jwt and passes it on as SecurityContext and in my SecurityConfig i can use methods like .hasRole() on specific URIs. i also included claims in the jwt so that it contains id, username, roles, etc. and it also has specific extract methods but i might combine those into one that returns a User.
Log in to leave a comment
its now hashing passwords with Bcrypt. here’s a picture of me using the h2 console to check what the passwords stored as
Log in to leave a comment
renamed the project to auth-service. i also implemented the login and verify endpoints using jwts. i also started using postman for the first time to test my api, since im on windows and used to ssh into my rpi just to use curl. im still not hashing passwords yet lol. heres a picture of my postman flow that i used to test
Log in to leave a comment
started by watching Mosh’s spring boot tutorial. dont really know how im supposed to use some of that stuff though. got started with creating a database with spring jpa. just using h2 for now, i’ll switch to postgres later or something. all i did was get the repository and basic crud working and user methods working. ran into a small issue with spring security automatically asking for authentication at every endpoint. next i need to create jwt auth, and use the security filter stuff provided by spring security to block certain endpoints. then i’ll create roles and make the verify endpoint
Log in to leave a comment
just been working on various small things to polish. found a few bugs myself as well. here’s my notes. i just finished all the bugs/issues assigned to me, jay’s working on his, and i’m going to keep bug testing and fixing whatever i find.
Log in to leave a comment
learnt Three.js and how to animate models with GSAP.
Log in to leave a comment
for the past few days, i’ve been working on an actual website implementing some of these techniques. i learned a lot, like how to make hover animations, video animations, and most importantly i learned that GSAP’s pin is far superior to position: sticky and is more flexible. i dont really have any good pictures so here’s a picture of the site i was working on.
Log in to leave a comment
added a progress indicator for the carousel. unfortunately they’re both positioned absolutely so it gets messed up when the screen size changes. def gotta fix that. i also noticed something really important. when looking at others websites, specifically GSAP’s showcase site, i noticed that they dont have to make scene containers super tall in order to have sticky objects. it turns out they were using GSAP’s pin which I already discovered but didnt really understand how useful it was. instead of creating really tall containers to hold the sticky objects while you scroll down you can just pin the whole scene container with gsap and define how long you want it to stay like that. the other animations work as usual and can still work on scroll. I replaced the sticky positioning in the inhabitants section with that and i plan to do so with as much of the rest of the site as i can.
Log in to leave a comment
decided to make a carousel for the mobs features in Inhabitants. doesnt look too bad but the images are positioned absolute and their parent’s sizing is messed up. its fine tho ig. ts gonna look terrible on mobile. i also changed the font. oh and did i mention its on github now? it still looks like a beginner made it, which to be fair, is accurate
Log in to leave a comment
tried my best to make the member cards glassy. doesnt look too bad but not what i imagined. i like the blur though. I also made a transition to the mod section. i added a glow to the bottom of the team section to break up the black background a bit. i also started on the mods section but im not sure how to go about it.
Log in to leave a comment
had a random idea for the next scene. show the team obsidian logo and have some parallax objects behind it. i decided to use Minecraft’s enchantment alphabet. it’s a little heavy for the client so i’m not sure if im going to keep it. i also definitely need to find some way to measure performance.
and i did it again. i forgot i was writing this devlog and kept working. now i just finished with the team section. it shows a circular profile pic for each person but when you hover over it the card surrounding the picture appears which has more information.
Log in to leave a comment
basically copied a part from the old website. when you first load, it shows a nether portal with some mobs around it and when you scroll it zooms into the portal and then shows the main page. i just recreated that, except with gsap (which has scrubbing). i also tried to make it as performant as possible by getting rid of the image entirely when the animation is finished playing. im going to try and make the ScrollImage component that i made for it a little more modular now. here’s a video of the animation and some of the code. it basically just loops through animation frames captured in blender. Jeremy said he’d make a version with more image frames or give me a video i can use instead so we can make it smoother.
Log in to leave a comment
ok fixed a minor mistake. i thought i had to wrap the ReactLenis component around my content but you’re actually supposed to just leave it as a standalone component at the top. ig i kinda skimmed the docs since there’s an example of this on there. i had to go back and fix this on my other projects as well. here’s a picture of the docs and then a picture of what my code is now. before, i had the AnimationWrapper (which is essentially the ReactLenis component) wrap around the other content
Log in to leave a comment
ok took a while looking at what we already have (what Jeremy already made). he used framer motion instead of gsap tho. i decided that its probably best to just redo the whole website instead of trying to make changes to the existing one. it will probably take me less time and the result will be better and with less clutter from old code. I created a new Next.js app and tried setting up GSAP + Lenis like I have with other React apps. I immediately ran into some problems with SSR. this is my first time using Next.js so it took some getting used to. I separated the basic HTML from the animations so that the animations would run directly on the client and the HTML could be rendered server side. i had to implement a mount check to see if the elements were in the DOM before the animations tried to run. i havent yet made a github repo but here’s a screenshot of some of my code. its an AnimationWrapper which returns a ReactLenis element and passes down children. it handles all the gsap animations as well, calling Animate()
Log in to leave a comment
finally animated videos on scroll! it was pretty easy actually, since GSAP had an onUpdate() callback i could use in animations. its kinda laggy tho. i would record a video but i already launched battefield 6 sooooo… Here’s a picture of all the commits from today
Log in to leave a comment
wrote about gsap timeline. made this cool animation with cards. It made me realize that i also need to figure out how to do hover animations, probably with GSAP’s Observer plugin. I’m starting to really appreciate the GSAP system. definitely using it over Framer Motion from now on.
Log in to leave a comment
so i just spent like 50 mins trying to make this one transition i saw on a website. basically a curved container with a different background begins to cover the viewport and then transitions into the next scene. I ended up doing it a little differently by making the rounded corners animate to flat again. the website used a parallax effect but i found that was a little difficult so i improvised. i also added some parallax and scaling to the text on the next scene, just to see how it would look. the website i was looking at was https://sav1n.com/. i also finally recorded my demo site
Log in to leave a comment
ok just finished up with writing about
i forgot i started writing this and kept working. whoops. i was about to say that i just finished writing in the README on svg manipulating and already started on parallax. now im actually done parallax. it wasnt too hard once i thought about it. i was kinda sad i couldnt use GSAP’s ScrollSmoother tho since they make it really easy and add some useful stuff too.
Log in to leave a comment
ONE AND A HALF HOURS LATER…
damn GSAP’s SVG plugins are hard. well really it was just DrawSVG. i didnt really read the docs very closely to begin with so i didnt know that it only affects strokes in an svg not fill. stroke-only svgs are very hard to find it seems. i ended up copying one off a GSAP demo. as for MorphSVG, that was a bit easier. i have yet to write in the README about all this so I’ll commit after i do that. another thing i realized is that GSAP’s “pin” is almost certainly better than “position: sticky” at least when u have multiple sticky objects in the scene since with sticky positioning they just collect on top of each other at the bottom of the scene container when it starts to leave the viewport. here’s a picture of the orange svg being drawn. i know, i should record it, im just too lazy to launch obs rn.
Log in to leave a comment
ok just made a few changes so that i can ship. made uploading files a little more obvious
Log in to leave a comment
twin lmk if you need a subdomain with HTTPS, i am more than happy to help
made a CONTRIBUTING.md. hope people will actually contribute but not expecting it. I also compiled a list of scroll-driven techniques to experiment with such as:
Horizontal Scroll
Parallax
SVG Morphing
Video
3D Models
Graphs
im think im going to try taking a look at SVGs next. either that or parallax
Log in to leave a comment
figured out the zoom effect! was reading through GSAP docs and found a property called pin, which does essentially the same thing as position: sticky but works even with overflow: hidden. now i can use overflow: hidden on the scene contanier to hide the horizontal scrollbar and pin the object in the viewport, scale it up and then transition to the next scene container, whose background perfectly matches that of the scaled-up object. I also found some cool new plugins when looking through the GSAP docs such as SplitText and DrawSVG. I wrote a bit about using SplitText and im definitely planning on experimenting with DrawSVG later. I also committed it all to a github repo, including both my notes and my experiments.
Log in to leave a comment
I had already figured out how to do basic “sticky scenes” as i call them but i’m currently trying to do a zoom-in effect. my initial idea was:
overflow-x: hidden to prevent the horizontal scrollbar from appearing.div with the same color as the zoomed-in object and fade it in on top of the old object.div is now the scene container.position: sticky doesnt work if you have overflow-x-hidden.
Log in to leave a comment
basically been messing around with Lenis and GSAP until I realized there’s not a lot of help online for common scrollytelling techniques, so i decided i might as well format the notes i was already creating so that others don’t have to figure it out for themselves. i actually discovered scrollytelling from fellow hackclubbers participating in Summer of Making who used Lenis in their portfolios.
Log in to leave a comment
ok just finished adding file dropzones! had a bit of a hard time figuring out how make it look the exact same but have the dropzone underneath. the only thing i dont like is that its not very obvious that it even exists. unless you actually tried to drop a file, you wouldnt be able to tell that its possible. also i realized i should probably have some sort of loading screen or something while it uploads files. maybe should also implement a size limit but i really dont want to limit file uploads in any way especially by size.
Log in to leave a comment
just did some styling. had to use github copilot a bit bc i suck at styles and colors, but eventually landed on something i liked and worked from there. i also just used ai to make a banner image for me to put on flavortown bc it looks really empty without one. here’s a before and after picture of the site as well as the banner
Log in to leave a comment
used express-session for auth. pretty easy to setup, at least for one user. i still havent made file uploading possible through the frontend. i’ll probably do that next since im too lazy to set up multiple users. i did also make the frontend fetch private file metadata which only took a bit of copy + paste. also yes i uploaded the exact same file for every single test
Log in to leave a comment
ok i just finished with some frontend stuff: it fetches public file metadata and displays them along with a link to where its actually hosted. there’s also space for displaying private files later. i would have done that too but i need to make the backend send a jwt cookie instead of just the jwt token itself (or get express-session working). for a while i was just trying to figure out styling. i understand it in principle but it always becomes harder in practice
Log in to leave a comment
ok so i didnt actually do much coding, but i did do some research into express.js and other questions i had. I’ve uploaded a pic of my notes below. i found out how i could implement rate limiting later, but most importantly i figured out how to user express-session. this should be really helpful when making multiple users later. in order to store user data though, i would need a database like redis or postgre. its also probably best if i switch from storing jsons for file metadata to using a db since it will probably be accessed very frequently. so it looks like the plan is: switch from storing jsons to postgresql for file metadata; use express-session to allow multiple users and connect it to the postgresql db. i still want to do some research into how express-sessions actually works first, though, since its not obvious HOW exactly it authenticates the user. anyway, the coding i did do was just getting the frontend to fetch file metadata from the endpoints i already set up. not done yet, so i havent pushed a commit
Log in to leave a comment
added basic frontend with login (doesnt store jwt cookie yet), configured caddy to expose the api, added /api/auth endpoint to check auth. had a problem for a while with this annoying error:
Failed to load module script: Expected a JavaScript-or-Wasm module script but the server responded with a MIME type of "". Strict MIME type checking is enforced for module scripts per HTML spec."
the browser fetched the html file properly but it couldnt get the css and js files that it referenced. I thought it had to do with the base url in the vite config, since i was building static files and servign them. i’d seen this same problem before and changing the base url worked. it turns out it was Caddy this time. i used handle_path instead of handle. handle_path strips the path prefix so it was looking for the js and css files in the wrong place. lesson learned! hopefully, i never make that mistake again.
Log in to leave a comment
before i even started coding i needed to set up the storage. im using this on my rpi 400 (running alpine linux) for testing but it only has 16gb and im almost out so i dont want to use it for storage. i found a 64gb usb that i can use tho. i just had to figure out how to mount the new device so i could access it. after that, i just made a simple api for logging in and uploading files. Tech stack: Docker, Express.js for the backend (first time using it), Caddy, and probably React for the frontend later. the public files are served directly from Caddy and the private files are served from Express with authentication. it basically just makes a random id for the uploaded file and saves it with that id. it also saves some metadata including the original name in a json file. Heres a picture of some of my notes and the docker-compose.yml which uses the usb drive as storage with /mnt/drive
Log in to leave a comment
added the 2 new Bogre dishes: Uncanny Pottage and Stinky Bouillon. Also made some changes to the Fish-Snot Chowder. apparently it was a FoodItem not a BowlFoodItem so you could just eat the entire bowl along with the chowder. fixed that and also made it not give nausea if you ate it underwater. Here are the mechanics i was instructed to implement:
Everything is done, but i still need an icon for the Rotting Disguise Effect, im using rotten flesh for now.
spent about an hour changing the model and stuff to be closer to what our artist/designer wanted. we ended up not doing it that way because the z-fighting caused by the glowmask requires some changes that make it look weird. heres a picture. the inside is glowing but i had to move that glowmask layer up a little so it looks sus
Log in to leave a comment
more work on the warped clam. made the pearl ambience particle spawn on the corner of the pearl, made both the warped clam particles animate through their spritesets. i also put in a new model i was given. there were some problems with what’s called “z-fighting” (where the textures are overlapping and are “fighting” over the same position) so i had to change a few things.
Log in to leave a comment
just worked on warped clam particles today. added a new one to show when the clam has a pearl. i also disabled the glowing layer whenever the clam doesnt have a pearl
Log in to leave a comment
end update finally 🎉 those little things look so unsettling but also very fitting
apex’s charge now properly breaks shields (earlier it only broke the shield in the offhand). i also moved the code for the dryfang’s rival fight from customServerAiStep() into a separate goal which fixed the target selection (one of the other target goals wasnt activating at all after the rival fight)
Log in to leave a comment
improved the collision detection for the apex’s charge goal. instead of just using minecraft’s mob.horizontalCollision (which hardly works), i made a custom box in front of the apex and it checks whether there are any blocks in that area
Log in to leave a comment
just re-adding some small tweaks that got lost in another branch. the giant bone can produce a shockwave when used and you can feed it to wolves to give them a health and strength buff
Log in to leave a comment