<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Manuel Otheo</title><link>https://manuelotheo.com/</link><description>Recent content on Manuel Otheo</description><generator>Hugo</generator><language>en</language><lastBuildDate>Fri, 24 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://manuelotheo.com/index.xml" rel="self" type="application/rss+xml"/><item><title>About</title><link>https://manuelotheo.com/about/</link><pubDate>Fri, 24 Jul 2026 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/about/</guid><description>&lt;h1 id="about-me">
 About Me
 &lt;a class="heading-link" href="#about-me">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h1>
&lt;p>I&amp;rsquo;m Manuel Otheo, a senior multiplayer and gameplay engineer based in Puebla, Mexico. I have more than 15 years of experience in game development, including over eight years working professionally with Unreal Engine.&lt;/p>
&lt;p>My work focuses on the systems that make online games function reliably: gameplay replication, session architecture, matchmaking, parties, lobbies, dedicated servers, backend integration, cross-platform services, profiling, and debugging.&lt;/p></description></item><item><title>Inventory Persistence</title><link>https://manuelotheo.com/posts/inventory_persistence/</link><pubDate>Wed, 11 Jun 2025 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/posts/inventory_persistence/</guid><description>&lt;h3 id="inventory-persistence">
 Inventory Persistence
 &lt;a class="heading-link" href="#inventory-persistence">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h3>
&lt;p>Now let&amp;rsquo;s create an inventory system where the player can store and drop items. Using Spacetime DB, we&amp;rsquo;ll ensure that when you close and reopen the game, all stored inventory data is loaded again. To do this, you must have Spacetime DB installed and have created (or be ready to create) a project to use Spacetime with Rust. I highly recommend reading &lt;a href="../spacetime_introduction" >Spacetime Introduction (Unreal Engine)&lt;/a> first so you understand how to create a database in Spacetime and use it with Unreal Engine.&lt;/p></description></item><item><title>Hugo setup</title><link>https://manuelotheo.com/posts/hugo_setup/</link><pubDate>Wed, 23 Apr 2025 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/posts/hugo_setup/</guid><description>&lt;h3 id="hugo">
 Hugo
 &lt;a class="heading-link" href="#hugo">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h3>
&lt;p>Hugo is a static site generator built with Go, designed for high performance and great flexibility. Its powerful templating engine and efficient asset pipeline allow it to generate an entire site in just seconds—or even faster.&lt;/p>
&lt;p>Due to its flexible framework, multilingual support, and powerful taxonomy system, Hugo is widely used to create:&lt;/p>
&lt;ul>
&lt;li>Corporate, government, nonprofit, education, news, event, and project sites&lt;/li>
&lt;li>Documentation sites&lt;/li>
&lt;li>Image portfolios&lt;/li>
&lt;li>Landing pages&lt;/li>
&lt;li>Business, professional, and personal blogs&lt;/li>
&lt;li>Resumes and CVs&lt;/li>
&lt;/ul>
&lt;p>Use Hugo’s embedded web server during development to instantly see changes to content, structure, behavior, and presentation.&lt;/p></description></item><item><title>SpacetimeDB Introduction (Unreal Engine)</title><link>https://manuelotheo.com/posts/spacetime_introduction/</link><pubDate>Tue, 22 Apr 2025 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/posts/spacetime_introduction/</guid><description>&lt;h1 id="introduction">
 Introduction
 &lt;a class="heading-link" href="#introduction">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h1>
&lt;p>SpacetimeDB is a powerful tool that allows developers to create multiplayer games faster and more cost-effectively than other traditional methods. This is achieved through its database-driven system, which enables real-time reading and writing of information needed to update player stats and game elements efficiently.&lt;/p>
&lt;p>As of April 22, 2025, SpacetimeDB does not offer official support for Unreal Engine. However, we will demonstrate an effective method to integrate your Unreal project with SpacetimeDB databases using HTTP requests.&lt;/p></description></item><item><title>HTTP Requests</title><link>https://manuelotheo.com/posts/http_request/</link><pubDate>Mon, 14 Apr 2025 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/posts/http_request/</guid><description>&lt;h1 id="get-request">
 GET Request
 &lt;a class="heading-link" href="#get-request">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h1>
&lt;p>In Unreal Engine, you can request information using URLs and JSON objects, allowing you to retrieve data about players or objects.&lt;br>
To start working with requests you have to add on your project .Build.cs the modules &lt;em>&amp;ldquo;HTTP&amp;rdquo;&lt;/em> and &lt;em>&amp;ldquo;Json&amp;rdquo;&lt;/em>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="n">PublicDependencyModuleNames&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">AddRange&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">new&lt;/span> &lt;span class="n">string&lt;/span>&lt;span class="p">[]&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="s">&amp;#34;Core&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;CoreUObject&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;Engine&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;InputCore&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;EnhancedInput&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;HTTP&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;Json&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;UMG&amp;#34;&lt;/span> &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>On your cpp file you have to add the header files &lt;em>&amp;quot;#include &amp;ldquo;HttpModule.h&amp;rdquo;&lt;/em> and &lt;em>#include &amp;ldquo;Interfaces/IHttpResponse.h&amp;rdquo;&lt;/em>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;#34;HttpModule.h&amp;#34;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;#34;Interfaces/IHttpResponse.h&amp;#34;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>In this example, we will use &lt;a href="https://pokeapi.co/" class="external-link" target="_blank" rel="noopener">PokeAPI&lt;/a> (free API) to make requests and retrieve Pokemon information. To start, we&amp;rsquo;ll create UI widgets where the player can enter the name or ID of a Pokemon, and the retrieved data will be displayed.&lt;/p></description></item><item><title>Latent Nodes</title><link>https://manuelotheo.com/posts/latent_nodes/</link><pubDate>Thu, 10 Apr 2025 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/posts/latent_nodes/</guid><description>&lt;p>Unreal Engine allows the creation of custom latent nodes to do async tasks while the code execution continues parallelly.&lt;br>
One way to make latent nodes is to create new classes that inherit from &lt;em>UBlueprintAsyncActionBase&lt;/em> and create the function for your node. The function must be BlueprintCallable and add in its metadata information &lt;em>BlueprintInternalUseOnly = &amp;ldquo;true&amp;rdquo;&lt;/em> and a world context object (the name in metadadata must be the same name of the object in the parameters).&lt;br>
Once the function is created you have to declare a dyanmic multicast delegate for the outpunt pins of your node using &lt;em>DECLARE_DYNAMIC_MULTICAST_DELEGATE(FYourDelegateName);&lt;/em> and the variables for every output pin you&amp;rsquo;ll need.&lt;/p></description></item><item><title>Replicated Timer Example</title><link>https://manuelotheo.com/posts/replicated_timer/</link><pubDate>Tue, 08 Apr 2025 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/posts/replicated_timer/</guid><description>&lt;h2 id="how-to-synchronize-a-network-clock-in-unreal">
 How to synchronize a network clock in unreal
 &lt;a class="heading-link" href="#how-to-synchronize-a-network-clock-in-unreal">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h2>
&lt;p>In this example we will be creating a timer that replicates on clients, for this example, first create a new class on the Unreal Editor, selecting &lt;em>Actor&lt;/em> as a parent class.&lt;/p>
&lt;p>&lt;img src="https://manuelotheo.com/images/ReplicatedTimer/CreatingTimerClass.png" alt="">&lt;/p>
&lt;p>Name your class and create a blueprint class as well, we will be using it later to display the timer.&lt;/p>
&lt;p>&lt;img src="https://manuelotheo.com/images/ReplicatedTimer/CreatingBlueprintClass.png" alt="">&lt;/p>
&lt;p>Open your &lt;code>.h&lt;/code> file and add the following variables to the public section:&lt;/p></description></item><item><title>Filtering (Iris)</title><link>https://manuelotheo.com/posts/iris_filtering/</link><pubDate>Mon, 07 Apr 2025 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/posts/iris_filtering/</guid><description>&lt;h1 id="filtering">
 Filtering
 &lt;a class="heading-link" href="#filtering">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h1>
&lt;p>Iris implements a filtering mechanism that allows you to choose which network connections will handle the replication of actors and objects. This feature can be especially useful for saving bandwidth and reducing replication overhead.
You can filter using:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Owner:&lt;/strong> Objects and actors only replicate in the same connections as its owner.&lt;/li>
&lt;li>&lt;strong>Connection:&lt;/strong> Objects and actor replicate or avoid the specified connections, if you want to set a filter for many objects is better to implement a group.&lt;/li>
&lt;li>&lt;strong>Group:&lt;/strong> Objects and actors replicate in the connections where the members of the same group replicate.&lt;/li>
&lt;li>&lt;strong>Dynamic:&lt;/strong> Objects and actors can change dynamically between filters.&lt;/li>
&lt;/ul>
&lt;h5 id="owner-filter">
 Owner filter
 &lt;a class="heading-link" href="#owner-filter">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h5>
&lt;p>For the following example let&amp;rsquo;s set the filter for the character to owner. To start working with Iris Filtering System you must include the following header files:&lt;/p></description></item><item><title>Prioritization (Iris)</title><link>https://manuelotheo.com/posts/iris_prioritization/</link><pubDate>Mon, 07 Apr 2025 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/posts/iris_prioritization/</guid><description>&lt;h1 id="prioritization">
 Prioritization
 &lt;a class="heading-link" href="#prioritization">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h1>
&lt;p>In order to optimize bandwidth Iris includes a prioritization system which allows you to set a priority based on values between 0.0 and 1.0. If an actor has a current priority value higher than 0.0 and lower than 1.0 it won&amp;rsquo;t be replicated in the current frame but it will be increased based on the priority set and if it reaches 1.0 it will be replicated and restarted (actor with a value of 1.0 will be replicated every tick).&lt;br>
As example, an actor wich was set with a value of 0.2 for its priorit will be four ticks without replication but it will be replicated at the fifth and so on.&lt;/p></description></item><item><title>Iris Introduction</title><link>https://manuelotheo.com/posts/iris_introduction/</link><pubDate>Tue, 25 Mar 2025 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/posts/iris_introduction/</guid><description>&lt;h1 id="what-is-iris">
 What is Iris?
 &lt;a class="heading-link" href="#what-is-iris">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h1>
&lt;p>Iris is a replication system created by Epic Games to work with Unreal&amp;rsquo;s replication system minimizing dependencies between the gameplay system and the replication system with just a few small changes to the code.&lt;br>
Some of the benefits of implementing Iris are:&lt;/p>
&lt;ul>
&lt;li>Separation between game thread data and replication using concurrency.&lt;/li>
&lt;li>Efficiency improvements by sharing workloads for multiple objects and connections.&lt;/li>
&lt;li>Allows higher player counts.&lt;/li>
&lt;li>Larger and more interactive worlds.&lt;/li>
&lt;li>Lower server costs.&lt;/li>
&lt;li>Improves the performance by expecting clients to notify to it when a change is made.&lt;/li>
&lt;/ul>
&lt;h1 id="iris-components">
 Iris components
 &lt;a class="heading-link" href="#iris-components">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h1>
&lt;p>Iris consists of two main components that enable the replication of actors and objects. It achieves this by adding them to the replication system, creating structs to store their information, assigning priorities, applying filters, and providing additional functionalities. The components are:&lt;/p></description></item><item><title>Prediction keys (GAS)</title><link>https://manuelotheo.com/posts/prediction_keys/</link><pubDate>Fri, 21 Mar 2025 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/posts/prediction_keys/</guid><description>&lt;h2 id="prediction-keys-gas">
 Prediction keys (GAS)
 &lt;a class="heading-link" href="#prediction-keys-gas">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h2>
&lt;p>As studied in previous topics, GAS implements several nodes and tools to allow for easier multiplayer replication tasks, in this article we will explain how prediction keys work.&lt;br>
Prediction Keys allow clients to start abilities before the server to predict certain results that will be corroborated by the server once the logic executes there too. In case certain information doesn&amp;rsquo;t match with server version the corrections will be applied on the clients. Here are some of the elements that the clients can predict:&lt;/p></description></item><item><title>UI (GAS)</title><link>https://manuelotheo.com/posts/ui_gas/</link><pubDate>Wed, 19 Mar 2025 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/posts/ui_gas/</guid><description>&lt;h2 id="bind-ui-to-attributes">
 Bind UI to attributes
 &lt;a class="heading-link" href="#bind-ui-to-attributes">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h2>
&lt;p>You can bind events in your UI to player&amp;rsquo;s atttributes to update widgets like progress bars or text or input buttons based on player&amp;rsquo;s abilities. To make that possible you need to add your UI to the screen and pass the ability system component and/or the attribute set (depending on what you want to do).&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="n">AMTCharacter&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">OnRep_PlayerState&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="n">Super&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">OnRep_PlayerState&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">AMTPlayerState&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">MTPlayerState&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Cast&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">AMTPlayerState&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">GetPlayerState&lt;/span>&lt;span class="p">()))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">		&lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">MTPlayerState&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">AbilitySystemComponent&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">		&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">			&lt;span class="n">MTPlayerState&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">AbilitySystemComponent&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">InitAbilityActorInfo&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">MTPlayerState&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">this&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">			&lt;span class="n">AbilitySystemComponent&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">MTPlayerState&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">AbilitySystemComponent&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">			&lt;span class="n">AttributeSet&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">MTPlayerState&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">AttributeSet&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">			&lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">IsLocallyControlled&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">				&lt;span class="n">CreateHUD&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">		&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="n">AMTCharacter&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">CreateHUD&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">HUDClass&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">		&lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">AMTPlayerState&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">MTPlayerState&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Cast&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">AMTPlayerState&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">GetPlayerState&lt;/span>&lt;span class="p">()))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">		&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">			&lt;span class="n">HUD&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">CreateWidget&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">UMTGameHUD&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">GetWorld&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="n">HUDClass&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">TEXT&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;HUD&amp;#34;&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">			&lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">HUD&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">			&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">				&lt;span class="n">HUD&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">AddToPlayerScreen&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">				&lt;span class="k">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">UMTAttributeSet&lt;/span>&lt;span class="o">*&lt;/span> &lt;span class="n">MTAttributeSet&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Cast&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">UMTAttributeSet&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">MTPlayerState&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">AttributeSet&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">					&lt;span class="n">HUD&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="n">InitHUD&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">MTAttributeSet&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">			&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">		&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You can now bind the functions to update the HUD widgets everytime one of the attributes changes using &lt;em>GetGameplayAttributeValueChangeDelegate&lt;/em>. That functions is included in the Ability System Component and only needs the attribute from your attribute set and the function to be called.&lt;/p></description></item><item><title>Character Movement</title><link>https://manuelotheo.com/posts/character_movement/</link><pubDate>Mon, 17 Mar 2025 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/posts/character_movement/</guid><description>&lt;h3 id="character-movement">
 Character Movement
 &lt;a class="heading-link" href="#character-movement">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h3>
&lt;p>Character Movement is a system that provides the locomotion system, designed specifically for humanoid characters. Character Movement is an actor component that, when assigned to a character class, grants movement modes such as walking, falling, swimming, and flying. Additionally, it has strong integration with networked gameplay and provides a framework to help developers create custom networked movement.&lt;/p>
&lt;p>To integrate Character Movement into a character in your project, you must ensure that the character includes basic animations such as idle, walk, run, and jump. If you&amp;rsquo;re using the Unreal Mannequin in Fab, you can find free animation packs for this character.&lt;/p></description></item><item><title>Character Mover 2.0</title><link>https://manuelotheo.com/posts/character_mover_2_0/</link><pubDate>Mon, 17 Mar 2025 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/posts/character_mover_2_0/</guid><description>&lt;p>The Mover plugin (aka Character Mover 2.0) effort has the goal of massively improving the existing character movement functionality in UE. This is going to be a very large endeavor that has numerous touchpoints in the codebase, ranging from physics to animation to networking.&lt;/p>
&lt;p>The main goals of this effort are to:&lt;/p>
&lt;p>Support all actor types, not only characters&lt;/p>
&lt;p>Allow gameplay programmers to focus on movement, less on the complexities of networking.&lt;/p></description></item><item><title>Ability animations (GAS)</title><link>https://manuelotheo.com/posts/abilities_animations/</link><pubDate>Fri, 14 Mar 2025 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/posts/abilities_animations/</guid><description>&lt;h2 id="abilities-with-animations">
 Abilities with animations
 &lt;a class="heading-link" href="#abilities-with-animations">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h2>
&lt;p>Animations are an important part in most abilities, they allow players to know that something is happening and improve their experience. Gameplay Ability System (GAS) includes its own tasks to allow you to play montages and replicate them to all the players.&lt;br>
To play a montage you just need to add the node called PlayMontageAndWait. &lt;br>
&lt;img src="https://manuelotheo.com/images/GAS/PlayMontage.png" alt="PlayMontageAndWait">&lt;br>
This node is latent, allowing the execution to continue while the montage is playing and enabling you to add logic based on different events. It directly uses the avatar of your ability, so there&amp;rsquo;s no need to input a skeletal mesh.&lt;br>
It is recommended to add logic to end the ability based on different circumstances, such as the animation being interrupted by another event. This will help avoid cases where the ability remains active indefinitely, preventing you from casting it again.&lt;/p></description></item><item><title>GAS debugging</title><link>https://manuelotheo.com/posts/gas_debugging/</link><pubDate>Sun, 02 Mar 2025 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/posts/gas_debugging/</guid><description>&lt;h2 id="gameplay-debugger">
 Gameplay Debugger
 &lt;a class="heading-link" href="#gameplay-debugger">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h2>
&lt;p>The Gameplay Ability System (GAS) offers debugging commands that provide valuable insights into the state of characters, AI behavior, and GAS components such as tags, abilities, attributes, and effects.&lt;br>
To activate the gameplay debugger for GAS you just have to press the &amp;rsquo; (Apostrophe) key on your keyboard, it will display the following menu where you can select the information you want to know about the character that is in the center of the screen. In case you want to verify the information of your local player you can use Shift + &amp;lsquo;.&lt;br>
&lt;img src="https://manuelotheo.com/images/GAS/GameplayDebugger.png" alt="GameplayDebugger">
To toggle the visibility of the information you can press the these numbers in your numpad:&lt;/p></description></item><item><title>Network Profiling</title><link>https://manuelotheo.com/posts/network_profiling/</link><pubDate>Mon, 24 Feb 2025 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/posts/network_profiling/</guid><description>&lt;h3 id="network-profiler">
 Network Profiler
 &lt;a class="heading-link" href="#network-profiler">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h3>
&lt;p>It is a standalone tool designed to show network traffic and performance data collected by Unreal Engine while a game is running.&lt;/p>
&lt;h4 id="record-a-profiling-session">
 Record a profiling session
 &lt;a class="heading-link" href="#record-a-profiling-session">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h4>
&lt;p>To use the network profiler, you must first record data, which requires an engine version with stat tracking enabled. This usually means using a debug or editor build, with the engine compiled with the STATS macro set to a nonzero value.&lt;/p></description></item><item><title>Network Testing</title><link>https://manuelotheo.com/posts/networktesting/</link><pubDate>Mon, 24 Feb 2025 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/posts/networktesting/</guid><description>&lt;h3 id="network-testing">
 Network Testing
 &lt;a class="heading-link" href="#network-testing">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h3>
&lt;p>##Lag Simulation
The Unreal Editor includes various settings to facilitate multiplayer testing, such as adjusting the number of players, running multiple Play windows, and enabling a dedicated server. These options can be accessed through the Modes drop-down menu in the Toolbar.&lt;/p>
&lt;p>&lt;img src="https://manuelotheo.com/images/NetworkTesting/Image_01.png" alt="AdvancedOptions">&lt;/p>
&lt;p>In this section, there are some relevant options under the &amp;ldquo;Multiplayer options&amp;rdquo; section.&lt;/p>
&lt;p>&lt;img src="https://manuelotheo.com/images/NetworkTesting/Image_02.png" alt="AdvancedOptions">&lt;/p>
&lt;h4 id="network-emulation">
 Network Emulation
 &lt;a class="heading-link" href="#network-emulation">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h4>
&lt;p>This tool is useful for detecting and resolving issues related to latency, packet loss, and network fluctuations that could affect gameplay in online environments.
Emulation options:
• Average: Simulates a standard-quality connection with moderate latency.
• Bad: Introduces higher latency and packet loss to replicate unstable connections.
• Custom: Allows manual configuration of latency, jitter, and packet loss values.&lt;/p></description></item><item><title>Unreal Insights</title><link>https://manuelotheo.com/posts/unreal_inisights/</link><pubDate>Mon, 24 Feb 2025 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/posts/unreal_inisights/</guid><description>&lt;h3 id="unreal-insights">
 Unreal Insights
 &lt;a class="heading-link" href="#unreal-insights">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h3>
&lt;p>Unreal Insights is a telemetry analysis and capture tool that records events from your project at high data rates. It helps identify areas that may need optimization.&lt;/p>
&lt;p>Users can record trace data to visualize network behavior with the following features:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Packet Overview Panel:&lt;/strong> Displays packet timelines and sizes for transmitted or received data during gameplay.&lt;/li>
&lt;li>&lt;strong>Packet Content Panel:&lt;/strong> Reveals packet details, including replicated objects, properties, and remote function calls.&lt;/li>
&lt;li>&lt;strong>Connection Selections Panel:&lt;/strong> Controls information display based on game instance, connection, and connection mode.&lt;/li>
&lt;li>&lt;strong>Net Stats Panel:&lt;/strong> Shows trace events for selected packets, providing statistics on total, maximum, and average (exclusive or inclusive) packet sizes.&lt;/li>
&lt;li>&lt;strong>Net Stats Counters Panel:&lt;/strong> Displays recorded stats counters for the replication system.&lt;/li>
&lt;/ul>
&lt;h4 id="verifying-unreal-insights-is-running">
 Verifying Unreal Insights is Running
 &lt;a class="heading-link" href="#verifying-unreal-insights-is-running">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h4>
&lt;p>To verify that Unreal Insights is running, look at the bottom-right corner of your screen for the following option:&lt;/p></description></item><item><title>Replicated Variables</title><link>https://manuelotheo.com/posts/replicated-variables/</link><pubDate>Fri, 21 Feb 2025 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/posts/replicated-variables/</guid><description>&lt;h2 id="what-is-replication">
 What is replication?
 &lt;a class="heading-link" href="#what-is-replication">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h2>
&lt;p>Replcation is a process in which a client or multiple clients send information to the server, once received, the server, which holds the authoritative state, is in charge of sinchronizing all the clients&amp;rsquo; states in game.
This allows for interactions in online multiplayer games to feel like they&amp;rsquo;re happening in real time even if the other players are thousands of miles away.&lt;/p></description></item><item><title>Replication Frequency</title><link>https://manuelotheo.com/posts/replication-frequency/</link><pubDate>Thu, 20 Feb 2025 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/posts/replication-frequency/</guid><description>&lt;h2 id="what-is-replication-frequency">
 What is replication frequency?
 &lt;a class="heading-link" href="#what-is-replication-frequency">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h2>
&lt;p>It refers to how often a variable is replicated in game, useful in cases where there are many variables that don&amp;rsquo;t require replication every single tick, one of it&amp;rsquo;s main uses is to save the limited amount of bandwidth a server has at any given moment. After the set amount of time has passed, the server will check the replicated actor and send information to the relevant clients in case there are any changes.&lt;/p></description></item><item><title>Gameplay abilities (GAS)</title><link>https://manuelotheo.com/posts/gameplay_abilities/</link><pubDate>Wed, 19 Feb 2025 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/posts/gameplay_abilities/</guid><description>&lt;h2 id="gameplay-abilities">
 Gameplay abilities
 &lt;a class="heading-link" href="#gameplay-abilities">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h2>
&lt;p>The Gameplay Ability System (GAS) simplifies the creation of abilities by allowing developers to modify attributes, apply effects, spawn sounds and visual effects, handle event-driven actions, integrate root motion, and more.&lt;br>
For a character to use an ability it&amp;rsquo;s necessary for it to be equipped. To do this we will first create an Array of subclasses of &lt;a href="https://manuelotheo.com/posts/glossary/#gas" class="external-link" target="_blank" rel="noopener">Gameplay Abilities&lt;/a> and a function to equip them.&lt;/p></description></item><item><title>AttributeSet and GameplayEffects (GAS)</title><link>https://manuelotheo.com/posts/attribute_set_and_gameplay_effects/</link><pubDate>Mon, 17 Feb 2025 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/posts/attribute_set_and_gameplay_effects/</guid><description>&lt;h2 id="attributeset">
 AttributeSet
 &lt;a class="heading-link" href="#attributeset">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h2>
&lt;p>Gameplay Ability System (GAS) includes tools to create a set of attributes which can be modified based on effects applied by abilities and interactions with other game elements.&lt;br>
To add custom &lt;a href="https://manuelotheo.com/posts/glossary/#gas" class="external-link" target="_blank" rel="noopener">attributes&lt;/a> to our actors it&amp;rsquo;s necessary to create a child class of &lt;a href="https://manuelotheo.com/posts/glossary/#gas" class="external-link" target="_blank" rel="noopener">AttributeSet&lt;/a> which will contain the attributes for the ability system component and replicate them.&lt;br>
The attributes must be structs of the type FGameplayAttributeData and they will be replicated using a function.&lt;/p></description></item><item><title>Net Dormancy</title><link>https://manuelotheo.com/posts/net_dormancy/</link><pubDate>Mon, 17 Feb 2025 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/posts/net_dormancy/</guid><description>&lt;h3 id="net-dormancy">
 Net Dormancy
 &lt;a class="heading-link" href="#net-dormancy">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h3>
&lt;p>Setting an actor’s NetDormancy in Unreal Engine can significantly optimize server performance in multiplayer projects. It helps reduce server CPU usage by several milliseconds per frame, especially in games with many replicated actors that don’t change frequently.&lt;/p>
&lt;h2 id="types-of-net-dormancy">
 Types of net dormancy
 &lt;a class="heading-link" href="#types-of-net-dormancy">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>DORM_Never: This actor never goes dormant.&lt;/li>
&lt;li>DORM_Awake: This actor is not dormant and is considered for replication.&lt;/li>
&lt;li>DORM_DormantPartial: This actor is dormant on some connections, but not all.&lt;/li>
&lt;li>DORM_Initial: This actor is initially dormant on all connections.&lt;/li>
&lt;li>DORM_DormantAll: This actor is initially dormant on all connections.&lt;/li>
&lt;/ul>
&lt;p>The following code belongs to a C++ class named MTNetDormancyActor, which is derived from an actor. In this class, a sphere changes color, and this change is replicated to the clients.&lt;/p></description></item><item><title>World Partition</title><link>https://manuelotheo.com/posts/world_partition/</link><pubDate>Mon, 17 Feb 2025 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/posts/world_partition/</guid><description>&lt;h3 id="world-partition">
 World Partition
 &lt;a class="heading-link" href="#world-partition">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h3>
&lt;p>World Partition is an automated system for managing large worlds in Unreal Engine.
It replaces the need for sublevels by storing everything in a single persistent level divided into grid cells.
These cells are dynamically loaded and unloaded based on distance from a streaming source, ensuring efficient level streaming and data management.&lt;/p>
&lt;h2 id="how-to-enable-it">
 How to enable it?
 &lt;a class="heading-link" href="#how-to-enable-it">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h2>
&lt;p>World Partition can be enabled in different ways depending on the state of the project:&lt;/p></description></item><item><title>Glossary</title><link>https://manuelotheo.com/posts/glossary/</link><pubDate>Fri, 14 Feb 2025 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/posts/glossary/</guid><description>&lt;h1 id="gas">
 GAS
 &lt;a class="heading-link" href="#gas">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h1>
&lt;ul>
&lt;li>&lt;strong>Gameplay Ability System (GAS):&lt;/strong> A framework created by Epic Games for Unreal Engine. It provides developers tools to make tasks like setting attributes, applying effects or activating abilities easier.&lt;/li>
&lt;li>&lt;strong>Ability System Component (ASC):&lt;/strong> A component necessary for all the classes implementing the Gameplay Ability System. This component contains the information of the OwnerActor and the AvatarActor, allows the use of abilities and effects, along other functionalities.&lt;/li>
&lt;li>&lt;strong>OwnerActor:&lt;/strong> In the context of GAS, the OwnerActor is the entity who contains the Ability System Component.&lt;/li>
&lt;li>&lt;strong>AvatarActor:&lt;/strong> In the context of GAS, the AvatarActor is the physical representation of the actor in game affected by the Ability System Component.&lt;/li>
&lt;li>&lt;strong>Gameplay Attribute:&lt;/strong> In the context of GAS, a gameplay attribute is a struct which represents a floating value that is related to a game element, often associated with an actor.&lt;/li>
&lt;li>&lt;strong>AttributeSet Class:&lt;/strong> Class where attributes will be defined, initialized, replicated and modified.&lt;/li>
&lt;li>&lt;strong>Gameplay Effects:&lt;/strong> Classes that modifie attributes after being applied. They can affect an actor instantly, for a certain amount of time, or until the effect is canceled.&lt;/li>
&lt;li>&lt;strong>Gameplay Tags:&lt;/strong> Strings defined by the users to evaluate attributes, behaviors, states, among other elements hierarchically.&lt;/li>
&lt;li>&lt;strong>Gameplay Ability:&lt;/strong> Actions that an actor can do multiple times asynchronously. The abilities can apply effects, activate cooldowns for its activation, contain tags to add conditions or add tags to other actors.&lt;/li>
&lt;/ul></description></item><item><title>GAS Setup</title><link>https://manuelotheo.com/posts/gas_setup/</link><pubDate>Thu, 13 Feb 2025 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/posts/gas_setup/</guid><description>&lt;h2 id="setting-up-gas">
 Setting up GAS
 &lt;a class="heading-link" href="#setting-up-gas">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h2>
&lt;p>To start working with &lt;a href="https://manuelotheo.com/posts/glossary/#gas" class="external-link" target="_blank" rel="noopener">Gameplay Ability System&lt;/a> (GAS) it is necessary to enable the plugin called &amp;ldquo;Gameplay Abilities&amp;rdquo; in the Plugins section of your project.&lt;/p>
&lt;p>&lt;img src="https://manuelotheo.com/images/GAS/Setup/GameplayAbilitiesPlugin.png" alt="Plugin">&lt;/p>
&lt;p>After enabling the plugin and restarting the engine it&amp;rsquo;s necessary to add some modules in your Build.cs file. The modules are &amp;ldquo;GameplayAbilities&amp;rdquo;, &amp;ldquo;GameplayTags&amp;rdquo; and &amp;ldquo;GameplayTasks&amp;rdquo;.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="n">PublicDependencyModuleNames&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">AddRange&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">new&lt;/span> &lt;span class="n">string&lt;/span>&lt;span class="p">[]&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="s">&amp;#34;Core&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;CoreUObject&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;Engine&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;InputCore&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;EnhancedInput&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;GameplayAbilities&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;GameplayTags&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;GameplayTasks&amp;#34;&lt;/span> &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="adding-ability-system-interface-to-classes">
 Adding Ability System Interface to classes
 &lt;a class="heading-link" href="#adding-ability-system-interface-to-classes">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h2>
&lt;p>The Gameplay Ability System requires classes that implement it to include the IAbilitySystemInterface and they must have the GetAbilitySystemComponent() function overridden.&lt;/p></description></item><item><title>Contact Us</title><link>https://manuelotheo.com/contact/</link><pubDate>Sat, 10 Feb 2024 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/contact/</guid><description>&lt;h2 id="-contact-hammerbyte-games">
 🛠 Contact Hammerbyte Games
 &lt;a class="heading-link" href="#-contact-hammerbyte-games">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h2>
&lt;p>We&amp;rsquo;re always excited to connect with fellow game developers, publishers, and players! Whether you&amp;rsquo;re interested in &lt;strong>collaborations, business inquiries, or general support&lt;/strong>, feel free to reach out.&lt;/p>
&lt;h3 id="-our-website">
 📍 &lt;strong>Our Website&lt;/strong>
 &lt;a class="heading-link" href="#-our-website">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h3>
&lt;p>🌍 &lt;a href="https://hammerbyte.com/" class="external-link" target="_blank" rel="noopener">Hammerbyte Games&lt;/a> – Explore our latest projects and insights.&lt;/p>
&lt;h3 id="-social-media">
 💬 &lt;strong>Social Media&lt;/strong>
 &lt;a class="heading-link" href="#-social-media">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h3>
&lt;p>📷 &lt;strong>Instagram&lt;/strong>: &lt;a href="https://www.instagram.com/hammerbyte_games/" class="external-link" target="_blank" rel="noopener">@hammerbyte_games&lt;/a>&lt;br>
🐦 &lt;strong>Twitter (X)&lt;/strong>: &lt;a href="https://x.com/Lootheo" class="external-link" target="_blank" rel="noopener">@Lootheo&lt;/a>&lt;br>
🖥 &lt;strong>GitHub&lt;/strong>: &lt;a href="https://github.com/lootheo" class="external-link" target="_blank" rel="noopener">@lootheo&lt;/a>&lt;/p></description></item><item><title>Markdown Syntax Guide</title><link>https://manuelotheo.com/hidden/markdown-syntax/</link><pubDate>Thu, 13 Jul 2023 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/hidden/markdown-syntax/</guid><description>&lt;p>This article offers a sample of basic Markdown syntax that can be used in Hugo content files, also it shows whether basic HTML elements are decorated with CSS in a Hugo theme.&lt;/p></description></item><item><title>Rich Content</title><link>https://manuelotheo.com/hidden/rich-content/</link><pubDate>Wed, 12 Jul 2023 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/hidden/rich-content/</guid><description>&lt;p>Hugo ships with several &lt;a href="https://gohugo.io/content-management/shortcodes/#use-hugos-built-in-shortcodes" class="external-link" target="_blank" rel="noopener">Built-in Shortcodes&lt;/a> for rich content, along with a &lt;a href="https://gohugo.io/about/hugo-and-gdpr/" class="external-link" target="_blank" rel="noopener">Privacy Config&lt;/a> and a set of Simple Shortcodes that enable static and no-JS versions of various social media embeds.&lt;/p>
&lt;h2 id="heading">
 
 &lt;a class="heading-link" href="#heading">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h2></description></item><item><title>More Rich Content</title><link>https://manuelotheo.com/hidden/more-rich-content/</link><pubDate>Tue, 11 Jul 2023 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/hidden/more-rich-content/</guid><description>&lt;p>Hugo Coder provides some Custom Shortcodes.&lt;/p>
&lt;h2 id="heading">
 
 &lt;a class="heading-link" href="#heading">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h2></description></item><item><title>Math Typesetting</title><link>https://manuelotheo.com/hidden/math-typesetting/</link><pubDate>Mon, 10 Jul 2023 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/hidden/math-typesetting/</guid><description>&lt;p>Mathematical notation in a Hugo project can be enabled by using third party JavaScript libraries.&lt;/p></description></item><item><title>HTML and CSS only tabs</title><link>https://manuelotheo.com/hidden/html-and-css-only-tabs/</link><pubDate>Sun, 09 Jul 2023 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/hidden/html-and-css-only-tabs/</guid><description>&lt;h2 id="shortcodes">
 Shortcodes
 &lt;a class="heading-link" href="#shortcodes">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h2>
&lt;p>The following content:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-markdown" data-lang="markdown">&lt;span class="line">&lt;span class="cl">{{&lt;span class="p">&amp;lt;&lt;/span> &lt;span class="nt">tabgroup&lt;/span> &lt;span class="p">&amp;gt;&lt;/span>}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{&lt;span class="p">&amp;lt;&lt;/span> &lt;span class="nt">tab&lt;/span> &lt;span class="na">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;Hello&amp;#34;&lt;/span> &lt;span class="p">&amp;gt;&lt;/span>}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Hello World!
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{&lt;span class="p">&amp;lt;&lt;/span> &lt;span class="p">/&lt;/span>&lt;span class="nt">tab&lt;/span> &lt;span class="p">&amp;gt;&lt;/span>}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{&lt;span class="p">&amp;lt;&lt;/span> &lt;span class="nt">tab&lt;/span> &lt;span class="na">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;Goodbye&amp;#34;&lt;/span> &lt;span class="p">&amp;gt;&lt;/span>}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Goodbye Everybody!
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{&lt;span class="p">&amp;lt;&lt;/span> &lt;span class="p">/&lt;/span>&lt;span class="nt">tab&lt;/span> &lt;span class="p">&amp;gt;&lt;/span>}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{&lt;span class="p">&amp;lt;&lt;/span> &lt;span class="p">/&lt;/span>&lt;span class="nt">tabgroup&lt;/span> &lt;span class="p">&amp;gt;&lt;/span>}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Will generate:&lt;/p>





&lt;div class="tabs tabs-left">
 




&lt;style>
 .tabs input#tab-0-0:checked ~ .tab-content-0-0 {
 display: block;
 }
&lt;/style>

&lt;input type="radio" class="tab-input" name="tab-select-0" id="tab-0-0" checked/>
&lt;label for="tab-0-0" class="tab-label">Hello&lt;/label>
&lt;div class="tab-content tab-content-0-0">
 Hello World!
&lt;/div>








&lt;style>
 .tabs input#tab-0-1:checked ~ .tab-content-0-1 {
 display: block;
 }
&lt;/style>

&lt;input type="radio" class="tab-input" name="tab-select-0" id="tab-0-1" />
&lt;label for="tab-0-1" class="tab-label">Goodbye&lt;/label>
&lt;div class="tab-content tab-content-0-1">
 Goodbye Everybody!
&lt;/div>




&lt;/div>



&lt;h2 id="right-alignment">
 Right alignment
 &lt;a class="heading-link" href="#right-alignment">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h2>
&lt;p>You can also align the tabs to the right:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-markdown" data-lang="markdown">&lt;span class="line">&lt;span class="cl">{{&lt;span class="p">&amp;lt;&lt;/span> &lt;span class="nt">tabgroup&lt;/span> &lt;span class="na">align&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;right&amp;#34;&lt;/span> &lt;span class="p">&amp;gt;&lt;/span>}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{&lt;span class="p">&amp;lt;&lt;/span> &lt;span class="nt">tab&lt;/span> &lt;span class="na">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;Hello&amp;#34;&lt;/span> &lt;span class="p">&amp;gt;&lt;/span>}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Hello World!
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{&lt;span class="p">&amp;lt;&lt;/span> &lt;span class="p">/&lt;/span>&lt;span class="nt">tab&lt;/span> &lt;span class="p">&amp;gt;&lt;/span>}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{&lt;span class="p">&amp;lt;&lt;/span> &lt;span class="nt">tab&lt;/span> &lt;span class="na">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;Goodbye&amp;#34;&lt;/span> &lt;span class="p">&amp;gt;&lt;/span>}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Goodbye Everybody!
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{&lt;span class="p">&amp;lt;&lt;/span> &lt;span class="p">/&lt;/span>&lt;span class="nt">tab&lt;/span> &lt;span class="p">&amp;gt;&lt;/span>}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{&lt;span class="p">&amp;lt;&lt;/span> &lt;span class="p">/&lt;/span>&lt;span class="nt">tabgroup&lt;/span> &lt;span class="p">&amp;gt;&lt;/span>}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Giving you this look:&lt;/p></description></item><item><title>Mermaid JS support</title><link>https://manuelotheo.com/hidden/mermaid-support/</link><pubDate>Sat, 08 Jul 2023 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/hidden/mermaid-support/</guid><description>&lt;p>If you want to use &lt;a href="https://mermaid-js.github.io/mermaid/#/" class="external-link" target="_blank" rel="noopener">Mermaid-JS&lt;/a> on your website.
Provide &lt;code>mermaid&lt;/code> as &lt;a href="https://gohugo.io/content-management/shortcodes/#readout" class="external-link" target="_blank" rel="noopener">Shortcode&lt;/a> in your markdown file.&lt;/p>
&lt;div class="mermaid">
flowchart LR

 A --> B

 B --> C

 C --> D

 D --> B


&lt;/div>

&lt;div class="mermaid">
sequenceDiagram
participant Alice
participant Bob
Alice->>Bob: Hi Bob
Bob->>Alice: Hi Alice

&lt;/div>

&lt;p>Find more example on &lt;a href="https://mermaid-js.github.io/mermaid/#/" class="external-link" target="_blank" rel="noopener">Mermaid-JS&lt;/a> website.&lt;/p></description></item><item><title>Emoji Support</title><link>https://manuelotheo.com/hidden/emoji-support/</link><pubDate>Fri, 07 Jul 2023 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/hidden/emoji-support/</guid><description>&lt;p>Emoji can be enabled in a Hugo project in a number of ways.&lt;/p></description></item><item><title>External Page: Hugo Coder Wiki</title><link>https://manuelotheo.com/hidden/hugo-coder-wiki/</link><pubDate>Thu, 06 Jul 2023 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/hidden/hugo-coder-wiki/</guid><description/></item><item><title>Placeholder Text</title><link>https://manuelotheo.com/hidden/placeholder-text/</link><pubDate>Wed, 05 Jul 2023 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/hidden/placeholder-text/</guid><description>&lt;p>This is an edited text to test.&lt;/p>
&lt;p>Lorem est tota propiore conpellat pectoribus de pectora summo.&lt;/p></description></item><item><title>temas</title><link>https://manuelotheo.com/categoria/temas/</link><pubDate>Wed, 04 Jan 2023 23:21:18 +0100</pubDate><guid>https://manuelotheo.com/categoria/temas/</guid><description/></item><item><title>sintaxe</title><link>https://manuelotheo.com/categoria/sintaxe/</link><pubDate>Wed, 04 Jan 2023 23:21:06 +0100</pubDate><guid>https://manuelotheo.com/categoria/sintaxe/</guid><description/></item><item><title>Códigos curtos</title><link>https://manuelotheo.com/tags/shortcodes/_index.pt-br/</link><pubDate>Wed, 04 Jan 2023 11:51:36 +0100</pubDate><guid>https://manuelotheo.com/tags/shortcodes/_index.pt-br/</guid><description/></item><item><title>Portfolio</title><link>https://manuelotheo.com/portfolio/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuelotheo.com/portfolio/</guid><description>&lt;h1 id="kiln">
 Kiln
 &lt;a class="heading-link" href="#kiln">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h1>
&lt;h2 id="building-the-multiplayer-foundation-of-double-fines-pottery-party-brawler">
 Building the multiplayer foundation of Double Fine&amp;rsquo;s pottery-party brawler
 &lt;a class="heading-link" href="#building-the-multiplayer-foundation-of-double-fines-pottery-party-brawler">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h2>
&lt;p>As Senior Multiplayer Engineer, I designed and implemented major parts of the networking and online foundation for &lt;em>Kiln&lt;/em>. My work covered custom Unreal Iris replication, gameplay synchronization, parties, matchmaking, social lobbies, dedicated servers, PlayFab integration, cross-platform services, telemetry, and failure recovery.&lt;/p>

 &lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/NbKtz98-3xE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video">&lt;/iframe>
 &lt;/div>

&lt;h3 id="project-details">
 Project details
 &lt;a class="heading-link" href="#project-details">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h3>
&lt;p>&lt;strong>Role:&lt;/strong> Senior Multiplayer Engineer&lt;br>
&lt;strong>Studio:&lt;/strong> Double Fine Productions / Xbox Game Studios&lt;br>
&lt;strong>Platforms:&lt;/strong> Xbox Series X|S, PlayStation 5, Xbox PC, and Steam&lt;br>
&lt;strong>Technology:&lt;/strong> Unreal Engine, C++, Iris, PlayFab&lt;br>
&lt;strong>Release date:&lt;/strong> April 23, 2026&lt;/p></description></item></channel></rss>