Jump to content

[M2Dev] Advanced Files To Build Your Server: Src & Server Files & Client [x64 / DX9Ex / CMake / Python3.14 / FreeType / XChaCha20-Poly1305]


Recommended Posts

  • Active+ Member

I know y'all love it when I say that!

New PRs submitted!

And here's what's new (it's gonna be a long one, grab your coffee/cereal/whatever and let's get started):

The missing dungeon is now a part of these files! The MR-8 update brings you a fully official-like and tested Nemere's Watchtower! (along with some minor fixes)

The minor fixes:

  • Fixed a bug where CHARACTER::CanUseHorseSkill() was checking the horse skill grade to be exactly 3 (Grand Master) instead of >= 3. Small bug not many GMs set their horse level to P but for whatever it's worth, it's fixed 😉
  • Flame Ghost now does damage to nearby enemies while the character is riding, if their horse skill is above Level 10.
  • Fixed "when login begin" being loaded before character affects, more in this post:
  • Fixed a hideous bug where chests would replace experience points with Experience Ring and Gold with a Gold-iconed item that wouldn't give anything, a small fix inside game/item_manager_read_tables.cpp and special_item_group.txt.
    • "exp" works perfectly without changes
    • "elk" is now the word for Gold inside special_item_group.txt, this is the one you want to use to make a chest give out Gold.
    • All existing instances have been replaced in the new patch
  • Frostbeard monster is now synched with the client and doesn't just stand there, he runs, attacks, he can have a life (until a player takes it xD). This is a bug fix because almost everything Nemere-related already existed in the client and the server, all that was missing was the quest and the translations
  • Szel group has been added (critical for Nemere stage 4 wave 2 to work properly)
  • Missing items/mobs/item descriptions/icons/etc... have been added to both client side and server side, all translations included (some translations are incomplete, search for English-translated item/mob names, translation and locale keys to help make this dungeon truly amazing!)
  • Fixed item drops for Razador boss and added drops for Nemere boss, completely official-like. Drops are a work in progress and you should expect further patches down the road.
  • Removed effect support for semi-transparent meshes, apparently semi-transparent effects had some sort of artifacts around them
  • Improved Snow Mountain and Snow Dungeon maps, terrains and environments directly from the official files to look and feel nice and walkable xD

 

Nemere's Watchtower:

The dungeon behaves exactly like the official one and it's almost fully translated in all languages (some translations are incomplete, search for English-translated item/mob names, translation and locale keys to help make this dungeon truly amazing!)

Huge shoutout to @ iThunder for the initial quest script! 🙏

Gameplay

Entry:

  • The dungeon has a 4-hour cooldown
  • A Passage Ticket (71095) is required by all members in order to enter
  • Only the leader can request access or/and start the dungeon once inside from the Ice Lion NPC
  • If the dungeon has started and a player logs out, they have 5 minutes to log back in and request access again, otherwise their 4-hour cooltime starts
  • If the dungeon has started and a team member hasn't joined yet for the first time, they have 5 minutes to do so, otherwise they are locked out of the dungeon for this run.
  • If the dungeon hasn't started yet, both late entries and re-entries require the leader to relog and request access again for the team member to (re)enter.
  • The 5-minute cooldown is atomic and is not affected by other members' cooldown times.
  • The 5-minute timer for re-entry is different than the one for late entries (when applies).
  • Players cannot ride in the dungeon. The leader and all members must not be riding in order for the NPC to teleport them into the dungeon.
  • At least one Ninja and one Dragon Shaman is required to exist in the team in order to enter.
  • All members must be at least Level 100
  • If the leader relogs while the dungeon is active, they have 5 minutes to get back in, otherwise the dungeon ends for everyone.
  • If everyone logs out while the dungeon is active, the dungeon ends immediately for everyone.

Ticker consumption policy:

  • Initial entry does not consume tickets from the group members. Tickets are being consumed once the leader starts the dungeon.
  • Entry automatically consumes tickets for late entries
  • No additional tickets are being consumed by re-entries
  • The Ice Land Guardian always checks for tickets, except when it comes to re-entries

Gameplay (Stages):

  1. The leader of the group must talk to Ice Lion to start the dungeon. After that, clear the room.
  2. Players must search for the correct Frost Key (20% chance). The key can only be used by a Shaman.
  3. Clear the room.
  4. Dual-wave:
    • Clear the room.
    • Clear the room again. This time the Szel group appears. The monsters in this group are immune to damage unless the attacker has the Blessing buff (HOSIN). More about conditional damage immunity below ⬇️
  5. Players must drop North Star keys in order to unlock the 5 Arctic Cubes. The order is random and if the player tries to activate the wrong one, the Star is consumed. Drop chance: 1%.
  6. Clear the room. When that happens, the Metin of Cold will fall. The Metin of Cold is immune to damage unless the attacker is a Shaman. More about conditional damage immunity below ⬇️
  7. Find and defeat the real Szel. There are 4 Szel, 3 are fake. All Szel's are immune to damage unless the attacker has the Dragon's Aid buff (GICHEON). More about conditional damage immunity below ⬇️
  8. Find and activate the correct Frostflower Key (20% chance of success). The key can only be dropped by a NInja and can only be used by a Ninja or a Shaman.
  9. Defeat the North Dragon Pillar. The enemy is immune to damage unless the attacker is either a Ninja or a Shaman (multi-conditional). More about conditional damage immunity below ⬇️. When the Pillar is defeated, the leader of the group must talk to the Ice Lion to request access to Nemere's throne room.
  10. Defeat Nemere and get out... DUUUUHHH! xD All players will be teleported outside automatically 60 seconds after Nemere dies.

Additional info:

  • The group has 1 hour to complete the dungeon before it automatically closes. The time starts from the moment the leader activates the dungeon from Ice Lion in stage 1, not from the moment of entry
  • Reminders for 45, 30, 15 and 5 minutes are in place.
  • ⭐ GM Convenience: An option is available for GMs only in Ice Land Guardian to reset all dungeon related timers including the 4-hour cooldown. If the GM is in a team, the timers for every member of the team are being reset
  • ⭐ GM Convenience: Stage selector. GM characters can teleport to any stage they wish, if they teleport to stage 2 or above, the dungeon auto-starts and continues normally as they go through the challenges with their team. Chats and notifications may need work, same conditions apply as normal entry, made to be used for debugging.

Techy stuff/Misc:

  • Anti-riding guards have been placed in the source and horse_summon/ride.quest files. The player cannot be teleported inside the dungeon while riding but even if they do, the source will automatically dismount them and block them from riding/equipping seals/calling their horse as long as the player is in the dungeon. The locale_string and translate_lua message is custom, please translate it to your language.
  • Nemere has been added to the list of bosses that can be targeted in the Level 90 Collect quest
  • Nemere's drops have been added to mob_drop_item.txt
  • Razador and Nemere's chests have been added to special_item_group.txt

The fun part:

I experimented a lot to achieve true per-hit conditional damage immunity and offer it to you in this update. I tried a lot of different methods and I may came down to 1 or 2 but I thought "why not leave everything in, y'all may find it useful".

What is conditional immunity?

The ability to render a mob/group of mobs immune to damage unless one or more conditions are met (e.g., can only be hit by a Warrior).
No conditions is also available.
Multiple conditions is also available.

While a monster is immune to damage, it cannot be poisoned, burned, stunned or slowed. If a condition stops being valid, any previous debuffs continue to apply normally, but the monster cannot get new debuffs until the conditions are met again.

True per-hit: Works in the source. Hits are being verified as they happen. The monster only receives damage from the players that meet the conditions to damage it no matter how many non-compatible players are hitting along and updates in real time. If the condition is a buff, the monster begins taking hits once the buff is applied, even if the attacker was not buffed and was hitting. Equivalent response when the attacker hits and the buff ends.

These are new functions in both C++ and Lua environments. They are copies of the original ones but with something extra. Functions are designed to give Lua total control and none of the stress. Here are the exposed functions:

  • d.regen_file_with_immunity: Uses CDungeon::SpawnRegenWithImmunity, a modified version of the default SpawnRegen with the ability to spawn all the monsters from a txt file with immunity embedded from the start and active condition(s) in place. This is the safest method to spawn monsters from a regen file with a "by-default" immunity behavior because there is no delay of spawining a regular monster and adding the immunity later (more about this one below)

  • d.regen_file_with_vids: Same as d.regen_file_with_immunity, it uses CDungeon::SpawnRegenWithVIDs to return all the monster VIDs to Lua for further manipulation after spawning them from the regen file. For now, adding/checking/removing conditional immunity requires the monster's VID, but for the creative minds, having the monster's VID in Lua opens up a whole new world of possibilities for custom quests 😉

  • d.spawn_group_with_immunity: Same as d.regen_file_with_immunity, but for simple group of monsters using the group ID from group.txt. Uses the new CDungeon::SpawnGroupWithImmunity to spawn all the monsters of the group with immunity/conditional immunity to damage.

  • d.spawn_group_with_vids: Same as d.regen_file_with_vids, but for simple group of monsters using the group ID from group.txt. Uses the new CDungeon::SpawnGroupWithVIDs to spawn all the monsters of the group normally and return their VIDs back to Lua to be used however you want.

  • d.spawn_mob_with_immunity: Same as d.regen_group_with_immunity, for single monster instances using their vnum.

  • npc.add_damage_immunity_condition: Add damage immunity with condition(s) to a regular monster using its VID

  • npc.clear_damage_immunity_conditions: Clears a single monster from damage immunity conditions, making it truly immune to everything until a condition is added manually.

  • npc.is_damage_immune: Check if a monster is immune to damage using its VID. Can be used in booleans and if statements.

  • npc.set_damage_immunity: Can be used to turn on/off a monster's immunity to damage.

  • npc.set_damage_immunity_with_conditions: Turns damage immunity on to a monster via its VID, auto-clears any pre-existing conditions and applies the specified condition(s) for breaking the immunity.

 

Damage immunity conditions: where to find them, how they look like, and are they single???

In char.h look for this:

Spoiler
	public:
		enum EDamageImmunityConditionType
		{
			DAMAGE_IMMUNITY_COND_AFFECT = 0,           // Has affect
			DAMAGE_IMMUNITY_COND_LEVEL_MIN = 1,        // Level >= value
			DAMAGE_IMMUNITY_COND_LEVEL_MAX = 2,        // Level <= value
			DAMAGE_IMMUNITY_COND_QUEST_FLAG = 3,       // Quest flag == value
			DAMAGE_IMMUNITY_COND_ITEM_EQUIPPED = 4,    // Has item vnum equipped
			DAMAGE_IMMUNITY_COND_EMPIRE = 5,           // Is specific empire
			DAMAGE_IMMUNITY_COND_JOB = 6,              // Is specific job
		};

 

These are the pre-existing ones, thought I leave them and push them so y'all can have an example. Feel free to add/modify/remove (note that 0 and 6 are required for Snow Dungeon to work!)

 

The Bad Side 😞

There was one or to bugs that I couldn't solve. I posted and asked but received no answers. The first and most important bug is the "when login begin" bug. Explanation:

This is a source bug, not a Lua bug (I've tested).

Go in a dungeon that has when login/logout begin blocks and enter. Relog and request access again. When you go back inside the dungeon you will notice that the affect from skills only are not visible. Other affects work normally. Skills also work normally. Also you will notice that messages such as "I cannot use this Skill yet." do not appear above the character's head. Outside the dungeon everything works normally, as well as the first time entering the dungeon.

This bug survives relogs, server restarts, quest flag resets, pretty much anything except when time passes naturally (after 4 hours everything works normally again until the first, sometimes second relog)

The reason that I mention this bug is because I have no idea what it's about, where to look, no specific keywords that can help me start digging and obviously no experience, plus I tested everything I shared in this PR and it would be awesome if we could fix this too.

My theory is that it has something to do with Entergame or PHASE_GAME behaving differently when the spawn map is a dungeon but like I said, it's just a theory I so far couldn't prove.

This was one of the reasons this PR took so long but hey, at least everything else works amazingly! 😄

Also if someone is experienced with maps and terrains it would be very cool if we added the blue atmosphere in the dungeon like the official. I copied everything but it was never added, still I have hopes, I added the red atmosphere in Fireland by accident 2 or 3 PRs ago so this may be close 🙂

Hope you find this update useful and I would love to see what you come up with the new Lua functions! And as always thank you for your support in this project and any help is deeply appreciated in advanced! 🙏

Edited by Mind Rapist
  • Love 2
8 hours ago, Mind Rapist said:

Hey dude go to the server project in share/conf and you will find item/mob_names/proto.txt there. The default is English so if you only wanna make one item/mob_proto files for the client and not in English rename item/mob_names into item/mob_names_en.txt and then rename your desired names_<lang> into item/mob_names.txt

Hope this helped

Tell me, are these files generated automatically or are they simply 

  • Active+ Member
2 minutes ago, Sz3cA said:

Tell me, are these files generated automatically or are they simply 

Just paste the txt files in the same folder as dump_proto.exe and double click the dump_proto.exe it should generate the protos for you

2 minutes ago, Mind Rapist said:

Just paste the txt files in the same folder as dump_proto.exe and double click the dump_proto.exe it should generate the protos for you

What I mean is, if I take them from there, will they regenerate themselves?

  • Active+ Member
1 minute ago, Sz3cA said:

What I mean is, if I take them from there, will they regenerate themselves?

I don't follow

  • Active+ Member
1 minute ago, Sz3cA said:

Tell me, when adding a new weapon, mob, or mount, do I need to edit the database or the txt files? 

txt bro they take care of everything just make sure you compile the client protos and you are set

  • Love 1
  • Active+ Member

A whole bunch of new PRs have been MERGED for all projects!

 

  • Nemere dungeon fully implemented (fixes for bugs mentioned still in progress)
  • Guild mark uploader fixed
  • Guild creation bug fixed
  • Item and mob names (including NPCs) are loaded from the client's selected locale
  • Movement speed calculations have been refactored in the serverside
  • Localization fix for Skill Doctrine
  • Bug fixes for Subquest 6
  • New quest for level 7 fixes
  • New line fixes for pre_qc.py and make.py
  • Added database importing script for first-time installations of the server side (adding user with permissions and creating tables)
  • Guild mark cooldown reduced to 1 second
  • Letter autoremove fix
  • BGM debug error fixed
  • Unicode support improved significantly
  • Mark window lag spike fixed
  • Tooltip width refactored
  • Fixed python shutdown errors
  • Improved login screen
  • MSM files got their own folder
  • Belt viewing hierarchy against other windows fixed

 

Amazing things are on the way! Till then, pull updates and keep on devving!

  • Love 7

 


game_auth starts but never listens on port 11000 (no LISTEN socket, no logs)

 

 

Hello everyone,

I’m currently setting up m2dev clean server files on Ubuntu 24.04 (ARM / Raspberry Pi) and I’m stuck with a silent game_auth issue.

Environment

OS: Ubuntu 24.04 (aarch64, Raspberry Pi)

MariaDB: 10.11

Server files: m2dev-server

Server sources: m2dev-server-src

Branch / commit: main @ 75595bed81c80fcbfd9b492aa6020f1525972c6f

Problem

game_auth starts and stays running, but:

It does NOT open port 11000

ss -lntp shows no LISTEN socket

No logs, no stdout, no crash

Start scripts work and all processes stay alive

Evidence

pids.json shows auth, db, and all channel cores running

db listens on 127.0.0.1:15000

mariadbd listens on 3306

game_auth PID exists but no TCP socket is bound

Example:

ps aux | grep game_auth root 40419 ... ./game_auth ss -lntp | grep 11000 # no output

What I already verified

CONFIG in channels/auth:

HOSTNAME: auth CHANNEL: 1 PORT: 11000 P2P_PORT: 12000

share/data/package exists

data symlink exists in:

channels/auth

all channel cores

Firewall is disabled (ufw inactive)

Running ./game_auth -p 11000 changes nothing

strings game_auth shows bind, listen, socket, etc.

No error messages at all

 

Edited by oxy131
  • kekw 1
  • Active+ Member
32 minutes ago, oxy131 said:

 


game_auth starts but never listens on port 11000 (no LISTEN socket, no logs)

 

 

Hello everyone,

I’m currently setting up m2dev clean server files on Ubuntu 24.04 (ARM / Raspberry Pi) and I’m stuck with a silent game_auth issue.

Environment

OS: Ubuntu 24.04 (aarch64, Raspberry Pi)

MariaDB: 10.11

Server files: m2dev-server

Server sources: m2dev-server-src

Branch / commit: main @ 75595bed81c80fcbfd9b492aa6020f1525972c6f

Problem

game_auth starts and stays running, but:

It does NOT open port 11000

ss -lntp shows no LISTEN socket

No logs, no stdout, no crash

Start scripts work and all processes stay alive

Evidence

pids.json shows auth, db, and all channel cores running

db listens on 127.0.0.1:15000

mariadbd listens on 3306

game_auth PID exists but no TCP socket is bound

Example:

ps aux | grep game_auth root 40419 ... ./game_auth ss -lntp | grep 11000 # no output

What I already verified

CONFIG in channels/auth:

HOSTNAME: auth CHANNEL: 1 PORT: 11000 P2P_PORT: 12000

share/data/package exists

data symlink exists in:

channels/auth

all channel cores

Firewall is disabled (ufw inactive)

Running ./game_auth -p 11000 changes nothing

strings game_auth shows bind, listen, socket, etc.

No error messages at all

 

Metin2 server was never designed to run in linux flavors other than FreeBSD and the implementation for other Linux OS support in these files is extremely new and experimental. That said, if auth doesn't use port 11000 which process is using it???

Thanks for the clarification, I understand that Linux (especially non-FreeBSD) support is still experimental.

To answer your question: no process is using port 11000 at all.

I’ve verified this multiple times using ss, netstat, and lsof.

Example:

ss -lntp | grep 11000 # no output

At the same time, the game_auth process is running and stays alive:

ps aux | grep game_auth # shows PID, no crash

So the situation is:

game_auth starts successfully

it does not crash

but it never reaches a bind() / listen() call for port 11000

and no other process is occupying that port

Other services behave normally:

db listens on 127.0.0.1:15000

mariadbd listens on 3306

SSH and system services bind correctly

This is why I suspect one of the following:

the auth socket initialization path is not reached on Linux

or the binary was built without the correct AUTH server code path

or there is a Linux-specific early return before socket bind (possibly filesystem / locale / data dependency related)

If you have any insight into:

where exactly game_auth binds its socket in the code

or which runtime condition would silently prevent binding on Linux

or which CMake target definitively produces a fully functional auth binary

that would help a lot.

Thanks for taking the time to respond.

Hello,

Firstly, Thank you for sharing this. 

But, i have this issue on my both setups (tried one got the error, tried a fresh setup and got the same error as initial one). My whole game resets to minute 0 when i launch the server. If i create an account an do stuff in game. it resets to the stage when i started the last server (like idk how to explain this... but i'll try my best) lets say on start1 i started on blue village1 and i left my character at desert. stop start. on start2 i start at blue village1 and go to valley. stop start. i start at desert(idk how). somehow my inventory is correctly sync but my gold and location is not synced??? i dont even know what is going on i cant really solve this. 

Note: I installed this on w11 my personal machine on a folder named c:/metin2, tried mariadb and mysql both, different attempts. and vs 2026 if that matters. 

 

Edited by auroragxdamnnn
i forgot to add specs of tools
  • Active+ Member
26 minutes ago, auroragxdamnnn said:

Hello,

Firstly, Thank you for sharing this. 

But, i have this issue on my both setups (tried one got the error, tried a fresh setup and got the same error as initial one). My whole game resets to minute 0 when i launch the server. If i create an account an do stuff in game. it resets to the stage when i started the last server (like idk how to explain this... but i'll try my best) lets say on start1 i started on blue village1 and i left my character at desert. stop start. on start2 i start at blue village1 and go to valley. stop start. i start at desert(idk how). somehow my inventory is correctly sync but my gold and location is not synced??? i dont even know what is going on i cant really solve this. 

Note: I installed this on w11 my personal machine on a folder named c:/metin2, tried mariadb and mysql both, different attempts. and vs 2026 if that matters. 

 

Either you touched the source to its naughty place and it didn't like it or your mysql doesn't save for some reason, bottom line is nobody can tell you more about it without a server/db syserr... Start by making sure that you have the right settings in my.cnf (BIND_ADDRESS, NO_ENGINE_SUBSTITUTION) as the instructions say within the share/sql folder.

7 minutes ago, Mind Rapist said:

nobody can tell you more about it without a server/db syserr...

\server\channels\db

[2026-01-27 19:15:27.045] [error] [int __cdecl Start(void)()] TABLE_POSTFIX not configured use default
[2026-01-27 19:20:20.407] [error] [int __cdecl socket_read(unsigned __int64,char *,unsigned __int64)()] about to lose connection
[2026-01-27 19:20:20.407] [error] [int __cdecl CPeerBase::Recv(void)()] socket_read failed No such file or directory
[2026-01-27 19:20:20.407] [error] [int __cdecl CClientManager::Process(void)()] Recv failed
[2026-01-27 19:20:20.765] [error] [int __cdecl socket_read(unsigned __int64,char *,unsigned __int64)()] about to lose connection
[2026-01-27 19:20:20.765] [error] [int __cdecl CPeerBase::Recv(void)()] socket_read failed No such file or directory
[2026-01-27 19:20:20.765] [error] [int __cdecl CClientManager::Process(void)()] Recv failed
[2026-01-27 19:20:21.093] [error] [int __cdecl socket_read(unsigned __int64,char *,unsigned __int64)()] about to lose connection
[2026-01-27 19:20:21.093] [error] [int __cdecl CPeerBase::Recv(void)()] socket_read failed No such file or directory
[2026-01-27 19:20:21.093] [error] [int __cdecl CClientManager::Process(void)()] Recv failed
[2026-01-27 19:20:21.453] [error] [int __cdecl socket_read(unsigned __int64,char *,unsigned __int64)()] about to lose connection
[2026-01-27 19:20:21.453] [error] [int __cdecl CPeerBase::Recv(void)()] socket_read failed No such file or directory
[2026-01-27 19:20:21.453] [error] [int __cdecl CClientManager::Process(void)()] Recv failed
[2026-01-27 19:20:21.799] [error] [int __cdecl socket_read(unsigned __int64,char *,unsigned __int64)()] about to lose connection
[2026-01-27 19:20:21.799] [error] [int __cdecl CPeerBase::Recv(void)()] socket_read failed No such file or directory
[2026-01-27 19:20:21.799] [error] [int __cdecl CClientManager::Process(void)()] Recv failed

server\channels\auth\syserr.log
[2026-01-27 19:15:28.159] [error] [int __cdecl main(int,char **)()] Failed to Load ClientPackageCryptInfo File(package/)

server\channels\channel1\core1\syserr.log
[2026-01-27 19:15:29.261] [error] [int __cdecl main(int,char **)()] Failed to Load ClientPackageCryptInfo File(package/)

I think it was the first file you wanted me to post but i couldn't be sure. And i didn't touch the source file except adding a line for auth to see pwd's from db and client (becuase i had some issues with logging in and wanted to see what db returns and my hashed pwd's are. it turns out my DB connection was messed up, i solved it later and didnt remove the logging for pwd's)

  • Active+ Member
12 minutes ago, auroragxdamnnn said:
[error] [int __cdecl main(int,char **)()] Failed to Load ClientPackageCryptInfo File(package/)

You need to add an empty "package" folder in share/ and symlink it inside every channel core including auth and channel99/core1.

Edited by Mind Rapist
14 minutes ago, Mind Rapist said:

You need to add an empty "package" folder in share/ and symlink it inside every channel core including auth and channel99/core1.

Ok, did that and got rid of most of the errors besied this 

27 minutes ago, auroragxdamnnn said:
[2026-01-27 19:15:27.045] [error] [int __cdecl Start(void)()] TABLE_POSTFIX not configured use default

but, still this DB mismatch or whatever we can call this persists, my changes are not saved between different starts. And did i miss the part where i need to create shared/package folder or it was missing somehow?

  • Active+ Member
1 hour ago, auroragxdamnnn said:

Ok, did that and got rid of most of the errors besied this 

but, still this DB mismatch or whatever we can call this persists, my changes are not saved between different starts. And did i miss the part where i need to create shared/package folder or it was missing somehow?

Ok first of all your table postfix is just a warning everyone has it because nobody uses postfixes for their DB tables. And secondly the install.py script should automatically install package if ran on a FreeBSD environment. If you tried to run the install.py in a Windows environment we have disabled the creation and linking of the package folder as some Windows users had issues with it.

To make your install.py create and link package in Windows edit the script:

Search for "package" as the keyword

Find above it a line that says something like "if os.name != "nt":" (may be "== "nt" so be careful, it's only 2 instances anyway") and delete that line. MIND THE TABULATION AFTER REMOVING THE LINE!

Hope this helps

After a week, the server is finally running, but now I have the problem that the client keeps crashing. Does anyone know what I need to do? These are the logs from the client.
 

0203 00:57:34232 :: PackInitialize: Loading root.pck...0203 00:57:34237 :: PackInitialize: Loading 88 pack files in parallel...0203 00:57:35133 :: PackInitialize: Completed! Failed: 0 / 880203 00:57:00007 :: 
0203 00:57:00008 :: ## Network - OffLine Phase ##
0203 00:57:00008 :: 
0203 00:57:00058 :: importing from pack debugInfo
0203 00:57:00059 :: importing from pack localeInfo
0203 00:57:00067 :: importing from pack constInfo
0203 00:57:00250 :: SYSERR:          By TMP4(#2    ) cannot find icon file. setting to default.
0203 00:57:00257 :: SYSERR:  Bright Shield+0(#13180) cannot find icon file. setting to default.
0203 00:57:00257 :: SYSERR:  Bright Shield+1(#13181) cannot find icon file. setting to default.
0203 00:57:00259 :: SYSERR:  Bright Shield+2(#13182) cannot find icon file. setting to default.
0203 00:57:00259 :: SYSERR:  Bright Shield+3(#13183) cannot find icon file. setting to default.
0203 00:57:00259 :: SYSERR:  Bright Shield+4(#13184) cannot find icon file. setting to default.
0203 00:57:00259 :: SYSERR:  Bright Shield+5(#13185) cannot find icon file. setting to default.
0203 00:57:00259 :: SYSERR:  Bright Shield+6(#13186) cannot find icon file. setting to default.
0203 00:57:00259 :: SYSERR:  Bright Shield+7(#13187) cannot find icon file. setting to default.
0203 00:57:00260 :: SYSERR:  Bright Shield+8(#13188) cannot find icon file. setting to default.
0203 00:57:00260 :: SYSERR:  Bright Shield+9(#13189) cannot find icon file. setting to default.
0203 00:57:00268 :: SYSERR:            Paper(#22020) cannot find icon file. setting to default.
0203 00:57:00268 :: SYSERR:  Teleport Scroll(#22030) cannot find icon file. setting to default.
0203 00:57:00268 :: SYSERR:      Life Scroll(#22040) cannot find icon file. setting to default.
0203 00:57:00268 :: SYSERR: Incarnation Scroll(#22050) cannot find icon file. setting to default.
0203 00:57:00271 :: SYSERR:          Scallop(#29001) cannot find icon file. setting to default.
0203 00:57:00271 :: SYSERR:     Blue Scallop(#29002) cannot find icon file. setting to default.
0203 00:57:00271 :: SYSERR:   Yellow Scallop(#29003) cannot find icon file. setting to default.
0203 00:57:00271 :: SYSERR:      Red Scallop(#29004) cannot find icon file. setting to default.
0203 00:57:00272 :: SYSERR:    Green Scallop(#29005) cannot find icon file. setting to default.
0203 00:57:00273 :: SYSERR:    Yellow Tartar(#29006) cannot find icon file. setting to default.
0203 00:57:00275 :: SYSERR:      Blue Tartar(#29007) cannot find icon file. setting to default.
0203 00:57:00276 :: SYSERR:  Blue Holy Water(#29008) cannot find icon file. setting to default.
0203 00:57:00276 :: SYSERR: Yellow Holy Water(#29009) cannot find icon file. setting to default.
0203 00:57:00276 :: SYSERR:   Red Holy Water(#29010) cannot find icon file. setting to default.
0203 00:57:00276 :: SYSERR: Green Holy Water(#29011) cannot find icon file. setting to default.
0203 00:57:00277 :: SYSERR: Dark Blue Hand of God(#29012) cannot find icon file. setting to default.
0203 00:57:00277 :: SYSERR: Dark Yellow Hand of God(#29013) cannot find icon file. setting to default.
0203 00:57:00277 :: SYSERR: Magenta Hand of God(#29014) cannot find icon file. setting to default.
0203 00:57:00277 :: SYSERR: Dark Green Hand of God(#29015) cannot find icon file. setting to default.
0203 00:57:00278 :: SYSERR: Golden Orc Tooth(#30103) cannot find icon file. setting to default.
0203 00:57:00278 :: SYSERR: Desert Spider Web(#30104) cannot find icon file. setting to default.
0203 00:57:00278 :: SYSERR: Medicine for Yu-Rang(#30106) cannot find icon file. setting to default.
0203 00:57:00278 :: SYSERR:         Orc Fang(#30107) cannot find icon file. setting to default.
0203 00:57:00279 :: SYSERR:   Ceramic Enamel(#30108) cannot find icon file. setting to default.
0203 00:57:00279 :: SYSERR: Desert Spider Web(#30109) cannot find icon file. setting to default.
0203 00:57:00279 :: SYSERR: Letter from Huahn-So(#30110) cannot find icon file. setting to default.
0203 00:57:00279 :: SYSERR: Stinger Scorpion Tail(#30111) cannot find icon file. setting to default.
0203 00:57:00279 :: SYSERR: Esoteric Scripture(#30113) cannot find icon file. setting to default.
0203 00:57:00279 :: SYSERR:           Plague(#30114) cannot find icon file. setting to default.
0203 00:57:00280 :: SYSERR:      Plague Cure(#30115) cannot find icon file. setting to default.
0203 00:57:00280 :: SYSERR: Demon's Jewellery Box(#30118) cannot find icon file. setting to default.
0203 00:57:00282 :: SYSERR:      VIP-Feature(#38001) cannot find icon file. setting to default.
0203 00:57:00282 :: SYSERR: Tombola_ticket_today(#38002) cannot find icon file. setting to default.
0203 00:57:00282 :: SYSERR: Tombola_ticket_tomorrow(#38003) cannot find icon file. setting to default.
0203 00:57:00285 :: SYSERR:   Tombola_reroll(#38004) cannot find icon file. setting to default.
0203 00:57:00285 :: SYSERR:   TombolaPP_spin(#38005) cannot find icon file. setting to default.
0203 00:57:00286 :: SYSERR:      Momo-Reroll(#38006) cannot find icon file. setting to default.
0203 00:57:00286 :: SYSERR:    Sounding Bell(#40005) cannot find icon file. setting to default.
0203 00:57:00286 :: SYSERR: Savage Delivery Receipt(#40006) cannot find icon file. setting to default.
0203 00:57:00286 :: SYSERR: Letter from Savage Boss(#40007) cannot find icon file. setting to default.
0203 00:57:00288 :: SYSERR: Azrael's Armour+ (m)(#41317) cannot find icon file. setting to default.
0203 00:57:00289 :: SYSERR: Azrael's Armour+ (f)(#41318) cannot find icon file. setting to default.
0203 00:57:00289 :: SYSERR:     Èæ»ç°©(#41319) cannot find icon file. setting to default.
0203 00:57:00290 :: SYSERR:      Gift Parcel(#50041) cannot find icon file. setting to default.
0203 00:57:00290 :: SYSERR:    Riding Manual(#50062) cannot find icon file. setting to default.
0203 00:57:00291 :: SYSERR:      Lilac Juice(#50805) cannot find icon file. setting to default.
0203 00:57:00291 :: SYSERR: Tue Fungal Resin(#50806) cannot find icon file. setting to default.
0203 00:57:00292 :: SYSERR: Alpine Rose Juice(#50807) cannot find icon file. setting to default.
0203 00:57:00292 :: SYSERR:   Mulberry Juice(#50808) cannot find icon file. setting to default.
0203 00:57:00292 :: SYSERR:  Dandelion Juice(#50809) cannot find icon file. setting to default.
0203 00:57:00292 :: SYSERR:    Thistle Juice(#50810) cannot find icon file. setting to default.
0203 00:57:00292 :: SYSERR:     Date Extract(#50811) cannot find icon file. setting to default.
0203 00:57:00293 :: SYSERR: Juice of Sam-Zi Plant(#50812) cannot find icon file. setting to default.
0203 00:57:00293 :: SYSERR: Recipe for Sim Water(#50905) cannot find icon file. setting to default.
0203 00:57:00293 :: SYSERR: Recipe for Dok Water(#50906) cannot find icon file. setting to default.
0203 00:57:00293 :: SYSERR: Recipe for Bo Water(#50907) cannot find icon file. setting to default.
0203 00:57:00294 :: SYSERR: Recipe for Young Water(#50908) cannot find icon file. setting to default.
0203 00:57:00294 :: SYSERR: Recipe for Zin Water(#50909) cannot find icon file. setting to default.
0203 00:57:00294 :: SYSERR: Recipe for Hwal Water(#50910) cannot find icon file. setting to default.
0203 00:57:00295 :: SYSERR: ³ì°¢ º¸°üÇÔ(#53507) cannot find icon file. setting to default.
0203 00:57:00295 :: SYSERR: ³ì°¢ º¸°üÇÔ(#53508) cannot find icon file. setting to default.
0203 00:57:00295 :: SYSERR: ³ì°¢ º¸°üÇÔ(#53509) cannot find icon file. setting to default.
0203 00:57:00295 :: SYSERR: ³ì°¢ º¸°üÇÔ(#53510) cannot find icon file. setting to default.
0203 00:57:00296 :: SYSERR: ³ì°¢ º¸°üÇÔ(#53511) cannot find icon file. setting to default.
0203 00:57:00296 :: SYSERR: ³ì°¢ º¸°üÇÔ(#53512) cannot find icon file. setting to default.
0203 00:57:00296 :: SYSERR: ³ì°¢ º¸°üÇÔ(#53513) cannot find icon file. setting to default.
0203 00:57:00296 :: SYSERR: ³ì°¢ º¸°üÇÔ(#53514) cannot find icon file. setting to default.
0203 00:57:00296 :: SYSERR: ³ì°¢ º¸°üÇÔ(#53515) cannot find icon file. setting to default.
0203 00:57:00296 :: SYSERR:       Bone Chest(#53516) cannot find icon file. setting to default.
0203 00:57:00297 :: SYSERR:        Jade Cage(#53517) cannot find icon file. setting to default.
0203 00:57:00297 :: SYSERR:            Sutra(#70103) cannot find icon file. setting to default.
0203 00:57:00298 :: SYSERR: Dragon God Support(#71031) cannot find icon file. setting to default.
0203 00:57:00298 :: SYSERR: Spirit Stone Tincture(#71047) cannot find icon file. setting to default.
0203 00:57:00298 :: SYSERR: Tincture of Trade(#71091) cannot find icon file. setting to default.
0203 00:57:00302 :: SYSERR: Lovebird Feather(#72010) cannot find icon file. setting to default.
0203 00:57:00302 :: SYSERR: Lovebird Feather(#72011) cannot find icon file. setting to default.
0203 00:57:00302 :: SYSERR: Lovebird Feather(#72012) cannot find icon file. setting to default.
0203 00:57:00303 :: SYSERR: Magic Copper Ore(#72308) cannot find icon file. setting to default.
0203 00:57:00304 :: SYSERR:      Blank Paper(#80002) cannot find icon file. setting to default.
0203 00:57:00304 :: SYSERR: Empty Water Bottle(#90001) cannot find icon file. setting to default.
0203 00:57:00304 :: SYSERR:     Water Bottle(#90002) cannot find icon file. setting to default.
0203 00:57:00305 :: SYSERR:              Gem(#90004) cannot find icon file. setting to default.
0203 00:57:00305 :: SYSERR:     Spirit Stone(#90006) cannot find icon file. setting to default.
0203 00:57:00305 :: SYSERR:          Mineral(#90007) cannot find icon file. setting to default.
0203 00:57:00353 :: CPythonNonPlayer::LoadNonPlayerData: locale/de/mob_proto, sizeof(TMobTable)=335
0203 00:57:00375 :: CPythonSkill::RegisterSkillTable(locale/common/SkillTable.txt) - NOT EXIST SkillDesc [Vnum:158 Line:56]
0203 00:57:00376 :: CPythonSkill::RegisterSkillTable(locale/common/SkillTable.txt) - NOT EXIST SkillDesc [Vnum:159 Line:57]
0203 00:57:00377 :: CPythonSkill::RegisterSkillTable(locale/common/SkillTable.txt) - NOT EXIST SkillDesc [Vnum:160 Line:58]
0203 00:57:00377 :: CPythonSkill::RegisterSkillTable(locale/common/SkillTable.txt) - NOT EXIST SkillDesc [Vnum:161 Line:59]
0203 00:57:00378 :: CPythonSkill::RegisterSkillTable(locale/common/SkillTable.txt) - NOT EXIST SkillDesc [Vnum:162 Line:60]
0203 00:57:00378 :: CPythonSkill::RegisterSkillTable(locale/common/SkillTable.txt) - NOT EXIST SkillDesc [Vnum:256 Line:61]
0203 00:57:00378 :: CPythonSkill::RegisterSkillTable(locale/common/SkillTable.txt) - NOT EXIST SkillDesc [Vnum:257 Line:62]
0203 00:57:00378 :: CPythonSkill::RegisterSkillTable(locale/common/SkillTable.txt) - NOT EXIST SkillDesc [Vnum:258 Line:63]
0203 00:57:00378 :: CPythonSkill::RegisterSkillTable(locale/common/SkillTable.txt) - NOT EXIST SkillDesc [Vnum:259 Line:64]
0203 00:57:00378 :: CPythonSkill::RegisterSkillTable(locale/common/SkillTable.txt) - NOT EXIST SkillDesc [Vnum:260 Line:65]
0203 00:57:00378 :: CPythonSkill::RegisterSkillTable(locale/common/SkillTable.txt) - NOT EXIST SkillDesc [Vnum:261 Line:66]
0203 00:57:00378 :: CPythonSkill::RegisterSkillTable(locale/common/SkillTable.txt) - NOT EXIST SkillDesc [Vnum:262 Line:67]
0203 00:57:00379 :: importing from pack mouseModule
0203 00:57:00386 :: importing from pack ui
0203 00:57:00476 :: importing from pack networkModule
0203 00:57:00480 :: importing from pack playerSettingModule
0203 00:57:00539 :: importing from pack emotion
0203 00:57:00545 :: importing from pack uiPhaseCurtain
0203 00:57:00547 :: importing from pack uiCandidate
0203 00:57:00550 :: importing from pack musicInfo
0203 00:57:00550 :: importing from pack stringCommander
0203 00:57:00552 :: CGameThreadPool::Initialize - Creating 12 worker threads
0203 00:57:00932 :: NEWMAIN STREAM ----------------------------------------------------------------------------0203 00:57:00932 :: 
0203 00:57:00933 :: NEW POPUP DIALOG ----------------------------------------------------------------------------0203 00:57:00933 :: 
0203 00:57:00933 :: importing from pack exception
0203 00:57:00934 :: ===== Load Script File : UIScript/PopupDialog.py0203 00:57:00934 :: 
0203 00:57:00935 :: importing from pack uiScriptLocale
0203 00:57:00964 :: NEW CURTAIN  ----------------------------------------------------------------------------0203 00:57:00964 :: 
0203 00:57:00964 :: 
0203 00:57:00964 :: ## Network - OffLine Phase ##
0203 00:57:00964 :: 
0203 00:57:00964 :: importing from pack introLogo
0203 00:57:00966 :: NEW LOGO WINDOW  ----------------------------------------------------------------------------0203 00:57:00966 :: 
0203 00:57:01036 :: OPEN LOGO WINDOW  ----------------------------------------------------------------------------0203 00:57:01036 :: 
0203 00:57:01037 :: PointWindow: SelectLogoWindow
0203 00:57:01100 :: 
0203 00:57:01100 :: ## Network - OffLine Phase ##
0203 00:57:01100 :: 
0203 00:57:01100 :: importing from pack introLogin
0203 00:57:01124 :: importing from pack serverInfo
0203 00:57:01126 :: importing from pack uiCommon
0203 00:57:01134 :: importing from lib time
0203 00:57:01134 :: importing from pack serverCommandParser
0203 00:57:01135 :: importing from pack uilocaleselector
0203 00:57:01141 :: NEW LOGIN WINDOW  ----------------------------------------------------------------------------0203 00:57:01141 :: 
0203 00:57:01141 :: PointWindow: PhaseCurtain
0203 00:57:01253 :: ---------------------------------------------------------------CLOSE LOGO WINDOW0203 00:57:01253 :: 
0203 00:57:01253 :: LOGIN WINDOW OPEN ----------------------------------------------------------------------------0203 00:57:01255 :: 
0203 00:57:01255 :: ===== Load Script File : UIScript/LoginWindow.py0203 00:57:01255 :: 
0203 00:57:01580 :: For automatic login, please createloginInfo.xmlfile

Contents:
================================================================
addr=address
port=port number
id=user ID
pwd=password
slot=character selection index (if absent or -1, no auto-selection)
autoLogin=enable auto login
autoSelect=enable auto select
locale=(ymir) works as ymir for LC_Ymir. Works as korea if not specified
0203 00:57:01581 :: 
0203 00:57:01585 :: SYSERR: SEND> 206 4294967246(0xFFFFFFCE) (1)
0203 00:57:01585 :: SYSERR: ce
0203 00:57:01590 :: ---------------------------------------------------------------------------- DELETE LOGO WINDOW0203 00:57:01590 :: 
0203 00:57:01592 :: PointWindow: ChannelList
0203 00:57:02407 :: PointWindow: ServerSelectButton
0203 00:57:03945 :: PointWindow: key_space
0203 00:57:04077 :: PointWindow: key_45
0203 00:57:04193 :: PointWindow: key_34
0203 00:57:04209 :: PointWindow: key_33
0203 00:57:04243 :: PointWindow: key_21
0203 00:57:05591 :: Failed to connect.
0203 00:57:07110 :: PointWindow: !!debug
0203 00:57:07858 :: PointWindow: board
0203 00:57:07924 :: PointWindow: !!debug
0203 00:57:07991 :: PointWindow: board
0203 00:57:08208 :: PointWindow: accept
0203 00:57:10376 :: PointWindow: Password_Text_window
0203 00:57:10460 :: PointWindow: ID_EditLine
0203 00:57:10494 :: PointWindow: ID_Text_window
0203 00:57:10509 :: PointWindow: LoginBoard
0203 00:57:10542 :: PointWindow: ConnectBoard
0203 00:57:10595 :: PointWindow: board
0203 00:57:11127 :: PointWindow: accept
0203 00:57:11359 :: PointWindow: Password_Text_window
0203 00:57:11407 :: PointWindow: ID_EditLine
0203 00:57:11442 :: PointWindow: ID_Text_window
0203 00:57:11457 :: PointWindow: LoginBoard
0203 00:57:11475 :: PointWindow: SelectConnectButton
0203 00:57:11775 :: SYSERR: SEND> 206 4294967246(0xFFFFFFCE) (1)
0203 00:57:11776 :: SYSERR: ce
0203 00:57:11777 :: PointWindow: ChannelList
0203 00:57:11907 :: PointWindow: ServerBoard
0203 00:57:11941 :: PointWindow: ServerList
0203 00:57:12608 :: SYSERR: SEND> 206 4294967246(0xFFFFFFCE) (1)
0203 00:57:12609 :: SYSERR: ce
0203 00:57:12924 :: PointWindow: ServerBoard
0203 00:57:12941 :: PointWindow: ChannelList
0203 00:57:13091 :: PointWindow: ServerSelectButton
0203 00:57:13108 :: PointWindow: ServerExitButton
0203 00:57:13275 :: PointWindow: ServerSelectButton
0203 00:57:13612 :: PointWindow: key_space
0203 00:57:13777 :: PointWindow: key_45
0203 00:57:13808 :: PointWindow: key_44
0203 00:57:13859 :: PointWindow: key_33
0203 00:57:13893 :: PointWindow: key_32
0203 00:57:13941 :: PointWindow: key_20
0203 00:57:14024 :: PointWindow: key_8
0203 00:57:14043 :: PointWindow: key_7
0203 00:57:14074 :: PointWindow: VirtualKeyboard
0203 00:57:14159 :: PointWindow: bg2
0203 00:57:14175 :: PointWindow: LoginBoard
0203 00:57:14275 :: PointWindow: LoginButton
0203 00:57:14459 :: PointWindow: !!debug
0203 00:57:14941 :: PointWindow: board
0203 00:57:15225 :: PointWindow: accept
0203 00:57:16591 :: Failed to connect.
0203 00:57:18142 :: PointWindow: Password_Text_window
0203 00:57:18240 :: PointWindow: Password_EditLine
0203 00:57:18308 :: PointWindow: LoginExitButton
0203 00:57:18940 :: PointWindow: Password_EditLine
0203 00:57:19008 :: PointWindow: Password_Text_window
0203 00:57:19042 :: PointWindow: ID_EditLine
0203 00:57:19074 :: PointWindow: LoginBoard
0203 00:57:19224 :: PointWindow: bg2
0203 00:57:19241 :: PointWindow: ConnectBoard
0203 00:57:19307 :: PointWindow: SelectConnectButton
0203 00:57:19576 :: SYSERR: SEND> 206 4294967246(0xFFFFFFCE) (1)
0203 00:57:19576 :: SYSERR: ce
0203 00:57:19576 :: PointWindow: ServerBoard
0203 00:57:19941 :: PointWindow: ChannelList
0203 00:57:20609 :: PointWindow: bg2
0203 00:57:22510 :: PointWindow: bg2
0203 00:57:22591 :: Failed to connect.
0203 00:57:22659 :: PointWindow: ServerBoard
0203 00:57:22674 :: PointWindow: ChannelList
0203 00:57:23040 :: PointWindow: ServerSelectButton
0203 00:57:23108 :: PointWindow: ServerExitButton
0203 00:57:24241 :: PointWindow: PhaseCurtain
0203 00:57:24408 :: ---------------------------------------------------------------------------- CLOSE LOGIN WINDOW 0203 00:57:24408 :: 
0203 00:57:24410 :: ---------------------------------------------------------------------------- DELETE LOGIN WINDOW0203 00:57:24410 :: 
0203 00:57:24424 :: ---------------------------------------------------------------------------- DELETE POPUP DIALOG 0203 00:57:24424 :: 
0203 00:57:24424 :: ---------------------------------------------------------------------------- DELETE CURTAIN0203 00:57:24424 :: 
0203 00:57:24424 :: ---------------------------------------------------------------------------- DELETE MAIN STREAM 0203 00:57:24424 :: 
0203 00:57:24464 :: CGameThreadPool::Destroy - Shutting down 12 worker threads
0203 00:57:24479 :: SYSERR: granny_shared_vbs:
0203 00:57:24479 :: SYSERR: 	0: 40
0203 00:57:24479 :: SYSERR: 	1: 20
0203 00:57:24479 :: SYSERR: 	2: 20
0203 00:57:24479 :: SYSERR: 	3: 40
0203 00:57:24480 :: SYSERR: 	4: 0
0203 00:57:24480 :: SYSERR: 	5: 20
0203 00:57:24480 :: SYSERR: 	6: 0
0203 00:57:24480 :: SYSERR: 	7: 0
0203 00:57:24480 :: SYSERR: 	8: 0
0203 00:57:24480 :: CResourceManager::__DestroyDeletingResourceMap 80
0203 00:57:24559 :: CResourceManager::__DestroyResourceMap 405
0203 00:57:24601 :: CResourceManager::__DestroyResourceMap 0
0203 00:57:24602 :: CPythonBackground Clear
0203 00:57:24604 :: PythonIME Clear
0203 00:57:24604 :: PythonNetworkMainStream Clear
0203 00:57:24604 :: Python Graphic Clear

 

  • Honorable Member

When does it happen? 
Because, from that log it does not coming out, you might have sent a wrong log file.
It is an errorless close of the client.

Quote

0203 00:57:23108 :: PointWindow: ServerExitButton
0203 00:57:24241 :: PointWindow: PhaseCurtain

Here your cursor was on the serverexitbutton, which means you clicked on it and then the phasecurtain came which is already the closing time in the networkStream.MainStream.__ChangePhaseWindow -> app.Exit()
Then the destructor of the classes run down successfully.

13 hours ago, stingy7 said:

After a week, the server is finally running, but now I have the problem that the client keeps crashing. Does anyone know what I need to do? These are the logs from the client.

Did you compile the source? Debug compile.

And pack the assets neatly.

7 hours ago, DerUranov97 said:

Did you compile the source? Debug compile.

And pack the assets neatly.

Yes, I've already fixed it, thank you. I just have the problem that now, when I select a character, the client closes.

Here is your problem

 

CPythonNonPlayer::LoadNonPlayerData: locale/de/mob_proto, sizeof(TMobTable)=335

 

repack your protos

 

Also, is it crashing only on de? What about the other locale?

  • Love 2

Don't use any images from : imgur, turkmmop, freakgamers, inforge, hizliresim... Or your content will be deleted without notice...
Use : https://metin2.download/media/add/

Please use https://metin2.download/ when uploading files smaller than 100MB, otherwise the approval will take longer due to manual upload.

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.