Add a lot of old posts to the blog again
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
title: 'A new project: OBS Stream Effects'
|
title: 'A new project: OBS Stream Effects'
|
||||||
category: Blog
|
category: Blog
|
||||||
tags:
|
tags: [StreamFX, OBS]
|
||||||
---
|
---
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
title: 'Stream Effects is now available! (OBS Studio)'
|
title: 'Stream Effects is now available! (OBS Studio)'
|
||||||
category: News
|
category: News
|
||||||
tags:
|
tags: [StreamFX, OBS]
|
||||||
---
|
---
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
title: 'OBS Stream Effects v0.4.1 (Release)'
|
title: 'OBS Stream Effects v0.4.1 (Release)'
|
||||||
category: News
|
category: News
|
||||||
tags:
|
tags: [StreamFX, OBS]
|
||||||
---
|
---
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
|
|||||||
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
title: 'OBS Stream Effects v0.4.1 (Release)'
|
title: 'A look back at OBS Stream Effects 0.4.2 and the path to 0.5.0'
|
||||||
category: Blog
|
category: Blog
|
||||||
tags:
|
tags: [StreamFX, OBS]
|
||||||
---
|
---
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
|
|||||||
@@ -0,0 +1,79 @@
|
|||||||
|
---
|
||||||
|
title: 'More Random Satisfactory Stuff'
|
||||||
|
category: Blog
|
||||||
|
tags: [Satisfactory]
|
||||||
|
---
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>3D Factorio, or more commonly known as Satisfactory, has been my go-to game for this weekend and likely will be for all future weekends once the Early Access is open. Here's some more things I've discovered throughout the game.<br></p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:more -->
|
||||||
|
<!--more-->
|
||||||
|
<!-- /wp:more -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2>Power Slugs have different Tiers</h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>There are currently three accessible Power Slub tiers: Green (Tier 1), Yellow (Tier 2) and Purple (Tier 3). Each Tier gives a different amount of Power Shards, and each increase in the Tiers is also much more difficult to find. Tier 1 Slugs give 1 Power Shard, Tier 2 Slugs give 2 Power Shards and Tier 3 Slugs give 5 Power Shards.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>In my entire play time, I've found a total of three Purple Power Slugs, and only two of them are within an Area that I can actually reach.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:gallery {"ids":[729,731]} -->
|
||||||
|
<ul class="wp-block-gallery columns-2 is-cropped"><li class="blocks-gallery-item"><figure><img src="https://www.xaymar.com/wp-content/uploads/2019/03/ScreenShot00009.jpg" alt="" data-id="729" data-link="https://www.xaymar.com/?attachment_id=729" class="wp-image-729"/><figcaption>Green Power Slug</figcaption></figure></li><li class="blocks-gallery-item"><figure><img src="https://www.xaymar.com/wp-content/uploads/2019/03/ScreenShot00004-1.jpg" alt="" data-id="731" data-link="https://www.xaymar.com/?attachment_id=731" class="wp-image-731"/><figcaption>Purple Power Slug</figcaption></figure></li></ul>
|
||||||
|
<!-- /wp:gallery -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2>Host and Client have different Mechanics</h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>This is likely to be fixed in the future, but this means that clients (players) can interact with things in a different way than the host (main player) does. Things that crash the host don't crash if a client does it, and the client can open crafting benches and storage boxes that the host has open.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>That means that the Hard Drive Discovery crash does not happen if a client selects the recipe, allowing you to progress just a little bit further. Clients may also be able to select Tier 4 through 6, but that is a rare bug, and finishing these seems to corrupt the save file permanently.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2>Verticality</h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>You may not initially want to do it, but once you reach Stackable Poles, vertical building becomes your friend. You can stuff a lot of things into a vertical block that wouldn't fit as a flat plane anywhere, and it makes things a ton easier if you actually do move things into a vertical layout. Just make sure you give yourself enough room to work.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:image {"id":738} -->
|
||||||
|
<figure class="wp-block-image"><img src="https://www.xaymar.com/wp-content/uploads/2019/03/ScreenShot00011.jpg" alt="" class="wp-image-738"/><figcaption>One of the layers of my Iron production line</figcaption></figure>
|
||||||
|
<!-- /wp:image -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2>Dropped Items can be a Temporary Platform</h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>If you just need to get there quickly, Leaves and other Items can be dropped in small stacks to create a platform that you can collide with and stand on. Use this to quickly get up somewhere without wasting a ton of cement in the process. This only works if there is no ground in range vertically.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:image {"id":742} -->
|
||||||
|
<figure class="wp-block-image"><img src="https://www.xaymar.com/wp-content/uploads/2019/03/ScreenShot00012.jpg" alt="" class="wp-image-742"/><figcaption>Leaves used as a temporary wasteless bridge.</figcaption></figure>
|
||||||
|
<!-- /wp:image -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2> Work-In-Progress Mercer Spheres</h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>These Spheres have dialog that is spoken to players in the area, which seems to change depending on the distance to the sphere. If you're within range, they'll say one of the following lines:</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:list -->
|
||||||
|
<ul><li>Harvest.</li><li>Harvest. It!</li><li>Comply!</li><li>I strongly advice you to harvest this specimen.</li><li>Your contract legally compels you to harvest this artifact.</li><li>You are so lucky that you found this most valuable artifact.</li><li>Picking up multiple FICSIT personell in the area. Proceed with harvest before it's too late.</li><li>Breaking news form Earth: Widespread chaos and mayhem. World president urges all citizens to do their part and harvest alien artifacts.</li><li>Relaying message: Hello this is patrol figure. I have taken ill and need your help to find a cure. Doctors say that the only remedy is alien artifacts.</li></ul>
|
||||||
|
<!-- /wp:list -->
|
||||||
|
</pre>
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
---
|
||||||
|
title: 'Random Stuff About Satisfactory'
|
||||||
|
category: Blog
|
||||||
|
tags: [Satisfactory]
|
||||||
|
---
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>I've been playing Satisfactory for about the entire time that it's been in Open Alpha now (and also have it preordered), and found some vaguely interesting things - from unexpected game mechanics, to really cool discoveries. Let's take a look at what we might also see in Early Access of the game!</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:more -->
|
||||||
|
<!--more-->
|
||||||
|
<!-- /wp:more -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2>Ground Ore Nodes have different Purity</h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>Purity of a Node affects the speed at which something is gathered. The worst level is Inpure/Impure, which gathers 1 ore every 2 seconds. Next is Normal purity at 1 ore every 1 second, and finally Pure purity at 1 ore every 0.5 seconds. You ideally want Normal or Higher, but to start out Inpure/Impure Nodes will work fine.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>Some really good nodes (Pure) are protected by groups of dangerous enemies that you should either defeat with Walls and Foundations, or with a Rebar Gun.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2>Miners can be built on top of Foundations </h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>Not exactly as groundbreaking as most things, but this allows lining up things to the actual resource node better.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:image {"id":715} -->
|
||||||
|
<figure class="wp-block-image"><img src="https://www.xaymar.com/wp-content/uploads/2019/03/ScreenShot00000.jpg" alt="" class="wp-image-715"/><figcaption>Just mining my Foundation.</figcaption></figure>
|
||||||
|
<!-- /wp:image -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2>Balance your Conveyor Lines</h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>If you have more than a single input conveyor, such as when you're mining ore and there's two, three or even four miners required, you should consider building a balancer. Balancers help distribute the input lines evenly to all output lines, such as balancing 3 inputs to feed all three outputs equally.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:image {"id":716} -->
|
||||||
|
<figure class="wp-block-image"><img src="https://www.xaymar.com/wp-content/uploads/2019/03/ScreenShot00001.jpg" alt="" class="wp-image-716"/><figcaption>3 Input, 3 Output Ore Balancer</figcaption></figure>
|
||||||
|
<!-- /wp:image -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>Balancers can be built in any shape, size or configuration. I've personally only needed 3-In-3-Out balancers so far, but configurations like 2-In-6-Out, 6-In, 2-Out, 6-In-6-Out, 5-In-5-Out and so on should all be possible as the Splitters and Mergers are much more intelligent than the ones in Factorio.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2>Conveyor Poles can be stacked on Foundations </h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>If you haven't reached the Stackable Poles yet, you can still stack your conveyors using normal Poles, just not as good as with the Stackable Pole. Simply aim close to the same position on the Foundation that your previous pole was in, and try to make the hologram match the original pole. Tada, you've stacked unstackable Poles.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2>Optimize Early, Optimize Often</h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>It's never too early to optimize your production lines, and it only gets easier the more materials you've saved up. Build Balancers, build huge production facilities for even more inputs, just really go all out and build for 10 times what you actually need right now.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:gallery {"ids":[721,722]} -->
|
||||||
|
<ul class="wp-block-gallery columns-2 is-cropped"><li class="blocks-gallery-item"><figure><img src="https://www.xaymar.com/wp-content/uploads/2019/03/ScreenShot00003.jpg" alt="" data-id="721" data-link="https://www.xaymar.com/?attachment_id=721" class="wp-image-721"/><figcaption>3x3 Ore Balancer goes into Iron Production</figcaption></figure></li><li class="blocks-gallery-item"><figure><img src="https://www.xaymar.com/wp-content/uploads/2019/03/ScreenShot00002-2.jpg" alt="" data-id="722" data-link="https://www.xaymar.com/?attachment_id=722" class="wp-image-722"/><figcaption>3x6 Iron Production with Buffering</figcaption></figure></li></ul>
|
||||||
|
<!-- /wp:gallery -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p></p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
</pre>
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
title: 'I have a Garden. And a Camera.'
|
||||||
|
category: Blog
|
||||||
|
tags:
|
||||||
|
---
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
<!-- wp:gallery {"ids":[803,802,801,800],"columns":0,"linkTo":"media"} -->
|
||||||
|
<figure class="wp-block-gallery columns-0 is-cropped"><ul class="blocks-gallery-grid"><li class="blocks-gallery-item"><figure><a href="https://blog.xaymar.com/wp-content/uploads/2019/04/DSC1351.jpg"><img src="https://blog.xaymar.com/wp-content/uploads/2019/04/DSC1351.jpg" alt="" data-id="803" data-full-url="https://blog.xaymar.com/wp-content/uploads/2019/04/DSC1351.jpg" data-link="https://blog.xaymar.com/2019/04/22/i-have-a-garden-and-a-camera/__dsc1351/" class="wp-image-803"/></a></figure></li><li class="blocks-gallery-item"><figure><a href="https://blog.xaymar.com/wp-content/uploads/2019/04/DSC1349.jpg"><img src="https://blog.xaymar.com/wp-content/uploads/2019/04/DSC1349.jpg" alt="" data-id="802" data-full-url="https://blog.xaymar.com/wp-content/uploads/2019/04/DSC1349.jpg" data-link="https://blog.xaymar.com/2019/04/22/i-have-a-garden-and-a-camera/__dsc1349/" class="wp-image-802"/></a></figure></li><li class="blocks-gallery-item"><figure><a href="https://blog.xaymar.com/wp-content/uploads/2019/04/DSC1343.jpg"><img src="https://blog.xaymar.com/wp-content/uploads/2019/04/DSC1343.jpg" alt="" data-id="801" data-full-url="https://blog.xaymar.com/wp-content/uploads/2019/04/DSC1343.jpg" data-link="https://blog.xaymar.com/2019/04/22/i-have-a-garden-and-a-camera/__dsc1343/" class="wp-image-801"/></a></figure></li><li class="blocks-gallery-item"><figure><a href="https://blog.xaymar.com/wp-content/uploads/2019/04/DSC1340.jpg"><img src="https://blog.xaymar.com/wp-content/uploads/2019/04/DSC1340.jpg" alt="" data-id="800" data-full-url="https://blog.xaymar.com/wp-content/uploads/2019/04/DSC1340.jpg" data-link="https://blog.xaymar.com/2019/04/22/i-have-a-garden-and-a-camera/__dsc1340/" class="wp-image-800"/></a></figure></li></ul></figure>
|
||||||
|
<!-- /wp:gallery -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>Started cleaning up my garden again as the ground isn't frozen anymore and I can actually do work on everything again. So I took my Camera with me, and made some close (really still 80cm away) shots of things. I'm looking forward to owning an actual Macro lens for this purpose.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
</pre>
|
||||||
@@ -0,0 +1,99 @@
|
|||||||
|
---
|
||||||
|
title: 'Adventures in Modding Re:Legend'
|
||||||
|
category: Blog
|
||||||
|
tags: ['Re:Legend','Modding']
|
||||||
|
---
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p><a href="https://store.steampowered.com/app/823950/ReLegend/">The game 'Re:Legend' released a few days ago into Early Access</a>, and just like any other normal person my immediate first thought was: Can I mod this? And if so, what can I actually change?</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:more -->
|
||||||
|
<!--more-->
|
||||||
|
<!-- /wp:more -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2>Getting Started with Modding</h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>As the game had no modding API that was visible, the only thing I could do is to figure out what tools I need for injecting new code. And as the game is made with Unity, the same engine that Risk of Rain 2 runs on, I figured I could reuse the toolset from there. </p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:image {"id":869,"align":"right","width":311,"height":199,"linkDestination":"media"} -->
|
||||||
|
<div class="wp-block-image"><figure class="alignright is-resized"><a href="https://www.xaymar.com/wp-content/uploads/2019/09/image.png" target="_blank" rel="noreferrer noopener"><img src="https://www.xaymar.com/wp-content/uploads/2019/09/image.png" alt="" class="wp-image-869" width="311" height="199"/></a><figcaption>Knowing which .Net SDK to use is half the battle.</figcaption></figure></div>
|
||||||
|
<!-- /wp:image -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>All I needed to figure out was which .Net version the game was compiled against, and there was a handy tool for it: <a href="http://ntinfo.biz/index.html#detect_it_easy">Detect It Easy</a>. Loading the Assembly-CSharp.dll into it revealed that the game was built against .Net 4.0, which means that I needed a BepInEx compatible with Unity 2017 and newer. </p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>Thankfully there was a release candidate which actually ended up working: <a href="https://github.com/BepInEx/BepInEx/releases/tag/v5.0-RC1">BepInEx 5.0 RC1</a>. After extracting the Unity 2017+ version into the game directory (directory that holds ReLegend.exe) and configuring BepInEx to show a console, I had confirmation that I could load mods. Now it's time to actually get into modding!</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2> Disassembling Assembly-CSharp.dll </h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>If you aren't familiar with Unity, the binary Assembly-CSharp.dll holds compiled and usually optimized compiled game code written in C#, and also usually contains most dependendencies that don't have their own .dll file. So what we need is a disassembly tool that can deal with optimized compiled code and give back a reasonable representation of the actual code.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:image {"id":870,"align":"right","width":304,"height":226,"linkDestination":"media"} -->
|
||||||
|
<div class="wp-block-image"><figure class="alignright is-resized"><a href="https://www.xaymar.com/wp-content/uploads/2019/09/image-1.png" target="_blank" rel="noreferrer noopener"><img src="https://www.xaymar.com/wp-content/uploads/2019/09/image-1.png" alt="" class="wp-image-870" width="304" height="226"/></a><figcaption>ILSpy in action.</figcaption></figure></div>
|
||||||
|
<!-- /wp:image -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>After a bit of searching for a C# disassembler I decided to use <a href="https://github.com/icsharpcode/ILSpy">ILSpy</a>, which performed the task better than most other tools and did not crash no matter what I threw at it. Loading Assembly-CSharp.dll into it gave me a near instant disassembled version of the game code, although mostly lacking comments since those get removed.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>All that was left was to figure out what to remove first, and how to do it. After some time, I figured that my first mod should be to remove the Tutorial popups and instantly unlock tutorials in the menu due to them often opening up in bad situations in Multiplayer.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2>Coding the Mod</h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>With the information from Detect It Easy and ILSpy, and some knowledge of BepInEx and 0Harmony, getting a mod to load was pretty easy. The problem was getting it to do the actual right thing, without breaking the game. And the Tutorials were already known for literally freezing players in place if you skip them too fast.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>A little while later after delving into the disassembled code, I found the place that I needed to modify: global::TutorialManager::StartDisplayTutorial. The functionality that it currently had was to enable the tutorial panel, disable quitting the game, stop all player interaction, search and initialize the tutorial, unlock the tutorial and then finally set up the UI and display it. We don't want it to do anything but unlock the tutorial.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:image {"id":867,"align":"right","width":299,"height":128,"linkDestination":"media"} -->
|
||||||
|
<div class="wp-block-image"><figure class="alignright is-resized"><a href="https://www.xaymar.com/wp-content/uploads/2019/09/2019-09-04T14-16-10_Code_QuickUnluckyRasbora.png" target="_blank" rel="noreferrer noopener"><img src="https://www.xaymar.com/wp-content/uploads/2019/09/2019-09-04T14-16-10_Code_QuickUnluckyRasbora.png" alt="" class="wp-image-867" width="299" height="128"/></a><figcaption>Skipping Tutorials made easy - they don't even show up now!</figcaption></figure></div>
|
||||||
|
<!-- /wp:image -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>As TutorialManagers UnlockTutorial was private, but the unlockTutorials List was not, the override was a simple as just calling SearchTutorial, then adding the tutorial to the unlockTutorials List, and finally just calling EndTutorial(). </p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2>The Aftermath</h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>With one of the most annoying ways to show tutorials out of the way, the game was much nicer to play, and I had my first experience in modding Re:Legend. I got a bit modding-crazy and made additional mods, like disabling the crafting failure with cooking which seemed to be arbitrary, and attempting to allow players to move while attacking. Unfortunately the latter one failed, but the former one did also work which made the cooking mechanic less dumb.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>I've released all the code and mods I've made <a href="https://github.com/xaymar/relegend-mods">on GitHub</a> for you to try out. Installing them is easy, there's even a guide <a href="https://github.com/xaymar/relegend-mods/wiki">on the wiki for it</a>. Building them yourself is a bit different, you will need CMake, Visual Studio 2017 or 2019, .Net SDK 4.0 and the game. But it's not rocket science so it should be pretty easy to build them yourself.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>I had a lot of fun writing mods for this game, even if the game itself had no official modding API, and I hope that my delve into Re:Legend modding helps future modders do more amazing stuff than I did. I'd love to hear about what you've done, so feel free to hit me up <a href="https://twitter.com/Xaymar">on Twitter</a>, in the Comments here, or on Discord.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>Until next time</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>- Xaymar</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
</pre>
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
---
|
||||||
|
title: 'Stream Effects is now StreamFX'
|
||||||
|
category: Blog
|
||||||
|
tags: ['StreamFX']
|
||||||
|
---
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>After many people have started calling Stream Effects "Stream Elements", I have decided to rename Stream Effects to StreamFX. StreamFX still means Stream Effects, but it is much simpler to remember and not as easily confused with Stream Elements.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>For users of the plugin that manually installed it, this means that you will have to remove the obs-stream-effects dll and data directories. For those using the installer, the installer should automatically handle removing the old files for you.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>Hope this resolves this issue once and for all.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>- Xaymar out.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
</pre>
|
||||||
@@ -0,0 +1,181 @@
|
|||||||
|
---
|
||||||
|
title: 'The path to StreamFX 0.8.0'
|
||||||
|
category: Blog
|
||||||
|
tags: ['StreamFX']
|
||||||
|
---
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>Ensuring that Content Creators get a Crash-free StreamFX experience was a challenge. It took two years to get here, and now the plugin itself is likely more stable than OBS Studio itself. And with <a href="https://github.com/Xaymar/obs-StreamFX/releases/tag/0.8.0a1">StreamFX 0.8.0 Alpha 1 (pre-release, not production ready)</a> being available right now, everyone can enjoy it. But let's talk about what the past was, and what caused things to go wrong.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:more -->
|
||||||
|
<!--more-->
|
||||||
|
<!-- /wp:more -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2>Where It Went Wrong</h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>In the early days StreamFX had very few features, which was enough for the time. The first version was relatively stable as it only dealt with very basic libOBS calls that can't really go wrong. Even after adding Blur and Shape Mask to the existing 3D Transform and Displacement Mapping effects, things still looked fine.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>And here is where it starts going downhill (or uphill if you think that is harder). At the time I deluded myself into thinking that nobody else was really using it, but reality was very different.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2>Bugs Bugs Bugs </h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>The first wave of bugs was freezes, crashing, scene corruption, and general nonsense. I tried to work around it by wrapping large parts of the "gs" part of libOBS into wrapper classes to automatically handle lifetime.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>And for the most part it actually worked. Version 0.3.0 had improved performance and a much lower crash rate. Even though some of the problems were because of a lack of documentation on the libOBS side. As an example, <a href="https://github.com/obsproject/obs-studio/commit/c111fa6">up until 21.x there was no way to directly flush a vertex or index buffer with non-libOBS owned memory</a> - and this fact wasn't documented.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>But things were looking good, better than before. I still had new features to implement, but how bad can it really get?</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2>A New Feature Appeared</h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>A random thought passed my mind: "What if you could have the same source, but one has different filters on it?"</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>That is how Source Mirror came to life, the current second most used part of StreamFX right after 3D Transform. It allows you to create a copy of a Source at near zero cost and add a completely different set of filters to it. Something that required complex Scene setups before was now possible with just a single Source.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>Many users switched to it after seeing the potential, and it became a hit. So much that new bugs appeared every week, and the 0.4 release was followed by a 0.4.1 release, which was followed by a 0.4.2 release. That was two years ago in 2017, and the beginning of the downhill ride, or uphill battle.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2>One-Year Long Patch Cycle</h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>While at the time I had work at a company which I shall not name, I also dealt with the AMD Encoder, and dealt with StreamFX. I tried my hand at adding Custom Shaders to StreamFX, which ended up very barebone and broken. But it was the first proof that this can actually be done - and at the time a completely new thing.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>This was released as 0.4.3 Preview 1 exclusively <a href="https://patreon.com/xaymar">to Patrons (support my Projects and become a Patron today at Patreon)</a> at the time. Some people liked the new Custom Shaders, some didn't, and others just ignored it. And later - after many fixes - 0.5.0 Preview 1 was released, which added support for Audio Mirroring to Source Mirror, allowing you to add audio effects to each copy.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>And then I vanished from the face of earth for about half a year. <a href="https://www.xaymar.com/2019/01/31/a-look-back-at-obs-stream-effects-0-4-2-and-the-path-to-0-5-0/">I had hit a huge burnout, nothing was fun anymore, and I was seriously depressed.</a> In short, it was the worst time of my life (so far), and it caused me to lose my job at the time.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>When I finally recovered, it was around late September. I was refreshed, and got things done quickly, and dealt with lots of self-created issues.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2>Commence Operation Cleanup</h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>Within a single month, I had accumulated more than 3000 lines of changes, all fixes or refactoring a design, even adding workarounds for shortcomings of the libOBS library (many of which still exist today). Blur got much faster, Signed Distance Field Shadows were added and Scene Mirroring was finally supported through a workaround for libOBS.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>The result of that was released as 0.5.0 Preview 2, again exclusively to Patrons at the time. It had been a full year since the last <em>mostly</em> stable build, and this one was released the day before christmas. It was a Christmas present like no other.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2>And It Became Stable</h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>Shortly after Christmas passed, I returned to coding. Bugs needed fixing, new features had to be implemented. In total it took around a full month, but the result was worth it and released as 0.5.0 Preview 3. While I had to remove Custom Shaders, hundreds of fixes and changes made it in and it also brought MipMapping to 3D Transform, which is still mostly the same code today.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>And just one month after that, 0.5 was released - the next <em>mostly</em> stable version that was not a pre-release. It wasn't completely bug free, but it was getting there, with the remaining bugs were fixed in 0.5.1 and 0.5.2. And even more in 0.6, 0.6.1, 0.6.2 and 0.6.3 - which also added the ultra low impact Dual Filtering Gaussian Blur approximation.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>I had a new idea, and I was pretty sure that the last released built was stable. And with my list of bugs to fix nearing the empty point, I finally could focus on adding new features again. While adding Glow and Outline to Signed Distance Field Effects was one of the features, it wasn't the primary feature for the next version. </p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2>If (!system.running()) system.change();</h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>That feature was actually <em>Dynamic Mask</em>, a simple filter that allows for very complex effects, with no limits to your creativity. It allowed you to mask any source using any other source or scene, adjusting the mask value per-channel - something that up to that point was impossible. Even the earliest implementation of it basically verified its reason to exist.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>When 0.7 released, I was not prepared for the creativity people had. At the time I was not fully aware of what I had just released into the world, but now I know that it can even be used as an alternative to Color Key and Chroma Key, which are both very awful in OBS Studio. But now I had no more features to implement, and no more bugs I knew how to fix.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>By pure chance, a Content Creator complained to me about how awful the Color Correction and LUT system in OBS Studio is. And at the time I was toying around with DaVinci Resolve. A new idea sparked: A Color Grading filter that takes after professional video editing software, and allows for a live preview.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>This filter released in 0.7.1 as experimental, and has pretty much replaced every single Color Correction and LUT I had used up until that point. It was just that good to be able to see your changes <em>live</em> while editing them, not just after exporting. Just compare the two screenshots below to see the power this filter has.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:columns -->
|
||||||
|
<div class="wp-block-columns"><!-- wp:column -->
|
||||||
|
<div class="wp-block-column"><!-- wp:image {"id":969,"sizeSlug":"full","linkDestination":"media"} -->
|
||||||
|
<figure class="wp-block-image size-full"><a href="https://www.xaymar.com/wp-content/uploads/2019/12/2019-12-22T15-47-07_obs64_FruitfulStrangePapillon.jpg"><img src="https://www.xaymar.com/wp-content/uploads/2019/12/2019-12-22T15-47-07_obs64_FruitfulStrangePapillon.jpg" alt="" class="wp-image-969"/></a><figcaption>With Color Grading</figcaption></figure>
|
||||||
|
<!-- /wp:image --></div>
|
||||||
|
<!-- /wp:column -->
|
||||||
|
|
||||||
|
<!-- wp:column -->
|
||||||
|
<div class="wp-block-column"><!-- wp:image {"id":971,"sizeSlug":"full","linkDestination":"media"} -->
|
||||||
|
<figure class="wp-block-image size-full"><a href="https://www.xaymar.com/wp-content/uploads/2019/12/2019-12-22T15-47-13_obs64_HauntingLightsteelblueStud.jpg"><img src="https://www.xaymar.com/wp-content/uploads/2019/12/2019-12-22T15-47-13_obs64_HauntingLightsteelblueStud.jpg" alt="" class="wp-image-971"/></a><figcaption>Without Color Grading</figcaption></figure>
|
||||||
|
<!-- /wp:image --></div>
|
||||||
|
<!-- /wp:column --></div>
|
||||||
|
<!-- /wp:columns -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2>Where We Are Now</h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>And yet, 0.7.1 ended up as one of the most broken version of StreamFX to date. This actually carried over from 0.7 itself, but the addition of new things in 0.7.1 only made it worse. Crashes were happening left and right, scene collections got magically corrupted, and it was just in general not a good time.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>My initial attempts at fixing these bugs didn't go too great, but they were working attempts. With 0.7.2 Beta most things returned to working, but other things broke - especially because once again there is broken behavior in libOBS. Despite my best intentions, people were being forced back onto 0.7.1, and I had to fix things.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>That was the beginning of 0.8 Alpha 1, the most stable StreamFX release to date. Only half of the total commits between 0.7.2 to 0.8 Alpha 1 were actual fixes, but the fixes were really effective. The code was refactored without ensuring that things don't break temporarily, and in the end it worked out for the better.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>And not only that, with 0.8 Alpha 1 the biggest creative feature <em>Custom Shaders</em> came back from the dead in a brand new design. While it is still incomplete, the new implementation is much more flexible and already has more features than all previous implementations. In addition, Color Grade is now feature complete and stable too.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>It is an exciting time, and most importantly a time for a super stable StreamFX with all the features expected of it.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2>Final Words</h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>The ride until now was bumpy, but it seems that things are finally going better. Crashes have mostly been resolved, rendering issues are getting less and less, and I'm running out of features to implement. The last and final feature that 0.8.0 will have is Custom Shader sources, filters and transitions, which opens up a whole lot of new creative options - all of which I'm looking forward to. </p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>And with that, I'm signing off.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>- Xaymar out.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
</pre>
|
||||||
@@ -0,0 +1,123 @@
|
|||||||
|
---
|
||||||
|
title: 'A Second Life for my Threadripper 1950X'
|
||||||
|
category: Blog
|
||||||
|
---
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>As my upgrade to an AMD Ryzen 9 3950X is finally complete, I had my old AMD ThreadRipper 1950X left over. While it wasn't the perfect gaming or compute CPU, it deserved to live on for pretty much solo-ing the entire workload I've given it up until now.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:more -->
|
||||||
|
<!--more-->
|
||||||
|
<!-- /wp:more -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2>The Plan</h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>I've always wanted a NAS and Home Theather system, and some friends recommended FreeNAS and PLEX to me. While I'm not happy with PLEX due to various completely abnormal reasons, it does work for streaming over the internet. The plan was simple: Run a Host OS with various virtual machines for several servers.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>Primarily I wanted FreeNAS and PLEX, but in the future I wanted to extend that to pfSense, PiHole and other services like game servers, like Minecraft, Space Engineers and other computationally expensive servers that I don't want to run on my gaming and editing system.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>In the end, I decided to split up the machine like this:</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:list {"ordered":true} -->
|
||||||
|
<ol><li>FreeNAS and PLEX on NUMA #0 with 12GB RAM and 6/12 Cores/Threads. Eventually will have the KFA2 GTX 1650 Super passed in for transcoding purposes, if necessary.</li><li>pfSense on NUMA #1 with 4GB RAM and 2/4 Cores/Threads.</li><li>PiHole on NUMA #1 with 4GB RAM and 2/4 Cores/Threads.</li></ol>
|
||||||
|
<!-- /wp:list -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2>Setting up the Host</h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>I've chosen Debian as the Host OS as I'm already familiar with it, and went with QEMU and libvirt for the Virtualization. I know how libvirt works to some degree, and dislike the one-click-setup things like Docker and Kubernetes where I have no control over what is actually being done.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>Most of the installation is just the default Debian, except that I needed it as a server, so no Window Manager, no Print Server, just SSH and System Utilities. When it came to setting up the partition table, <a href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=684128">I had to make sure to convert Base-2 into SI units as the Debian Installer still doesn't support industry standard units for storage.</a> I ended up with this partition table on my old Intel 600p 256GB NVMe:</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:list {"ordered":true} -->
|
||||||
|
<ol><li>256MiB EFI System Partition</li><li>4GiB Boot filesystem </li><li>32GiB Swap Partition (to match Host Memory)</li><li>128GiB System Partition</li><li>All remaining space used as LVM for VMs down the road.</li></ol>
|
||||||
|
<!-- /wp:list -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>Once the setup was done, it was time to set up networking. Since I wanted both 1gbit NICs to run in teaming mode, ideally one that gives me 2gbit available transfer rate total. 10gbit, 5gbit and 2.5gbit are still too expensive at the time, and thanks to <em>systemd-networkd</em> (never thought I'd write thanks to a systemd part) it was a breeze to get the two working together - and without any issues with my current switch either!</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>And finally there was the LVM storage which is not initialized during the setup. Setting it up is as simple as running two commands, to be exact:</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:code -->
|
||||||
|
<pre class="wp-block-code"><code>lvm pvcreate /dev/nvme0n1p5
|
||||||
|
lvm vgcreate vg0 /dev/nvme0n1p5</code></pre>
|
||||||
|
<!-- /wp:code -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>Yay, we now have storage for the VM Operating Systems, and now it was time to set up virtualization on the machine.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2>libVirt-ualization</h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>Virtualization with libvirt and qemu is super easy, thanks to the extensive documentation on it that sometimes is confusing to read. I started with the usual, define the storage pool for ISO files for installation images, then define the storage pool for the VM's Operating System on the LVM volume group, then define a bridge type network for all VMs to use.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>My ISO storage pool looks like this:</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:group -->
|
||||||
|
<div class="wp-block-group"><div class="wp-block-group__inner-container"><!-- wp:code -->
|
||||||
|
<pre class="wp-block-code"><code><pool type="dir">
|
||||||
|
<name>iso</name>
|
||||||
|
<target>
|
||||||
|
<path>/srv/iso</path>
|
||||||
|
</target>
|
||||||
|
</pool></code></pre>
|
||||||
|
<!-- /wp:code --></div></div>
|
||||||
|
<!-- /wp:group -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>And my VM storage pool looks like this:</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:code -->
|
||||||
|
<pre class="wp-block-code"><code><pool type="logical">
|
||||||
|
<name>storage</name>
|
||||||
|
<source>
|
||||||
|
<name>vg0</name>
|
||||||
|
<format type="lvm2"/>
|
||||||
|
</source>
|
||||||
|
<target>
|
||||||
|
<path>/dev/vg0</path>
|
||||||
|
</target>
|
||||||
|
</pool></code></pre>
|
||||||
|
<!-- /wp:code -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>Networking took a few tries, but I ended up with this which worked well enough and allows VMs to use the full 1gbit of the host port at near zero cost:</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:code -->
|
||||||
|
<pre class="wp-block-code"><code><network>
|
||||||
|
<name>host-bridge</name>
|
||||||
|
<forward mode='bridge'/>
|
||||||
|
<bridge name='br0'/>
|
||||||
|
</network></code></pre>
|
||||||
|
<!-- /wp:code -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>So with that done, what's left is the Virtual Machines themselves. Since this is getting a bit longer than expected, I've split this up into two separate posts. You can find the second post using the Next Post button below (if it has already been published).</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
</pre>
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
---
|
||||||
|
title: 'A Second Life for my ThreadRipper 1950X (Part 2)'
|
||||||
|
category: Blog
|
||||||
|
---
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p><a href="https://www.xaymar.com/?p=1011">In the previous post I talked about the setup for the Host machine</a>, and this continues from there. This time it's time for setting up the virtual machines themselves.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:more -->
|
||||||
|
<!--more-->
|
||||||
|
<!-- /wp:more -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2>Virtual Machine with KVM</h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>Virtualization with QEMU and libvirt is super easy, if you know what you're doing. And if you don't, there's management tools that make your life easier (but aren't exactly bug free). In my case, I've already had experience with writing XML files for libvirt, and none of the management tools would work from console (aside from libvirt itself).</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>Setting up the FreeNAS+PLEX VM was hindered by many problems, but the biggest one was the Graphics device. For an unknown reason, libvirt defaults to a cirrus device, which not many Linux distros still support. In fact, FreeNAS doesn't support it at all and tries to create a graphics interface even when you tell it to boot in serial console mode - which is kinda stupid, but who am I to complain about free software?</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>Fixing it was easy, just switch it with the much more modern qxl driver and done. After that the machine booted, but I still had things to do: Storage. FreeNAS requires that it is installed on a separate disk than the storage it is supposed to use for NAS storage - and that's where the 5th partition on the NVMe comes in.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>In short, I needed a small enough partition to hold FreeNAS, but not too small. I decided on 4GiB, which should be enough to hold FreeNAS and any configuration files it would create. Creating the storage was simply running <code>virsh vol-create-as --pool storage --name freenas --capacity 4G --allocation 4G --format raw</code>. As you might have guessed, that created a raw volume which outperforms all other storage formats, at the cost of not having any snapshots.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>And I had some spare 2TB drives lying around from the time I had HDDs in my main PC, those were perfect for NAS - they were a bit louder, but they did still do the job fine. Thankfully Linux supports device names, so I passed them in directly using the device serial number instead of relying on fragile, connection based addressing. </p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2>Setting up FreeNAS and PLEX</h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>Installing FreeNAS is very easy, most of it ended up being automated. I only had to point it at the drive it was supposed to use as storage, and that was it. Well I also had to tell with which network Gateway and DNS to use, as it refused to gather those from DHCP, but that's probably something in my own network causing it.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>Surprisingly that is where the easy things stopped. The FreeNAS web interface is anything but a shallow learning curve, and I repeatedly end up having to figure out how to do things in an unfamiliar environment. But in the end I did get it running. The first task is to specify at least one user group to which you want to assign people to. </p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>For the groups I used 'users' (anyone under 18) and 'adult-users' (anyone over or exactly 18). This allows me to split the user base between trusted and untrusted users. Next up was to define my own user, which I added to both users and adult-users, and finally it was time to define the actual storage space. FreeNAS defaults to either RAID 5 or RAID 6 (not exactly sure which), which meant my 3 2TB HDDs would end up as around 4TB total.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>As I prefer my important network accessible storage to not just simply disappear one day, I went with that over a striped RAID - even though I still have not had a single Seagate HDD die on me, I wasn't about to tempt fate. After all, anything that can go wrong will go wrong, and anyone claiming the opposite should probably not have the job they have right now.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>Finally there was setting up the SAMBA share. This was super easy thanks to the Web interface, and the only issue I had was that I forgot to set the group correctly. Once that was fixed, I finally had network accessible storage, at a much cheaper price than I would have to pay for any of the proprietary providers like Google, DropBox and similar. And surprisingly installing PLEX was just clicking install on a plugin and then waiting a few hours for the progress bar to move from 50%. All done!</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2>pfSense and and PiHole</h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>I ended up not going with these two for now, as PLEX+FreeNAS ended up eating a huge chunk of network bandwidth. And I also couldn't figure out how to get my Router to not act as a DHCP server yet, so I'm leaving that for a future post.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>But with this I finally had a way to get rid of around 1.1 TB of static data on my PC. Especially important documents wandered from my Google Drive to my NAS storage as I needed them to be accessible on any device in my home network. With that said, this mini-series ends.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>- Xaymar out.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
</pre>
|
||||||
+35
@@ -0,0 +1,35 @@
|
|||||||
|
---
|
||||||
|
title: 'Stepping Down as the Maintainer for the AMD Encoder Plugin'
|
||||||
|
category: Blog
|
||||||
|
tags: [AMD, AMF, OBS]
|
||||||
|
---
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>I'm stepping down from the maintainer position for the AMD Encoder, and am removing myself from the OBS Project team <em>permanently</em>.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:more -->
|
||||||
|
<!--more-->
|
||||||
|
<!-- /wp:more -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>This is my official notice that I am stepping down from the maintainer position for the AMD Encoder, as I have had several disagreements with the (only?) maintainer Jim. I would also request to be removed from the OBS Project team immediately. The integrated AMD Encoder plugin is now lacking a maintainer, and good luck to whoever picks it up again.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>There are various reasons for this, but the biggest one is the repeated disagreements. In every disagreement i was not treated as an equal, but as someone who didn't know any better and should just be an obedient underling. This way of interacting with one another is simply not acceptable, and therefore I have no further interest in working together with the OBS Project team.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>Furthermore there is the lack of clarity and transparency for the OBS project. As there is no roadmap, there is no way to tell what is necessary for a new version, and decisions feel arbitrary due to that. What gets in and what doesn't seems to be up to the preference of someone instead of being planned out from the start. And despite repeated claims to improve this, nothing has happened over the span of two years. Not only that, but several much requested features are just pushed away as niche instantly instead of actually considering them seriously and putting them in a roadmap.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>Overall, the state of OBS Project does not sit well with me and I no longer wish to be associated with it. This does not mean that I will no longer develop things for OBS Studio/libobs, just that I no longer want to be associated with the OBS Project team at all. obs-StreamFX and other secret plugins I've developed for clients will stay around until I find another thing to work on.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>Read the original on <a href="https://github.com/obsproject/obs-studio/issues/2346">GitHub</a>. </p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
</pre>
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
---
|
||||||
|
title: 'A "Now Playing" Overlay using Last.FM'
|
||||||
|
category: Blog
|
||||||
|
tags: [OBS, Last.FM, AIMP, Spotify]
|
||||||
|
---
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>I wanted to upgrade my streaming setup slightly, and while watching other streamers, I noticed that some have added a "Now Playing" overlay. For the most part it's either embedded in a static overlay as text, or just free floating text. But that isn't enough for me.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:image {"align":"center","id":1054,"sizeSlug":"full"} -->
|
||||||
|
<div class="wp-block-image"><figure class="aligncenter size-full"><img src="https://www.xaymar.com/wp-content/uploads/2020/02/2020-02-04T01-42-11_obs64_MediumaquamarinePolishedAnkole.png" alt="Last.FM Now Playing Overlay" class="wp-image-1054"/><figcaption>Last.FM Now Playing Overlay</figcaption></figure></div>
|
||||||
|
<!-- /wp:image -->
|
||||||
|
|
||||||
|
<!-- wp:more -->
|
||||||
|
<!--more-->
|
||||||
|
<!-- /wp:more -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>The biggest difference to the usual "Now Playing" overlays is that it is animated. Instead of simply changing text, it slides out when no song is playing, slides in when a song starts playing, and flips to reveal a track change. Not only that, but it also shows track art if there is any. Just take a look at it in action to see what it can do:</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:video {"id":1055} -->
|
||||||
|
<figure class="wp-block-video"><video controls preload="auto" src="https://blog.xaymar.com/wp-content/uploads/2020/02/2020-02-04T01-47-26.yt1280x720.mp4" playsinline></video><figcaption>The "Now Playing" overlay in action.</figcaption></figure>
|
||||||
|
<!-- /wp:video -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>To support most streaming software (and drastically reduce the work I had to do), I compressed it to a single HTML file that contains the necessary CSS and JavaScript. This also enables you to just download it, but keep it mind that you will not receive any future updates if you do so. You can also customize the style completely by either using the CSS override function that your streaming software provides, or by editing the HTML file.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>And did I mention that it is completely free, has no tracking, and no ads? The only requirement is a Last.FM compatible player, a Last.FM account and a streaming software with browser integration.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2>Setting It Up</h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>If you don't already have a Last.FM account <a rel="noreferrer noopener" aria-label=" (opens in a new tab)" href="https://www.last.fm/join" target="_blank">sign up for one</a> and then link it to whatever player you want to use (for example: <a rel="noreferrer noopener" aria-label="Spotify (opens in a new tab)" href="https://www.last.fm/settings/applications" target="_blank">Spotify</a>). Then all you need is to create a browser instance in your streaming software, and point it at the following URL:</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:code -->
|
||||||
|
<pre class="wp-block-code"><code>https://stream.xaymar.com/nowplaying.html?user=<YOUR_LASTFM_USERNAME></code></pre>
|
||||||
|
<!-- /wp:code -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph {"fontSize":"small"} -->
|
||||||
|
<p class="has-small-font-size">(Make sure that you replace <YOUR_LASTFM_USERNAME> with your actual Last.FM username.)</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>The overlay was designed for a vertical size of 128px and will automatically scale the content to fit using the 'zoom' property. A horizontal resolution of 1024px is recommended, but you can reduce that by also reducing the height, or customizing the CSS.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2>Customization</h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>As the entire thing is a HTML page, you can easily change the design of the overlay. Here are the CSS classes you can modify to customize the style:</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:list -->
|
||||||
|
<ul><li><strong>.info</strong> Container for the track information.</li><li><strong>.logo</strong> Logo or Album Art for the track.</li><li><strong>.artist</strong> Artist name for the track.</li><li><strong>.title</strong> Title of the track.</li><li><strong>.separator</strong> The en-dash separator.</li><li><strong>.slide_in</strong> Slide in animation.</li><li><strong>.slide_out</strong> Slide out animation.</li><li><strong>.flip</strong> The flip animation, must be 500ms, and data change happens at 200ms. Ideally also contains the slide_in animation data.</li></ul>
|
||||||
|
<!-- /wp:list -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>Note that the CSS modifying hooks that OBS Studio and Streamlabs OBS provide run after all other JavaScript code has run, so you can't override the zoom with that. In the case that you want to change the sizes of elements beyond what is already there, consider downloading it and modifying the source files.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:heading -->
|
||||||
|
<h2>Final Words</h2>
|
||||||
|
<!-- /wp:heading -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>Before I leave you to your new overlay, there are some problems with this implementation. It relies on Last.FM, which means that you have to share data with yet another company, and it needs a Browser, which means that the CPU and GPU load is higher than it would be with a native plugin. Additionally there's also the problem that Last.FM may only have partial or no data about a song and the overlay will stop working as expected temporarily.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>But for my use case, which is Spotify and AIMP, this is more than enough. It removes the need to use partially or completely broken Twitch extensions (does Twitch ever check and remove broken extensions?), and allows viewers to easily see which track is currently playing.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
|
||||||
|
<!-- wp:paragraph -->
|
||||||
|
<p>- Xaymar out.</p>
|
||||||
|
<!-- /wp:paragraph -->
|
||||||
|
</pre>
|
||||||
Reference in New Issue
Block a user