It's been a while since I've done a community update, but its time people get an update of the massive amount of work that continues to drive this project.

We should all be very thankful to have such an amazing community with all of the extremely talented and driven individuals that encompass it.

With that being said, there are so many things that have been done in the past year or so that I will do my best to go over as much of the things that I've seen happen, and I can guarantee you I will miss a bunch of things cause there is just that much going on.

I will also be posting more regular updates so we can have more updates on the things we are doing and plan on doing community wise.

After a very long project of the Shards team overhauling their back-end code, they have finally been able to make a connection to the EQEmulator public loginserver. Welcome them back as they have been a very unique and customized server that has been running for many years.

For years we've had very long, sometimes convoluted server install guides that could take a new person a lot of time to try and figure out. Even for a seasoned and experienced developer it can be a frustrating process to get a server up and running. I've spent quite a bit of time making this process as streamlined and as simple as possible. I've recently done a several month testing in this thread (http://www.eqemulator.org/forums/showthread.php?t=40299) and things have gone very smooth. Right now this is set for Windows, but could very easily be extended to Linux as most of the installation process is driven from the new eqemu update system

In the past years, we've seen exponential improvements in server performance in the source. Many of us developers have chipped away at costly code, rewritten big chunks of the source and made HUGE improvements.

The server performance is currently the best that it has ever been, since I've taken over EZ Server I've had the opportunity to take live production player traffic and put it under a Visual Studio profiler and figure out all of the costly code paths and reduce the CPU footprint dramatically in the source

EZ Server used to run 2 Xeon processors with 500-600 players fluctuating often between 30%-100% on all cores approximately 2 years ago. It now runs 1,000+ players with hardly budging from 25-30% idle. The entire community improves from these footprint changes

The changes and improvements that have been made are FAR too many to mention, but some of them include:

Over the past few years, we've also made huge strides at heavily reducing process crashes that are produced in the source, so the level of stability has also come a LONG way. Very few crashes occur in our current master source branch

For the longest time, in order to make changes to spells, items, loot etc. You had to make your changes and restart your server processes (world/zone etc.). Now, thanks to KLS and a massive overhaul with how the shared memory system works, you can use #hotfix to re-apply spell/item/loot changes etc. while you are developing. This cuts down heavily on the feedback loop and creative process when building a server. The command issues a shared_memory reload in all zoneprocesses and world

Tools Guide (Compiled by Shendare)

This community has seen an incredible amount of tools created by members of the community over many years, some of them are no longer maintained, some of them posted in threads that no one sees anymore etc. Shendare was nice enough to compile a massive tool cheat sheet for developers. Check it out here: (It's quite outstanding)

Sometimes when developing or working on a zone, you might need to repop a zone over and over and over repeatedly. This can become a slow process as your zone gets larger and larger. #repopclose was created for developers to only repop a zone with NPC's that are within 500 units of the GM who initiated the command

13th Floor Items Database Update (Demonstar, Natedog, Akkadius)

For a while, the 13th floor DB repo had no longer been maintained, so we've not been able to import the latest items into PEQ for the past 2 years or so. Someone recently spun up a copy of 13th floor and we made an effort to help collect item data from Live to be able to import that data into the EQEmu items schema.

NPC's will avoid swimming unless its a shortcut because there are defined paths. For example if there is a bridge nearby, the NPC will prefer to take that path over just jumping in the waterPathing System Major Overhaul (KLS) (Work in Progress)

Alternate Advancement System Overhaul (KLS and Demonstar)

This is an older update, but the AA system was a massive disgusting code mess that needed a rewrite. Demonstar put together the packet collect scripts to pull down live AA data and together with KLS they worked on overhauling the AA code.

Not only has this made the AA code far cleaner, but it has also made it harder to exploit with the holes that were in it before.

With this overhaul we also have all new AA's through Live

Inventory Snapshots (Uleat)

The ability to have period inventory snapshots for backup purposes has been implemented, a tool can easily be built to restore these snapshots to a character inventory

#command overhaul (Uleat)

The #command system had a bit of an overhaul, including the ability to set multiple command aliases, the new table is now command_settings, these aliases are separate by a pipe | delimiter

Version 2 Maps (KLS)

Version 2 maps have been out for quite a while, but this is also an overhaul that has definitely improved server performance, this was introduced close to 2 years ago now and they can be downloaded via the update script

Saylink Adjustments (Demonstar/Akkadius)

Allowed item ID's to be linked up to ID 1,048,575

Saylink ID's are now processed in the aug portion of the item packet so they don't conflict with Item ID's

The eqemu_update.pl script has become an integral part of how a lot of us keep the core server updated. It started by managing our automatic database versioning, which has been a HUGE improvement to server maintaining and has streamlined both the process of developers making database changes, and server operators keeping their database up to date without frustration. It has also extended to multiple other features and uses and will continue to do so.

Normally, world will execute this script on boot-up, but you can also manually run it yourself in the server directory (eqemu_update.pl)

== 03/05/2016 ==
mackal: Implement extra bind points (secondary recall)
For SE_Gate, base2 is which bind to use (starting at 1)
For SE_BindAffinity, base1 is which bind to set (starting at 1)
For SE_GateCastersBindpoint, base1 is which bind to use (starting at 1)
There was actually no spells that don't send to the main bind, but it uses a base1 of 1 which matches with SE_Gate
This also doesn't break anything

== 01/26/2016 ==
Uleat: Fix for Berserker 'Piercing' skill issues. Server Admins: If you run custom skill sets, this patch touches the code segments that you will need to modify if you have changed the default berserker 1H-/2H-piercing skill values.
Uleat (Daerath): Fix for precision-loss item weight conversions in older clients.
- WARNING: YOU MUST RE-RUN SHARED_MEMORY.EXE BEFORE STARTING SERVER OR ITEM LOSS WILL OCCUR!
- Note: Cmake must be re-run to include/exclude the required files

== 01/13/2016 ==
Kinglykrab: Modified #flag so you can refresh your target's account status (GM status level) without them having to relog.
- Just target the person whose flag you want to refresh and type #flag.
Uleat: Added itemlink functionality to the #summonitem command. Current use is limited to extracting the item id from the link.
- Invoking by item link '#summonitem Arrow' produces the same result as by item id '#summonitem 8005'

== 01/12/2016 ==
Uleat: Fix for tradeskill containers remaining locked after a RoF+ client leaves. Intermediary fix for RoF+ clients accessing tradeskill containers when in use by another player (thanks Natedog!)

== 12/29/2015 ==
Akkadius: Implemented standardized zone controller scripts (Rule Zone, UseZoneController) Defaulted to true
- When a zone boots, it will spawn an invisible npc by the name of zone_controller
- Lua and Perl scripts can be represented with this npc as zone_controller.pl/lua
- This NPC's ID is ruled be define ZONE_CONTROLLER_NPC_ID 10
- Two EVENT's uniquely are handled with this NPC/controller (They only work with the zone_controller NPC)
- EVENT_SPAWN_ZONE :: All NPC spawns in the zone trigger the controller and pass the following variables:
$spawned_entity_id
$spawned_npc_id
- EVENT_DEATH_ZONE :: All NPC deaths in the zone trigger the controller event and pass the following variables:
$killer_id
$killer_damage
$killer_spell
$killer_skill
$killed_npc_id

== 12/28/2015 ==
Kinglykrab: Added GetInstanceTimer() to Perl and Lua.
- Added GetInstanceTimerByID(instance_id) to Perl and Lua.
- Note: If you do not provide an instance id in the method it defaults to instance id 0 and returns 0 for time remaining.
- Added UpdateZoneHeader(type, value) to Perl and Lua.
- Note: UpdateZoneHeader allows you to manipulate fog color, fog density, and many other zone header settings on the fly in Perl and Lua.

== 12/21/2015 ==
Natedog: Updated item table fields and added a few missing fields for evolving items
-DO NOT implement Heirloom items till the inventory code is fixed to allow placing NO DROP
items in your shared bank. (but item field located on items table)
-NYI - SkillModMax: Max skill point modification from the percent mods. EX:
100% 2HSlashing (Max 50) - can only increase 2hslash by 50 MAX! (item field located though)
Kinglykrab: Added GetMeleeMitigation() for NPCs and Clients in Perl and Lua.
- This allows you to check total item, spell, and AA melee mitigation contribution.

== 12/16/2015 ==
Noudess: Repaired issue with Bind Wounds on someone else. Message was not coming out on client (hold still) and a bind wounds on someone already binding their wounds would interrupt their bind and make them stand. Also removed some duplicate messaging.

== 12/14/2015 ==
Kinglykrab: Added IsBlind() and IsFeared() functionality to Perl and Lua.
- Note: Both methods are Mob methods and may be used on NPCs or PCs.
Natedog: Added Discipline functions, UpdateInstanceTimer function, and UnmemSpellBySpellID to lua and perl
-Examples: http://wiki.eqemulator.org/i?M=Pastebin&Paste=BJ0ygmNM

== 12/07/2015 ==
Uleat: Command aliases are no longer handled through the command_add() function.
- To add a command alias, edit the database table `command_settings` - here, you will find three columns: `command`, `access` and `aliases`
- Adding command aliases require that the command contain an entry in `command_settings`.`command`
- Only 'real' commands go inside of the command_init() function in command.cpp .. if you wish to add aliases, you must enter them into the database
- 'Real' commands are loaded first .. then any access/alias data is loaded and applied afterwards
- Duplicate aliases will be ignored .. only the first encountered occurrence will be honored - if it does not conflict with an existing command name
- Aliases should not contain whitespace and should be '|' (pipe) delimited
- The restriction on the number of aliases has been removed .. though each alias will still be limited to the access level of the parent command
- If you need need more name space for aliases, simply edit the `command_settings` table and increase the size of the `aliases` column
- The old `commands` table has been renamed to `commands_old` for reference
- All of the current 'standard' commands have been added to the new `command_settings` table

- YOU WILL NEED TO VERIFY/IMPORT OLD ACCESS VALUES AS THIS CHANGE REVERTS ALL COMMAND ACCESS VALUES TO THEIR PEQDB DEFAULTS

== 11/30/2015 ==
Uleat: Changed criteria for a few bots scripts from count to null/not null in hopes of fixing special case failures

== 11/22/2015 ==
Uleat: Fix for loginserver project compile failure

== 11/7/2015 ==
Akkadius: Implemented #repopclose [distance in units] - Used for development purposes, defaults to 500 units
- Real case use: Large zones with 700 NPC's and you are making fast quick tweaks to nearby NPC's you can refresh just the NPC's around you instead of all in the zone
- This can be quite the time saver
- This command will depop all NPC's and only respawn the NPC's that are 500 units around you or unless you specify otherwise

== 11/2/2015 ==
Akkadius: Performance boost (exponential) - Adjusted default idle cast check timers in rules
- Spells:AI_IdleNoSpellMinRecast 500 (Now 6000) 6 seconds
- Spells:AI_IdleNoSpellMaxRecast 2000 (Now 60000) 60 seconds
- Database version 9089 will take care of this update automatically only if you used the default values
- The CPU cost of NPC's checking the entire entity list to cast beneficial spells (Heals/Buffs) becomes extremely high when higher NPC count zones exist (Based off of process profiling)
- Distance checks for every single NPC to every single other NPC who are casting beneficial spells occur every .5 - 2 seconds unless npc_spells dictates other values, which most of the time it does not
- Zones that once fluctuated from 1-8% CPU with no activity (Idle but players present) now idle at .5% based on my testings due
to this change in conjunction with the past few performance commits, these are zones that have 600-800 NPC's in them
- These values normally are overidden by the spells table (npc_spells), fields (idle_no_sp_recast_min, idle_no_sp_recast_max)

== 11/1/2015 ==
Akkadius: Made many performance optimizing oriented code changes in the source
- Added Rate limit the rate in which signals are processed for NPC's (.5 seconds instead of .01 seconds)
Akkadius: Added Perl Export Settings which should heavily reduce the Perl footprint
- Normally when any sub EVENT_ gets triggered, all kinds of variables have to get exported every single time an event is triggered and
this can make Perl very slow when events are triggered constantly
- The two most taxing variable exports are the item variables ($itemcount{} $hasitem{} $oncursor{}) and qglobals ($qglobals{})
- qglobals can pose to be an issue quickly when global qglobals build up, it is highly recommend to use the GetGlobal() and SetGlobal()
methods instead as they don't reference the hashmap $qglobals{} that is rebuilt every single time a sub event is triggered
- A stress test conducted with 10,000 samples shows an excess of time taken to export variables: http://i.imgur.com/NEpW1tS.png
- After the Perl Export Settings table is implemented, and all exports are shut off you see the following test result:http://i.imgur.com/Du5hth9.png
- The difference of eliminating uneeded exports brings the overhead and footprint of 10,000 triggers from 54 seconds to 2 seconds
- In a 10,000 sample test (10,000 sub event triggers), exporting item variables adds 12 seconds alone, when item variables are only needed in
EVENT_ITEM and EVENT_SAY a majority of the time if at all
- In a 10,000 sample test (10,000 sub event triggers), exporting qglobals with approximately 1,000 global qglobals in the database creates
about 11-20 seconds of delay on its own (Depending on hardware of course)
- I've written a parser that has determined which of these exports are needed in which sub routines and have turned off all of the unneeded
exports in sub routines that do not need them and used it to create the default table that will be installed in the database.
- The export table is called 'perl_event_export_settings' and it resembles the following structure and contains all current 81 EVENTS
- If an entry doesn't exist in this table and a new subroutine is added to the source, all exports will be on by default for that routine

Kayen: Feign death will now break when hit by casted spells, consisted with live.
Implemented suport for AA/spell effect which provides a chance to avoid FD breaking from spells.

== 10/10/2015 ==
Kayen: Updated mechanics to be consistent with live regarding how invisible breaks when the client is the target of a spell.
Invisible will drop whenever a client is hit with a detrimental spell, regardless of if resisted, if it does damage or AOE.
Hide skill now also follows the same rules as above.
Implemented support for Rogue AA - Nerves of Steel which gives a chance for hide NOT to break
when client is hit with an AOE spell.

== 08/02/2015 ==
Shendare: VS2013 query StringFormat glitches when "%f" is passed for the int GetRunSpeed().
Shendare: In CreateNewNPCCommand(), the npc_type_id and spawngroupid are created in the database, but never set in the spawn class, so later it can't delete them with #npcspawn remove or #npcspawn delete.

== 07/15/2015 ==
Hateborne: Added optional ability to enforce task level requirements in perl and lua via an added, optional parameter to $client->AssignTask and quest::assigntask.
Use cases:
quest::assigntask(703); # this still assigns the task as normal, no functional change
quest::assigntask(703, 1); # this will assign the task, provided the character meets the db-stored level requirements
$client->AssignTask(703, $npc->GetID()); # still assigns the task as normal, no functional change
$client->AssignTask(703, $npc->GetID(), 1); # this will assign the task, provided the character meets the db-stored level requirements
== 07/06/2015 ==
mackal: Implement Triple Attack Skill
Parses showed about rand(1000) for the chance, may need more investigating
Corrected Double Attack chances as well
Running optional 2015_07_06_TripleAttack.sql will set current toons to their max skill
This is optional because the admins might want to go a different route.

== 07/05/2015 ==
mackal: Rewrite NPC combat attack round logic
An NPC "quading" is really just an NPC with innate dual wield that doubles on both hands
The old rules allowed NPCs to hit 6 times in one round
NPCs also seem to have their own skill progression for DW/DA
See: http://www.eqemulator.org/forums/showthread.php?t=38708
You can set Combat:UseLiveCombatRounds to false to use the old rules
PC Double Attack rates kind of follow the same thing but still needs to be implemented
Kinglykrab: WARNING: summonburriedplayercorpse is now summonburiedplayercorpse, getplayerburriedcorpsecount is now getplayerburiedcorpsecount, summon_burried_player_corpse is now summon_buried_player_corpse, and get_player_burried_corpse_count is now get_player_buried_corpse_count FIX THESE IN YOUR SCRIPTS OR THEY WILL NOT WORK!!!!
Added bot saylinks (thanks Uleat!)
Command aliases for #augmentitem (#aug), #findnpctype (#fn), #findspell (#fs)
Bot command changes: #bot sow -> #bot speed, #bot magepet -> #bot setpet, #bot resurrectme -> #bot resurrect
Changed all occurrences of burried to buried in the code.
client_packet.cpp was referencing old columns in character_corpses, not sure how we didn't already see this before.

== 7/4/2015 ==
mackal: Reworked the activated avoidace skills (riposte, dodge, etc) based on dev quotes
This also fixes the order things are checked (avoidance skills, THEN hit/miss)
Also riposte immunity from the increase riposte chance spell effect.

== 7/2/2015 ==
KLS/Demonstar55: AA system has been rewritten fixing a ton of bugs and extending functionality while making it easier to create new AA points.
KLS/Demonstar55: New tables are needed and so older data will need to be migrated to the new system.
KLS/Demonstar55: The SQL saves the old aa points spent/avail/character_alt_abilities data if any server ops want to do something different than PEQ did with it.
KLS/Demonstar55: Will try to get a wiki entry written up next week some time explaining the system but it's really not hard to follow the db tables in the meantime.

== 7/1/2015 ==
Akkadius: Fix an issue where emote messages would overflow the buffer of 256 by increasing the size and changing some of the initialization
Akkadius: Added a custom Health Update message that will display in the middle of the players screen, to enable this server wide you must enable rule 'Character:MarqueeHPUpdates'
Example: https://www.youtube.com/watch?v=KUVdbPxLIn0
Akkadius: (Haynar) Fixed some runspeed issues with Perl and LUA scripts
Akkadius: (Haynar) Updated #showstats and #npcstats for new speed calcs to display speeds again in familiar float format.
Akkadius: (Haynar) Improved client movement while AI Controlled, such as feared and charmed. Movement will be much smoother from clients perspective.

== 06/07/2015 ==
Uleat: Implemented optional rule for using disenchanted bags. Action triggers at the same point that temporary items are removed.
Optional SQL: utils/sql/git/optional/2015_06_07_TransformSummonedBagsRule.sql
mackal: changes to AA packets since more fields have been identified
mackal: fix exploit with expendable AAs punching holes in the aa_array and staying around longer than they are welcomed

== 05/25/2015 ==
Akkadius: Implemented disjointed zone based time, this can be triggered via quest methods
Akkadius: Added parameter to LUA and Perl method settime(hour, minute, [update_world = true])
- If update_world is false, the zone will then unsubscribe itself from regular worldserver time synchronizations
- Basically this localizes the zones time and keeps it from syncing with world updates
Akkadius: Added DB ver 9082 with update to add npc_types texture columns if table does not currently have them

== 05/20/2015 ==
demonstar55: Bard instrument mods should be more consistent with live. Zoning will keep instrument mod for long duration buffs (selo's)
Still need to have procs/doom effects to inherit the instrument mods from their source buff/whatever

== 05/18/2015 ==
KLS: Changed how fishing locates water to hopefully be a bit more accurate at the expense of a bit more cpu power per line cast.

Gregalimule

03-14-2016 03:15 AM

Diggin the super comprehensive update.

epilz

03-14-2016 12:48 PM

nice update Akka

Tabasco

03-15-2016 09:46 AM

It's great to see things coming along.
I would have loved having that tools cheat-sheet, not to mention the tools themselves, when I first started tinkering around here.
The 3D editor probably belongs in the DB/Server editor section though. It can't actually do anything to mod the client and works directly with a server database.

Keep up the excellent work!

ChaosSlayerZ

03-16-2016 12:12 AM

AMM-FREAKEN-MAZING!!!

I wish I could have time to get back to my server idea - a lot of things would have been so much easier now! ;)