<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://wiki.heroesofhammerwatch2.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Thyraxxvoid</id>
	<title>Heroes of Hammerwatch Wiki - User contributions [en-gb]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.heroesofhammerwatch2.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Thyraxxvoid"/>
	<link rel="alternate" type="text/html" href="https://wiki.heroesofhammerwatch2.com/Special:Contributions/Thyraxxvoid"/>
	<updated>2026-10-08T03:08:09Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://wiki.heroesofhammerwatch2.com/index.php?title=Bosses&amp;diff=1858</id>
		<title>Bosses</title>
		<link rel="alternate" type="text/html" href="https://wiki.heroesofhammerwatch2.com/index.php?title=Bosses&amp;diff=1858"/>
		<updated>2026-08-02T11:00:57Z</updated>

		<summary type="html">&lt;p&gt;Thyraxxvoid: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== Dark Citadel Bosses ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Enemy Name !! {{icon|hp}} !! {{icon|mp}} Scale Factor !! {{icon|armor}} !! {{icon|fire resist}} !! {{icon|ice resist}} !! {{icon|lightning resist}} !! {{icon|poison resist}} !! {{icon|xp}} !! Immunity || Tag&lt;br /&gt;
|-&lt;br /&gt;
| [[Totem Pole]] || 8,000 || 1 ||20/200&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;|| 20/200&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;|| 20/200&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;|| 20/200&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;|| 50|| ? || &lt;br /&gt;
{{icon|bleeding}}&lt;br /&gt;
{{icon|disarm}}&lt;br /&gt;
{{icon|immobilize}}&lt;br /&gt;
{{icon|freeze}}&lt;br /&gt;
{{icon|silence}}&lt;br /&gt;
{{icon|stun}}&lt;br /&gt;
{{icon|slow}}&lt;br /&gt;
|| enemy, boss, construct&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [[Shadow Face]] || 10,000 ||  ||  ||  ||  ||  ||  || 5,000 || &lt;br /&gt;
None &lt;br /&gt;
|| enemy, boss&lt;br /&gt;
|-&lt;br /&gt;
| [[Arista]] || 15,000 || 1 || 30 || 10 || 20 || 20 || 100 || 9,000 || &lt;br /&gt;
{{icon|confusion}}&lt;br /&gt;
{{icon|disarm}}&lt;br /&gt;
{{icon|freeze}}&lt;br /&gt;
{{icon|silence}}&lt;br /&gt;
{{icon|stun}}&lt;br /&gt;
{{icon|slow}}&lt;br /&gt;
{{icon|blindness}}&lt;br /&gt;
|| enemy, aberration, boss&lt;br /&gt;
|-&lt;br /&gt;
| [[Harbingers of Dread]] || 40,000 || 1 ||  ||  ||  ||  ||  || 12,000 ||&lt;br /&gt;
{{icon|confusion}}&lt;br /&gt;
{{icon|disarm}}&lt;br /&gt;
{{icon|freeze}}&lt;br /&gt;
{{icon|silence}}&lt;br /&gt;
{{icon|stun}}&lt;br /&gt;
|| enemy, undead, boss&lt;br /&gt;
|-&lt;br /&gt;
| [[Serpents of Demise]] || 2,000,000 ||  || 60 || 60 || 60 || 60 || 60 || 0 || &lt;br /&gt;
{{icon|confusion}}&lt;br /&gt;
{{icon|disarm}}&lt;br /&gt;
{{icon|immobilize}}&lt;br /&gt;
{{icon|freeze}}&lt;br /&gt;
{{icon|silence}}&lt;br /&gt;
{{icon|stun}}&lt;br /&gt;
{{icon|slow}}&lt;br /&gt;
|| enemy, boss, undead&lt;br /&gt;
|-&lt;br /&gt;
| [[Avatar]] || 100,000 || 1 || 100 || 100 || 100 || 100 || 100 || 25,000 || &lt;br /&gt;
{{icon|blindness}}&lt;br /&gt;
{{icon|confusion}}&lt;br /&gt;
{{icon|disarm}}&lt;br /&gt;
{{icon|freeze}}&lt;br /&gt;
{{icon|immobilize}}&lt;br /&gt;
{{icon|silence}}&lt;br /&gt;
{{icon|stun}}&lt;br /&gt;
|| enemy, boss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Footnotes ===&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;Totem pole: Earth has 200 Armor, Fire has 200 Fire Resistance, Ice has 200 Ice Resistance, Lightning has 200 Lightning Resistance.&lt;br /&gt;
&lt;br /&gt;
== [[Missions | Mission]] Bosses  ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Enemy Name !! Quest Location !! {{icon|hp}} !! {{icon|mp}} Scale Factor !! {{icon|armor}} !! {{icon|fire resist}} !! {{icon|ice resist}} !! {{icon|lightning resist}} !! {{icon|poison resist}} !! {{icon|xp}} !! Immunity !! Tag&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [[Bandit Lord]] || [[Bandit Keep]] || 20000 || 1 || 50 || 25 || 25 || 25 || 25 || 25000 ||&lt;br /&gt;
{{icon|disarm}}&lt;br /&gt;
{{icon|freeze}}&lt;br /&gt;
{{icon|silence}}&lt;br /&gt;
{{icon|stun}}&lt;br /&gt;
|| enemy, human, boss&lt;br /&gt;
|-&lt;br /&gt;
| [[Spider Queen]] || [[Spider Den ?]] || 20000 || 1 || 50 || 25 || 25 || 25 || 50 || 20000 ||&lt;br /&gt;
{{icon|disarm}}&lt;br /&gt;
{{icon|freeze}}&lt;br /&gt;
{{icon|silence}}&lt;br /&gt;
{{icon|stun}}&lt;br /&gt;
|| enemy, beast, boss&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Navigation==&lt;br /&gt;
{{Template:BaseNav}}&lt;/div&gt;</summary>
		<author><name>Thyraxxvoid</name></author>
	</entry>
	<entry>
		<id>https://wiki.heroesofhammerwatch2.com/index.php?title=Bosses&amp;diff=1857</id>
		<title>Bosses</title>
		<link rel="alternate" type="text/html" href="https://wiki.heroesofhammerwatch2.com/index.php?title=Bosses&amp;diff=1857"/>
		<updated>2026-08-02T10:52:52Z</updated>

		<summary type="html">&lt;p&gt;Thyraxxvoid: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== Dark Citadel Bosses ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Enemy Name !! {{icon|hp}} !! {{icon|mp}} Scale Factor !! {{icon|armor}} !! {{icon|fire resist}} !! {{icon|ice resist}} !! {{icon|lightning resist}} !! {{icon|poison resist}} !! {{icon|xp}} !! Immunity || Tag&lt;br /&gt;
|-&lt;br /&gt;
| [[Totem Pole]] || 8,000 || 1 ||20/200&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;|| 20/200&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;|| 20/200&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;|| 20/200&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;|| 50|| ? || &lt;br /&gt;
{{icon|bleeding}}&lt;br /&gt;
{{icon|disarm}}&lt;br /&gt;
{{icon|immobilize}}&lt;br /&gt;
{{icon|freeze}}&lt;br /&gt;
{{icon|silence}}&lt;br /&gt;
{{icon|stun}}&lt;br /&gt;
{{icon|slow}}&lt;br /&gt;
|| enemy, boss, construct&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [[Shadow Face]] || 10,000 ||  ||  ||  ||  ||  ||  || 5,000 || &lt;br /&gt;
None &lt;br /&gt;
|| enemy, boss&lt;br /&gt;
|-&lt;br /&gt;
| [[Arista]] || 15,000 || 1 || 30 || 10 || 20 || 20 || 100 || 9,000 || &lt;br /&gt;
{{icon|confusion}}&lt;br /&gt;
{{icon|disarm}}&lt;br /&gt;
{{icon|freeze}}&lt;br /&gt;
{{icon|silence}}&lt;br /&gt;
{{icon|stun}}&lt;br /&gt;
{{icon|slow}}&lt;br /&gt;
{{icon|blindness}}&lt;br /&gt;
|| enemy, aberration, boss&lt;br /&gt;
|-&lt;br /&gt;
| [[Harbingers of Dread]] || 40,000 || 1 ||  ||  ||  ||  ||  || 12,000 ||&lt;br /&gt;
{{icon|confusion}}&lt;br /&gt;
{{icon|disarm}}&lt;br /&gt;
{{icon|freeze}}&lt;br /&gt;
{{icon|silence}}&lt;br /&gt;
{{icon|stun}}&lt;br /&gt;
|| enemy, undead, boss&lt;br /&gt;
|-&lt;br /&gt;
| [[Serpents of Demise]] || 2,000,000 ||  || 60 || 60 || 60 || 60 || 60 || 0 || &lt;br /&gt;
{{icon|confusion}}&lt;br /&gt;
{{icon|disarm}}&lt;br /&gt;
{{icon|immobilize}}&lt;br /&gt;
{{icon|freeze}}&lt;br /&gt;
{{icon|silence}}&lt;br /&gt;
{{icon|stun}}&lt;br /&gt;
{{icon|slow}}&lt;br /&gt;
|| enemy, boss, undead&lt;br /&gt;
|-&lt;br /&gt;
| [[Avatar]] || 100,000 || 1 || 100 || 100 || 100 || 100 || 100 || 25,000 || &lt;br /&gt;
{{icon|blindness}}&lt;br /&gt;
{{icon|confusion}}&lt;br /&gt;
{{icon|disarm}}&lt;br /&gt;
{{icon|freeze}}&lt;br /&gt;
{{icon|immobilize}}&lt;br /&gt;
{{icon|silence}}&lt;br /&gt;
{{icon|stun}}&lt;br /&gt;
|| enemy, boss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Footnotes ===&lt;br /&gt;
&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;Totem pole: Earth has 200 Armor, Fire has 200 Fire Resistance, Ice has 200 Ice Resistance, Lightning has 200 Lightning Resistance.&lt;br /&gt;
&lt;br /&gt;
== [[Missions | Mission]] Bosses  ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Enemy Name !! Quest Location !! {{icon|hp}} !! {{icon|mp}} Scale Factor !! {{icon|armor}} !! {{icon|fire resist}} !! {{icon|ice resist}} !! {{icon|lightning resist}} !! {{icon|poison resist}} !! {{icon|xp}}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [[Bandit Lord]] || [[Bandit Keep]] || ? ||  ||  ||  ||  ||  || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Spider Boss?]] || [[Spider Den ?]] || ? ||  ||  ||  ||  ||  || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Navigation==&lt;br /&gt;
{{Template:BaseNav}}&lt;/div&gt;</summary>
		<author><name>Thyraxxvoid</name></author>
	</entry>
	<entry>
		<id>https://wiki.heroesofhammerwatch2.com/index.php?title=Bosses&amp;diff=1856</id>
		<title>Bosses</title>
		<link rel="alternate" type="text/html" href="https://wiki.heroesofhammerwatch2.com/index.php?title=Bosses&amp;diff=1856"/>
		<updated>2026-08-02T10:47:17Z</updated>

		<summary type="html">&lt;p&gt;Thyraxxvoid: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== Dark Citadel Bosses ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Enemy Name !! {{icon|hp}} !! {{icon|mp}} Scale Factor !! {{icon|armor}} !! {{icon|fire resist}} !! {{icon|ice resist}} !! {{icon|lightning resist}} !! {{icon|poison resist}} !! {{icon|xp}} !! Immunity || Tag&lt;br /&gt;
|-&lt;br /&gt;
| [[Totem Pole]] || 8,000 || 1 ||20/200&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;|| 20/200&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;|| 20/200&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;|| 20/200&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;|| 50|| ? || &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [[Shadow Face]] || 10,000 ||  ||  ||  ||  ||  ||  || 5,000 || &lt;br /&gt;
None &lt;br /&gt;
|| enemy, boss&lt;br /&gt;
|-&lt;br /&gt;
| [[Arista]] || 15,000 || 1 || 30 || 10 || 20 || 20 || 100 || 9,000 || &lt;br /&gt;
{{icon|confusion}}&lt;br /&gt;
{{icon|disarm}}&lt;br /&gt;
{{icon|freeze}}&lt;br /&gt;
{{icon|silence}}&lt;br /&gt;
{{icon|stun}}&lt;br /&gt;
{{icon|slow}}&lt;br /&gt;
{{icon|blindness}}&lt;br /&gt;
|| enemy, aberration, boss&lt;br /&gt;
|-&lt;br /&gt;
| [[Harbingers of Dread]] || 40,000 || 1 ||  ||  ||  ||  ||  || 12,000 ||&lt;br /&gt;
{{icon|confusion}}&lt;br /&gt;
{{icon|disarm}}&lt;br /&gt;
{{icon|freeze}}&lt;br /&gt;
{{icon|silence}}&lt;br /&gt;
{{icon|stun}}&lt;br /&gt;
|| enemy, undead, boss&lt;br /&gt;
|-&lt;br /&gt;
| [[Serpents of Demise]] || 2,000,000 ||  || 60 || 60 || 60 || 60 || 60 || 0 || &lt;br /&gt;
{{icon|confusion}}&lt;br /&gt;
{{icon|disarm}}&lt;br /&gt;
{{icon|immobilize}}&lt;br /&gt;
{{icon|freeze}}&lt;br /&gt;
{{icon|silence}}&lt;br /&gt;
{{icon|stun}}&lt;br /&gt;
{{icon|slow}}&lt;br /&gt;
|| enemy, boss, undead&lt;br /&gt;
|-&lt;br /&gt;
| [[Avatar]] || 100,000 || 1 || 100 || 100 || 100 || 100 || 100 || 25,000 || &lt;br /&gt;
{{icon|blindness}}&lt;br /&gt;
{{icon|confusion}}&lt;br /&gt;
{{icon|disarm}}&lt;br /&gt;
{{icon|freeze}}&lt;br /&gt;
{{icon|immobilize}}&lt;br /&gt;
{{icon|silence}}&lt;br /&gt;
{{icon|stun}}&lt;br /&gt;
|| enemy, boss&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Footnotes ===&lt;br /&gt;
1. Earth has 200 Armor, Fire has 200 Fire Resistance, Ice has 200 Ice Resistance, Lightning has 200 Lightning Resistance.&lt;br /&gt;
&lt;br /&gt;
== [[Missions | Mission]] Bosses  ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Enemy Name !! Quest Location !! {{icon|hp}} !! {{icon|mp}} Scale Factor !! {{icon|armor}} !! {{icon|fire resist}} !! {{icon|ice resist}} !! {{icon|lightning resist}} !! {{icon|poison resist}} !! {{icon|xp}}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [[Bandit Lord]] || [[Bandit Keep]] || ? ||  ||  ||  ||  ||  || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Spider Boss?]] || [[Spider Den ?]] || ? ||  ||  ||  ||  ||  || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Navigation==&lt;br /&gt;
{{Template:BaseNav}}&lt;/div&gt;</summary>
		<author><name>Thyraxxvoid</name></author>
	</entry>
	<entry>
		<id>https://wiki.heroesofhammerwatch2.com/index.php?title=Bosses&amp;diff=1851</id>
		<title>Bosses</title>
		<link rel="alternate" type="text/html" href="https://wiki.heroesofhammerwatch2.com/index.php?title=Bosses&amp;diff=1851"/>
		<updated>2026-07-31T12:40:59Z</updated>

		<summary type="html">&lt;p&gt;Thyraxxvoid: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== Dark Citadel Bosses ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Enemy Name !! {{icon|hp}} !! {{icon|mp}} Scale Factor !! {{icon|armor}} !! {{icon|fire resist}} !! {{icon|ice resist}} !! {{icon|lightning resist}} !! {{icon|poison resist}} !! {{icon|xp}} !! Immunity || Tag&lt;br /&gt;
|-&lt;br /&gt;
| [[Totem Pole]] || 8,000 || 1 ||20/200&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;|| 20/200&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;|| 20/200&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;|| 20/200&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;|| 50|| ? || &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [[Shadow Face]] || 10,000 ||  ||  ||  ||  ||  ||  || 5,000 || t&lt;br /&gt;
|-&lt;br /&gt;
| [[Arista]] || 15,000 || 1 || 30 || 10 || 20 || 20 || 100 || 9,000 || t&lt;br /&gt;
|-&lt;br /&gt;
| [[Harbingers of Dread]] || 40,000 || 1 ||  ||  ||  ||  ||  || 12,000 || t&lt;br /&gt;
|-&lt;br /&gt;
| [[Serpents of Demise]] || 2,000,000 ||  || 60 || 60 || 60 || 60 || 60 || 0 || &lt;br /&gt;
{{icon|confusion}}&lt;br /&gt;
{{icon|disarm}}&lt;br /&gt;
{{icon|immobilize}}&lt;br /&gt;
{{icon|freeze}}&lt;br /&gt;
{{icon|silence}}&lt;br /&gt;
{{icon|stun}}&lt;br /&gt;
{{icon|slow}}&lt;br /&gt;
|| enemy, boss, undead&lt;br /&gt;
|-&lt;br /&gt;
| [[Avatar]] || 100,000 || 1 || 100 || 100 || 100 || 100 || 100 || 25,000 || t&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Footnotes ===&lt;br /&gt;
1. Earth has 200 Armor, Fire has 200 Fire Resistance, Ice has 200 Ice Resistance, Lightning has 200 Lightning Resistance.&lt;br /&gt;
&lt;br /&gt;
== [[Missions | Mission]] Bosses  ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Enemy Name !! Quest Location !! {{icon|hp}} !! {{icon|mp}} Scale Factor !! {{icon|armor}} !! {{icon|fire resist}} !! {{icon|ice resist}} !! {{icon|lightning resist}} !! {{icon|poison resist}} !! {{icon|xp}}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [[Bandit Lord]] || [[Bandit Keep]] || ? ||  ||  ||  ||  ||  || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Spider Boss?]] || [[Spider Den ?]] || ? ||  ||  ||  ||  ||  || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Navigation==&lt;br /&gt;
{{Template:BaseNav}}&lt;/div&gt;</summary>
		<author><name>Thyraxxvoid</name></author>
	</entry>
	<entry>
		<id>https://wiki.heroesofhammerwatch2.com/index.php?title=Bosses&amp;diff=1850</id>
		<title>Bosses</title>
		<link rel="alternate" type="text/html" href="https://wiki.heroesofhammerwatch2.com/index.php?title=Bosses&amp;diff=1850"/>
		<updated>2026-07-31T12:30:08Z</updated>

		<summary type="html">&lt;p&gt;Thyraxxvoid: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== Dark Citadel Bosses ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Enemy Name !! {{icon|hp}} !! {{icon|mp}} Scale Factor !! {{icon|armor}} !! {{icon|fire resist}} !! {{icon|ice resist}} !! {{icon|lightning resist}} !! {{icon|poison resist}} !! {{icon|xp}} !! Immunity&lt;br /&gt;
|-&lt;br /&gt;
| [[Totem Pole]] || 8,000 || 1 ||20/200&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;|| 20/200&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;|| 20/200&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;|| 20/200&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;|| 50|| ? || t&lt;br /&gt;
|-&lt;br /&gt;
| [[Shadow Face]] || 10,000 ||  ||  ||  ||  ||  ||  || 5,000 || t&lt;br /&gt;
|-&lt;br /&gt;
| [[Arista]] || 15,000 || 1 || 30 || 10 || 20 || 20 || 100 || 9,000 || t&lt;br /&gt;
|-&lt;br /&gt;
| [[Harbingers of Dread]] || 40,000 || 1 ||  ||  ||  ||  ||  || 12,000 || t&lt;br /&gt;
|-&lt;br /&gt;
| [[Serpents of Demise]] || 2,000,000 ||  || 60 || 60 || 60 || 60 || 60 || || t&lt;br /&gt;
|-&lt;br /&gt;
| [[Avatar]] || 100,000 || 1 || 100 || 100 || 100 || 100 || 100 || 25,000 || t&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Footnotes ===&lt;br /&gt;
1. Earth has 200 Armor, Fire has 200 Fire Resistance, Ice has 200 Ice Resistance, Lightning has 200 Lightning Resistance.&lt;br /&gt;
&lt;br /&gt;
== [[Missions | Mission]] Bosses  ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Enemy Name !! Quest Location !! {{icon|hp}} !! {{icon|mp}} Scale Factor !! {{icon|armor}} !! {{icon|fire resist}} !! {{icon|ice resist}} !! {{icon|lightning resist}} !! {{icon|poison resist}} !! {{icon|xp}}&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [[Bandit Lord]] || [[Bandit Keep]] || ? ||  ||  ||  ||  ||  || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Spider Boss?]] || [[Spider Den ?]] || ? ||  ||  ||  ||  ||  || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Navigation==&lt;br /&gt;
{{Template:BaseNav}}&lt;/div&gt;</summary>
		<author><name>Thyraxxvoid</name></author>
	</entry>
	<entry>
		<id>https://wiki.heroesofhammerwatch2.com/index.php?title=Architect&amp;diff=1815</id>
		<title>Architect</title>
		<link rel="alternate" type="text/html" href="https://wiki.heroesofhammerwatch2.com/index.php?title=Architect&amp;diff=1815"/>
		<updated>2026-02-08T09:34:40Z</updated>

		<summary type="html">&lt;p&gt;Thyraxxvoid: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Architect is an NPC found in the second floor of the [[Crypts]] level. Once rescued, his building can be constructed in town for 25 stone and 25 [[Materials|crystals]]. Once constructed, the Architect offers six unique buffs that can be applied before starting a run. After speaking with the Architect in town, he can then be found outside the [[Dark Citadel]] in the first level of the [[Forest]]. He offers to open the door to the tower, giving the player the ability to skip levels for the current run.&lt;br /&gt;
&lt;br /&gt;
=== Cost Multiplier ===&lt;br /&gt;
[[File:Architect Buff Screen.jpg|thumb|Architect Buffs]]&lt;br /&gt;
On the Architect buff selection screen, there is a cost multiplier in the bottom right of the screen that reads &amp;quot;Mul: 100%&amp;quot;. Selecting multiple Architect buffs raises the cost multiplier, increasing the gold and material cost of each buff selected. Upgrading the Architect to tier 2 lowers the cost multiplier. &lt;br /&gt;
&lt;br /&gt;
For example: At Architect tier 1, selecting two buffs raises the cost multiplier to 141.35%. This is a 41.35% increase in the cost of both buffs selected. In this example, selecting both Far Sight and Toppled Towers would result in a cost of: 2827 gold, 14 wood, and 7 stone.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tier 1 Architect Buffs&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description !! Cost&lt;br /&gt;
|-&lt;br /&gt;
| Far Sight&lt;br /&gt;
| Fully reveals the map.&lt;br /&gt;
| {{icon|gold}}1,000 {{icon|wood}}10&lt;br /&gt;
|-&lt;br /&gt;
| Toppled Towers&lt;br /&gt;
| Towers are destroyed.&lt;br /&gt;
| {{icon|gold}}1,000 {{icon|stone}}5&lt;br /&gt;
|-&lt;br /&gt;
| Weak Defenses&lt;br /&gt;
| Fewer enemies in levels.&lt;br /&gt;
| {{icon|gold}}1,500 {{icon|stone}}5&lt;br /&gt;
|-&lt;br /&gt;
|Safe Corridors&lt;br /&gt;
|Disables all traps outside of treasure rooms.&lt;br /&gt;
|{{icon|gold}}1,500 {{icon|stone}}5&lt;br /&gt;
|-&lt;br /&gt;
|Gentle Traps&lt;br /&gt;
|Traps deal 50% less damage.&lt;br /&gt;
|{{icon|gold}}1,500 {{icon|stone}}5&lt;br /&gt;
|-&lt;br /&gt;
|Poor Training&lt;br /&gt;
|Fewer elite enemies in levels.&lt;br /&gt;
|{{icon|gold}}1,500 {{icon|wood}}10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Architect Tier 2 ===&lt;br /&gt;
Upgrading the Architect to tier 2 requires 50 stone and 50 crystals. Tier 2 unlocks additional buffs that can be added to a run and lowers the cost multiplier of selecting multiple buffs.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Tier 2 Architect Buffs&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Cost&lt;br /&gt;
|-&lt;br /&gt;
|Righteous Flames&lt;br /&gt;
|Higher chance of finding a pyre.&lt;br /&gt;
|{{icon|gold}}1,000 {{icon|wood}}20&lt;br /&gt;
|-&lt;br /&gt;
|Treasure Hunting&lt;br /&gt;
|Higher chance of finding a treasury.&lt;br /&gt;
|{{icon|gold}}3,000 {{icon|wood}}10 {{icon|stone}}5&lt;br /&gt;
|-&lt;br /&gt;
|Chart Chaser&lt;br /&gt;
|Double chance of finding maps.&lt;br /&gt;
|{{icon|gold}}3,500 {{icon|wood}}10 {{icon|stone}}10&lt;br /&gt;
|-&lt;br /&gt;
|Way Gates&lt;br /&gt;
|Travel quickly between points of interest.&lt;br /&gt;
|{{icon|gold}}1,000 {{icon|wood}}25&lt;br /&gt;
|-&lt;br /&gt;
|Material Mania&lt;br /&gt;
|&amp;lt;div style=&amp;quot;line-height:1.2;&amp;quot;&amp;gt;Replaces trinket chests with resource caches&amp;lt;br&amp;gt;and experience scrolls with materials.&amp;lt;/div&amp;gt;&lt;br /&gt;
|{{icon|gold}}3,000 {{icon|wood}}30 {{icon|stone}}20&lt;br /&gt;
|-&lt;br /&gt;
|Quick Fix&lt;br /&gt;
|Reduces time needed to revive other players to zero.&lt;br /&gt;
|{{icon|gold}}2,000 {{icon|stone}}10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Trivia ==&lt;br /&gt;
The Safe Corridors buff will remove the shadow explosions that trigger throughout the Dark Halls, as those are generated from invisible traps that reset a few seconds after going off.&lt;br /&gt;
&lt;br /&gt;
== Navigation ==&lt;br /&gt;
{{BaseNav}}&lt;/div&gt;</summary>
		<author><name>Thyraxxvoid</name></author>
	</entry>
	<entry>
		<id>https://wiki.heroesofhammerwatch2.com/index.php?title=Hooks&amp;diff=1813</id>
		<title>Hooks</title>
		<link rel="alternate" type="text/html" href="https://wiki.heroesofhammerwatch2.com/index.php?title=Hooks&amp;diff=1813"/>
		<updated>2026-01-05T14:33:50Z</updated>

		<summary type="html">&lt;p&gt;Thyraxxvoid: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ATTENTION:&#039;&#039;&#039; it&#039;s possible a hook won&#039;t work, due to the parameters not matching, if you find one, report it to the modders channel or the hoh2 wiki discussion in the Hammerwatch Discord.&lt;br /&gt;
&lt;br /&gt;
Hooks are script functions that are called at specific moments. This way, you can insert code into the game.&lt;br /&gt;
&lt;br /&gt;
They are specified in script files and tagged with the &amp;lt;code&amp;gt;Hook&amp;lt;/code&amp;gt; specifier. They also must be placed within a namespace to avoid ambiguity between multiple mods.&lt;br /&gt;
&lt;br /&gt;
The following is an example of such a file:&lt;br /&gt;
&lt;br /&gt;
 namespace MyTestMod&lt;br /&gt;
 {&lt;br /&gt;
    [Hook]&lt;br /&gt;
    void BaseGameModeConstructor(BaseGameMode@ baseGameMode){&lt;br /&gt;
        print(&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GetGeneratedAttributes&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GetGeneratedAttributes(PlayerStatsDetail@ stats, array&amp;lt;string&amp;gt;@ strArray, array&amp;lt;string&amp;gt;@ icons, bool isHandHeld)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamagedActor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamagedActor(Player@ player, Actor@ actor, DamageInfo@ di)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamageActor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamageActor(PlayerBase@ playerBase, Actor@ actor, DamageInfo@ damageInfo, Skills::Skill@ skill)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamageActorNoWeapon&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamageActorNoWeapon(PlayerBase@ playerBase, Actor@ actor, DamageInfo@ damageInfo)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamage&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamage(Player@ player, DamageInfo di)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamageTaken&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamageTaken(Player@ player, DamageInfo di)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerInitialize&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerInitialize(PlayerBase@ playerBase)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRefreshScene&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRefreshScene(PlayerBase@ playerBase)&lt;br /&gt;
Called each tick to make sure the player&#039;s unit scene is up to date. Useful if you want to add or attach any graphical element on top of the player unit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRecordConstructor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRecordConstructor(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PickedCharacter&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PickedCharacter(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;CreateCharacter&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void CreateCharacter(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRecordSave&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRecordSave(PlayerRecord@ record, SValueBuilder &amp;amp;builder)&lt;br /&gt;
Called when a player record is being saved. Use builder to serialize data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRecordLoad&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRecordLoad(PlayerRecord@ record, SValue@ data)&lt;br /&gt;
Called when a player record is being loaded. Use sval to deserialize data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRecordRefreshModifiers&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRecordRefreshModifiers(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;LevelupCharacter&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void LevelupCharacter(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeStart&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeStart(AGameplayGameMode@ aGameplayGameMode, SValue@ save)&lt;br /&gt;
Called in the Campaign gamemode&#039;s Start() function. This allows to initialize things and additionally loading any saved data saved in the GameModeSave hook using the save parameter. This paramater is null if there is no save.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModePostStart&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModePostStart(AGameplayGameMode@ aGameplayGameMode)&lt;br /&gt;
Called in the Campaign gamemode&#039;s PostStart() function. This function is usually used to load things after all the unit behaviors have loaded in, and just before the player is ready to spawn.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModePreRenderFrame&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModePreRenderFrame(AGameplayGameMode@ aGameplayGameMode, int idt)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeRenderFrame&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeRenderFrame(AGameplayGameMode@ aGameplayGameMode, int idt, SpriteBatch&amp;amp; sb)&lt;br /&gt;
Called for each rendered frame before any UI is drawn. If you&#039;re looking for a hook called after the UI is drawn, use the GameModeRenderWidgets hook instead. You can use sb to render things to the screen. The idt parameter is the current time in milliseconds since the last update tick, which means the value will be between 0 and 33. Divide this value by 33.0f to get a normalized interpolation factor for animations.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeSpawnPlayer&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeSpawnPlayer(AGameplayGameMode@ aGameplayGameMode, PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeSpawnPlayerCorpse&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeSpawnPlayerCorpse(AGameplayGameMode@ aGameplayGameMode, PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;BaseGameModeConstructor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void BaseGameModeConstructor(BaseGameMode@ baseGameMode)&lt;br /&gt;
Called when the Campaign gamemode is being constructed. Useful for initial setting up, for example to add new definitions for items, sets, shops, fountain effects, etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeUpdatePaused&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeUpdatePaused(BaseGameMode@ baseGameMode, int ms, GameInput&amp;amp; gameInput, MenuInput&amp;amp; menuInput)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeUpdate&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeUpdate(BaseGameMode@ baseGameMode, int ms, GameInput&amp;amp; gameInput, MenuInput&amp;amp; menuInput)&lt;br /&gt;
Called every tick from the Campaign gamemode&#039;s update function. Use dt to determine how many milliseconds have passed since the last tick. Note that ticks are different from rendered frames. Ticks typically run at a fixed rate of 30 FPS. You can use gameInput and menuInput here to get information about current controls.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;LoadWidgetProducers&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void LoadWidgetProducers(GUIBuilder@ builder)&lt;br /&gt;
Called when widget producers should be loaded. This allows you to initialize custom widget producers that can produce custom widgets. builder is where you would call AddWidgetProducer on to initialize the widget producer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;HUDConstructor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void HUDConstructor(HUD@ hud, GUIBuilder@ b)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordConstructor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordConstructor(TownRecord@ townRecord)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordSave&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordSave(TownRecord@ townRecord, SValueBuilder&amp;amp; builder)&lt;br /&gt;
Called when the town record is being saved. Use builder to serialize data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordLoad&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordLoad(TownRecord@ townRecord, SValue@ save)&lt;br /&gt;
Called when the town record is being loaded. Use sval to deserialize data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordSpawnTown&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordSpawnTown(TownRecord@ townRecord)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordRefreshHeroTitles&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordRefreshHeroTitles(TownRecord@ townRecord)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordRefreshDonationTitles&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordRefreshDonationTitles(TownRecord@ townRecord)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;line-height:1.6;&amp;quot;&amp;gt;How does the game know the hooks?&amp;lt;/div&amp;gt;&lt;br /&gt;
At a specific point in the core game code, a line similar to the following is executed: Hooks::Call(&amp;quot;NameOfHook&amp;quot;, argument1, argument2, ...);&lt;br /&gt;
&lt;br /&gt;
This function automatically looks up and executes any custom functions (Hooks) that have been registered with the matching name.&lt;br /&gt;
Every hook is defined by its name (the first string argument in Hooks::Call) and its required arguments.&lt;br /&gt;
&lt;br /&gt;
Crucially: For a custom hook function to execute, its name and arguments must exactly match the definition in the core game&#039;s Hooks::Call. &lt;br /&gt;
&lt;br /&gt;
Example using the BaseGameModeConstructor Hook, let&#039;s look at the core game call for this example:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Hook call explained&lt;br /&gt;
|-&lt;br /&gt;
! Component !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Hooks::Call(&amp;quot;BaseGameModeConstructor&amp;quot;, @this); || the complete line inside BaseGameMode.as&lt;br /&gt;
|-&lt;br /&gt;
| BaseGameModeConstructor || This is the &#039;&#039;&#039;Hook Name&#039;&#039;&#039; you must use.&lt;br /&gt;
|-&lt;br /&gt;
| @this|| This is the Required Argument.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;@this&#039;&#039;&#039; refers to the instance of the class the hook is called from, which in this case is the BaseGameMode class itself.&lt;br /&gt;
To use this hook in a mod, you must create a function that matches the name and accepts a BaseGameMode object as its argument.&lt;br /&gt;
Your custom hook function must be placed inside a namespace and be decorated with the [Hook] attribute.&lt;br /&gt;
 namespace MyTestMod // Always use a namespace to prevent conflicts!&lt;br /&gt;
 {&lt;br /&gt;
     // The [Hook] attribute tells the game that this is a custom hook function.&lt;br /&gt;
     // Without it, the function will not be recognized or executed.&lt;br /&gt;
     [Hook]&lt;br /&gt;
     void BaseGameModeConstructor(BaseGameMode@ baseGameMode) // Matches name and argument type!&lt;br /&gt;
     { &lt;br /&gt;
         // This code will run every time the BaseGameMode constructor executes&lt;br /&gt;
         // Hooks::Call(&amp;quot;BaseGameModeConstructor&amp;quot;, @this);&lt;br /&gt;
         print(&amp;quot;Hello World from MyTestMod!&amp;quot;); &lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Important Note on Arguments: If the arguments in your custom hook function do not match the arguments in the core game&#039;s Hooks::Call, the hook will either fail to execute silently or return an error in the console. Argument matching is mandatory.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Can you create Hooks yourself?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You should be able to yes, especially if you overwrite the base game files you can put hooks everywhere, although this is HIGHLY discouraged.&lt;br /&gt;
&lt;br /&gt;
These files need to be updated every game update, although there have been talking about a community based hooks to make use of hooks in places we want them, there never have been made plans.&lt;/div&gt;</summary>
		<author><name>Thyraxxvoid</name></author>
	</entry>
	<entry>
		<id>https://wiki.heroesofhammerwatch2.com/index.php?title=Hooks&amp;diff=1734</id>
		<title>Hooks</title>
		<link rel="alternate" type="text/html" href="https://wiki.heroesofhammerwatch2.com/index.php?title=Hooks&amp;diff=1734"/>
		<updated>2025-12-15T18:29:15Z</updated>

		<summary type="html">&lt;p&gt;Thyraxxvoid: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ATTENTION:&#039;&#039;&#039; it&#039;s possible a hook won&#039;t work, due to the parameters not matching, if you find one, report it to the modders channel or the hoh2 wiki discussion in the Hammerwatch Discord.&lt;br /&gt;
&lt;br /&gt;
Hooks are script functions that are called at specific moments. This way, you can insert code into the game.&lt;br /&gt;
&lt;br /&gt;
They are specified in script files and tagged with the &amp;lt;code&amp;gt;Hook&amp;lt;/code&amp;gt; specifier. They also must be placed within a namespace to avoid ambiguity between multiple mods.&lt;br /&gt;
&lt;br /&gt;
The following is an example of such a file:&lt;br /&gt;
&lt;br /&gt;
 namespace MyTestMod&lt;br /&gt;
 {&lt;br /&gt;
    [Hook]&lt;br /&gt;
    void BaseGameModeConstructor(BaseGameMode@ baseGameMode){&lt;br /&gt;
        print(&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GetGeneratedAttributes&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GetGeneratedAttributes(PlayerStatsDetail@ stats, array&amp;lt;string&amp;gt;@ strArray, array&amp;lt;string&amp;gt;@ icons, bool isHandHeld)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamagedActor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamagedActor(Player@ player, Actor@ actor, DamageInfo di)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamageActor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamageActor(PlayerBase@ playerBase, Actor@ actor, DamageInfo@ damageInfo, Skills::Skill@ skill)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamageActorNoWeapon&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamageActorNoWeapon(PlayerBase@ playerBase, Actor@ actor, DamageInfo@ damageInfo)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamage&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamage(Player@ player, DamageInfo di)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamageTaken&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamageTaken(Player@ player, DamageInfo di)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerInitialize&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerInitialize(PlayerBase@ playerBase)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRefreshScene&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRefreshScene(PlayerBase@ playerBase)&lt;br /&gt;
Called each tick to make sure the player&#039;s unit scene is up to date. Useful if you want to add or attach any graphical element on top of the player unit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRecordConstructor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRecordConstructor(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PickedCharacter&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PickedCharacter(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;CreateCharacter&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void CreateCharacter(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRecordSave&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRecordSave(PlayerRecord@ record, SValueBuilder &amp;amp;builder)&lt;br /&gt;
Called when a player record is being saved. Use builder to serialize data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRecordLoad&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRecordLoad(PlayerRecord@ record, SValue@ data)&lt;br /&gt;
Called when a player record is being loaded. Use sval to deserialize data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRecordRefreshModifiers&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRecordRefreshModifiers(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;LevelupCharacter&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void LevelupCharacter(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeStart&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeStart(AGameplayGameMode@ aGameplayGameMode, SValue@ save)&lt;br /&gt;
Called in the Campaign gamemode&#039;s Start() function. This allows to initialize things and additionally loading any saved data saved in the GameModeSave hook using the save parameter. This paramater is null if there is no save.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModePostStart&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModePostStart(AGameplayGameMode@ aGameplayGameMode)&lt;br /&gt;
Called in the Campaign gamemode&#039;s PostStart() function. This function is usually used to load things after all the unit behaviors have loaded in, and just before the player is ready to spawn.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModePreRenderFrame&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModePreRenderFrame(AGameplayGameMode@ aGameplayGameMode, int idt)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeRenderFrame&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeRenderFrame(AGameplayGameMode@ aGameplayGameMode, int idt, SpriteBatch&amp;amp; sb)&lt;br /&gt;
Called for each rendered frame before any UI is drawn. If you&#039;re looking for a hook called after the UI is drawn, use the GameModeRenderWidgets hook instead. You can use sb to render things to the screen. The idt parameter is the current time in milliseconds since the last update tick, which means the value will be between 0 and 33. Divide this value by 33.0f to get a normalized interpolation factor for animations.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeSpawnPlayer&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeSpawnPlayer(AGameplayGameMode@ aGameplayGameMode, PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeSpawnPlayerCorpse&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeSpawnPlayerCorpse(AGameplayGameMode@ aGameplayGameMode, PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;BaseGameModeConstructor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void BaseGameModeConstructor(BaseGameMode@ baseGameMode)&lt;br /&gt;
Called when the Campaign gamemode is being constructed. Useful for initial setting up, for example to add new definitions for items, sets, shops, fountain effects, etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeUpdatePaused&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeUpdatePaused(BaseGameMode@ baseGameMode, int ms, GameInput&amp;amp; gameInput, MenuInput&amp;amp; menuInput)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeUpdate&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeUpdate(BaseGameMode@ baseGameMode, int ms, GameInput&amp;amp; gameInput, MenuInput&amp;amp; menuInput)&lt;br /&gt;
Called every tick from the Campaign gamemode&#039;s update function. Use dt to determine how many milliseconds have passed since the last tick. Note that ticks are different from rendered frames. Ticks typically run at a fixed rate of 30 FPS. You can use gameInput and menuInput here to get information about current controls.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;LoadWidgetProducers&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void LoadWidgetProducers(GUIBuilder@ builder)&lt;br /&gt;
Called when widget producers should be loaded. This allows you to initialize custom widget producers that can produce custom widgets. builder is where you would call AddWidgetProducer on to initialize the widget producer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;HUDConstructor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void HUDConstructor(HUD@ hud, GUIBuilder@ b)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordConstructor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordConstructor(TownRecord@ townRecord)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordSave&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordSave(TownRecord@ townRecord, SValueBuilder&amp;amp; builder)&lt;br /&gt;
Called when the town record is being saved. Use builder to serialize data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordLoad&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordLoad(TownRecord@ townRecord, SValue@ save)&lt;br /&gt;
Called when the town record is being loaded. Use sval to deserialize data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordSpawnTown&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordSpawnTown(TownRecord@ townRecord)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordRefreshHeroTitles&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordRefreshHeroTitles(TownRecord@ townRecord)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordRefreshDonationTitles&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordRefreshDonationTitles(TownRecord@ townRecord)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;line-height:1.6;&amp;quot;&amp;gt;How does the game know the hooks?&amp;lt;/div&amp;gt;&lt;br /&gt;
At a specific point in the core game code, a line similar to the following is executed: Hooks::Call(&amp;quot;NameOfHook&amp;quot;, argument1, argument2, ...);&lt;br /&gt;
&lt;br /&gt;
This function automatically looks up and executes any custom functions (Hooks) that have been registered with the matching name.&lt;br /&gt;
Every hook is defined by its name (the first string argument in Hooks::Call) and its required arguments.&lt;br /&gt;
&lt;br /&gt;
Crucially: For a custom hook function to execute, its name and arguments must exactly match the definition in the core game&#039;s Hooks::Call. &lt;br /&gt;
&lt;br /&gt;
Example using the BaseGameModeConstructor Hook, let&#039;s look at the core game call for this example:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Hook call explained&lt;br /&gt;
|-&lt;br /&gt;
! Component !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Hooks::Call(&amp;quot;BaseGameModeConstructor&amp;quot;, @this); || the complete line inside BaseGameMode.as&lt;br /&gt;
|-&lt;br /&gt;
| BaseGameModeConstructor || This is the &#039;&#039;&#039;Hook Name&#039;&#039;&#039; you must use.&lt;br /&gt;
|-&lt;br /&gt;
| @this|| This is the Required Argument.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;@this&#039;&#039;&#039; refers to the instance of the class the hook is called from, which in this case is the BaseGameMode class itself.&lt;br /&gt;
To use this hook in a mod, you must create a function that matches the name and accepts a BaseGameMode object as its argument.&lt;br /&gt;
Your custom hook function must be placed inside a namespace and be decorated with the [Hook] attribute.&lt;br /&gt;
 namespace MyTestMod // Always use a namespace to prevent conflicts!&lt;br /&gt;
 {&lt;br /&gt;
     // The [Hook] attribute tells the game that this is a custom hook function.&lt;br /&gt;
     // Without it, the function will not be recognized or executed.&lt;br /&gt;
     [Hook]&lt;br /&gt;
     void BaseGameModeConstructor(BaseGameMode@ baseGameMode) // Matches name and argument type!&lt;br /&gt;
     { &lt;br /&gt;
         // This code will run every time the BaseGameMode constructor executes&lt;br /&gt;
         // Hooks::Call(&amp;quot;BaseGameModeConstructor&amp;quot;, @this);&lt;br /&gt;
         print(&amp;quot;Hello World from MyTestMod!&amp;quot;); &lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Important Note on Arguments: If the arguments in your custom hook function do not match the arguments in the core game&#039;s Hooks::Call, the hook will either fail to execute silently or return an error in the console. Argument matching is mandatory.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Can you create Hooks yourself?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You should be able to yes, especially if you overwrite the base game files you can put hooks everywhere, although this is HIGHLY discouraged.&lt;br /&gt;
&lt;br /&gt;
These files need to be updated every game update, although there have been talking about a community based hooks to make use of hooks in places we want them, there never have been made plans.&lt;/div&gt;</summary>
		<author><name>Thyraxxvoid</name></author>
	</entry>
	<entry>
		<id>https://wiki.heroesofhammerwatch2.com/index.php?title=Hooks&amp;diff=1733</id>
		<title>Hooks</title>
		<link rel="alternate" type="text/html" href="https://wiki.heroesofhammerwatch2.com/index.php?title=Hooks&amp;diff=1733"/>
		<updated>2025-12-15T17:40:38Z</updated>

		<summary type="html">&lt;p&gt;Thyraxxvoid: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ATTENTION:&#039;&#039;&#039; it&#039;s possible a hook won&#039;t work, due to the parameters not matching, if you find one, report it to the modders channel or the hoh2 wiki discussion in the Hammerwatch Discord.&lt;br /&gt;
&lt;br /&gt;
Hooks are script functions that are called at specific moments. This way, you can insert code into the game.&lt;br /&gt;
&lt;br /&gt;
They are specified in script files and tagged with the &amp;lt;code&amp;gt;Hook&amp;lt;/code&amp;gt; specifier. They also must be placed within a namespace to avoid ambiguity between multiple mods.&lt;br /&gt;
&lt;br /&gt;
The following is an example of such a file:&lt;br /&gt;
&lt;br /&gt;
 namespace MyTestMod&lt;br /&gt;
 {&lt;br /&gt;
    [Hook]&lt;br /&gt;
    void BaseGameModeConstructor(BaseGameMode@ baseGameMode){&lt;br /&gt;
        print(&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GetGeneratedAttributes&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GetGeneratedAttributes(PlayerStatsDetail@ stats, array&amp;lt;string&amp;gt;@ strArray, array&amp;lt;string&amp;gt;@ icons, bool isHandHeld)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamagedActor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamagedActor(Player@ player, Actor@ actor, DamageInfo di)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamageActor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamageActor(PlayerBase@ playerBase, Actor@ actor, DamageInfo@ damageInfo, Skills::Skill@ skill)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamageActorNoWeapon&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamageActorNoWeapon(PlayerBase@ playerBase, Actor@ actor, DamageInfo@ damageInfo)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamage&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamage(Player@ player, DamageInfo di)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamageTaken&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamageTaken(Player@ player, DamageInfo di)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerInitialize&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerInitialize(PlayerBase@ playerBase)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRefreshScene&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRefreshScene(PlayerBase@ playerBase)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRecordConstructor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRecordConstructor(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PickedCharacter&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PickedCharacter(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;CreateCharacter&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void CreateCharacter(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRecordSave&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRecordSave(PlayerRecord@ record, SValueBuilder &amp;amp;builder)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRecordLoad&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRecordLoad(PlayerRecord@ record, SValue@ data)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRecordRefreshModifiers&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRecordRefreshModifiers(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;LevelupCharacter&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void LevelupCharacter(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeStart&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeStart(AGameplayGameMode@ aGameplayGameMode, SValue@ save)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModePostStart&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModePostStart(AGameplayGameMode@ aGameplayGameMode)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModePreRenderFrame&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModePreRenderFrame(AGameplayGameMode@ aGameplayGameMode, int idt)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeRenderFrame&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeRenderFrame(AGameplayGameMode@ aGameplayGameMode, int idt, SpriteBatch&amp;amp; sb)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeSpawnPlayer&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeSpawnPlayer(AGameplayGameMode@ aGameplayGameMode, PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeSpawnPlayerCorpse&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeSpawnPlayerCorpse(AGameplayGameMode@ aGameplayGameMode, PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;BaseGameModeConstructor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void BaseGameModeConstructor(BaseGameMode@ baseGameMode)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeUpdatePaused&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeUpdatePaused(BaseGameMode@ baseGameMode, int ms, GameInput&amp;amp; gameInput, MenuInput&amp;amp; menuInput)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeUpdate&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeUpdate(BaseGameMode@ baseGameMode, int ms, GameInput&amp;amp; gameInput, MenuInput&amp;amp; menuInput)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;LoadWidgetProducers&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void LoadWidgetProducers(GUIBuilder@ builder)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;HUDConstructor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void HUDConstructor(HUD@ hud, GUIBuilder@ b)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordConstructor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordConstructor(TownRecord@ townRecord)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordSave&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordSave(TownRecord@ townRecord, SValueBuilder&amp;amp; builder)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordLoad&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordLoad(TownRecord@ townRecord, SValue@ save)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordSpawnTown&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordSpawnTown(TownRecord@ townRecord)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordRefreshHeroTitles&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordRefreshHeroTitles(TownRecord@ townRecord)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordRefreshDonationTitles&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordRefreshDonationTitles(TownRecord@ townRecord)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;line-height:1.6;&amp;quot;&amp;gt;How does the game know the hooks?&amp;lt;/div&amp;gt;&lt;br /&gt;
At a specific point in the core game code, a line similar to the following is executed: Hooks::Call(&amp;quot;NameOfHook&amp;quot;, argument1, argument2, ...);&lt;br /&gt;
&lt;br /&gt;
This function automatically looks up and executes any custom functions (Hooks) that have been registered with the matching name.&lt;br /&gt;
Every hook is defined by its name (the first string argument in Hooks::Call) and its required arguments.&lt;br /&gt;
&lt;br /&gt;
Crucially: For a custom hook function to execute, its name and arguments must exactly match the definition in the core game&#039;s Hooks::Call. &lt;br /&gt;
&lt;br /&gt;
Example using the BaseGameModeConstructor Hook, let&#039;s look at the core game call for this example:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Hook call explained&lt;br /&gt;
|-&lt;br /&gt;
! Component !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Hooks::Call(&amp;quot;BaseGameModeConstructor&amp;quot;, @this); || the complete line inside BaseGameMode.as&lt;br /&gt;
|-&lt;br /&gt;
| BaseGameModeConstructor || This is the &#039;&#039;&#039;Hook Name&#039;&#039;&#039; you must use.&lt;br /&gt;
|-&lt;br /&gt;
| @this|| This is the Required Argument.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;@this&#039;&#039;&#039; refers to the instance of the class the hook is called from, which in this case is the BaseGameMode class itself.&lt;br /&gt;
To use this hook in a mod, you must create a function that matches the name and accepts a BaseGameMode object as its argument.&lt;br /&gt;
Your custom hook function must be placed inside a namespace and be decorated with the [Hook] attribute.&lt;br /&gt;
 namespace MyTestMod // Always use a namespace to prevent conflicts!&lt;br /&gt;
 {&lt;br /&gt;
     // The [Hook] attribute tells the game that this is a custom hook function.&lt;br /&gt;
     // Without it, the function will not be recognized or executed.&lt;br /&gt;
     [Hook]&lt;br /&gt;
     void BaseGameModeConstructor(BaseGameMode@ baseGameMode) // Matches name and argument type!&lt;br /&gt;
     { &lt;br /&gt;
         // This code will run every time the BaseGameMode constructor executes&lt;br /&gt;
         // Hooks::Call(&amp;quot;BaseGameModeConstructor&amp;quot;, @this);&lt;br /&gt;
         print(&amp;quot;Hello World from MyTestMod!&amp;quot;); &lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Important Note on Arguments: If the arguments in your custom hook function do not match the arguments in the core game&#039;s Hooks::Call, the hook will either fail to execute silently or return an error in the console. Argument matching is mandatory.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Can you create Hooks yourself?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You should be able to yes, especially if you overwrite the base game files you can put hooks everywhere, although this is HIGHLY discouraged.&lt;br /&gt;
&lt;br /&gt;
These files need to be updated every game update, although there have been talking about a community based hooks to make use of hooks in places we want them, there never have been made plans.&lt;/div&gt;</summary>
		<author><name>Thyraxxvoid</name></author>
	</entry>
	<entry>
		<id>https://wiki.heroesofhammerwatch2.com/index.php?title=Hooks&amp;diff=1732</id>
		<title>Hooks</title>
		<link rel="alternate" type="text/html" href="https://wiki.heroesofhammerwatch2.com/index.php?title=Hooks&amp;diff=1732"/>
		<updated>2025-12-15T17:28:40Z</updated>

		<summary type="html">&lt;p&gt;Thyraxxvoid: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ATTENTION:&#039;&#039;&#039; it&#039;s possible a hook won&#039;t work, due to the parameters not matching, if you find one, report it to the modders channel or the hoh2 wiki discussion.&lt;br /&gt;
&lt;br /&gt;
Hooks are script functions that are called at specific moments. This way, you can insert code into the game.&lt;br /&gt;
&lt;br /&gt;
They are specified in script files and tagged with the &amp;lt;code&amp;gt;Hook&amp;lt;/code&amp;gt; specifier. They also must be placed within a namespace to avoid ambiguity between multiple mods.&lt;br /&gt;
&lt;br /&gt;
The following is an example of such a file:&lt;br /&gt;
&lt;br /&gt;
 namespace MyTestMod&lt;br /&gt;
 {&lt;br /&gt;
    [Hook]&lt;br /&gt;
    void BaseGameModeConstructor(BaseGameMode@ baseGameMode){&lt;br /&gt;
        print(&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GetGeneratedAttributes&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GetGeneratedAttributes(PlayerStatsDetail@ stats, array&amp;lt;string&amp;gt;@ strArray, array&amp;lt;string&amp;gt;@ icons, bool isHandHeld)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamagedActor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamagedActor(Player@ player, Actor@ actor, DamageInfo di)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamageActor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamageActor(PlayerBase@ playerBase, Actor@ actor, DamageInfo@ damageInfo, Skills::Skill@ skill)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamageActorNoWeapon&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamageActorNoWeapon(PlayerBase@ playerBase, Actor@ actor, DamageInfo@ damageInfo)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamage&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamage(Player@ player, DamageInfo di)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamageTaken&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamageTaken(Player@ player, DamageInfo di)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerInitialize&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerInitialize(PlayerBase@ playerBase)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRefreshScene&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRefreshScene(PlayerBase@ playerBase)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRecordConstructor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRecordConstructor(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PickedCharacter&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PickedCharacter(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;CreateCharacter&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void CreateCharacter(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRecordSave&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRecordSave(PlayerRecord@ record, SValueBuilder &amp;amp;builder)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRecordLoad&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRecordLoad(PlayerRecord@ record, SValue@ data)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRecordRefreshModifiers&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRecordRefreshModifiers(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;LevelupCharacter&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void LevelupCharacter(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeStart&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeStart(AGameplayGameMode@ aGameplayGameMode, SValue@ save)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModePostStart&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModePostStart(AGameplayGameMode@ aGameplayGameMode)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModePreRenderFrame&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModePreRenderFrame(AGameplayGameMode@ aGameplayGameMode, int idt)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeRenderFrame&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeRenderFrame(AGameplayGameMode@ aGameplayGameMode, int idt, SpriteBatch&amp;amp; sb)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeSpawnPlayer&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeSpawnPlayer(AGameplayGameMode@ aGameplayGameMode, PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeSpawnPlayerCorpse&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeSpawnPlayerCorpse(AGameplayGameMode@ aGameplayGameMode, PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;BaseGameModeConstructor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void BaseGameModeConstructor(BaseGameMode@ baseGameMode)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeUpdatePaused&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeUpdatePaused(BaseGameMode@ baseGameMode, int ms, GameInput&amp;amp; gameInput, MenuInput&amp;amp; menuInput)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeUpdate&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeUpdate(BaseGameMode@ baseGameMode, int ms, GameInput&amp;amp; gameInput, MenuInput&amp;amp; menuInput)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;LoadWidgetProducers&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void LoadWidgetProducers(GUIBuilder@ builder)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;HUDConstructor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void HUDConstructor(HUD@ hud, GUIBuilder@ b)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordConstructor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordConstructor(TownRecord@ townRecord)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordSave&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordSave(TownRecord@ townRecord, SValueBuilder&amp;amp; builder)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordLoad&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordLoad(TownRecord@ townRecord, SValue@ save)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordSpawnTown&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordSpawnTown(TownRecord@ townRecord)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordRefreshHeroTitles&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordRefreshHeroTitles(TownRecord@ townRecord)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordRefreshDonationTitles&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordRefreshDonationTitles(TownRecord@ townRecord)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;line-height:1.6;&amp;quot;&amp;gt;How does the game know the hooks?&amp;lt;/div&amp;gt;&lt;br /&gt;
At a specific point in the core game code, a line similar to the following is executed: Hooks::Call(&amp;quot;NameOfHook&amp;quot;, argument1, argument2, ...);&lt;br /&gt;
&lt;br /&gt;
This function automatically looks up and executes any custom functions (Hooks) that have been registered with the matching name.&lt;br /&gt;
Every hook is defined by its name (the first string argument in Hooks::Call) and its required arguments.&lt;br /&gt;
&lt;br /&gt;
Crucially: For a custom hook function to execute, its name and arguments must exactly match the definition in the core game&#039;s Hooks::Call. &lt;br /&gt;
&lt;br /&gt;
Example using the BaseGameModeConstructor Hook, let&#039;s look at the core game call for this example:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Hook call explained&lt;br /&gt;
|-&lt;br /&gt;
! Component !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Hooks::Call(&amp;quot;BaseGameModeConstructor&amp;quot;, @this); || the complete line inside BaseGameMode.as&lt;br /&gt;
|-&lt;br /&gt;
| BaseGameModeConstructor || This is the &#039;&#039;&#039;Hook Name&#039;&#039;&#039; you must use.&lt;br /&gt;
|-&lt;br /&gt;
| @this|| This is the Required Argument.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;@this&#039;&#039;&#039; refers to the instance of the class the hook is called from, which in this case is the BaseGameMode class itself.&lt;br /&gt;
To use this hook in a mod, you must create a function that matches the name and accepts a BaseGameMode object as its argument.&lt;br /&gt;
Your custom hook function must be placed inside a namespace and be decorated with the [Hook] attribute.&lt;br /&gt;
 namespace MyTestMod // Always use a namespace to prevent conflicts!&lt;br /&gt;
 {&lt;br /&gt;
     // The [Hook] attribute tells the game that this is a custom hook function.&lt;br /&gt;
     // Without it, the function will not be recognized or executed.&lt;br /&gt;
     [Hook]&lt;br /&gt;
     void BaseGameModeConstructor(BaseGameMode@ baseGameMode) // Matches name and argument type!&lt;br /&gt;
     { &lt;br /&gt;
         // This code will run every time the BaseGameMode constructor executes&lt;br /&gt;
         // Hooks::Call(&amp;quot;BaseGameModeConstructor&amp;quot;, @this);&lt;br /&gt;
         print(&amp;quot;Hello World from MyTestMod!&amp;quot;); &lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Important Note on Arguments: If the arguments in your custom hook function do not match the arguments in the core game&#039;s Hooks::Call, the hook will either fail to execute silently or return an error in the console. Argument matching is mandatory.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Can you create Hooks yourself?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You should be able to yes, especially if you overwrite the base game files you can put hooks everywhere, although this is HIGHLY discouraged.&lt;br /&gt;
&lt;br /&gt;
These files need to be updated every game update, although there have been talking about a community based hooks to make use of hooks in places we want them, there never have been made plans.&lt;/div&gt;</summary>
		<author><name>Thyraxxvoid</name></author>
	</entry>
	<entry>
		<id>https://wiki.heroesofhammerwatch2.com/index.php?title=Hooks&amp;diff=1731</id>
		<title>Hooks</title>
		<link rel="alternate" type="text/html" href="https://wiki.heroesofhammerwatch2.com/index.php?title=Hooks&amp;diff=1731"/>
		<updated>2025-12-15T17:28:02Z</updated>

		<summary type="html">&lt;p&gt;Thyraxxvoid: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ATTENTION:&#039;&#039;&#039; it&#039;s possible a hook won&#039;t work, due to the parameters not matching, if you find one, report it to the modders channel or the hoh2 wiki discussion.&lt;br /&gt;
&lt;br /&gt;
Hooks are script functions that are called at specific moments. This way, you can insert code into the game.&lt;br /&gt;
&lt;br /&gt;
They are specified in script files and tagged with the &amp;lt;code&amp;gt;Hook&amp;lt;/code&amp;gt; specifier. They also must be placed within a namespace to avoid ambiguity between multiple mods.&lt;br /&gt;
&lt;br /&gt;
The following is an example of such a file:&lt;br /&gt;
&lt;br /&gt;
 namespace MyTestMod&lt;br /&gt;
 {&lt;br /&gt;
    [Hook]&lt;br /&gt;
    void BaseGameModeConstructor(BaseGameMode@ baseGameMode){&lt;br /&gt;
        print(&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GetGeneratedAttributes&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GetGeneratedAttributes(PlayerStatsDetail@ stats, array&amp;lt;string&amp;gt;@ strArray, array&amp;lt;string&amp;gt;@ icons, bool isHandHeld)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamagedActor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamagedActor(Player@ player, Actor@ actor, DamageInfo di)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamageActor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamageActor(PlayerBase@ playerBase, Actor@ actor, DamageInfo@ damageInfo, Skills::Skill@ skill)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamageActorNoWeapon&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamageActorNoWeapon(PlayerBase@ playerBase, Actor@ actor, DamageInfo@ damageInfo)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamage&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamage(Player@ player, DamageInfo di)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamageTaken&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamageTaken(Player@ player, DamageInfo di)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerInitialize&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerInitialize(PlayerBase@ playerBase)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRefreshScene&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRefreshScene(PlayerBase@ playerBase)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRecordConstructor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRecordConstructor(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PickedCharacter&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PickedCharacter(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;CreateCharacter&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void CreateCharacter(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRecordSave&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRecordSave(PlayerRecord@ record, SValueBuilder &amp;amp;builder)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRecordLoad&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRecordLoad(PlayerRecord@ record, SValue@ data)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRecordRefreshModifiers&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRecordRefreshModifiers(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;LevelupCharacter&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void LevelupCharacter(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeStart&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeStart(AGameplayGameMode@ aGameplayGameMode, SValue@ save)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModePostStart&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModePostStart(AGameplayGameMode@ aGameplayGameMode)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModePreRenderFrame&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModePreRenderFrame(AGameplayGameMode@ aGameplayGameMode, int idt)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeRenderFrame&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeRenderFrame(AGameplayGameMode@ aGameplayGameMode, int idt, SpriteBatch&amp;amp; sb)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeSpawnPlayer&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeSpawnPlayer(AGameplayGameMode@ aGameplayGameMode, PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeSpawnPlayerCorpse&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeSpawnPlayerCorpse(AGameplayGameMode@ aGameplayGameMode, PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;BaseGameModeConstructor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void BaseGameModeConstructor(BaseGameMode@ baseGameMode)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeUpdatePaused&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeUpdatePaused(BaseGameMode@ baseGameMode, int ms, GameInput&amp;amp; gameInput, MenuInput&amp;amp; menuInput)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeUpdate&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeUpdate(BaseGameMode@ baseGameMode, int ms, GameInput&amp;amp; gameInput, MenuInput&amp;amp; menuInput)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;LoadWidgetProducers&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void LoadWidgetProducers(GUIBuilder@ builder)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;HUDConstructor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void HUDConstructor(HUD@ hud, GUIBuilder@ b)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordConstructor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordConstructor(TownRecord@ townRecord)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordSave&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordSave(TownRecord@ townRecord, SValueBuilder&amp;amp; builder)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordLoad&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordLoad(TownRecord@ townRecord, SValue@ save)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordSpawnTown&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordSpawnTown(TownRecord@ townRecord)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordRefreshHeroTitles&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordRefreshHeroTitles(TownRecord@ townRecord)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordRefreshDonationTitles&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordRefreshDonationTitles(TownRecord@ townRecord)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;line-height:1.6;&amp;quot;&amp;gt;How does the game know the hooks?&amp;lt;/div&amp;gt;&lt;br /&gt;
At a specific point in the core game code, a line similar to the following is executed: Hooks::Call(&amp;quot;NameOfHook&amp;quot;, argument1, argument2, ...);&lt;br /&gt;
&lt;br /&gt;
This function automatically looks up and executes any custom functions (Hooks) that have been registered with the matching name.&lt;br /&gt;
Every hook is defined by its name (the first string argument in Hooks::Call) and its required arguments.&lt;br /&gt;
&lt;br /&gt;
Crucially: For a custom hook function to execute, its name and arguments must exactly match the definition in the core game&#039;s Hooks::Call. &lt;br /&gt;
&lt;br /&gt;
Example using the BaseGameModeConstructor Hook, let&#039;s look at the core game call for this example:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Caption text&lt;br /&gt;
|-&lt;br /&gt;
! Component !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Hooks::Call(&amp;quot;BaseGameModeConstructor&amp;quot;, @this); || the complete line inside BaseGameMode.as&lt;br /&gt;
|-&lt;br /&gt;
| BaseGameModeConstructor || This is the &#039;&#039;&#039;Hook Name&#039;&#039;&#039; you must use.&lt;br /&gt;
|-&lt;br /&gt;
| @this|| This is the Required Argument.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;@this&#039;&#039;&#039; refers to the instance of the class the hook is called from, which in this case is the BaseGameMode class itself.&lt;br /&gt;
To use this hook in a mod, you must create a function that matches the name and accepts a BaseGameMode object as its argument.&lt;br /&gt;
Your custom hook function must be placed inside a namespace and be decorated with the [Hook] attribute.&lt;br /&gt;
 namespace MyTestMod // Always use a namespace to prevent conflicts!&lt;br /&gt;
 {&lt;br /&gt;
     // The [Hook] attribute tells the game that this is a custom hook function.&lt;br /&gt;
     // Without it, the function will not be recognized or executed.&lt;br /&gt;
     [Hook]&lt;br /&gt;
     void BaseGameModeConstructor(BaseGameMode@ baseGameMode) // Matches name and argument type!&lt;br /&gt;
     { &lt;br /&gt;
         // This code will run every time the BaseGameMode constructor executes&lt;br /&gt;
         // Hooks::Call(&amp;quot;BaseGameModeConstructor&amp;quot;, @this);&lt;br /&gt;
         print(&amp;quot;Hello World from MyTestMod!&amp;quot;); &lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Important Note on Arguments: If the arguments in your custom hook function do not match the arguments in the core game&#039;s Hooks::Call, the hook will either fail to execute silently or return an error in the console. Argument matching is mandatory.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Can you create Hooks yourself?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You should be able to yes, especially if you overwrite the base game files you can put hooks everywhere, although this is HIGHLY discouraged.&lt;br /&gt;
&lt;br /&gt;
These files need to be updated every game update, although there have been talking about a community based hooks to make use of hooks in places we want them, there never have been made plans.&lt;/div&gt;</summary>
		<author><name>Thyraxxvoid</name></author>
	</entry>
	<entry>
		<id>https://wiki.heroesofhammerwatch2.com/index.php?title=Hooks&amp;diff=1730</id>
		<title>Hooks</title>
		<link rel="alternate" type="text/html" href="https://wiki.heroesofhammerwatch2.com/index.php?title=Hooks&amp;diff=1730"/>
		<updated>2025-12-15T15:27:35Z</updated>

		<summary type="html">&lt;p&gt;Thyraxxvoid: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ATTENTION:&#039;&#039;&#039; it&#039;s possible a hook won&#039;t work, due to the parameters not matching, if you find one, report it to the modders channel or the hoh2 wiki discussion.&lt;br /&gt;
&lt;br /&gt;
Hooks are script functions that are called at specific moments. This way, you can insert code into the game.&lt;br /&gt;
&lt;br /&gt;
They are specified in script files and tagged with the &amp;lt;code&amp;gt;Hook&amp;lt;/code&amp;gt; specifier. They also must be placed within a namespace to avoid ambiguity between multiple mods.&lt;br /&gt;
&lt;br /&gt;
The following is an example of such a file:&lt;br /&gt;
&lt;br /&gt;
 namespace MyTestMod&lt;br /&gt;
 {&lt;br /&gt;
    [Hook]&lt;br /&gt;
    void BaseGameModeConstructor(BaseGameMode@ baseGameMode){&lt;br /&gt;
        print(&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GetGeneratedAttributes&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GetGeneratedAttributes(PlayerStatsDetail@ stats, array&amp;lt;string&amp;gt;@ strArray, array&amp;lt;string&amp;gt;@ icons, bool isHandHeld)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamagedActor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamagedActor(Player@ player, Actor@ actor, DamageInfo di)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamageActor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamageActor(PlayerBase@ playerBase, Actor@ actor, DamageInfo@ damageInfo, Skills::Skill@ skill)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamageActorNoWeapon&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamageActorNoWeapon(PlayerBase@ playerBase, Actor@ actor, DamageInfo@ damageInfo)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamage&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamage(Player@ player, DamageInfo di)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamageTaken&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamageTaken(Player@ player, DamageInfo di)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerInitialize&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerInitialize(PlayerBase@ playerBase)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRefreshScene&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRefreshScene(PlayerBase@ playerBase)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRecordConstructor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRecordConstructor(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PickedCharacter&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PickedCharacter(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;CreateCharacter&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void CreateCharacter(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRecordSave&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRecordSave(PlayerRecord@ record, SValueBuilder &amp;amp;builder)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRecordLoad&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRecordLoad(PlayerRecord@ record, SValue@ data)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRecordRefreshModifiers&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRecordRefreshModifiers(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;LevelupCharacter&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void LevelupCharacter(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeStart&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeStart(AGameplayGameMode@ aGameplayGameMode, SValue@ save)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModePostStart&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModePostStart(AGameplayGameMode@ aGameplayGameMode)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModePreRenderFrame&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModePreRenderFrame(AGameplayGameMode@ aGameplayGameMode, int idt)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeRenderFrame&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeRenderFrame(AGameplayGameMode@ aGameplayGameMode, int idt, SpriteBatch&amp;amp; sb)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeSpawnPlayer&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeSpawnPlayer(AGameplayGameMode@ aGameplayGameMode, PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeSpawnPlayerCorpse&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeSpawnPlayerCorpse(AGameplayGameMode@ aGameplayGameMode, PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;BaseGameModeConstructor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void BaseGameModeConstructor(BaseGameMode@ baseGameMode)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeUpdatePaused&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeUpdatePaused(BaseGameMode@ baseGameMode, int ms, GameInput&amp;amp; gameInput, MenuInput&amp;amp; menuInput)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeUpdate&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeUpdate(BaseGameMode@ baseGameMode, int ms, GameInput&amp;amp; gameInput, MenuInput&amp;amp; menuInput)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;LoadWidgetProducers&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void LoadWidgetProducers(GUIBuilder@ builder)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;HUDConstructor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void HUDConstructor(HUD@ hud, GUIBuilder@ b)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordConstructor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordConstructor(TownRecord@ townRecord)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordSave&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordSave(TownRecord@ townRecord, SValueBuilder&amp;amp; builder)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordLoad&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordLoad(TownRecord@ townRecord, SValue@ save)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordSpawnTown&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordSpawnTown(TownRecord@ townRecord)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordRefreshHeroTitles&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordRefreshHeroTitles(TownRecord@ townRecord)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordRefreshDonationTitles&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordRefreshDonationTitles(TownRecord@ townRecord)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;line-height:1.6;&amp;quot;&amp;gt;How does the game know the hooks?&amp;lt;/div&amp;gt;&lt;br /&gt;
In specific parts of the game a &#039;Hook&#039; call is added which automatically looks up the hook that matches and executes it at that point in the code.&lt;br /&gt;
Every hook call in the game code itself is defined as &amp;lt;code&amp;gt;Hooks::Call(&amp;quot;NameOfHook&amp;quot;, arguments1, arguments2)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hooks usually have 1 or even multiple arguments, these must match if you want to use the hook.&lt;br /&gt;
To give an example, let&#039;s take a look at &amp;lt;code&amp;gt;Hooks::Call(&amp;quot;BaseGameModeConstructor&amp;quot;, @this);&amp;lt;/code&amp;gt; inside BaseGameMode class (BaseGameMode.as).&lt;br /&gt;
For us to use this hook we must use the name &amp;lt;code&amp;gt;BaseGameModeConstructor&amp;lt;/code&amp;gt;, with the argument &amp;lt;code&amp;gt;@this&amp;lt;/code&amp;gt;. In this case &amp;lt;code&amp;gt;@this&amp;lt;/code&amp;gt; refers to the class itself. The class this is in is &amp;lt;code&amp;gt;BaseGameMode&amp;lt;/code&amp;gt;.&lt;br /&gt;
This means that the argument is the class &amp;lt;code&amp;gt;BaseGameMode&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
So we know the name and the argument to use this hook, to use it we use this:&lt;br /&gt;
 namespace MyTestMod // Be sure to always put it inside a namespace, conflicts or other things may occur if you don&#039;t&lt;br /&gt;
 {&lt;br /&gt;
    // This is executed when the game comes along to Hooks::Call(&amp;quot;BaseGameModeConstructor&amp;quot;, @this);&lt;br /&gt;
    [Hook] // [Hook] means for the game that this is an hook we use, if you don&#039;t put this on top of the hook we are using, the game doesn&#039;t recognize it.&lt;br /&gt;
    void BaseGameModeConstructor(BaseGameMode@ baseGameMode){ // void BaseGameModeConstructoris the name from Hooks::Call(&amp;quot;BaseGameModeConstructor&amp;quot;... the argument @this refers to the BaseGameMode as we found.&lt;br /&gt;
        print(&amp;quot;Hello World&amp;quot;); // Prints hello world in the console&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
If the arguments do not match in the hook, it will either not execute or returns an error in the console&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thyraxxvoid</name></author>
	</entry>
	<entry>
		<id>https://wiki.heroesofhammerwatch2.com/index.php?title=Hooks&amp;diff=1729</id>
		<title>Hooks</title>
		<link rel="alternate" type="text/html" href="https://wiki.heroesofhammerwatch2.com/index.php?title=Hooks&amp;diff=1729"/>
		<updated>2025-12-15T15:25:37Z</updated>

		<summary type="html">&lt;p&gt;Thyraxxvoid: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ATTENTION:&#039;&#039;&#039; it&#039;s possible a hook won&#039;t work, due to the parameters not matching, if you find one, report it to the modders channel or the hoh2 wiki discussion.&lt;br /&gt;
&lt;br /&gt;
Hooks are script functions that are called at specific moments. This way, you can insert code into the game.&lt;br /&gt;
&lt;br /&gt;
They are specified in script files and tagged with the &amp;lt;code&amp;gt;Hook&amp;lt;/code&amp;gt; specifier. They also must be placed within a namespace to avoid ambiguity between multiple mods.&lt;br /&gt;
&lt;br /&gt;
The following is an example of such a file:&lt;br /&gt;
&lt;br /&gt;
 namespace MyTestMod&lt;br /&gt;
 {&lt;br /&gt;
    [Hook]&lt;br /&gt;
    void BaseGameModeConstructor(BaseGameMode@ baseGameMode){&lt;br /&gt;
        print(&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GetGeneratedAttributes&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GetGeneratedAttributes(PlayerStatsDetail@ stats, array&amp;lt;string&amp;gt;@ strArray, array&amp;lt;string&amp;gt;@ icons, bool isHandHeld)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamagedActor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamagedActor(Player@ player, Actor@ actor, DamageInfo di)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamageActor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamageActor(PlayerBase@ playerBase, Actor@ actor, DamageInfo@ damageInfo, Skills::Skill@ skill)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamageActorNoWeapon&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamageActorNoWeapon(PlayerBase@ playerBase, Actor@ actor, DamageInfo@ damageInfo)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamage&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamage(Player@ player, DamageInfo di)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerDamageTaken&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerDamageTaken(Player@ player, DamageInfo di)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerInitialize&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerInitialize(PlayerBase@ playerBase)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRefreshScene&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRefreshScene(PlayerBase@ playerBase)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRecordConstructor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRecordConstructor(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PickedCharacter&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PickedCharacter(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;CreateCharacter&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void CreateCharacter(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRecordSave&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRecordSave(PlayerRecord@ record, SValueBuilder &amp;amp;builder)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRecordLoad&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRecordLoad(PlayerRecord@ record, SValue@ data)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;PlayerRecordRefreshModifiers&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void PlayerRecordRefreshModifiers(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;LevelupCharacter&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void LevelupCharacter(PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeStart&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeStart(AGameplayGameMode@ aGameplayGameMode, SValue@ save)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModePostStart&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModePostStart(AGameplayGameMode@ aGameplayGameMode)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModePreRenderFrame&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModePreRenderFrame(AGameplayGameMode@ aGameplayGameMode, int idt)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeRenderFrame&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeRenderFrame(AGameplayGameMode@ aGameplayGameMode, int idt, SpriteBatch&amp;amp; sb)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeSpawnPlayer&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeSpawnPlayer(AGameplayGameMode@ aGameplayGameMode, PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeSpawnPlayerCorpse&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeSpawnPlayerCorpse(AGameplayGameMode@ aGameplayGameMode, PlayerRecord@ record)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;BaseGameModeConstructor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void BaseGameModeConstructor(BaseGameMode@ baseGameMode)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeUpdatePaused&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeUpdatePaused(BaseGameMode@ baseGameMode, int ms, GameInput&amp;amp; gameInput, MenuInput&amp;amp; menuInput)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;GameModeUpdate&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void GameModeUpdate(BaseGameMode@ baseGameMode, int ms, GameInput&amp;amp; gameInput, MenuInput&amp;amp; menuInput)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;LoadWidgetProducers&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void LoadWidgetProducers(GUIBuilder@ builder)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;HUDConstructor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void HUDConstructor(HUD@ hud, GUIBuilder@ b)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordConstructor&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordConstructor(TownRecord@ townRecord)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordSave&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordSave(TownRecord@ townRecord, SValueBuilder&amp;amp; builder)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordLoad&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordLoad(TownRecord@ townRecord, SValue@ save)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordSpawnTown&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordSpawnTown(TownRecord@ townRecord)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordRefreshHeroTitles&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordRefreshHeroTitles(TownRecord@ townRecord)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;TownRecordRefreshDonationTitles&amp;lt;/h1&amp;gt;&lt;br /&gt;
 void TownRecordRefreshDonationTitles(TownRecord@ townRecord)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;line-height:1.6;&amp;quot;&amp;gt;How does the game know the hooks?&amp;lt;/div&amp;gt;&lt;br /&gt;
In specific parts of the game a &#039;Hook&#039; call is added which automatically looks up the hook that matches and executes it at that point in the code.&lt;br /&gt;
Every hook call in the game code itself is defined as &amp;lt;code&amp;gt;Hooks::Call(&amp;quot;NameOfHook&amp;quot;, arguments1, arguments2)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hooks usually have 1 or even multiple arguments, these must match if you want to use the hook.&lt;br /&gt;
To give an example, let&#039;s take a look at &amp;lt;code&amp;gt;Hooks::Call(&amp;quot;BaseGameModeConstructor&amp;quot;, @this);&amp;lt;/code&amp;gt;&lt;br /&gt;
For us to use this hook we must use the name &amp;lt;code&amp;gt;BaseGameModeConstructor&amp;lt;/code&amp;gt;, with the argument &amp;lt;code&amp;gt;@this&amp;lt;/code&amp;gt;. In this case &amp;lt;code&amp;gt;@this&amp;lt;/code&amp;gt; refers to the class itself. The class this is in is &amp;lt;code&amp;gt;BaseGameMode&amp;lt;/code&amp;gt;.&lt;br /&gt;
This means that the argument is the class &amp;lt;code&amp;gt;BaseGameMode&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
So we know the name and the argument to use this hook, to use it we use this:&lt;br /&gt;
 namespace MyTestMod // Be sure to always put it inside a namespace, conflicts or other things may occur if you don&#039;t&lt;br /&gt;
 {&lt;br /&gt;
    // This is executed when the game comes along to Hooks::Call(&amp;quot;BaseGameModeConstructor&amp;quot;, @this);&lt;br /&gt;
    [Hook] // [Hook] means for the game that this is an hook we use, if you don&#039;t put this on top of the hook we are using, the game doesn&#039;t recognize it.&lt;br /&gt;
    void BaseGameModeConstructor(BaseGameMode@ baseGameMode){ // void BaseGameModeConstructoris the name from Hooks::Call(&amp;quot;BaseGameModeConstructor&amp;quot;... the argument @this refers to the BaseGameMode as we found.&lt;br /&gt;
        print(&amp;quot;Hello World&amp;quot;); // Prints hello world in the console&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
If the arguments do not match in the hook, it will either not execute or returns an error in the console&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thyraxxvoid</name></author>
	</entry>
	<entry>
		<id>https://wiki.heroesofhammerwatch2.com/index.php?title=Hooks&amp;diff=1714</id>
		<title>Hooks</title>
		<link rel="alternate" type="text/html" href="https://wiki.heroesofhammerwatch2.com/index.php?title=Hooks&amp;diff=1714"/>
		<updated>2025-11-19T16:13:18Z</updated>

		<summary type="html">&lt;p&gt;Thyraxxvoid: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hooks are script functions that are called at specific moments. This way, you can insert code into the game a bit easier without the need for overwriting existing files.&lt;br /&gt;
This is mostly the recommended way, there is almost no need to update your mod if the game gets updates and it keeps the highest compatibility cause it won&#039;t affect other mods.&lt;br /&gt;
&lt;br /&gt;
They are specified in script files and tagged with the &amp;lt;code&amp;gt;Hook&amp;lt;/code&amp;gt; specifier. They also must be placed within a namespace to avoid ambiguity between multiple mods.&lt;br /&gt;
&lt;br /&gt;
The following is an example of such a file:&lt;br /&gt;
&lt;br /&gt;
 namespace MyTestMod&lt;br /&gt;
 {&lt;br /&gt;
    [Hook]&lt;br /&gt;
    void BaseGameModeConstructor(BaseGameMode@ baseGameMode){&lt;br /&gt;
        print(&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== PlayerDamageActor ==&lt;br /&gt;
== PlayerDamageActorNoWeapon ==&lt;br /&gt;
== PlayerDamagedActor ==&lt;br /&gt;
== PlayerKilledActor ==&lt;br /&gt;
== PlayerDamage ==&lt;br /&gt;
== PlayerDamageTaken ==&lt;br /&gt;
== PlayerInitialize ==&lt;br /&gt;
== PlayerRefreshScene ==&lt;br /&gt;
== PlayerDamageActor ==&lt;br /&gt;
== PlayerDamageActorNoWeapon ==&lt;br /&gt;
== PlayerRecordConstructor ==&lt;br /&gt;
== PickedCharacter ==&lt;br /&gt;
== CreateCharacter ==&lt;br /&gt;
== PlayerRecordSave ==&lt;br /&gt;
== PlayerRecordLoad ==&lt;br /&gt;
== PlayerRecordRefreshModifiers ==&lt;br /&gt;
== LevelupCharacter ==&lt;br /&gt;
== GameModeStart ==&lt;br /&gt;
== GameModePostStart ==&lt;br /&gt;
== GameModePreRenderFrame ==&lt;br /&gt;
== GameModeRenderFrame ==&lt;br /&gt;
== GameModeSpawnPlayer ==&lt;br /&gt;
== GameModeSpawnPlayerCorpse ==&lt;br /&gt;
== BaseGameModeConstructor ==&lt;br /&gt;
== GameModeUpdatePaused ==&lt;br /&gt;
== GameModeUpdate ==&lt;br /&gt;
== LoadWidgetProducers ==&lt;br /&gt;
== HUDConstructor ==&lt;br /&gt;
== TownRecordConstructor ==&lt;br /&gt;
== TownRecordSave ==&lt;br /&gt;
== TownRecordLoad ==&lt;br /&gt;
== TownRecordSpawnTown ==&lt;br /&gt;
== TownRecordRefreshHeroTitles ==&lt;br /&gt;
== TownRecordRefreshDonationTitles ==&lt;/div&gt;</summary>
		<author><name>Thyraxxvoid</name></author>
	</entry>
	<entry>
		<id>https://wiki.heroesofhammerwatch2.com/index.php?title=Hooks&amp;diff=1713</id>
		<title>Hooks</title>
		<link rel="alternate" type="text/html" href="https://wiki.heroesofhammerwatch2.com/index.php?title=Hooks&amp;diff=1713"/>
		<updated>2025-11-19T16:10:16Z</updated>

		<summary type="html">&lt;p&gt;Thyraxxvoid: Created page with &amp;quot;Hooks are script functions that are called at specific moments. This way, you can insert code into the game.  They are specified in script files and tagged with the &amp;lt;code&amp;gt;Hook&amp;lt;/code&amp;gt; specifier. They also must be placed within a namespace to avoid ambiguity between multiple mods.  The following is an example of such a file:   namespace MyTestMod  {     [Hook]     void BaseGameModeConstructor(BaseGameMode@ baseGameMode){         print(&amp;quot;Hello World&amp;quot;);     }  }  == PlayerDam...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hooks are script functions that are called at specific moments. This way, you can insert code into the game.&lt;br /&gt;
&lt;br /&gt;
They are specified in script files and tagged with the &amp;lt;code&amp;gt;Hook&amp;lt;/code&amp;gt; specifier. They also must be placed within a namespace to avoid ambiguity between multiple mods.&lt;br /&gt;
&lt;br /&gt;
The following is an example of such a file:&lt;br /&gt;
&lt;br /&gt;
 namespace MyTestMod&lt;br /&gt;
 {&lt;br /&gt;
    [Hook]&lt;br /&gt;
    void BaseGameModeConstructor(BaseGameMode@ baseGameMode){&lt;br /&gt;
        print(&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== PlayerDamageActor ==&lt;br /&gt;
== PlayerDamageActorNoWeapon ==&lt;br /&gt;
== PlayerDamagedActor ==&lt;br /&gt;
== PlayerKilledActor ==&lt;br /&gt;
== PlayerDamage ==&lt;br /&gt;
== PlayerDamageTaken ==&lt;br /&gt;
== PlayerInitialize ==&lt;br /&gt;
== PlayerRefreshScene ==&lt;br /&gt;
== PlayerDamageActor ==&lt;br /&gt;
== PlayerDamageActorNoWeapon ==&lt;br /&gt;
== PlayerRecordConstructor ==&lt;br /&gt;
== PickedCharacter ==&lt;br /&gt;
== CreateCharacter ==&lt;br /&gt;
== PlayerRecordSave ==&lt;br /&gt;
== PlayerRecordLoad ==&lt;br /&gt;
== PlayerRecordRefreshModifiers ==&lt;br /&gt;
== LevelupCharacter ==&lt;br /&gt;
== GameModeStart ==&lt;br /&gt;
== GameModePostStart ==&lt;br /&gt;
== GameModePreRenderFrame ==&lt;br /&gt;
== GameModeRenderFrame ==&lt;br /&gt;
== GameModeSpawnPlayer ==&lt;br /&gt;
== GameModeSpawnPlayerCorpse ==&lt;br /&gt;
== BaseGameModeConstructor ==&lt;br /&gt;
== GameModeUpdatePaused ==&lt;br /&gt;
== GameModeUpdate ==&lt;br /&gt;
== LoadWidgetProducers ==&lt;br /&gt;
== HUDConstructor ==&lt;br /&gt;
== TownRecordConstructor ==&lt;br /&gt;
== TownRecordSave ==&lt;br /&gt;
== TownRecordLoad ==&lt;br /&gt;
== TownRecordSpawnTown ==&lt;br /&gt;
== TownRecordRefreshHeroTitles ==&lt;br /&gt;
== TownRecordRefreshDonationTitles ==&lt;/div&gt;</summary>
		<author><name>Thyraxxvoid</name></author>
	</entry>
	<entry>
		<id>https://wiki.heroesofhammerwatch2.com/index.php?title=Template:BaseNav&amp;diff=1712</id>
		<title>Template:BaseNav</title>
		<link rel="alternate" type="text/html" href="https://wiki.heroesofhammerwatch2.com/index.php?title=Template:BaseNav&amp;diff=1712"/>
		<updated>2025-11-19T16:08:20Z</updated>

		<summary type="html">&lt;p&gt;Thyraxxvoid: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;rowcontainer&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;rowlarge&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;menu&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto; text-align:center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Wiki Navigator&lt;br /&gt;
|-&lt;br /&gt;
![[Classes]]&lt;br /&gt;
|[[Paladin]] • [[Ranger]] • [[Rogue]] • [[Sorcerer]] • [[Warlock]] • [[Warrior]] • [[Wizard]]&lt;br /&gt;
|- &lt;br /&gt;
![[Campaigns]]&lt;br /&gt;
|[[Dark Citadel]] • [[Tutorial]]&lt;br /&gt;
|-&lt;br /&gt;
! [[Town|The Town]]&lt;br /&gt;
| [[Guild Hall]] • [[Training Grounds]] • [[Blacksmith]] • [[Magic Shop]] • [[Apothecary]]&amp;lt;br&amp;gt;[[Chapel]] • [[Tavern]] • [[Architect]] • [[Library]] • [[Enchanter]]&lt;br /&gt;
|-&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|[[Mechanics]]&lt;br /&gt;
|[[Combat]] • [[Encounters]] • [[Guild]] ([[Guild#Accomplishments|Accomplishments]] &amp;amp; [[Guild#Titles|Titles]]) • [[New Game Plus]] • [[Player Character]] • [[Secrets]] • [[Traps]]&lt;br /&gt;
|- style=&amp;quot;border-top:hidden&amp;quot;&lt;br /&gt;
|[[Trinkets]] • [[Equipment]] • [[Materials]] • [[Chests]] • [[Blueprints]]&lt;br /&gt;
|-&lt;br /&gt;
![[Enemies]]&lt;br /&gt;
|[[Bosses]] • [[Aberrations]] • [[Beasts]] • [[Constructs]] • [[Undead]]  • [[Human]]  • [[Elites]]&lt;br /&gt;
|-&lt;br /&gt;
!|[[Misc]]&lt;br /&gt;
|[[patchNotes|Patch Notes]] • [[troubleshooting|Troubleshooting]] • [[Language Workshop]] • [[Commands|Console Commands]] • [[Modding]] • [[Hooks]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thyraxxvoid</name></author>
	</entry>
	<entry>
		<id>https://wiki.heroesofhammerwatch2.com/index.php?title=Modding&amp;diff=1711</id>
		<title>Modding</title>
		<link rel="alternate" type="text/html" href="https://wiki.heroesofhammerwatch2.com/index.php?title=Modding&amp;diff=1711"/>
		<updated>2025-11-19T15:38:36Z</updated>

		<summary type="html">&lt;p&gt;Thyraxxvoid: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Heroes of Hammerwatch 2 has a robust system for modding, with a few different types of mods possible.&lt;br /&gt;
&lt;br /&gt;
[[Resource mods]]&lt;br /&gt;
&lt;br /&gt;
[[Scenarios]]&lt;br /&gt;
&lt;br /&gt;
[[Languages]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;&lt;br /&gt;
Getting Started&lt;br /&gt;
&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#Open the game&#039;s folder (e.g. C:\Program Files (x86)\Steam\steamapps\common\Heroes of Hammerwatch 2)&lt;br /&gt;
#Run &amp;quot;PACKAGER.exe&amp;quot;&lt;br /&gt;
#Select &amp;quot;Resources&amp;quot; from the list&lt;br /&gt;
#Click the &amp;quot;Extract Base Resources&amp;quot; button at the top (icon is a cardboard box)&lt;br /&gt;
#Wait for the unpacking to finish (This will take a while). It may give an error, this can be ignored.&lt;br /&gt;
#When finished, it will create a new folder named &amp;quot;unpacked_assets_[number]&amp;quot; containing all of the base game files&lt;br /&gt;
#Create a new folder named &amp;quot;mods&amp;quot;&lt;br /&gt;
#Create a new folder in mods with the name of your mod (cannot have spaces).&lt;br /&gt;
#Create a file info.xml with the following information&lt;br /&gt;
 &amp;lt;dict&amp;gt;&lt;br /&gt;
     &amp;lt;string name=&amp;quot;name&amp;quot;&amp;gt;Mod Name Here&amp;lt;/string&amp;gt;&lt;br /&gt;
     &amp;lt;string name=&amp;quot;author&amp;quot;&amp;gt;Your Name Here&amp;lt;/string&amp;gt;&lt;br /&gt;
     &amp;lt;string name=&amp;quot;description&amp;quot;&amp;gt;Explanation of what the mod is/does.&amp;lt;/string&amp;gt;&lt;br /&gt;
 &amp;lt;/dict&amp;gt; &lt;br /&gt;
#Start making changes!&lt;br /&gt;
##Files with the same name as an existing file will take precedence and completely overwrite anything in the base file. You can copy folders or files directly from the unpacked_assets folder and make changes&lt;br /&gt;
##All .sval files are all read in when the game loads. You can use &amp;lt;loader&amp;gt; tags to merge additional data into existing and set load order&lt;br /&gt;
##.inc files are referenced with a %include in .sval files, but not automatically loaded&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;&lt;br /&gt;
Mod Troubleshooting&lt;br /&gt;
&amp;lt;/h1&amp;gt;&lt;br /&gt;
The game logs all events in &amp;quot;HWR2.exe.log&amp;quot;, in the root of the game folder. If something isn&#039;t working, check there first for errors about expected characters or missing files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;&lt;br /&gt;
Documentation&lt;br /&gt;
&amp;lt;/h1&amp;gt;&lt;br /&gt;
*[[Modding/Skills|Skills]]&lt;br /&gt;
*[[Modding/Effects|Effects]]&lt;br /&gt;
*[[Modding/Actions|Actions]]&lt;br /&gt;
*[[Modding/Modifiers|Modifiers]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;&lt;br /&gt;
Uploading to Steam Workshop&lt;br /&gt;
&amp;lt;/h1&amp;gt;&lt;br /&gt;
#Launch PACKAGER.exe from the Heroes of Hammerwatch2 folder&lt;br /&gt;
#Right Click your mod folder under Resources/Unpacked/yourmodname and select &amp;quot;Make Package&amp;quot;&lt;br /&gt;
#Click the Steam icon in the top left corner of the packager window to open the Steam Workshop UI&lt;br /&gt;
#Upload new mod&lt;br /&gt;
##Select the &amp;quot;Upload new&amp;quot; tab&lt;br /&gt;
##Click browse package, navigate to your Hammerwatch2 mods folder, and select the newly created .bin file you created above&lt;br /&gt;
##Click browse image and select an image thumbnail to be uploaded to the steam workshop for your mod&lt;br /&gt;
##Enter the name, description, visibility, and tags to use for the mod in the steam workshop&lt;br /&gt;
##Press the Upload button. &#039;&#039;It may take up to an hour for the mod to appear in the workshop after being successfully uploaded&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;&lt;br /&gt;
Tutorials&lt;br /&gt;
&amp;lt;/h1&amp;gt;&lt;br /&gt;
Although this video is for HW2 it can still be helpful since A LOT is the same&lt;br /&gt;
&lt;br /&gt;
Video Tutorial - [https://www.youtube.com/watch?v=0LfyTo-BBbI Hammerwatch 2 Modding: NPCs, Quests, and Custom Crafting]&lt;br /&gt;
&lt;br /&gt;
Text Tutorial - [[Modding/Creating_A_Custom_Class|How to create a custom class]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;&lt;br /&gt;
Fixing .tif files&lt;br /&gt;
&amp;lt;/h1&amp;gt;&lt;br /&gt;
As of right now for Heroes of Hammerwatch 2 this is not possible.&lt;br /&gt;
The unpackager tool does not create tif files in the correct format to use for the game. Any .tif files copied from the unpacked_assets folder to your mod folders will show as an empty or glitched texture in game, popup an error on loading, and record an ERR event in HWR2.exe.log.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Template:BaseNav}}&lt;/div&gt;</summary>
		<author><name>Thyraxxvoid</name></author>
	</entry>
	<entry>
		<id>https://wiki.heroesofhammerwatch2.com/index.php?title=Modding&amp;diff=1710</id>
		<title>Modding</title>
		<link rel="alternate" type="text/html" href="https://wiki.heroesofhammerwatch2.com/index.php?title=Modding&amp;diff=1710"/>
		<updated>2025-11-19T15:36:08Z</updated>

		<summary type="html">&lt;p&gt;Thyraxxvoid: /* Getting Started */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Heroes of Hammerwatch 2 has a robust system for modding, with a few different types of mods possible.&lt;br /&gt;
&lt;br /&gt;
[[Resource mods]]&lt;br /&gt;
&lt;br /&gt;
[[Scenarios]]&lt;br /&gt;
&lt;br /&gt;
[[Languages]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1 style=&amp;quot;color: #faa700&amp;quot;&amp;gt;&lt;br /&gt;
Getting Started&lt;br /&gt;
&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#Open the game&#039;s folder (e.g. C:\Program Files (x86)\Steam\steamapps\common\Heroes of Hammerwatch 2)&lt;br /&gt;
#Run &amp;quot;PACKAGER.exe&amp;quot;&lt;br /&gt;
#Select &amp;quot;Resources&amp;quot; from the list&lt;br /&gt;
#Click the &amp;quot;Extract Base Resources&amp;quot; button at the top (icon is a cardboard box)&lt;br /&gt;
#Wait for the unpacking to finish (This will take a while). It may give an error, this can be ignored.&lt;br /&gt;
#When finished, it will create a new folder named &amp;quot;unpacked_assets_[number]&amp;quot; containing all of the base game files&lt;br /&gt;
#Create a new folder named &amp;quot;mods&amp;quot;&lt;br /&gt;
#Create a new folder in mods with the name of your mod (cannot have spaces).&lt;br /&gt;
#Create a file info.xml with the following information&lt;br /&gt;
 &amp;lt;dict&amp;gt;&lt;br /&gt;
     &amp;lt;string name=&amp;quot;name&amp;quot;&amp;gt;Mod Name Here&amp;lt;/string&amp;gt;&lt;br /&gt;
     &amp;lt;string name=&amp;quot;author&amp;quot;&amp;gt;Your Name Here&amp;lt;/string&amp;gt;&lt;br /&gt;
     &amp;lt;string name=&amp;quot;description&amp;quot;&amp;gt;Explanation of what the mod is/does.&amp;lt;/string&amp;gt;&lt;br /&gt;
 &amp;lt;/dict&amp;gt; &lt;br /&gt;
#Start making changes!&lt;br /&gt;
##Files with the same name as an existing file will take precedence and completely overwrite anything in the base file. You can copy folders or files directly from the unpacked_assets folder and make changes&lt;br /&gt;
##All .sval files are all read in when the game loads. You can use &amp;lt;loader&amp;gt; tags to merge additional data into existing and set load order&lt;br /&gt;
##.inc files are referenced with a %include in .sval files, but not automatically loaded&lt;br /&gt;
&lt;br /&gt;
=Mod Troubleshooting=&lt;br /&gt;
The game logs all events in &amp;quot;HWR2.exe.log&amp;quot;, in the root of the game folder. If something isn&#039;t working, check there first for errors about expected characters or missing files.&lt;br /&gt;
&lt;br /&gt;
=Documentation=&lt;br /&gt;
*[[Modding/Skills|Skills]]&lt;br /&gt;
*[[Modding/Effects|Effects]]&lt;br /&gt;
*[[Modding/Actions|Actions]]&lt;br /&gt;
*[[Modding/Modifiers|Modifiers]]&lt;br /&gt;
&lt;br /&gt;
=Uploading to Steam Workshop=&lt;br /&gt;
#Launch PACKAGER.exe from the Heroes of Hammerwatch2 folder&lt;br /&gt;
#Right Click your mod folder under Resources/Unpacked/yourmodname and select &amp;quot;Make Package&amp;quot;&lt;br /&gt;
#Click the Steam icon in the top left corner of the packager window to open the Steam Workshop UI&lt;br /&gt;
#Upload new mod&lt;br /&gt;
##Select the &amp;quot;Upload new&amp;quot; tab&lt;br /&gt;
##Click browse package, navigate to your Hammerwatch2 mods folder, and select the newly created .bin file you created above&lt;br /&gt;
##Click browse image and select an image thumbnail to be uploaded to the steam workshop for your mod&lt;br /&gt;
##Enter the name, description, visibility, and tags to use for the mod in the steam workshop&lt;br /&gt;
##Press the Upload button. &#039;&#039;It may take up to an hour for the mod to appear in the workshop after being successfully uploaded&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Tutorials=&lt;br /&gt;
&lt;br /&gt;
Although this video is for HW2 it can still be helpful since A LOT is the same&lt;br /&gt;
&lt;br /&gt;
Video Tutorial - [https://www.youtube.com/watch?v=0LfyTo-BBbI Hammerwatch 2 Modding: NPCs, Quests, and Custom Crafting]&lt;br /&gt;
&lt;br /&gt;
Text Tutorial - [[Modding/Creating_A_Custom_Class|How to create a custom class]]&lt;br /&gt;
&lt;br /&gt;
=Fixing .tif files=&lt;br /&gt;
As of right now for Heroes of Hammerwatch 2 this is not possible.&lt;br /&gt;
The unpackager tool does not create tif files in the correct format to use for the game. Any .tif files copied from the unpacked_assets folder to your mod folders will show as an empty or glitched texture in game, popup an error on loading, and record an ERR event in HWR2.exe.log.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Template:BaseNav}}&lt;/div&gt;</summary>
		<author><name>Thyraxxvoid</name></author>
	</entry>
	<entry>
		<id>https://wiki.heroesofhammerwatch2.com/index.php?title=Modding&amp;diff=1709</id>
		<title>Modding</title>
		<link rel="alternate" type="text/html" href="https://wiki.heroesofhammerwatch2.com/index.php?title=Modding&amp;diff=1709"/>
		<updated>2025-11-19T15:28:53Z</updated>

		<summary type="html">&lt;p&gt;Thyraxxvoid: /* Fixing .tif files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Heroes of Hammerwatch 2 has a robust system for modding, with a few different types of mods possible.&lt;br /&gt;
&lt;br /&gt;
[[Resource mods]]&lt;br /&gt;
&lt;br /&gt;
[[Scenarios]]&lt;br /&gt;
&lt;br /&gt;
[[Languages]]&lt;br /&gt;
&lt;br /&gt;
=Getting Started=&lt;br /&gt;
#Open the game&#039;s folder (e.g. C:\Program Files (x86)\Steam\steamapps\common\Heroes of Hammerwatch 2)&lt;br /&gt;
#Run &amp;quot;PACKAGER.exe&amp;quot;&lt;br /&gt;
#Select &amp;quot;Resources&amp;quot; from the list&lt;br /&gt;
#Click the &amp;quot;Extract Base Resources&amp;quot; button at the top (icon is a cardboard box)&lt;br /&gt;
#Wait for the unpacking to finish (This will take a while). It may give an error, this can be ignored.&lt;br /&gt;
#When finished, it will create a new folder named &amp;quot;unpacked_assets_[number]&amp;quot; containing all of the base game files&lt;br /&gt;
#Create a new folder named &amp;quot;mods&amp;quot;&lt;br /&gt;
#Create a new folder in mods with the name of your mod (cannot have spaces).&lt;br /&gt;
#Create a file info.xml with the following information&lt;br /&gt;
 &amp;lt;dict&amp;gt;&lt;br /&gt;
     &amp;lt;string name=&amp;quot;name&amp;quot;&amp;gt;Mod Name Here&amp;lt;/string&amp;gt;&lt;br /&gt;
     &amp;lt;string name=&amp;quot;author&amp;quot;&amp;gt;Your Name Here&amp;lt;/string&amp;gt;&lt;br /&gt;
     &amp;lt;string name=&amp;quot;description&amp;quot;&amp;gt;Explanation of what the mod is/does.&amp;lt;/string&amp;gt;&lt;br /&gt;
 &amp;lt;/dict&amp;gt; &lt;br /&gt;
#Start making changes!&lt;br /&gt;
##Files with the same name as an existing file will take precedence and completely overwrite anything in the base file. You can copy folders or files directly from the unpacked_assets folder and make changes&lt;br /&gt;
##All .sval files are all read in when the game loads. You can use &amp;lt;loader&amp;gt; tags to merge additional data into existing and set load order&lt;br /&gt;
##.inc files are referenced with a %include in .sval files, but not automatically loaded&lt;br /&gt;
&lt;br /&gt;
=Mod Troubleshooting=&lt;br /&gt;
The game logs all events in &amp;quot;HWR2.exe.log&amp;quot;, in the root of the game folder. If something isn&#039;t working, check there first for errors about expected characters or missing files.&lt;br /&gt;
&lt;br /&gt;
=Documentation=&lt;br /&gt;
*[[Modding/Skills|Skills]]&lt;br /&gt;
*[[Modding/Effects|Effects]]&lt;br /&gt;
*[[Modding/Actions|Actions]]&lt;br /&gt;
*[[Modding/Modifiers|Modifiers]]&lt;br /&gt;
&lt;br /&gt;
=Uploading to Steam Workshop=&lt;br /&gt;
#Launch PACKAGER.exe from the Heroes of Hammerwatch2 folder&lt;br /&gt;
#Right Click your mod folder under Resources/Unpacked/yourmodname and select &amp;quot;Make Package&amp;quot;&lt;br /&gt;
#Click the Steam icon in the top left corner of the packager window to open the Steam Workshop UI&lt;br /&gt;
#Upload new mod&lt;br /&gt;
##Select the &amp;quot;Upload new&amp;quot; tab&lt;br /&gt;
##Click browse package, navigate to your Hammerwatch2 mods folder, and select the newly created .bin file you created above&lt;br /&gt;
##Click browse image and select an image thumbnail to be uploaded to the steam workshop for your mod&lt;br /&gt;
##Enter the name, description, visibility, and tags to use for the mod in the steam workshop&lt;br /&gt;
##Press the Upload button. &#039;&#039;It may take up to an hour for the mod to appear in the workshop after being successfully uploaded&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Tutorials=&lt;br /&gt;
&lt;br /&gt;
Although this video is for HW2 it can still be helpful since A LOT is the same&lt;br /&gt;
&lt;br /&gt;
Video Tutorial - [https://www.youtube.com/watch?v=0LfyTo-BBbI Hammerwatch 2 Modding: NPCs, Quests, and Custom Crafting]&lt;br /&gt;
&lt;br /&gt;
Text Tutorial - [[Modding/Creating_A_Custom_Class|How to create a custom class]]&lt;br /&gt;
&lt;br /&gt;
=Fixing .tif files=&lt;br /&gt;
As of right now for Heroes of Hammerwatch 2 this is not possible.&lt;br /&gt;
The unpackager tool does not create tif files in the correct format to use for the game. Any .tif files copied from the unpacked_assets folder to your mod folders will show as an empty or glitched texture in game, popup an error on loading, and record an ERR event in HWR2.exe.log.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Template:BaseNav}}&lt;/div&gt;</summary>
		<author><name>Thyraxxvoid</name></author>
	</entry>
	<entry>
		<id>https://wiki.heroesofhammerwatch2.com/index.php?title=Modding&amp;diff=1708</id>
		<title>Modding</title>
		<link rel="alternate" type="text/html" href="https://wiki.heroesofhammerwatch2.com/index.php?title=Modding&amp;diff=1708"/>
		<updated>2025-11-19T15:26:37Z</updated>

		<summary type="html">&lt;p&gt;Thyraxxvoid: /* Tutorials */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Heroes of Hammerwatch 2 has a robust system for modding, with a few different types of mods possible.&lt;br /&gt;
&lt;br /&gt;
[[Resource mods]]&lt;br /&gt;
&lt;br /&gt;
[[Scenarios]]&lt;br /&gt;
&lt;br /&gt;
[[Languages]]&lt;br /&gt;
&lt;br /&gt;
=Getting Started=&lt;br /&gt;
#Open the game&#039;s folder (e.g. C:\Program Files (x86)\Steam\steamapps\common\Heroes of Hammerwatch 2)&lt;br /&gt;
#Run &amp;quot;PACKAGER.exe&amp;quot;&lt;br /&gt;
#Select &amp;quot;Resources&amp;quot; from the list&lt;br /&gt;
#Click the &amp;quot;Extract Base Resources&amp;quot; button at the top (icon is a cardboard box)&lt;br /&gt;
#Wait for the unpacking to finish (This will take a while). It may give an error, this can be ignored.&lt;br /&gt;
#When finished, it will create a new folder named &amp;quot;unpacked_assets_[number]&amp;quot; containing all of the base game files&lt;br /&gt;
#Create a new folder named &amp;quot;mods&amp;quot;&lt;br /&gt;
#Create a new folder in mods with the name of your mod (cannot have spaces).&lt;br /&gt;
#Create a file info.xml with the following information&lt;br /&gt;
 &amp;lt;dict&amp;gt;&lt;br /&gt;
     &amp;lt;string name=&amp;quot;name&amp;quot;&amp;gt;Mod Name Here&amp;lt;/string&amp;gt;&lt;br /&gt;
     &amp;lt;string name=&amp;quot;author&amp;quot;&amp;gt;Your Name Here&amp;lt;/string&amp;gt;&lt;br /&gt;
     &amp;lt;string name=&amp;quot;description&amp;quot;&amp;gt;Explanation of what the mod is/does.&amp;lt;/string&amp;gt;&lt;br /&gt;
 &amp;lt;/dict&amp;gt; &lt;br /&gt;
#Start making changes!&lt;br /&gt;
##Files with the same name as an existing file will take precedence and completely overwrite anything in the base file. You can copy folders or files directly from the unpacked_assets folder and make changes&lt;br /&gt;
##All .sval files are all read in when the game loads. You can use &amp;lt;loader&amp;gt; tags to merge additional data into existing and set load order&lt;br /&gt;
##.inc files are referenced with a %include in .sval files, but not automatically loaded&lt;br /&gt;
&lt;br /&gt;
=Mod Troubleshooting=&lt;br /&gt;
The game logs all events in &amp;quot;HWR2.exe.log&amp;quot;, in the root of the game folder. If something isn&#039;t working, check there first for errors about expected characters or missing files.&lt;br /&gt;
&lt;br /&gt;
=Documentation=&lt;br /&gt;
*[[Modding/Skills|Skills]]&lt;br /&gt;
*[[Modding/Effects|Effects]]&lt;br /&gt;
*[[Modding/Actions|Actions]]&lt;br /&gt;
*[[Modding/Modifiers|Modifiers]]&lt;br /&gt;
&lt;br /&gt;
=Uploading to Steam Workshop=&lt;br /&gt;
#Launch PACKAGER.exe from the Heroes of Hammerwatch2 folder&lt;br /&gt;
#Right Click your mod folder under Resources/Unpacked/yourmodname and select &amp;quot;Make Package&amp;quot;&lt;br /&gt;
#Click the Steam icon in the top left corner of the packager window to open the Steam Workshop UI&lt;br /&gt;
#Upload new mod&lt;br /&gt;
##Select the &amp;quot;Upload new&amp;quot; tab&lt;br /&gt;
##Click browse package, navigate to your Hammerwatch2 mods folder, and select the newly created .bin file you created above&lt;br /&gt;
##Click browse image and select an image thumbnail to be uploaded to the steam workshop for your mod&lt;br /&gt;
##Enter the name, description, visibility, and tags to use for the mod in the steam workshop&lt;br /&gt;
##Press the Upload button. &#039;&#039;It may take up to an hour for the mod to appear in the workshop after being successfully uploaded&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Tutorials=&lt;br /&gt;
&lt;br /&gt;
Although this video is for HW2 it can still be helpful since A LOT is the same&lt;br /&gt;
&lt;br /&gt;
Video Tutorial - [https://www.youtube.com/watch?v=0LfyTo-BBbI Hammerwatch 2 Modding: NPCs, Quests, and Custom Crafting]&lt;br /&gt;
&lt;br /&gt;
Text Tutorial - [[Modding/Creating_A_Custom_Class|How to create a custom class]]&lt;br /&gt;
&lt;br /&gt;
=Fixing .tif files=&lt;br /&gt;
As of right now for Heroes of Hammerwatch 2 this is not possible.&lt;br /&gt;
The unpackager tool does not create tif files in the correct format to use for the game. Any .tif files copied from the unpacked_assets folder to your mod folders will show as an empty or glitched texture in game, popup an error on loading, and record an ERR event in HWR2.exe.log. This can be corrected with any of the following methods&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Template:BaseNav}}&lt;/div&gt;</summary>
		<author><name>Thyraxxvoid</name></author>
	</entry>
	<entry>
		<id>https://wiki.heroesofhammerwatch2.com/index.php?title=Modding&amp;diff=1707</id>
		<title>Modding</title>
		<link rel="alternate" type="text/html" href="https://wiki.heroesofhammerwatch2.com/index.php?title=Modding&amp;diff=1707"/>
		<updated>2025-11-19T15:21:00Z</updated>

		<summary type="html">&lt;p&gt;Thyraxxvoid: Fixed typo talking about HW2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Heroes of Hammerwatch 2 has a robust system for modding, with a few different types of mods possible.&lt;br /&gt;
&lt;br /&gt;
[[Resource mods]]&lt;br /&gt;
&lt;br /&gt;
[[Scenarios]]&lt;br /&gt;
&lt;br /&gt;
[[Languages]]&lt;br /&gt;
&lt;br /&gt;
=Getting Started=&lt;br /&gt;
#Open the game&#039;s folder (e.g. C:\Program Files (x86)\Steam\steamapps\common\Heroes of Hammerwatch 2)&lt;br /&gt;
#Run &amp;quot;PACKAGER.exe&amp;quot;&lt;br /&gt;
#Select &amp;quot;Resources&amp;quot; from the list&lt;br /&gt;
#Click the &amp;quot;Extract Base Resources&amp;quot; button at the top (icon is a cardboard box)&lt;br /&gt;
#Wait for the unpacking to finish (This will take a while). It may give an error, this can be ignored.&lt;br /&gt;
#When finished, it will create a new folder named &amp;quot;unpacked_assets_[number]&amp;quot; containing all of the base game files&lt;br /&gt;
#Create a new folder named &amp;quot;mods&amp;quot;&lt;br /&gt;
#Create a new folder in mods with the name of your mod (cannot have spaces).&lt;br /&gt;
#Create a file info.xml with the following information&lt;br /&gt;
 &amp;lt;dict&amp;gt;&lt;br /&gt;
     &amp;lt;string name=&amp;quot;name&amp;quot;&amp;gt;Mod Name Here&amp;lt;/string&amp;gt;&lt;br /&gt;
     &amp;lt;string name=&amp;quot;author&amp;quot;&amp;gt;Your Name Here&amp;lt;/string&amp;gt;&lt;br /&gt;
     &amp;lt;string name=&amp;quot;description&amp;quot;&amp;gt;Explanation of what the mod is/does.&amp;lt;/string&amp;gt;&lt;br /&gt;
 &amp;lt;/dict&amp;gt; &lt;br /&gt;
#Start making changes!&lt;br /&gt;
##Files with the same name as an existing file will take precedence and completely overwrite anything in the base file. You can copy folders or files directly from the unpacked_assets folder and make changes&lt;br /&gt;
##All .sval files are all read in when the game loads. You can use &amp;lt;loader&amp;gt; tags to merge additional data into existing and set load order&lt;br /&gt;
##.inc files are referenced with a %include in .sval files, but not automatically loaded&lt;br /&gt;
&lt;br /&gt;
=Mod Troubleshooting=&lt;br /&gt;
The game logs all events in &amp;quot;HWR2.exe.log&amp;quot;, in the root of the game folder. If something isn&#039;t working, check there first for errors about expected characters or missing files.&lt;br /&gt;
&lt;br /&gt;
=Documentation=&lt;br /&gt;
*[[Modding/Skills|Skills]]&lt;br /&gt;
*[[Modding/Effects|Effects]]&lt;br /&gt;
*[[Modding/Actions|Actions]]&lt;br /&gt;
*[[Modding/Modifiers|Modifiers]]&lt;br /&gt;
&lt;br /&gt;
=Uploading to Steam Workshop=&lt;br /&gt;
#Launch PACKAGER.exe from the Heroes of Hammerwatch2 folder&lt;br /&gt;
#Right Click your mod folder under Resources/Unpacked/yourmodname and select &amp;quot;Make Package&amp;quot;&lt;br /&gt;
#Click the Steam icon in the top left corner of the packager window to open the Steam Workshop UI&lt;br /&gt;
#Upload new mod&lt;br /&gt;
##Select the &amp;quot;Upload new&amp;quot; tab&lt;br /&gt;
##Click browse package, navigate to your Hammerwatch2 mods folder, and select the newly created .bin file you created above&lt;br /&gt;
##Click browse image and select an image thumbnail to be uploaded to the steam workshop for your mod&lt;br /&gt;
##Enter the name, description, visibility, and tags to use for the mod in the steam workshop&lt;br /&gt;
##Press the Upload button. &#039;&#039;It may take up to an hour for the mod to appear in the workshop after being successfully uploaded&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Tutorials=&lt;br /&gt;
&lt;br /&gt;
Although for HW2 this video can still be helpful since A LOT is the same&lt;br /&gt;
Video Tutorial - [https://www.youtube.com/watch?v=0LfyTo-BBbI Hammerwatch 2 Modding: NPCs, Quests, and Custom Crafting]&lt;br /&gt;
&lt;br /&gt;
Text Tutorial - [[Modding/Creating_A_Custom_Class|How to create a custom class]]&lt;br /&gt;
&lt;br /&gt;
=Fixing .tif files=&lt;br /&gt;
As of right now for Heroes of Hammerwatch 2 this is not possible.&lt;br /&gt;
The unpackager tool does not create tif files in the correct format to use for the game. Any .tif files copied from the unpacked_assets folder to your mod folders will show as an empty or glitched texture in game, popup an error on loading, and record an ERR event in HWR2.exe.log. This can be corrected with any of the following methods&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Template:BaseNav}}&lt;/div&gt;</summary>
		<author><name>Thyraxxvoid</name></author>
	</entry>
	<entry>
		<id>https://wiki.heroesofhammerwatch2.com/index.php?title=Modding&amp;diff=1706</id>
		<title>Modding</title>
		<link rel="alternate" type="text/html" href="https://wiki.heroesofhammerwatch2.com/index.php?title=Modding&amp;diff=1706"/>
		<updated>2025-11-19T14:58:46Z</updated>

		<summary type="html">&lt;p&gt;Thyraxxvoid: Created page with &amp;quot;Heroes of Hammerwatch 2 has a robust system for modding, with a few different types of mods possible.  Resource mods  Scenarios  Languages  =Getting Started= #Open the game&amp;#039;s folder (e.g. C:\Program Files (x86)\Steam\steamapps\common\Hammerwatch 2) #Run &amp;quot;PACKAGER.exe&amp;quot; #Select &amp;quot;Resources&amp;quot; from the list #Click the &amp;quot;Extract Base Resources&amp;quot; button at the top (icon is a cardboard box) #Wait for the unpacking to finish (This will take a while). It may give an error...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Heroes of Hammerwatch 2 has a robust system for modding, with a few different types of mods possible.&lt;br /&gt;
&lt;br /&gt;
[[Resource mods]]&lt;br /&gt;
&lt;br /&gt;
[[Scenarios]]&lt;br /&gt;
&lt;br /&gt;
[[Languages]]&lt;br /&gt;
&lt;br /&gt;
=Getting Started=&lt;br /&gt;
#Open the game&#039;s folder (e.g. C:\Program Files (x86)\Steam\steamapps\common\Hammerwatch 2)&lt;br /&gt;
#Run &amp;quot;PACKAGER.exe&amp;quot;&lt;br /&gt;
#Select &amp;quot;Resources&amp;quot; from the list&lt;br /&gt;
#Click the &amp;quot;Extract Base Resources&amp;quot; button at the top (icon is a cardboard box)&lt;br /&gt;
#Wait for the unpacking to finish (This will take a while). It may give an error, this can be ignored.&lt;br /&gt;
#When finished, it will create a new folder named &amp;quot;unpacked_assets_[number]&amp;quot; containing all of the base game files&lt;br /&gt;
#Create a new folder named &amp;quot;mods&amp;quot;&lt;br /&gt;
#Create a new folder in mods with the name of your mod (cannot have spaces).&lt;br /&gt;
#Create a file info.xml with the following information&lt;br /&gt;
 &amp;lt;dict&amp;gt;&lt;br /&gt;
     &amp;lt;string name=&amp;quot;name&amp;quot;&amp;gt;Mod Name Here&amp;lt;/string&amp;gt;&lt;br /&gt;
     &amp;lt;string name=&amp;quot;author&amp;quot;&amp;gt;Your Name Here&amp;lt;/string&amp;gt;&lt;br /&gt;
     &amp;lt;string name=&amp;quot;description&amp;quot;&amp;gt;Explanation of what the mod is/does.&amp;lt;/string&amp;gt;&lt;br /&gt;
 &amp;lt;/dict&amp;gt; &lt;br /&gt;
#Start making changes!&lt;br /&gt;
##Files with the same name as an existing file will take precedence and completely overwrite anything in the base file. You can copy folders or files directly from the unpacked_assets folder and make changes&lt;br /&gt;
##All .sval files are all read in when the game loads. You can use &amp;lt;loader&amp;gt; tags to merge additional data into existing and set load order&lt;br /&gt;
##.inc files are referenced with a %include in .sval files, but not automatically loaded&lt;br /&gt;
&lt;br /&gt;
=Mod Troubleshooting=&lt;br /&gt;
The game logs all events in &amp;quot;HWR2.exe.log&amp;quot;, in the root of the game folder. If something isn&#039;t working, check there first for errors about expected characters or missing files.&lt;br /&gt;
&lt;br /&gt;
=Documentation=&lt;br /&gt;
*[[Modding/Skills|Skills]]&lt;br /&gt;
*[[Modding/Effects|Effects]]&lt;br /&gt;
*[[Modding/Actions|Actions]]&lt;br /&gt;
*[[Modding/Modifiers|Modifiers]]&lt;br /&gt;
&lt;br /&gt;
=Uploading to Steam Workshop=&lt;br /&gt;
#Launch PACKAGER.exe from the Heroes of Hammerwatch2 folder&lt;br /&gt;
#Right Click your mod folder under Resources/Unpacked/yourmodname and select &amp;quot;Make Package&amp;quot;&lt;br /&gt;
#Click the Steam icon in the top left corner of the packager window to open the Steam Workshop UI&lt;br /&gt;
#Upload new mod&lt;br /&gt;
##Select the &amp;quot;Upload new&amp;quot; tab&lt;br /&gt;
##Click browse package, navigate to your Hammerwatch2 mods folder, and select the newly created .bin file you created above&lt;br /&gt;
##Click browse image and select an image thumbnail to be uploaded to the steam workshop for your mod&lt;br /&gt;
##Enter the name, description, visibility, and tags to use for the mod in the steam workshop&lt;br /&gt;
##Press the Upload button. &#039;&#039;It may take up to an hour for the mod to appear in the workshop after being successfully uploaded&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Tutorials=&lt;br /&gt;
&lt;br /&gt;
Although for HW2 this video can still be helpful since A LOT is the same&lt;br /&gt;
Video Tutorial - [https://www.youtube.com/watch?v=0LfyTo-BBbI Hammerwatch 2 Modding: NPCs, Quests, and Custom Crafting]&lt;br /&gt;
&lt;br /&gt;
Text Tutorial - [[Modding/Creating_A_Custom_Class|How to create a custom class]]&lt;br /&gt;
&lt;br /&gt;
=Fixing .tif files=&lt;br /&gt;
As of right now for Heroes of Hammerwatch 2 this is not possible.&lt;br /&gt;
The unpackager tool does not create tif files in the correct format to use for the game. Any .tif files copied from the unpacked_assets folder to your mod folders will show as an empty or glitched texture in game, popup an error on loading, and record an ERR event in HWR2.exe.log. This can be corrected with any of the following methods&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Template:BaseNav}}&lt;/div&gt;</summary>
		<author><name>Thyraxxvoid</name></author>
	</entry>
	<entry>
		<id>https://wiki.heroesofhammerwatch2.com/index.php?title=Template:BaseNav&amp;diff=1705</id>
		<title>Template:BaseNav</title>
		<link rel="alternate" type="text/html" href="https://wiki.heroesofhammerwatch2.com/index.php?title=Template:BaseNav&amp;diff=1705"/>
		<updated>2025-11-19T14:49:40Z</updated>

		<summary type="html">&lt;p&gt;Thyraxxvoid: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;rowcontainer&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;rowlarge&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;menu&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto; text-align:center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Wiki Navigator&lt;br /&gt;
|-&lt;br /&gt;
![[Classes]]&lt;br /&gt;
|[[Paladin]] • [[Ranger]] • [[Rogue]] • [[Sorcerer]] • [[Warlock]] • [[Warrior]] • [[Wizard]]&lt;br /&gt;
|- &lt;br /&gt;
![[Campaigns]]&lt;br /&gt;
|[[Dark Citadel]] • [[Tutorial]]&lt;br /&gt;
|-&lt;br /&gt;
! [[Town|The Town]]&lt;br /&gt;
| [[Guild Hall]] • [[Training Grounds]] • [[Blacksmith]] • [[Magic Shop]] • [[Apothecary]]&amp;lt;br&amp;gt;[[Chapel]] • [[Tavern]] • [[Architect]] • [[Library]] • [[Enchanter]]&lt;br /&gt;
|-&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot;|[[Mechanics]]&lt;br /&gt;
|[[Combat]] • [[Encounters]] • [[Guild]] ([[Guild#Accomplishments|Accomplishments]] &amp;amp; [[Guild#Titles|Titles]]) • [[New Game Plus]] • [[Player Character]] • [[Secrets]] • [[Traps]]&lt;br /&gt;
|- style=&amp;quot;border-top:hidden&amp;quot;&lt;br /&gt;
|[[Trinkets]] • [[Equipment]] • [[Materials]] • [[Chests]] • [[Blueprints]]&lt;br /&gt;
|-&lt;br /&gt;
![[Enemies]]&lt;br /&gt;
|[[Bosses]] • [[Aberrations]] • [[Beasts]] • [[Constructs]] • [[Undead]]  • [[Human]]  • [[Elites]]&lt;br /&gt;
|-&lt;br /&gt;
!|[[Misc]]&lt;br /&gt;
|[[patchNotes|Patch Notes]] • [[troubleshooting|Troubleshooting]] • [[Language Workshop]] • [[Commands|Console Commands]] • [[Modding]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thyraxxvoid</name></author>
	</entry>
</feed>