diff --git a/site/blog/minecraft-classic-server.md b/site/blog/minecraft-classic-server.md
new file mode 100644
index 0000000..7b7e5e1
--- /dev/null
+++ b/site/blog/minecraft-classic-server.md
@@ -0,0 +1,20 @@
+---
+title: i built a minecraft classic server
+timestamp: 2024-07-08T10:37:00.00Z
+tags: [minecraft, minecraft classic, dev]
+desc: i got bored and built a minecraft classic server
+header_image_file: 2024/07/classic2.png
+header_image_alt: Screenshot of my Minecraft classic server showing two players standing in front of a stack of blocks.
+---
+
+a while ago i was looking for something to do and my brain decided i should.. build a complete reimplementation of the minecraft server, naturally. i knew i'd never get anywhere close to finishing that project before losing steam so instead, i redirected this inspiration into [a minecraft classic server](https://github.com/zyllian/classics)!
+
+
+
+minecraft classic has [fairly simple networking](https://wiki.vg/Classic_Protocol) as it turns out, so building a server which vanilla classic clients can connect to isn't too bad if you know what you're doing, and with no need to stay true to the vanilla map format, you can simplify things even further!
+
+minecraft classic actually still has a decently large community around it, and what i believe are the most popular clients/servers all implement [an extended networking protocol](https://wiki.vg/Classic_Protocol_Extension) to add extra features that vanilla classic doesn't support.
+
+my implementation lacks basically any kind of anti-cheat and is lacking most of the community protocol extensions, but it's still pretty cool to have built it! i love working on random projects and it's nice to see one which is actually useable, even if there's [a lot to add](https://zyllian/classics/issues)!
+
+
diff --git a/site/pages/index.md b/site/pages/index.md
index 196a6d3..7331748 100644
--- a/site/pages/index.md
+++ b/site/pages/index.md
@@ -8,7 +8,10 @@ hi! i'm zyl, a trans doggirlthing ΘΔ in the pnw.
if you're interested, check out [my youtube](me$https://youtube.com/@zylpup) to see what i've got going on there
-if you're an adult i have a couple socials floating around:
+if you're an adult i have a few socials floating around:
- [cohost](me$https://cohost.org/zyl)
+- [instagram?](me$https://www.instagram.com/zylbarker/)
- [tumblr](me$https://www.tumblr.com/zyllian)
+
+if you like what i do or just wanna help me out [check out my payment info](/pay-me) :)
diff --git a/site/pages/pay-me.md b/site/pages/pay-me.md
index 48d9500..d8d6109 100644
--- a/site/pages/pay-me.md
+++ b/site/pages/pay-me.md
@@ -10,6 +10,8 @@ embed:
you should send trans people money. here's how you can send _me_ money:
+(preferred methods are feeless, so i'll receive the full amount you send)
+
- **[\$zylpup](https://cash.app/$zylpup)** on cashapp **(preferred)**
- **z@zyl.gay** on apple cash **(preferred)**
- [github sponsors](https://github.com/sponsors/zyllian)
diff --git a/site/pages/pet.md b/site/pages/pet.md
index dc10549..0000889 100644
--- a/site/pages/pet.md
+++ b/site/pages/pet.md
@@ -74,8 +74,14 @@ embed:
-
+
changelog
+
+ 07/08/2024
+
+ - slow pet food/happiness decay
+
+
07/04/2024
diff --git a/site/root/js/pet.js b/site/root/js/pet.js
index b8f6ba3..9ca74f3 100644
--- a/site/root/js/pet.js
+++ b/site/root/js/pet.js
@@ -12,7 +12,7 @@
/** the amount of time it takes for a pet to have to GO */
const POTTY_TIME = 100;
/** how fast a pet's food value decays */
- const FOOD_DECAY = MAX_FOOD / (UPDATES_PER_HOUR * 8); // to stay on top should be fed roughly once every 8 hours?
+ const FOOD_DECAY = MAX_FOOD / (UPDATES_PER_HOUR * 12); // to stay on top should be fed roughly once every 8 hours?
/** the rate at which a pet ages */
const AGING_RATE = 1;
/** how fast a pet's potty need decays */
@@ -20,7 +20,7 @@
/** how much mess can be in a pet's space at once */
const MAX_MESS = 5;
/** how fast a pet's happiness decays */
- const HAPPINESS_DECAY = FOOD_DECAY;
+ const HAPPINESS_DECAY = FOOD_DECAY / 1.5;
/** a pet's maximum happiness */
const MAX_HAPPINESS = 100;
/** how quickly a pet's happiness will be reduced by when hungry */
diff --git a/site/sass/index.scss b/site/sass/index.scss
index 60f851c..96eb4d9 100644
--- a/site/sass/index.scss
+++ b/site/sass/index.scss
@@ -117,6 +117,7 @@ abbr {
}
.blog-post {
+ margin-top: 16px;
margin-left: auto;
margin-right: auto;
max-width: max(1000px, 40%);
@@ -157,9 +158,38 @@ abbr {
h6 {
text-indent: 0;
}
+
+ .image {
+ width: 100%;
+ padding: 8px;
+ background-color: var(--accent-color);
+ text-indent: 0;
+ box-sizing: border-box;
+ margin: 8px;
+
+ &.w50 {
+ width: 50%;
+ }
+
+ img {
+ width: 100%;
+ }
+
+ span {
+ color: var(--accent-text-color);
+ }
+ }
}
}
+.float-left {
+ float: left;
+}
+
+.float-right {
+ float: right;
+}
+
#pet-counter {
display: none;
position: fixed;
diff --git a/site/templates/blog-list.hbs b/site/templates/blog-list.hbs
index 1cd5645..0904a3d 100644
--- a/site/templates/blog-list.hbs
+++ b/site/templates/blog-list.hbs
@@ -17,6 +17,7 @@
{{#each resources}}
{{title}}
+
{{timestamp}}
{{desc}}
{{/each}}
diff --git a/src/builder.rs b/src/builder.rs
index aeb635a..90caf00 100644
--- a/src/builder.rs
+++ b/src/builder.rs
@@ -2,7 +2,7 @@
use std::path::PathBuf;
-use eyre::Context;
+use eyre::{eyre, Context, OptionExt};
use gray_matter::{engine::YAML, Matter};
use handlebars::Handlebars;
use lol_html::{element, html_content::ContentType, HtmlRewriter, Settings};
@@ -180,9 +180,51 @@ impl<'a> SiteBuilder<'a> {
}
}
+ Ok(())
+ }),
+ element!("md", |el| {
+ el.remove();
+ let class = el.get_attribute("class");
+
+ let md_type = el
+ .get_attribute("type")
+ .ok_or_eyre("missing type attribute on markdown tag")?;
+
+ if md_type == "blog-image" {
+ let mut src = el
+ .get_attribute("src")
+ .ok_or_eyre("missing src attribute")?;
+
+ if src.starts_with("cdn$") {
+ src = self.site.config.cdn_url(&src[4..])?.to_string();
+ }
+
+ let class = format!("image {}", class.unwrap_or_default());
+ let content = el
+ .get_attribute("content")
+ .ok_or_eyre("missing content attribute")?;
+
+ el.replace(
+ &format!(
+ r#"
+
+
+
+
+
{content}
+
+ "#
+ ),
+ ContentType::Html,
+ );
+ } else {
+ return Err(eyre!("unknown markdown tag type: {md_type}").into());
+ }
+
Ok(())
}),
],
+ strict: true,
..Default::default()
},
|c: &[u8]| output.extend_from_slice(c),