EOSERV is an Endless Online server emulator project, and also the home of many Endless Online related projects.
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.
Open invitation to anyone who is working on or interested in EO related projects including: Servers, tools, clients and clones to join the EO Developers Discord:
Please note this Discord server is:
- NOT an EOSERV support chat. The forum is the correct place to ask for help with EOSERV.
- NOT a private server promotion or development chat.
Independent game developers are welcome, but I recommend creating your own Discord server once you are ready. :)
I've brought back the post rating system for moderators to leave comments/warnings on rule-breaking or non-productive forum posts.
- Neutral (-0) comments can be given to posts that don't seem deliberately rule-breaking, to inform the user and other readers of the rules.
- -1 should be given for deliberately off-topic posts, trolling, etc.
- -2 should be reserved for more serious rule-breaking such as defamation, doxing, advertising.
- Permanent bans immediately for deliberately posting illegal or pornographic/shock material, and ban evasion.
Upon receiving a rating the user should be informed of the rating on their next visit. After receiving a total of -3 rating the user will be banned for 24 hours beginning on their next visit. A three day ban will be given for each -3 points from that point (at -6, -9, etc.) with situations
requiring permanent bans left up to the moderator's decision. Please note that making a new account to bypass a temporary ban will upgrade it to a permanent one.
Posts made before the 25th of June will not be retroactively rated.
(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
- 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.
- 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. :)
- 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.
- 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.
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.
- 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)
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%.