<feed xmlns='http://www.w3.org/2005/Atom'>
<title>ao2-client/src/charselect.cpp, branch master</title>
<subtitle>AO2 client fork</subtitle>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/ao2-client/'/>
<entry>
<title>Fix warnings and deprecated functions</title>
<updated>2026-03-29T22:22:25+00:00</updated>
<author>
<name>Osmium Sorcerer</name>
<email>os@sof.beauty</email>
</author>
<published>2026-03-22T17:44:46+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/ao2-client/commit/?id=d4e99dcee4f48bcb34e6f6a38d5bae4fa380c841'/>
<id>d4e99dcee4f48bcb34e6f6a38d5bae4fa380c841</id>
<content type='text'>
- For QCheckBox: stateChanged -&gt; checkStateChanged

- QChar(PREANIM) -&gt; QLatin1Char(PREANIM)

- Unused result on demo_file.open()

- QPointer include was missing from lobby.h

- Missing const and override qualifiers
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- For QCheckBox: stateChanged -&gt; checkStateChanged

- QChar(PREANIM) -&gt; QLatin1Char(PREANIM)

- Unused result on demo_file.open()

- QPointer include was missing from lobby.h

- Missing const and override qualifiers
</pre>
</div>
</content>
</entry>
<entry>
<title>Remove sending client ID and HDID in CC packet</title>
<updated>2026-03-29T22:22:25+00:00</updated>
<author>
<name>Osmium Sorcerer</name>
<email>os@sof.beauty</email>
</author>
<published>2026-03-22T17:35:58+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/ao2-client/commit/?id=3f7e0a684a513ce4d6ba4f6f1533794c6d6cdc0d'/>
<id>3f7e0a684a513ce4d6ba4f6f1533794c6d6cdc0d</id>
<content type='text'>
The "select character" packet, CC, only needs one field: the character
ID you're selecting. It uses two more: a client ID and an HDID. To
select a character, you have to send your HDID every single time. This
is ridiculous, you alredy send it to the server when you join.

Remove it. I hoped to use empty strings in both unused fields to fully
erase them without breaking the packet structure, but some servers
*require* both to be present, so hardcode "0" instead.

CC doesn't need anything beyond CID. Client ID _might_ be used for
some spoofing protection, but even then it sounds far-fetched.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The "select character" packet, CC, only needs one field: the character
ID you're selecting. It uses two more: a client ID and an HDID. To
select a character, you have to send your HDID every single time. This
is ridiculous, you alredy send it to the server when you join.

Remove it. I hoped to use empty strings in both unused fields to fully
erase them without breaking the packet structure, but some servers
*require* both to be present, so hardcode "0" instead.

CC doesn't need anything beyond CID. Client ID _might_ be used for
some spoofing protection, but even then it sounds far-fetched.
</pre>
</div>
</content>
</entry>
<entry>
<title>Support passworded characters in character list</title>
<updated>2026-03-29T22:22:25+00:00</updated>
<author>
<name>Osmium Sorcerer</name>
<email>os@sof.beauty</email>
</author>
<published>2026-03-22T17:30:03+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/ao2-client/commit/?id=3b8bc386d316b6e177c814920f21f5ab5d798ee6'/>
<id>3b8bc386d316b6e177c814920f21f5ab5d798ee6</id>
<content type='text'>
This obscure feature has been present for years, from sending passwords
to the server to showing `char_passworded` image over character icons.

Servers could already exploit clients sending `PW` with a password every
time they select a character to implement passworded characters. The
clients had no way of knowing which ones were passworded, however, and
couldn't filter them despite "Passworded" checkbox being here all along.

The approach used by this commit is a hack. During loading, server sends
SC which is a list of characters, each one having name, description, and
evidence. In practice, only names were used. Descriptions were stored in
memory but unused, and evidence was ignored altogether. By adding a
magic value "P" in this "character evidence" field, server can mark
passworded characters without breaking Vanilla compatibility.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This obscure feature has been present for years, from sending passwords
to the server to showing `char_passworded` image over character icons.

Servers could already exploit clients sending `PW` with a password every
time they select a character to implement passworded characters. The
clients had no way of knowing which ones were passworded, however, and
couldn't filter them despite "Passworded" checkbox being here all along.

The approach used by this commit is a hack. During loading, server sends
SC which is a list of characters, each one having name, description, and
evidence. In practice, only names were used. Descriptions were stored in
memory but unused, and evidence was ignored altogether. By adding a
magic value "P" in this "character evidence" field, server can mark
passworded characters without breaking Vanilla compatibility.
</pre>
</div>
</content>
</entry>
<entry>
<title>avoid detaching temporary container</title>
<updated>2025-01-11T08:19:46+00:00</updated>
<author>
<name>in1tiate</name>
<email>32779090+in1tiate@users.noreply.github.com</email>
</author>
<published>2025-01-11T08:19:46+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/ao2-client/commit/?id=a7d292b8b673bce4a8471f6e916b44e6fdb64c97'/>
<id>a7d292b8b673bce4a8471f6e916b44e6fdb64c97</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>use std::as_const instead of qAsConst</title>
<updated>2025-01-11T07:45:28+00:00</updated>
<author>
<name>in1tiate</name>
<email>32779090+in1tiate@users.noreply.github.com</email>
</author>
<published>2025-01-11T07:45:28+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/ao2-client/commit/?id=4dae73c848bba1e44abf5a37d41034ded25cf28a'/>
<id>4dae73c848bba1e44abf5a37d41034ded25cf28a</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Add Courtroom position restore</title>
<updated>2024-07-11T13:52:34+00:00</updated>
<author>
<name>Salanto</name>
<email>62221668+Salanto@users.noreply.github.com</email>
</author>
<published>2024-07-11T13:52:34+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/ao2-client/commit/?id=d9aada29009c66c6d146d88b20ab43f967653566'/>
<id>d9aada29009c66c6d146d88b20ab43f967653566</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Searching by categories (#968)</title>
<updated>2024-05-27T12:30:47+00:00</updated>
<author>
<name>UnDeviato</name>
<email>fevola.davide@gmail.com</email>
</author>
<published>2024-05-27T12:30:47+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/ao2-client/commit/?id=7bce22662719ad70fac7e6f5acf913c14965d47e'/>
<id>7bce22662719ad70fac7e6f5acf913c14965d47e</id>
<content type='text'>
* Searching by categories

* Fix mistake

---------

Co-authored-by: Salanto &lt;62221668+Salanto@users.noreply.github.com&gt;</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* Searching by categories

* Fix mistake

---------

Co-authored-by: Salanto &lt;62221668+Salanto@users.noreply.github.com&gt;</pre>
</div>
</content>
</entry>
<entry>
<title>Lightly reworked `NetworkManager`, ...</title>
<updated>2024-05-17T17:04:57+00:00</updated>
<author>
<name>TrickyLeifa</name>
<email>date.epoch@gmail.com</email>
</author>
<published>2024-05-17T14:39:30+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/ao2-client/commit/?id=1ef96383c8f7ed136a0e028aef0835b4838b5e95'/>
<id>1ef96383c8f7ed136a0e028aef0835b4838b5e95</id>
<content type='text'>
* Lightly reworked `NetworkManager`
* Added new modules to handle various connection types.
  * TCP
  * WebSocket
* Added general string splitter alias based on Qt version.
* Replaced `lobby_constructed` and `courtroom_constructed`
* Refactored and partially reimplemented the following classes:
  * `AOBlipPlayer`
  * `AOEmotePreview`
  * `AOMusicPlayer`
  * `AOSfxPlayer`
  * `AOTextArea`
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* Lightly reworked `NetworkManager`
* Added new modules to handle various connection types.
  * TCP
  * WebSocket
* Added general string splitter alias based on Qt version.
* Replaced `lobby_constructed` and `courtroom_constructed`
* Refactored and partially reimplemented the following classes:
  * `AOBlipPlayer`
  * `AOEmotePreview`
  * `AOMusicPlayer`
  * `AOSfxPlayer`
  * `AOTextArea`
</pre>
</div>
</content>
</entry>
<entry>
<title>Reimplemented favorite server widget, ...</title>
<updated>2024-05-16T01:09:21+00:00</updated>
<author>
<name>TrickyLeifa</name>
<email>date.epoch@gmail.com</email>
</author>
<published>2024-05-16T01:09:21+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/ao2-client/commit/?id=39e4354b1dae5d8487ea5b84be9f304b1950a61a'/>
<id>39e4354b1dae5d8487ea5b84be9f304b1950a61a</id>
<content type='text'>
* Reworked favorite server widget
* Renamed `server_type` to `ServerInfo`
* Renamed `connection_type` to `ServerConnectionType`
* Refactored `AOCharButton`
* Reimplemented `AOButton`
* Partially reimplemented `AOEmoteButton`
* Refactored `AOEvidenceButton`
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* Reworked favorite server widget
* Renamed `server_type` to `ServerInfo`
* Renamed `connection_type` to `ServerConnectionType`
* Refactored `AOCharButton`
* Reimplemented `AOButton`
* Partially reimplemented `AOEmoteButton`
* Refactored `AOEvidenceButton`
</pre>
</div>
</content>
</entry>
<entry>
<title>Ported to CMake, ...</title>
<updated>2024-05-14T22:04:16+00:00</updated>
<author>
<name>TrickyLeifa</name>
<email>date.epoch@gmail.com</email>
</author>
<published>2024-05-14T22:00:17+00:00</published>
<link rel='alternate' type='text/html' href='https://git.sof.beauty/ao2-client/commit/?id=c9f52b7223685d2e7fca925594171f94dd8c6e3b'/>
<id>c9f52b7223685d2e7fca925594171f94dd8c6e3b</id>
<content type='text'>
* Ported the project to CMake
  * Android and Mac support dropped for the time
being.
  * Tests, BASS and Discord-RPC are now options
* Restructured and reformated the project.
  * Merged `include` and `src`
  * Renamed `resource` to `data`
  * Renamed various files
  * External libraries headers are no longer included in `src`
  * Replaced header guards with #pragma once
  * Multiple refactors (keywords, headers)
  * Added Qt6 compatibility
* Removed various unused functions and headers
* Reworked AOPacket
  * When content is passed to AOPacket, it should be ensured that the content is already decoded.
  * Encoding/decoding are now static methods.
* Fixed various memory leaks
* Removed animation code for AOImage
  * AOImage is always using static images
* Simplified ChatLogPiece
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* Ported the project to CMake
  * Android and Mac support dropped for the time
being.
  * Tests, BASS and Discord-RPC are now options
* Restructured and reformated the project.
  * Merged `include` and `src`
  * Renamed `resource` to `data`
  * Renamed various files
  * External libraries headers are no longer included in `src`
  * Replaced header guards with #pragma once
  * Multiple refactors (keywords, headers)
  * Added Qt6 compatibility
* Removed various unused functions and headers
* Reworked AOPacket
  * When content is passed to AOPacket, it should be ensured that the content is already decoded.
  * Encoding/decoding are now static methods.
* Fixed various memory leaks
* Removed animation code for AOImage
  * AOImage is always using static images
* Simplified ChatLogPiece
</pre>
</div>
</content>
</entry>
</feed>
