Purpose
Alt-click a learned skill to paste a skill hyperlink into chat. Clicking the link opens a tooltip with the skill name, grade, level requirements and the sender's effect-description text. This is a client integration, not a server-authoritative inspection of another character's skills.

M2City r1 corrections
Added the GetSkillLink native method-table registration omitted by the original instructions. Preserved SkillToolTip's default width when adding the pickable option. The native function validates the skill slot/level/grade, handles a missing affect description, bounds output and strips control/link delimiters from names/descriptions. Unlearned skills return an empty link; the Python UI only pastes a nonempty result.
The receiving tooltip now rejects malformed, oversized, unknown-skill and out-of-range data before calling rendering methods. It rejects embedded markup/control characters, clears previous lines before displaying a new link and hides stale content after invalid input. Interface cleanup hides the tooltip and resets its reference.

Merge requirements
Apply the six reviewed source/Python instruction files together: feature definition/export, native function and method registration, interface lifecycle, Alt-click and tooltip class. Preserve the rest of each existing class constructor. Confirm CPythonPlayer::SKILL_MAX_NUM denotes your skill slot capacity and ToolTip accepts isPickable; adapt those names/signatures to the actual fork if necessary. The reviewed limits assume legacy skill levels 1–40 and grades 0–3. Custom skill systems must change the matching limits on both sides.
Descriptions originate in chat and are display-only. Do not use them to grant buffs, calculate damage, validate purchases or enforce permissions. No server packet or authoritative character-state system is supplied. Existing client chat-size limits may prevent a very long skill link from being sent; verify locale lengths in staging.

Validation and attribution
All six supplied text fragments were read. The revised native function compiled against fake player/skill/Python interfaces and passed boundary, null, delimiter and long-text cases. Fake-tooltip tests covered malformed links, unknown skills, repeated display cleanup and 100 refreshes. These are isolated tests, not a complete Metin2 client build or in-game test. No matching public upstream release or original author was independently established; no authorship was invented. Original archive is preserved; apply reviewed/ and retain any upstream notices.

Editorial resource — M2City
Version: Owner-supplied legacy integration; M2City r1 (2026-11-04); exact fork unspecified
Rights: Owner explicitly confirmed public redistribution. Preserve original notices; no open-source relicensing.
Validation: Revised native hyperlink function compiled with fake player/skill/Python interfaces; valid, empty, invalid slot, level/grade, null description, delimiter removal and long text cases passed. Fake Python tooltip rejected malformed/unknown/control/oversized links and cleared repeated display state (100 repeats). Full game/client/locale not built.
Source: Owner-supplied archive, reviewed files and retained notices; exact upstream release not established
SHA-256: 2e9c35ada550aaef72d56573d0ca386a5693fb1e89262390890921d26ab1e96f