[Release]Dekaron Event Server

05/05/2025 15:42 guesswho-.-#1
Hi,

I decided to release the Event Server as a separate program for all private servers to use.
This version of the event server will work for most (or every?) Action 9 private server files.

So, to the point:
What is it?
it's a program that emulates a client and throws events

What can it do?
Most of the things that a GM can do and more. it's must faster and more reliable than a regular human GM. You no longer have to take the risk of a GM going corrupt and doing things that will lead to your server's downfall.


How to set it up:
1. Execute the SQL scripts in your database (I left the "USE [GM Tool]" phrase, but you can change it to your own database, or for example CHARACTER. up to you.
2. Update the settings.ini file with your database credentials
3. Create an account for the [GM] char to be on
4. Create the GM character
5. Put that user_id, password and character name in the settings.ini file
a) this point refers to those values in the settings.ini file:
Account=gmaccount
Password=gmaccountpassword
Character=[GM]EventHoster

Event Server will not work if your GM char name is not found on the account.
This is crucial and I thought its easy but I really had a surprising number of questions regarding this.


6. Update your IP address and ports for the game (loginserver, dekaronserver ports and IP!)
NotificationCenterPort is not used in this version.

Rest is self explanatory.

What events are included?
Ruby Eye - spawns mobs in Space of Pilgrimage
Golden Invasion - spawns mobs in Aquarai Ruins

How can I schedule an event?
Schedule is kept in EventSchedule table. You only need to insert your desired time and event symbol.
For built-in events the symbols are:
RUBY_EYE
GOLDEN_INVASION


How can I create my own events?
This is a new feature I have been working on for the past few days.
You can create your own events and schedule them.

To create an event you need to create a text file with .event extension.
Basically this is a simple scripting language I created. It consists of a couple commands, which correspond to the actions executed by the Event Server.

List of currently supported actions:
MOVEMAP wMapIndex wCoordX wCoordY//used for teleporting the GM char from one map to another
SLEEP dwDuration//used to wait between executing commands. Takes time as a parameter in miliseconds
NOTICE text//sends a GM notification in game.
CALLMONSTER wMonsterIndex wCoordX wCoordY//spawns a monster, takes 2 additional params: x and y coordinates
RESETMONSTER wMonsterIndex//resets monsters
FIELDRETURN wMapIndex//returns everyone in a map
FIELDHEAL wMapIndex//heals everyone in a map
CREATEBRICK dwBrickIndex//spawns a brick
DESTROYBRICK dwBrickIndex//despawns a brick
CALLMONSTERS wCount wMonsterIndex wCoordX wCoordY//spawn a set of monsters, takes 3 additional params: count, x and y coordinates
RESETCOOLTIME_MAP wMapIndex//resets skill cooltime on a specified map
ANNOUNCEMENT szText//Much like Notice, it sends a dedicated GM-like announcement. This was requested by people who run Event Server on Evolution server files.
For everyone else - Notice will work exactly the same way as Announcement.

The Event Server has a script validator built in so it should be fairly fool-proof. or if you made a mistake, it should let you know what it is.

How can I schedule a custom event?
execute this script and rename the script.event to whatever you named your custom script. Remember to keep the .event extension as thats what the Event Server looks for when setting symbols for the scheduler.

Code:
Insert into EventSchedule (EventType, StartTime) values ('script.event','10:00')
First custom script:
Code:
movemap 46 0 0
notice Aquarai invasion will begin in 10 minutes!
sleep 300000
notice Aquarai invasion will begin in 5 minutes!
sleep 300000
notice Strong monster have spawned all around Aquarai Ruins!\\Defeat them!
callmonster 10008 352 467
callmonster 10008 258 453
callmonster 10008 179 371
callmonster 10009 455 199
callmonster 10009 368 197
callmonster 10009 330 345
callmonster 10009 326 281
callmonster 10010 293 57
callmonster 10010 181 74
callmonster 10010 157 273
movemap 150 0 0
I had a lot of fun coding the script interpreter. I might continue developing this :p
Please post your:
- Ideas
- Requests
- Problems
- Feedback

----changelog----
2025-05-06:
- Added support for SQLEXPRESS
- Fixed script validator where SLEEP would only accept values up to 65535
- Added CREATEBRICK and DESTROYBRICK commands
- Added EvoEnabled flag for enabling the program to run on Evolution files. Set it to False to use it on normal servers. The difference is mainly in notifications: Evo uses quest-like notifications and if you set the flag to false it'll just use GM notification.
- Minor bugfixes
2025-05-06.1:
- Fixed casting for SLEEP (unsigned short -> unsigned int)
2025-05-06.2:
- Fixed connection request packet opcode mismatch for Evo false flag
2025-05-06.3:
- Fixed character checkout packet opcode mismatch for Evo false flag
2025-05-08.1:
- Added config value for SessionServerID (add it to your settings.ini)
- Added config value for DekaronServerVersion (add it to your settings.ini)
2025-06-08:
- Fixed scheduler timer (was showing wrong time in timezones other than european)
- Added CALLMONSTERS command
- Added RESETCOOLTIME_MAP command
2025-06-19.1:
- Config strings max length changed 20 -> 256 bytes
- Added ANNOUNCEMENT command
- Fixed minor bugs
2025-06-23.1:
- Improved logging (will print out error code if version validation doesnt match)
05/05/2025 15:54 WhoAreYouPeople#2
This is cool.. Even cooler that you shared it with the community. Thanks man!
05/06/2025 05:35 avosnick#3
maybe you can add a date or something like a siege war that will start every few days like the event will run every 3 days or every 7 days

by google translate :D
05/06/2025 20:18 iidagger#4
wow op release. thanks man! hope to see "createbrick" & "destroybrick" be part of the supported actions :handsdown:
05/06/2025 20:34 guesswho-.-#5
Quote:
Originally Posted by iidagger View Post
wow op release. thanks man! hope to see "createbrick" & "destroybrick" be part of the supported actions :handsdown:
it was supported by the program, but I didnt include it in the validator.
I added it just now and it's available in the release.
05/06/2025 21:38 iidagger#6
Quote:
Originally Posted by guesswho-.- View Post
it was supported by the program, but I didnt include it in the validator.
I added it just now and it's available in the release.
:mindblown:awesome! that was quick. ty mate! also I am not sure what I am doing wrong however never had luck making it work.

I tried the first release and below is what I've gone so far


Code:
[03:31:54] Starting Event Server 2.0.0
[03:31:54] LoginServer Port = 7880
[03:31:54] DekaronServer Port = 50005
[03:31:54] NotificationCenter Port = 5555
[03:31:54] IP Address = 127.0.0.1
[03:31:54] Account = admin1
[03:31:54] Password = admin
[03:31:54] Character name = [GM]Host
[03:31:54] Summer time = false
[03:31:54] EvoEnabled = false
[03:31:54] Selecting CET offset
[03:31:54] Initiating Scheduler
[03:31:54] Found custom script -> script.event
[03:31:54] Connecting to 127.0.0.1:7880 (LoginServer)
[03:31:54] Connected, took 0ms
[03:31:54] Setting new crypt key = 0F
[03:31:54] Ping thread started successfully
[03:31:54] Receiving thread started successfully
[03:31:54] Setting new crypt key = 31
[03:31:54] Logging in as admin1
[03:31:54] Login result = 0. Session key = 1D48B780
[03:31:54] Requesting character list
[03:31:54] Character on account: [GM]Host
[03:31:54] Char list finished. Entering world [127.0.0.1:50005]
And for recent onese 05-06 & 05-06.1:

Code:
[03:27:52] Starting Event Server 2.0.0
[03:27:52] LoginServer Port = 7880
[03:27:52] DekaronServer Port = 50005
[03:27:52] NotificationCenter Port = 5555
[03:27:52] IP Address = 127.0.0.1
[03:27:52] Account = admin1
[03:27:52] Password = admin
[03:27:52] Character name = [GM]Host
[03:27:52] Summer time = false
[03:27:52] EvoEnabled = false
[03:27:52] Selecting CET offset
[03:27:52] Initiating Scheduler
[03:27:52] Connecting to 127.0.0.1:7880 (LoginServer)
[03:27:52] Connected, took 0ms
[03:27:52] Setting new crypt key = 0F
[03:27:52] Ping thread started successfully
[03:27:52] Receiving thread started successfully
[03:28:02] Connection closed. Error code = 10054
[03:28:02] Suspending recv thread for 1 second..
[03:28:03] Connection closed. Error code = 10038
[03:28:03] Suspending recv thread for 1 second..
[03:28:04] Connection closed. Error code = 10038
[03:28:04] Suspending recv thread for 1 second..
[03:28:05] Suspending recv thread for 1 second..
[03:28:06] Suspending recv thread for 1 second..
05/06/2025 21:40 guesswho-.-#7
which server files are you using?
nvm, found the error. it should be fixed now.
05/07/2025 08:26 iidagger#8
Quote:
Originally Posted by guesswho-.- View Post
which server files are you using?
nvm, found the error. it should be fixed now.
Thanks mate.. unfortunately still no luck in my end. I am trying to test it with the shangrila a9 files (farius release), but I think its having conflict with the account gate I guess. prolly I am just doing something wrong or missed something.
05/07/2025 08:31 guesswho-.-#9
Even with version 3?

If you can provide the login sequence (packets) for farius files then I can implement it.
05/07/2025 09:06 iidagger#10
oh didnt notice there was ver 3, I will test it later when I get home and let you know..

Update @[Only registered and activated users can see links. Click Here To Register...]
Ok so I step back a little as I might be doing something wrong, I rerun the queries as how they were provided in the following sequence


- Create table eventschedule
- populate eventschedule
- SP get eventschedule


And this how far I got:

Code:
[00:14:05] Starting Event Server 2.0.0
[00:14:05] LoginServer Port = 7880
[00:14:05] DekaronServer Port = 50005
[00:14:05] NotificationCenter Port = 5555
[00:14:05] IP Address = 127.0.0.1
[00:14:05] Account = admin1
[00:14:05] Password = admin
[00:14:05] Character name = [GM]Host
[00:14:05] Summer time = false
[00:14:05] EvoEnabled = false
[00:14:05] Selecting CET offset
[00:14:05] Initiating Scheduler
[00:14:05] Connecting to 127.0.0.1:7880 (LoginServer)
[00:14:05] Connected, took 0ms
[00:14:05] Setting new crypt key = 0F
[00:14:05] Ping thread started successfully
[00:14:05] Receiving thread started successfully
[00:14:05] Setting new crypt key = 11
[00:14:05] Logging in as admin1
[00:14:06] Login result = 0. Session key = 1856B438
[00:14:06] Requesting character list
[00:14:06] Character on account: [GM]Host
[00:14:06] Char list finished. Entering world [127.0.0.1:50005]
[00:14:08] Connecting to 127.0.0.1:50005 (DekaronServer)
[00:14:08] Connected, took 0ms
[00:14:08] Setting new crypt key = 0F
[00:14:08] Setting new crypt key = 13
[00:14:08] Char list finished. Entering world [127.0.0.1:50005]
[00:14:08] Connection closed. Error code = 10054
[00:14:08] Suspending recv thread for 1 second..
[00:14:09] Connection closed. Error code = 10038
[00:14:09] Suspending recv thread for 1 second..
[00:14:10] Connection closed. Error code = 10038
[00:14:10] Suspending recv thread for 1 second..
[00:14:11] Suspending recv thread for 1 second..
[00:14:12] Suspending recv thread for 1 second..
[00:14:13] Suspending recv thread for 1 second..
[00:14:14] Suspending recv thread for 1 second..
I checked DBmon it gives the following:

Code:
14032: .\Client\Pc\State\NotLogins\Authening.cpp(157) : 
14032: [OnAccountGatePacket][Recv AccountGate Packet]
14032: .\Client\Pc\State\NotLogins\Loginings\Logining.cpp(170) : 
14032: [Logining][Session Recved APcket][0]
14416: .\Process\Service\Init\Client\OnCQLock.cpp(103) : 
14416: CQ_Lock Process Invalid Session ID [SerialKey : 408335416] [ Nothing Session Server ID 1100 ]
For the packets not really sure if this is what you are referring to:

Code:
Logincmd
packet send = 3000000
packet receive = 3000001

checkoutcmd
packet send = 3010000
packet receive = 3010001


connectcmd
packet send = 3010002
packet receive = 3010003
05/07/2025 18:36 guesswho-.-#11
Ok, it seems like the error is related to session server ID I'm putting. I probably hardcore 1100.

Can you change your session server ID to 1100 and see if it helps? Change it in session server folder and dekaronserver. And maybe login, not sure.

If that helps, I'll add a config value for sessionserverid


Also good debugging skills. I honestly expected much less xd
05/07/2025 19:43 iidagger#12
Ok I think it helps, now a new error showing in dbmon:

Code:
08696: .\Client\Pc\State\NotLogins\Authening.cpp(157) : 
08696: [OnAccountGatePacket][Recv AccountGate Packet]
08696: .\Client\Pc\State\NotLogins\Loginings\Logining.cpp(170) : 
08696: [Logining][Session Recved APcket][0]
16260: .\Process\Service\Init\Client\OnCQLock.cpp(125) : 
16260: CQ_Lock Process Invalid Version [SerialKey : 590890984] [Client : EU-18.0.3] [Server : test101]
05/07/2025 19:49 guesswho-.-#13
Ok, that's an easy one ;p you should update your version.ini in your servers share folder to the same value. I'll also export it to a config line later
05/07/2025 20:04 iidagger#14
Quote:
Originally Posted by guesswho-.- View Post
Ok, that's an easy one ;p you should update your version.ini in your servers share folder to the same value. I'll also export it to a config line later
Perfect that SOLVES it :handsdown: ty mate


Code:
[01:58:52] Starting Event Server 2.0.0
[01:58:52] LoginServer Port = 7880
[01:58:52] DekaronServer Port = 50005
[01:58:52] NotificationCenter Port = 5555
[01:58:52] IP Address = 127.0.0.1
[01:58:52] Account = admin1
[01:58:52] Password = admin
[01:58:52] Character name = [GM]Host
[01:58:52] Summer time = false
[01:58:52] EvoEnabled = false
[01:58:52] Selecting CET offset
[01:58:52] Initiating Scheduler
[01:58:53] Found custom script -> script.event
[01:58:53] Connecting to 127.0.0.1:7880 (LoginServer)
[01:58:53] Connected, took 0ms
[01:58:53] Setting new crypt key = 0F
[01:58:53] Ping thread started successfully
[01:58:53] Receiving thread started successfully
[01:58:53] Setting new crypt key = 0F
[01:58:53] Logging in as admin1
[01:58:53] Login result = 0. Session key = 233847E8
[01:58:53] Requesting character list
[01:58:53] Character on account: [GM]Host
[01:58:53] Char list finished. Entering world [127.0.0.1:50005]
[01:58:53] Connecting to 127.0.0.1:50005 (DekaronServer)
[01:58:53] Connected, took 0ms
[01:58:53] Setting new crypt key = 0F
[01:58:53] Setting new crypt key = 1F
[01:58:53] Char list finished. Entering world [127.0.0.1:50005]
[01:58:53] Character on account: [GM]Host
[01:58:53] Login sequence ended, we are online!!
[01:58:54] Checking event schedule for event [GUILD_TOURNAMENT]
[01:58:54] Comparing time [09:55] vs [18:58]
[01:58:54] Checking event schedule for event [RUBY_EYE]
[01:58:54] Comparing time [13:25] vs [18:58]
[01:58:54] Checking event schedule for event [RUBY_EYE]
[01:58:54] Comparing time [17:55] vs [18:58]
[01:58:54] Checking event schedule for event [RUBY_EYE]
[01:58:54] Comparing time [21:55] vs [18:58]
[01:58:54] Checking event schedule for event [GOLDEN_INVASION]
[01:58:54] Comparing time [14:55] vs [18:58]
[01:58:54] Checking event schedule for event [GOLDEN_INVASION]
[01:58:54] Comparing time [18:55] vs [18:58]
[01:58:54] Checking event schedule for event [GOLDEN_INVASION]
[01:58:54] Comparing time [22:25] vs [18:58]
[01:58:54] Checking event schedule for event [script.event]
[01:58:54] Comparing time [03:00] vs [18:58]
Yes, adding the server id and version lines to config.ini would be a valuable addition. It would enhance the portability and flexibility of the eventserver
05/07/2025 20:13 guesswho-.-#15
Awesome, glad to see someone run it.
I'll work on it later tonight