EOSERV is an Endless Online server emulator project, and also the home of many Endless Online related projects.

Latest News

Posted by Sausage EOSERV/WebCP Git Conversion

A semi-official svn-to-git conversion is now available at https://github.com/eoserv/eoserv/ (and https://github.com/eoserv/webcp/)

The official URL may move from GitHub to something like git.eoserv.net in the future, but the repository contents should be final.

Development in the short-term will be pushed only to GitHub and not tracked on eoserv.net.

1 comment(s) 22 January 2020, 08:22 am
Posted by Sausage EOSERV 0.7.0 and WebCP 4

EOSERV 0.7.0 and WebCP 4 have been released today. EOSERV Windows binaries and WebCP are available on the Downloads page. Source code is available from the download archive.

(Make sure you read and fully understand the license before re-distributing EOSERV. If you build EOSERV yourself with different dependencies, you may be bound by the terms of different licenses.)

Older versions of EOSERV will be removed from the downloads page shortly. Their source code may still be obtained via SVN under their respective tags.

Please ensure you run the 0.6.2_to_0.7.0.sql script in the upgrade directory to update your database format if upgrading EOSERV from an older version.

Also please take note of the new install.sql file in WebCP. It must be executed manually if you wish to use the database rate-limiting driver.

EOSERV 0.6.2 -> 0.7.0 changes:

Versrions of depedencies

  • SQLite3 3.8.6 -> 3.12.1 (now statically linked)
  • MariaDB Client Library 2.0.0 -> 2.2.2
  • pthreads-win32 2.9.0 -> libwinpthreads 0.5.0

Breaking changes

  • The way drop rates are calculated was changed. See the announcement for more info.
  • Default hit rate and damage formulas were changed to match the official EO server.
  • The order of arguments 2 and 3 to the RPN '?' (if) operator were flipped.
  • SLN check-ins are disabled by default. The official service is discontinued and running the code is very unstable.
  • exp variable in TPN and EO+ Stat* rules/actions is renamed to "experience", and exp is now the mathematical exp() function.

New features

  • Spike damage is implemented. (bug #5)
  • HP and TP drains are implemented. (bug #6)
  • Bard spell is implemented and instruments no longer do damage. (bug #8)
  • Party list HP and level are now kept up to date.
  • Innkeepers, shops and skillmasters can be specified by vendor ID rather than NPC ID. (bug #3)
  • $dress (and $dress2) commands allows admins to temporary apply graphical equipment overrides to players.
  • $dnpcs command clears the map of spawned NPCs. (bug #310)
  • $snpc now takes an additional speed option.
  • Chat logs and reports are taken and stored on the admin message board (viewable via the $board command). They can optionally also be stored in the database via the LogReports option, viewable via WebCP.
  • $unjail command allows admins to unjail characters without requiring full $warp privilege.
  • $hide/$show commands can now show/hide individual features: admin (admin icon), online (online status), warp (warp bubbles), npc (npc aggression), and invisible (visibility).
  • Admin hide status is stored in the database. (bug #30)
  • $duty command (enabled by the UseDutyAdmin option) allows admins to hot-swap between their admin and non-admins characters, and to use moderation commands on their non-admin character.
  • NoInteract system can be used to prevent admins from interacting with the game in certain ways.
  • Admin 'unlimitedweight' privilege allows admins to not be restricted by weight.
  • Custom guild ranks can be enabled via the GuildCustomRanks option. They work the same way as the official EO server. Existing players without a custom rank will retain a dynamically updating rank title until their rank is changed.
  • NPC speeds can be adjusted via the SpawnNPCSpeed config option.
  • New maps and quests can be loaded in to the game via $remap and $request commands. (bug #97)
  • EO+: ResetDaily() action and DoneDaily() rule to implement daily quests.
  • EO+: Roll() action and Rolled() rule to randomize quests.
  • exp and ln functions added to RPN and EO+ Stat* rules/actions.


  • NPCs will navigate around corners better when chasing players.
  • Boss-child NPCs will attack innocent bystanders if their boss is attacked.
  • Players are disconnected after 3 failed login attempts. (bug #266)
  • Slightly better action queue timings to minimize lag when walking long distances.
  • Packet sequences are enforced by default, beating trivial packet re-sending and breaking some third-party bots/proxies (configurable with EnforceSequence option).
  • Admins are unhidden if they are demoted below the level to use $hide.
  • Better warning messages for invalid innkeeper data.
  • No more warning messages for missing map files, MaxMap default value increased.
  • Localized strings are now reloaded by $rehash.
  • Database connection is retried up to 10 times before shutting down the server.
  • Database will retry in the case of a lock-wait timeout error. (bug #352)
  • $repub is now silent by default. "$repub announce" may be used to broadcast the old system message.
  • Admin command usage is logged to the console (configurable with LogCommands option).
  • Server will automatically refresh out of sync clients.
  • Less memory is used per NPC instance. :)

Other changes

  • Admins can walk in to warps while using #nowall.
  • Default admin levels changed: $mute = 1, $evacuate = 3, killnpc privilege = 4
  • Makefile build system replaced with CMake. Doxygen build file removed.

Bug fixes

  • PKing someone doesn't instantly crash the server! (bug #183)
  • Server can no longer be crashed by sending a dialog for a quest after it's reset. (bug #366)
  • Warping someone during death can no longer potentially crash the server. (bug #293)
  • Evacuating the jail map can no longer potentially crash the server. (bug #361)
  • Casting spells can no longer potentially crash the server? (bug #356)
  • Reset() action in quests will no longer crash the server in some cases. (bug #202)
  • Spawning multiple boss monsters on a map no longer crashes the server. (bug #299)
  • One possible crash in the SLN code fixed.
  • Default ChatMaxWidth reduced to avoid WWW-spam crashing players.
  • NPC id 0 can no longer be spawned by admins, causing client issues.
  • $strip command no longer causes potential issues to people in range of the victim.
  • A map failing to reload no longer crashes the server.
  • Potentially dropping negative stacks of items is no longer possible. (bug #313)
  • Huge number of memory/resource leaks fixed.
  • EO+ SetState function no longer requires state names to be lowercase. (bug #157)
  • EO+ LostSpell now works rather than being a copy of LostItem. (bug #163)
  • EO+ UsedItem rule is no longer triggered when an item is dropped.
  • EO+ KilledPlayers rule now counts PK kills via spell. (bug #184)
  • EO+ rules are checked after trades.
  • 'hidden_end' quest flag now works.
  • No longer possible to cast damage spells on yourself in PK. (bug #148)
  • Now possible to cast damage spells on other people in GlobalPK enabled. (bug #149)
  • Strings beginning with 'a' or 'z' are correctly capitalized now. (bug #150)
  • MaxVersion setting of -1 now works as documented. (bug #158)
  • Innkeepers no longer generate false warnings about a non-existent home. (bug #159)
  • Chests with multiple item spawns work correctly.
  • Prevent map features not updating correctly after $remap. (bug #167)
  • Fix monster drops sometimes being awarded to noone. (bug #173)
  • Fix monster drops being protected by the wrong person. (bug #173)
  • Strings with whitespace on both ends is now trimmed correctly.
  • Quest data is no longer wiped out if a character disconnects while logging in. (bug #178)
  • Quest state is no longer deleted if $request fails to reload a quest. (bug #378)
  • Equipping accessories in second slot no longer triggers a sound. (bug #186)
  • Changes to the clock no longer causes timers to trigger at maximum speed or stop. (bug #215)
  • Last line of news.txt is no longer repeated sometimes. (bug #216)
  • Fix graphical glitches when warping in to a map with characters out of range. (bug #196)
  • Fix $setexp command always setting exp to 0.
  • Friend list shows online characters correctly. (bug #228)
  • Partial stacks of items taken from chests no longer delete the entire stack. (bug #244)
  • Drunk emote is no longer blocked. (bug #200)
  • HP can no longer be boosted past the maximum if LimitDamage is off. (bug #265)
  • Spell damage is now correctly added to damage calculations. (bug #323)
  • Guilds can now be disbanded (by default, only the rank 0 founder can disband). (bug #405)
  • Kicking offline members from a guild now works correctly.
  • Guilds rank updates for offline members now work. (bug #370)
  • Guilds are now consistently saved. (bug #371)
  • There is no longer a level up animation after every GiveExp action in a quest. (bug #76)
  • Fix first rank in a guild appearing as a comma if it was blank. (bug #372)
  • Actions of disconnected players are no longer processed. (bug #292)
  • Character names appear in the $info window correctly for non-admins. (bug #374)
  • Walking with 0 HP no longer kills you.
  • 0x items can no longer be placed in trades again.
  • Trades no longer break after 32k character logins. (bug #319)
  • Nearby players can see your new haircuts. (bug #309)
  • $show command added to default admin.ini.
  • QuestDir now has a default value.
  • Some issue with random number generation fixed.
  • Platforms with a 64-bit time_t value no longer send wrong time values to the database.

Known bugs

Please see the list of open bugs.

WebCP 3 -> 4 changes:

  • Guild info and membership pages added.
  • Chat report log reader added.
  • Rate limiting for invalid login attempts.
  • "Edit Details" page removed as it can cause numerous issues.
  • Links to non-existent Edit pages removed.
  • Old Database driver replaced with PDO. Dependency changes from mysql/sqlite3 libraries to pdo and pdo_mysql/pdo_sqlite3.
  • Player IP, HDID and computer name can be displayed encrypted to lower level admins. (bug #405)
  • SeoseCompat format passwords supported.
  • UPDATE queries no longer hang.
  • Some potential XSS bugs fixed.
  • "csrf" parameter removed from some search forms.
  • Searching for HDIDs beyond 7FFF-FFF works correctly. (bug #250)
  • Display and deletion of permanent bans fixed. (bug #369)
  • More efficient pub file caching format.
  • Option to disable the gold bank sum on the home page (slow on large databases).
  • Allow searching by IP address.
  • Added links for searching by IP, HDID and Computer name.
  • Added links for searching partners. (bug #306)
  • Added links on staff list page.
  • Spell list added to character info pages.
  • Show character lists on account search result pages.
  • gmcharacter and character pages combined.
  • All Accounts/Character/Guilds pages now redirect to Search.
  • Skeleton/Panda race constants swapped.

Thanks to

  • Apollo (bugs #157, #158, #159, #163, #167, #178, #184, #196, #265, #292, #299, #309, #372)
  • Ryouken (bugs #150, #186, #202, #244)
  • Hollows (bugs #148, #173, #183)
  • elevations (bug #200)
  • Soook (bug #215)
  • ♪ Doug ♫ (bug #216)
  • callum (bug #323)
16 comment(s) 09 April 2016, 05:38 am
Posted by Sausage Changes to drop rate calculation in r504 / EOSERV 0.7.0

Heads up about a change made to drop rate calculations in EOSERV r504 and 0.7.0.

Previous to r504 / 0.7.0 it worked by rolling every single drop and then picking one item randomly from every item hit. This led to unintentionally lowered drop rates in situations like this:

257 = 200,1,1,1, 1,100,1000,100 (1% chance of devil costume, 100% chance of 100-1000 gold)

In the situation above, since the gold drop would always be hit (100% drop rate), it will always be a possible drop along side a devil costume, effectively halving its drop rate from the intended 1%, down to 0.5%.

After r504 / 0.7.0 the drop rates are scaled evenly, exactly matching the rates written, and scaling down proportionally with a warning if the rates add up to greater than 100%.

Note that this change will have a significant impact on most multi-item drop tables. You can revert back to the old behaviour by changing the DropRateMode config option back to 1 (default is now 3, the closest to main's behavior is 2).
6 comment(s) 20 November 2015, 07:11 am
Posted by Sausage Endless Online main server hacked

Hi everyone,

Today the official Endless Online main server was hacked, and the details of over 50,000 accounts created between March 2011 and August 2015 (today) stolen. All information was leaked including account names, plain-text passwords, full names, locations, e-mail addresses, ip addresses and associated character and guild information. In-game chat logs recorded on the server during an unknown time period may also have been taken.

As always, never use the same password on any two services. If you think you may have used the same password on Endless Online as any other website, especially your e-mail account, change your passwords immediately.

Update: Vult-r has posted an official message here: http://endless-online.com/

The server was compromised. By hackers? no: Basically the hosting company BUYVM.NET gave the account and server to a complete stranger claiming it with a GMAIL account. How silly is that? :) EO database was destroyed, and EO probably will be down for a while, you can contact this idiot here: <email removed>
20 comment(s) 31 July 2015, 11:06 pm
Posted by Sausage EOSERV 0.6.2b - Notice about closed source EOSERV forks

From today EOSERV now links to the MariaDB Client Library, in place of the MySQL Client Library. MariaDB provides a connector library that is compatible with MySQL, and released under a more permissive license.

EOSERV has been distributed under the zlib license, however due to being linked to the MySQL Client Library, may be subject to the terms of the GPLv2, which forbids distributing modified versions without also making the source code available.

Any closed-source distributions derived from EOSERV using the MySQL Client Library are encouraged to cease distribution of any release bundled with the MySQL Client Library.

As the sole copyright holder of all of the source code in EOSERV, and exemptions provided by MySQL's FOSS License Exception, I believe that EOSERV 0.6.2b and the main-line code starting from revision 437 onwards are free from the requirements of the GPLv2 and may be re-distributed without the requirement to release your source code, or any other restriction of the GPLv2. I strongly recommend reading the full text of the LGPL for any other requirements on redistributing the libraries bundled with EOSERV.

You may obtain a copy of the MariaDB Client Library from https://downloads.mariadb.org/connector-c/ (2.0 is recommended, not 2.1)

EOSERV 0.6.2 has been re-released as 0.6.2b with no changes other than the replacement of libmysql with libmariadb. You can obtain it from the Downloads page, or check out the source from SVN (svn://eoserv.net/eoserv/tags/0.6.2b).

1 comment(s) 21 September 2014, 12:50 pm
49 more posts in the news archive.