Compare commits

...

1813 Commits

Author SHA1 Message Date
KimLS 9733f04c9c Merge of changelog, how i hate thee 2014-09-20 15:10:33 -07:00
KimLS 7140a2054f Ban and suspend commands now require a reason that is recorded in the DB 2014-09-20 15:09:43 -07:00
Michael Cook (mackal) 1049e48aca Add Spells:SHDProcIDOffByeOne to support newer spell files
In June 2009 SoE stopped doing a +1 to the base for SHD procs
So UF+ spell files were not working, set this to false to support these spell files
2014-09-20 16:58:35 -04:00
Michael Cook (mackal) 33b79a3588 Limit character length to 15 (the client doesn't let you enter more) 2014-09-20 15:59:34 -04:00
Michael Cook (mackal) f82699c39b Fix crash in SendEnterWorld on illegally long names 2014-09-20 15:55:20 -04:00
Michael Cook (mackal) 15eaf4e6d1 Fix issue with not online message from tells 2014-09-20 14:57:15 -04:00
Michael Cook (mackal) 7621882b4e Fix toon names being allowed with lower case starting char 2014-09-20 02:46:04 -04:00
Michael Cook (mackal) 9b70b73759 Correct tell queue related messages 2014-09-19 18:17:42 -04:00
Michael Cook (mackal) 8e43134bda Add Client::Tell_StringID for tell queue messages 2014-09-19 18:16:52 -04:00
Michael Cook (mackal) d26782b093 Nuke #viewmessages 2014-09-18 22:56:16 -04:00
Michael Cook (mackal) a2368b4ea7 Implement tell queues
Default queue size 20 (World:TellQueueSize)
This doe not play well with multiple sessions and a toon crashes and relogs
Normal tells have issues as well.
2014-09-18 22:55:06 -04:00
Michael Cook (mackal) 3d6bb964df Stop nuking MySQLRequestResult Success flag 2014-09-18 14:59:50 -04:00
Michael Cook (mackal) 347ae1bc34 Fix error in 64f5bfd 2014-09-18 01:29:30 -04:00
Michael Cook (mackal) 64f5bfd5ce Make tell message a bit more understandable. 2014-09-17 23:46:54 -04:00
Michael Cook (mackal) 86c1420f6e Fix some effect value calcs and implement more
Derived from the client
2014-09-17 00:01:32 -04:00
Uleat 364ed921ce Fix for LoadBuffs() server crash 2014-09-16 22:57:15 -04:00
Michael Cook (mackal) 85e1518856 Implement spell formula 137
This is only used in the BER AA Desperation
2014-09-16 18:35:49 -04:00
Michael Cook (mackal) 11ce399e0d Mob::ProcessSpecialAbilities pass by reference 2014-09-15 20:31:45 -04:00
Michael Cook (mackal) ec0989454d QGlobalCache::LoadBy to pass by reference 2014-09-15 20:11:56 -04:00
Michael Cook (mackal) e9f6031936 Merge pull request #250 from KayenEQ/Development
Nimbus Updates / Other fixes
2014-09-15 18:57:47 -04:00
KayenEQ 03485ef1e0 Nimbus effects will now be reapplied after zoning.
Nimbus effects will now fade when associated buff is removed.
Fix for ReduceAllDamage function.
2014-09-15 16:05:57 -04:00
Michael Cook (mackal) e256175ce6 Style nits 2014-09-14 16:00:18 -04:00
Michael Cook (mackal) 0f662bf70c Fix ZoneDatabase::LoadTraderItem not returning anything valid 2014-09-14 15:58:08 -04:00
Michael Cook (mackal) 4c959159c2 Fix rogues not starting with Thieves' Cant 2014-09-13 03:20:43 -04:00
Michael Cook (mackal) d51241720a Fix attack_delay for real 2014-09-12 13:10:03 -04:00
Michael Cook (mackal) 873d343529 Fix ZoneDatabase::GetNPCType nuking attack_delay changes 2014-09-12 11:57:09 -04:00
Michael Cook (mackal) 95969ce67b Fix ZoneDatabase::GetZoneCFG for real 2014-09-11 18:28:25 -04:00
Michael Cook (mackal) bd5cdf502e Fix ZoneDatabase::GetZoneCFG errors 2014-09-11 18:24:40 -04:00
Michael Cook (mackal) c6a7d5a96c Revert "GetAccountInfoForLogin_result converted to MySQLRequestResult"
This reverts commit 8369570b50.

Conflicts:
	zone/zonedb.h
2014-09-11 16:57:00 -04:00
Michael Cook (mackal) 6bc4ecf390 Revert "LoadFactionValues converted to QueryDatabase"
This reverts commit 2df823d2db.
2014-09-11 16:56:15 -04:00
Michael Cook (mackal) c94ceb5b1d Revert "LoadFactionValues_result converted to MySQLRequestResult"
This reverts commit 2e84781594.
2014-09-11 16:55:58 -04:00
Alex bb702335e8 Merge pull request #247 from KayenEQ/Development
Development
2014-09-11 00:21:45 -07:00
Alex 863c0c5b58 Merge pull request #241 from addtheice/RunQueryToDatabaseQuery_zone_titles
Run query to database query zone titles
2014-09-11 00:21:00 -07:00
Alex 76e280da4e Merge pull request #239 from addtheice/RunQueryToDatabaseQuery_zone_waypoints
GetHighestGrid converted to QueryDatabase
2014-09-11 00:19:43 -07:00
Alex bcca35b7b7 Merge pull request #238 from addtheice/RunQueryToDatabaseQuery_zone_guild_mgr
AddItem converted to QueryDatabase
2014-09-11 00:18:57 -07:00
Alex 65abaade88 Merge pull request #237 from addtheice/RunQueryToDatabaseQuery_zone_guild
Run query to database query zone guild
2014-09-11 00:18:21 -07:00
Alex 8020e921aa Merge pull request #234 from addtheice/RunQueryToDatabaseQuery_queryserv_database
Run query to database query queryserv database
2014-09-11 00:17:56 -07:00
Alex f2f5b4c1ad Merge pull request #222 from addtheice/RunQueryToDatabaseQuery_zone_client
Run query to database query zone client
2014-09-11 00:16:37 -07:00
Alex 5c6f9fcdc4 Merge pull request #215 from addtheice/RunQueryToDatabaseQuery_zone_zonedb
Run query to database query zone zonedb
2014-09-11 00:16:15 -07:00
KimLS 9e243a2426 bestz will no longer scale off of model size, also it adjusts up less extremely in general. Fixed super duper attack speed on command spawned npcs 2014-09-10 22:33:30 -07:00
Arthur Ice 9a889802d3 merge upstream. yet again 2014-09-09 21:26:26 -07:00
Michael Cook (mackal) 1420987c4c Fix copy paste error 2014-09-10 00:07:16 -04:00
Michael Cook (mackal) ed4d954ba8 Added attackdelay to #npcedit
Also changelog!
2014-09-10 00:05:00 -04:00
Michael Cook (mackal) 881f937a35 Change scale of GetPermaHaste() 2014-09-09 22:50:50 -04:00
Michael Cook (mackal) ed4e762f03 Change NPCs to have their attack delay set in DB
This gives us a much more straight forward way of setting mob
attack delay with respect to live.

The attack_delay column is in 10ths of seconds, just like weapons are
The attack_speed is left for references for now.
2014-09-09 22:42:54 -04:00
Michael Cook (mackal) fa1e33783a Split Mob::SetAttackTimer into Client and NPC methods
This was the easiest way to NPCs delay settings to be sane in the database.
The functions are cleaner since there is no specific logic to change
behavior depending on if they're a client or not.
2014-09-09 22:13:30 -04:00
Michael Cook (mackal) 2fa31799f6 Port slow fixes to bots 2014-09-09 17:02:05 -04:00
Michael Cook (mackal) 6c3d5c713c Fix slow effect on NPC special attack reuse timers 2014-09-09 15:34:30 -04:00
Michael Cook (mackal) f16beddf6e Increase NPC bash/kick delay by 3 (8 total by default) 2014-09-09 15:32:02 -04:00
Michael Cook (mackal) 506b3ca4a0 Fix slow calculation
Full details: http://www.eqemulator.org/forums/showthread.php?t=38734
2014-09-08 21:43:25 -04:00
KimLS 80242bd250 Strange crash hack/workaround that occured on peq 2014-09-08 17:02:37 -07:00
KimLS 7f7f99cbe3 BestZ will now adjust for model size when used to adjust movement z 2014-09-08 16:45:20 -07:00
KimLS 579294fbf0 Fixed many bugs with partial resist calculations, targets with higher resist should have a more natural curve when it comes to resisting spells 2014-09-08 03:04:22 -07:00
KimLS a3b54e5cae Fix for forage crash 2014-09-07 22:41:42 -07:00
akkadius b392d16808 Fixed ROF Augment item dupe with not checking for available slots properly and adding items to the virtual instance 2014-09-07 05:43:37 -05:00
KayenEQ 616e13acac Calc fix for spell power distance mod effect. 2014-09-07 03:43:34 -04:00
KayenEQ b50f660339 Merge git://github.com/EQEmu/Server into Development 2014-09-07 03:40:12 -04:00
KimLS 84310ec8f0 Merge branch 'master' of github.com:EQEmu/Server 2014-09-06 17:09:33 -07:00
KimLS ffed5a9e22 SQL Injection fix on inspect message setting 2014-09-06 16:43:36 -07:00
Michael Cook (mackal) 92c9ff6e53 Fix issue with hpregen in command_npcedit 2014-09-06 17:58:42 -04:00
KimLS 986a424322 Fix for perl api illusion 2014-09-06 14:31:02 -07:00
Uleat c3e7c48939 Fix ItemTimerCheck() range criteria typo 2014-09-06 16:19:32 -04:00
Arthur Ice b2aa3262a9 Update client.cpp
fixed bug with BEGIN_GENERAL to MainCursor being skipped before since it was starting at GENERAL_BAGS_BEGIN
2014-09-06 12:56:35 -07:00
Arthur Ice b1587f0326 Delete client.cpp.orig
not supposed to be in there.
2014-09-06 12:51:50 -07:00
Uleat 281b321237 Changed trade behavior to prioritize all main slots before sub slots 2014-09-06 12:45:45 -04:00
KimLS ba0e4bfc1d Bizarre issue reported with SendIllusionPacket corrupting size in lua, dunno if this fixes it but fingers crossed. 2014-09-05 21:18:35 -07:00
Michael Cook (mackal) 3cda62acf4 Fix changelog [skip ci] 2014-09-05 22:38:32 -04:00
Michael Cook (mackal) 2ef43212e1 Fix size issue with Lua_Mob::SendIllusionPacket
Mob::SendIllusionPacket was expecting the size to be 0xFFFFFFFF
to default rather than -1.0f
2014-09-05 22:36:44 -04:00
Michael Cook (mackal) f69eccc42b Add missing QueryDatabase in ZoneDatabase::AddWPForSpawn 2014-09-05 21:57:34 -04:00
Michael Cook (mackal) a1e425f936 Fix indentation of ZoneDatabase::AddWPForSpawn 2014-09-05 21:57:34 -04:00
Uleat 6186c3d866 Fix for gcc failure - Can't fix stupid! 2014-09-05 16:46:03 -04:00
Uleat 1d0a6bdc71 Fix for losing 2nd and 3rd cursor items after zoning 2014-09-05 16:16:56 -04:00
Michael Cook (mackal) da121137e5 Fix logging macros
macros should be fully wrapped in do { ... } while(false) to prevent
any accidental coding issues (like else being eaten!!!)
2014-09-05 13:26:44 -04:00
Michael Cook (mackal) c953f1dee1 Merge pull request #244 from addtheice/merc_stance_fix
Fix iterator on mercstance crash bug
2014-09-05 02:30:13 -04:00
Arthur Ice 32b595afb4 Fix iterator on mercstance crash bug 2014-09-04 23:15:20 -07:00
Arthur Ice 399bf96a0c RemoveTitle converted to QueryDatabase 2014-09-03 21:05:31 -07:00
Arthur Ice b7c409e11b CheckTitle converted to QueryDatabase 2014-09-03 21:03:00 -07:00
Arthur Ice fd08e9f2ad EnableTitle converted to QueryDatabase 2014-09-03 21:00:15 -07:00
Uleat 37d3daaf9a Client timer issue fix 2014-09-03 23:59:55 -04:00
Arthur Ice 9a4d01da8f CreateNewPlayerSuffix converted to QueryDatabase 2014-09-03 20:57:34 -07:00
Arthur Ice 81cf748b2b CreateNewPlayerTitle converted to QueryDatabase 2014-09-03 20:52:00 -07:00
Michael Cook (mackal) 22742b6a25 Add #shownumhits workaround command to show numhits 2014-09-03 23:50:23 -04:00
Arthur Ice 7d8d96c049 LoadTitles converted to QueryDatabase 2014-09-03 20:45:38 -07:00
Arthur Ice f5e49441b6 GetHighestGrid converted to QueryDatabase 2014-09-03 19:28:25 -07:00
Arthur Ice 610f3ed37f AddItem converted to QueryDatabase 2014-09-03 19:17:55 -07:00
Arthur Ice f215874486 SetGuildDoor converted to QueryDatabase 2014-09-03 19:10:27 -07:00
Arthur Ice 8e529105cf CheckGuildDoor converted to QueryDatabase 2014-09-03 19:07:49 -07:00
SecretsOTheP 891952eb79 Bot fixes for previous commit 2014-09-03 18:34:31 -04:00
SecretsOTheP e6a0b01f37 Identified the routines needed to augment items in RoF. Currently, only Insert and Remove are supported. Swap and Destroy do not work due to missing functions related to the cursor. 2014-09-03 18:25:21 -04:00
SecretsOTheP 64c324a42b changelog.txt 2014-09-02 22:09:38 -04:00
SecretsOTheP f909e76260 Merge branch 'master' of https://github.com/EQEmu/Server 2014-09-02 22:08:47 -04:00
SecretsOTheP b7dfdc5060 Oops. 2014-09-02 22:07:49 -04:00
Uleat e25239a50d Merge branch 'master' of https://github.com/EQEmu/Server 2014-09-02 21:20:06 -04:00
Uleat 76d3edc534 Changed #loc to report the same precision as /loc for Cartesians 2014-09-02 21:19:30 -04:00
SecretsOTheP 7301182b3e Merge branch 'master' of https://github.com/EQEmu/Server
Conflicts:
	changelog.txt
2014-09-02 21:18:30 -04:00
SecretsOTheP 832e5e90d1 Secrets: Identified OP_GuildPromote for RoF clients.
Secrets: Fixed promotion, demotion, transferring a leader and displaying of client ranks in the Rain of Fear client. The rain of fear client, as such, will only have 3 ranks like the other clients, but supports a theoretical 8 ranks later.
Secrets/Akkadius: Fixed an issue involving character name lookup in the new DB code.
2014-09-02 21:16:20 -04:00
Michael Cook (mackal) 7ddaabee30 Merge pull request #235 from addtheice/guild_mgr_patch
Fixed bug with loading failing on Guild bank areas
2014-09-02 16:11:05 -04:00
Arthur Dene Ice 41d57ddab6 Fixed bug with loading failing on Guild bank areas 2014-09-02 12:43:56 -07:00
Michael Cook (mackal) 8dd00f5288 Fix crash issue in zone/hate_list.cpp 2014-09-02 02:39:03 -04:00
KimLS 15f217b594 Fixed non-conforming sql files. 2014-09-01 15:48:22 -07:00
Michael Cook (mackal) 8422178233 Fix issue with requesting an adventure 2014-09-01 02:58:52 -04:00
Uleat eebe902917 Script update for opcode_handlers.py - changes in file names. 2014-09-01 00:07:21 -04:00
KimLS 04dc593df9 Various bug fixes 2014-08-31 20:27:02 -07:00
Michael Cook (mackal) 11ed698642 (noudess) Merchants are more descriptive in their rejections 2014-08-30 01:38:49 -04:00
Arthur Ice 0996570b78 merge from upstream 2014-08-28 15:49:16 -07:00
KimLS ca84040a39 Crash fixes oh my 2014-08-28 03:47:28 -07:00
KimLS 467afc86af Merge branch 'master' of github.com:EQEmu/Server 2014-08-28 03:18:02 -07:00
KimLS 19271f90a4 Crash fixes 2014-08-28 03:17:47 -07:00
Arthur Ice 0a9732a267 LogMerchantTransaction converted to QueryDatabase 2014-08-28 00:10:55 -07:00
Arthur Ice 1bc06c9c24 LogPlayerMove converted to QueryDatabase 2014-08-28 00:05:28 -07:00
Arthur Ice e0acc937b3 LogPlayerDelete converted to QueryDatabase 2014-08-28 00:04:20 -07:00
Arthur Ice 3a10a0129a LogPlayerNPCKill converted to QueryDatabase 2014-08-27 23:53:37 -07:00
Arthur Ice 18dbcf16cc LogPlayerHandin converted to QueryDatabase 2014-08-27 23:52:36 -07:00
Arthur Ice bed8dc7d34 LogPlayerTrade converted to QueryDatabase 2014-08-27 23:52:35 -07:00
Arthur Ice a0fc9844fd AddSpeech converted to QueryDatabase 2014-08-27 23:21:09 -07:00
Michael Cook (mackal) 9d6dc47cf4 Fix crash with MySQLRequestResult::ErrorMessage() 2014-08-28 02:15:37 -04:00
Michael Cook d42d77d3ef Merge pull request #233 from addtheice/master
Fixed crash on expire mail success, messages where switched accidentally
2014-08-28 02:13:27 -04:00
Arthur Ice 9041891557 Fixed crash on expire mail success, messages where switched accidentally 2014-08-27 22:57:03 -07:00
akkadius dedd1fc70d NPC::ModifyNPCStat function bloat cleanup 2014-08-27 14:26:36 -05:00
Arthur Ice 9ddb56088e merge from master 2014-08-26 18:49:15 -07:00
Alex 9f4167a65c Merge pull request #230 from addtheice/RunQueryToDatabaseQuery_zone_guild_mgr
Run query to database query zone guild mgr
2014-08-26 17:36:46 -07:00
Alex 085b021587 Merge pull request #226 from addtheice/RunQueryToDatabaseQuery_zone_spawngroup
Run query to database query zone spawngroup
2014-08-26 17:36:17 -07:00
Alex 5a65fd4207 Merge pull request #227 from addtheice/RunQueryToDatabaseQuery_zone_spawn2
Run query to database query zone spawn2
2014-08-26 17:36:03 -07:00
Alex 0f321b3a69 Merge pull request #228 from addtheice/RunQueryToDatabaseQuery_zone_client_packet
Run query to database query zone client packet
2014-08-26 17:35:51 -07:00
Alex 53c7b789f2 Merge pull request #229 from KayenEQ/Development
Added new param  to special attack NPC_NO_CHASE
2014-08-26 17:35:36 -07:00
Alex 850ea7789e Merge pull request #225 from addtheice/RunQueryToDatabaseQuery_zone_spells
SpellGlobalCheck converted to QueryDatabase
2014-08-26 17:35:21 -07:00
Alex c3a3dc19a7 Merge pull request #224 from addtheice/RunQueryToDatabaseQuery_zone_zone
LoadStaticZonePoints converted to QueryDatabase
2014-08-26 17:35:10 -07:00
Alex 2606592f32 Merge pull request #223 from addtheice/RunQueryToDatabaseQuery_zone_doors
Run query to database query zone doors
2014-08-26 17:34:53 -07:00
Alex 5c3791631a Merge pull request #221 from addtheice/RunQueryToDatabaseQuery_ucs_database
Run query to database query ucs database
2014-08-26 17:34:36 -07:00
Alex 4c9108a906 Merge pull request #210 from addtheice/RunQueryToDatabaseQuery_zone_waypoints
Run query to database query zone waypoints
2014-08-26 17:34:23 -07:00
Uleat efbcaf6f64 Merge pull request #231 from EQEmu/trade_stacking
'Smart' Trade Transfers
2014-08-26 19:04:01 -04:00
Uleat 18a4f831be Tweaked QS code for Client::FinishTrade() and QueryServ handlers. 2014-08-26 06:37:40 -04:00
KimLS 6597967acd Changed void* to EQEmu::Any in quest interface. Been meaning to change from void* for a while to a structure that data hides instead. 2014-08-25 22:59:52 -07:00
KimLS 24825677dc Merge branch 'master' of github.com:EQEmu/Server 2014-08-25 22:31:15 -07:00
KimLS 70d5983562 Added eqemu::any 2014-08-25 22:31:02 -07:00
Uleat d4a9fed45e Added QS code to Client::FinishTrade() 2014-08-25 22:29:00 -04:00
Arthur Ice a6b923a22e UpdateItemQuantity converted to QueryDatabase 2014-08-25 15:10:46 -07:00
Arthur Ice 1e87086471 DeleteItem converted to QueryDatabase 2014-08-25 12:43:14 -07:00
Arthur Ice c3fdbfe904 SetPermissions converted to QueryDatabase 2014-08-25 12:33:09 -07:00
Arthur Ice 00852063c2 Promote converted to QueryDatabase 2014-08-25 12:15:06 -07:00
KayenEQ 44dcf7af7d Merge git://github.com/EQEmu/Server into Development 2014-08-25 09:23:23 -04:00
Uleat d525d040fe Merge branch 'master' of https://github.com/EQEmu/Server into trade_stacking 2014-08-24 23:40:15 -04:00
Michael Cook (mackal) 67a774dd9b Remove extra c_str() non-sense now that the bug is fixed 2014-08-24 22:28:37 -04:00
Uleat ff7ff658e0 Merge branch 'master' of https://github.com/EQEmu/Server into trade_stacking
Conflicts:
	changelog.txt
2014-08-24 21:38:01 -04:00
Uleat 6100da75c5 Merge branch 'master' of https://github.com/EQEmu/Server into shutdown_crash 2014-08-24 19:59:34 -04:00
KimLS a612c3c006 Idiot kls missed a file 2014-08-24 16:30:02 -07:00
KimLS 412835d7fa Basic string tests, plus fix for StringFormat returning a std::string that was just very subtley malformed. 2014-08-24 16:26:51 -07:00
Uleat 6a4f7466f0 Merge branch 'master' of https://github.com/EQEmu/Server into shutdown_crash
Conflicts:
	changelog.txt
2014-08-24 19:24:07 -04:00
KayenEQ b3ea7ecd0d Added param to special attack NPC_NO_CHASE
Param 2 = If set will disable LOS check
2014-08-24 19:11:41 -04:00
Arthur Ice 50e6d0d256 Load converted to QueryDatabase 2014-08-24 16:03:48 -07:00
Arthur Ice f948786f6a Handle_OP_GMSearchCorpse converted to QueryDatabase 2014-08-24 14:21:33 -07:00
Arthur Ice 4d0179d525 Handle_OP_SetStartCity converted to QueryDatabase 2014-08-24 14:13:06 -07:00
Arthur Ice c851cd3f12 Handle_OP_ItemLinkClick converted to QueryDatabase 2014-08-24 14:06:52 -07:00
Arthur Ice b6875564d4 GetCondition converted to QueryDatabase 2014-08-24 13:50:23 -07:00
Arthur Ice 0240c61952 LoadSpawnConditions converted to QueryDatabase 2014-08-24 13:31:55 -07:00
Arthur Ice 7864a5285d LoadDBEvent converted to QueryDatabase 2014-08-24 13:19:30 -07:00
Arthur Ice 538921701c UpdatedDBCondition converted to QueryDatabase 2014-08-24 13:19:30 -07:00
Arthur Ice 3cf4d4af1b UpdateDBEvent converted to QueryDatabase 2014-08-24 13:11:17 -07:00
Arthur Ice c70c7e13ec CreateSpawn2 converted to QueryDatabase 2014-08-24 13:07:15 -07:00
Arthur Ice 9980dfe80e LoadSpawn2 converted to QueryDatabase 2014-08-24 13:03:45 -07:00
Arthur Ice 42a51eb373 PopulateZoneSpawnList converted to QueryDatabase 2014-08-24 13:00:39 -07:00
Arthur Ice 932dd836d0 LoadSpawnGroupsByID converted to QueryDatabase 2014-08-24 12:54:06 -07:00
Arthur Ice adf36bf912 LoadSpawnGroups converted to QueryDatabase 2014-08-24 12:46:02 -07:00
Arthur Ice e7ef4b5484 SpellGlobalCheck converted to QueryDatabase 2014-08-24 12:37:44 -07:00
Arthur Ice 3d1521857e LoadStaticZonePoints converted to QueryDatabase 2014-08-24 12:21:16 -07:00
Arthur Ice 9707b53df2 LoadDoors converted to QueryDatabase 2014-08-24 12:14:28 -07:00
Arthur Ice 5d6d489889 GetDoorsDBCountPlusOne converted to QueryDatabase 2014-08-24 12:08:39 -07:00
Arthur Ice 8f4e2e99db GetDoorsCountPlusOne converted to QueryDatabase 2014-08-24 12:04:15 -07:00
Arthur Ice 377c6a87a2 GetDoorsCount converted to QueryDatabase 2014-08-24 11:53:28 -07:00
Alex b36cc3ab08 Merge pull request #209 from addtheice/RunQueryToDatabaseQuery_zone_tribute
Run query to database query zone tribute
2014-08-24 11:18:38 -07:00
Alex 339b8e37a6 Merge pull request #208 from addtheice/RunQueryToDatabaseQuery_zone_trap
Run query to database query zone trap
2014-08-24 11:18:25 -07:00
Alex 8f3e9b4a7a Merge pull request #218 from KayenEQ/Development
Implemented NPC special ability 40 'NPC_CHASE_DISTANCE'
2014-08-24 11:17:52 -07:00
akkadius 633583c266 Created character_lookup table for applications that mirrors all character_ table fields minus blob fields for application lookups
- A 2.4GB character_ table will take 7 seconds to query on a SSD versus .1s on the character_lookup table
	- This also causes applications like Magelo to burst reads of the entire character table because of the blob fields that come with the reads, as much as 500-600MB/s even if a indexed id filter is provided
	- This field is synchronized on player save and has 0.001s DB hit
	- When we split out from the blob, ideally this table can be removed, but it really does no harm in mirroring data when a 2.6GB character table mirrors everything subtracting blob data down to 8MB
	- Required SQL: utils\sql\git\required\2014_08_24_character_lookup.sql
2014-08-24 08:52:14 -05:00
akkadius 3b048ee8a2 Character creation process crash fix (world) and query cleanup 2014-08-24 07:13:15 -05:00
Uleat 52ae78709b First attempt at fixing zone shutdown crashes. (Mob timer processing accessing released resources.) 2014-08-24 05:42:43 -04:00
Arthur Ice dec290ba96 Merge branch 'master' of git://github.com/EQEmu/Server into RunQueryToDatabaseQuery_ucs_database 2014-08-24 02:07:19 -07:00
akkadius cef1dfd0c0 Query Fix for SendQuery (Temporary) 2014-08-24 02:50:39 -05:00
Arthur Ice 3262bee6c5 ExpeditionSay converted to QueryDatabase 2014-08-23 23:26:45 -07:00
Arthur Ice 2dbd616725 SetAccountFlag converted to QueryDatabase 2014-08-23 23:23:26 -07:00
Arthur Ice eb98563fa1 LoadAccountFlags converted to QueryDatabase 2014-08-23 23:20:55 -07:00
Arthur Ice 7f92e96ae7 TryReward converted to QueryDatabase 2014-08-23 23:15:49 -07:00
Arthur Ice a48138dfd6 SendRewards converted to QueryDatabase 2014-08-23 23:05:58 -07:00
Michael Cook (mackal) 0b486b3f76 strlen to std::string::length
Minor style nits!
2014-08-24 02:02:42 -04:00
Arthur Ice 46980e5260 DiscoverItem converted to QueryDatabase 2014-08-23 22:59:58 -07:00
Arthur Ice 44f9e5495e IsDiscovered converted to QueryDatabase 2014-08-23 22:59:53 -07:00
Arthur Ice 97f59282cf KeyRingAdd converted to QueryDatabase 2014-08-23 22:49:27 -07:00
Michael Cook (mackal) b112dfe860 Fix gcc compile error 2014-08-24 01:48:29 -04:00
Arthur Ice 2a4a5b1beb KeyRingLoad converted to QueryDatabase 2014-08-23 22:46:29 -07:00
Arthur Ice 232d61b983 GetFriendAndIgnore converted to QueryDatabase 2014-08-23 22:34:14 -07:00
akkadius 4e10b77980 2nd Nix fix 2014-08-24 00:28:45 -05:00
Arthur Ice c1469a3a8e RemoveFriendOrIgnore converted to QueryDatabase 2014-08-23 22:22:49 -07:00
Arthur Ice 9d5f427f57 AddFriendOrIgnore converted to QueryDatabase 2014-08-23 22:20:16 -07:00
akkadius cdd1e17348 Cosmetic log fix from merge 2014-08-24 00:17:31 -05:00
Arthur Ice 20e978b676 ExpiredMail converted to QueryDatabase 2014-08-23 22:16:47 -07:00
akkadius 163906e0f0 Nix fix 2014-08-24 00:09:09 -05:00
Arthur Ice c9bd662b57 SetMessageStatus converted to QueryDatabase 2014-08-23 22:07:04 -07:00
Arthur Ice 8529384b00 SendMail converted to QueryDatabase 2014-08-23 22:01:00 -07:00
akkadius 7f89191ffc Changed zone process window title format, example: 'crushbone :: clients: 6 inst_id: 1 inst_ver: 0 :: port: 7015'
Most of the following changes are QueryServ related, fully implemented its original functionality to be able to offload
	intensive or metric based logging to a remote server process that could exist on another server entirely
Implemented Player Event Logging Types (Go to table `qs_player_events`):
		1 = Player_Log_Quest,
		2 = Player_Log_Zoning,
		3 = Player_Log_Deaths,
		4 = Player_Log_Connect_State,
		5 = Player_Log_Levels,
		6 = Player_Log_Keyring_Addition,
		7 = Player_Log_QGlobal_Update,
		8 = Player_Log_Task_Updates,
		9 = Player_Log_AA_Purchases,
		10 = Player_Log_Trade_Skill_Events,
		11 = Player_Log_Issued_Commands,
		12 = Player_Log_Money_Transactions,
		13 = Player_Log_Alternate_Currency_Transactions,
		- All QueryServ logging will be implemented with a front end in EoC 2.0 very soon
Changed all QS Error related logging to 'QUERYSERV__ERROR'
(Natedog) (Crash Fix) Legacy MySQL bug revert for loading AA's COALESCE( from COALESCE (
Implemented Perl Quest objects (LUA still needed to be exported):
	- quest::qs_send_query("MySQL query") - Will send a raw query to the QueryServ process, useful for custom logging
	- quest::qs_player_event(char_id, event_desc); - Will process a quest type event to table `qs_player_events`
Added MySQL Tables:
	- `qs_player_aa_rate_hourly`
	- `qs_player_events`
	- Source table structures from:
		- utils\sql\git\queryserv\required\08_23_2014_player_events_and_player_aa_rate_hourly
		To get the complete QueryServ schema, source from here:
		- utils\sql\git\queryserv\required\Complete_QueryServ_Table_Structures.sql
Added rules for each logging type, source rules here with them enabled by default:
	- utils\sql\git\queryserv\required\Complete_QueryServ_Rules_Enabled.sql
Spawn related logging cleanup
General code cleanup
Added queryserv.cpp and queryserv.h with QueryServ class
2014-08-23 23:59:20 -05:00
Arthur Ice aaf5f8c930 SendBody converted to QueryDatabase 2014-08-23 21:52:07 -07:00
Arthur Ice 2bdc44dfb2 SendHeaders converted to QueryDatabase 2014-08-23 21:48:14 -07:00
Arthur Ice 6e7136ea18 SetChannelOwner converted to QueryDatabase 2014-08-23 21:38:57 -07:00
Arthur Ice 7a507e8d1e SetChannelPassword converted to QueryDatabase 2014-08-23 21:34:27 -07:00
Arthur Ice 76fdfa87c1 LoadChatChannels converted to QueryDatabase 2014-08-23 21:31:26 -07:00
Arthur Ice 19486bac0d GetVariable converted to QueryDatabase 2014-08-23 21:27:18 -07:00
Arthur Ice de47755320 FindCharacter converted to QueryDatabase 2014-08-23 21:24:54 -07:00
Arthur Ice 6b90f883cd VerifyMailKey converted to QueryDatabase 2014-08-23 21:20:07 -07:00
Arthur Ice 5c640b2d40 FindAccount converted to QueryDatabase 2014-08-23 21:16:27 -07:00
Arthur Ice a568a6f194 GetAccountStatus converted to QueryDatabase 2014-08-23 21:10:30 -07:00
KayenEQ 85df09b3f2 Implemented NPC special ability 40 'NPC_CHASE_DISTANCE'
Param 0: Sets max distance you need to be away from an npc for it to chase you.
Param 1: Sets min distance you need to be from npc for it to chase you.
Usage: Ideally used with ranged attack npcs / casters who you DO NOT WANT
to chase you unless you get too close or too far or out of sight.
2014-08-23 03:21:36 -04:00
JJ 16d47a2c47 Revert accident in 089360a3a5. Looks like it was meant for 7-10 instead of 4-10. 2014-08-22 22:28:40 -04:00
Uleat 9a5d2d2bc5 Trade Stacking: BETA 2014-08-22 20:48:11 -04:00
KimLS 3b16c86007 Fix for aa effect loading. 2014-08-22 14:50:13 -07:00
Alex 7c451f8170 Merge pull request #207 from addtheice/RunQueryToDatabaseQuery_zone_zoning
Run query to database query zone zoning
2014-08-22 13:48:17 -07:00
Alex 2e1b75e95b Merge pull request #203 from addtheice/RunQueryToDatabaseQuery_zone_pets
Run query to database query zone pets
2014-08-22 13:47:59 -07:00
Alex 1cd5970649 Merge pull request #201 from addtheice/RunQueryToDatabaseQuery_zone_mob
Run query to database query zone mob
2014-08-22 13:47:48 -07:00
Alex 1bccdf57ee Merge pull request #200 from addtheice/RunQueryToDatabaseQuery_zone_merc
Run query to database query zone merc
2014-08-22 13:47:29 -07:00
Alex d03232ce1b Merge pull request #199 from addtheice/RunQueryToDatabaseQuery_zone_horse
Run query to database query zone horse
2014-08-22 13:47:07 -07:00
KimLS ba6a3ac94b Merge branch 'KayenEQ-Development' 2014-08-22 00:22:21 -07:00
KimLS 85bd837a66 Merge branch 'Development' of https://github.com/KayenEQ/Server into KayenEQ-Development 2014-08-22 00:21:11 -07:00
KimLS 264024e8fc Merge branch 'addtheice-RunQueryToDatabaseQuery_zone_zone' 2014-08-22 00:19:53 -07:00
KimLS 0d09f5d536 Merging zone 2014-08-22 00:19:43 -07:00
KimLS 840f936c2f Merge branch 'addtheice-RunQueryToDatabaseQuery_zone_AA' 2014-08-22 00:18:29 -07:00
KimLS ca380edfc8 Merge branch 'RunQueryToDatabaseQuery_zone_AA' of https://github.com/addtheice/Server into addtheice-RunQueryToDatabaseQuery_zone_AA 2014-08-22 00:17:53 -07:00
KimLS 389fa922e5 Merge branch 'addtheice-RunQueryToDatabaseQuery_zone_petitions' 2014-08-22 00:16:20 -07:00
KimLS f9423b018c Merging petitions. 2014-08-22 00:16:04 -07:00
Alex 05ccab87f3 Merge pull request #217 from KimLS/master
Renamed a bunch of files.
2014-08-22 00:07:10 -07:00
KimLS 27dec16551 Missed a file, thanks NTFS 2014-08-21 23:55:04 -07:00
KimLS 07a2cbe9a5 Renamed zone files 2014-08-21 23:46:01 -07:00
KimLS 4821ed79fb More renames, world should be done 2014-08-21 23:30:09 -07:00
KimLS 5bf49d2ef9 More renames 2014-08-21 23:05:21 -07:00
KimLS cd0824ee71 Moved some around, more renames 2014-08-21 22:43:33 -07:00
KayenEQ 8394cc9e2b Fix for NPC ranged attacks not allowing for multiple hits
if set by special attack 11, also changed paramater 0 (which was
incorrectly set as both 'amount of attacks' and 'min range'
0 = amount attacks
4 = min attack range

Fix to spell directional effect targeting.
2014-08-22 00:35:14 -04:00
KimLS 504a8b19ce Missed Mutex.h 2014-08-21 19:36:50 -07:00
KimLS 0b63eaa25d Got rid of socket_server, why the heck is it still around 2014-08-21 19:34:45 -07:00
KimLS 7fc21b9e3a Tons of renames 2014-08-21 19:33:02 -07:00
Arthur Ice 8369570b50 GetAccountInfoForLogin_result converted to MySQLRequestResult 2014-08-21 17:35:04 -07:00
KimLS e429260763 Missed eq stream factory 2014-08-21 17:30:00 -07:00
KimLS 06f18225ce Renaming headers is hard work 2014-08-21 17:26:32 -07:00
Arthur Ice 9ff0c414c1 LoadFactionData converted to QueryDatabase 2014-08-21 17:17:27 -07:00
Arthur Ice 850d1e7c28 SetCharacterFactionLevel converted to QueryDatabase 2014-08-21 17:08:31 -07:00
Arthur Ice 2df823d2db LoadFactionValues converted to QueryDatabase 2014-08-21 17:04:08 -07:00
Arthur Ice 2e84781594 LoadFactionValues_result converted to MySQLRequestResult 2014-08-21 17:00:50 -07:00
KimLS 405884f47d More file renames. 2014-08-21 16:59:32 -07:00
KimLS 6457c00548 Renaming files 2014-08-21 16:44:02 -07:00
Michael Cook (mackal) 2e80e56af1 Fix dangling else statements 2014-08-21 19:17:40 -04:00
Michael Cook (mackal) 0ad4ffe33f Fix error in EQRawApplicationPacket::EQRawApplicationPacket() 2014-08-21 19:02:29 -04:00
Arthur Ice 833227f7f6 LoadPetInfo converted to QueryDatabase 2014-08-21 15:58:11 -07:00
Arthur Ice e731cfd48d RemoveTempFactions converted to QueryDatabase 2014-08-21 15:32:20 -07:00
Arthur Ice cf7574d9b8 SavePetInfo converted to QueryDatabase 2014-08-21 15:30:27 -07:00
Michael Cook (mackal) 16f112a281 Fix some if checks in Mob::CalcFocusEffect() 2014-08-21 18:10:40 -04:00
Michael Cook (mackal) 69944d907d Fix compiler warning in zone/inventory.cpp 2014-08-21 17:59:52 -04:00
Michael Cook (mackal) 663dbf9fc2 Fix incorrect array size on A/B/C/DStackers 2014-08-21 17:56:32 -04:00
Michael Cook (mackal) a4a8a1aba5 Clean up some compiler warnings with Stop_Return 2014-08-21 17:54:49 -04:00
Alex fb84f7f84f Merge pull request #198 from addtheice/RunQueryToDatabaseQuery_zone_forage
Run query to database query zone forage
2014-08-21 14:05:32 -07:00
Alex 1c295453da Merge pull request #197 from addtheice/RunQueryToDatabaseQuery_world_zoneserver
Run query to database query world zoneserver
2014-08-21 14:04:50 -07:00
Alex 8199821343 Merge pull request #196 from addtheice/RunQueryToDatabaseQuery_EQLConfig
Run query to database query eql config
2014-08-21 14:04:32 -07:00
Alex b59e856b33 Merge pull request #194 from addtheice/RunQueryToDatabaseQuery_Object
Run query to database query object
2014-08-21 14:04:06 -07:00
Alex f81acf23a7 Merge pull request #195 from addtheice/RunQueryToDatabaseQuery_QGlobals
Run query to database query q globals
2014-08-21 14:03:57 -07:00
Alex 27eba2e6e9 Merge pull request #214 from KinglyKrab/master
Adds new column to 'merchantlist' table.
2014-08-21 14:02:27 -07:00
Arthur Ice 10d384f131 LoadBuffs converted to QueryDatabase 2014-08-21 13:54:18 -07:00
Arthur Ice 00b8c8ce47 SaveBuffs converted to QueryDatabase 2014-08-21 13:42:02 -07:00
Arthur Ice cab43f41be UpdateAltCurrencyValues converted to QueryDatabase 2014-08-21 13:36:01 -07:00
Arthur Ice fc0d589f12 LoadAltCurrencyValues converted to QueryDatabase 2014-08-21 13:34:19 -07:00
Arthur Ice 743175d4ff InsertDoor converted to QueryDatabase 2014-08-21 13:26:38 -07:00
Arthur Ice b497b07fed QGlobalPurge converted to QueryDatabase 2014-08-21 13:22:21 -07:00
Arthur Ice aab5ed2267 ListAllInstances converted to QueryDatabase 2014-08-21 13:19:37 -07:00
Arthur Ice 46c9fe46e9 UpdateKarma converted to QueryDatabase 2014-08-21 13:09:43 -07:00
Arthur Ice e8c92c6fcc GetKarma converted to QueryDatabase 2014-08-21 13:09:43 -07:00
Arthur Ice 765eaf7f4f getZoneShutDownDelay converted to QueryDatabase 2014-08-21 12:51:09 -07:00
Arthur Ice 699c8cc1eb LoadBlockedSpells converted to QueryDatabase 2014-08-21 12:46:52 -07:00
Arthur Ice 5839921e08 GetBlockedSpellsCount converted to QueryDatabase 2014-08-21 12:39:38 -07:00
Arthur Ice a3bde6e1f1 RaidGroupCount converted to QueryDatabase 2014-08-21 12:35:33 -07:00
Arthur Ice 0ece5bf178 GroupCount converted to QueryDatabase 2014-08-21 12:30:06 -07:00
Arthur Ice fbefad9eaf RefreshGroupFromDB converted to QueryDatabase 2014-08-21 12:25:32 -07:00
Arthur Ice 351a7a52fe GetCharacterInfoForLogin removed, unused, unsupported 2014-08-21 12:01:22 -07:00
Arthur Ice 8441ffda31 GetAccountInfoForLogin removed, unused, unsupported 2014-08-21 11:52:15 -07:00
Kinglykrab 8b19c76e89 Adds new column to 'merchantlist' table.
Adds 'probability' after 'classes_required', valid values are 0 to 100.
2014-08-21 04:05:45 -04:00
Arthur Ice e79747c919 SetZoneTZ converted to QueryDatabase 2014-08-20 23:26:41 -07:00
Arthur Ice 8525d819c1 GetZoneTZ converted to QueryDatabase 2014-08-20 23:13:59 -07:00
Arthur Ice fe600bb084 Removed Get/SetServerFilters, unused and unsupported 2014-08-20 23:07:19 -07:00
Arthur Ice babaff1985 GetUseCFGSafeCoords converted to QueryDatabase 2014-08-20 22:14:40 -07:00
Arthur Ice 909ca5440d UpdateZoneSafeCoords converted to QueryDatabase 2014-08-20 22:11:14 -07:00
Arthur Ice e25f64d03b SaveMerchantTemp converted to QueryDatabase 2014-08-20 22:06:56 -07:00
Arthur Ice 2df66bd625 GetGridType converted to QueryDatabase 2014-08-20 22:04:40 -07:00
Arthur Ice 2028a5846c LoadMercEquipment converted to QueryDatabase 2014-08-20 22:00:00 -07:00
Arthur Ice 2fd2cd4cec DeleteMerc converted to QueryDatabase 2014-08-20 21:54:28 -07:00
Arthur Ice 17b175daa4 LoadMercBuffs converted to QueryDatabase 2014-08-20 21:46:23 -07:00
Arthur Ice 5cabe109da SaveMercBuffs converted to QueryDatabase 2014-08-20 21:30:51 -07:00
Arthur Ice c6e82448b6 SaveMerc converted to QueryDatabase 2014-08-20 21:17:17 -07:00
Alex 8384ab9d2f Merge pull request #193 from addtheice/RunQueryToDatabaseQuery_MobAI
Run query to database query mob ai
2014-08-20 21:04:27 -07:00
Arthur Ice b846d89b5d LoadCurrentMerc converted to QueryDatabase 2014-08-20 21:04:00 -07:00
Alex d5a5635a14 Merge pull request #192 from addtheice/RunQueryToDatabaseQuery_EQW
Run query to database query eqw
2014-08-20 21:03:44 -07:00
Alex f8dc8be6e6 Merge pull request #191 from addtheice/RunQueryToDatabaseQuery_AdventureManager
Run query to database query adventure manager
2014-08-20 21:03:23 -07:00
Alex 5f9676d1a5 Merge pull request #190 from addtheice/RunQueryToDatabaseQuery_Adventure
Run query to database query adventure
2014-08-20 21:03:01 -07:00
Alex 964c4c83df Merge pull request #189 from addtheice/RunQueryToDatabaseQuery_lfguild
Run query to database query lfguild
2014-08-20 21:02:20 -07:00
Arthur Ice 322cea7342 LoadMercInfo converted to QueryDatabase 2014-08-20 20:58:11 -07:00
Arthur Ice 205e1d404e GetMercType converted to QueryDatabase 2014-08-20 20:50:36 -07:00
Arthur Ice 9769a96ebd GetNPCType converted to QueryDatabase 2014-08-20 20:21:39 -07:00
Arthur Ice 74d3192c2e NoRentExpired converted to QueryDatabase 2014-08-20 19:46:44 -07:00
Arthur Ice 41769a3fa8 UpdateBuyLine converted to QueryDatabase 2014-08-20 19:28:53 -07:00
Arthur Ice a7efa9d4e4 RemoveBuyLine converted to QueryDatabase 2014-08-20 19:20:32 -07:00
Arthur Ice 9ed69999a5 AddBuyLine converted to QueryDatabase 2014-08-20 19:02:28 -07:00
Arthur Ice e19a59b269 DeleteBuyLines converted to QueryDatabase 2014-08-20 18:59:17 -07:00
Arthur Ice d234016224 DeleteTraderItem converted to QueryDatabase 2014-08-20 18:55:42 -07:00
Arthur Ice c160d6d929 DeleteTraderItem converted to QueryDatabase 2014-08-20 18:53:05 -07:00
Arthur Ice 62ad60b4ad UpdateTraderItemPrice converted to QueryDatabase 2014-08-20 18:50:10 -07:00
Arthur Ice d44d7c6bbd UpdateTraderItemCharges converted to QueryDatabase 2014-08-20 18:42:25 -07:00
Arthur Ice efd97bad14 SaveTraderItem converted to QueryDatabase 2014-08-20 18:38:57 -07:00
Arthur Ice bc884f5daf LoadSingleTraderItem converted to QueryDatabase 2014-08-20 18:35:54 -07:00
Arthur Ice 0f47b73a64 LoadTraderItemWithCharges converted to QueryDatabase 2014-08-20 18:22:31 -07:00
Arthur Ice e9c6e96452 LoadTraderItem converted to QueryDatabase 2014-08-20 18:22:18 -07:00
Arthur Ice 09713311f6 DeleteWorldContainer converted to QueryDatabase 2014-08-20 18:16:45 -07:00
Arthur Ice c666d9c553 SaveWorldContainer converted to QueryDatabase 2014-08-20 18:03:02 -07:00
Arthur Ice 3777e8d1ce LoadWorldContainer converted to QueryDatabase 2014-08-20 17:57:44 -07:00
Arthur Ice e60658c684 GetEventLogs converted to QueryDatabase 2014-08-20 17:51:52 -07:00
Arthur Ice 046da9efae SetSpecialAttkFlag converted to QueryDatabase 2014-08-20 17:46:12 -07:00
Arthur Ice 09332f6c26 UpdateBug converted to QueryDatabase 2014-08-20 17:43:16 -07:00
Arthur Ice ce507d891a UpdateBug converted to QueryDatabase 2014-08-20 17:43:16 -07:00
Arthur Ice 96f122f901 logevents converted to QueryDatabase 2014-08-20 17:31:16 -07:00
Arthur Ice 3479525f39 UpdateSpawn2Status converted to QueryDatabase 2014-08-20 17:27:19 -07:00
Arthur Ice 4f9d4b0023 GetSpawnTimeLeft converted to QueryDatabase 2014-08-20 17:25:27 -07:00
Arthur Ice bcdfd32bc0 UpdateSpawn2Timeleft converted to QueryDatabase 2014-08-20 17:21:07 -07:00
Arthur Ice 693dde04e3 GetZoneCFG converted to QueryDatabase 2014-08-20 17:16:30 -07:00
Arthur Ice f1bb019933 SaveZoneCFG converted to QueryDatabase 2014-08-20 16:46:17 -07:00
Arthur Ice 5a6373c429 UpdateHotzone converted to QueryDatabase 2014-08-20 16:39:07 -07:00
Arthur Ice 19e04a1875 LoadTickItems converted to QueryDatabase 2014-08-20 16:34:35 -07:00
Arthur Ice 029314ec7f LoadNPCEmotes converted to QueryDatabase 2014-08-20 16:31:05 -07:00
Arthur Ice cee4a3f475 LoadAdventureFlavor converted to QueryDatabase 2014-08-20 16:27:12 -07:00
Arthur Ice 2bc58a97bc LoadAlternateCurrencies converted to QueryDatabase 2014-08-20 16:24:05 -07:00
Arthur Ice 2eb270376f LoadVeteranRewards converted to QueryDatabase 2014-08-20 16:20:46 -07:00
Arthur Ice 5e858678e9 LoadLDoNTrapEntries converted QueryDatabase 2014-08-20 16:15:55 -07:00
Arthur Ice 12a59853b5 LoadLDoNTraps converted to QueryDatabase 2014-08-20 16:08:20 -07:00
Arthur Ice 971c3f633f GetDecayTimes converted to QueryDatabase 2014-08-20 16:05:09 -07:00
Arthur Ice 826f7d0efd LoadMercSpells converted to QueryDatabase 2014-08-20 16:00:36 -07:00
Arthur Ice 5da5e9b5de LoadLevelEXPMods converted to QueryDatabase 2014-08-20 15:57:04 -07:00
Arthur Ice 7a3c05a41f LoadMercTemplates converted to QueryDatabase 2014-08-20 15:53:02 -07:00
Arthur Ice 01382e87a0 LoadNewMerchantData converted to QueryDatabase 2014-08-20 15:37:09 -07:00
Arthur Ice f0abaad84f LoadZoneObjects converted to QueryDatabase 2014-08-20 15:37:03 -07:00
Uleat 5946af88a6 Reworked Trade::AddEntity() to allow client-directed movement of stacked items (as close to 'stacking' as I can get it - see changelog.txt) 2014-08-20 18:30:19 -04:00
Arthur Ice fe718a81f3 GetHighestWaypoint converted to QueryDatabase 2014-08-20 15:14:36 -07:00
Arthur Ice 2f30488cd5 GetFreeGrid converted to QueryDatabase 2014-08-20 15:11:12 -07:00
Arthur Ice 8b69de46e9 AddWPForSpawn converted to QueryDatabase 2014-08-20 15:06:53 -07:00
Arthur Ice c466317082 DeleteWaypoint converted to QueryDatabase 2014-08-20 14:49:18 -07:00
Arthur Ice 06b0bd6da4 AddWP converted to QueryDatabase 2014-08-20 14:44:32 -07:00
Arthur Ice 334e29a6d6 ModifyGrid converted to QueryDatabase 2014-08-20 14:40:47 -07:00
Arthur Ice cab0beb77f AssignGrid converted to QueryDatabase 2014-08-20 14:32:04 -07:00
Arthur Ice 5f2db0d1cb GetWaypoints converted to QueryDatabase 2014-08-20 14:09:47 -07:00
Arthur Ice b654729383 GetGridType2 converted to QueryDatabase 2014-08-20 14:03:00 -07:00
Arthur Ice 5fec840f06 AssignWaypoints converted to QueryDatabase 2014-08-20 13:58:36 -07:00
Alex 1b6ccca709 Merge pull request #188 from addtheice/RunQueryToDatabaseQuery_rulesys
Run query to database query rulesys
2014-08-20 13:49:05 -07:00
Alex 957671e649 Merge pull request #187 from KinglyKrab/master
Renames spells_new fields.
2014-08-20 13:48:41 -07:00
Alex 79a9e393d2 Merge pull request #186 from addtheice/RunQueryToDatabaseQuery_client_files_import_main
Run query to database query client files import main
2014-08-20 13:48:24 -07:00
Alex 50c186b608 Merge pull request #185 from addtheice/RunQueryToDatabaseQuery_client_files_main
Run query to database query client files main
2014-08-20 13:47:43 -07:00
Alex 9054b93338 Merge pull request #183 from addtheice/RunQueryToDatabaseQuery_ptimer
Run query to database query ptimer
2014-08-20 13:46:43 -07:00
Alex cf1f03fd5b Merge pull request #181 from addtheice/RunQueryToDatabaseQuery_guild_base
Run query to database query guild base
2014-08-20 13:46:32 -07:00
Arthur Ice 7742273237 LoadTributes converted to QueryDatabase 2014-08-20 13:31:47 -07:00
Arthur Ice 536773db44 LoadTraps converted to QueryDatabase 2014-08-20 13:20:51 -07:00
Arthur Ice cf4145dad4 LoadZoneFlags converted to QueryDatabase 2014-08-20 13:02:27 -07:00
Arthur Ice bc90ab795b ClearZoneFlag converted to QueryDatabase 2014-08-20 12:55:53 -07:00
Arthur Ice 21ba9953f8 SetZoneFlag converted to QueryDatabase 2014-08-20 12:52:41 -07:00
Arthur Ice 1c87a6069a CountAAEffects converted to QueryDatabase 2014-08-20 12:48:10 -07:00
Arthur Ice 9867fdd4d2 CountAAs converted to QueryDatabase 2014-08-20 12:45:41 -07:00
Arthur Ice 64cd589ca3 FillAAEffects converted to QueryDatabase 2014-08-20 12:41:37 -07:00
Arthur Ice 110d22e775 GetAASkillVars converted to QueryDatabase 2014-08-20 12:37:02 -07:00
Arthur Ice 3bc582885b LoadAAs converted to QueryDatabase 2014-08-20 12:21:46 -07:00
Arthur Ice e33e8b713e GetTotalAALevels converted to QueryDatabase 2014-08-20 12:09:59 -07:00
Arthur Ice 4214cf47c2 LoadAAEffects converted to QueryDatabase 2014-08-20 12:05:57 -07:00
Arthur Ice 68115505f8 LoadAAEffects2 converted to QueryDatabase 2014-08-20 12:00:43 -07:00
Michael Cook (mackal) d87c95c1f8 Properly set '-std=c++0x' as a CXX_FLAGS
This fixes an issue with clang compiling C files.
(Note: this does not mean clang is supported yet)

Ideally, this should check the compiler for -std=c++11 support,
then check -std=c++0x if the previous failed, then error if that
fails as well.
2014-08-19 20:06:49 -04:00
Michael Cook cec990716f Merge pull request #204 from af4t/master
No BOTS compile error
2014-08-19 19:51:21 -04:00
af4t f22b26f80f Squashed commit of the following:
commit 5d074ea998
Author: Michael Cook <mcook@mackal.net>
Date:   Thu Jun 5 02:57:56 2014 -0400

    Update LS default entry in example config

commit e9c4613368
Merge: 3690f93 dd73b82
Author: KimLS <KLS@peqtgc.com>
Date:   Wed Jun 4 18:32:48 2014 -0700

    Merge branch 'master' into water_map_v2

commit 3690f93302
Author: KimLS <KLS@peqtgc.com>
Date:   Sat May 31 16:32:15 2014 -0700

    Fix for fear failing, removed #fear command because it was blank anyway, added a cmake command to change the default map/water/path directory

commit dd73b82ec2
Author: KimLS <KLS@peqtgc.com>
Date:   Tue May 27 16:16:06 2014 -0700

    Fix for a problem with global player quests and hasquestsub

commit 8a5405060f
Author: KimLS <KLS@peqtgc.com>
Date:   Fri May 23 17:39:16 2014 -0700

    Fix for string.h missing in water map

commit 83270d0983
Author: KimLS <KLS@peqtgc.com>
Date:   Fri May 23 16:10:23 2014 -0700

    Merge from master stuff

commit fd4343702f
Merge: 0483e8b 5af47c5
Author: KimLS <KLS@peqtgc.com>
Date:   Fri May 23 16:09:46 2014 -0700

    Merge branch 'master' into water_map_v2

commit 0483e8bd1b
Author: KimLS <KLS@peqtgc.com>
Date:   Fri May 23 16:08:02 2014 -0700

    Removed the logging now that the issue is resolved

commit 39cbdbd5c2
Author: KimLS <KLS@peqtgc.com>
Date:   Fri May 23 15:54:26 2014 -0700

    Debug logs for map, also can actually turn perl off on zone

commit 3a2ccd7521
Author: KimLS <KLS@peqtgc.com>
Date:   Wed May 21 17:30:54 2014 -0700

    Added loading of v2 regular maps, also #bestz will report water info even if a reg map failed to load.

commit 8c92271804
Author: KimLS <KLS@peqtgc.com>
Date:   Tue May 20 00:14:26 2014 -0700

    Initial v2 water map format.
2014-08-19 17:07:27 -04:00
akkadius 236d227319 Log merge fix 2014-08-19 10:58:22 -05:00
akkadius a5020a68f0 Implemented a Stop_Return feature (Accidental item handin prevention) that will be symmetrically used with plugin::return_items that I am currently running live testing on EZ before releasing to EQEmu. This does not hurt to have this in the source.
Fixed crash where 'attacker' validation is not being checked
Removed petition console spam that does not follow traditional logging and is useless
Made fix with SympatheticProcChances where it was checking for TempItem->Focus.Effect instead of TempItemAug->Focus.Effect
2014-08-19 10:55:29 -05:00
Arthur Ice c613f362a7 GetBasePetItems converted to QueryDatabase 2014-08-18 22:12:01 -07:00
Arthur Ice 977b28cb9c GetPoweredPetEntry converted to QueryDatabase 2014-08-18 22:02:35 -07:00
Arthur Ice 8b89beb02e MakePoweredPet converted to QueryDatabase 2014-08-18 21:57:29 -07:00
Arthur Ice 748748dda9 RefreshPetitionsFromDB converted to QueryDatabase 2014-08-18 21:46:46 -07:00
Arthur Ice 6364d2c31d UpdatePetitionToDB converted to QueryDatabase 2014-08-18 21:37:17 -07:00
Arthur Ice e618fe87bd DeletePetitionFromDB converted to QueryDatabase 2014-08-18 21:37:17 -07:00
Arthur Ice 4e71330508 InsertQuestGlobal converted to QueryDatabase 2014-08-18 21:16:11 -07:00
Arthur Ice c6091c4f27 DelGlobal converted to QueryDatabase 2014-08-18 21:13:20 -07:00
Arthur Ice 49d231f5dd LoadMercs converted to QueryDatabase 2014-08-18 21:06:04 -07:00
Arthur Ice e907ab4f3e LoadMercTypes converted to QueryDatabase 2014-08-18 21:01:27 -07:00
Arthur Ice 9814a6e5a2 BuildHorseType converted to QueryDatabase 2014-08-18 20:55:28 -07:00
Arthur Ice 65e865a550 GetZoneFishing converted to QueryDatabase 2014-08-18 19:23:40 -07:00
Arthur Ice 9cdf0a7a83 GetZoneForage converted to QueryDatabase 2014-08-18 19:23:39 -07:00
Uleat 43326c1804 Fix for perl scripts passing non-client objects to API handler for MovePC and MovePCInstance. [Fixes #127] 2014-08-18 22:13:15 -04:00
Arthur Ice e2d85337d0 Process converted to QueryDatabase 2014-08-18 18:55:09 -07:00
Arthur Ice c4f1f57f74 SetDynamicCount converted to QueryDatabase 2014-08-18 18:38:51 -07:00
Arthur Ice ab70427b7d DeleteStaticZone converted to QueryDatabase 2014-08-18 18:36:08 -07:00
Arthur Ice 0af394fb96 ChangeStaticZone converted to QueryDatabase 2014-08-18 18:34:15 -07:00
Arthur Ice e4320f98f8 BootStaticZone converted to QueryDatabase 2014-08-18 18:31:20 -07:00
Arthur Ice b5a46735df DeleteLauncher converted to QueryDatabase 2014-08-18 18:28:54 -07:00
Arthur Ice 352d46d2ee CreateLauncher converted to QueryDatabase 2014-08-18 18:25:26 -07:00
Arthur Ice b672475166 LoadSettings converted to QueryDatabase 2014-08-18 18:23:22 -07:00
Arthur Ice 7692793289 Consolidated LoadBy code into new LoadBy method 2014-08-18 18:10:28 -07:00
Arthur Ice 8d909ea8e2 LoadByGlobalContext converted to QueryDatabase 2014-08-18 17:58:51 -07:00
Kinglykrab f7781e6d1d Renames spells_new fields.
field191 => viral_targets
field192 => viral_timer
2014-08-18 20:58:31 -04:00
Arthur Ice 810553de2a LoadByZoneID converted to QueryDatabase 2014-08-18 17:56:36 -07:00
Arthur Ice c6b2b1da4e LoadByCharID converted to QueryDatabase 2014-08-18 17:53:05 -07:00
Arthur Ice 5234eb6fc8 LoadNPCByNPCID converted to QueryDatabase 2014-08-18 17:50:03 -07:00
Arthur Ice d8856a7bae DeleteObject converted to QueryDatabase 2014-08-18 17:37:57 -07:00
Arthur Ice 6ca5fb19f4 LoadGroundSpawns converted to QueryDatabase 2014-08-18 17:35:47 -07:00
Arthur Ice 4d83397506 UpdateObject converted to QueryDatabase 2014-08-18 17:29:19 -07:00
Arthur Ice 3720d9e50f AddObject converted to QueryDatabase 2014-08-18 17:21:27 -07:00
Arthur Ice d73449104a GetMaxNPCSpellsEffectsID converted to QueryDatabase 2014-08-18 17:00:37 -07:00
Arthur Ice 580f32c190 GetNPCSpellsEffects converted to QueryDatabase 2014-08-18 16:57:22 -07:00
Arthur Ice 65cc3a4b0a GetMaxNPCSpellsID converted to QueryDatabase 2014-08-18 16:40:45 -07:00
Arthur Ice 52344bfe24 GetNPCSpells converted to QueryDatabase 2014-08-18 16:34:27 -07:00
Arthur Ice 7b33ef67f2 ResolveBug converted to QueryDatabase 2014-08-18 16:17:07 -07:00
Arthur Ice 9270c45a5e GetBugDetails converted to QueryDatabase 2014-08-18 16:15:47 -07:00
Arthur Ice 34f051ab9a ListBugs converted to QueryDatabase 2014-08-18 16:13:11 -07:00
Arthur Ice a2280d1fe5 CountBugs converted to QueryDatabase 2014-08-18 16:10:39 -07:00
Arthur Ice 042613d234 LoadLeaderboardInfo converted to QueryDatabase 2014-08-18 16:06:20 -07:00
Arthur Ice 8b05eff179 LoadAdventureEntries converted to QueryDatabase 2014-08-18 16:05:22 -07:00
Arthur Ice fcb022b8ae ExpireEntries converted to QueryDatabase 2014-08-18 16:00:32 -07:00
Arthur Ice 41182de4f2 MoveCorpsesToGraveyard converted to QueryDatabase 2014-08-18 15:56:02 -07:00
Arthur Ice 37b45be6d8 LoadAdventureTemplate converted to QueryDatabase 2014-08-18 15:34:41 -07:00
Arthur Ice dd044ca453 ToggleGuild converted to QueryDatabase 2014-08-18 14:56:55 -07:00
Arthur Ice b234c67622 TogglePlayer converted to QueryDatabase 2014-08-18 14:52:38 -07:00
Arthur Ice 529408fca0 LoadDatabase converted to QueryDatabase 2014-08-18 14:45:54 -07:00
Arthur Ice 84e95d9a28 ListRulesets converted to QueryDatabase 2014-08-18 14:36:58 -07:00
Arthur Ice b439881f37 GetRulesetName converted to QueryDatabase 2014-08-18 14:33:27 -07:00
Arthur Ice a75b53f9b0 _FindOrCreateRuleset converted to QueryDatabase 2014-08-18 14:30:13 -07:00
Arthur Ice 85ebb32176 GetRulesetID converted to QueryDatabase 2014-08-18 14:24:58 -07:00
Arthur Ice 6450b08fd6 _SaveRules converted to QueryDatabase 2014-08-18 14:21:12 -07:00
Arthur Ice 0353dcb28c LoadRules converted to QueryDatabase 2014-08-18 14:18:21 -07:00
Arthur Ice 230296e777 ImportBaseData converted to QueryDatabase 2014-08-18 14:05:59 -07:00
Arthur Ice ad987c5531 ImportSkillCaps converted to QueryDatabase 2014-08-18 14:05:06 -07:00
Arthur Ice 503a2c0d04 ImportSpells converted to QueryDatabase 2014-08-18 14:03:53 -07:00
Arthur Ice b7bcd13cbd GetSpellColumns converted to QueryDatabase 2014-08-18 14:02:16 -07:00
Arthur Ice 446da590d8 ExportBaseData converted to QueryDatabase 2014-08-18 13:50:16 -07:00
Arthur Ice 24732eff88 GetSkill converted to QueryDatabase 2014-08-18 13:46:05 -07:00
Arthur Ice b98f8c6262 SkillUsable converted to QueryDatabase 2014-08-18 13:42:25 -07:00
Arthur Ice 11c327e1d7 ExportSpells converted to QueryDatabase 2014-08-18 13:30:55 -07:00
Arthur Ice 1253fa2a25 ClearOffline converted to QueryDatabase 2014-08-18 13:14:46 -07:00
Arthur Ice f052c6004a Clear converted to QueryDatabase 2014-08-18 13:12:52 -07:00
Arthur Ice 3cde8d9af8 Load converted to QueryDatabase 2014-08-18 13:08:05 -07:00
Arthur Ice cbed61db7e Clear converted to QueryDatabase 2014-08-18 13:08:05 -07:00
Arthur Ice e360ba5209 Store converted to QueryDatabase 2014-08-18 12:35:16 -07:00
Arthur Ice fd8dc1214c Load converted to QueryDatabase 2014-08-18 12:34:14 -07:00
Arthur Ice 327fa38232 GetCharInfo converted to QueryDatabase 2014-08-17 12:30:53 -07:00
Arthur Ice 845ed720b3 GetCharInfo converted to QueryDatabase 2014-08-17 12:27:08 -07:00
Arthur Ice ea0c8f86fe GetEntireGuild converted to QueryDatabase 2014-08-17 12:21:57 -07:00
Arthur Ice 76f727b7ff ProcessGuildMember converted to use MySQLRequestRow 2014-08-17 12:21:05 -07:00
Arthur Ice 449d5f9358 Removed large commented out section 2014-08-17 12:13:56 -07:00
Arthur Ice b2ca66267e DoesAccountContainAGuildLeader converted to QueryDatabase 2014-08-17 12:13:27 -07:00
Arthur Ice f292cbc3e7 DBSetPublicNote converted to QueryDatabase 2014-08-17 12:07:43 -07:00
Arthur Ice df705e34ad GetAltFlag converted to QueryDatabase 2014-08-17 12:04:38 -07:00
Arthur Ice 364f133ffd GetBankerFlag converted to QueryDatabase 2014-08-17 12:01:39 -07:00
Arthur Ice c7e2d3b355 DBSetGuild converted to QueryDatabase 2014-08-17 11:57:18 -07:00
Arthur Ice 553d12412b DBSetGuildChannel converted to QueryDatabase 2014-08-17 11:50:10 -07:00
Arthur Ice a701541fce DBSetGuildURL converted to QueryDatabase 2014-08-17 11:48:01 -07:00
Arthur Ice dd06ecf99b DBSetGuildMOTD converted to QueryDatabase 2014-08-17 11:46:03 -07:00
Arthur Ice 9e5fdc50d9 DBSetGuildLeader converted to QueryDatabase 2014-08-17 11:43:45 -07:00
Arthur Ice 80cc6e4ef3 DBSetTributeFlag converted to non len QueryWithLogging 2014-08-17 11:40:28 -07:00
Arthur Ice 34a56f75cf DBSetAltFlag converted to non len QueryWithLogging 2014-08-17 11:40:28 -07:00
Arthur Ice 941f1cc395 DBSetBankerFlag converted to non len QueryWithLogging 2014-08-17 11:40:28 -07:00
Arthur Ice 9eec8f37f5 DBSetGuildRank converted to non len QueryWithLogging 2014-08-17 11:40:27 -07:00
Arthur Ice 1734641d12 DBRenameGuild converted to QueryDatabase 2014-08-17 11:40:22 -07:00
Arthur Ice 3856f7f1e5 DBDeleteGuild converted to QueryDatabase 2014-08-17 11:39:27 -07:00
Arthur Ice 94110dbe52 removed len from QueryWithLogging 2014-08-17 11:39:16 -07:00
Arthur Ice 8a44271b2f QueryWithLogging converted to QueryDatabase 2014-08-17 11:22:05 -07:00
Arthur Ice cca9ddab43 _RunQuery renamed QueryWithLogging 2014-08-17 11:19:56 -07:00
Arthur Ice 7b440bbd9f _GetFeeGuildID converted to QueryDatabase 2014-08-17 11:11:56 -07:00
Arthur Ice a2d4376763 _StoreGuildDB converted to QueryDatabase 2014-08-17 11:08:41 -07:00
Arthur Ice a91b6a0db8 RefreshGuild converted to QueryDatabase 2014-08-17 10:59:24 -07:00
Arthur Ice 22367622be LoadGuilds converted to QueryDatabase 2014-08-17 10:51:08 -07:00
Arthur Ice 87efd22394 Merge https://github.com/EQEmu/Server 2014-08-17 10:39:37 -07:00
Alex 69b7d500d8 Merge pull request #180 from EQEmu/clientupdate
Clientupdate
2014-08-16 22:23:19 -07:00
Uleat 00321126f1 Merge branch 'master' of https://github.com/EQEmu/Server into clientupdate
Conflicts:
	changelog.txt
2014-08-16 18:17:59 -04:00
Uleat 9e1549b61b Fix for invalid handling of heading criteria in Client::Handle_OP_ClientUpdate() 2014-08-16 18:12:21 -04:00
KimLS a85bb6aca6 Cleanup before push 2014-08-16 15:03:01 -07:00
KimLS 9207220238 Merge branch 'DBQuery' 2014-08-16 15:02:19 -07:00
KimLS 539c09adc5 Merge branch 'master' into DBQuery 2014-08-16 15:00:38 -07:00
Uleat 8ef17f2ccd Merge branch 'master' of https://github.com/EQEmu/Server 2014-08-16 17:21:10 -04:00
KimLS 8b08f19628 Merge branch 'master' into DBQuery 2014-08-16 14:12:33 -07:00
Alex adc801a069 Merge pull request #179 from KinglyKrab/master
Fixed GetItemStat making all information it pulls default as uint32.
2014-08-15 22:47:27 -07:00
Kinglykrab 0f5214f481 Fixed GetItemStat making all information it pulls default it uint32. 2014-08-16 01:35:50 -04:00
Alex eb609f2ea4 Merge pull request #178 from KinglyKrab/master
Fixes uint32 max value issue.
2014-08-15 22:00:26 -07:00
Uleat a3069b63df Minor tweaks... 2014-08-16 00:18:19 -04:00
Uleat f7bb763aac Reactivation of wear change updates in Bot::Spawn() until fix can be found. 2014-08-15 16:28:16 -04:00
Kinglykrab bce3b1b961 Edit some uint32 to int32: GetAugmentIDAt, GetItemIDAt, GetItemStat 2014-08-15 04:26:37 -04:00
Michael Cook e2874b2cc6 Update README.md [skip ci] 2014-08-14 15:05:44 -04:00
Uleat dc6e6fd05f Fix for bot chest armor display glitch in SoF+ clients 2014-08-13 14:24:42 -04:00
Michael Cook (mackal) c2282ced0e Some people were having issues with the other one [skip ci] 2014-08-13 13:20:10 -04:00
Michael Cook (mackal) 6badd7e00e Added SQLs from previous commit [skip ci] 2014-08-12 22:51:36 -04:00
Michael Cook 12b9531d8a Merge pull request #177 from clucksoft/raid_ooc_regen
Implemented Raid OOC Regen
2014-08-12 22:46:17 -04:00
Russell Kinasz 1ba4b6fc31 Implemented Raid OOC Regen 2014-08-12 15:18:11 -07:00
KimLS cb3fa2d4a3 Merge branch 'RunQueryToDatabaseQuery_database' of https://github.com/addtheice/Server into DBQuery 2014-08-12 14:51:09 -07:00
Uleat cfd6364999 Re-worked server 'discovery' code to better handle inclusions and exclusions. 2014-08-11 18:55:00 -04:00
Arthur Ice f1b8908c9a Fixed bug with ErrorBuffer being overwritten on non query requests 2014-08-11 13:55:25 -07:00
KimLS 11abc45e3f Merge branch 'RunQueryToDatabaseQuery_database' of https://github.com/addtheice/Server into DBQuery 2014-08-11 12:58:53 -07:00
Arthur Ice 321cf17eac fixed issue with row request on null result 2014-08-10 22:27:25 -07:00
Michael Cook (mackal) 091047d08b Pretty up the read me [skip ci] 2014-08-10 23:07:05 -04:00
Michael Cook f0c46664d2 Merge pull request #176 from KayenEQ/Development
ST_PetMaster target type support added
2014-08-10 23:04:06 -04:00
KayenEQ 8b2dba9715 ST_PetMaster target type support added
Targets pets master. (Works for regular and swarm pets)
2014-08-10 20:13:01 -04:00
KimLS 26ff1ae941 Merge branch 'RunQueryToDatabaseQuery_database' of https://github.com/addtheice/Server into DBQuery 2014-08-10 16:27:59 -07:00
Arthur Ice 12ded4b506 Fixed bug with non row returning queries crashing. 2014-08-10 14:19:35 -07:00
KimLS 2b66af2d91 Merge branch 'RunQueryToDatabaseQuery_database' of https://github.com/addtheice/Server into DBQuery 2014-08-10 13:23:09 -07:00
Michael Cook (mackal) 8940e987c1 Fix some compiler warnings 2014-08-10 15:56:58 -04:00
Michael Cook c02cb2c343 Proper bling instead of copy paste for another [skip ci] 2014-08-10 13:08:50 -04:00
Michael Cook 99b25f42e4 Add Travis-CI bling 2014-08-10 12:42:43 -04:00
Michael Cook a327a0028d Merge pull request #175 from KayenEQ/Development
Rule ArcheryHitPenalty fix for calc mistake from prior update.
2014-08-10 11:01:38 -04:00
KayenEQ 478eb35a3b Rule ArcheryHitPenalty fix for calc mistake from prior update. 2014-08-10 08:37:30 -04:00
KimLS d7eb28c7f8 Travis CI file 2014-08-10 02:45:21 -07:00
Uleat e1996e62b0 Added 'discovery' code for server handlers - still needs some debug/messaging work 2014-08-09 20:59:08 -04:00
Michael Cook bb9f440882 Merge pull request #172 from KayenEQ/Development
Implemented support for spells_new fields InCombat, OutofCombat
2014-08-09 16:53:39 -04:00
KayenEQ b7be8fb625 fix 2014-08-08 15:53:53 -04:00
KayenEQ 2aec190afc Support for spells_new field 'uninterruptable' 2014-08-08 13:42:14 -04:00
Uleat f0496a6f59 Total re-work..not much more can be done until more server handlers are added... 2014-08-07 15:27:30 -04:00
KayenEQ aab3cac29c fix 2014-08-06 06:49:29 -04:00
Uleat 9561f841c4 Tweaked some procedural code and re-worked client opcode reader to standardize hex format (i.e., {0x0abc, 0x0ABC, 0xabc} = 0x0abc) 2014-08-05 16:34:57 -04:00
Uleat 32243aa383 Unix fix... Thanks Demonstar!! 2014-08-04 23:12:28 -04:00
Uleat 13f3c13c0e Added a dev script for cross-referencing server-to-client opcodes 2014-08-04 21:28:56 -04:00
KayenEQ 92a1abbbee fix 2014-08-03 16:36:44 -04:00
KayenEQ 4b7fa0654c fix 2014-08-03 16:32:36 -04:00
KayenEQ f3710856ad min_range field 2014-08-03 16:04:55 -04:00
KayenEQ ef982b9ce2 Implemented 'min_range' field, sets a min range that you must
be away from target for spell to land.
2014-08-03 08:21:47 -04:00
KayenEQ 52d92b7181 Implemented broad support for fields min_dist, min_dist_mod, max_dist, max_dist_mod -
Scales spell power based on targets distance from caster.
This implemented in a broad way to function with spells
that would make sense to scale. Some work will still be needed on this.

Be aware if making custom
spells not everything will work and certain effects just
should not be included (use common sense).
2014-08-02 21:10:44 -04:00
KayenEQ e0e473ce06 Merge git://github.com/EQEmu/Server into Development 2014-08-02 20:40:24 -04:00
KayenEQ 9c92c5dbe4 SQL 2014-08-02 10:43:48 -04:00
KayenEQ b65d3c85b6 Implemented support for spells_new fields InCombat, OutofCombat
Required SQL to rename and add new fields to spells_new table.
2014-08-02 10:42:11 -04:00
Michael Cook 71b7fc57f6 Merge pull request #171 from KayenEQ/Development
Support for spells_new field npc_no_los (simply skips the LOS check for ...
2014-08-01 23:50:28 -04:00
KayenEQ 454f2520c3 Support for spells_new field npc_no_los (simply skips the LOS check for that spell
despite name, no reason to hard code it only for NPC).
2014-08-01 23:35:35 -04:00
Arthur Ice e1e219ae97 Merge upstream 2014-08-01 10:41:26 -07:00
Arthur Ice af57ca3b05 Merge upstream 2014-08-01 10:41:16 -07:00
Arthur Ice a98eeb7be6 Merge remote-tracking branch 'upstream/master' 2014-08-01 10:26:38 -07:00
Uleat cc0f2ac37a Changed a few mis-labeled range starts..no functionality change. 2014-07-31 21:05:43 -04:00
Uleat 842f1fb9c7 Test fix for charm in trader's satchel while trader..thanks demonstar and Derision! ** This may need to be tweaked..but, I was able to test without crashing the client. 2014-07-31 11:41:27 -04:00
Uleat 8b14c21a24 More numeric to constant conversions..should be most of them... Please report any inventory abnormalities. 2014-07-31 07:52:38 -04:00
Arthur Ice 0f6ce6a1f4 Upstream merge 2014-07-30 14:46:02 -07:00
Arthur Ice 7aaf9ae00d Merge remote-tracking branch 'upstream/master' 2014-07-30 14:08:10 -07:00
Uleat e902373ce7 This DOES fix the GCC issue..sorry for the inconvenience! 2014-07-27 23:05:16 -04:00
Uleat 0ad7c4470b GCC fix for last dictionary push (hopefully) 2014-07-27 22:18:17 -04:00
Uleat 36a2d52f1c More 'dictionary' updates..added 'constants' files to client translators..started replacement of hard-coded inventory values. 2014-07-27 20:35:43 -04:00
Michael Cook d0756ff2af Merge pull request #169 from KayenEQ/Development
Updates to npc_spells and npc_types table.
2014-07-24 18:44:18 -04:00
KayenEQ 9fcea56fbf Alllow SE_PetMeleeMitigation to work on swarm pets. 2014-07-24 14:06:15 -04:00
KayenEQ 1b239b7119 Support for AA derived AC bonus. 2014-07-24 11:31:22 -04:00
KayenEQ 83f94da43b Spell Effect for melee mitigation will no longer use same bonus
item shielding effect. Added support for spell effect melee mitigation
to work on as item worn effects and AA.
2014-07-24 11:23:14 -04:00
KayenEQ 0d5a0525cd minor fix 2014-07-23 22:08:47 -04:00
KayenEQ 4f07be2343 Update to how bonuses are calculated in chance to hit code to be
consistent across all relevant effects (treating avoidance
and hit chance bonuses equally).
Rule ArcheryHitPenalty will now calc correctly (Was doing basically nothing)
New field npc_types 'Avoidance' (add avoidance bonus to npc)
Rules for setting min / max chance to hit
2014-07-23 21:24:21 -04:00
KayenEQ 152a7410b6 debug msg removal 2014-07-23 16:57:59 -04:00
KayenEQ 9e4a21d934 Allow negative values for avoidance to work. (debuffs) 2014-07-23 13:13:51 -04:00
KayenEQ 6b107d4197 sql fix 2014-07-21 09:46:36 -04:00
KayenEQ d99f9c1c09 fix for aa pet flurry bonus calc 2014-07-18 17:57:03 -04:00
KayenEQ 089360a3a5 merge 2014-07-18 17:00:39 -04:00
Uleat d7c2d6108f Added the initial references for two new dictionaries - EmuConstants and EQLimits..more to come. 2014-07-16 21:23:16 -04:00
KimLS b7e36feeeb Removed more socket server stuff, changed some of the build stuff. 2014-07-14 15:44:28 -07:00
KimLS 658bf04d0b Merge branch 'master' of github.com:EQEmu/Server 2014-07-14 15:10:28 -07:00
Arthur Ice b43ab783b0 AddReport converted to StringFormat 2014-07-10 22:55:00 -07:00
Arthur Ice be90b4e0cc CheckLogin converted to StringFormat 2014-07-10 22:53:20 -07:00
Arthur Ice b3895f717a GetGuildIDByCharID converted to StringFormat 2014-07-10 22:19:14 -07:00
Arthur Ice 77a5d82de4 GetAdventureStats converted to StringFormat 2014-07-10 22:19:07 -07:00
Arthur Ice a7ac4b8deb UpdateAdventureStatsEntry converted to StringFormat 2014-07-10 22:19:01 -07:00
Arthur Ice 9cd2225f8c GlobalInstane converted to StringFormat 2014-07-10 22:04:58 -07:00
Arthur Ice f2e7f8ec64 SetInstanceDuration converted to StringFormat 2014-07-10 21:30:17 -07:00
Arthur Ice 899c34ff63 AssignRaidToInstance converted to StringFormat 2014-07-10 21:30:11 -07:00
Arthur Ice 79819a85d6 AssignGroupToInstance converted to StringFormat 2014-07-10 21:30:05 -07:00
Arthur Ice e66b4e4a3d GetCharactersInInstance converted to StringFormat 2014-07-10 21:29:59 -07:00
KayenEQ 48c24186d1 sql comment fix 2014-07-10 23:44:03 -04:00
KayenEQ 965bb039be Updates to npc_spells and npc_types table.
Implemented innate defensive and range procs
Implemented ability to fine tune AI casting behavior/timers
Global rules for AI casting behavior/timers
NPC Ranged attack updates, set skill and ammo type in npc_types
Various clean ups in attack related functions.
Other minor fixes.
See Change Log, +required, +optional SQL
2014-07-10 22:46:39 -04:00
Arthur Ice d606d8f4f2 GetInstanceID converted to StringFormat 2014-07-10 17:56:53 -07:00
Arthur Ice a862d9a06d GetInstanceID converted to StringFormat 2014-07-10 17:56:48 -07:00
Arthur Ice c4d9e543e3 GetInstanceVersion converted to StringFormat 2014-07-10 17:56:43 -07:00
Arthur Ice 5104b507bb BuryCorpsesInInstance converted to StringFormat 2014-07-10 17:56:38 -07:00
Arthur Ice cb5cecd0c2 CheckInstanceExists converted to StringFormat 2014-07-10 17:56:33 -07:00
Arthur Ice 77c793166c RemoveClientsFromInstance converted to StringFormat 2014-07-10 17:56:27 -07:00
Arthur Ice e08533c634 RemoveClientFromInstance converted to StringFormat 2014-07-10 17:56:22 -07:00
Arthur Ice 39196efcb3 AddClientToInstance converted to StringFormat 2014-07-10 17:56:17 -07:00
Arthur Ice cc9bef9706 PurgeExpiredInstances converted to StringFormat 2014-07-10 17:56:12 -07:00
Arthur Ice 9d38c6d44e CreateInstance converted to StringFormat 2014-07-10 17:56:07 -07:00
Arthur Ice fb213e6ee5 GetUnusedInstanceID converted to StringFormat 2014-07-10 17:56:02 -07:00
Arthur Ice aafc681034 GetTimeRemainingInstance converted to StringFormat 2014-07-10 17:55:57 -07:00
Arthur Ice 11dc235121 VersionFromInstanceID converted to StringFormat 2014-07-10 17:55:52 -07:00
Arthur Ice cb510e13d1 ZoneIDFromInstanceID converted to StringFormat 2014-07-10 17:55:47 -07:00
Arthur Ice 784b16bd43 CheckInstanceExpired converted to StringFormat 2014-07-10 17:55:42 -07:00
Arthur Ice c6c47aba22 DeleteInstance converted to StringFormat 2014-07-10 17:55:37 -07:00
Arthur Ice 3581b0bf1a CharacterInInstanceGroup converted to StringFormat 2014-07-10 17:55:32 -07:00
Arthur Ice b5f5dae9e8 VerifyZoneInstance converted to StringFormat 2014-07-10 17:55:27 -07:00
Arthur Ice d68fca8e51 GetRaidLeaderName converted to StringFormat 2014-07-10 17:55:22 -07:00
Arthur Ice dc6e5bc48e GetRaidID converted to StringFormat 2014-07-10 17:55:16 -07:00
Arthur Ice 12c15c6db0 ClearRaidDetails converted to StringFormat 2014-07-10 17:55:11 -07:00
Arthur Ice d21c4a58b4 ClearAllRaidDetails converted to StringFormat 2014-07-10 17:55:06 -07:00
Arthur Ice 652b158ca4 ClearAllRaids converted to StringFormat 2014-07-10 17:55:01 -07:00
Arthur Ice 71da40c757 ClearRaid converted to StringFormat 2014-07-10 17:54:56 -07:00
Arthur Ice 3cf9c71c27 SetAgreementFlag converted to StringFormat 2014-07-10 17:54:51 -07:00
Arthur Ice c1b69594e5 GetAgreementFlag converted to StringFormat 2014-07-10 17:54:46 -07:00
Arthur Ice 8e8a21349f ClearGroupLeader converted to StringFormat 2014-07-10 17:05:47 -07:00
Arthur Ice b7fb8fa434 ClearAllGroupLeaders converted to StringFormat 2014-07-10 16:21:46 -07:00
Arthur Ice e3d02cdf40 GetGroupLeadershipInfo converted to StringFormat 2014-07-10 16:18:31 -07:00
Arthur Ice 3b18c4891c SetGroupLeaderName converted to StringFormat 2014-07-10 16:17:14 -07:00
Arthur Ice 0862feeba8 GetGroupLeaderForLogin converted to StringFormat 2014-07-10 15:19:10 -07:00
Arthur Ice 34a7b46163 GetGroupID converted to StringFormat 2014-07-10 15:17:10 -07:00
Arthur Ice 538979716d ClearGroup converted to StringFormat 2014-07-10 15:16:02 -07:00
Arthur Ice ed21229bba ClearAllGroups converted to StringFormat 2014-07-10 15:15:05 -07:00
Arthur Ice 1ec7da0f36 SetGroupID converted to StringFormat 2014-07-10 15:11:44 -07:00
Arthur Ice 61732658f2 SetFirstLogon converted to StringFormat 2014-07-10 15:03:25 -07:00
Arthur Ice 474d5d1340 SetLFG converted to StringFormat 2014-07-10 15:02:39 -07:00
Arthur Ice fdb4e54ff6 SetLoginFlags converted to StringFormat 2014-07-10 15:01:56 -07:00
Arthur Ice bde62709b5 SetLFP converted to StringFormat 2014-07-10 15:01:08 -07:00
Arthur Ice d4aaa93047 GetLiveChar converted to StringFormat 2014-07-10 15:00:05 -07:00
Arthur Ice 4ce7081ace UpdateLiveChar converted to StringFormat 2014-07-10 14:59:16 -07:00
Arthur Ice 6f8e7fc720 GetCharacterInfo converted to StringFormat 2014-07-10 14:58:27 -07:00
Arthur Ice 422f3b1ce9 GetSkillCap converted to StringFormat 2014-07-10 14:57:24 -07:00
Arthur Ice 397e3998ff GetRaceSkill converted to StringFormat 2014-07-10 14:55:57 -07:00
Arthur Ice cff96b23a8 Merge branch 'master' into RunQueryToDatabaseQuery_database
Conflicts:
	changelog.txt
	common/spdat.h
	zone/attack.cpp
	zone/bonuses.cpp
	zone/common.h
	zone/mob.h
	zone/special_attacks.cpp
	zone/spell_effects.cpp
2014-07-10 14:15:05 -07:00
Arthur Ice 40798d38c5 Merge remote-tracking branch 'upstream/master' 2014-07-09 16:40:09 -07:00
Arthur Ice 09ede557b1 SetMQDetectionFlag converted to StringFormat 2014-07-09 16:37:21 -07:00
Arthur Ice 1f15f7ff9a SetHackerFlag converted to StringFormat 2014-07-09 16:35:30 -07:00
JJ a96784aa18 Minor typos. 2014-07-09 19:19:51 -04:00
Arthur Ice 3a2ceab58a CopyCharacter converted to StringFormat 2014-07-08 21:10:04 -07:00
Arthur Ice 84499e43dd MoveCharacterToZone converted to StringFormat 2014-07-08 21:10:04 -07:00
Arthur Ice 2e8ff36ef7 MoveCharacterToZone converted to StringFormat 2014-07-08 21:10:04 -07:00
Arthur Ice 6430a62c86 GetServerType converted to StringFormat 2014-07-08 21:10:04 -07:00
Arthur Ice ec47f8644c CheckUsedName converted to StringFormat 2014-07-08 21:10:04 -07:00
Arthur Ice 8b3afbdf10 UpdateName converted to StringFormat 2014-07-08 21:10:04 -07:00
Arthur Ice 57b11629ce ClearMerchantTemp converted to string 2014-07-08 21:10:04 -07:00
Arthur Ice 396eced36e GetAccountFromID converted to StringFormat 2014-07-08 21:10:03 -07:00
Arthur Ice 66070e9bf6 GetAccountIDFromLSID converted to StringFormat 2014-07-08 21:10:03 -07:00
Arthur Ice 97588fbcf4 AddToNameFilter converted to StringFormat 2014-07-08 21:10:03 -07:00
Arthur Ice d7a98e7655 CheckNameFilter converted to string 2014-07-08 21:10:03 -07:00
Arthur Ice 4804cca0ab GetPEQZone converted to StringFormat 2014-07-08 21:10:03 -07:00
Arthur Ice 0850b1edad LoadZoneNames converted to use string 2014-07-08 21:10:03 -07:00
Arthur Ice c2e5875f02 GetzoneGraveyardID converted to StringFormat 2014-07-08 21:10:03 -07:00
Arthur Ice 56de9072c0 GetZoneLongName converted to StringFormat 2014-07-08 21:10:03 -07:00
Arthur Ice 341121da32 GetSafePoints converted to StringFormat 2014-07-08 21:10:03 -07:00
Arthur Ice 869c041846 GetMiniLoginAccount converted to StringFormat 2014-07-08 21:10:03 -07:00
Arthur Ice 879ab418fd SetVariable converted to StringFormat 2014-07-08 21:10:03 -07:00
Arthur Ice 2ffc77be3d GetAccountName converted to StringFormat 2014-07-08 21:10:03 -07:00
Arthur Ice 2f8cc6e57b GetAccountIDByName converted to StringFormat 2014-07-08 21:10:03 -07:00
Arthur Ice a64ef36d06 GetAccountIDByChar (id) converted to StringFormat 2014-07-08 21:10:03 -07:00
Arthur Ice 85895d01eb GetAccountIDByChar converted to StringFormat 2014-07-08 21:10:02 -07:00
Arthur Ice fa3d8c9720 StoreCharacter partialy converted to StringFormat 2014-07-08 21:10:02 -07:00
Arthur Ice 80a8a1fde3 DeleteCharacter converted to StringFormat 2014-07-08 21:10:02 -07:00
Arthur Ice bf5ce11ff1 ReserveName converted to StringFormat 2014-07-08 21:10:02 -07:00
Arthur Ice 4a10bdb91a SetAccountStatus converted to StringFormat 2014-07-08 21:10:02 -07:00
Arthur Ice 74b73e6f39 SetLocalPassword converted to StringFormat 2014-07-08 21:10:02 -07:00
Arthur Ice d287d9731e changed cerr message to cout on DeleteAccount 2014-07-08 21:10:02 -07:00
Arthur Ice 95c072f692 DeleteAccount converted to StringFormat 2014-07-08 21:10:02 -07:00
Arthur Ice 41f453d5a4 CreateAccount converted to StringFormat 2014-07-08 21:10:02 -07:00
Arthur Ice ddcaf855fe CheckStatus converted to StringFormat 2014-07-08 21:10:02 -07:00
Arthur Ice d943183994 LoginIP converted to StringFormat 2014-07-08 21:10:02 -07:00
Arthur Ice 2424b1d3f1 AddGMIP converted to StringFormat 2014-07-08 21:10:02 -07:00
Arthur Ice a036200369 CheckGMIPs converted to StringFormat 2014-07-08 21:10:02 -07:00
Arthur Ice 0ddceb78ba AddBannedIP converted to StringFormat 2014-07-08 21:10:01 -07:00
Arthur Ice b23fb0e635 CheckBannedIPs converted to StringFormat 2014-07-08 21:10:01 -07:00
Arthur Ice 98ebbd50a1 minor formatting clean up, no functional changes 2014-07-08 21:10:01 -07:00
Arthur Ice c39eb3ca86 Removed unused FetchRowMap 2014-07-08 21:10:01 -07:00
Arthur Ice 2278ec023f GetGroupLeadershipInfo converted to QueryDatabase 2014-07-08 21:10:01 -07:00
Arthur Ice 2afd05de98 GetGroupLeaderForLogin converted to QueryDatabase 2014-07-08 21:10:01 -07:00
Arthur Ice 1655050730 string based QueryDatabase 2014-07-08 21:10:01 -07:00
Arthur Ice 9a30c24654 Added FieldName for column name requests 2014-07-08 21:10:01 -07:00
Arthur Ice 727d8a2bf8 Added LengthOfColumn method because of stupid BLOBs 2014-07-08 21:10:01 -07:00
Arthur Ice cdcb5e0692 renamed GetGuildDBIDByChar to GetGuildIDByChar, converted to QueryDatabase 2014-07-08 21:10:01 -07:00
Arthur Ice 01991f4beb GetAdventureStats converted to QueryDatabase 2014-07-08 21:10:01 -07:00
Arthur Ice 28212ab8f8 UpdateAdventureStatsEntry converted to QueryDatabase 2014-07-08 21:10:01 -07:00
Arthur Ice 22d06bc3d1 GlobalInstance converted to QueryDatabase 2014-07-08 21:10:01 -07:00
Arthur Ice 167ce7829c SetInstanceDuration converted to QueryDatabase 2014-07-08 21:10:01 -07:00
Arthur Ice bb2dc991eb AssignRaidToInstance converted to QueryDatabase 2014-07-08 21:10:01 -07:00
Arthur Ice 989b5d96c5 AssignGroupToInstance converted to QueryDatabase 2014-07-08 21:10:01 -07:00
Arthur Ice 0ea1010e3f GetCharactersInInstance converted to QueryDatabase 2014-07-08 21:10:00 -07:00
Arthur Ice 4f4f9e8eb3 GetUnusedInsanceId converted to QueryDatabase 2014-07-08 21:10:00 -07:00
Arthur Ice d32f16fef5 GetInstanceID (uint32 zone version) converted to QueryDatabase 2014-07-08 21:10:00 -07:00
Arthur Ice 41660240fb GetInstanceID converted to QueryDatabase 2014-07-08 21:10:00 -07:00
Arthur Ice c160059612 GetInstanceVersion converted to QueryDatabase 2014-07-08 21:10:00 -07:00
Arthur Ice c055b20b93 BuryCorpsesInInstance converted to QueryDatabase 2014-07-08 21:10:00 -07:00
Arthur Ice e1b251ee8f CheckInstanceExists converted to QueryDatabase 2014-07-08 21:10:00 -07:00
Arthur Ice e60117cabb AddClientToInstance converted to QueryDatabase 2014-07-08 21:10:00 -07:00
Arthur Ice 3449f5e11c PurgeExpiredInstances converted to QueryDatabase 2014-07-08 21:10:00 -07:00
Arthur Ice 010bc76440 CreateInstance converted to QueryDatabase 2014-07-08 21:10:00 -07:00
Arthur Ice 4b647602b3 GetUnusedInstanceID converted to QueryDatabase 2014-07-08 21:10:00 -07:00
Arthur Ice 9abdf5f4b3 GetTimeRemainingInstance converted to QueryDatabase 2014-07-08 21:10:00 -07:00
Arthur Ice 903a3a9060 VersionFromInstanceID converted to QueryDatabase 2014-07-08 21:10:00 -07:00
Arthur Ice 4541bd5369 ZoneIDFromInstanceID converted to QueryDatabase 2014-07-08 21:09:59 -07:00
Arthur Ice 94e4da9456 CheckInstanceExpired converted to QueryDatabase 2014-07-08 21:09:59 -07:00
Arthur Ice 2f3c1ed169 DeleteInstance converted to QueryDatabase 2014-07-08 21:09:59 -07:00
Arthur Ice 3db115b52f CharacterInInstanceGroup converted to QueryDatabase 2014-07-08 21:09:59 -07:00
Arthur Ice 96c4b283fa VerifyZoneInstance converted to QueryDatabase 2014-07-08 21:09:59 -07:00
Arthur Ice 7dce9d6c8e formatting cleanup, no functional change 2014-07-08 21:09:59 -07:00
Arthur Ice bc46b1371d GetRaidLeaderName converted to QueryDatabase 2014-07-08 21:09:59 -07:00
Arthur Ice 4a09b9b1a0 GetRaidID converted to QueryDatabase 2014-07-08 21:09:59 -07:00
Arthur Ice a08c6c9a00 ClearRaidDetails converted to QueryDatabase 2014-07-08 21:09:59 -07:00
Arthur Ice 9b4491df57 ClearAllRaidDetails converted to QueryDatabase 2014-07-08 21:09:59 -07:00
Arthur Ice e81e47e9c5 Built utility function ClearAllRaidDetails 2014-07-08 21:09:59 -07:00
Arthur Ice 34739b71b3 Converted ClearRaid to QueryDatabase, added ClearAllRaids utility method 2014-07-08 21:09:59 -07:00
Arthur Ice c80f803ba7 SetAgreementFlag converted to QueryDatabase 2014-07-08 21:09:59 -07:00
Arthur Ice 6132fa0cb9 GetAgreementFlag converted to QueryDatabase 2014-07-08 21:09:59 -07:00
Arthur Ice 586e177f98 Created private utility methods ClearAllGroups and ClearAllGroupLeaders 2014-07-08 21:09:58 -07:00
Arthur Ice 695e6f2026 ClearGroupLeader converted to QueryDatabase 2014-07-08 21:09:58 -07:00
Arthur Ice 9bbde71964 SetGroupLeaderName converted to QueryDatabase 2014-07-08 21:09:58 -07:00
Arthur Ice 7a5afd8597 GetZoneName formatting cleanup. much easier to read 2014-07-08 21:09:58 -07:00
Arthur Ice c6f707d95c GetZoneID nullptr and formatting clean up 2014-07-08 21:09:58 -07:00
Arthur Ice b0612f8cdf Converted StoreCharacter to QueryDatabase 2014-07-08 21:09:58 -07:00
Arthur Ice ceccf2b1ca GetGroupID converted to QueryDatabase 2014-07-08 21:09:58 -07:00
Arthur Ice 137b624008 ClearGroup converted to QueryDatabase 2014-07-08 21:09:58 -07:00
Arthur Ice 632b9b9c27 errbuff and Query to query change 2014-07-08 21:09:58 -07:00
Arthur Ice 819de185ef SetGroupID converted to QueryDatabase 2014-07-08 21:09:58 -07:00
Arthur Ice 61abdeb3f7 AddReport converted to QueryDatabase 2014-07-08 21:09:58 -07:00
Arthur Ice cc9267707a SetFirstLogon converted to QueryDatabase 2014-07-08 21:09:58 -07:00
Arthur Ice c82ce7cecc SetLoginFlags and SetLFG converted to QueryDatabase 2014-07-08 21:09:58 -07:00
Arthur Ice 00db7e5c93 SetLFP converted to QueryDatabase 2014-07-08 21:09:57 -07:00
Arthur Ice f0106c90a8 GetLiveChar converted to QueryDatabase 2014-07-08 21:09:57 -07:00
Arthur Ice edf24308fb getZoneLongName converted 0 assign of query to nullptr 2014-07-08 21:09:57 -07:00
KayenEQ 705ffa89bc Update SE_InterruptCasting: Will now work for instant spells (as well as over time). 2014-07-08 21:09:57 -07:00
KayenEQ 8cdcd189f5 Updated SE_BardAEDot to no longer damage target while target is moving (consistent with live) 2014-07-08 21:09:57 -07:00
KayenEQ 9e26ebb9e5 Changed SE_LimitMaxMana to SE_MeleeVulnerability - Weakness/Mitigation verse melee damage
(Despite lives SPA lable as the former it clearly is not what the effect does from all spell examples)
2014-07-08 21:09:57 -07:00
KayenEQ 7b085c8018 Implemented SE_LimitSpellClass - Focus Limits spell to pre defined categories. (3=Cures,3=Offensive, 6=Lifetap) 2014-07-08 21:09:57 -07:00
KayenEQ 41d3b177ea Renamed various Cast on Fade spell effects to more accurately describe their functions.
Missing code from prior commit.
2014-07-08 21:09:57 -07:00
KayenEQ effe2149da Re-Implemented SE_TriggerMeleeThreshold and SE_TriggerSpellThreshold correctly - Trigger spell if owner of buff
takes more than the specified damage amount in a SINGLE hit, then fade the buff.
2014-07-08 21:09:57 -07:00
KayenEQ 9af74e6468 Implemented SE_FactionModPct - Modifies faction gains and losses by percent. 2014-07-08 21:09:56 -07:00
KayenEQ ede9d557a3 Implemented SE_ResourceTap - Coverts a percent of dmg from dmg spells(DD/DoT) to hp/mana/end. 2014-07-08 21:09:56 -07:00
KayenEQ 0be08b7899 Implemented SE_Sanctuary - Places caster at bottom hate list,
effect fades if caster cast spell on targets other than self.
2014-07-08 21:09:56 -07:00
Michael Cook (mackal) 2b204fa756 Hopefully fix compile issue with some VS versions 2014-07-08 21:09:56 -07:00
Arthur Ice 2c78a47a94 Linux compile fixes 2014-07-08 21:09:56 -07:00
KimLS e599820383 Missing return value 2014-07-08 21:09:56 -07:00
Michael Cook (mackal) cc69e81dab Fix case-sensitive issue 2014-07-08 21:09:56 -07:00
KimLS 7048fcc358 Fix for GCC+11 compile 2014-07-08 21:09:56 -07:00
Arthur Ice b169dbd09d UpdateLiveChar converted to QueryDatabase 2014-07-08 21:09:56 -07:00
Arthur Ice f7c637a0d9 Errbuf fix and GetCharacterInfo converted to QueryDatabase 2014-07-08 21:09:56 -07:00
Arthur Ice a054b83b92 GetSkillCap converted to QueryDatabase 2014-07-08 21:09:56 -07:00
Arthur Ice 4eea1e0468 GetRaceSkill converted to QueryDatabase 2014-07-08 21:09:56 -07:00
Arthur Ice 853f1b56e5 SetMQDetectionFlag converted to QueryDatabase 2014-07-08 21:09:56 -07:00
Arthur Ice bf2d65d7e9 SetHackerFlag converted to QueryDatabase 2014-07-08 21:09:55 -07:00
Arthur Ice 7b551f0399 CopyCharacter converted to QueryDatabase 2014-07-08 21:09:55 -07:00
Arthur Ice fdbb166076 MoveCharacterToZone converted to QueryDatabase 2014-07-08 21:09:55 -07:00
Arthur Ice 2fe133fa0e GetServerType converted to QueryDatabase 2014-07-08 21:09:55 -07:00
Arthur Ice 6a59b83d43 StringFormat converted to move semantics 2014-07-08 21:09:55 -07:00
Chris M 9a634a2056 Removing socket server from cmake for now and maintaining it in its own branch until push to master 2014-07-08 21:09:55 -07:00
Chris M d0416d5f35 More Socket Server work. Made Socket server a by default disabled option in the CMake configuration while development is underway. For now, do not use. 2014-07-08 21:09:55 -07:00
Chris M 3e0f6b8520 Initial Socket Server implementation with CMakeLists.txt updated. Socket server will connect to world at this point. 2014-07-08 21:09:55 -07:00
KayenEQ 6877e40b38 Update to SE_AStacker, B, C, D
Will correclty use base value to stack with same type ie (A vs A)
Highest base value will take hold.
2014-07-08 21:09:55 -07:00
KayenEQ 1cd20c65e2 Renamed a few spell effects more appropriately. 2014-07-08 21:09:55 -07:00
KayenEQ 4672f223c1 minor fix 2014-07-08 21:09:55 -07:00
KayenEQ 042f6f3789 Updated SE_WaketheDead , max will now set duration. 2014-07-08 21:09:54 -07:00
KayenEQ 718ba3edbf Implemented SE_PetMeleeMitigation - Bonus applied to pet owner. Gives AC to owner's pet.
Related AA's to be added in a seperate update.
2014-07-08 21:09:54 -07:00
KayenEQ 32d20f22ef Revised Finishing blow so that damage now receives all melee bonus. Support also for this effect if placed on items or spells. 2014-07-08 21:09:54 -07:00
KayenEQ d3ce9792b5 Fix for AA Finishg Blow rank 1-3.
AA Data was missing and incorrectly added to wrong aaid.
Required SQL
2014-07-08 21:09:54 -07:00
KayenEQ 2afa08e361 Implemented SE_Assassinate, SE_AssassinateLevel - Defines assassinate damage and level requirements.
Revised Assassinate mechanic so damage now receives all backstab bonuses, proc chance can be set to either (lives new Proc Per minute
system, or flat chance based on dex (formula updated). Assassinate can now proc from THROW if behind target, various other adjustments.

Required SQL for AA updates
2014-07-08 21:09:54 -07:00
KayenEQ 25c20f0629 Implemented SE_HeadShot, SE_HeadShotLevel - Defines headshot damage and level requirements.
Revised HeadShot mechanic so damage now recieves all archery bonuses, proc chance can be set to either (lives new Proc Per minute
system, or flat chance based on dex (formula updated).

Required SQL for AA data
Optional SQL for rules
2014-07-08 21:09:54 -07:00
KayenEQ 786b8c80fd Udpated SE_ReclaimPet - Correct forumla for mana returned to properly return 75% of actual pet spell mana cost.
Implemented SE_ImprovedReclaimEnergy - Modifies % mana returned from SE_ReclaimPet.
Required SQL update.
2014-07-08 21:09:54 -07:00
KayenEQ 6c4e69a71d Slight change to TryDispel formula for better accuracy.
Live PATCH 5-20-14 Note: "Updated all spells which
use Remove Detrimental and Cancel Beneficial spell
effects to use a new method. The chances for those
spells to affect their targets have not changed unless
otherwise noted"

Support added for new base values to give
a nearly equivelent result.
(Ie. Will work for values pre and post change)
2014-07-08 21:09:54 -07:00
KayenEQ ef79a0607b Update SE_AETaunt - Base value will now determine AE taunt range (This will not result in any change to currently used spells). 2014-07-08 21:09:53 -07:00
KayenEQ fbdc104c12 changelog fix 2014-07-08 21:09:53 -07:00
KayenEQ 34bbb9236e Implemented SE_IllusionOther - Allows next Illusion buff (self only)
cast to be cast on target. (AA ProjectIllusion now uses this)
Run required SLQ to update AA.
2014-07-08 21:09:53 -07:00
KayenEQ 54d1cff546 Implemented SE_MassGroupBuff as spell effect (no longer hard coded for AA
only). Run required SQL to update AA tables.
Updated spells_new field175 -> numhits_type
2014-07-08 21:09:53 -07:00
KayenEQ 4684d92758 Update SE_Taunt - Limit value if present will now add instant hate. 2014-07-08 21:09:53 -07:00
KayenEQ 75fb34934d Implemented SE_StrikeThough (Was incorrectly defined as implemented previously) - Works same as item bonus. 2014-07-08 21:09:53 -07:00
KayenEQ a1f2e1c8fd Updated SE_FadingMemories - Base value will be properly utilized to set % chance for fade effect to work. 2014-07-08 21:09:53 -07:00
KayenEQ dc6154f71f Updated SE_Hate (Renamed from SE_Hate2) to now properly work for instant +/- hate spells. 2014-07-08 21:09:53 -07:00
KimLS b7cc19f983 Removed older AZone build options, use eqemu-zone-utils instead 2014-07-08 21:09:53 -07:00
KayenEQ ee6a4bd244 Implemented an enumerator list for numhits type variables.
Implemented type 4 outgoing spell damage numhits type.
2014-07-08 21:09:52 -07:00
KayenEQ e7051d0289 Fix to SE_BlanaceMana to only check classes in group that have mana. 2014-07-08 21:09:52 -07:00
KimLS 9680f39203 Some potential fixes for clang, not complete 2014-07-08 21:09:52 -07:00
KayenEQ 11918fccbf Update to SE_BalanaceMana, SE_BalanceHP to support limit value which caps max mana/hp that can be taken per player. 2014-07-08 21:09:52 -07:00
KayenEQ 53fb53e822 Kayen: Implemented SE_Metabolism - Modifies food/drink consumption rates. [Data for AA is already in database] 2014-07-08 21:09:52 -07:00
KayenEQ ad31de5f78 SE_NegateAttacks buff stacking optimized. 2014-07-08 21:09:52 -07:00
KayenEQ 6821dc27f5 Update to SE_NegateAttack, 'max' value can now set upper limit of damage absorbed.
DOT ticks will no longer be absorbed.
2014-07-08 21:09:52 -07:00
KayenEQ ef7e107443 Fixes and Updates to spell and melee mitigation runes.
-Fix for calculation error when rune was to be removed.
-Updated to support these spell effect limit values which
give a max amount per hit/spell that can be mitigated.
-Updated to allow support for these spells effects when
the max (rune value) is set to zero, which essentially
gives you unlimited mitigation but typically there is
a limit value set.
2014-07-08 21:09:52 -07:00
KayenEQ 60dcdbd181 minor fix 2014-07-08 21:09:52 -07:00
KayenEQ b732133184 Implemention for SE_Berserk, SE_Vampirism (These are not used on live)
Fix for NPC not receiving spell bonus derived HP regen.
2014-07-08 21:09:51 -07:00
KayenEQ 611f0e2aba Implemented SE_DoubleRiposte 2014-07-08 21:09:51 -07:00
KayenEQ 5a4f80621b Kayen: Implemented SE_AddHateOverTimePct (Modifies +/- your total hate on NPC by percent over time) 2014-07-08 21:09:51 -07:00
KayenEQ 606bd86e3a Implemented SE_AddHatePct (Modifies +/- your total hate on NPC by percent) 2014-07-08 21:09:51 -07:00
KayenEQ 3253f7494e Implemented SE_DamageModifier2 2014-07-08 21:09:51 -07:00
KayenEQ 31a774a92a Implemented SE_AStacker, BStacker, CStacker, DStacker
Effects are buff stacking blockers.
2014-07-08 21:09:51 -07:00
Arthur Ice a0d5e5ad72 CheckUsedName converted to QueryDatabase 2014-07-08 21:09:51 -07:00
Arthur Ice cf8cfd8b17 UpdateName converted to QueryDatabase 2014-07-08 21:09:51 -07:00
Arthur Ice e607f5c079 ClearMerchantTemp converted to QueryDatabase 2014-07-08 21:09:51 -07:00
Arthur Ice 397f7050ef GetAccountFromID converted to QueryDatabase 2014-07-08 21:09:50 -07:00
Arthur Ice e20e5e59b8 GetAccountIDFromLSID converted to QueryDatabase 2014-07-08 21:09:50 -07:00
Arthur Ice 20e40a9a9c AddToNameFilter converted to QueryDatabase 2014-07-08 21:09:50 -07:00
Arthur Ice da2673d35e CheckNameFilter converted to QueryDatabase 2014-07-08 21:09:50 -07:00
Arthur Ice 5c8cd19477 GetPEQZone converted to QueryDatabase 2014-07-08 21:09:50 -07:00
Arthur Ice 2a19a3ced4 LoadZoneNames converted to QueryDatabase 2014-07-08 21:09:50 -07:00
Arthur Ice 24d08857e8 GetZoneGraveyard converted to QueryDatabase 2014-07-08 21:09:50 -07:00
Arthur Ice 329fcc8302 GetZoneGraveyardID converted to QueryDatabase 2014-07-08 21:09:50 -07:00
Arthur Ice 91c8233a71 GetZoneLongName converted to QueryDatabase 2014-07-08 21:09:50 -07:00
Arthur Ice ee696c2122 errbuf fix (again) and GetSafePoints converted to QueryDatabase 2014-07-08 21:09:50 -07:00
Arthur Ice 3dfff739fa GetMiniLoginAccount converted to QueryDatabase 2014-07-08 21:09:50 -07:00
Arthur Ice 6d6746f5a4 SetVariable converted to QueryDatabase 2014-07-08 21:09:50 -07:00
Arthur Ice 74d65f6fda Converted LoadVariables, and LoadVariables_result to QueryDatabase 2014-07-08 21:09:50 -07:00
Arthur Ice 87cb659dc2 errbuf issue again 2014-07-08 21:09:50 -07:00
Arthur Ice 4e25f4b68c GetCharName converted to QueryDatabase 2014-07-08 21:09:50 -07:00
Arthur Ice 5ef05d1bb6 GetAccountName converted to QueryDatabase 2014-07-08 21:09:50 -07:00
Arthur Ice 20e80ebb92 errbuff fixed, also moved alphanumeric account check to function in StringUtil 2014-07-08 21:09:49 -07:00
Arthur Ice 9c6b538176 GetAccountIDByName converted to QueryDatabase 2014-07-08 21:09:49 -07:00
Arthur Ice 5e629a3e5c GetAccountIDByChar converted to QueryDatabase 2014-07-08 21:09:49 -07:00
Arthur Ice 0aacecbee5 GetAccountIDByChar converted to QueryDatabase 2014-07-08 21:09:49 -07:00
Arthur Ice 3aacf7df6a DeleteCharacter converted to QueryDatabase 2014-07-08 21:09:49 -07:00
Arthur Ice 3cb7d9e3fe removed printf from DeleteCharacter switched to cerr and cout 2014-07-08 21:09:49 -07:00
Arthur Ice 02b1b5ac0c ReserveName converted to QueryDatabase 2014-07-08 21:09:49 -07:00
Arthur Ice e3de570f29 SetAccountStatus converted to QueryDatabase 2014-07-08 21:09:49 -07:00
Arthur Ice 2e7f7ad477 SetLocalPassword converted to QueryDatabase 2014-07-08 21:09:49 -07:00
Arthur Ice ed6db3e7b0 DeleteAccount converted to QueryDatabase 2014-07-08 21:09:49 -07:00
Arthur Ice 0ab8c2481b CreateAccount converted to QueryDatabase 2014-07-08 21:09:49 -07:00
Arthur Ice 95c82d9968 CheckStatus using QueryDatabase 2014-07-08 21:09:49 -07:00
Arthur Ice 1bfdeeeb16 fixed query release order and converted LoginIP to QueryDatabase 2014-07-08 21:09:49 -07:00
Arthur Ice 418e4ffee8 AddGMIP converted to QueryDatabase 2014-07-08 21:09:48 -07:00
Arthur Ice cbf49b303b CheckGMIPs to QueryDatabase 2014-07-08 21:09:48 -07:00
Arthur Ice 7f135d6e55 AddBannedIP converted to QueryDatabase 2014-07-08 21:09:48 -07:00
Arthur Ice 02f21ad7c9 CheckLogin converted to DatabaseQuery 2014-07-08 21:09:48 -07:00
Arthur Ice e6023a7013 CheckBannedIPs converted to QueryDatabase 2014-07-08 21:09:48 -07:00
Arthur Ice 699b27cecc Added LastInsertID() to MySQLRequestResult 2014-07-08 21:09:48 -07:00
Michael Cook (mackal) 4707e0f858 Inline a few functions that should be 2014-07-08 21:21:44 -04:00
Michael Cook fc721b8ec8 Merge pull request #167 from KayenEQ/Development
Development
2014-07-08 21:18:53 -04:00
KayenEQ 2918f6bc07 removal of debug msg 2014-07-08 18:27:31 -04:00
KayenEQ b27ff80c75 fix for random int -> float error 2014-07-08 08:04:56 -04:00
Alex 0e0dee3d3d Merge pull request #168 from addtheice/mysql_fetch_lengths_interface
Mysql fetch lengths interface
2014-07-07 19:36:08 -07:00
KayenEQ d22d0a8145 Update to how FcBaseEffect focus modifies SE_SkillAttack damage. 2014-07-06 20:13:19 -04:00
Arthur Ice c175369ff6 string based QueryDatabase 2014-07-06 16:15:54 -07:00
Arthur Ice 923adc3ea5 Added FieldName for column name requests 2014-07-06 16:01:10 -07:00
KayenEQ 0e438942e4 Complete revision of SE_SkillProc, SE_LimitToSkill,
SE_SkillProcSuccess (now implemented correctly)
to function more accurately and efficiently, AA supported.
This may need to be updated in the future, if more live
spells readily become avialable to test with.
2014-07-06 18:58:16 -04:00
KimLS 44aa1285ee Merge conflict resolution 2014-07-06 15:24:48 -07:00
KimLS 122d180f02 Changed some headers that seemed to conflict on slightly older versions of msvc 2014-07-06 15:22:58 -07:00
Arthur Ice f3340343ad Merge remote-tracking branch 'upstream/master' 2014-07-06 11:49:26 -07:00
Arthur Ice d514eef59b Added LengthOfColumn method because of stupid BLOBs 2014-07-05 10:20:28 -07:00
KayenEQ 3a4e72e3e7 Merge git://github.com/EQEmu/Server into Development 2014-07-04 23:38:24 -04:00
KayenEQ 58d585e2a6 Updated SE_Sanctuary - Adjust way hate lowering effect worked to be more accurate
Updated SE_SympatheticProc - Revised proc rate formula to be accurate to live.
Sympathetic foci on items with proc rate mod will now benefit from that modifier.
Sympathetic foci can now be placed on AA's (This should always be slot1 in the AA)
Implemented SE_IllusionPersistence- Allows illusions to last until you die or the illusion is forcibly removed.
Added rule 'PreNerftBardAEDot' for SE_BardAEDot to allow it to once again do damage to moving targets. (Set to true)
2014-07-04 23:35:15 -04:00
Michael Cook 9a76df62dd Merge pull request #165 from KayenEQ/Development
Implemented SE_Sanctuary - Places caster at bottom hate list,
2014-07-04 15:59:16 -04:00
KayenEQ fe5416958a Merge branch 'Development' of github.com:KayenEQ/Server into Development 2014-07-04 14:24:49 -04:00
Michael Cook (mackal) 3b9e9ae0fd Hopefully fix compile issue with some VS versions 2014-07-04 13:57:09 -04:00
Arthur Ice 773ab21085 Merge remote-tracking branch 'upstream/master' 2014-07-03 23:38:30 -07:00
KimLS eb62481766 Missing return value 2014-07-03 23:35:19 -07:00
Arthur Ice 6197fb07e1 Merge remote-tracking branch 'upstream/master' 2014-07-03 23:09:19 -07:00
KimLS c9830dff57 Merge branch 'master' of https://github.com/EQEmu/Server into clang 2014-07-03 21:49:39 -07:00
KimLS 192f9f0cb5 Fix for GCC+11 compile 2014-07-03 21:49:14 -07:00
Michael Cook (mackal) e599555ddb Fix case-sensitive issue 2014-07-04 00:46:53 -04:00
Arthur Ice 328cce33b9 Merge remote-tracking branch 'upstream/master' 2014-07-03 19:44:59 -07:00
Alex 127682cc84 Merge pull request #161 from addtheice/DatabaseInterface
Database interface
2014-07-03 19:31:36 -07:00
Arthur Ice 065db3b396 Merge remote-tracking branch 'upstream/master' 2014-07-03 19:20:03 -07:00
Chris M c645b81890 Removing socket server from cmake for now and maintaining it in its own branch until push to master 2014-07-03 18:16:43 -05:00
Arthur Ice 2734307ba2 Added LastInsertID() to MySQLRequestResult 2014-07-03 15:48:17 -07:00
Arthur Ice 53fd5e0a5c Merge remote-tracking branch 'upstream/master' 2014-07-03 15:05:22 -07:00
KayenEQ 5a30d3ed03 Update SE_InterruptCasting: Will now work for instant spells (as well as over time). 2014-07-03 11:37:38 -04:00
KayenEQ 28493488ac Updated SE_BardAEDot to no longer damage target while target is moving (consistent with live) 2014-07-03 11:00:23 -04:00
KayenEQ 0d2127f874 Changed SE_LimitMaxMana to SE_MeleeVulnerability - Weakness/Mitigation verse melee damage
(Despite lives SPA lable as the former it clearly is not what the effect does from all spell examples)
2014-07-03 10:55:59 -04:00
KayenEQ ee741048e9 Implemented SE_LimitSpellClass - Focus Limits spell to pre defined categories. (3=Cures,3=Offensive, 6=Lifetap) 2014-07-03 08:48:27 -04:00
Chris M 90f74d6847 More Socket Server work. Made Socket server a by default disabled option in the CMake configuration while development is underway. For now, do not use. 2014-07-03 03:25:58 -05:00
Chris M a92b4c04e9 Initial Socket Server implementation with CMakeLists.txt updated. Socket server will connect to world at this point. 2014-07-02 22:17:45 -05:00
KayenEQ 8453d5bc48 Renamed various Cast on Fade spell effects to more accurately describe their functions.
Missing code from prior commit.
2014-07-02 21:38:26 -04:00
KayenEQ 542c0913d6 Re-Implemented SE_TriggerMeleeThreshold and SE_TriggerSpellThreshold correctly - Trigger spell if owner of buff
takes more than the specified damage amount in a SINGLE hit, then fade the buff.
2014-07-02 14:00:50 -04:00
KayenEQ 35e72692c1 Implemented SE_FactionModPct - Modifies faction gains and losses by percent. 2014-07-02 11:54:59 -04:00
KayenEQ 4a49a11e73 Implemented SE_ResourceTap - Coverts a percent of dmg from dmg spells(DD/DoT) to hp/mana/end. 2014-07-02 11:18:50 -04:00
KayenEQ ee6d7ae6ba Implemented SE_Sanctuary - Places caster at bottom hate list,
effect fades if caster cast spell on targets other than self.
2014-07-02 08:42:18 -04:00
Michael Cook bd86e70766 Merge pull request #164 from KayenEQ/Development
Updated SE_Hate (Renamed from SE_Hate2) to now properly work for instant...
2014-07-01 23:50:31 -04:00
KayenEQ 5d85a26be1 Update to SE_AStacker, B, C, D
Will correclty use base value to stack with same type ie (A vs A)
Highest base value will take hold.
2014-07-01 17:34:36 -04:00
KayenEQ ede7f9899c Renamed a few spell effects more appropriately. 2014-07-01 16:52:28 -04:00
KayenEQ 3b8993a302 minor fix 2014-07-01 04:55:50 -04:00
KayenEQ c412038db8 Updated SE_WaketheDead , max will now set duration. 2014-07-01 04:53:24 -04:00
KimLS 2ef6d3f93e Removed older AZone build options, use eqemu-zone-utils instead 2014-06-30 14:09:03 -07:00
KayenEQ 5e7d2fd07d Implemented SE_PetMeleeMitigation - Bonus applied to pet owner. Gives AC to owner's pet.
Related AA's to be added in a seperate update.
2014-06-30 16:17:55 -04:00
KayenEQ 8edb73dc3a Revised Finishing blow so that damage now receives all melee bonus. Support also for this effect if placed on items or spells. 2014-06-30 07:18:47 -04:00
KayenEQ 93900086e1 Fix for AA Finishg Blow rank 1-3.
AA Data was missing and incorrectly added to wrong aaid.
Required SQL
2014-06-30 06:34:12 -04:00
KayenEQ 70f10782b0 Implemented SE_Assassinate, SE_AssassinateLevel - Defines assassinate damage and level requirements.
Revised Assassinate mechanic so damage now receives all backstab bonuses, proc chance can be set to either (lives new Proc Per minute
system, or flat chance based on dex (formula updated). Assassinate can now proc from THROW if behind target, various other adjustments.

Required SQL for AA updates
2014-06-29 23:26:22 -04:00
KayenEQ 8a92fada5a Implemented SE_HeadShot, SE_HeadShotLevel - Defines headshot damage and level requirements.
Revised HeadShot mechanic so damage now recieves all archery bonuses, proc chance can be set to either (lives new Proc Per minute
system, or flat chance based on dex (formula updated).

Required SQL for AA data
Optional SQL for rules
2014-06-29 01:10:19 -04:00
KayenEQ ce2a79b63e Udpated SE_ReclaimPet - Correct forumla for mana returned to properly return 75% of actual pet spell mana cost.
Implemented SE_ImprovedReclaimEnergy - Modifies % mana returned from SE_ReclaimPet.
Required SQL update.
2014-06-27 20:55:17 -04:00
KayenEQ 2fb95b00a5 Slight change to TryDispel formula for better accuracy.
Live PATCH 5-20-14 Note: "Updated all spells which
use Remove Detrimental and Cancel Beneficial spell
effects to use a new method. The chances for those
spells to affect their targets have not changed unless
otherwise noted"

Support added for new base values to give
a nearly equivelent result.
(Ie. Will work for values pre and post change)
2014-06-26 10:54:18 -04:00
KayenEQ 1867088e1a Update SE_AETaunt - Base value will now determine AE taunt range (This will not result in any change to currently used spells). 2014-06-26 10:04:21 -04:00
KayenEQ a573e840db changelog fix 2014-06-26 06:45:18 -04:00
KayenEQ 87e7b9c3f0 Implemented SE_IllusionOther - Allows next Illusion buff (self only)
cast to be cast on target. (AA ProjectIllusion now uses this)
Run required SLQ to update AA.
2014-06-26 06:23:27 -04:00
KayenEQ ec35c0d933 Implemented SE_MassGroupBuff as spell effect (no longer hard coded for AA
only). Run required SQL to update AA tables.
Updated spells_new field175 -> numhits_type
2014-06-26 05:40:09 -04:00
KayenEQ 2a48b199d2 Update SE_Taunt - Limit value if present will now add instant hate. 2014-06-25 15:25:22 -04:00
KayenEQ 02e780025d Implemented SE_StrikeThough (Was incorrectly defined as implemented previously) - Works same as item bonus. 2014-06-25 14:41:15 -04:00
KayenEQ 677ba36d55 Updated SE_FadingMemories - Base value will be properly utilized to set % chance for fade effect to work. 2014-06-25 14:31:35 -04:00
KayenEQ b23af6d436 Updated SE_Hate (Renamed from SE_Hate2) to now properly work for instant +/- hate spells. 2014-06-25 14:14:55 -04:00
Michael Cook db798ea4f4 Merge pull request #163 from KayenEQ/Development
Implemented an enumerator list for 'numhits type' variables.
2014-06-24 22:27:37 -04:00
KayenEQ 6ef11777e3 Implemented an enumerator list for numhits type variables.
Implemented type 4 outgoing spell damage numhits type.
2014-06-24 22:04:13 -04:00
Michael Cook a4fe14a3d3 Merge pull request #160 from KayenEQ/Development
Implemented SE_AStacker, BStacker, CStacker, DStacker
2014-06-24 20:51:24 -04:00
KayenEQ 660db94607 Fix to SE_BlanaceMana to only check classes in group that have mana. 2014-06-24 08:24:11 -04:00
KayenEQ aa8195565d Merge git://github.com/EQEmu/Server into Development 2014-06-24 08:19:19 -04:00
KimLS a6589e283b Some potential fixes for clang, not complete 2014-06-23 16:56:37 -07:00
KayenEQ 58175a5442 Update to SE_BalanaceMana, SE_BalanceHP to support limit value which caps max mana/hp that can be taken per player. 2014-06-23 08:37:23 -04:00
KayenEQ 41b190930f Kayen: Implemented SE_Metabolism - Modifies food/drink consumption rates. [Data for AA is already in database] 2014-06-22 23:10:29 -04:00
KayenEQ f28a392f71 SE_NegateAttacks buff stacking optimized. 2014-06-22 15:55:04 -04:00
KayenEQ 8ad9ad578c Update to SE_NegateAttack, 'max' value can now set upper limit of damage absorbed.
DOT ticks will no longer be absorbed.
2014-06-22 10:30:18 -04:00
KayenEQ a4769239fa Fixes and Updates to spell and melee mitigation runes.
-Fix for calculation error when rune was to be removed.
-Updated to support these spell effect limit values which
give a max amount per hit/spell that can be mitigated.
-Updated to allow support for these spells effects when
the max (rune value) is set to zero, which essentially
gives you unlimited mitigation but typically there is
a limit value set.
2014-06-22 06:16:34 -04:00
KayenEQ c20f35b3e8 minor fix 2014-06-21 10:12:24 -04:00
KayenEQ 5a14a85f52 Implemention for SE_Berserk, SE_Vampirism (These are not used on live)
Fix for NPC not receiving spell bonus derived HP regen.
2014-06-20 18:10:29 -04:00
Arthur Ice 3054a4c307 Database interface improvement with stl style iterators 2014-06-18 15:58:26 -07:00
KayenEQ 70476bfb06 Implemented SE_DoubleRiposte 2014-06-18 06:25:14 -04:00
Arthur Dene Ice b3292e1d22 Merge remote-tracking branch 'upstream/master' 2014-06-17 15:28:37 -07:00
KayenEQ a34a69b4c4 Kayen: Implemented SE_AddHateOverTimePct (Modifies +/- your total hate on NPC by percent over time) 2014-06-17 16:08:19 -04:00
KayenEQ aa6af15cb5 Implemented SE_AddHatePct (Modifies +/- your total hate on NPC by percent) 2014-06-17 15:49:56 -04:00
KayenEQ da70a45d22 Implemented SE_DamageModifier2 2014-06-17 15:23:07 -04:00
KayenEQ 57a216cb44 Implemented SE_AStacker, BStacker, CStacker, DStacker
Effects are buff stacking blockers.
2014-06-17 09:45:12 -04:00
KimLS 308562f939 Work around for msvc tuple bug 2014-06-16 15:09:17 -07:00
Michael Cook 64784be57e Merge pull request #159 from KayenEQ/Development
Additional functionality for damage shield and skill damage taken effects via npc_spell_effects  table.
2014-06-14 01:14:44 -04:00
KayenEQ f0e8d88178 Implemented 'special_abilities' 38 ALLOW_BENEFICIAL (Allows an NPC to recieve player buffs/heals)
Implemented 'special_abilities' 39 DISABLE_MELEE (Prevents NPC from auto attacking, will still aggro)
2014-06-13 17:46:34 -04:00
KayenEQ 5137b84ba8 Implemented SE_AlterNPCLevel 2014-06-13 14:51:26 -04:00
KayenEQ 216113e14b Additional functionality for damage shield and skill damage taken
effects va the npc_spell_effects table. See change log and wiki.
2014-06-13 05:32:41 -04:00
KimLS a1adda36fa Experimental changes to lua get_qglobal implementation to try to see if we can figure out this gcc x86 bug. 2014-06-08 15:18:48 -07:00
Michael Cook 5d074ea998 Update LS default entry in example config 2014-06-05 02:57:56 -04:00
KimLS e9c4613368 Merge branch 'master' into water_map_v2 2014-06-04 18:32:48 -07:00
KimLS 3690f93302 Fix for fear failing, removed #fear command because it was blank anyway, added a cmake command to change the default map/water/path directory 2014-05-31 16:32:15 -07:00
Arthur Dene Ice 97e1963674 Merge remote-tracking branch 'upstream/master' 2014-05-28 09:19:26 -07:00
KimLS dd73b82ec2 Fix for a problem with global player quests and hasquestsub 2014-05-27 16:16:06 -07:00
KimLS 8a5405060f Fix for string.h missing in water map 2014-05-23 17:39:16 -07:00
KimLS 83270d0983 Merge from master stuff 2014-05-23 16:10:23 -07:00
KimLS fd4343702f Merge branch 'master' into water_map_v2 2014-05-23 16:09:46 -07:00
KimLS 0483e8bd1b Removed the logging now that the issue is resolved 2014-05-23 16:08:02 -07:00
KimLS 39cbdbd5c2 Debug logs for map, also can actually turn perl off on zone 2014-05-23 15:54:26 -07:00
Michael Cook (mackal) 5af47c5951 Fix for Technique of Master Wu triple attack 2014-05-23 17:21:47 -04:00
Michael Cook (mackal) c447c251cd Fix issue with avoidance discs 2014-05-22 13:45:44 -04:00
KimLS 3a2ccd7521 Added loading of v2 regular maps, also #bestz will report water info even if a reg map failed to load. 2014-05-21 17:30:54 -07:00
KimLS 8c92271804 Initial v2 water map format. 2014-05-20 00:14:26 -07:00
Michael Cook (mackal) cd7b5e4dce Merge branch 'KayenEQ-Development' 2014-05-20 00:49:06 -04:00
Michael Cook (mackal) ecc3459d93 Merge branch 'Development' of github.com:KayenEQ/Server into KayenEQ-Development
Conflicts:
	changelog.txt
2014-05-20 00:48:44 -04:00
SecretsOTheP cc6dce25ad Identified the opcode/struct for guild ranks in Rain of Fear+ clients and created a temporary workaround for permissions until full DB support is added for the new permissions system. 2014-05-17 23:33:35 -04:00
KayenEQ 87ecdd38e5 Update for spell effect SE_LimitHPPercent, SE_LimitManaPercent, SE_LimitEndPercent
to utilize limit values. These effects cap your hp/end/mana at a set percent (base)
OR flat value (limit) which is ever is lower.
2014-05-14 09:27:47 -04:00
KayenEQ fc79521dd3 Rooted NPC's will no longer target players with Divine Aura effect if
they are the closest target and other targets exist on the hate list.
2014-05-14 08:40:18 -04:00
KayenEQ 7d8f1bef87 Missing rule SQL from prior update. 2014-05-14 07:59:12 -04:00
Uleat 10c43bfa51 Re-arranged Item.cpp functions to match their declaration order in Item.h (prep for upcoming changes) 2014-05-12 03:06:13 -04:00
Michael Cook f50b83b293 Merge pull request #152 from KinglyKrab/master
Command.cpp
2014-05-11 13:39:43 -04:00
Alex f89357f3c8 WIS fix.
WIS was actually setting MR.
2014-05-11 13:27:33 -04:00
Alex 1f43e69b4c Updated with fix. 2014-05-10 12:02:48 -04:00
KimLS 670c5e2e1a Fix for crash in loading loot drops when you hit the actual lootdrop entry limit of 1260 2014-05-09 15:06:33 -07:00
KinglyKrab e097722ec6 Update command.cpp
Removed an accidental repetition of atoi.
2014-05-08 13:42:21 -04:00
Michael Cook b54c50ba7a Merge pull request #151 from KayenEQ/AAupdates
Swarm pet critical/flurry bonuses
2014-05-07 23:14:33 -04:00
KayenEQ 7b1a084d39 AA/Item/Spell that allow pets to flurry and critical will now
also apply to owners swarm pets consistent with live.
2014-05-07 22:46:00 -04:00
Uleat 6477de8c4f Fix for test... (conn_state != client_state) 2014-05-05 21:59:21 -04:00
JJ 5c0a75071c SQL file rename (added '0') 2014-05-05 21:18:08 -04:00
Uleat 391eee4289 Test fix for 'random' zone crashes..particularly relating to MGB use. 2014-05-05 20:42:31 -04:00
Arthur Dene Ice 2d6670cfe5 Merge remote-tracking branch 'upstream/master' 2014-05-05 16:26:40 -07:00
Michael Cook (mackal) 2cf546accd Fix #150 2014-05-05 18:23:55 -04:00
KinglyKrab ffa8e5ff62 Update command.cpp 2014-05-05 15:58:36 -04:00
Michael Cook (mackal) 84f99b6d6b Added pointer check 2014-05-05 15:48:19 -04:00
Michael Cook (mackal) eb33e8ae11 Melee 'facing' code updated to client derived function
These new functions are derived from the client
The need was because the old function sometimes didn't line
up with the client generated messages.
2014-05-05 15:29:29 -04:00
JJ 5af0cb2844 Merge pull request #148 from KayenEQ/AAupdates
SlowMItigation sql fix
2014-05-05 09:58:06 -04:00
KinglyKrab 26255b79db Added new abilites to #npcedit.
I added the ability to modify stats, version, maxlevel, PhR, no_target_hotkey, adventure_template_id, npc_spell_effects_id, trap_template, special_abilities, scalerate, healscale, spellscale, and color.
2014-05-04 10:30:52 -04:00
KayenEQ f6e6f10716 Fix for npc_types table error setting SlowMitigation to null by default.
If you already ran the 4-12 update you do not need to run it again,
just run the new one.
2014-05-04 01:02:04 -04:00
Michael Cook b5ca3219a1 Merge pull request #146 from KayenEQ/AAupdates
Fix for AA stacking where first AA in series has only 1 rank.
2014-05-01 02:59:54 -04:00
KayenEQ fb1d4109a9 Fix for AA stacking where first AA in series has only 1 rank. 2014-04-29 22:23:25 -04:00
KimLS a2e86ebec5 Some compile fixes for older versions of C++ on windows 2014-04-29 17:49:17 -07:00
KimLS c6b637e5a5 Changelog 2014-04-29 13:05:45 -07:00
KimLS 0c9d640683 Merge branch 'master' into raycast 2014-04-29 13:01:26 -07:00
Michael Cook db63c947b8 Merge pull request #145 from KayenEQ/AISpellEffects
AI Spell Effects
2014-04-28 17:34:24 -04:00
KayenEQ 649f363917 fix sql 2014-04-28 17:18:23 -04:00
KimLS 6ad4a95cc6 And of course memset too way to not include the whole error message the first time jerk 2014-04-28 13:15:43 -07:00
KimLS d652cc8ea4 Raycastmesh missing malloc, free, NULL refs 2014-04-28 13:10:11 -07:00
KimLS 989bffee81 Merge branch 'master' into raycast 2014-04-27 14:36:05 -07:00
KayenEQ cd9cf9f52f sql hot fix 2014-04-27 04:27:02 -04:00
KayenEQ d3a9d509a8 remove old sql 2014-04-27 04:02:41 -04:00
KayenEQ 380cf8691a Implemented new table 'npc_spells_effects' and 'npc_spells_effects_entires'.
Implemented new field in 'npc_spell_effects_id' in npc_types.

These are used to directly apply spell effect bonuses to NPC's without requirings spells/buffs.
Example: Allow an npc to spawn with an innate 50 pt damage shield and a 5% chance to critical hit.

Please see the wiki page: http://wiki.eqemulator.org/p?npc_spell_effects_entries for details.

*NPC's can now do critical heals / damage spells if bonus is applied from table.

Required SQL: utils/sql/git/required/2014_04_27_AISpellEffects.sql
Note: 30 examples of spell effects have been included by default in this sql. Edited/removed as needed.
2014-04-27 03:57:14 -04:00
KayenEQ 62e48e7701 Merge git://github.com/EQEmu/Server into AISpellEffects 2014-04-27 03:29:15 -04:00
KimLS 5e81848445 Darwin caused ipc mutex to stop working for non-darwin, non-windows systems. Hopefully fixed 2014-04-25 18:45:19 -07:00
Alex e047d99a6c Merge pull request #138 from Corysia/master
Changes for intel Mac OSX build
2014-04-25 13:47:48 -07:00
cavedude00 d8ad337c0e Fixed a zone crash in spawn_conditions.
spawn_events changes, fixes, and additions.
2014-04-25 12:40:25 -07:00
KayenEQ 391b6ed515 fix 2014-04-25 09:07:48 -04:00
KayenEQ d64f762277 Developement Branch AISpellEffects.
Debug crash on NPC death.
2014-04-25 08:52:49 -04:00
Michael Cook 4d3ba5087d Merge pull request #143 from KayenEQ/master
Focus limit changes/additions
2014-04-25 02:39:19 -04:00
KayenEQ aba1acea9c Merge branch 'master' of git://github.com/EQEmu/Server 2014-04-24 04:30:31 -04:00
SecretsOTheP 9502f0aadf Revert "It's never ogre with these hatelist crashes.."
This reverts commit dffee38dc6.
2014-04-23 12:50:25 -04:00
KayenEQ 564c31c54d Improved SE_LimitCombatSkills will now more accurately determine if a spell is a combat proc.
SE_LimitInstant will now also work when set to include instant spells.

Optional SQL: utils/sql/git/optional/2014_04_23_FocusComabtProcs.sql
Note: Set to false, if enabled will allow all combat procs to receive spell focuses.
2014-04-23 03:54:54 -04:00
SecretsOTheP 6aa0c9d694 hatelist fixes to fixes to fixes 2014-04-22 13:37:35 -04:00
SecretsOTheP e726a82cc3 Merge branch 'master' of https://github.com/EQEmu/Server 2014-04-22 13:24:57 -04:00
SecretsOTheP dd1f5f6a11 More hatelist fixes. Trying to nail the crash :S 2014-04-22 13:24:07 -04:00
Michael Cook (mackal) f08799f7ff Add mez break message 2014-04-22 00:48:46 -04:00
SecretsOTheP dffee38dc6 It's never ogre with these hatelist crashes.. 2014-04-21 22:19:12 -04:00
SecretsOTheP fe542deb89 indentation is important 2014-04-20 21:00:50 -04:00
SecretsOTheP 8aa13b51f4 Hatelist crash fix 2014-04-20 20:54:21 -04:00
KimLS c16fe3c810 CMake flags to defining what is logged and where 2014-04-20 17:46:43 -07:00
KimLS 635d28cd65 Change to how quest signals work 2014-04-20 17:26:51 -07:00
Corysia Taware f915eed0f4 Apparently 0 is a vaid file descriptor in OSX 2014-04-19 21:45:54 -07:00
SecretsOTheP 87994ebfba smoke commits everyday 2014-04-20 00:26:54 -04:00
Akkadius 0b2281967b Added #command error message suppression for those who don't want to see 'Command is not recognized' constantly
- You need to have rule 'Chat:SuppressCommandErrors' set to true, this is set to false by default
	- Required SQL: 2014_04_18_Suppress_Command_Error.sql
2014-04-18 19:37:26 -05:00
Michael Cook (mackal) fc9e7a3a3b Fix linux compile issue with 884b0291 2014-04-16 12:44:02 -04:00
Akkadius 884b0291f7 Exported $client->SendMarqueeMessage(type, priority, fade_in, fade_out, duration, msg) - Will be available for simple plugin use
Exported $client->ExpeditionMessage(THIS, ExpdID, Message) - In use with custom expedition mod that will be released soon
2014-04-15 12:00:33 -05:00
Michael Cook 8d8b3241d1 Merge pull request #141 from KayenEQ/master
Revision of SE_PercentHeal
2014-04-14 02:37:08 -04:00
KayenEQ 272bbdb4d2 Revision of SE_PercentHeal
Will now apply focus properly
Can now do damage if set to negative value
2014-04-12 21:15:13 -04:00
Michael Cook 168183201a Merge pull request #140 from KayenEQ/master
Revision of slow mitigation code.
2014-04-12 12:41:50 -04:00
KayenEQ aedd70f5fa removed commented out code. 2014-04-12 03:31:30 -04:00
KayenEQ f9b46b46b1 Revision of slow mitigation code.
Fix for the slow mitigation spam messages
Converted value from FLOAT to INT
Use SQL to update your npc_types table
2014-04-12 00:18:19 -04:00
Michael Cook 983c7a9c91 Merge pull request #139 from KayenEQ/master
-Implemented the ability to properly use live spell projectile graphics.
2014-04-10 14:06:53 -04:00
KayenEQ 48a9f05efb SQL 2014-04-10 00:55:31 -04:00
KayenEQ f0a0f0677f Rule to make player cast swarm pets untargetable with F8.
New npc_types field to allow any NPC to be untargetable with F8
Swarm pets will now be heal/buffable like live.
See change log for more details.

Note: The method used here to prevent
targeting is a hack but the only side
effect it turns affected NPC's names Yellow.
2014-04-10 00:47:20 -04:00
KayenEQ 35cd98c7a7 -Implemented the ability to properly use live spell projectile graphics.
This data is found in the player_1 field of the spells_new table.
-Rule for this set to be disabled by default.
-Enable IF your server uses an UF+ spell file
and your players use UF+ clients
-Otherwise your better off with alternative method/rules
already implemented so that all players can see the effect.
-Added ability for PERL ProjectileAnim function to only
need an IT#### and not an actual item id.
-If you want it in LUA somebody needs to add it.
- Change to wizard innate critical ratios based on parse data.
2014-04-09 05:17:36 -04:00
Michael Cook (mackal) 8b2f325cd0 Fix wiz innate crit issue 2014-04-07 21:21:08 -04:00
Corysia Taware 4d70cb20e7 Merge remote-tracking branch 'upstream/master' 2014-04-07 10:05:46 -07:00
Uleat 8e55b6618e Dual Wield changes - see posting linked in changelog.txt 2014-04-06 05:39:37 -04:00
Michael Cook (mackal) 7e75f7559a Fix issue with optional SQL 2014-04-06 03:03:18 -04:00
Akkadius 8ad1c1d8a9 changelog.txt 2014-04-05 18:12:58 -05:00
Akkadius fb03db8980 Merge branch 'master' of https://github.com/EQEmu/Server 2014-04-05 18:11:05 -05:00
Akkadius 11d5e4b6ca Fix for the Fix for the Fix: Rule Combat:OneProcPerWeapon was created so that you can revert to the original proc functionality
for custom servers that have balanced their content around having more than 1 aug proc on weapons. By having this rule set to 'false' you revert this functionality.
	This rule is set to 'true' by default as the original functionality from Live was intended to be
2014-04-05 18:09:12 -05:00
KimLS 8db6060089 Renamed errant sql file. 2014-04-05 16:07:13 -07:00
Michael Cook (mackal) 07625336fd Allow multiple aug procs if Combat:OneProcPerWeapon is false 2014-04-05 18:47:14 -04:00
SecretsOTheP 35fad4d5a7 Added a rule to enable multiple procs from the same weapon's other slots if a proc is deemed to trigger, Defaults to true. 2014-04-05 17:18:19 -04:00
Corysia Taware 0f67e93a0f Backward port to OSX 10.6 (Snow Leopard) 2014-04-05 10:24:28 -07:00
Michael Cook (mackal) 628a5764cc Merge branch 'master' of github.com:KayenEQ/Server into KayenEQ-master
Conflicts:
	changelog.txt
2014-04-05 13:00:19 -04:00
Akkadius 7cfc5b085e (Performance Adjustment) Removed AsyncLoadVariables from InterserverTimer.Check() in both zone and world. By watching the MySQL general.log file on mass zone idle activity, you can
see that the query 'SELECT varname, value, unix_timestamp() FROM variables where unix_timestamp(ts) >= timestamp' is called every 10 seconds. This function is loading
	variables that are initially loaded on World and Zone bootup. When running a large amount of zone servers, the amount of MySQL chatter that is produced is enormous and
	unnecessary. For example, if I ran 400 zone servers, I would see 3,456,000 unnecessary queries from all idle or active zone processes in a 24 hour interval.
2014-04-05 03:38:58 -05:00
Akkadius fb3c6365e1 Test 2014-04-05 01:58:16 -05:00
KayenEQ 2c69dd7c93 Implemented proper functionality of SE_Screech
If you have a buff with SE_Screech with value of 1
it will block any other buff with SE_Screen that has
a value of -1, giving you an immunity message.
Example: 1383 Screech and 2785 Screech Immunity
2014-04-04 22:03:32 -04:00
KayenEQ 1d6e947387 Change log correction. 2014-04-04 21:32:56 -04:00
KayenEQ c26637de53 Merge branch 'master' of git://github.com/EQEmu/Server 2014-04-04 18:12:02 -04:00
KimLS d1ecb32652 Fix for crash in EntityList::MobInZone(Mob *who) when a dangling pointer is passed to the function. Which used to work without crashing but was changed at some point which can be triggered by quests in some situations. 2014-04-04 12:27:18 -07:00
KayenEQ 4b14ec53f1 Implemented Physical Resists consistent with live.
SQL to add new column 'PhR' to npc_types
Values to populate table based on extensive parsing.
Fixes for spell projectile code.
2014-04-04 01:59:55 -04:00
Corysia Taware f6046477b4 Changes for intel Mac OSX build 2014-04-03 14:10:03 -07:00
KayenEQ 2cdd50b9e9 -Implemented live like spell projectiles (ie mage bolts).
-See function in spells.cpp for more info on bolt behavior.
-This works reasonably well, but still room for improvements.
-Rules are for setting what item id is used for the projectile
since live uses an item id from SOF+ I added alternate item graphic
for titanium clients.
-Note: Max number of projectiles (set at 10) is a made up value in most
situations it would be nearly impossible to have more than 3 bolts
in the air at the same time. This values gives enough wiggle room that no
server should have an issue though.
-Small fix to SE_CompleteHeal
2014-04-03 04:25:45 -04:00
Trevius bb541eeb60 Fixed potential endless quest loop with EVENT_COMBAT and WipeHateList(). 2014-04-01 23:00:15 -05:00
Michael Cook (mackal) 8866b3170e Implement ability for NPC Merchants to open and close shop 2014-04-01 21:03:49 -04:00
Trevius 174cb1876a Prevented an endless loop crash related to EVENT_TASK_STAGE_COMPLETE. 2014-03-31 22:03:11 -05:00
Uleat 955f164efb Added optional rule for allowing bots to auto-update with their owner.
(Run the optional sql script to activate this feature)
2014-03-31 09:31:49 -04:00
Uleat d939820918 Fix for unconscious ability skillups.
Fix for zone crash related to item==nullptr in Client::SummonItem().
2014-03-31 03:21:22 -04:00
Michael Cook 12f8357373 Merge pull request #136 from KayenEQ/master
Spell Effect Updates.
2014-03-28 02:42:22 -04:00
KayenEQ cbe0e94ca7 Implemented SE_NegateIfCombat 2014-03-27 23:23:15 -04:00
KayenEQ 079d1ca870 String updates
Level requirment for Summon Corpse spells
2014-03-27 19:17:05 -04:00
KayenEQ 41903e8f09 Spell Effect Updates.
Implemented fail chances for SE, Gate, Succor, FeignDeath.
Minor fixes to haste bonuses to allow for negatives.
Rule added for Succor failure rate.
2014-03-27 05:14:54 -04:00
Michael Cook (mackal) 6906125725 Fix for wizard innate crits when they have no chance otherwise 2014-03-27 02:41:39 -04:00
Arthur Ice 11fbb86f8b merging upstream 2014-03-26 15:17:08 -07:00
Uleat cfdd48b2a3 Fix for bot guild script failures.
MOVED 'load_bots.sql' and 'drop_bots.sql' into this repository. (They are updated)
2014-03-22 05:17:38 -04:00
Michael Cook 2cef299775 Merge pull request #135 from KayenEQ/master
Further refinements to root, charm, mez and fear behaviors.
2014-03-21 14:00:37 -04:00
KayenEQ 02e291d4e8 Further refinements to root, charm, mez and fear behaviors.
Updates to a few rule due to new/corrected parse data.

All behaviors defined from weeks of extensive live parsing

Root Break Chance from DD now will scale based on level difference.

Root has a baseline aproximately 6% chance to break per check when target has
at 0% chance to resist spells.(ie green cons 60 levels lower with tash).

Fear has an approximately 70% chance to trigger a resist check each tick
to determine if it will fade early. (no baseline break chance)

Charisma less than 100, gives -20 resist mod to intial fear casts
Charisma from 100 to 255 will progressively reduce this mod to 0.
Charisma DOES NOT effect UNDEAD fears

Charmisma less than 75 significantly increase CHARM/MEZ/LULL resist rates.

Mez spells will now also use charisma resist check, as they do on live.
2014-03-20 00:53:49 -04:00
Uleat 02d6471c88 Fix for name/account discrepancy in \\zone\inventory.cpp.
Rearranged/condensed code snippets in Client::SummonItem().
Added 'augslotvisible' check to augment validation in C::SI().
2014-03-18 13:57:51 -07:00
Uleat 02633d4b01 ** Fix for RoF clients not displaying Augment Restrictions in the Item Info window.
** Change to Client::SummonItem() to enforce valid item/augment combinations. (Run the optional sql file first, before posting any
SummonItem() failure issues in the forums.)
2014-03-18 13:57:49 -07:00
KayenEQ 95176fc813 Coverted melee and magic runes to use bonuses.
Removed all the old rune flags now that none of them are used.
Fixed issues where runes would not fade properly if damage = remaing rune amount
Fixed issue where runes would stop absorbing damage if you had multiple runes.
2014-03-18 13:57:48 -07:00
ukmeth0d 8571c35e77 Fixed 2H Blunt Animation to match Live
Melee bots (with no mana) will now sit when not full HP and out of combat.
2014-03-18 13:57:47 -07:00
Uleat a84862897a Fix for name/account discrepancy in \\zone\inventory.cpp.
Rearranged/condensed code snippets in Client::SummonItem().
Added 'augslotvisible' check to augment validation in C::SI().
2014-03-18 06:00:46 -04:00
Alex 2781f82d29 Merge pull request #134 from addtheice/master
Tests for hextoi, hextoi64, atobool
2014-03-17 22:34:58 -07:00
Alex f809f503c9 Merge pull request #131 from Siroro/master
Pull Request from Siroro/Server
2014-03-17 22:34:20 -07:00
Uleat 4170434b96 ** Fix for RoF clients not displaying Augment Restrictions in the Item Info window.
** Change to Client::SummonItem() to enforce valid item/augment combinations. (Run the optional sql file first, before posting any
SummonItem() failure issues in the forums.)
2014-03-17 04:53:47 -04:00
Michael Cook 65e8c2ffde Merge pull request #133 from KayenEQ/master
Rune revisions and fixes
2014-03-14 01:55:45 -04:00
Arthur Ice c239964427 Tests for hextoi, hextoi64, atobool
const hextoi / hextoi64 / atobool. null check for each. tests for each.
2014-03-13 14:45:54 -07:00
KayenEQ 21bdc8c5b6 Coverted melee and magic runes to use bonuses.
Removed all the old rune flags now that none of them are used.
Fixed issues where runes would not fade properly if damage = remaing rune amount
Fixed issue where runes would stop absorbing damage if you had multiple runes.
2014-03-12 05:14:19 -04:00
KimLS 39abb4f50c Changed how item faction bonuses are cleared. 2014-03-10 16:43:33 -07:00
KimLS 93105966b6 Added some missing bufffadebyx functions to lua mob 2014-03-09 18:41:50 -07:00
KimLS 2e4b4b94ed Memory leak work around for perl, should play better with events that call other events now. 2014-03-09 17:55:24 -07:00
Michael Cook bad963ddbc Merge pull request #132 from KayenEQ/master
Lull spell effect revisions
2014-03-08 12:49:23 -05:00
KayenEQ 9ecf98195c Lull spell effect revisions 2014-03-08 05:35:22 -05:00
KimLS 1476ebdfe6 Merge branch 'timer' 2014-03-07 20:00:11 -08:00
KimLS e25fd47828 Added some other timer functions to lua, removed perl memory leak stop gap for the moment until i decide how to fix it... 2014-03-07 19:59:44 -08:00
ukmeth0d d559a9ac0d Merge branch 'master' of git://github.com/Siroro/Server 2014-03-07 09:03:07 +01:00
Michael Cook e8394c2b01 Merge pull request #130 from KayenEQ/master
SE_Root and SE_RootBreakChance updates
2014-03-07 03:00:14 -05:00
ukmeth0d 3ec1c894ee Fixed 2H Blunt Animation to match Live
Melee bots (with no mana) will now sit when not full HP and out of combat.
2014-03-07 01:34:30 +01:00
KayenEQ fb3e3c8447 fix 2014-03-06 07:52:10 -05:00
KayenEQ 496f8151c9 root related bonuses for negate effect. 2014-03-06 07:44:39 -05:00
KayenEQ 55f5d4affa SE_Root and SE_RootBreakChance updates 2014-03-06 07:36:47 -05:00
Michael Cook (mackal) d22c8832f7 Renamed optional SQL 2014-03-06 02:39:54 -05:00
Michael Cook (mackal) d8138d2c56 Merge branch 'master' of github.com:EQEmu/Server 2014-03-06 02:38:53 -05:00
Michael Cook (mackal) 6c00eb9344 Renamed optional SQL 2014-03-06 02:38:22 -05:00
sorvani b0e24b346e Fixes #119 2014-03-05 22:19:55 -06:00
Michael Cook (mackal) 822a1b1003 Fix NPC swarm pets despawning on owner death
Fix NPC swarm pets IsAttackAllowed logic
2014-03-05 23:02:57 -05:00
Michael Cook (mackal) 3d5f99e14a Merge branch 'master' of github.com:KayenEQ/Server into KayenEQ-master
Conflicts:
	changelog.txt
2014-03-05 19:49:59 -05:00
Michael Cook (mackal) 0e8f62b480 Fixes #129 - Initialize pointer to nullptr. 2014-03-05 01:52:41 -05:00
Michael Cook (mackal) d70c4d7bbe Fix rogue's evade to be single target
This is also a lot nice performance wise
2014-03-05 01:34:17 -05:00
Michael Cook (mackal) 05df6c5b21 Fix QuestManager::RemoveAllFromInstance 2014-03-05 01:09:18 -05:00
sorvani 3f6036a512 missed a couple MT_Say 2014-03-04 23:11:33 -06:00
sorvani 58f42f1af1 Created RemoveFromInstance and RemoveAllFromInstance and exported to lua_general.cpp 2014-03-04 22:39:52 -06:00
KayenEQ 0ef95d8fe6 Root rule optional SQL 2014-03-04 06:43:57 -05:00
KayenEQ ea677389ad Root spell revision
Optional SQL
2014-03-04 06:42:41 -05:00
Michael Cook (mackal) 057e4603db Optimized EntityList::AddHealAggro 2014-03-03 15:01:52 -05:00
Michael Cook (mackal) a67aed9538 Implemented deadly strikes and increase rogue throwing crit rate
New rules:
	Combat:RogueCritThrowingChance, Combat:RogueDeadlyStrikeChance, Combat:RogueDeadlyStrikeMod
Rogue throwing crit rate is rather ridiculous. These rules might need tweaking
but they gave me fairly live-like results, even with AA added
2014-03-03 14:59:39 -05:00
Michael Cook (mackal) 00068158c1 Melee Crits, HoTs, DoTs messages should now filter correctly
Clients that also support seeing others DoTs will now see them
if they don't filter them.

    Note: HoTs 'mine only' doesn't seem to be different from 'show'
2014-03-02 22:10:32 -05:00
Michael Cook 9e4cf19e0c Merge pull request #125 from KayenEQ/master
Added lower bounds for chance of charm fading.
2014-03-02 20:40:34 -05:00
KayenEQ 84c85a4605 Added lower bounds for chance of charm fading.
Parsed on live to be approximately no lower
than 5% regardless of level difference.
2014-03-02 19:44:42 -05:00
Michael Cook c02ba17845 Merge pull request #124 from KayenEQ/master
Fix for SQL
2014-03-02 17:43:33 -05:00
KayenEQ f4b30c5861 Fix for SQL 2014-03-02 17:36:18 -05:00
Michael Cook 5d9e400e86 Merge pull request #122 from KayenEQ/master
Revisions to how charm works.
2014-03-02 12:55:41 -05:00
KayenEQ 39914c8eb4 debug msg removed 2014-03-02 04:24:51 -05:00
KayenEQ 7133357b1a Revisions to how charm works.
Optional SQL for rules
2014-03-02 03:46:51 -05:00
KimLS 629f9863ae Merge branch 'master' into raycast 2014-03-01 17:49:21 -08:00
Michael Cook (mackal) be57c66256 Add FilteredMessage do nothing mob virtuals 2014-03-01 14:02:57 -05:00
Michael Cook (mackal) e0edd7a290 Added FilteredMessage functions that better use ServerFilters
These functions are currently unused, but should work nicely.
I didn't add overloads to separate them from the others for now
2014-03-01 00:16:37 -05:00
Michael Cook (mackal) d46912fcdf Fix issue with mob procing 2014-02-28 22:06:10 -05:00
Michael Cook (mackal) 5c7484cea2 Switched some heal messages to StringIDs 2014-02-28 17:43:37 -05:00
Michael Cook (mackal) d525d23217 Shielding now uses StringIDs 2014-02-28 02:57:43 -05:00
Michael Cook (mackal) c030cfe0ad Fix zone crash with TryWeaponProc 2014-02-28 02:56:36 -05:00
Michael Cook (mackal) cb633e4b6a Crit Spells to StringIDs
Some minor clean up
Fix an mlog message
2014-02-28 02:25:17 -05:00
cavedude00 16afa277de Exported TrainDisc to Lua.
Updated idle timer names.
2014-02-27 23:21:57 -08:00
Michael Cook c18e9d9503 Merge pull request #121 from Siroro/master
Added rule Merchant:EnableAltCurrencySell
2014-02-27 13:11:40 -05:00
Siroro a490b2ff22 Fixed augs having 100% proc rate 2014-02-27 12:00:06 +00:00
Siroro f32a30fb9a Merge remote-tracking branch 'remotes/Eqemu/master' 2014-02-27 11:44:52 +00:00
Siroro 0f60fb06e3 Added rule Merchant: EnableAltCurrencySell - defaults to true, allows servers to disable the ability to resell items to alternate currency merchants. 2014-02-27 09:41:57 +00:00
Michael Cook (mackal) 01bd8bd9fa Reworked Weapon Procing
Broke up the logic to be a bit easier to follow
Procs should happen in the order that they do on live
Proc rates for spell buff procs should be more consistent with live
2014-02-27 03:19:25 -05:00
Uleat 489a6ffd16 Fix for 'sqrt' failures on vs2010 clients 2014-02-26 21:27:30 -05:00
cavedude00 f89d783308 Corrected 2014_02_26_virulentvenomAA.sql 2014-02-26 18:20:16 -08:00
cavedude00 1d6bd3cc5e Better flee runspeed calculation.
Added two new NPC special_abilities, ALWAYS_FLEE and FLEE_PERCENT.
Fixed an issue where a NPC could get stuck on a single coord in a rectangular roambox.
Added mindelay to spawngroup to allow for greater control of the roambox delay. SQL is required.
2014-02-26 18:06:16 -08:00
Michael Cook ea31a29f8a Merge pull request #120 from KayenEQ/master
Spell effect addition / fixes
2014-02-26 14:15:17 -05:00
KayenEQ 205dd8a1e5 Clean up and revision of proc chance bonuses
Combat Effects and WeaponProc bonuses will no longer affect melee spell procs
2014-02-26 05:16:37 -05:00
KayenEQ 8caac162b2 Spell effect addition / fixes 2014-02-26 00:09:59 -05:00
Michael Cook (mackal) 970b30b467 Added entity_list::IsMobSpawnedByNpcTypeID
Exported to both lua and perl
2014-02-25 23:15:14 -05:00
Michael Cook 746569b471 Fix HOTs timer when they're in the song window 2014-02-24 17:25:49 -05:00
Michael Cook (mackal) 20869a0aec Mobs will now face their target they are casting on
Note: they do not switch their target, this is how live does it
2014-02-24 02:31:40 -05:00
Michael Cook (mackal) 88ec04e5ca Merge branch 'master' of github.com:EQEmu/Server 2014-02-24 01:25:03 -05:00
Michael Cook (mackal) 33a8a398fe Add SpellType_Root to EngagedCast check 2014-02-24 01:24:27 -05:00
sorvani d887c77a1b Updated GetUnusedInstanceID to not recycle instance ID's unless it has reached max (65535) 2014-02-24 00:20:18 -06:00
Michael Cook (mackal) 60c280a521 Debuff/Slow on random mob on hatelist 2014-02-24 00:43:24 -05:00
Michael Cook (mackal) 837c02ffd6 Mobs cast root on random person on hatelist 2014-02-24 00:37:38 -05:00
Michael Cook (mackal) 6b94e08404 Make the random addition to time_cancast actually useful
It was in ms so adding 0-4 ms doesn't really do much
2014-02-24 00:27:26 -05:00
Michael Cook (mackal) 1f471aa9f9 Remove dist in Mob casting AI for roots 2014-02-24 00:22:02 -05:00
KimLS 951c321ba6 Partial port of der's map rewrite, no new azone format yet but it's coming. Will convert legacy map formats on the fly atm. 2014-02-23 21:17:28 -08:00
KimLS eabea6ea16 RaycastMesh work der started I'm going to pick up... 2014-02-23 17:14:50 -08:00
SecretsOTheP 14649ce611 Exported the client object SendTargetCommand to Perl. 2014-02-23 19:48:46 -05:00
cavedude00 c6377b93d5 Merchants will now keep track of charges sold to them properly so it is no longer possible to recharge items using merchants. 2014-02-23 15:55:26 -08:00
KimLS 5a6c25887a Export of eq.clock(), os.clock() isn't a good option on unix 2014-02-22 15:26:18 -08:00
KimLS 0e44a3625c Merge branch 'master' of github.com:EQEmu/Server 2014-02-22 15:04:18 -08:00
KimLS 476dc6e783 SetDestructibleObject exported to lua 2014-02-22 15:04:01 -08:00
Michael Cook 4ad2e5f9b5 Merge pull request #118 from KayenEQ/master
Spell effects , buff table changes
2014-02-22 02:40:00 -05:00
KayenEQ 2a28e88bcf not_reflectable -> reflectable 2014-02-22 02:23:37 -05:00
KayenEQ 44c833fbe6 fixes
Re implemented deathsavechanceAA ect as ExtraDIChance
Confirmed on live that this effect persists even if caster not in zone.
2014-02-22 01:34:16 -05:00
Michael Cook 026f019f58 Changed SE_SingingSkill to SE_Amplificatoin
This effect will now stack with other singing spell/item mods
like it does on live.
2014-02-21 22:57:15 -05:00
Michael Cook (mackal) 451d422b8a Keep track of base spell id for SpellProcs/PermaProcs
This will fix numhits issue for procs from spells
2014-02-21 04:04:18 -05:00
Michael Cook (mackal) 808977f69a (Performance) Corpse drag will now fetch entity by ID 2014-02-20 01:35:59 -05:00
KayenEQ 402a10c488 change log 2014-02-20 01:05:44 -05:00
KayenEQ 0caa1fd40b new spell effects
buff struct/tables - required sql
Removed: death_save_chance and deathsave_aa_chance (no longer used)
Added: dot_rune, caston_x, caston_y, caston_z
minor fixes
2014-02-20 01:04:34 -05:00
Michael Cook (mackal) 754d70d513 Merge branch 'master' of github.com:EQEmu/Server 2014-02-19 20:37:26 -05:00
Michael Cook (mackal) eb3a11b49a NPC vs Client damage revamp
Shot list of things that changed:
AC Softcap is based on your defensive skill (the scaling factors
are based on at least previously stated dev quotes)
The over AC Softcap returns are now based on exact calculations
made with the Armor of Wisdom AA.
Shielding item bonus and Melee mitigation spell bonus (nerfs)
NPCs damage will now correctly follow the
"damage base + (damage interval * [1, 20])" formula.

These changes might seem a little weird but I didn't want to change
any of the other damage situations since they were fairly good, but
they still could use a revamp as well.

New rules:
RULE_BOOL ( Combat, OldACSoftcapRules, false) // use old softcaps
RULE_BOOL ( Combat, UseOldDamageIntervalRules, false) // use old damage formulas for everything
RULE_REAL ( Combat, WarACSoftcapReturn, 0.3448) // new AC returns
RULE_REAL ( Combat, ClrRngMnkBrdACSoftcapReturn, 0.3030)
RULE_REAL ( Combat, PalShdACSoftcapReturn, 0.3226)
RULE_REAL ( Combat, DruNecWizEncMagACSoftcapReturn, 0.2000)
RULE_REAL ( Combat, RogShmBstBerACSoftcapReturn, 0.2500)
RULE_REAL ( Combat, SoftcapFactor, 1.88)

If you want to use the old calculations only, set
Combat:OldACSoftcapRules and Combat:UseOldDamageIntervalRules to true
2014-02-19 20:29:19 -05:00
Michael Cook 916b33f714 Merge pull request #116 from KayenEQ/master
Spell Effect additions / Minor fixes
2014-02-18 23:38:03 -05:00
KayenEQ 58c5003ad5 fix 2014-02-18 23:26:09 -05:00
KayenEQ 0ca01641ff fix 2014-02-18 23:24:14 -05:00
KayenEQ 0fc7dade47 Spell Effect additions
Minor fixes
2014-02-18 21:59:33 -05:00
Michael Cook (mackal) ab4c9581ad Fix NPC rampage to be more in-line with live
New rules:
RuleI: Combat, DefaultRampageTargets
	Set to 1
	If the specatk db entry has no extra param it will use this
RuleB: Combat, RampageHitsTargets
	Defaults to false
	If true, if number hit is still less than RampageTargets, try tank

If you want the old behavior still set DefaultRampageTargets to 3 and
RampageHitsTargets to true
2014-02-18 18:22:19 -05:00
Michael Cook (mackal) 6e474f22a2 Added single target HalveAggro and DoubleAggro
Both exported to perl/lua
pass the target you wish to change their hate.
2014-02-18 16:52:51 -05:00
Michael Cook 068bd57fbc Merge pull request #115 from gpanula/patch-1
Update tblWorldServerRegistration.sql
2014-02-17 23:37:26 -05:00
gpanula d7f9cdf6b6 Update tblWorldServerRegistration.sql
login server expects a "ServerTrusted" column
2014-02-17 19:45:47 -06:00
Michael Cook (mackal) a503c1af97 Fix Mob double/triple/quad check to work if a lower one isn't set 2014-02-17 20:38:40 -05:00
Michael Cook (mackal) 53a14381ba Only build flurry attack opts on success 2014-02-17 19:38:37 -05:00
Michael Cook (mackal) 169b9161b9 Performance: Changed RampageArray to be a vector of IDs 2014-02-17 17:34:02 -05:00
Michael Cook (mackal) 85f2b46fe9 Fix mod_spell_resist to be no-op by default ... 2014-02-16 23:58:18 -05:00
SecretsOTheP 0dfa1e192d Merge branch 'master' of https://github.com/EQEmu/Server 2014-02-16 19:16:45 -05:00
SecretsOTheP 88eb0dcdfc potential crash issue involving backstab & missing primary weapons resolved. 2014-02-16 19:16:18 -05:00
Michael Cook (mackal) bb8a82030f Post-inc to pre-inc 2014-02-16 00:17:25 -05:00
Michael Cook 16a6fc7d2c Merge pull request #114 from KayenEQ/master
Numhits update, additional spell table fields utilized.
2014-02-16 00:07:24 -05:00
SecretsOTheP 1ebf88abbb Fixed a performance issue involving std::string and EQStream identification.
Fixed a denial-of-service exploit in EQStream.
2014-02-15 23:50:32 -05:00
KayenEQ 93e9f29c77 update 2014-02-15 23:25:09 -05:00
KayenEQ 1b7271359e fix for LimitCombatSkills
fix for Extended Inginuity table data
2014-02-15 22:34:48 -05:00
KayenEQ 49df0a5d33 fixes 2014-02-15 08:16:41 -05:00
SecretsOTheP 46f8723314 Fixed an order-of-operations crash within the Quest Parser classes 2014-02-14 12:30:50 -05:00
JJ 5f02de1c95 Remove db name from sql. 2014-02-13 21:14:05 -05:00
sorvani 9d938cdd58 Cleaned up GetUnusedInstanceID logic and renamed instance_lockout* tables to instance_list* 2014-02-13 11:24:54 -06:00
SecretsOTheP e5fd0f5d75 Merge branch 'master' of https://github.com/EQEmu/Server 2014-02-13 12:02:37 -05:00
SecretsOTheP a3f9d5e707 bot.cpp was missing nullptr instead of NULL, that is now fixed.
hate_list.cpp potential crash fix related to center being nullptr
2014-02-13 12:02:26 -05:00
KayenEQ 5344679c7c Fixes for numhits system
Implementation of new spell table fields
Update and further implemention of CastRestriction
2014-02-13 07:41:57 -05:00
KimLS e09adbd13d Added cmake options to alter eqstream settings if one would so wish. 2014-02-12 15:51:20 -08:00
KimLS 275f9d6aaf Changed SpecialAttacks to an array instead of a map. Basic access was causing a hotspot. Brief testing doesn't show any obvious bugs but let me know if any prop up. 2014-02-12 15:26:08 -08:00
Michael Cook 9461067fdb Merge pull request #113 from KayenEQ/master
Bot fixes
2014-02-12 02:56:02 -05:00
KayenEQ 7623770613 Bot fixes for previous update. 2014-02-11 22:47:57 -05:00
KayenEQ 584278bf20 change log change test 2014-02-11 22:34:00 -05:00
KimLS 1ec0add76f Make sure some strings coming from the client are actually null terminated. 2014-02-10 21:00:25 -08:00
sorvani 51dff22b93 fix for npcthis crash in new spawn condition case. 2014-02-10 15:13:54 -06:00
Michael Cook (mackal) c85c4a969d Fix corpse_list check in remove mob 2014-02-10 13:41:55 -05:00
Michael Cook (mackal) 6a8a6e530b Some clean up related to the entity_list changes 2014-02-10 12:16:14 -05:00
Michael Cook (mackal) ce4f4995b5 Merge with master 2014-02-10 12:04:35 -05:00
SecretsOTheP a4260e54fe Merge branch 'master' of https://github.com/EQEmu/Server 2014-02-10 10:39:48 -05:00
SecretsOTheP f074ead7f6 demonstar55's entity list changes (slightly modified) and a crash fix for the #repop command used in rapid succession. 2014-02-10 10:39:12 -05:00
sorvani b819137e35 Merge branch 'master' of https://github.com/EQEmu/Server 2014-02-10 09:24:04 -06:00
sorvani 4d653caca3 Typos in spawn condition log messages 2014-02-10 09:22:55 -06:00
SecretsOTheP 75663774fe Fix for crashes related to #repop force and not clearing quest timers, resulting in a zone crash. Quest timers are now cleared on zone repop. 2014-02-10 06:45:33 -05:00
SecretsOTheP 5ec5b398ac tasks crash fix 2014-02-09 12:05:47 -05:00
sorvani 24c70a04ca Enhanced spawn conditions with new onchange option DoRepopIfReady 2014-02-09 00:08:09 -06:00
Michael Cook a602f70bf4 Merge pull request #111 from af4t/master
Resolve SQL error on attempt to insert Consumption of the Soul values
2014-02-03 07:51:03 -08:00
af4t 5733124c40 Resolve "unknown identifiers" in Bot::GetActSpellDamage 2014-02-03 10:37:11 -05:00
af4t 5216532e96 Resolve SQL error on attempt to insert Consumption of the Soul values 2014-02-03 09:45:22 -05:00
Michael Cook c8bead6bdd Merge pull request #110 from KayenEQ/master
Revision to spell damage calculations
2014-02-02 20:54:50 -08:00
KayenEQ 72cec5608d Revision to spell damage calculations 2014-02-02 23:23:41 -05:00
KimLS 8b1262b198 Export clear_npctype_cache as both lua/perl general functions. 2014-02-01 14:55:51 -08:00
KimLS 6e0a214bcc Compiler option for playing with npctype_cache as was requested for a feature. Not entirely tested may need some work. Currently defaults to old behavior on #repop. 2014-01-31 20:38:32 -08:00
Michael Cook 1ab19920f4 Merge pull request #109 from KayenEQ/master
Hot fix for issue with numhits not fading
2014-01-28 19:29:52 -08:00
KayenEQ 751d51c4d0 Hot fix for issue with numhits not fading 2014-01-28 22:27:45 -05:00
Michael Cook (mackal) 4a54e262f6 Bash/Kick stun will respect UNSTUNABLE now 2014-01-28 22:14:31 -05:00
Michael Cook (mackal) bd0c325762 Revamped Kick/Bash stun a little
Before bash/kick's ability to stun was completely useless
at higher levels, it also never stunned for any duration.

Bash/Kick will always stun if the target is under the
base immunity level (kick the attacker needs to be over 55 as well)

If over base immunity, there is a chance to stun, defaults to
Combat:NPCBashKickStunChance  (15%)

A Kick/Bash stun will last for 0-2 seconds
2014-01-28 17:14:27 -05:00
Michael Cook (mackal) de55f99174 Send the stun effect that goes around their head 2014-01-28 00:42:48 -05:00
Michael Cook 044cf8da1a Fix aaid for new req SQL 2014-01-27 20:55:11 -05:00
Michael Cook aa57642103 Merge pull request #108 from KayenEQ/master
New spell effects
2014-01-27 17:54:32 -08:00
KayenEQ d98ed8f419 New spell effects 2014-01-27 05:17:52 -05:00
Michael Cook (mackal) 4b07f4ffc5 Use the first overwritten buff slot like live does
Very minor change, but some people can be rather anal
about their buff orders, so this should help them out,
and its more live like :P
2014-01-26 13:38:12 -05:00
Michael Cook 5a526a89aa Merge pull request #107 from KayenEQ/master
Revised how dispel works.
2014-01-26 10:00:19 -08:00
KayenEQ 3dbf863255 Revised how dispel works. 2014-01-26 04:41:45 -05:00
Michael Cook (mackal) 17f0cffca6 Do not trip hacker detection if target is on their XTargets 2014-01-24 18:48:47 -05:00
Michael Cook (mackal) d51e60cf8b Mostly cosmetic changes to CheckAggroAmount funcs
Also changed some silliness
2014-01-24 15:28:54 -05:00
Michael Cook (mackal) 85d6db1de1 Switched some things to StringID defines 2014-01-24 02:05:26 -05:00
Michael Cook (mackal) 1bf794c29f Create hate on immune to fear due to level 2014-01-24 01:28:09 -05:00
Michael Cook (mackal) 0e8f7a4542 Correct Fear level immunity message 2014-01-24 01:26:47 -05:00
Michael Cook (mackal) b72fe81e28 Correct CheckAggroAmount calls in IsImmumeToSpell 2014-01-24 01:24:08 -05:00
Michael Cook a76889959f Merge pull request #106 from KayenEQ/master
Minor fix to numhits update / + new spell effect
2014-01-23 18:51:09 -08:00
KayenEQ 0166486e07 Minor fix to numhits update
New spell effect
2014-01-23 21:34:47 -05:00
Michael Cook (mackal) bb793e5582 Moved Assisting Exemption check up
This is just so assisting to a client will clear the flag
2014-01-22 01:41:26 -05:00
Michael Cook (mackal) a55c095d1b Forgot to make m_AssistExemption default to 0 2014-01-22 01:08:42 -05:00
Michael Cook (mackal) 3d47d912fd Fix /assist to only care about range to assistee 2014-01-22 01:00:48 -05:00
Michael Cook (mackal) cc02d94bdf Implemented ST_TargetAETap 2014-01-21 14:50:22 -05:00
Michael Cook 5121cc25a4 Merge pull request #105 from KayenEQ/master
Numhits system revised
2014-01-20 19:03:05 -08:00
KayenEQ e78d91104c Removal of test msg 2014-01-20 21:46:13 -05:00
KayenEQ 38c5c79218 Numhits system revised 2014-01-20 21:27:53 -05:00
Michael Cook (mackal) b065f973c4 Updated changelog.txt 2014-01-20 16:26:51 -05:00
Michael Cook (mackal) 13609c4f09 Move Mez Mastery to DB 2014-01-20 16:24:17 -05:00
Michael Cook (mackal) a93116aa19 Merge branch 'master' of github.com:EQEmu/Server 2014-01-20 15:58:39 -05:00
Michael Cook (mackal) 95a5c7d4cc Move Spell Casting Reinforcement to aa_effects 2014-01-20 15:57:44 -05:00
cavedude00 5d0136a4b6 Merge branch 'master' of https://github.com/EQEmu/Server 2014-01-20 10:58:33 -08:00
cavedude00 2c74b4f1ac Forgot changelog.txt in previous commit. 2014-01-20 10:58:08 -08:00
Michael Cook (mackal) 6bb8d87225 Fix name of SQL file 2014-01-20 13:55:52 -05:00
Michael Cook (mackal) 935ce8f968 Implement not_extendable spell field 2014-01-20 13:34:18 -05:00
cavedude00 70f994cda5 Live-Like weather. Big thanks to Robregen for figuring out the system!
Included in the required SQL is weather data pulled from NewZone live packets for up to PoP. An update to EQExtractor will be made to grab the rest of the data from existing collects.

Please note: Until weather data is grabbed for zones later than PoP, weather will not work in those zones.
2014-01-20 10:10:39 -08:00
Michael Cook (mackal) 3970bb5955 Export death event variables to Perl (Kingly Krab)
http://www.eqemulator.org/forums/showpost.php?p=227770&postcount=9
2014-01-20 02:01:52 -05:00
Michael Cook (mackal) 3159453e75 Fix OP_MobEnduranceUpdate for UF 2014-01-19 16:18:38 -05:00
Michael Cook (mackal) a1cb8d7ae7 Turn on NPC charm casting 2014-01-19 00:45:50 -05:00
sorvani 4191c195c1 added GetCharactersInInstance 2014-01-18 23:34:16 -06:00
Michael Cook (mackal) b16ce6f809 Tweaked down SE_CurrentHP aggro from buffs 2014-01-17 22:09:41 -05:00
KimLS 88ba962a4c Merge branch 'master' of github.com:EQEmu/Server 2014-01-16 13:08:24 -08:00
KimLS 0315d15ce8 Reversed event_command return value, may cause visual issues if you already updated your code but easy to fix. Return 1 instead of return 0 on event_command dispatch 2014-01-16 13:08:04 -08:00
Michael Cook (mackal) 12681f4623 Improve feign_memory_list thanks to C++11 2014-01-15 21:06:18 -05:00
Michael Cook (mackal) a7a4f9373d Revert change to SE_LimitEffect
Also fix for SE_SummonItem for unstackable charged items
(Still need to verify on live though)
2014-01-15 17:10:15 -05:00
Michael Cook (mackal) d2e66214f4 Add numhitstype to the spell structure 2014-01-15 01:19:03 -05:00
Michael Cook (mackal) 0a6d98b5e1 Fix mod rods 2014-01-14 22:24:01 -05:00
Michael Cook 497c10e513 Updated URL 2014-01-14 15:16:29 -05:00
Michael Cook (mackal) 53765ebc62 Fix some potential null pointer dereferences
I don't think there were any instances of these causing problems
but it's better to be safe than sorry.
2014-01-14 02:38:49 -05:00
Michael Cook (mackal) 4216627604 Prefer prefix ++/-- on non-primitive types
Postfix ++/-- might cause the creation of a tmp instance
that might be optimized out. Mights are bad. Prefix doesn't
have this problem.
2014-01-13 22:14:02 -05:00
Michael Cook 47c33f3b31 Merge pull request #104 from KayenEQ/master
Spell effect updates
2014-01-13 10:35:15 -08:00
KayenEQ 32359da1cc Spell effect updates 2014-01-13 05:03:21 -05:00
Michael Cook (mackal) f4e085c121 Some clean up in questmgr.cpp 2014-01-12 21:26:31 -05:00
KimLS 7972937072 /MP now set by default on windows. Option to turn it off for people who want/need eg: people with slower lower core systems. 2014-01-12 14:54:58 -08:00
Michael Cook (mackal) 5a6f2467f8 Added fclose to ExportBaseData 2014-01-12 00:58:47 -05:00
Michael Cook (mackal) 1822347a46 Add lua_say_link overloads 2014-01-11 15:07:11 -05:00
Michael Cook (mackal) 821ba8b701 Change faction messages to use String IDs. 2014-01-11 13:20:01 -05:00
Michael Cook (mackal) fdced53be1 Add pet size preservation like live
Run the SQL!!
2014-01-09 14:25:29 -05:00
Michael Cook (mackal) a394bf25b2 SE_SummonItem and SE_SummonItemIntoBag should work like live now
This isn't exactly like live since they seem to use something
else to decide how many to summon, but this should act the same
as live currently does.
2014-01-08 16:11:29 -05:00
Michael Cook (mackal) f2c1c9f70e Added required SQL for previous changes 2014-01-08 14:06:39 -05:00
Michael Cook (mackal) 5199364091 Make use of the suspendable spell flag 2014-01-08 00:24:33 -05:00
Michael Cook (mackal) 50caef0086 Implement persist death spell field 2014-01-07 23:29:46 -05:00
Michael Cook 8a04d8e2b7 Moved pet target checking to the attack command, which is more live like
Also, probably a little better than attacking then backing off :P
2014-01-07 17:02:35 -05:00
Michael Cook (mackal) e7032bc2c2 Implemented SE_SongModCap
Bard AAs Ayonaes Tutelage and Echo of Taelosia implemented as bonuses
Remember to run the SQL!
2014-01-04 19:20:59 -05:00
Michael Cook (mackal) d128ef1b97 Forgot an unknown 2014-01-04 14:54:18 -05:00
Michael Cook (mackal) 0645908762 Renamed all Unknown Spell Effects based on live
Note: These are all still commented out and I did not check for
any collisions. Feel free to rename these as they're implemented
2014-01-04 14:42:13 -05:00
Michael Cook (mackal) abbd0558a0 Added links to full spell effect list from a dev 2014-01-04 13:41:41 -05:00
KimLS c725ee84bb Fix for a potential buffer overflow on login server under very rare circumstances via Rogean. Fix for perl parser not clearing errors via sorvani 2014-01-03 23:41:11 -08:00
Michael Cook (mackal) a9b4e7819f Add some overflow protection for emotes
Clients crash if the emote is too large, despite the client
using a 1024 char buffer...
2014-01-04 01:34:58 -05:00
Michael Cook (mackal) ae68deb4f8 Added overload to Lua entity list RemoveFromTargets 2014-01-03 19:20:52 -05:00
Michael Cook (mackal) e4108d089f Fix missing paren. 2014-01-02 18:19:59 -05:00
Michael Cook (mackal) 4d9d50c9ac Fix stuns from beneficial spells (ex. Harvest) 2014-01-02 03:08:59 -05:00
KimLS b727cbbfe9 Luabind updated to be able to be compiled with Lua 5.2. Didn't really test it with 5.2 though since I'm still on 5.1. In theory it should work now though. 2013-12-28 18:19:12 -08:00
Alex 864338a881 Merge pull request #102 from nhaggmark/FixLoH
LoH and Harm Touch Fix
2013-12-27 21:19:54 -08:00
Nicholas Haggmark 6dc444d2d1 Committing update to zone/client_packet.pp which fixes a bug with Lay
on Hands and Harm Touch. Basically what is happening is that because
LoH and Harm Touch come in on spell slot 9 (ABILITY_SLOT), and because
ABILITY_SLOT is handled in the same block of code as standard memorized
spells, it was failing the MAX_PP_MEMSPELL check and always getting
silently interrupted. I broke DISCIPLINE_SLOT and ABILITY_SLOT processing
out into separate blocks which not only resolves this problem, but also
cleans up that processing a little bit.
2013-12-27 22:28:54 -05:00
Michael Cook (mackal) 13fcccefd5 Added support for merchant item filtering by class
Added column classes_required to merchantlist to allow
the merchant to only sell items to specified classes

Ex. (only example I know from live) To only allow poison supplies
to be sell able to only rogues, you would set classes_required
to 256.
classes_required defaults to 65535 (all/any class)

Remember to run the new SQL!
2013-12-26 16:29:09 -05:00
KimLS 30e8eac46e Hopefully this is a fix for issue #100 -- Uninitialized alt currency variable causing db corruption. 2013-12-24 13:21:11 -08:00
KimLS 646e1f541c Added lua export for Client:PlayMP3 2013-12-24 00:27:57 -08:00
SecretsOTheP a7c15ef598 Secrets: Added functionality to Perl/Server for $client->PlayMP3("name of file"). 2013-12-24 01:28:32 -05:00
SecretsOTheP bddb03ba3b Akkadius: Perl $client->SilentMessage("Message"); addition, this is a pre-req for a Perl plugin I've shared with EQEmu. This function essentially mimics a player speaking with an NPC - which is used in popup window responses 2013-12-24 01:09:35 -05:00
KimLS 2ac1f37b02 More work on Client Marquee messages. 2013-12-23 17:35:58 -08:00
KimLS a96f10b6aa More work on OP_Marquee. Should be enough to implement a function with it. Anyone wants to fiddle around with the unknowns and get them better documented they are free to. 2013-12-23 15:42:13 -08:00
KimLS ccf6b5ff68 Added prelim work on OP_Marquee incase anyone else wants to also have a go at it. Packet and opcode for SoD client figured out partially. 2013-12-22 22:37:41 -08:00
Michael Cook (mackal) 0d661204ed Fix MakeRandomInt for flurry and extraattack 2013-12-20 18:45:33 -05:00
Michael Cook (mackal) b0e50f13c9 Switched some stuff that made sense to Mob::InFrontMob 2013-12-20 18:43:52 -05:00
Michael Cook (mackal) d3ad253b51 Switched bard check in auto attack to IsBardSong 2013-12-20 18:43:16 -05:00
Michael Cook (mackal) 5ac23a2f8f Added facing check to auto attack LoS code
The Mob::InFrontMob check uses 56 degrees which is where the
client will generate the "You cannon see your target." message.
There were still a few weird angles that I was able to still
attack, but in like 99% of the cases it should work ...
2013-12-20 17:47:28 -05:00
JJ 9fff694382 Update per discussion on bfb17a2fb5 2013-12-19 19:39:34 -05:00
JJ 4512326fe8 Merge pull request #98 from KayenEQ/fixes
Spell effect additions... (will update further per notes)
2013-12-19 16:30:11 -08:00
KayenEQ bfb17a2fb5 Kayen: Implemented SE_ArcheryDoubleAttack (Chance to do an extra archery attack)
Kayen: Implemented SE_ShieldEquipDmgMod (Increase damage in primary hand if shield equiped)
Kayen: Implemented SE_ShieldEquipHateMod (Increase hate generated if shield equiped)
Kayen: Implemented SE_TriggerOnAmountValue (Trigger spell if HP/Mana/End bellow X value or num pet on target)
2013-12-17 21:51:13 -05:00
Michael Cook 53c124526c Merge pull request #97 from KayenEQ/fixes
Fix SE_BlockNextSpellFocus
2013-12-15 23:17:21 -08:00
KayenEQ 8007097aae Kayen: Fix to SE_BlockNextSpellFocus to make it functional again. 2013-12-16 00:53:00 -05:00
Michael Cook (mackal) 32e5ed5ad8 Merge branch 'master' of github.com:KayenEQ/Server into KayenEQ-master
Conflicts:
	changelog.txt
2013-12-15 23:51:21 -05:00
Michael Cook 65afbd4147 Moved BlockedBuffs check down for spell effects 2013-12-15 18:44:45 -05:00
Michael Cook 81e04ee185 Fix some indentation 2013-12-15 03:21:57 -05:00
KayenEQ 52722dc0c8 Kayen: Implemented SE_ReduceHealing (Reduces amount of healing on target by X amount)
Kayen: Implemented SE_CastonFocusEffect (Triggers spell as part of a focus, when that focus effect is used)
Kayen: Implemented SE_IncreaseHitDmgTaken (Effect is triggered when X amount of damage is taken)
Kayen: More fixes for various spell triggers/procs to now properly use their resist modifier.
2013-12-15 03:15:39 -05:00
Michael Cook b9c270fab6 Merge branch 'master' of github.com:EQEmu/Server
Conflicts:
	changelog.txt
2013-12-14 16:44:04 -05:00
Michael Cook 48db481fbb Fix blocked buffs from failing
When a buff is blocked it should just fail to be applied
instead of interrupting. Mana should also be eaten.
2013-12-14 16:42:12 -05:00
JJ 37cacd27b1 Changed enable/disable recipe to confirm change made. 2013-12-14 09:55:46 -05:00
Alex 466f541798 Merge pull request #95 from KayenEQ/master
Spell Effect fixes and additions
2013-12-13 20:48:24 -08:00
KayenEQ 9781af5696 Merge branch 'master' of github.com:KayenEQ/Server
Conflicts:
	changelog.txt
2013-12-13 22:47:04 -05:00
KayenEQ f6d5e8031f Kayen: Implemented additional functionality for SE_CurrentHP utilizing base2 values. (ie limit to body type)
Kayen: Implemented SE_MitigateMeleeDamageSP (Partial Melee Rune that only is lowered if melee hits are over X amount of damage)
Kayen: Implemented SE_SpellOnAmtDmgTaken (Effect is triggered when X amount of damage is taken)
Kayen: Fix for various spell triggers/procs to now properly use their resist modifier.
Kayen: Fix to mob->ModSkillDmgTaken(skill_num, value), setting value to -1 will now properly effect all skills.
2013-12-13 21:29:35 -05:00
Michael Cook c70ea4a621 Fix haste caps
Before these were mostly guess work, now based on what clients report
since they do their own calculations so are most likely correct.
2013-12-11 15:44:59 -05:00
Michael Cook 76ec6e4da2 Fixed crippling blow issues with berserker frenzy
Also added two rules to control when to enter/exit berserker frenzy
2013-12-11 01:49:51 -05:00
Michael Cook (mackal) cd2825288d Fix issue with SpellType_Charm case in AICastSpell 2013-12-04 00:52:12 -05:00
Michael Cook d95fdda30f Fix procing off of unattackable things
This /might/ be a little restrictive, but it should prevent easy
farming of bone chips from Boneshear etc
2013-12-03 16:12:13 -05:00
Michael Cook 4fdcf604f2 Added #showspellslist command to show us a mob's spells 2013-12-03 15:57:50 -05:00
JJ 02c9007765 Bandaid fix to CopyCharacter function. 2013-12-02 22:20:46 -05:00
Michael Cook 0f54830bc5 Stacking issues should be resolved now
I have a feeling this could be slightly better, but it works correctly.
2013-11-29 18:32:30 -05:00
Michael Cook d329fe0c12 Revert "Fixed issue with SE_StackingCommand_Overwrite"
This reverts commit a7ce852ca5.
2013-11-29 15:35:51 -05:00
Michael Cook a7ce852ca5 Fixed issue with SE_StackingCommand_Overwrite
SE_StackingCommand_Overwite uses the calc to figure out the slot to check.
Seems that calc 202 is slot 1 and 201 is actually something special. It
could be any slot, but need further investigation, for now, just ignore it.
2013-11-27 16:05:09 -05:00
Michael Cook b4fce37c14 Quick fix to issue with self buffs
casting_spell_targetid isn't guaranteed to be correct at that point in the code
Quick fix for now
2013-11-27 14:38:03 -05:00
SecretsOTheP 51181c8c8b AA fixes for PEQ's reported crash 2013-11-23 21:42:22 -05:00
KimLS 1c07ae9172 Fix for non-standard eqemu options in cmake, please don't do this in the future. Thank you. 2013-11-23 17:26:41 -08:00
SecretsOTheP 2f8cbb3a9d Fixes to the following crashes seen on PEQ:
http://www.peqtgc.com/phpBB3/viewtopic.php?f=1&t=14293&p=67404#p67404
http://www.peqtgc.com/phpBB3/viewtopic.php?f=1&t=14293&p=67105#p67105
2013-11-22 15:32:02 -05:00
Alex 093af6af0b Merge pull request #92 from clucksoft/master
suspend/ban kick fix
2013-11-20 02:36:27 -08:00
Michael Cook 0567073ca0 Quick fix for dot issue introduced in 765b5ee8
This could probably be done better
2013-11-19 18:34:20 -05:00
Michael Cook e33eb9d7b0 Partially implement dot_stacking_exempt
When it is 1 the spell will block it from other casters
Not 100% sure on when it's -1 so not currently used
2013-11-19 17:43:40 -05:00
clucksoft fd10ddf86d suspend/ban kick fix 2013-11-19 12:48:59 -08:00
SecretsOTheP edd4d47929 Merge branch 'master' of https://github.com/EQEmu/Server 2013-11-19 09:58:18 -05:00
SecretsOTheP f31b9ad98b Made the variable for disabling the logging system always default to ON instead of OFF. Changed the wording so it's less confusing.
This means that the debug logging information will not display at all by default, but the GM command logging will display enabled. If you need to diagnose the logs, simply turn them on at the expense of added CPU/Disk I/O
2013-11-19 09:57:52 -05:00
Michael Cook (mackal) 10ee3ea346 Fixed shared memory read me 2013-11-19 00:09:41 -05:00
Michael Cook (mackal) 62b7eda9e9 Added read me to shared_memory 2013-11-19 00:08:22 -05:00
SecretsOTheP 8b7984cf7d Merge branch 'master' of https://github.com/EQEmu/Server 2013-11-18 23:56:11 -05:00
SecretsOTheP 4a0e07a54c Fixes to actually use the cmake defs added in the previous revision 2013-11-18 23:54:24 -05:00
SecretsOTheP 6e520c8476 Added options to CMake to disable GM command logging or disable logging entirely while keeping GM commands enabled.
Cleaned up some logging
2013-11-18 23:49:12 -05:00
Michael Cook (mackal) 917a8ed389 Fix some errors in comments 2013-11-18 16:21:10 -05:00
Sorvani 86bba4ff0e changed aggro_range to leach_range and tether_range appropriately 2013-11-18 13:53:21 -06:00
Michael Cook (mackal) 300799fdc8 Added npc_types.assistradius, defaults to npc_types.aggroradius if set to 0 2013-11-18 12:44:39 -05:00
Sorvani 65e36e02fb fixed leash and tether to correctly used specified range. 2013-11-17 20:55:44 -06:00
Michael Cook 09dd3c1b37 Fixed an issue that arose from 78ab3471
Reworked how Mob::_GetMovementSpeed worked to fix an issue of walking
with a sufficiently high movemod.

Added a rule Character:BaseRunSpeedCap (default 158) to control the
cap on runspeed from buffs. Hardcapped to 225 for sanity's sake.
2013-11-17 19:37:49 -05:00
Michael Cook (mackal) 36233538fd Some whitespace fixes in zone/spells.cpp 2013-11-17 00:34:58 -05:00
Michael Cook 3d5b3d1e8c Added Mob::DoCastingChecks() which checks for various casting fail conditions while casting 2013-11-17 00:31:17 -05:00
Michael Cook 3c2ae8250f Merge pull request #91 from Leere/drink_message
Fix for auto-consume drinking message
2013-11-15 19:23:02 -08:00
Leere 6a95abb01f Fix for auto-consume drinking message 2013-11-16 03:40:35 +01:00
JJ 4c6fce5d5c Add a little more debug info to MQGate hack detection. 2013-11-15 19:31:43 -05:00
Michael Cook 08b5225a13 Merge pull request #90 from Leere/stacking_issue
Fix for a stacking issue with SE_StackingCommand_Block for druid skins
2013-11-15 13:15:53 -08:00
Leere 765b5ee826 Fix for a stacking issue with SE_StackingCommand_Block for druid skins 2013-11-15 18:03:13 +01:00
Michael Cook a40a34d2e8 Fixed Mob::CalcFocusEffect()'s SE_LimitEffect 2013-11-15 01:17:27 -05:00
Michael Cook (mackal) 983ee2d39b Merge branch 'master' of github.com:EQEmu/Server 2013-11-14 20:28:01 -05:00
Michael Cook (mackal) e1255af708 Fix Spell level restrictions
I made an incorrect assumption, fixed now
2013-11-14 20:26:58 -05:00
JJ b99d476754 Change INSERT to REPLACE 2013-11-13 21:59:38 -05:00
Michael Cook 23ab896dfc Fix last commit .... 2013-11-13 18:04:11 -05:00
Michael Cook d094a09ded Implemented Singing/Instrument Mastery as an AA bonus
Don't forget to source the SQL file!
2013-11-13 18:03:08 -05:00
Michael Cook 3f8ee533d3 Implement bard song instrument mod caps
The maximum bard songs can be effected by instrument mods is 3.6.
This is set by the rule Character:BaseInstrumentSoftCap which defaults to 36
Also fix Echo of Taelosia and Ayonae's Tutelage to increase the mod cap.
2013-11-13 15:07:34 -05:00
Michael Cook 0c3c84d711 Merge branch 'master' of github.com:EQEmu/Server 2013-11-12 22:32:44 -05:00
Michael Cook 79c53a41a8 Add some sanity for bard songs in snares ... 2013-11-12 22:32:03 -05:00
cavedude00 2ffa13c993 Compile fix. 2013-11-12 16:08:31 -08:00
Ludwig 8af48bbe48 Merge pull request #89 from httm/master
Update exp.cpp
2013-11-12 15:22:47 -08:00
httm 65c0772d37 Update exp.cpp
Replaced elseif statements in group experience calculation with single if statement for calculation when membercount between 2 and 5
2013-11-12 18:06:24 -05:00
Michael Cook 78ab347171 Fix walk speed calculation
Walk speed should be calculated as a movement speed reduction that
stacks with snares so it's possible to snare a mob FD and have it
not be able to walk back.
2013-11-11 23:55:43 -05:00
Michael Cook d83b94d231 Revert "Fixed non-attacking related movement while mobs are snared"
Did some testing, this isn't exactly the case on live.

This reverts commit ed6c46f7ff.
2013-11-11 21:06:48 -05:00
Michael Cook (mackal) ed6c46f7ff Fixed non-attacking related movement while mobs are snared
On live a nec/shd normal splitting involved snaring the mob you want
and FDing after they moved enough. The non-snared mobs would return home
and the snared mob would just sit there until it was no longer snared.
There is even a nice flash video! http://www.dzert.com/downloads/eq/fd02.swf
This might need some tweaking, but I'm not sure of any instances where it would
break things...
2013-11-11 18:18:12 -05:00
Michael Cook (mackal) 925e19b15c Fix database scheme comments that got clobbered on nullptr conversion 2013-11-11 15:37:20 -05:00
Michael Cook 2be71fc2ec Cleaned up common/spdat.cpp
There was a lot of stuff that I found that the level of readability.
I cleaned up a lot of the stuff, no functionality should be changed
unless where noted below.

* IsPartialDeathSaveSpell is now generic and no longer uses a hardcoded spell id
* IsFullDeathSaveSpell is now generic and no longer uses a hardcoded spell id

If these functions were actually used in the spell effects it would probably
fix issues with newer spells (which there are on live)
2013-11-10 21:37:01 -05:00
Ludwig bc2ee8dce8 Merge pull request #88 from Leere/bardmana_fix
Fix for bard mana regen
2013-11-09 11:20:44 -08:00
Leere 1deef77f07 Fix for bard mana regen 2013-11-09 19:36:32 +01:00
KimLS e00c57bc47 Fix to changelog conflict in merge. 2013-11-07 12:44:13 -08:00
JJ da3ba12560 Fix for #npcedit qglobal 2013-11-06 21:12:57 -05:00
KimLS f68b89b7d9 Prerelease commit 2013-11-06 13:48:35 -08:00
KimLS c944aafb39 Merge branch 'master' into base_data 2013-11-06 13:18:20 -08:00
KimLS 0e6c9820cd Importing client files works now 2013-11-06 13:17:44 -08:00
JJ b8d1838dcc Added in-game commands to enable/disable tradeskill recipes
-Commands: #enablerecipe recipe_id, #disablerecipe recipe_id
-Perl: quest::enablerecipe(recipe_id), quest::disablerecipe(recipe_id)
-Lua: eq.enable_recipe(recipe_id), eq.disable_recipe(recipe_id)
2013-11-01 23:55:17 -04:00
JJ aba535b589 Merge pull request #87 from Leere/recipe_disable
Add the ability to disable a tradeskill recipe
2013-11-01 08:33:13 -07:00
Leere cf117b1a4d Add the ability to disable a tradeskill recipe 2013-10-31 17:58:44 +01:00
Uleat 1bae570b68 Merge pull request #86 from EQEmu/uleat_cleanup_1
Uleat cleanup 1 - Note: The player profile blob struct code has been changed, but it does not affect the actual database blob size or alignment. That said, it probably wouldn't be a bad idea to backup at least the character_ table.
2013-10-30 14:39:26 -07:00
Uleat 1f0e263b6e Fix for compile failure in deity.h - Thanks V! (I should write a book on gcc:vs differences..I have found almost all of them...) 2013-10-30 03:49:32 -04:00
Uleat 08706055af Final prep for extending skill use range - client patch and database are ready..just need the code in-between 2013-10-28 13:06:49 -04:00
Uleat 28bcf074fc Client patch prep work for extending usable skill range 2013-10-28 05:00:49 -04:00
Uleat 1c8aaf97bc Changelog entry clarification..did not explain the issue clearly... 2013-10-27 13:41:39 -04:00
Uleat a891597f4c Prepped the client patch files for larger skill buffer size (not active) 2013-10-27 13:30:45 -04:00
Uleat e3805d5920 Converted SkillType typedef enumeration to SkillUseTypes enumeration 2013-10-27 13:03:41 -04:00
Uleat 3e6be197e6 Changed ItemTypes to ItemUseTypes 2013-10-27 09:04:52 -04:00
Uleat 0d5fc26841 Converted MATERIAL defines to MaterialUseSlots enumeration 2013-10-27 08:01:37 -04:00
Uleat df47e17c8e Changed ItemClass enumeration to ItemClassTypes enumeration 2013-10-27 06:38:34 -04:00
Uleat e53fa1d873 Changed ItemUseType enumeration to ItemInstTypes enumeration - naming conflicted with definition 2013-10-27 05:45:52 -04:00
Uleat d5152a0e59 Moved and expanded Deity-related code 2013-10-27 05:08:53 -04:00
Uleat 78e04dee99 Enforced naming standard on my recent changes 2013-10-27 04:17:08 -04:00
Uleat b3d117f8c1 Improper skill in use allowing riposte fix (Archery and Throwing allowing riposte check..no known bug reports) 2013-10-27 03:25:27 -04:00
Uleat cab77e83da High level debug (12) compile failure fix - I searched for as many as I could find with GrepWin, so there may be a few out there still 2013-10-27 03:13:10 -04:00
Michael Cook b4068823ed Merge pull request #85 from vexyl/fix1
Fix for healing unconscious players.
2013-10-26 14:13:00 -07:00
vexyl a694cf3079 Fix for healing unconscious players. 2013-10-26 13:46:03 -07:00
Michael Cook 3c09613d01 Changed the MT_Shout to MT_SpellFailure in Mob::SpellOnTarget 2013-10-24 17:38:46 -04:00
Michael Cook 36d336e69c Fix some memory leaks in Mob::SpellOnTarget
This should fix the memory leak introduced in the last commit and
a few lingering memory leaks, don't think they should break anything
2013-10-24 17:35:21 -04:00
KimLS 4270d77692 Merge branch 'master' into base_data 2013-10-21 16:42:32 -07:00
KimLS ec6c5519a5 More work on importing... I need my escape stuff from other branch for this though 2013-10-21 16:41:34 -07:00
Michael Cook a06fe1d02e Implemented buff level restrictions
Higher level buffs can't be cast on lower level toons.
The formula was based on information found here: http://samanna.net/eq.general/buffs.shtml
This behavior is controlled by the rule Spells:BuffLevelRestrictions which defaults to true.
2013-10-21 19:13:55 -04:00
Michael Cook 56ba87577b GetMinLevel will now return 0 for more cases
For some reason EQ uses 127 (melee classes), 254 (some AAs), and 255
in the class level for spells a class doesn't have
2013-10-21 19:10:01 -04:00
KimLS cdb29be4f3 Merge branch 'master' into base_data 2013-10-18 21:44:18 -07:00
KimLS 4ef9732e37 Compile fix 2013-10-18 21:43:47 -07:00
KimLS f2f4e55818 Import/Export util start 2013-10-18 21:23:45 -07:00
Uleat 403ac53a9e Renamed/expanded 'BagTypes' enumeration 2013-10-18 20:33:41 -04:00
KimLS cdcda943be Base data for hp/mana/end calcs, mostly but not completely correct 2013-10-18 00:09:00 -07:00
KimLS 2c25241763 Fix for lua say links, other branch taking longer than thought so making this its own commit 2013-10-16 15:47:08 -07:00
Sorvani 17729365db Merge pull request #84 from clucksoft/master
Update to spell timers fix
2013-10-13 09:34:04 -07:00
clucksoft 5d5dc1b544 update to spell fix 2013-10-11 22:54:35 -07:00
badcaptain 244c7e019c Changed dates due to time of commit. 2013-10-12 00:52:02 -04:00
badcaptain a7fea4fc69 Merge branch 'master' of https://github.com/EQEmu/Server 2013-10-12 00:47:55 -04:00
badcaptain 809925dc3e Bots- added out of combat bard songs & #bot bardoutofcombat on|off command to turn them on/off. 2013-10-12 00:47:15 -04:00
Michael Cook 98c835e470 Fix Titanium clients from not being able to start in Tutorial zone. 2013-10-12 00:29:44 -04:00
badcaptain 8ac4845930 Merge branch 'master' of https://github.com/EQEmu/Server
Initial check-in of bard bot in combat song code.
2013-10-11 23:43:38 -04:00
badcaptain 765f23febc Initial check-in of bard bot in combat song code. 2013-10-11 23:37:46 -04:00
badcaptain f1b70b3340 Fix Merc crash bugs. 2013-10-11 23:27:55 -04:00
JJ 549dfc9781 Allow use of Go Home button when Tutorial still selected in RoF. 2013-10-11 22:40:49 -04:00
Michael Cook 2019379a42 bool* foo = false should probably be an error, GCC 4.8+ at least warns about it, clang I think fails on it. 2013-10-11 00:00:21 -04:00
Michael Cook 15335509c2 Merge branch 'master' of github.com:EQEmu/Server
Conflicts:
	changelog.txt
2013-10-10 23:45:15 -04:00
Michael Cook da401acdb2 Fix mana and timer being used on single target buffs failing
Single target buffs shouldn't have their mana consumed or their
reuse timers set if they fail the Mob::SpellOnTarget call in
Mob::SpellFinished. Ex. Night's Dark Terror not taking hold
(no free slots) or Target running out of range.
Debuffs do not get this nice behavior.
2013-10-10 23:17:02 -04:00
JJ 8327f22f6f Revert change to EnterWorldPacket introduced on 22 April 2013 to fix inability to enter Tutorial or Go Home from character select screen. 2013-10-10 22:38:23 -04:00
SecretsOTheP 6154cfce99 Fixed zone shutdown (or #reloadqst) reinitalization of Perl. This should allow for Perl 5.14 and later to work on Windows under the new quest system. 2013-10-10 05:15:38 -07:00
Michael Cook c13c039721 Merge pull request #83 from AMDmi3/patch-1
Simplify conditional linking with libdl
2013-10-09 08:33:27 -07:00
Dmitry Marakasov 7ee417ab05 Simplify conditional linking with libdl 2013-10-09 19:27:52 +04:00
Michael Cook 3a95f81196 Fixed more instances of AA timers being eaten
Every time I touch zone/AA.cpp to fix timers it gets uglier.
This should fix the bug reported here: http://www.peqtgc.com/phpBB3/viewtopic.php?f=17&t=14125
It should also fix AAs not being reset when it when you have no buff slots free (confirmed on live)
2013-10-09 02:00:49 -04:00
Michael Cook 9a19a00bdc Added IsBuffSpell(spell_id). This will return true if the spell would end up having a duration, which will mean it would end up in one of the many buff windows on the client. This just makes sure the spell has a buffduration or buffdurationformula, which means the calculation will return a duration
Replaced all instances of CalcBuffDuration being used to determine if a spell was a buff with IsBuffSpell
Removed Mob::HasBuffIcon since it does the same thing IsBuffSpell does in a more convoluted way and had a rather missing leading name
Fixed issues that arose from the 10/03/2013 changes
2013-10-08 17:24:07 -04:00
Sorvani 24308aec6c fixed issue with stackable items summoning with 0 charges 2013-10-05 21:55:21 -05:00
Michael Cook 6b4b259753 Fix when the random +1 tick is added to nerf extension focus effects to where they should be 2013-10-03 23:04:58 -04:00
Alex bf77bc47d1 Merge pull request #81 from vexyl/master
Fix for segfault in Database::CheckStatus() when using MariaDB.
2013-10-02 21:19:59 -07:00
Michael Cook 2bde0b40bb Fixed issue with #showstats window, should probably be refactored to completely use stringstream or to_string whenever VS2010 support is dropped 2013-09-30 22:17:34 -04:00
Sorvani 478f7b8e49 Changed SummonItem to no longer recharge 0 charge items 2013-09-30 20:57:12 -05:00
Vexyl f289dffc48 Fix for segfault in Database::CheckStatus() when using MariaDB. 2013-09-28 10:38:50 -07:00
Michael Cook (mackal) d119ed058b Add /pet hold on and /pet hold off support for UF/RoF 2013-09-13 15:20:45 -04:00
KimLS fdb6f0fe84 Fix for training skill bailout when you can train the skill but not at the current level. 2013-08-29 15:52:17 -07:00
KimLS bef02b3511 Merge branch 'master' of https://github.com/EQEmu/Server 2013-08-29 15:46:56 -07:00
KimLS fcd9b525a8 Removed Common Profiler and Zone Profiler. They're well past outdated status and are just code bloat. 2013-08-29 15:46:40 -07:00
Uleat 590d8f4043 Fix for bot pet spell buff corruption 2013-08-20 20:55:19 -04:00
KimLS 406e2f84eb Fix for special atk sql missing a type.
Fix for a crash in quest manager setanim.
Fix for pfs_list not compiling on x64 windows.
2013-08-10 14:17:06 -07:00
josheb 926e2f7939 Merge pull request #80 from josheb/master
Fixed a regression with level 10 and 20 hit caps.
Added rules for aggro and hunger as well as script commands for manipulating hunger.
2013-08-06 14:55:25 -07:00
Tabasco b92a009539 Fixed some lua stuff I bork. 2013-08-01 19:37:16 -05:00
Tabasco cfab1c4649 Removed redundant Innate Metabolism checks. 2013-08-01 19:34:27 -05:00
Tabasco fc03ee94e2 Added rules for what int mobs need to not attack red cons and how much food and drink is taken per stamina update.
Added mod hooks for food/drink values and mob aggro.
Added quest functions for getting/setting hunger and thirst.
2013-08-01 19:24:15 -05:00
Tabasco 936c8cce4b Fixed a regression with level 10 and 20 hit caps. 2013-08-01 14:41:27 -05:00
KimLS 1f2145a45d Fix for special_abilities crash dealing with std::string in struct that was then memcpyed 2013-07-18 00:24:43 -07:00
Uleat 2331678312 fix for tortoisegit commit and overlay issues in dependencies/.gitignore 2013-07-15 23:22:17 -04:00
Sorvani c216ece72c fir for lua get_spawn_condition 2013-07-15 00:35:46 -05:00
KimLS 36e12110d5 Memset SpecialAbility before putting it into map. 2013-07-14 14:47:22 -07:00
KimLS aa5ac1518b Changelog for lua_packet 2013-07-13 14:03:55 -07:00
KimLS d472c05f5d Lua packet handler dispatch 2013-07-13 13:53:41 -07:00
KimLS 485fc2b2b7 Fix for bot compile 2013-07-13 13:53:13 -07:00
KimLS bdc83f4f37 Basic lua packet api, and it works too. Exciting I must say. 2013-07-12 22:21:43 -07:00
KimLS da178c9fba Compile error in AA.cpp 2013-07-12 18:57:49 -07:00
KimLS a1dc390f49 Windows compile error again, why wasn't this fixed on the second pass. I brought it up last time grr 2013-07-12 15:01:12 -07:00
Alex dfe63f87c3 Merge pull request #78 from j883376/cleanups
Code cleanups, take two
2013-07-12 13:36:02 -07:00
KimLS 239d4afb13 NPC Special Attacks should all work right: also huge explanation in changelog.txt 2013-07-11 13:44:45 -07:00
KimLS ab2c184b54 Merge branch 'master' of https://github.com/EQEmu/Server 2013-07-10 14:33:06 -07:00
j883376 31ede315f2 Fix Database::GetZoneID() 2013-07-08 19:02:54 -04:00
KimLS 3992ac02bb Rampage, Area Rampage, Flurry got new customizable effects. Part of that was adding a new set of stuff to attack. 2013-07-08 14:37:01 -07:00
SecretsOTheP e6ad26f03c Logfile cleanups. See changelog.txt. 2013-07-07 21:44:31 -07:00
KimLS 2f335372a0 Few warning and lua fixes, fix for summon not working on new system. Need to look at enrage as it doesn't appear to work right either and think it's timing related 2013-07-07 15:22:20 -07:00
KimLS 63d678ce29 Replaced npcspecialatk with special_attacks, needs more testing also gotta export new api for it as I can't remove the legacy one. Too many quests rely on the legacy functionality. 2013-07-06 03:45:06 -07:00
KimLS 0c675c33e2 Changelog too 2013-07-05 13:25:19 -07:00
KimLS 3c8d83f2a8 Perl will now capture return values (lua style), yeah I said I wouldn't be improving much of perl from here on but I said if I found a way I'd do it. 2013-07-05 02:56:53 -07:00
KimLS b11ed32bcf Removed quest queue from perl parser, should do events properly recursively 2013-07-05 01:46:24 -07:00
KimLS 9a63ee65c9 Added functions to eq to get the internals of the current quest_manager quest, also bug fix to a lua client function 2013-07-05 00:33:45 -07:00
KimLS 8b8742b242 Fix for Spell(int) not working in lua... 2013-07-03 15:20:42 -07:00
KimLS bccbc0f064 Merge branch 'master' of https://github.com/EQEmu/Server 2013-07-02 14:20:04 -07:00
KimLS b7fcd5b02a eq.follow() and eq.stop_follow() 2013-07-02 14:16:16 -07:00
Alex 56b9dda60b Update README.md 2013-07-01 14:12:31 -07:00
KimLS 1868d0e7a3 Lua changelog entry 2013-07-01 14:06:20 -07:00
KimLS 38b3433406 Merge branch 'master' into lua 2013-07-01 13:32:47 -07:00
Michael Cook 6d21823959 Prevent Monster Summoning from summoning a portal in bothunder 2013-07-01 16:03:04 -04:00
Michael Cook 02eb56a696 Fix Monster Summoning related to giants/cyclops 2013-07-01 15:22:07 -04:00
KimLS 6fe5c06fa0 Fix for trade being retained on logout/zone 2013-06-29 12:18:40 -07:00
KimLS 2c68e813e9 More selective filtering of lua libs, seed random set for lua interpreter, Release Canidate 2013-06-29 01:43:56 -07:00
KimLS e42c7a38a5 eq.attack_npc(npc_id) and eq.attack_npc_type(npc_type) added. 2013-06-28 16:43:57 -07:00
KimLS 7b5b1b2583 Added eq.attack(client_name) to lua. 2013-06-28 16:30:27 -07:00
j883376 0578f45490 Revert "Revert "Merge pull request #77 from j883376/cleanups""
This reverts commit d25205d9d3.
2013-06-28 04:25:44 -04:00
KimLS f46f7bd528 event_death_complete 2013-06-27 15:07:28 -07:00
KimLS 945cc2117f Fix for perl not loading events if they're chained, fix for items not being removed from inventory at an intuitive time in event_trade 2013-06-27 14:14:10 -07:00
KimLS a5db4310c6 Merge branch 'master' into lua
Conflicts:
	zone/merc.cpp
2013-06-27 12:53:47 -07:00
KimLS d25205d9d3 Revert "Merge pull request #77 from j883376/cleanups"
This reverts commit 4ff2efea43, reversing
changes made to e811e3975b.
2013-06-27 12:50:20 -07:00
KimLS d12c700bbf missing lua mob function 2013-06-26 22:23:31 -07:00
KimLS db70ad37dd Fix for quest::depop and quest::respawn not functioning 2013-06-26 15:43:55 -07:00
KimLS 9e1115f899 Merge master, pretty close to RC atm 2013-06-26 12:52:00 -07:00
Alex 82f4b4ee53 Merge pull request #76 from Zaela/respawn
RespawnFromHover scriptable framework
2013-06-26 10:13:56 -07:00
Alex 4ff2efea43 Merge pull request #77 from j883376/cleanups
Various code cleanups
2013-06-26 10:06:07 -07:00
KimLS d2a3c051e5 Added custom find lua cmake module to make building on windows easier 2013-06-26 09:57:06 -07:00
KimLS 16d3825df4 Fixed translocate, dispatch event now returns values properly, embparser now stores errors (what few it has) 2013-06-26 09:26:19 -07:00
KimLS 602b17f0e8 Fix for msvc compile, lua_bit.cpp wont try to compile if lua isn't set to build 2013-06-26 08:05:36 -07:00
j883376 488b2888a8 Fix uses of uninitialized variables
- Replace unknown008 array with two separate variables in Object code

- Fix mismatched safe_delete() of an array
2013-06-25 23:40:05 -04:00
KimLS 1480b8911f Sorta hacky work around for doing nukeitem in item quests. Added lua bitop library. Made excluding io/os optional 2013-06-25 14:51:06 -07:00
Zaela 72ef7f6557 Made default-on-error a little less bad. 2013-06-25 11:05:03 -07:00
Zaela f35afed89a one eof newline 2013-06-25 10:45:07 -07:00
KimLS ffe6494147 Forgot a semicolon in an important spot. 2013-06-24 13:00:50 -07:00
KimLS 342a4c1b17 Fix for clickies not working, changed order of dispatch events to allow nuking items from regular item events. Changed the lua modules path. 2013-06-24 12:42:42 -07:00
KimLS b904689a98 Added Spawn object to lua and functions to manipulate them 2013-06-23 14:48:36 -07:00
KimLS 0dc66b3dd7 Added quest areas (only accessable in lua) which work similar to proximities except are not attached to any one npc. Also fixed up the proximity code a bit to comply and got rid of my stupid ass fix for the deleting lists thing 2013-06-22 20:47:11 -07:00
KimLS bb1282de30 encounter events can now watch all events by all npcs/items/quests by registering themselves to watch -1, fix #74 2013-06-22 14:23:07 -07:00
Zaela c5e4cf35c0 Reworked RespawnFromHover framework to allow future customization (scripting) of respawn options.
Added event_respawn to be triggered when a client respawns from hover into the current zone (may not be set up correctly!).
2013-06-22 08:35:33 -07:00
KimLS 2529a7700e Fix for luabind not compiling (jumbers), bunch of api upgrades for lua, changed where spells and items load quests from, removed some old code. etc etc. 2013-06-22 01:32:41 -07:00
j883376 7e2806119b Fix some improper uses of printf formats 2013-06-22 00:55:54 -04:00
j883376 536e31d771 Change binary output path to use CMake variable
Tools that use CMake's EXECUTABLE_OUTPUT_PATH variable to
determine which binary to launch for debugging may be confused
by a relative path, so use CMake variable PROJECT_BINARY_DIR
instead.
2013-06-21 23:21:57 -04:00
j883376 2a39449f6e Fix exit code values
- Change all exit codes to match the standard of 0 for success
and 1 for error

- Add empty shared folder to utils/defaults for shared_memory
2013-06-21 22:54:28 -04:00
KimLS 7af04798fb Augment item events 2013-06-21 14:20:30 -07:00
j883376 76e25f75fa Fix a few memory leaks
- Rewrite zonename_array to use std::map rather than a pointer to an array
of character pointers

- Properly delete ZoneConfig on Zone shutdown

- Delete AdventureTemplates in AdventureManager destructor
2013-06-21 17:09:46 -04:00
KimLS 7b894a7c61 Added direct inventory access, and event_loot for items and event_weapon_proc for items 2013-06-20 14:03:22 -07:00
KimLS d8a1d84a49 Regression fixes, support for new lua arguments for many events 2013-06-19 22:56:46 -07:00
KimLS bb8d11a57b Merge from master 2013-06-17 11:47:45 -07:00
KimLS e811e3975b Mod functions should respect perl being turned off. 2013-06-16 21:04:36 -07:00
SecretsOTheP 68261e0308 Fixed an issue with RoF items that have Rec/Req above 100. Forgot commit message/changelog.txt. 2013-06-16 13:07:48 -07:00
SecretsOTheP d03e8d05ec 2013-06-16 13:04:48 -07:00
Alex 3f2815e30c Merge pull request #73 from hateborne/master
spell.max conversion from int16 to int32.  Make sure to re-run your shared_memory program.
2013-06-15 17:44:34 -07:00
KimLS 91b01c2fcc Image fix for OP_CastSpell exploit. 2013-06-15 13:08:32 -07:00
Hateborne 179063c863 spell.max convert int16 to int32
Converting the spell.max field to int32 to handle larger numbers in the
PercentalHeal field.
2013-06-13 17:59:24 -04:00
Uleat 28eb80e27f Added changelog message for predated commit (Bot procs and AE buff casting) 2013-06-12 22:04:07 -04:00
KimLS c0d37b2e04 Many fixes to regressions in perl and cleaning up the final interface 2013-06-12 15:04:26 -07:00
KimLS 0dbd0478c0 Merge of hatebourne's stuff 2013-06-12 12:11:56 -07:00
KimLS 56b41c882b Redoing event item api 2013-06-07 02:26:17 -07:00
KimLS 8c3cce822a Added three new events 2013-06-06 14:29:45 -07:00
KimLS b87d4a3e5f Removed perl stuff from mod stuff 2013-06-05 17:00:59 -07:00
KimLS cec60feba9 Merge master 2013-06-05 16:58:11 -07:00
Alex 29c0c4801c Merge pull request #70 from josheb/master
Mod functions updates and fixes
2013-06-05 16:54:36 -07:00
KimLS a3738dc131 Changed EVENT_TRADE to pass iteminst instead of variable ids, perl will not have changed at all but lua now passes the iteminsts in the trade object. Also redid a bunch of the spell quest stuff 2013-06-05 16:47:49 -07:00
KimLS 6d0c0aee7d Last work to make lua parser feature complete, time to start fixing bugs and cleaning up design and maybe adding some features here and there. 2013-06-04 23:22:03 -07:00
KimLS 1b290b577d Fix for potential nullptr when using base lua class constructors in debug mode, also added eq.get_qglobals and removed automatic export of them (will do this for a lot of other automatic exports) 2013-06-04 16:48:32 -07:00
KimLS 85c7e1b059 Player event export plus lua_object api 2013-06-03 16:49:47 -07:00
root a8de7e9ffc Removed comments from mod_client.cpp for erroneous 255 stat cap. 2013-06-03 17:08:58 -05:00
KimLS bc82bff4b4 Lua doors api 2013-06-03 00:08:41 -07:00
Tabasco ff091e940c Lua corpse API 2013-06-02 19:05:40 -05:00
KimLS 55a964267e Raid/Group lua stuff, renamed corpses 2013-06-02 13:47:52 -07:00
KimLS d14608356d Added all lua objects i need for now, a ton of API too 2013-06-02 00:15:26 -07:00
root 7fca5a7a89 Merge branch 'master' of https://github.com/EQEmu/Server into EQEmu-master
Conflicts:
	zone/client.h
	zone/mod_functions.cpp
	zone/mod_functions_base.cpp
2013-06-01 19:17:23 -05:00
josheb ac5926bdfe Merge pull request #7 from josheb/dungeoncrawl
Sync mod_functions updates
2013-06-01 08:56:19 -07:00
root b16cf57510 Cautionary XP mod update. 2013-06-01 10:49:58 -05:00
root 851c842529 Updated mod_functions and mod_functions_base with new hooks and descriptions 2013-06-01 10:44:32 -05:00
KimLS a1080fdb2d Merge branch 'master' into lua 2013-05-31 16:41:44 -07:00
KimLS 344feb7484 Finished exporting lua general functions for now, also had to fix some const char* stuff 2013-05-31 16:40:55 -07:00
root 567c17cc9e Berserker updates. 2013-05-28 20:27:17 -05:00
root 0ee54f1117 Added mod_spell_cast and various mod_functions fixes. 2013-05-28 19:58:40 -05:00
KimLS 69f1187722 Small amount of general lua functions 2013-05-28 13:12:42 -07:00
Alex 39426789f4 Merge pull request #69 from j883376/login-db-crash
Fix loginserver crash on DB connect failure
2013-05-27 17:33:57 -07:00
KimLS 49c3a81e18 More lua work, client should be completely exported barring any more bugs that crop up. Starting work on getting the rest of the general functions 2013-05-27 17:24:31 -07:00
Tabasco fa0196b987 Fixed some mod function bugs and stat caps. 2013-05-27 15:32:59 -05:00
j883376 44477a0d47 Fix loginserver crash on DB connect failure 2013-05-27 12:35:45 -04:00
root 510ce16f0e Added reloadworld console command 2013-05-27 08:46:50 -05:00
KimLS 1e7c5bb9b7 Bug fix in event_trade export, exported augments too. Also need to fix overloads 2013-05-26 15:56:55 -07:00
KimLS 850fa5aecc Exported client functions to lua, going to work on npc next 2013-05-26 12:44:33 -07:00
KimLS 79a9d2112a Retransmit support added back in (stupid compile flags), prelim work on lua_client stuff, took out a few redundant or non-working functions 2013-05-25 01:08:30 -07:00
KimLS d25d8187b6 Failed merge on a specific file also fix for std and string changes in my embparser 2013-05-24 01:41:33 -07:00
KimLS e47de5deed Merge with master 2013-05-24 01:23:58 -07:00
Alex 52b8c0e078 Merge pull request #66 from j883376/gcc-changes
GCC Changes
2013-05-24 01:16:10 -07:00
KimLS 3c7f7beb6d Red. include string 2013-05-24 01:10:19 -07:00
KimLS ee7d7c6f24 Merge branch 'small_stage_cleanup' of git://github.com/addtheice/Server into addtheice-small_stage_cleanup 2013-05-24 00:56:20 -07:00
KimLS a66ef1b778 Function for retrieving a qglobal or list of them 2013-05-24 00:52:28 -07:00
j883376 b47597b813 Merge branch 'master' of git://github.com/EQEmu/Server into gcc-changes 2013-05-23 21:12:07 -04:00
j883376 d6ff01d63c Fix several GCC warnings 2013-05-23 20:22:42 -04:00
KimLS a3e24b6854 Merge from master 2013-05-23 12:50:34 -07:00
Arthur Ice fcb769e353 Merge branch 'master' into small_stage_cleanup
Conflicts:
	common/EQStream.cpp
	zone/client.h
2013-05-23 12:49:22 -07:00
KimLS ce63503bab Changed a bunch of lua stuff, as well as modified a bunch of generic item quest stuff 2013-05-23 12:43:21 -07:00
KimLS 815c3dc73f Merge branch 'master' of https://github.com/EQEmu/Server into string 2013-05-23 12:35:21 -07:00
KimLS efe7092995 Merge and a few cleanup / bug fixes 2013-05-23 12:35:00 -07:00
Alex 12ddd30f67 Merge pull request #64 from af4t/master
Windows compile fix: bots
2013-05-23 12:30:06 -07:00
af4t 879ddb208b Windows compile fixes (bots) 2013-05-23 12:17:30 -04:00
Kemmler 70dab7d920 Merge pull request #6 from EQEmu/master
Sync 2013-05-23
2013-05-23 03:53:22 -07:00
KimLS 2840e32853 Merge branch 'master' into string 2013-05-23 00:56:27 -07:00
KimLS 320494c83d Windows compile fix 2013-05-23 00:55:29 -07:00
KimLS e6fba5ba82 Merging 2013-05-23 00:31:02 -07:00
Arthur Ice 5255c236c3 added std:: to a lot of locations which where
missed and added NOMINMAX to cmakelist
2013-05-22 23:55:49 -07:00
Arthur Ice e5d4b35a32 Spelling fix in a comment. Nothing else. 2013-05-22 22:21:28 -07:00
Arthur Ice b4e65a8840 tabbify and cleaned up std issues and min/max problems. 2013-05-22 21:27:37 -07:00
Arthur Ice ac78841e55 Removed MakeUpperString since it's not used anywhere. 2013-05-22 19:41:16 -07:00
Arthur Ice 54914a970e Merge branch 'StringFormatting' into small_stage_cleanup
Conflicts:
	common/Item.cpp
	world/client.cpp
	zone/net.cpp
2013-05-22 18:55:06 -07:00
Arthur Ice ea2a1651d5 Merge branch 'master' into StringFormatting
Conflicts:
	common/debug.cpp
2013-05-22 18:07:39 -07:00
Arthur Ice 5c6e95f921 Merge branch 'master' of https://github.com/EQEmu/Server 2013-05-22 17:38:26 -07:00
Kemmler 555e21c3c7 Merge pull request #5 from EQEmu/master
Sync 2013-05-22
2013-05-22 16:31:52 -07:00
Michael Cook 0fdfe025cb Remove 'using namespaces std' fixes #61 2013-05-22 16:17:19 -04:00
root 930fda07c9 Added exp for level mod, misc fixes. 2013-05-22 07:19:09 -05:00
Arthur Ice 41dcd5bc29 Should only need dumpItemCollection and dumpBagContents internally so made them protected. 2013-05-21 23:34:55 -07:00
Arthur Ice d7546e09ee broke up dumpInventory into methods, changed it to dumpEntireInventory (dumpInventory now only dumps a small peice) 2013-05-21 22:53:22 -07:00
Arthur Ice e9577db9c2 removed DBMemLeak.cpp and DBMemLeak.h, unused. 2013-05-21 22:51:19 -07:00
Arthur Ice cdc7b2a000 weird #ifdef pattern, reorganized and cleaned it up. easier to understand now. 2013-05-21 00:36:34 -07:00
Arthur Ice a7084b4d6c reorganized includes to allow for consolidation and cleanup. 2013-05-21 00:36:34 -07:00
Arthur Ice 64212176ec removed unneeded defines. snprintf and friends are used within StringUtil.h 2013-05-21 00:36:34 -07:00
Arthur Ice 70eb226fea changed from using a preset char buffer to string. 2013-05-21 00:36:34 -07:00
Arthur Ice c18d868d03 set many pointers to nullptr instead of 0. 2013-05-21 00:36:34 -07:00
Arthur Ice 9002bfb9a0 corrected incorrect use of StringFormat and did basic indenting fix. 2013-05-21 00:36:00 -07:00
Arthur Ice 26143750f3 removed visual studio 5,6,7 specific code except in tinyxml and StackWalker. 2013-05-20 22:40:10 -07:00
Arthur Ice 3c11f8f26b simplified the includes to be a bit clearer. 2013-05-20 22:20:01 -07:00
Arthur Ice dcec112b91 reordering includes to make it easier to simplify. 2013-05-20 22:17:56 -07:00
Arthur Ice 7b0de551e1 removed char buffer in 'UpdateWindowTitle" 2013-05-20 22:15:33 -07:00
Arthur Ice d41331d948 Apparently the original implementation from facebook was incorrect.
Fixed it, sadly this does mean we need to call vsnprintf twice.
Once to find out the size involved, a second time to apply.
2013-05-20 17:51:08 -07:00
Tabasco 1e5d6b0e34 Chat filter tests 2013-05-20 16:24:10 -05:00
KimLS 1363d5d209 Lua fixes, need to get perl working again D= 2013-05-19 23:39:18 -07:00
Arthur Ice f1a487f606 Merge branch 'master' into StringFormatting.
Cleaned up the problems. Tested on Linux. Still need to test on windows.

Conflicts:
	common/CMakeLists.txt
	common/MiscFunctions.cpp
	common/MiscFunctions.h
	common/debug.cpp
	world/Adventure.cpp
2013-05-19 18:56:21 -07:00
Arthur Ice fca9c1458b Merge branch 'master' of https://github.com/EQEmu/Server
Conflicts:
	common/debug.cpp
	common/debug.h
	zone/PlayerCorpse.cpp
	zone/beacon.cpp
	zone/client.cpp
	zone/net.cpp
	zone/tribute.cpp
2013-05-19 16:19:22 -07:00
KimLS 69bad31019 Cleanup of some lua code, initial work on encounter_quests 2013-05-19 12:13:44 -07:00
KimLS 17954dd8fe Exported a ton of functions to mob 2013-05-18 14:42:54 -07:00
Tabasco 7b21e3be72 Added server man quest events and command parsing. 2013-05-18 11:21:19 -05:00
KimLS 7adcf6d3e5 Some quest item and spell work, took out that stupid multiquesting code -> use your brains that's completely doable entirely in quests even perl 2013-05-17 17:10:38 -07:00
KimLS bec6acc01e Hatelist will now use a std::list so i can avoid a list copy when exporting it to quests. Cause frankly two copies was absurd 2013-05-17 10:48:59 -07:00
root 1b9647f57e Updated mod_functions with DC examples 2013-05-17 12:27:18 -05:00
root 2d1805c983 Mod function updates - better documentation 2013-05-17 12:20:49 -05:00
KimLS 1f265af1e7 Hate list stuff, need to make it more efficient 2013-05-17 09:49:02 -07:00
KimLS 3ddc61420b Added id to spells so i can export them to lua correctly. Also made the lua_classes less messy by having them all derive from Lua_Ptr instead of reimplementing functionality 2013-05-16 23:24:47 -07:00
KimLS b10de6f4e7 More work on lua parser - gonna get all events firing correctly by end of week also put all arguments into an event table object 2013-05-16 15:35:55 -07:00
Kemmler 7185ff25be Merge pull request #4 from EQEmu/master
Sync 2013-05-16
2013-05-16 05:11:13 -07:00
KimLS f2e0f9cca5 Changed a bunch of event names, made event_death returning more seamless and fixed up trading quests to have them always face target outside the parser 2013-05-15 18:43:06 -07:00
josheb 55c66022eb Merge pull request #6 from EQEmu/master
sync
2013-05-15 17:00:08 -07:00
KimLS b26df187e6 Merge from master terrible 2013-05-15 16:01:13 -07:00
KimLS 312100e1c6 Azone fix for new compilers and possible fix for x64 2013-05-15 14:37:30 -07:00
j883376 f51f6e00c4 Add install paths to CMakeLists 2013-05-15 17:04:08 -04:00
KimLS 9e13a2271c Merge conflicts 2013-05-15 13:22:46 -07:00
KimLS 6887ae18ae Merge branch 'master' into lua 2013-05-15 13:07:30 -07:00
KimLS 2336aa0e4f Changed quests/templates to quests/global. Changed default location for plugins to quests/plugins instead of quests. Added a single interpreter for lua instead of multiple ones. 2013-05-15 13:00:46 -07:00
KimLS 3cc1065873 more lua, gonna work on single interpreter soon 2013-05-14 19:05:49 -07:00
KimLS 38521e0009 Lua - basic npc quests work and i need a damned break for a bit 2013-05-13 21:56:42 -07:00
KimLS 20fc585b5e Cleaned up lua glue macro a bit 2013-05-13 14:40:15 -07:00
KimLS 7b23c8dc75 Working on last of Mob:: that can be implemented atm, added safety checks to the lua functions that will be optional later in dev mode. Also changed quest return types to integers instead of doubles as that was non-intuitive 2013-05-13 14:29:50 -07:00
Kemmler b0fb8aa4be Merge pull request #3 from EQEmu/master
Sync 2013-05-12
2013-05-12 20:00:28 -07:00
josheb b9a32185d7 Merge pull request #60 from josheb/master
CHA scribe logic fix.
2013-05-12 19:44:07 -07:00
root 0f880177e4 Merge branch 'master' of https://github.com/josheb/Server 2013-05-12 21:36:13 -05:00
root 7683252896 CHA scribe rule logic fix 2013-05-12 21:35:21 -05:00
Kemmler ca9a1de44c Merge pull request #2 from EQEmu/master
Sync 2013-05-11
2013-05-11 21:49:12 -07:00
KimLS 2445576ae8 Merge branch 'master' into lua 2013-05-11 20:35:49 -07:00
KimLS 7648f071f1 More lua work - more mob implementation 2013-05-11 20:34:04 -07:00
KimLS 60c93595f5 Missed a file save 2013-05-11 16:39:22 -07:00
KimLS 70998d25e3 More lua work - changed how i get return values off the stack and do calls 2013-05-11 16:37:03 -07:00
KimLS fa908040ca Lua work on api - entity and mob, lots more to go 2013-05-11 13:51:57 -07:00
Michael Cook 73a4e87379 FreeBSD support and clean up of unnecessary ifdef FREEBSD 2013-05-11 14:32:14 -04:00
josheb 3a31ad55fb Merge pull request #5 from EQEmu/master
sync
2013-05-11 07:03:50 -07:00
KimLS d1f7935ee2 ...trying out boost with luabind 2013-05-11 01:29:58 -07:00
Arthur Ice b19755a313 For windows compile, moved definve of va_copy 2013-05-11 00:46:46 -07:00
Arthur Ice 9a139a7604 missed two string conversion functions. Moved them to StringUtil 2013-05-11 00:17:02 -07:00
Arthur Ice 373ff66240 moved string functions from MiscFunctions to StringUtil 2013-05-11 00:05:11 -07:00
Arthur Ice babd3949f6 Added StringUtil h/cpp which contains StringFormat 2013-05-10 23:18:00 -07:00
Arthur Ice 3521472942 Merge branch 'master' of https://github.com/EQEmu/Server 2013-05-10 22:55:15 -07:00
KimLS dc045591e4 Lua work - loading works, I think checking for sub works. Calling subs is in the beginning stages and binding is starting 2013-05-10 20:13:35 -07:00
Uleat 9ea71dd94f Merge pull request #58 from EQEmu/botproc
-- Added Bot primary weapon proc (secondary and ranged already exist)
2013-05-10 19:38:14 -07:00
Uleat 7a4cac84ac -- Added missing wrapper to bot update message
-- Added notes to AESpell() update
2013-05-10 22:24:56 -04:00
KimLS 43d0350870 Cleanup perl parsers 2013-05-09 21:25:50 -07:00
Uleat c98c115cb6 -- Added Bot primary weapon proc (secondary and ranged already exist)
-- Added Bard Bot Instrumentation bonuses
-- Added checks to avoid AE Buff casting on enemy mobs
-- Fixed a few typos in 'Vah Shir'-related code
2013-05-09 20:57:02 -04:00
KimLS 0e4ac63b6b Perl parser works, still needs a little cleanup 2013-05-09 14:52:20 -07:00
j883376 4bdd8b2502 Change space indentation to tabs 2013-05-09 11:37:51 -04:00
j883376 ffcff4aea1 Remove trailing whitespace 2013-05-09 11:13:16 -04:00
josheb 56b15f558c Merge pull request #4 from EQEmu/master
sync
2013-05-09 06:19:29 -07:00
af4t 6ea9c9218d Merge branch 'master' of git://github.com/EQEmu/Server 2013-05-09 09:07:16 -04:00
KimLS b6c0e7c302 perl changes 2013-05-09 03:22:56 -07:00
KimLS bdcb9d0c00 Merge branch 'master' into lua 2013-05-08 21:04:02 -07:00
KimLS 7a93966158 VS2012 fix + return 0 fix 2013-05-08 21:03:35 -07:00
KimLS b8adbee4ee Parser stuff, fix for GetSpawnKillCount + item_tick 2013-05-08 21:01:15 -07:00
KimLS feae79b417 Merge from master 2013-05-08 20:22:40 -07:00
KimLS bcf9546b2d Partial perl parser rewrite, want to make it cleaner and have it match the interface 2013-05-08 20:18:39 -07:00
Arthur Ice 273cb928bf removed using namespace std 2013-05-08 18:13:33 -07:00
Arthur Ice 7735639e57 Merge branch 'c_11_conversion' of https://github.com/addtheice/Server 2013-05-08 17:40:04 -07:00
Arthur Ice 23c524812d Removed the _MSC_VER special cases for Visual Studio 2008 and lower.
We no longer support 2008 and lower so these defines will never be used.
2013-05-08 17:09:13 -07:00
Arthur Ice c6ca89907c Converted a lot of the char[] stuff internally into std:string
in addition I switched over to <string> rather than <string.h>
2013-05-08 17:09:13 -07:00
Kemmler 87a75c6100 Merge pull request #1 from EQEmu/master
Sync 2013-05-08
2013-05-08 14:22:30 -07:00
mackal f6100ed834 Fixed NPC::GetScore and XS_NPC_GetScore 2013-05-08 17:07:49 -04:00
Derision 21a9434f89 Changed dummy strings written into the TaskSelector packet from nullptr to ABCD since the packet size calculation was based on the strings being 4 characters long. 2013-05-08 20:02:55 +01:00
josheb ea6e239d58 Merge pull request #54 from af4t/master
VS2010 compatibility adjusts
2013-05-08 05:46:49 -07:00
af4t 4ee4992330 Merge branch 'master' of git://github.com/EQEmu/Server 2013-05-08 06:07:11 -04:00
Michael Cook 059ecdb50b Fix NULL to nullptr for SQL queries take 2 2013-05-07 18:20:09 -04:00
Michael Cook 0838d4507a Fix NULL to nullptr for SQL queries 2013-05-07 17:41:05 -04:00
af4t 5cda797531 VS2010 compatibility 2013-05-07 15:19:27 -04:00
josheb 308a21e0e2 Merge pull request #51 from josheb/master
Quest events and customizations
2013-05-07 05:44:07 -07:00
tabasco a0a92587b4 Fixing some regressions 2013-05-06 16:24:44 -05:00
josheb 8e49ab9179 Merge pull request #3 from EQEmu/master
sync
2013-05-06 14:16:46 -07:00
KimLS ac1d931b5e Merge from master 2013-05-06 00:05:50 -07:00
Alex 90c7fab452 Merge pull request #50 from j883376/master
Fix Auto XTargets not clearing on death
2013-05-05 23:42:14 -07:00
Alex a4b985cd96 Merge pull request #49 from addtheice/master
NULL to nullptr
2013-05-05 23:41:47 -07:00
KimLS 6e9e81a890 Working on fixing up QuestInterface to make multiple parsers work together in harmony, need to fix up Embperl parser next 2013-05-05 23:36:15 -07:00
Arthur Ice d7dff7d7a6 Removed the _MSC_VER special cases for Visual Studio 2008 and lower.
We no longer support 2008 and lower so these defines will never be used.
2013-05-05 16:58:16 -07:00
Arthur Ice 37b7a49faf Converted a lot of the char[] stuff internally into std:string
in addition I switched over to <string> rather than <string.h>
2013-05-05 16:40:03 -07:00
Tabasco 05d7c12d38 Various customizations from DungeonCrawl 2013-05-05 18:20:22 -05:00
Tabasco f983d19e01 Removed my bookmark comments and cleaned up itemtick for cases where there are no tick items. 2013-05-05 18:04:22 -05:00
j883376 4a0749f811 Change NULL to nullptr in RemoveAutoXTargets() 2013-05-05 18:51:20 -04:00
j883376 e2fd78b510 Fix Auto XTargets not clearing on death 2013-05-05 06:47:53 -04:00
Arthur Ice 7560b6b0a7 NULL to nullptr 2013-05-04 18:06:58 -07:00
josheb 824b101831 Merge pull request #2 from EQEmu/master
sync
2013-05-04 07:30:46 -07:00
Derision e1c2657b11 NULL check in Merc::CalcItemBonuses 2013-05-03 09:36:16 +01:00
KimLS d3588d2c95 PERL ON BY DEFAULT - THANKS DALAYA 2013-05-02 23:24:52 -07:00
KimLS c5c945f0c3 Make perl truely optional (Dalaya) 2013-05-02 23:21:04 -07:00
Derision 022713996a Changed return type of CRC16 to uint16 2013-04-28 19:09:48 +01:00
PiB d2c7f23ec9 Implement CRC16 using CRC32. 2013-04-28 18:56:19 +01:00
Derision 232d1e2ca8 Verify minimum size of OP_Packet, OP_Fragment and OP_OutOfOrderAck 2013-04-27 16:22:29 +01:00
Derision 401e897019 Verify OP_Ack size & fix crash in BasePacket::build_raw_header_dump due to uninitialised timestamp 2013-04-27 15:45:24 +01:00
Derision 61f7009378 EQExtractor2 SQL gen support for current client. 2013-04-25 19:04:33 +01:00
josheb 43b91b5938 Merge pull request #1 from EQEmu/master
Sync
2013-04-25 05:34:17 -07:00
badcaptain e2f25d1c92 Fixed a couple of merc stat issues and a few bot aggro issues, removed unneeded bot pet AI. 2013-04-25 00:42:52 -04:00
Tabasco 56490400ca Dungeon Crawl custom code merge
Added numerous modding hooks.
Added rules:
	Character:KeepLevelOverMax - Don't delevel a character if they are found to be over max level rule.
	Spells:UseCHAScribeHack - Optionally omit spells with CHA in effect12 when using scribespells and traindiscs
	Combat:MonkACBonusWeight - Adjust the weight threshold for monk AC bonus
	Combat:ClientStunLevel - Adjust the level clients kicks and bashes start to roll for stuns
	Combat;QuiverWRHasteDiv - Adjust the divisor applied to weight reduction for haste calcs
	Combat:UseArcheryBonusRoll - Make archery stationary bonus a roll
	Combat:ArcheryBonusChance - Archery stationary bonus chance

Added account flags and associated perl wrappers
Added EVENT_ITEM_TICK for interactive items
Added EVENT_DUEL_WIN and EVENT_DUEL_LOSE, which exports $enemyname and $enemyid
Added timer and interval to console worldshutdown command
Added EQW interface for worldshutdown and server-wide messages
2013-04-24 15:58:51 -05:00
Derision b15cb08f54 EQExtractor2 update. 2013-04-24 19:31:13 +01:00
Derision 9b015a2975 Merge pull request #48 from addtheice/master
Cleaned up Packet Handling in world/Client
2013-04-23 13:16:25 -07:00
Arthur Dene Ice b09a3840eb Turn HandleZoneChangePacket into method. 2013-04-22 23:22:13 -07:00
Arthur Dene Ice 495510a02e Reorganized handling of Packets to be a bit cleaner. 2013-04-22 23:18:40 -07:00
Arthur Dene Ice ea606ef80d Turn DeleteCharacterPacket handling into a method. 2013-04-22 23:14:00 -07:00
Arthur Dene Ice 27493c3d75 Turn EnterWorldPacket handling into a method. 2013-04-22 23:10:57 -07:00
Arthur Dene Ice cc07d511a5 Turn CharacterCreatePacket handling into a method. 2013-04-22 23:00:44 -07:00
Arthur Dene Ice 5b3ec4fb7c Turn CharacterCreateRequestPacket handling into a method. 2013-04-22 22:56:55 -07:00
Arthur Dene Ice 18da8fe44d Turn GenerateRandomNamePacket handling into a method. 2013-04-22 22:52:29 -07:00
Arthur Dene Ice 211248b50e Turn SendLoginInfoPacket handling into a method. 2013-04-22 22:47:19 -07:00
Arthur Dene Ice 969f0c535e Turn NameApprovalPacket handling into a method. 2013-04-22 22:44:29 -07:00
JJ a7ce66856b Fix rare case where heals from buffs could be negative. 2013-04-20 14:04:08 -04:00
Derision 3b42f295d6 Moved entity_list.Clear() prior to destruction of Perl objects in zone shutdown 2013-04-12 19:20:43 +01:00
mackal b8febdd440 Realized there was a better way to do the DB entries for salvage, so I changed the script.
Run the optional 2013_04_09_SalvageCleanOld.sql if you ran the old script.
2013-04-09 14:50:51 -04:00
mackal f8795bcd72 Implemented Salvage AA.
Added a new coloumn to tradeskill_recipe_entires called salvagecount that works much in the same way to fail/success/componentcount
The code will default to the component list if nothing is found with a salvagecount
New script: generate_salvage.py will generate the entries for recipes with a failcount (make sure your config is vaild XML as well, it complains if it isn't)
2013-04-08 22:33:19 -04:00
mackal 53301289f5 Merge branch 'salvage' 2013-04-08 17:30:22 -04:00
mackal 51896050ed Fix XML Type Declaration in example configs 2013-04-08 17:20:03 -04:00
mackal 81ca7a1bfd More work on salvage, added some extra checks and won't return stacks of items 2013-04-08 14:16:08 -04:00
mackal 91c817d9dd Work on implementing salvage 2013-04-07 22:38:43 -04:00
JJ 88b9f96b91 Attempting manual merge for Nature's Bounty 2013-04-06 08:23:09 -04:00
JJ b2d5ad6904 Merge pull request #46 from mackal/pet_fixes_again
Switched rest of pet messages to MT_PetResponse
2013-04-05 17:16:19 -07:00
mackal 20f086dc37 Switched rest of pet messages to MT_PetResponse
Overloaded Mob::Say_StringID with a version that takes a message type
2013-04-03 16:09:44 -04:00
badcaptain 6fa93f243f Merged from Master & changelog. 2013-04-02 19:17:28 -04:00
badcaptain 15e31d1c03 Merge branch 'master' of https://github.com/EQEmu/Server 2013-04-02 19:10:18 -04:00
badcaptain a787a7ce72 Fixed Merc lack of use of heal over time spells (causing excessive healing), fixed pet mitigation/AC issues. 2013-04-02 19:09:32 -04:00
JJ 989d132423 Merge pull request #45 from mackal/aa_fix
Bards can now use instant cast AAs while singing (Fading Memories, Boast...
2013-04-01 15:49:19 -07:00
KimLS 757fc01b78 Patch for:
-Perl blessing of exported variables is causing the SVs to be overwritten but never freed by the Perl GC.  I'm not sure if this is a feature or a bug in Perl as the documentation sucks.

Addressed by setting the blessed SVs in question to be undefined at the end of every script.  Caused a noticeable drop in memory for zones with a lot of quest events firing but it's probably not perfect.
2013-04-01 14:23:54 -07:00
mackal 353d7cede0 Bards can now use instant cast AAs while singing (Fading Memories, Boastful Bellow)
AA reuse timers now start before the spell is cast and reset upon failure or canceling
2013-04-01 17:19:45 -04:00
Derision fb0add070b Merge pull request #43 from mackal/pet_fixes
Fix pet message to use StringIDs, most should be correct related to pet ...
2013-03-31 04:06:16 -07:00
mackal 96b42ed86f Fix pet message to use StringIDs, most should be correct related to pet "saying" or just the client getting a message
Added the pet taunting message
2013-03-30 22:57:20 -04:00
JJ 2dde4dce12 Merge pull request #42 from SecretsOTheP/master
Potential fix for a Merc deconstructor crash.
2013-03-26 18:15:50 -07:00
SecretsOTheP c7ff207017 Made Merc::AddMercToGroup handle cleaning up old groups as opposed to doing it in each location before AddMercToGroup. This should fix cases where the Merc's owner is invalid and being referenced, which causes the crash located in:
http://www.eqemulator.org/forums/showthread.php?t=36670&page=2
2013-03-25 13:07:58 -04:00
SecretsOTheP 23820a369e Moved around some data in Mercs to help prevent another crash... dunno if it actually will fix it but it can't hurt >_< 2013-03-24 18:08:03 -04:00
JJ 24d4eaf65d Merge pull request #41 from SecretsOTheP/master
Merc Group Crash Fix
2013-03-24 11:56:06 -07:00
SecretsOTheP e0b05e573e Merc group/depop crash fixes. 2013-03-24 14:31:03 -04:00
JJ e2b9efaf49 Fixed SQL 2013-03-24 08:36:53 -04:00
JJ 349eb371c6 Merge pull request #40 from af4t/master
Fix typos in utils/sql/git/required/2013_03_23_Escape_FadingMemories.sql
2013-03-24 05:20:29 -07:00
af4t afe3ba40cf Fix typos 2013-03-24 08:14:50 -04:00
Alex 5e618a1ca4 Merge pull request #39 from mackal/Fade_Escape_Fix
Fixed and cleaned up Client::Escape()
2013-03-24 01:13:54 -07:00
Alex d011332647 Merge pull request #38 from SecretsOTheP/master
Merc Fixes Again
2013-03-24 01:13:14 -07:00
SecretsOTheP bc73e9c4e3 Whoops. Fixed a small change I did. 2013-03-24 04:02:47 -04:00
SecretsOTheP e609ec1df6 Fix for a crash issue related to groups that both PEQ and Armm reported on the forums. 2013-03-24 04:01:49 -04:00
mackal 2073ca8d38 Fixed and cleaned up Client::Escape()
Fixed SE_FadingMemories to use Client::Escape()
Rogue AA Escape now uses a spell instead of AA Action
Bard AA Fading Memories now only uses the AA Action to eat mana
2013-03-23 18:34:06 -04:00
SecretsOTheP a6f2c1be8a Syntax error, better place for entity list removal 2013-03-23 10:13:29 -04:00
SecretsOTheP 18e9714273 Another safeguard against a dangling pointer. 2013-03-23 10:10:03 -04:00
SecretsOTheP fa18991917 Added a few checks to resolve dangling pointers involving Mercs. Similar to the AIYellForHelp crash fixed years ago by Rogean. 2013-03-23 10:04:49 -04:00
SecretsOTheP b0b342a020 Merge branch 'master' of https://github.com/SecretsOTheP/Server
Conflicts:
	common/patches/RoF.cpp
2013-03-23 05:05:16 -04:00
SecretsOTheP 8e604fd3db Merge branch 'master' of https://github.com/EQEmu/Server
Conflicts:
	zone/client_packet.cpp
	zone/merc.cpp
	zone/npc.cpp
2013-03-23 05:02:27 -04:00
SecretsOTheP abaad22eb4 -Merc upkeep timers fixed to display properly. They now persist through zones as well as save to the database properly.
-Merc unsuspend timers should now be more reliable across zone shutdown.
2013-03-23 04:58:03 -04:00
JJ ac040b5197 Added some pointer checks as discussed in issue #36 2013-03-22 21:48:57 -04:00
badcaptain 9b1a18d9a3 Merge branch 'master' of https://github.com/EQEmu/Server
Conflicts:
	changelog.txt
2013-03-22 00:07:22 -04:00
badcaptain a20c7735e8 Fixed merc buffing bugs, added checks before dismissing merc to prevent possible bugged mercs, merged in Secret's merc memory leak fixes. 2013-03-22 00:03:50 -04:00
Derision c94822a2a1 Merge pull request #37 from mackal/stacking_SE_Limits
Fixed stacking issues with SE_Limit* (ex. Unholy Aura Discipline and Aur...
2013-03-21 13:13:14 -07:00
SecretsOTheP 2124b63982 -Fixed a memleak in inviting mercs to group.
-Fixed a duplicate merc in window bug.
2013-03-21 00:40:59 -04:00
mackal 886c7bf634 Fixed stacking issues with SE_Limit* (ex. Unholy Aura Discipline and Aura of Reverence) 2013-03-20 23:29:00 -04:00
SecretsOTheP 56825e9ed0 Two crash fixes reported on the forums are hopefully fixed. 2013-03-20 10:46:09 -04:00
SecretsOTheP 925ba2199e Whoops, forgot CMakeLists.txt 2013-03-20 07:19:20 -04:00
SecretsOTheP fd8650b8a0 Merge branch 'master' of https://github.com/SecretsOTheP/Server 2013-03-20 04:25:34 -04:00
SecretsOTheP 549455b3df Merc message removed.
VLD removed, oops.
2013-03-20 04:24:36 -04:00
SecretsOTheP f90a5b5b71 Merc message removed. 2013-03-20 04:02:33 -04:00
SecretsOTheP 5c76297e5f Merge branch 'master' of https://github.com/EQEmu/Server 2013-03-20 04:01:44 -04:00
SecretsOTheP cabf8631d4 Fixed mercenary memleaks in AI_Start and Unsuspend. 2013-03-20 04:00:08 -04:00
Derision 6ae8fbc0e4 Initialised some data in Mob/Merc constructors to stop valgrind complaining. 2013-03-19 20:44:22 +00:00
Derision f32a277643 Fixed memory leak in OP_VeteranRewardsAvailable 2013-03-19 19:22:16 +00:00
badcaptain 09df77b56e Changelog fix. 2013-03-19 01:03:15 -04:00
badcaptain f5e58e0125 Merge branch 'master' of https://github.com/EQEmu/Server into Mercs
Conflicts:
	changelog.txt
2013-03-19 00:57:15 -04:00
badcaptain 660ab53476 Fixed zone crash due to merc focus effects & tribute, merc aggro issues when client in melee range, spell recast timers. Added melee DPS spells/disciplines & support. 2013-03-19 00:53:01 -04:00
Derision 5c9f2c0d50 Fixed a couple of memory leaks. 2013-03-18 21:09:23 +00:00
Derision d036afee5b Fixed missing version parameter in DB select in GetZoneWeather. 2013-03-17 15:52:48 +00:00
SecretsOTheP 4ab7786828 Merge branch 'master' of https://github.com/EQEmu/Server
Conflicts:
	zone/client_packet.cpp
2013-03-17 10:14:25 -04:00
Derision 981cabe857 Fixed a couple of merc memory leaks and removed some commented out DumpPacket calls. 2013-03-17 13:52:43 +00:00
SecretsOTheP 8eef122cec Forgot changelog :x 2013-03-17 13:01:54 +00:00
SecretsOTheP 1dc1655891 Hopefully fixed that pesky merc memleak and cleaned up mercs a tad. 2013-03-17 13:01:54 +00:00
SecretsOTheP 0bc942f4d5 Test 2013-03-17 13:01:53 +00:00
SecretsOTheP 9fbf9abd47 Forgot changelog :x 2013-03-17 06:20:12 -04:00
SecretsOTheP b8170df498 Hopefully fixed that pesky merc memleak and cleaned up mercs a tad. 2013-03-17 06:18:32 -04:00
Derision d76a8bd34a EQExtractor2: Added SQL generation support for current Live client decoder. 2013-03-17 10:09:13 +00:00
SecretsOTheP 021faf68b3 Merge branch 'master' of https://github.com/EQEmu/Server 2013-03-17 04:52:52 -04:00
Derision 7c264ad097 EQExtractor2 update. 2013-03-16 19:56:09 +00:00
Derision 810fdf3cca Resurrection - Fix for RoF + fixed a couple of memory leaks. 2013-03-15 19:37:29 +00:00
SecretsOTheP c301b30c3a Merge branch 'master' of https://github.com/EQEmu/Server
Conflicts:
	zone/client_packet.cpp
2013-03-15 03:32:43 -04:00
SecretsOTheP 735b4181fa Test 2013-03-15 03:27:45 -04:00
badcaptain a14fecaf78 Forgot to remove debugging. 2013-03-14 23:13:49 -04:00
badcaptain e12b06a9ad Merge branch 'master' of https://github.com/EQEmu/Server 2013-03-14 23:03:39 -04:00
badcaptain 9a82875ad4 Forgot changelog. 2013-03-14 22:56:45 -04:00
JJ 0b0ee921a5 Fix for hatelist random missing last member on hatelist. 2013-03-14 20:42:02 -04:00
badcaptain 7109a40637 Merge branch 'master' of https://github.com/EQEmu/Server 2013-03-14 20:03:48 -04:00
badcaptain 0a805feeec Fixed Merc spell recast timers, changed how Mercs add mobs to their hate lists (should prevent IsEngaged() issues), initial Caster DPS Merc spell casting AI, initial Merc stance implementation, Mercs now suspend when their owner dies to prevent them being bugged (until it can be fixed), added 2 seconds between spell casts to be live-like. 2013-03-14 19:51:29 -04:00
Derision 9fdb6862f8 Updated comment in Handle_OP_ItemPreview 2013-03-10 20:41:09 +00:00
Derision e53ae5f6d5 More compiler warning fixes. 2013-03-10 18:55:18 +00:00
Derision 0ad1044b2e Added some error logging into ZoneDatabase::NPCSpawnDB for #npcspawn create 2013-03-09 20:13:11 +00:00
Derision 64c53fe37b Merge pull request #29 from addtheice/master
consts on char*'s to remove the deprecation of const string to char* warning
2013-03-09 11:55:11 -08:00
Arthur Ice faa93c3739 Added some consts to remove 'deprecated string to char*' warnings. 2013-03-09 10:52:25 -08:00
Derision 0e6272e6d8 Removed _log message from zone/CatchSignal on Linux as it can deadlock on shutdown if another signal is received while the _log call is being processed. 2013-03-09 13:31:54 +00:00
Derision c363261d00 Fix from Zaela_S to stop mobs aggroing on dead players when using RespawnFromHover. 2013-03-09 13:18:36 +00:00
KimLS a2500ff814 Fix for DBCore crash 2013-03-08 18:07:28 -08:00
JJ 2af6e8cd16 Merge pull request #28 from af4t/master
Melee tomes named "Skill:  ", again
2013-03-08 08:42:54 -08:00
af4t eb1e88b38c Reword blurbs in changelog.txt. 2013-03-07 23:33:21 -05:00
af4t c81549a441 Melee tomes named "Skill: ...": had overlooked learn-by-right-click, updated. 2013-03-07 09:42:16 -05:00
KimLS adf42c8750 Changed some stuff to keep it consistent with old behavior: was seeing crashes related to ptimers on peq. 2013-03-06 11:19:44 -08:00
Alex 2ee8e17ac0 Merge pull request #27 from af4t/master
Fix NPCs aggro each other from beneficial spells
2013-03-05 23:06:52 -08:00
Alex f7469412f1 Merge pull request #23 from addtheice/master
Fixed missing include that blocked compile on linux.
2013-03-05 23:05:27 -08:00
af4t 55a72c86cf Merge branch 'master' of https://github.com/af4t/Server
Conflicts:
	zone/spells.cpp
2013-03-05 16:22:22 -05:00
af4t a80eb397d5 Stop NPCs from aggroing each other with buffs/beneficial spells. 2013-03-05 16:19:46 -05:00
af4t 7926362ab5 Stop NPCs from aggroing each other with buffs/beneficial spells. 2013-03-05 15:44:05 -05:00
Derision 7af51ff346 Merge pull request #24 from af4t/master
Forgot to update changelog.txt earlier
2013-03-04 12:56:32 -08:00
Derision c8ca362eba Few minor issues highlighted by cppcheck/valgrind. 2013-03-04 19:15:07 +00:00
af4t 4964c17abb Forgot to update changelog.txt earlier 2013-03-04 13:08:53 -05:00
Arthur Ice 0c6eee6d81 More warning clean ups (NULL to 0 on int, sprintf flags, typedef on enum) 2013-03-03 21:45:46 -08:00
Arthur Ice 950f00fae6 Fixed some warnings, like sprintf %i warnings (converted to %lu), fals vs NULL, etc 2013-03-03 16:17:06 -08:00
Arthur Ice d8628170b5 Fixed missing include that blocked compile on linux. 2013-03-03 15:26:40 -08:00
Arthur Ice 68338dace1 Merge branch 'master' of git://github.com/EQEmu/Server 2013-03-03 15:22:52 -08:00
Derision af1f87a00f Fixed uninitialised variabled tempBot in #bot stance command (cppcheck) 2013-03-03 22:26:57 +00:00
Derision 9a47e79e8e Fixed memleak in Client::Handle_OP_MercenaryDataRequest (cppcheck) 2013-03-03 22:22:04 +00:00
Derision aceaba0fb0 Fixed uninitialised mercOwner highlighted by cppcheck. 2013-03-03 22:12:14 +00:00
Arthur Ice e0887d81aa Merge branch 'master' of git://github.com/EQEmu/Server 2013-03-03 13:02:36 -08:00
Derision ff9e4e0780 Merge pull request #22 from addtheice/master
just removed a duplicate GNU License in test main
2013-03-02 12:30:26 -08:00
Arthur Ice 6a4f61d3a3 Merge branch 'master' of git://github.com/EQEmu/Server 2013-03-02 12:01:01 -08:00
Arthur Ice c8da17c664 Deleted the old and duplicated GNU license text 2013-03-02 11:58:39 -08:00
badcaptain 7c34a89ec5 Fixed Merc depop bug, added merc rest regen, fixed merc group spell casting bug where mercs would continue to try to cast group buffs on pets of caster who didn't have Pet Affinity AA. 2013-03-02 01:07:18 -05:00
Alex da4cddf1ef Update README.md 2013-03-01 16:45:10 -08:00
KimLS 9262c0895f Merge branch 'master' of https://github.com/EQEmu/Server 2013-02-28 22:33:31 -08:00
KimLS b5405c35e2 Tests fix + fix for certain factions not loading 2013-02-28 22:33:20 -08:00
Ludwig 0137a271cc Merge pull request #21 from af4t/master
Undo MAG pet targeting change.
2013-02-28 21:47:07 -08:00
badcaptain 5d8af58e57 Oops, it's not a leap year. 2013-03-01 00:34:25 -05:00
af4t c054cb3dd0 Merge branch 'master' of git://github.com/EQEmu/Server 2013-03-01 00:27:20 -05:00
af4t 8640a89323 Undo MAG pet targeting change 2013-03-01 00:23:21 -05:00
badcaptain ea72975e69 Fixed Merc duplicate save bug, focus items, spell_scale and heal_scale now work implemented, new merc equipment (with focus items), added checks during merc hire, unsuspend, & timer update for states where a merc can't be hired, unsuspended, or can't be retained due to insufficient funds, no room in group, in raid, invalid merc data, etc, and give appropriate feedback, added rules for charging of merc purchase and upkeep costs. 2013-03-01 00:01:27 -05:00
KimLS 7237c1f54c Shared Memory changelog + something with CMake to support rvalue refs 2013-02-27 16:16:20 -08:00
KimLS 92ed7e694f Merge branch 'master' into shared_mem 2013-02-26 21:29:34 -08:00
Alex ffe24cdfaa Merge pull request #19 from af4t/IHT_LT
Enhancement: Improved Harm Touch & Leech Touch
2013-02-26 21:29:01 -08:00
af4t 04dfe4512f SK AA Touch of the Wicked should reduce reuse timers for Improved Harm Touch & Leech Touch as well as regular HT. Add to aa_actions with same redux rate as regular HT 2013-02-26 09:48:36 -05:00
Alex a95205905e Merge pull request #16 from af4t/TomeFix
Melee tomes named "Skill: ..." can be handed to guildmasters and memoriz...
2013-02-26 01:09:33 -08:00
Alex 55347aeab6 Merge pull request #17 from af4t/SummonedPetTarget
Fix targeting for summoned pets in Mob::DetermineSpellTargets
2013-02-26 01:08:44 -08:00
af4t 945db17cb8 Fix targeting for summoned pets in Mob::DetermineSpellTargets 2013-02-25 10:38:03 -05:00
af4t e48d59b07b Melee tomes named "Skill: ..." can be handed to guildmasters and memorized. 2013-02-25 09:19:07 -05:00
KimLS aff4d53d7e Fix for sdrawkcab index in skill_caps 2013-02-24 22:08:10 -08:00
KimLS 5bb604248f Removed obsolete cleanipc program 2013-02-24 10:52:52 -08:00
KimLS 7e63135a3d Fix for linux ipc mutex 2013-02-24 10:51:04 -08:00
KimLS 3092286604 Fix for bad data on factions 2013-02-24 10:33:07 -08:00
KimLS d42ff6ce19 Merge branch 'master' into shared_mem 2013-02-23 22:43:24 -08:00
KimLS 26f965e251 Fix for shared memory loot: both the inconsistent tables and the not loading of tables with no items 2013-02-23 22:42:40 -08:00
Derision 34a4b2ab37 Misc fizes. 2013-02-23 23:12:10 +00:00
KimLS 9c1159837a Merge branch 'master' into shared_mem 2013-02-23 15:04:16 -08:00
KimLS 147c96970c Moved faction stuff around, removed stupid external item status stuff 2013-02-23 15:03:15 -08:00
Derision e7e1b46b36 Set #reloadlevelmods to status 255 2013-02-23 22:17:19 +00:00
Derision 299dc525d0 Set #reloadworld to 255 status 2013-02-23 22:00:43 +00:00
KimLS 5a69f41f4d Missing EOL 2013-02-23 13:48:05 -08:00
KimLS c31b2b65c1 NPC Faction lists to new shared memory scheme 2013-02-23 13:45:19 -08:00
KimLS 8937c5be86 Fix for mmf failing on linux (relies on size_ which wasn't init properly on one of the constructors, now is) 2013-02-23 01:32:05 -08:00
KimLS 54883b0795 mmf wont lock - programmer can handle that 2013-02-23 00:48:16 -08:00
KimLS 39a77a855e Stupid design choice in cppunit fixt -.- 2013-02-23 00:37:12 -08:00
KimLS 4c10d4dd2f c++11 linux compile conflicts with perl more 2013-02-23 00:07:47 -08:00
KimLS f32048808a c++11 linux compile conflicts with perl 2013-02-23 00:06:03 -08:00
KimLS 86c8b11102 IPCMutex needed to be rewritten for Linux due to an annoying limitation of posix semaphores that makes encapping them moronic 2013-02-22 23:40:16 -08:00
KimLS 8c425ff9d8 Merge branch 'master' into shared_mem 2013-02-22 22:36:30 -08:00
KimLS 9eaa98675b Shared Memory Loot works 2013-02-22 18:25:17 -08:00
KimLS 6f13d0cfbc Partial work on loot tables (non-compiling) 2013-02-21 22:13:33 -08:00
KimLS 543ef3fb32 Merge branch 'master' into shared_mem 2013-02-21 08:58:53 -08:00
KimLS 3e9c2a06a3 Items in shared memory 2013-02-20 22:36:30 -08:00
KimLS 0115b18e67 Delete some pointless files 2013-02-20 15:36:36 -08:00
KimLS ef9498b03a Got rid of rules global (ugh) and gonna start work on items loading next 2013-02-20 15:35:46 -08:00
KimLS 8eb7d0aaa8 Skill caps load with new smem scheme 2013-02-20 13:54:26 -08:00
KimLS 12bde7434a Starting on skill caps today 2013-02-20 11:26:23 -08:00
KimLS 23dbd00d40 Style + compile option for rvalue-move 2013-02-19 23:06:00 -08:00
KimLS f8bae86082 Spells via shared memory work, removal of blah, general fixes 2013-02-19 22:20:30 -08:00
KimLS acecff23f4 Almost have spells loaded 2013-02-19 16:50:05 -08:00
KimLS 7ce6f4de0d More shared memory work + moved spdat from zone to common 2013-02-19 15:33:21 -08:00
KimLS 78b2385785 Merge branch 'master' into shared_mem 2013-02-19 13:38:12 -08:00
KimLS d4dbf0042e Merge branch 'master' into shared_mem 2013-02-18 19:26:11 -08:00
KimLS 0d16361a40 Working on shared memory stuff - removed some stuff dealing with older code and loading spells from the non-database 2013-02-18 19:00:07 -08:00
KimLS 70543c2b8a Merge branch 'master' into shared_mem 2013-02-18 12:40:27 -08:00
KimLS a5ad05f274 Merge branch 'master' into shared_mem 2013-02-17 22:02:45 -08:00
KimLS 53d6e4000c Unit tests + cleanup 2013-02-17 13:36:39 -08:00
KimLS a192e726d4 Merge branch 'master' into shared_mem 2013-02-17 12:32:13 -08:00
KimLS 886fe5cc31 Working on tests, not there yet, added licensing stuff 2013-02-17 12:31:18 -08:00
KimLS c734708809 MMFs + a scaled down hash set to use them with 2013-02-17 11:51:32 -08:00
KimLS 1c0f35a945 Way to miss two files KLS - doh 2013-02-17 11:35:50 -08:00
KimLS 06a3873c9b IPC mutex 2013-02-17 11:35:03 -08:00
KimLS 7a2be102aa Exception classes & required C++11 stuff from GCC(still needs to be fixed) 2013-02-17 11:27:43 -08:00
1305 changed files with 187705 additions and 86765 deletions
+16
View File
@@ -0,0 +1,16 @@
language: cpp
compiler: gcc
before_install:
- sudo apt-get update -qq
- sudo apt-get install -y libmysqlclient-dev libperl-dev libboost-dev liblua5.1-0-dev zlib1g-dev
script:
- cmake -G "Unix Makefiles" -DEQEMU_BUILD_TESTS=ON -DEQEMU_ENABLE_BOTS=ON
- make
- ./bin/tests
branches:
only: master
notifications:
email: false
irc:
channels: "irc.eqemulator.net#eqemucoders"
os: linux
+216 -30
View File
@@ -1,4 +1,36 @@
#EQEmu Cmake
#EQEmu CMake
#Variables used:
#EQEMU_DISABLE_CRT_SECURE_WARNINGS
#EQEMU_FAST_FLOATINGPOINT
#EQEMU_ENABLE_CRASH_LOGGING
#EQEMU_DISABLE_SAFESEH
#EQEMU_BUILD_MSVC_MP
#EQEMU_DEBUG_LEVEL
#EQEMU_LOG_LEVEL_STATUS
#EQEMU_LOG_LEVEL_NORMAL
#EQEMU_LOG_LEVEL_ERROR
#EQEMU_LOG_LEVEL_DEBUG
#EQEMU_LOG_LEVEL_QUEST
#EQEMU_LOG_LEVEL_COMMANDS
#EQEMU_LOG_LEVEL_CRASH
#EQEMU_STREAM_SEND_RATE
#EQEMU_STREAM_DECAY_RATE
#EQEMU_STREAM_RETRANSMIT_TIMEOUT_MUL
#EQEMU_STREAM_RETRANSMIT_TIMEOUT_MAX
#EQEMU_STREAM_AVERAGE_DELTA_MAX
#EQEMU_STREAM_RETRANSMIT_ACKED_PACKETS
#EQEMU_DEPOP_INVALIDATES_CACHE
#EQEMU_ENABLE_BOTS
#EQEMU_DISABLE_LOGSYS
#EQEMU_COMMANDS_LOGGING
#EQEMU_BUILD_SERVER
#EQEMU_BUILD_LOGIN
#EQEMU_BUILD_TESTS
#EQEMU_BUILD_PERL
#EQEMU_BUILD_LUA
#EQEMU_SANITIZE_LUA_LIBS
#EQEMU_BUILD_CLIENT_FILES
#EQEMU_MAP_DIR
#We set a fairly new version (as of 2013) because I found finding perl was a bit... buggy on older ones
#Can change this if you really want but you should upgrade!
@@ -7,9 +39,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
#FindMySQL is located here so lets make it so CMake can find it
SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/" ${CMAKE_MODULE_PATH})
#For checking includes
INCLUDE (CheckIncludeFiles)
#Our project name is EQEmu
PROJECT(EQEmu)
@@ -33,9 +62,11 @@ IF(MSVC)
IF(CMAKE_CL_64)
SET(ZLIB_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/zlib_x64")
SET(MYSQL_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/mysql_x64")
SET(LUA_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/luaj_x64")
ELSE(CMAKE_CL_64)
SET(ZLIB_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/zlib_x86")
SET(MYSQL_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/mysql_x86")
SET(LUA_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/luaj_x86")
ENDIF(CMAKE_CL_64)
#disable CRT warnings on windows cause they're annoying as shit and we use C functions everywhere
@@ -73,22 +104,35 @@ IF(MSVC)
SET(CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO} /SAFESEH:NO")
ENDIF(EQEMU_DISABLE_SAFESEH)
OPTION(EQEMU_BUILD_MSVC_MP "Enable build with multiple processes." ON)
IF(EQEMU_BUILD_MSVC_MP)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
ENDIF(EQEMU_BUILD_MSVC_MP)
#We want to compile /MT not /MD so we change that
FOREACH(flag_var CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_RELWITHDEBINFO CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_RELWITHDEBINFO)
IF(${flag_var} MATCHES "/MD")
STRING(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
ENDIF(${flag_var} MATCHES "/MD")
ENDFOREACH(flag_var)
ADD_DEFINITIONS(-DNOMINMAX)
ELSE(MSVC)
#Normally set by perl but we don't use the perl flags anymore so we set it.
ADD_DEFINITIONS(-DHAS_UNION_SEMUN)
ENDIF(MSVC)
#use stdint.h types if they exist for this platform (we have to guess otherwise)
CHECK_INCLUDE_FILES(stdint.h HAVE_STDINT_H)
IF(HAVE_STDINT_H)
ADD_DEFINITIONS(-DEQEMU_USE_STDINT)
ENDIF(HAVE_STDINT_H)
#FreeBSD support
IF(UNIX)
IF(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
ADD_DEFINITIONS(-DFREEBSD)
SET(FREEBSD TRUE)
ENDIF(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
IF(CMAKE_SYSTEM_NAME MATCHES "Darwin")
ADD_DEFINITIONS(-DDARWIN)
SET(DARWIN TRUE)
ENDIF(CMAKE_SYSTEM_NAME MATCHES "Darwin")
ENDIF(UNIX)
#debug level, 5 is default. Most people wont ever change this but it's there if you want to
SET(EQEMU_DEBUG_LEVEL 5 CACHE STRING "EQEmu debug level:
@@ -101,8 +145,106 @@ SET(EQEMU_DEBUG_LEVEL 5 CACHE STRING "EQEmu debug level:
10 - More errors than you ever wanted to see"
)
SET(EQEMU_LOG_LEVEL_STATUS 2 CACHE STRING "EQEmu logging level for [Status]:
0 - Disabled
1 - Ouput to File Enabled
2 - Output to stdout Enabled
3 - Output to File and stdout Enabled
8 - Output to stderr Enabled
9 - Output to File and stderr Enabled
11 - Output to File, stdout and stderr Enabled"
)
SET(EQEMU_LOG_LEVEL_NORMAL 3 CACHE STRING "EQEmu logging level for [Normal]:
0 - Disabled
1 - Ouput to File Enabled
2 - Output to stdout Enabled
3 - Output to File and stdout Enabled
8 - Output to stderr Enabled
9 - Output to File and stderr Enabled
11 - Output to File, stdout and stderr Enabled"
)
SET(EQEMU_LOG_LEVEL_ERROR 2 CACHE STRING "EQEmu logging level for [Error]:
0 - Disabled
1 - Ouput to File Enabled
2 - Output to stdout Enabled
3 - Output to File and stdout Enabled
8 - Output to stderr Enabled
9 - Output to File and stderr Enabled
11 - Output to File, stdout and stderr Enabled"
)
SET(EQEMU_LOG_LEVEL_DEBUG 3 CACHE STRING "EQEmu logging level for [Debug]:
0 - Disabled
1 - Ouput to File Enabled
2 - Output to stdout Enabled
3 - Output to File and stdout Enabled
8 - Output to stderr Enabled
9 - Output to File and stderr Enabled
11 - Output to File, stdout and stderr Enabled"
)
SET(EQEMU_LOG_LEVEL_QUEST 2 CACHE STRING "EQEmu logging level for [Quest]:
0 - Disabled
1 - Ouput to File Enabled
2 - Output to stdout Enabled
3 - Output to File and stdout Enabled
8 - Output to stderr Enabled
9 - Output to File and stderr Enabled
11 - Output to File, stdout and stderr Enabled"
)
SET(EQEMU_LOG_LEVEL_COMMANDS 1 CACHE STRING "EQEmu logging level for [Commands]:
0 - Disabled
1 - Ouput to File Enabled
2 - Output to stdout Enabled
3 - Output to File and stdout Enabled
8 - Output to stderr Enabled
9 - Output to File and stderr Enabled
11 - Output to File, stdout and stderr Enabled"
)
SET(EQEMU_LOG_LEVEL_CRASH 3 CACHE STRING "EQEmu logging level for [Crash]:
0 - Disabled
1 - Ouput to File Enabled
2 - Output to stdout Enabled
3 - Output to File and stdout Enabled
8 - Output to stderr Enabled
9 - Output to File and stderr Enabled
11 - Output to File, stdout and stderr Enabled"
)
MARK_AS_ADVANCED(EQEMU_LOG_LEVEL_STATUS EQEMU_LOG_LEVEL_NORMAL EQEMU_LOG_LEVEL_ERROR EQEMU_LOG_LEVEL_DEBUG EQEMU_LOG_LEVEL_QUEST EQEMU_LOG_LEVEL_COMMANDS EQEMU_LOG_LEVEL_CRASH)
SET(EQEMU_STREAM_SEND_RATE 1048576 CACHE STRING "Advanced: Base amount of data stream can send before throttle.")
SET(EQEMU_STREAM_DECAY_RATE 78642 CACHE STRING "Advanced: Base amount of data stream recovers per tic.")
SET(EQEMU_STREAM_RETRANSMIT_TIMEOUT_MUL 3.0 CACHE STRING "Advanced: Multiplier on retransmit timeout.")
SET(EQEMU_STREAM_RETRANSMIT_TIMEOUT_MAX 5000 CACHE STRING "Advanced: Max in ms for retransmit timeout timer.")
SET(EQEMU_STREAM_AVERAGE_DELTA_MAX 2500 CACHE STRING "Advanced: The maximum average delta in ms allowed.")
SET(EQEMU_STREAM_RETRANSMIT_ACKED_PACKETS TRUE CACHE BOOL "Advanced: Whether or not acked packets can be retransmitted")
MARK_AS_ADVANCED(EQEMU_STREAM_SEND_RATE EQEMU_STREAM_DECAY_RATE EQEMU_STREAM_RETRANSMIT_TIMEOUT_MUL EQEMU_STREAM_RETRANSMIT_TIMEOUT_MAX EQEMU_STREAM_AVERAGE_DELTA_MAX EQEMU_STREAM_RETRANSMIT_ACKED_PACKETS)
#NPC Types Cache Behavior
OPTION(EQEMU_DEPOP_INVALIDATES_CACHE "#repop invalidates the npc_types cache (will cause a larger database hit on #repop but is more convienent)." ON)
#Bots are a compile time option so on/off
OPTION(EQEMU_ENABLE_BOTS "Enable Bots" OFF)
#Disable entire _mlog system (excludes trade/command logs)
OPTION(EQEMU_DISABLE_LOGSYS "Disable Logging INI System" ON)
#Enable GM Command log system
OPTION(EQEMU_COMMANDS_LOGGING "Enable GM Command logs" ON)
IF(EQEMU_COMMANDS_LOGGING)
ADD_DEFINITIONS(-DCOMMANDS_LOGGING)
ENDIF(EQEMU_COMMANDS_LOGGING)
IF(EQEMU_DISABLE_LOGSYS)
ADD_DEFINITIONS(-DDISABLE_LOGSYS)
ENDIF(EQEMU_DISABLE_LOGSYS)
IF(EQEMU_ENABLE_BOTS)
ADD_DEFINITIONS(-DBOTS)
ENDIF(EQEMU_ENABLE_BOTS)
@@ -110,40 +252,85 @@ ENDIF(EQEMU_ENABLE_BOTS)
#What to build
OPTION(EQEMU_BUILD_SERVER "Build the game server." ON)
OPTION(EQEMU_BUILD_LOGIN "Build the login server." OFF)
OPTION(EQEMU_BUILD_AZONE "Build azone utility." OFF)
OPTION(EQEMU_BUILD_TESTS "Build utility tests." OFF)
OPTION(EQEMU_BUILD_PERL "Build Perl parser." ON)
OPTION(EQEMU_BUILD_LUA "Build Lua parser." ON)
OPTION(EQEMU_BUILD_CLIENT_FILES "Build Client Import/Export Data Programs." ON)
IF(UNIX)
#Whether to build cleanipc or not (probably a good idea if you build server)
OPTION(EQEMU_BUILD_CLEANIPC "Build cleanipc." ON)
#Use C++11 stuff, support for this is still it infancy
OPTION(EQEMU_CPP_ELEVEN "Enable C++11 extentions in g++" OFF)
IF(EQEMU_CPP_ELEVEN)
ADD_DEFINITIONS(-std=c++0x)
ENDIF(EQEMU_CPP_ELEVEN)
ENDIF(UNIX)
#C++11 stuff
IF(NOT MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
ENDIF(NOT MSVC)
#Various definitions
IF(EQEMU_BUILD_PERL)
ADD_DEFINITIONS(-DEMBPERL)
ADD_DEFINITIONS(-DEMBPERL_PLUGIN)
ENDIF(EQEMU_BUILD_PERL)
IF(EQEMU_BUILD_LUA)
ADD_DEFINITIONS(-DLUA_EQEMU)
ENDIF(EQEMU_BUILD_LUA)
SET(EQEMU_MAP_DIR "./Maps" CACHE STRING "The dir that maps, water maps, and paths are located in.")
ADD_DEFINITIONS(-DEQDEBUG=${EQEMU_DEBUG_LEVEL})
ADD_DEFINITIONS(-DSHAREMEM)
ADD_DEFINITIONS(-DINVERSEXY)
ADD_DEFINITIONS(-DFIELD_ITEMS)
ADD_DEFINITIONS(-DMAP_DIR="./Maps")
ADD_DEFINITIONS(-DMAP_DIR="${EQEMU_MAP_DIR}")
ADD_DEFINITIONS(-DRATEBASE=${EQEMU_STREAM_SEND_RATE})
ADD_DEFINITIONS(-DDECAYBASE=${EQEMU_STREAM_DECAY_RATE})
ADD_DEFINITIONS(-DRETRANSMIT_TIMEOUT_MULT=${EQEMU_STREAM_RETRANSMIT_TIMEOUT_MUL})
ADD_DEFINITIONS(-DRETRANSMIT_TIMEOUT_MAX=${EQEMU_STREAM_RETRANSMIT_TIMEOUT_MAX})
ADD_DEFINITIONS(-DAVERAGE_DELTA_MAX=${EQEMU_STREAM_AVERAGE_DELTA_MAX})
ADD_DEFINITIONS(-DLOG_LEVEL_STATUS=${EQEMU_LOG_LEVEL_STATUS})
ADD_DEFINITIONS(-DLOG_LEVEL_NORMAL=${EQEMU_LOG_LEVEL_NORMAL})
ADD_DEFINITIONS(-DLOG_LEVEL_ERROR=${EQEMU_LOG_LEVEL_ERROR})
ADD_DEFINITIONS(-DLOG_LEVEL_DEBUG=${EQEMU_LOG_LEVEL_DEBUG})
ADD_DEFINITIONS(-DLOG_LEVEL_QUEST=${EQEMU_LOG_LEVEL_QUEST})
ADD_DEFINITIONS(-DLOG_LEVEL_COMMANDS=${EQEMU_LOG_LEVEL_COMMANDS})
ADD_DEFINITIONS(-DLOG_LEVEL_CRASH=${EQEMU_LOG_LEVEL_CRASH})
IF(EQEMU_STREAM_RETRANSMIT_ACKED_PACKETS)
ADD_DEFINITIONS(-DRETRANSMIT_ACKED_PACKETS=true)
ELSE(EQEMU_STREAM_RETRANSMIT_ACKED_PACKETS)
ADD_DEFINITIONS(-DRETRANSMIT_ACKED_PACKETS=false)
ENDIF(EQEMU_STREAM_RETRANSMIT_ACKED_PACKETS)
#Find everything we need
FIND_PACKAGE(ZLIB REQUIRED)
FIND_PACKAGE(MySQL REQUIRED)
IF(EQEMU_BUILD_PERL)
FIND_PACKAGE(PerlLibs REQUIRED)
INCLUDE_DIRECTORIES("${ZLIB_INCLUDE_DIRS}" "${PERL_INCLUDE_PATH}" "${MySQL_INCLUDE_DIR}")
INCLUDE_DIRECTORIES("${PERL_INCLUDE_PATH}")
ENDIF(EQEMU_BUILD_PERL)
IF(EQEMU_BUILD_LUA)
FIND_PACKAGE(EQLua51 REQUIRED)
SET(Boost_USE_STATIC_LIBS OFF)
SET(Boost_USE_MULTITHREADED ON)
SET(Boost_USE_STATIC_RUNTIME OFF)
SET(BOOST_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/boost")
FIND_PACKAGE(Boost REQUIRED)
INCLUDE_DIRECTORIES("${LUA_INCLUDE_DIR}" "${Boost_INCLUDE_DIRS}" "luabind")
OPTION(EQEMU_SANITIZE_LUA_LIBS "Sanitize Lua Libraries (Remove OS and IO standard libraries from being able to run)." ON)
IF(EQEMU_SANITIZE_LUA_LIBS)
ADD_DEFINITIONS(-DSANITIZE_LUA_LIBS)
ENDIF(EQEMU_SANITIZE_LUA_LIBS)
ENDIF(EQEMU_BUILD_LUA)
INCLUDE_DIRECTORIES("${ZLIB_INCLUDE_DIRS}" "${MySQL_INCLUDE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/common/glm/glm")
IF(EQEMU_BUILD_LUA)
ADD_SUBDIRECTORY(luabind)
ENDIF(EQEMU_BUILD_LUA)
IF(EQEMU_BUILD_SERVER OR EQEMU_BUILD_LOGIN OR EQEMU_BUILD_TESTS)
ADD_SUBDIRECTORY(common)
ENDIF(EQEMU_BUILD_SERVER OR EQEMU_BUILD_LOGIN OR EQEMU_BUILD_TESTS)
IF(EQEMU_BUILD_SERVER)
ADD_SUBDIRECTORY(EMuShareMem)
ADD_SUBDIRECTORY(shared_memory)
ADD_SUBDIRECTORY(world)
ADD_SUBDIRECTORY(zone)
ADD_SUBDIRECTORY(ucs)
@@ -154,11 +341,10 @@ IF(EQEMU_BUILD_LOGIN)
ADD_SUBDIRECTORY(loginserver)
ENDIF(EQEMU_BUILD_LOGIN)
IF(EQEMU_BUILD_AZONE OR EQEMU_BUILD_CLEANIPC)
ADD_SUBDIRECTORY(utils)
ENDIF(EQEMU_BUILD_AZONE OR EQEMU_BUILD_CLEANIPC)
IF(EQEMU_BUILD_TESTS)
# Testing framework not quite ready for prime time.
# ADD_SUBDIRECTORY(tests)
ADD_SUBDIRECTORY(tests)
ENDIF(EQEMU_BUILD_TESTS)
IF(EQEMU_BUILD_CLIENT_FILES)
ADD_SUBDIRECTORY(client_files)
ENDIF(EQEMU_BUILD_CLIENT_FILES)
-46
View File
@@ -1,46 +0,0 @@
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
SET(sharedmem_src
DLLMain.cpp
Doors.cpp
Items.cpp
Loot.cpp
MMF.cpp
MMFMutex.cpp
NPCFactionLists.cpp
Opcodes.cpp
SkillCaps.cpp
Spells.cpp
)
SET(sharedmem_headers
Doors.h
Items.h
Loot.h
MMF.h
MMFMutex.h
NPCFactionLists.h
Opcodes.h
SkillCaps.h
Spells.h
)
SET(EQEMU_MAX_ITEMS 300000 CACHE STRING "Maxium number of items to load into memory. Make sure this is bigger than the total number of items in the server database")
SET(EQEMU_MAX_DOORS 30000 CACHE STRING "Maxium number of doors to load into memory. Make sure this is bigger than the total number of doors in the server database")
SET(EQEMU_MAX_FACTIONLIST_IDS 50000 CACHE STRING "Maxium number of FactionList IDs to load into memory. Make sure this is bigger than the total number of FactionList IDs in the server database")
ADD_DEFINITIONS(-DMMF_EQMAX_ITEMS=${EQEMU_MAX_ITEMS})
ADD_DEFINITIONS(-DMMF_MAX_Door_ID=${EQEMU_MAX_DOORS})
ADD_DEFINITIONS(-DMMF_MAX_NPCFactionList_ID=${EQEMU_MAX_FACTIONLIST_IDS})
ADD_LIBRARY(EMuShareMem SHARED ${sharedmem_src} ${sharedmem_headers})
TARGET_LINK_LIBRARIES(EMuShareMem Common)
IF(UNIX)
TARGET_LINK_LIBRARIES(EMuShareMem "dl")
TARGET_LINK_LIBRARIES(EMuShareMem "m")
TARGET_LINK_LIBRARIES(EMuShareMem "rt")
TARGET_LINK_LIBRARIES(EMuShareMem "pthread")
ENDIF(UNIX)
SET(LIBRARY_OUTPUT_PATH ../Bin)
-37
View File
@@ -1,37 +0,0 @@
/*
EMuShareMem.dll
by Quagmire
Released under GPL
This DLL's purpose it to hold a single shared copy of items, npctypes, spells, and other
stuff that's normally cached in memory, thus allowing all processes on the server to share
one copy of the data, greatly reducing the amount of RAM used.
*/
#ifdef _WINDOWS
#include <windows.h>
void CloseMemShare();
BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpReserved ) // reserved
{
// Perform actions based on the reason for calling.
switch( fdwReason )
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH: {
break;
}
case DLL_THREAD_DETACH: {
break;
}
case DLL_PROCESS_DETACH: {
break;
}
}
return TRUE; // Successful DLL_PROCESS_ATTACH.
}
#endif //WIN32
-136
View File
@@ -1,136 +0,0 @@
#include "../common/debug.h"
#ifdef _WINDOWS
#include <windows.h>
#else
#include "../common/unix.h"
#endif
#include <memory.h>
#include <iostream>
using namespace std;
#include "Doors.h"
#include "../common/timer.h"
#include "MMF.h"
MMF DoorsMMF;
const MMFDoors_Struct* MMFDoorsData = 0;
MMFDoors_Struct* MMFDoorsData_Writable = 0;
#ifdef _WINDOWS
extern "C" __declspec(dllexport) const Door* GetDoor(uint32 id) {
return pGetDoor(id);
};
extern "C" __declspec(dllexport) bool AddDoor(uint32 id, const Door* door) {
return pAddDoor(id, door);
};
extern "C" __declspec(dllexport) bool DLLLoadDoors(CALLBACK_DBLoadDoors cbDBLoadDoors, uint32 iDoorstructSize, int32* iDoorsCount, uint32* iMaxDoorID) {
return pDLLLoadDoors(cbDBLoadDoors, iDoorstructSize, iDoorsCount, iMaxDoorID);
};
#else
extern "C" const Door* GetDoor(uint32 id) {
return pGetDoor(id);
};
extern "C" bool AddDoor(uint32 id, const Door* door) {
return pAddDoor(id, door);
};
extern "C" bool DLLLoadDoors(CALLBACK_DBLoadDoors cbDBLoadDoors, uint32 iDoorstructSize, int32* iDoorsCount, uint32* iMaxDoorID) {
return pDLLLoadDoors(cbDBLoadDoors, iDoorstructSize, iDoorsCount, iMaxDoorID);
};
#endif
bool pAddDoor(uint32 id, const Door* door) {
if (!MMFDoorsData_Writable)
return false;
if (id > MMF_MAX_Door_ID || MMFDoorsData_Writable->NextFreeIndex >= MMFDoorsData_Writable->DoorCount)
return false;
if (MMFDoorsData_Writable->DoorIndex[id] != 0xFFFFFFFF)
return false;
MMFDoorsData_Writable->DoorIndex[id] = MMFDoorsData_Writable->NextFreeIndex++;
memcpy(&MMFDoorsData_Writable->Doors[MMFDoorsData_Writable->DoorIndex[id]], door, sizeof(Door));
return true;
}
bool pDLLLoadDoors(CALLBACK_DBLoadDoors cbDBLoadDoors, uint32 iDoorstructSize, int32* iDoorsCount, uint32* iMaxDoorID) {
if (iDoorstructSize != sizeof(Door)) {
cout << "Error: EMuShareMem: DLLLoadDoors: iDoorstructSize != sizeof(Door)" << endl;
cout << "Door struct has changed, EMuShareMem.dll needs to be recompiled." << endl;
return false;
}
if (*iMaxDoorID > MMF_MAX_Door_ID) {
cout << "Error: EMuShareMem: pDLLLoadDoors: iMaxDoorID > MMF_MAX_Door_ID" << endl;
cout << "You need to increase the define in Doors.h." << endl;
return false;
}
uint32 tmpMemSize = sizeof(MMFDoors_Struct) + 256 + (sizeof(Door) * (*iDoorsCount));
if (DoorsMMF.Open("EQEMuDoors", tmpMemSize)) {
if (DoorsMMF.CanWrite()) {
MMFDoorsData_Writable = (MMFDoors_Struct*) DoorsMMF.GetWriteableHandle();
if (!MMFDoorsData_Writable) {
cout << "Error: EMuShareMem: DLLLoadDoors: !MMFDoorsData_Writable" << endl;
return false;
}
memset(MMFDoorsData_Writable, 0, tmpMemSize);
for(int i=0; i<MMF_MAX_Door_ID; i++)
MMFDoorsData_Writable->DoorIndex[i] = 0xFFFFFFFF;
MMFDoorsData_Writable->MaxDoorID = *iMaxDoorID;
MMFDoorsData_Writable->DoorCount = *iDoorsCount;
// use a callback so the DB functions are done in the main exe
// this way the DLL doesnt have to open a connection to mysql
if (!cbDBLoadDoors(*iDoorsCount, *iMaxDoorID)) {
cout << "Error: EMuShareMem: DLLLoadDoors: !cbDBLoadDoors" << endl;
return false;
}
MMFDoorsData_Writable = 0;
DoorsMMF.SetLoaded();
MMFDoorsData = (const MMFDoors_Struct*) DoorsMMF.GetHandle();
if (!MMFDoorsData) {
cout << "Error: EMuShareMem: DLLLoadDoors: !MMFDoorsData (CanWrite=true)" << endl;
return false;
}
return true;
}
else {
if (!DoorsMMF.IsLoaded()) {
Timer::SetCurrentTime();
uint32 starttime = Timer::GetCurrentTime();
while ((!DoorsMMF.IsLoaded()) && ((Timer::GetCurrentTime() - starttime) < 300000)) {
Sleep(10);
Timer::SetCurrentTime();
}
if (!DoorsMMF.IsLoaded()) {
cout << "Error: EMuShareMem: DLLLoadDoors: !DoorsMMF.IsLoaded() (timeout)" << endl;
return false;
}
}
MMFDoorsData = (const MMFDoors_Struct*) DoorsMMF.GetHandle();
if (!MMFDoorsData) {
cout << "Error: EMuShareMem: DLLLoadDoors: !MMFDoorsData (CanWrite=false)" << endl;
return false;
}
*iMaxDoorID = MMFDoorsData->MaxDoorID;
*iDoorsCount = MMFDoorsData->DoorCount;
return true;
}
}
else {
cout << "Error Loading Doors: Doors.cpp: pDLLLoadDoors: ret == 0" << endl;
return false;
}
return false;
};
const Door* pGetDoor(uint32 id) {
if (MMFDoorsData == 0 || (!DoorsMMF.IsLoaded()) || id > MMF_MAX_Door_ID || MMFDoorsData->DoorIndex[id] == 0xFFFFFFFF)
return 0;
return &MMFDoorsData->Doors[MMFDoorsData->DoorIndex[id]];
}
-22
View File
@@ -1,22 +0,0 @@
#include "../common/types.h"
#include "../zone/zonedump.h"
#include "../common/EMuShareMem.h"
// MMF_MAX_Door_ID: Make sure this is bigger than the highest Door ID#
#ifndef MMF_MAX_Door_ID
#define MMF_MAX_Door_ID 30000
#endif
// MMF_MAX_Door_MEM: Maxium number of Doors to load into memory. Make sure this is bigger
// than the total number of Doors in the server's database!
struct MMFDoors_Struct {
uint32 MaxDoorID;
uint32 NextFreeIndex;
uint32 DoorCount;
uint32 DoorIndex[MMF_MAX_Door_ID+1];
Door Doors[0];
};
bool pDLLLoadDoors(CALLBACK_DBLoadDoors cbDBLoadDoors, uint32 iDoorstructSize, int32* iDoorsCount, uint32* iMaxDoorID);
bool pAddDoor(uint32 id, const Door* door);
const Door* pGetDoor(uint32 id);
-152
View File
@@ -1,152 +0,0 @@
/*
Note: Do NOT change this to load items on an as-needed basis. Since this memory is
accessed from multiple threads, you'd need mutex's all over the place if it was
ever to be modified/updated/added to. The overhead of the mutexes would be alot more
in the long run than the delay in loading.
-Quagmire
*/
#ifdef _WINDOWS
#include <winsock2.h>
#include <windows.h>
#else
#include "../common/unix.h"
#endif
#include <memory.h>
#include <iostream>
using namespace std;
#include "Items.h"
#include "../common/timer.h"
#include "MMF.h"
MMF ItemsMMF;
const MMFItems_Struct* MMFItemsData = 0;
MMFItems_Struct* MMFItemsData_Writable = 0;
DLLFUNC bool AddItem(uint32 id, const Item_Struct* item) {
if (!MMFItemsData_Writable) {
return false;
}
if (id > MMF_EQMAX_ITEMS || MMFItemsData_Writable->NextFreeIndex >= MMFItemsData_Writable->ItemCount) {
return false;
}
if (MMFItemsData_Writable->ItemIndex[id] != 0xFFFF) {
return false;
}
uint32 nextid = MMFItemsData_Writable->NextFreeIndex++;
MMFItemsData_Writable->ItemIndex[id] = nextid;
memcpy(&MMFItemsData_Writable->Items[nextid], item, sizeof(Item_Struct));
return true;
}
DLLFUNC bool DLLLoadItems(CALLBACK_DBLoadItems cbDBLoadItems, uint32 iItemStructSize, int32* iItemCount, uint32* iMaxItemID) {
if (iItemStructSize != sizeof(Item_Struct)) {
cout << "Error: EMuShareMem: DLLLoadItems: iItemStructSize != sizeof(Item_Struct)" << endl;
cout << "Item_Struct has changed, EMuShareMem.dll needs to be recompiled." << endl;
return false;
}
if (*iMaxItemID > MMF_EQMAX_ITEMS) {
cout << "Error: EMuShareMem: pDLLLoadItems: iMaxItemID > MMF_EQMAX_ITEMS" << endl;
cout << "You need to increase the define in Items.h." << endl;
return false;
}
MMFItemsData_Writable = 0;
//Allocate the shared memory for the item structures
uint32 tmpMemSize = sizeof(MMFItems_Struct) + 256 + (sizeof(Item_Struct) * (*iItemCount));
//cout << tmpMemSize << endl;
if (ItemsMMF.Open("EQEMuItems", tmpMemSize)) {
if (ItemsMMF.CanWrite()) {
MMFItemsData_Writable = (MMFItems_Struct*) ItemsMMF.GetWriteableHandle();
if (!MMFItemsData_Writable) {
cout << "Error: EMuShareMem: DLLLoadItems: !MMFItemsData_Writable" << endl;
return false;
}
memset(MMFItemsData_Writable, 0, tmpMemSize);
for(int i=0; i<MMF_EQMAX_ITEMS; i++)
MMFItemsData_Writable->ItemIndex[i] = 0xFFFF;
MMFItemsData_Writable->MaxItemID = *iMaxItemID;
MMFItemsData_Writable->ItemCount = *iItemCount;
//the writable handle has been created, do the load below after we have the
//serialization handle as well.
} else {
if (!ItemsMMF.IsLoaded()) {
Timer::SetCurrentTime();
uint32 starttime = Timer::GetCurrentTime();
while ((!ItemsMMF.IsLoaded()) && ((Timer::GetCurrentTime() - starttime) < 300000)) {
Sleep(10);
Timer::SetCurrentTime();
}
if (!ItemsMMF.IsLoaded()) {
cout << "Error: EMuShareMem: DLLLoadItems: !ItemsMMF.IsLoaded() (timeout)" << endl;
return false;
}
}
MMFItemsData = (const MMFItems_Struct*) ItemsMMF.GetHandle();
if (!MMFItemsData) {
cout << "Error: EMuShareMem: DLLLoadItems: !MMFItemsData (CanWrite=false)" << endl;
return false;
}
*iMaxItemID = MMFItemsData->MaxItemID;
*iItemCount = MMFItemsData->ItemCount;
return true;
}
} else {
cout << "Error Loading Items: Items.cpp: pDLLLoadItems: Open() == false" << endl;
return false;
}
/*
// use a callback so the DB functions are done in the main exe
// this way the DLL doesnt have to open a connection to mysql
if (!cbDBLoadItems(*iItemCount, *iMaxItemID)) {
cout << "Error: EMuShareMem: DLLLoadItems: !cbDBLoadItems" << endl;
return false;
}
*/
// use a callback so the DB functions are done in the main exe
// this way the DLL doesnt have to open a connection to mysql
if (!cbDBLoadItems(*iItemCount, *iMaxItemID)) {
cout << "Error: EMuShareMem: DLLLoadItems: !cbDBLoadItems" << endl;
return false;
}
//Now, Disable the write handle and get the read handle.
//do this for both item struct and serialization data
MMFItemsData_Writable = 0;
ItemsMMF.SetLoaded();
MMFItemsData = (const MMFItems_Struct*) ItemsMMF.GetHandle();
if (!MMFItemsData) {
cout << "Error: EMuShareMem: DLLLoadItems: !MMFItemsData (CanWrite=true)" << endl;
return false;
}
return true;
};
DLLFUNC const Item_Struct* GetItem(uint32 id) {
if (MMFItemsData == 0 || (!ItemsMMF.IsLoaded()) || id > MMF_EQMAX_ITEMS || MMFItemsData->ItemIndex[id] == 0xFFFF)
return 0;
return &MMFItemsData->Items[MMFItemsData->ItemIndex[id]];
}
DLLFUNC const Item_Struct* IterateItems(uint32* NextIndex) {
if (MMFItemsData == 0 || (!ItemsMMF.IsLoaded()) || (*NextIndex) > MMF_EQMAX_ITEMS)
return 0;
do {
if (MMFItemsData->ItemIndex[*NextIndex] != 0xFFFF)
return &MMFItemsData->Items[MMFItemsData->ItemIndex[(*NextIndex)++]];
} while (++(*NextIndex) < MMF_EQMAX_ITEMS);
return 0;
}
-23
View File
@@ -1,23 +0,0 @@
#include "../common/types.h"
#include "../common/eq_packet_structs.h"
#include "../common/EMuShareMem.h"
// MMF_EQMAX_ITEMS: Make sure this is bigger than the highest item ID#
#ifndef MMF_EQMAX_ITEMS
#define MMF_EQMAX_ITEMS 300000
#endif
// MMF_MEMMAX_ITEMS: Maxium number of items to load into memory. Make sure this is bigger
// than the total number of items in the server's database!
struct MMFItems_Struct {
uint32 MaxItemID;
uint32 NextFreeIndex;
uint32 ItemCount;
uint32 ItemIndex[MMF_EQMAX_ITEMS+1];
Item_Struct Items[0];
};
//#define MMF_MAX_ITEMS_MEMSIZE sizeof(MMFItems_Struct) + 256
-214
View File
@@ -1,214 +0,0 @@
#include "../common/debug.h"
#include <memory.h>
#include <iostream>
using namespace std;
#include "Loot.h"
#include "../common/timer.h"
#include "MMF.h"
MMF LootMMF;
const MMFLoot_Struct* MMFLootData = 0;
MMFLoot_Struct* MMFLootData_Writable = 0;
uint32* LootTable;
uint32* LootDrop;
#ifdef _WINDOWS
#define exportfunc extern "C" __declspec(dllexport)
#else
#define exportfunc extern "C"
#endif
exportfunc const LootTable_Struct* GetLootTable(uint32 id) {
return pGetLootTable(id);
};
exportfunc const LootDrop_Struct* GetLootDrop(uint32 id) {
return pGetLootDrop(id);
};
exportfunc bool AddLootTable(uint32 id, const LootTable_Struct* lts) {
return pAddLootTable(id, lts);
};
exportfunc bool AddLootDrop(uint32 id, const LootDrop_Struct* lds) {
return pAddLootDrop(id, lds);
};
exportfunc bool DLLLoadLoot(CALLBACK_DBLoadLoot cbDBLoadLoot,
uint32 iLootTableStructsize, uint32 iLootTableCount, uint32 iMaxLootTable,
uint32 iLootTableEntryStructsize, uint32 iLootTableEntryCount,
uint32 iLootDropStructsize, uint32 iLootDropCount, uint32 iMaxLootDrop,
uint32 iLootDropEntryStructsize, uint32 iLootDropEntryCount
) {
return pDLLLoadLoot(cbDBLoadLoot,
iLootTableStructsize, iLootTableCount, iMaxLootTable,
iLootTableEntryStructsize, iLootTableEntryCount,
iLootDropStructsize, iLootDropCount, iMaxLootDrop,
iLootDropEntryStructsize, iLootDropEntryCount);
};
bool pAddLootTable(uint32 id, const LootTable_Struct* lts) {
if (!MMFLootData_Writable)
return false;
if (id > MMFLootData_Writable->MaxLootTableID)
return false;
if (!LootTable || LootTable[id] != 0)
return false;
uint32 tmp = sizeof(LootTable_Struct) + (sizeof(LootTableEntries_Struct) * lts->NumEntries);
if (MMFLootData_Writable->dataindex + tmp >= MMFLootData_Writable->datamax)
return false;
LootTable[id] = MMFLootData_Writable->dataindex;
memcpy(&MMFLootData_Writable->data[MMFLootData_Writable->dataindex], lts, tmp);
MMFLootData_Writable->dataindex += tmp;
return true;
}
bool pAddLootDrop(uint32 id, const LootDrop_Struct* lds) {
if (!MMFLootData_Writable)
return false;
if (id > MMFLootData_Writable->MaxLootDropID)
return false;
if (!LootDrop || LootDrop[id] != 0)
return false;
uint32 tmp = sizeof(LootDrop_Struct) + (sizeof(LootDropEntries_Struct) * lds->NumEntries);
if (MMFLootData_Writable->dataindex + tmp >= MMFLootData_Writable->datamax)
return false;
LootDrop[id] = MMFLootData_Writable->dataindex;
memcpy(&MMFLootData_Writable->data[MMFLootData_Writable->dataindex], lds, tmp);
MMFLootData_Writable->dataindex += tmp;
return true;
}
bool pDLLLoadLoot(CALLBACK_DBLoadLoot cbDBLoadLoot,
uint32 iLootTableStructsize, uint32 iLootTableCount, uint32 iMaxLootTable,
uint32 iLootTableEntryStructsize, uint32 iLootTableEntryCount,
uint32 iLootDropStructsize, uint32 iLootDropCount, uint32 iMaxLootDrop,
uint32 iLootDropEntryStructsize, uint32 iLootDropEntryCount
) {
#if 0
cout << "iLootTableCount: " << iLootTableCount << endl;
cout << "iMaxLootTable: " << iMaxLootTable << endl;
cout << "iLootTableEntryCount: " << iLootTableEntryCount << endl;
cout << "iLootDropCount: " << iLootDropCount << endl;
cout << "iMaxLootDrop: " << iMaxLootDrop << endl;
cout << "iLootDropEntryCount: " << iLootDropEntryCount << endl;
#endif
if (iLootTableStructsize != sizeof(LootTable_Struct)) {
cout << "Error: EMuShareMem: DLLLoadLoot: iLootTableStructsize != sizeof(LootTable_Struct)" << endl;
cout << "Item_Struct has changed, EMuShareMem.dll needs to be recompiled." << endl;
return false;
}
if (iLootTableEntryStructsize != sizeof(LootTableEntries_Struct)) {
cout << "Error: EMuShareMem: DLLLoadLoot: iLootTableEntryStructsize != sizeof(LootTableEntries_Struct)" << endl;
cout << "Item_Struct has changed, EMuShareMem.dll needs to be recompiled." << endl;
return false;
}
if (iLootDropStructsize != sizeof(LootDrop_Struct)) {
cout << "Error: EMuShareMem: DLLLoadLoot: iLootDropStructsize != sizeof(LootDrop_Struct)" << endl;
cout << "Item_Struct has changed, EMuShareMem.dll needs to be recompiled." << endl;
return false;
}
if (iLootDropEntryStructsize != sizeof(LootDropEntries_Struct)) {
cout << "Error: EMuShareMem: DLLLoadLoot: iLootDropEntryStructsize != sizeof(LootDropEntries_Struct)" << endl;
cout << "Item_Struct has changed, EMuShareMem.dll needs to be recompiled." << endl;
return false;
}
uint32 tmpMemSize = sizeof(MMFLoot_Struct) + 256
+ (sizeof(uint32) * (iMaxLootTable+1))
+ (sizeof(LootTable_Struct) * iLootTableCount) + (sizeof(LootTableEntries_Struct) * iLootTableEntryCount)
+ (sizeof(uint32) * (iMaxLootDrop+1))
+ (sizeof(LootDrop_Struct) * iLootDropCount) + (sizeof(LootDropEntries_Struct) * iLootDropEntryCount)
;
if (LootMMF.Open("EQEMuLoot", tmpMemSize)) {
if (LootMMF.CanWrite()) {
MMFLootData_Writable = (MMFLoot_Struct*) LootMMF.GetWriteableHandle();
if (!MMFLootData_Writable) {
cout << "Error: EMuShareMem: DLLLoadLoot: !MMFLootData_Writable" << endl;
return false;
}
memset(MMFLootData_Writable, 0, tmpMemSize);
MMFLootData_Writable->LootTableCount = iLootTableCount;
MMFLootData_Writable->MaxLootTableID = iMaxLootTable;
MMFLootData_Writable->LootDropCount = iLootDropCount;
MMFLootData_Writable->MaxLootDropID = iMaxLootDrop;
MMFLootData_Writable->datamax = tmpMemSize - sizeof(MMFLoot_Struct);
MMFLootData_Writable->dataindex = 0;
MMFLootData_Writable->LootTableOffset = MMFLootData_Writable->dataindex;
MMFLootData_Writable->dataindex += (sizeof(uint32) * (iMaxLootTable+1));
MMFLootData_Writable->LootDropOffset = MMFLootData_Writable->dataindex;
MMFLootData_Writable->dataindex += (sizeof(uint32) * (iMaxLootDrop+1));
LootTable = (uint32*) &MMFLootData_Writable->data[MMFLootData_Writable->LootTableOffset];
LootDrop = (uint32*) &MMFLootData_Writable->data[MMFLootData_Writable->LootDropOffset];
// use a callback so the DB functions are done in the main exe
// this way the DLL doesnt have to open a connection to mysql
if (!cbDBLoadLoot()) {
cout << "Error: EMuShareMem: DLLLoadLoot: !cbDBLoadLoot" << endl;
return false;
}
MMFLootData_Writable = 0;
LootMMF.SetLoaded();
}
else {
if (!LootMMF.IsLoaded()) {
Timer::SetCurrentTime();
uint32 starttime = Timer::GetCurrentTime();
while ((!LootMMF.IsLoaded()) && ((Timer::GetCurrentTime() - starttime) < 300000)) {
Sleep(10);
Timer::SetCurrentTime();
}
if (!LootMMF.IsLoaded()) {
cout << "Error: EMuShareMem: DLLLoadLoot: !LootMMF.IsLoaded() (timeout)" << endl;
return false;
}
}
}
}
else {
cout << "Error Loading Loot: Loot.cpp: pDLLLoadLoot: Open() == false" << endl;
return false;
}
MMFLootData = (const MMFLoot_Struct*) LootMMF.GetHandle();
if (!MMFLootData) {
cout << "Error: EMuShareMem: DLLLoadLoot: !MMFLootData" << endl;
MMFLootData = 0;
return false;
}
if (MMFLootData->LootTableCount != iLootTableCount
|| MMFLootData->MaxLootTableID != iMaxLootTable
|| MMFLootData->LootDropCount != iLootDropCount
|| MMFLootData->MaxLootDropID != iMaxLootDrop) {
cout << "Error: EMuShareMem: DLLLoadLoot: Count/Max mismatch" << endl;
MMFLootData = 0;
return false;
}
LootTable = (uint32*) &MMFLootData->data[MMFLootData->LootTableOffset];
LootDrop = (uint32*) &MMFLootData->data[MMFLootData->LootDropOffset];
return true;
};
const LootTable_Struct* pGetLootTable(uint32 id) {
if (MMFLootData == 0 || !LootMMF.IsLoaded())
return 0;
if (id > MMFLootData->MaxLootTableID || LootTable[id] == 0)
return 0;
return (LootTable_Struct*) &MMFLootData->data[LootTable[id]];
}
const LootDrop_Struct* pGetLootDrop(uint32 id) {
if (MMFLootData == 0 || !LootMMF.IsLoaded())
return 0;
if (id > MMFLootData->MaxLootDropID || LootDrop[id] == 0)
return 0;
return (LootDrop_Struct*) &MMFLootData->data[LootDrop[id]];
}
-29
View File
@@ -1,29 +0,0 @@
#include "../common/types.h"
#include "../common/eq_packet_structs.h"
#include "../common/EMuShareMem.h"
#pragma pack(1)
struct MMFLoot_Struct {
bool Loaded;
uint32 MaxLootTableID;
uint32 LootTableCount;
uint32 LootTableOffset;
uint32 MaxLootDropID;
uint32 LootDropCount;
uint32 LootDropOffset;
uint32 datamax;
uint32 dataindex;
uint8 data[0];
};
#pragma pack()
bool pDLLLoadLoot(CALLBACK_DBLoadLoot cbDBLoadLoot,
uint32 iLootTableStructsize, uint32 iLootTableCount, uint32 iMaxLootTable,
uint32 iLootTableEntryStructsize, uint32 iLootTableEntryCount,
uint32 iLootDropStructsize, uint32 iLootDropCount, uint32 iMaxLootDrop,
uint32 iLootDropEntryStructsize, uint32 iLootDropEntryCount
);
bool pAddLootTable(uint32 id, const LootTable_Struct* lts);
bool pAddLootDrop(uint32, const LootDrop_Struct* lds);
const LootTable_Struct* pGetLootTable(uint32 id);
const LootDrop_Struct* pGetLootDrop(uint32 id);
-353
View File
@@ -1,353 +0,0 @@
// start mingw
#ifdef __MINGW32__
#define __try
#define __finally
#endif
// end mingw
#include "MMF.h"
#include <iostream>
using namespace std;
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#ifdef _WINDOWS
#define snprintf _snprintf
#define vsnprintf _vsnprintf
#define strncasecmp _strnicmp
#define strcasecmp _stricmp
#else
#include "MMFMutex.h"
#include "../common/unix.h"
#endif
MMF::MMF() {
SharedMemory = 0;
pCanWrite = false;
#ifdef _WINDOWS
hMapObject = NULL;
lpvMem = 0;
#else
lpvMem = 0;
pMMFMutex = 0;
m_alloc = false;
#endif
}
MMF::~MMF() {
Close();
}
bool MMF::Open(const char* iName, uint32 iSize) {
if (iSize < 1) {
cout << "Error Loading MMF: " << __FILE__ << ":" << __LINE__ << " OpenMMF: iSize < 1" << endl;
return false;
}
if (strlen(iName) < 2) {
cout << "Error Loading MMF: " << __FILE__ << ":" << __LINE__ << " OpenMMF: strlen(iName) < 2" << endl;
return false;
}
char MMFname[200];
memset(MMFname, 0, sizeof(MMFname));
snprintf(MMFname, sizeof(MMFname), "memfilemap_%s", iName);
uint32 tmpSize = sizeof(MMF_Struct) + iSize;
#ifdef _WINDOWS
char MMFMutexName[200];
memset(MMFMutexName, 0, sizeof(MMFMutexName));
snprintf(MMFMutexName, sizeof(MMFMutexName), "MutexToProtectOpenMMF_%s", iName);
HANDLE hMutex;
hMutex = CreateMutex(
NULL, // no security attributes
FALSE, // initially not owned
MMFMutexName); // name of mutex
if (hMutex == NULL) {
cout << "Error Loading MMF: " << __FILE__ << ":" << __LINE__ << " OpenMMF: hMutex == Null" << endl;
return false;
}
DWORD dwWaitResult;
// Request ownership of mutex.
dwWaitResult = WaitForSingleObject(
hMutex, // handle to mutex
2000L); // two-second time-out interval
if (dwWaitResult != WAIT_OBJECT_0) {
// Mutex not aquired, crap out
cout << "Error Loading MMF: " << __FILE__ << ":" << __LINE__ << " OpenMMF: dwWaitResult != WAIT_OBJECT_0" << endl;
return false;
}
// Finally, ready to rock.
bool fInit = false;
__try {
hMapObject = CreateFileMapping(
INVALID_HANDLE_VALUE, // use paging file
NULL, // default security attributes
PAGE_READWRITE, // read/write access
0, // size: high 32-bits
tmpSize, // size: low 32-bits
MMFname); // name of map object
if (hMapObject == NULL) {
cout << "Error Loading MMF: " << __FILE__ << ":" << __LINE__ << " OpenMMF: hMapObject == Null" << endl;
return false;
}
// The first process to attach initializes memory.
fInit = (bool) (GetLastError() != ERROR_ALREADY_EXISTS);
// Get a pointer to the file-mapped shared memory.
lpvMem = MapViewOfFile(
hMapObject, // object to map view of
FILE_MAP_WRITE, // read/write access
0, // high offset: map from
0, // low offset: beginning
0); // default: map entire file
if (lpvMem == NULL) {
cout << "Error Loading MMF: " << __FILE__ << ":" << __LINE__ << " OpenMMF: lpvMem == Null" << endl;
Close();
return false;
}
SharedMemory = (MMF_Struct*) lpvMem;
// Initialize memory if this is the first process.
if (fInit) {
memset(lpvMem, 0, sizeof(MMF_Struct));
pCanWrite = true;
SharedMemory->Loaded = false;
SharedMemory->datasize = iSize;
}
else {
pCanWrite = false;
if (SharedMemory->datasize != iSize) {
cout << "Error Loading MMF: " << __FILE__ << ":" << __LINE__ << " OpenMMF: SharedMemory->datasize != iSize" << endl;
Close();
return false;
}
}
} // end of try block
__finally {
// Clean up the Mutex stuff
if (!ReleaseMutex(hMutex)) {
cout << "Error Loading MMF: " << __FILE__ << ":" << __LINE__ << " OpenMMF: !ReleaseMutex(hMutex)" << endl;
Close();
return false;
}
}
CloseHandle(hMutex);
return true;
#else //else, NOT WINDOWS
int load_share;
//int max_share = 7;
key_t share_key;
switch (MMFname[16]) {
case 'I': load_share = 0; break;
case 'N': load_share = 1; break;
case 'D': load_share = 2; break;
case 'S': load_share = 3; break;
case 'F': load_share = 4; break;
case 'L': load_share = 5; break;
case 'M': load_share = 6; break;
case 'O': load_share = 7; break;
case 'Z': load_share = 8; break;
case 'K': load_share = 9; break;
#ifdef CATCH_CRASH
default:
cerr<<"Failed to load shared memory segment="<<MMFname<<" ("<<MMFname[16]<<")"<<endl;
// malloc some memory here or something fancy
return false; // and make this return true
break;
#else
default: cerr<<"FATAL="<<(char)MMFname[16]<<endl; return false; break;
#endif
}
switch (load_share) {
// Item
case 0: share_key = ftok(".", 'I'); break;
// Npctype
case 1: share_key = ftok(".", 'N'); break;
// Door
case 2: share_key = ftok(".", 'D'); break;
// Spell
case 3: share_key = ftok(".", 'S'); break;
// Faction
case 4: share_key = ftok(".", 'F'); break;
// Loot
case 5: share_key = ftok(".", 'L'); break;
// ??
case 6: share_key = ftok(".", 'M'); break;
// Opcodes
case 7: share_key = ftok(".", 'O'); break;
// Item Serialization
case 8: share_key = ftok(".", 'Z'); break;
// Skills
case 9: share_key = ftok(".", 'K'); break;
// ERROR Fatal
default: cerr<<"Opps!"<<endl; share_key = 0xFF; break;
}
pMMFMutex = new MMFMutex(share_key);
if (!pMMFMutex){
assert(false);
}
//if (!tmpSize) {
int share_id = shmget(share_key, tmpSize, IPC_CREAT|IPC_EXCL|SHM_R|SHM_W);
if ( share_id <= 0) {
share_id = shmget(share_key, tmpSize, IPC_CREAT|IPC_NOWAIT);
if (share_id <= 0) {
shmid_ds mem_size;
share_id = shmget(share_key, 1, IPC_CREAT|IPC_NOWAIT|SHM_R|SHM_W);
if(share_id == -1) {
cerr << "failed to get 0-length shared mem: " << strerror(errno) << endl;
}
if ((lpvMem = shmat(share_id, NULL,SHM_RDONLY)) == (void *)-1) {
cerr << "shmat failed! " << strerror(errno) << endl;
}
if( (shmctl(share_id, IPC_STAT, &mem_size)) == 0){
if (mem_size.shm_segsz != int(tmpSize)){ //comparison between signed and unsigned integer expressions
cout<<"[Warning] requested shared memory of size:"<<tmpSize<<" but that Key is already in use with size:"<< mem_size.shm_segsz<<endl;
shmid_ds mem_users;
if( (shmctl(share_id, IPC_STAT, &mem_users)) == 0 && mem_users.shm_nattch == 1){
cout<<"[Warning] Attempting resize"<<endl;
shmctl(share_id, IPC_RMID, 0);
shmdt(lpvMem);
if ((share_id = shmget(share_key, tmpSize, IPC_CREAT|IPC_EXCL|SHM_R|SHM_W)) <= 0) {
// Failed proceed on malloc
cerr<<"[Error] Failed to resize" << strerror(errno) <<endl;
}
else{
cerr<<"[Error] Resize successful." << endl;
// Success
lpvMem = shmat(share_id, NULL, SHM_R|SHM_W);
memset(lpvMem, 0, sizeof(MMF_Struct));
pCanWrite = true;
SharedMemory = (MMF_Struct*) lpvMem;
SharedMemory->Loaded = false;
SharedMemory->datasize = iSize;
pMMFMutex->Release(this);
delete pMMFMutex;
return true;
}
}
else{
cout<<"[Warning] Resize not possible"<<endl;
}
}
}
// Can not attatch to shared memory we'll malloc it here
if ((lpvMem == 0 || lpvMem == (void *)-1) && (lpvMem = malloc(tmpSize))) {
cout<<"[Warning] Could not attach to shared memory proceeding on isolated memory (share_id <= 0)"<<endl;
// Success!
m_alloc = true;
memset(lpvMem, 0, sizeof(MMF_Struct));
pCanWrite = true;
SharedMemory = (MMF_Struct*) lpvMem;
SharedMemory->datasize = iSize;
SharedMemory->Loaded = false;
pMMFMutex->Release(this);
delete pMMFMutex;
return true;
} else if (!lpvMem){
//LogFile->write(EQEMuLog::Error, "Could not connect to shared memory and allocation of isolated memory failed.");
cout<<"Could not connect to shared memory and allocation of isolated memory failed."<<endl;
pMMFMutex->Release(this);
delete pMMFMutex;
exit(1);
}
pCanWrite = false;
SharedMemory = (MMF_Struct*) lpvMem;
if (SharedMemory->datasize != iSize) {
cerr<<"SharedMemory->datasize("<<SharedMemory->datasize<<") != iSize("<<iSize<<"), We can rebuild him faster better STRONGER!"<<endl;
cerr<<"Or not.. restart all servers on this machine"<<endl;
shmctl(share_id, IPC_RMID, 0);
pMMFMutex->Release(this);
exit(1);
}
pMMFMutex->Release(this);
delete pMMFMutex;
return true;
}
shmid_ds mem_users;
if ((shmctl(share_id, IPC_STAT, &mem_users)) != 0) {
if ((lpvMem = malloc(tmpSize))) {
// Success!
cout<<"[Warning] Could not attach to shared memory proceeding on isolated memory"<<endl;
m_alloc = true;
memset(lpvMem, 0, sizeof(MMF_Struct));
pCanWrite = true;
SharedMemory = (MMF_Struct*) lpvMem;
SharedMemory->datasize = iSize;
SharedMemory->Loaded = false;
pMMFMutex->Release(this);
delete pMMFMutex;
return true;
} else {
//LogFile->write(EQEMuLog::Error, "Could not connect to shared memory and allocation of isolated memory failed.");
cout<<"Could not connect to shared memory and allocation of isolated memory failed."<<endl;
pMMFMutex->Release(this);
delete pMMFMutex;
exit(1);
}
}
lpvMem = shmat(share_id, NULL,SHM_RDONLY);
pCanWrite = false;
SharedMemory = (MMF_Struct*) lpvMem;
//cerr << "lpvMem=" << (int)lpvMem << endl;
if (lpvMem==(void *)-1 || SharedMemory->datasize != iSize) {
cerr<<"SharedMemory->datasize("<<SharedMemory->datasize<<") != iSize("<<iSize<<"), or "<<((void *)lpvMem)<<"==-1, We can rebuild him faster better STRONGER!"<<endl;
cerr<<"Or not.. restart all servers on this machine"<<endl;
shmctl(share_id, IPC_RMID, 0);
pMMFMutex->Release(this);
exit(1);
}
pMMFMutex->Release(this);
delete pMMFMutex;
return true;
}
lpvMem = shmat(share_id, NULL, SHM_R|SHM_W);
memset(lpvMem, 0, sizeof(MMF_Struct));
pCanWrite = true;
SharedMemory = (MMF_Struct*) lpvMem;
SharedMemory->Loaded = false;
SharedMemory->datasize = iSize;
//}
pMMFMutex->Release(this);
delete pMMFMutex;
return true;
#endif //end NOT WINDOWS
}
void MMF::Close() {
SharedMemory = 0;
pCanWrite = false;
#ifdef _WINDOWS
if (lpvMem) {
// Unmap shared memory from the process's address space.
UnmapViewOfFile(lpvMem);
lpvMem = 0;
}
if (hMapObject) {
// Close the process's handle to the file-mapping object.
CloseHandle(hMapObject);
hMapObject = NULL;
}
#else
if (lpvMem) {
if (m_alloc == true)
free(lpvMem);
else
if (shmdt(lpvMem) == -1)
//LogFile->write(EQEMuLog::Error, "Warning something odd happened freeing shared memory");
cout<<"Warning something odd happened freeing shared memory"<<endl;
lpvMem = 0;
}
#endif
}
-46
View File
@@ -1,46 +0,0 @@
#ifndef MMF_H
#define MMF_H
#include "../common/types.h"
#ifdef _WINDOWS
#include <windows.h>
#else
//#include "MMFMutex.h"
class MMFMutex;
#endif
class MMF {
public:
struct MMF_Struct {
bool Loaded;
uint32 datasize;
uint8 data[0];
};
MMF();
virtual ~MMF();
bool Open(const char* iName, uint32 iSize);
void Close();
const void* GetHandle() { if (IsLoaded()) { return SharedMemory->data; } return 0; }
void* GetWriteableHandle() { if (!IsLoaded() && CanWrite()) { return SharedMemory->data; } return 0; }
inline bool IsOpen() { return (bool) (SharedMemory != 0); }
inline bool IsLoaded() { if (SharedMemory) { return SharedMemory->Loaded; } return false; }
bool SetLoaded() { if (SharedMemory && CanWrite()) { SharedMemory->Loaded = true; return true; } return false; }
inline bool CanWrite() { if (SharedMemory) { return pCanWrite; } return false; }
#ifndef WIN32
bool m_alloc;
#endif
private:
bool pCanWrite;
MMF_Struct* SharedMemory;
#ifdef _WINDOWS
HANDLE hMapObject;
LPVOID lpvMem;
#else
void* lpvMem;
MMFMutex* pMMFMutex;
#endif
};
#endif
-126
View File
@@ -1,126 +0,0 @@
#include "MMFMutex.h"
#ifndef WIN32
MMFMutex::MMFMutex( int key )
{
m_key = key;
if( m_key == 0 )
{
// initialize POSIX semaphore
sem_init( &m_semaphore, 0, 1);
}
else
{
// currently, this thread does not own the semaphore
m_owner = 0;
m_recursive_count = 0;
// try to get an existing semaphore. the access permissions are "full access for everyone"
m_id = semget(m_key, 1, 0x1b6);
if( m_id == -1 )
{
// it doesn't exist yet, try to create a new one
m_id = semget(m_key, 1, IPC_CREAT | 0x1b6);
if( m_id != -1 )
{
// initialize it to 1
semun data;
data.val = 1;
semctl(m_id, 0, SETVAL, data);
}
}
}
}
MMFMutex::~MMFMutex()
{
if( m_key == 0 )
{
sem_destroy(&m_semaphore);
}
else
{
semctl(m_id, 0, IPC_RMID, 0);
}
}
bool MMFMutex::Lock( uint32 dwTimeout )
{
if( m_owner == pthread_self() )
{
m_recursive_count++;
return true;
}
bool bUseTimeout = (dwTimeout != 0);
while(true) {
bool bGotSemaphore = false;
if( m_key == 0 )
{
bGotSemaphore = (sem_trywait(&m_semaphore) == 0);
}
else
{
struct sembuf operations[1];
operations[0].sem_num = 0;
operations[0].sem_op = -1;
operations[0].sem_flg = SEM_UNDO|IPC_NOWAIT;
bGotSemaphore = (semop(m_id, operations, 1) >= 0);
}
if( bGotSemaphore )
{
m_owner = pthread_self();
m_recursive_count = 1;
return true;
}
sleep(1);
if( bUseTimeout )
{
if( dwTimeout > 1000 )
dwTimeout -= 1000;
else
dwTimeout = 0;
if( dwTimeout == 0 )
return false;
}
}
}
void MMFMutex::Release(const MMF* pMMF)
{
if( m_owner != pthread_self() && pMMF->m_alloc != true )
{
//We're supposed to explode here with an assert
//assert(false);
}
else if ( pMMF->m_alloc == true ){
// Just do it nothing is useing but us
return;
}
else if( m_recursive_count > 1 )
{
m_recursive_count--;
}
else
{
if( m_key == 0 )
{
sem_post(&m_semaphore);
}
else
{
struct sembuf operations[1];
operations[0].sem_num = 0;
operations[0].sem_op = 1;
operations[0].sem_flg = SEM_UNDO;
semop(m_id, operations, 1);
}
m_recursive_count = 0;
m_owner = 0;
}
}
#endif //!WIN32
-43
View File
@@ -1,43 +0,0 @@
#ifndef MMFMUTEX_H
#define MMFMUTEX_H
#ifndef WIN32
#include <sys/types.h> // moved before sys/shm.h for freeBSD
#include <sys/shm.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <pthread.h>
#include <unistd.h>
#include <assert.h>
#include "../common/types.h"
#include "MMF.h"
// the manuals say you have to define this struct your self.
#if !defined FREEBSD || defined __NetBSD__ // for BSDs
union semun
{
int val;
struct semid_ds* buf;
unsigned short int *array;
struct seminfo *__buf;
};
#endif // for freeBSD
class MMFMutex
{
public:
MMFMutex(int iIndex);
virtual ~MMFMutex();
bool Lock( uint32 dwTimeout = 0 );
void Release(const MMF*);
protected:
int m_id;
key_t m_key;
pthread_t m_owner;
sem_t m_semaphore;
int m_recursive_count;
};
#endif //!WIN32
#endif
-178
View File
@@ -1,178 +0,0 @@
#include "../common/debug.h"
#ifdef _WINDOWS
#include <windows.h>
#else
#include "../common/unix.h"
#endif
#include <memory.h>
#include <iostream>
using namespace std;
#include "NPCFactionLists.h"
#include "../common/timer.h"
#include "MMF.h"
MMF NPCFactionListsMMF;
const MMFNPCFactionLists_Struct* MMFNPCFactionListsData = 0;
MMFNPCFactionLists_Struct* MMFNPCFactionListsData_Writable = 0;
#ifdef _WINDOWS
extern "C" __declspec(dllexport) const NPCFactionList* GetNPCFactionList(uint32 id) {
return pGetNPCFactionList(id);
};
extern "C" __declspec(dllexport) bool AddNPCFactionList(uint32 id, const NPCFactionList* nfl) {
return pAddNPCFactionList(id, nfl);
};
extern "C" __declspec(dllexport) bool DLLLoadNPCFactionLists(CALLBACK_DBLoadNPCFactionLists cbDBLoadNPCFactionLists, uint32 iNPCFactionListStructSize, int32* iNPCFactionListsCount, uint32* iMaxNPCFactionListID, uint8 iMaxNPCFactions) {
return pDLLLoadNPCFactionLists(cbDBLoadNPCFactionLists, iNPCFactionListStructSize, iNPCFactionListsCount, iMaxNPCFactionListID, iMaxNPCFactions);
};
extern "C" __declspec(dllexport) bool SetNPCFaction(uint32 id, uint32* factionid, int32* factionvalue, int8 *factionnpcvalue, uint8 *factiontemp) {
return pSetNPCFaction(id, factionid, factionvalue, factionnpcvalue, factiontemp);
}
#else
extern "C" const NPCFactionList* GetNPCFactionList(uint32 id) {
return pGetNPCFactionList(id);
};
extern "C" bool AddNPCFactionList(uint32 id, const NPCFactionList* nfl) {
return pAddNPCFactionList(id, nfl);
};
extern "C" bool DLLLoadNPCFactionLists(CALLBACK_DBLoadNPCFactionLists cbDBLoadNPCFactionLists, uint32 iNPCFactionListStructSize, int32* iNPCFactionListsCount, uint32* iMaxNPCFactionListID, uint8 iMaxNPCFactions) {
return pDLLLoadNPCFactionLists(cbDBLoadNPCFactionLists, iNPCFactionListStructSize, iNPCFactionListsCount, iMaxNPCFactionListID, iMaxNPCFactions);
};
extern "C" bool SetNPCFaction(uint32 id, uint32* factionid, int32* factionvalue, int8 *factionnpcvalue, uint8 *factiontemp) {
return pSetNPCFaction(id, factionid, factionvalue, factionnpcvalue, factiontemp);
}
#endif
bool pAddNPCFactionList(uint32 id, const NPCFactionList* nfl) {
if (!MMFNPCFactionListsData_Writable){
if (EQDEBUG>=1) cout<<"[Debug] !MMFNPCFactionListsData_Writable"<<endl;
return false;
}
if (id > MMF_MAX_NPCFactionList_ID || MMFNPCFactionListsData_Writable->NextFreeIndex >= MMFNPCFactionListsData_Writable->NPCFactionListCount){
if (EQDEBUG>=1) cout<<"[Debug] id > MMF_MAX_NPCFactionList_ID || MMFNPCFactionListsData_Writable->NextFreeIndex >= MMFNPCFactionListsData_Writable->NPCFactionListCount"<<endl;
return false;
}
if (MMFNPCFactionListsData_Writable->NPCFactionListIndex[id] != 0xFFFFFFFF){
if (EQDEBUG>=1) cout<<"[Debug] MMFNPCFactionListsData_Writable->NPCFactionListIndex[id] != 0xFFFFFFFF"<<endl;
return false;
}
MMFNPCFactionListsData_Writable->NPCFactionListIndex[id] = MMFNPCFactionListsData_Writable->NextFreeIndex++;
memcpy(&MMFNPCFactionListsData_Writable->NPCFactionLists[MMFNPCFactionListsData_Writable->NPCFactionListIndex[id]], nfl, sizeof(NPCFactionList));
return true;
}
bool pSetNPCFaction(uint32 id, uint32* factionid, int32* factionvalue, int8 *factionnpcvalue, uint8 *factiontemp) {
if (!MMFNPCFactionListsData_Writable) {
if(EQDEBUG>=1) cout<<"[Debug] !MMFNPCFactionListsData_Writable"<<endl;
return false;
}
if (id > MMF_MAX_NPCFactionList_ID) {
if(EQDEBUG>=1) cout<<"[Debug] id > MMF_MAX_NPCFactionList_ID"<<endl;
return false;
}
if (MMFNPCFactionListsData_Writable->NPCFactionListIndex[id] == 0xFFFFFFFF) {
if(EQDEBUG>=1) cout<<"[Debug] MMFNPCFactionListsData_Writable->NPCFactionListIndex[id="<<id<<"] == 0xFFFFFFFF"<<endl;
return false;
}
for (int i=0; i<MAX_NPC_FACTIONS; i++) {
MMFNPCFactionListsData_Writable->NPCFactionLists[MMFNPCFactionListsData_Writable->NPCFactionListIndex[id]].factionid[i] = factionid[i];
MMFNPCFactionListsData_Writable->NPCFactionLists[MMFNPCFactionListsData_Writable->NPCFactionListIndex[id]].factionvalue[i] = factionvalue[i];
MMFNPCFactionListsData_Writable->NPCFactionLists[MMFNPCFactionListsData_Writable->NPCFactionListIndex[id]].factionnpcvalue[i] = factionnpcvalue[i];
MMFNPCFactionListsData_Writable->NPCFactionLists[MMFNPCFactionListsData_Writable->NPCFactionListIndex[id]].factiontemp[i] = factiontemp[i];
}
return true;
}
bool pDLLLoadNPCFactionLists(CALLBACK_DBLoadNPCFactionLists cbDBLoadNPCFactionLists, uint32 iNPCFactionListStructSize, int32* iNPCFactionListsCount, uint32* iMaxNPCFactionListID, uint8 iMaxNPCFactions) {
if (iNPCFactionListStructSize != sizeof(NPCFactionList)) {
cout << "Error: EMuShareMem: DLLLoadNPCFactionLists: iNPCFactionListStructSize != sizeof(NPCFactionList)" << endl;
cout << "NPCFactionList struct has changed, EMuShareMem.dll needs to be recompiled." << endl;
return false;
}
if (iMaxNPCFactions != MAX_NPC_FACTIONS) {
cout << "Error: EMuShareMem: DLLLoadNPCFactionLists: iMaxNPCFactions != MAX_NPC_FACTIONS" << endl;
cout << "NPCFactionList struct has changed, EMuShareMem.dll needs to be recompiled." << endl;
return false;
}
if (*iMaxNPCFactionListID > MMF_MAX_NPCFactionList_ID) {
cout << "Error: EMuShareMem: DLLLoadNPCFactionLists: iMaxNPCFactions > MMF_MAX_NPCFactionList_ID" << endl;
cout << "You need to increase the define in NPCFactionList.h." << endl;
return false;
}
uint32 tmpMemSize = sizeof(MMFNPCFactionLists_Struct) + 256 + (sizeof(NPCFactionList) * (*iNPCFactionListsCount));
if (NPCFactionListsMMF.Open("EQEMuFactionLists", tmpMemSize)) {
// MMFNPCFactionListsData = (const MMFNPCFactionLists_Struct*) NPCFactionListsMMF.GetHandle();
if (NPCFactionListsMMF.CanWrite()) {
MMFNPCFactionListsData_Writable = (MMFNPCFactionLists_Struct*) NPCFactionListsMMF.GetWriteableHandle();
if (!MMFNPCFactionListsData_Writable) {
cout << "Error: EMuShareMem: DLLLoadNPCFactionLists: !MMFNPCFactionListsData_Writable" << endl;
return false;
}
memset(MMFNPCFactionListsData_Writable, 0, tmpMemSize);
for(int i=0; i<MMF_MAX_NPCFactionList_ID; i++)
MMFNPCFactionListsData_Writable->NPCFactionListIndex[i] = 0xFFFFFFFF;
MMFNPCFactionListsData_Writable->MaxNPCFactionListID = *iMaxNPCFactionListID;
MMFNPCFactionListsData_Writable->NPCFactionListCount = *iNPCFactionListsCount;
// use a callback so the DB functions are done in the main exe
// this way the DLL doesnt have to open a connection to mysql
if (!cbDBLoadNPCFactionLists(MMFNPCFactionListsData_Writable->NPCFactionListCount, MMFNPCFactionListsData_Writable->MaxNPCFactionListID)) {
cout << "Error: EMuShareMem: DLLLoadNPCFactionLists: !cbDBLoadNPCFactionLists" << endl;
return false;
}
MMFNPCFactionListsData_Writable = 0;
NPCFactionListsMMF.SetLoaded();
MMFNPCFactionListsData = (const MMFNPCFactionLists_Struct*) NPCFactionListsMMF.GetHandle();
if (!MMFNPCFactionListsData) {
cout << "Error: EMuShareMem: DLLLoadNPCFactionLists: !MMFNPCFactionListsData (CanWrite=true)" << endl;
return false;
}
return true;
}
else {
if (!NPCFactionListsMMF.IsLoaded()) {
Timer::SetCurrentTime();
uint32 starttime = Timer::GetCurrentTime();
while ((!NPCFactionListsMMF.IsLoaded()) && ((Timer::GetCurrentTime() - starttime) < 300000)) {
Sleep(100);
Timer::SetCurrentTime();
}
if (!NPCFactionListsMMF.IsLoaded()) {
cout << "Error: EMuShareMem: DLLLoadNPCFactionLists: !NPCFactionListsMMF.IsLoaded() (timeout)" << endl;
return false;
}
}
MMFNPCFactionListsData = (const MMFNPCFactionLists_Struct*) NPCFactionListsMMF.GetHandle();
if (!MMFNPCFactionListsData) {
cout << "Error: EMuShareMem: DLLLoadNPCFactionLists: !MMFNPCFactionListsData (CanWrite=false)" << endl;
return false;
}
*iMaxNPCFactionListID = MMFNPCFactionListsData->MaxNPCFactionListID;
*iNPCFactionListsCount = MMFNPCFactionListsData->NPCFactionListCount;
return true;
}
}
else {
cout << "Error Loading NPCFactionLists: NPCFactionLists.cpp: pDLLLoadNPCFactionLists: Open() == false" << endl;
return false;
}
return false;
};
const NPCFactionList* pGetNPCFactionList(uint32 id) {
if (MMFNPCFactionListsData == 0 || (!NPCFactionListsMMF.IsLoaded()) || id > MMF_MAX_NPCFactionList_ID || MMFNPCFactionListsData->NPCFactionListIndex[id] == 0xFFFFFFFF)
return 0;
return &MMFNPCFactionListsData->NPCFactionLists[MMFNPCFactionListsData->NPCFactionListIndex[id]];
}
-22
View File
@@ -1,22 +0,0 @@
#include "../common/types.h"
#include "../zone/features.h"
#include "../zone/faction.h"
#include "../common/EMuShareMem.h"
// MMF_MAX_NPCFactionList_ID: Make sure this is bigger than the highest NPCFactionList ID#
#ifndef MMF_MAX_NPCFactionList_ID
#define MMF_MAX_NPCFactionList_ID 50000
#endif
struct MMFNPCFactionLists_Struct {
uint32 MaxNPCFactionListID;
uint32 NextFreeIndex;
uint32 NPCFactionListCount;
uint32 NPCFactionListIndex[MMF_MAX_NPCFactionList_ID+1];
NPCFactionList NPCFactionLists[0];
};
bool pDLLLoadNPCFactionLists(CALLBACK_DBLoadNPCFactionLists cbDBLoadNPCFactionLists, uint32 iNPCFactionListStructSize, int32* iNPCFactionListCount, uint32* iMaxNPCFactionListID, uint8 iMaxNPCFactions);
bool pAddNPCFactionList(uint32 id, const NPCFactionList* nfl);
bool pSetNPCFaction(uint32 id, uint32* factionid, int32* factionvalue, int8 *factionnpcvalue, uint8 *factiontemp);
const NPCFactionList* pGetNPCFactionList(uint32 id);
-137
View File
@@ -1,137 +0,0 @@
#include "../common/debug.h"
#ifdef _WINDOWS
#include <windows.h>
#else
#include "../common/unix.h"
#endif
#include <memory.h>
#include <iostream>
using namespace std;
#include "NPCTypes.h"
#include "../common/timer.h"
#include "MMF.h"
MMF NPCTypesMMF;
const MMFNPCTypes_Struct* MMFNPCTypesData = 0;
MMFNPCTypes_Struct* MMFNPCTypesData_Writable = 0;
#ifdef _WINDOWS
extern "C" __declspec(dllexport) const NPCType* GetNPCType(uint32 id) {
return pGetNPCType(id);
};
extern "C" __declspec(dllexport) bool AddNPCType(uint32 id, const NPCType* npctype) {
return pAddNPCType(id, npctype);
};
/*extern "C" __declspec(dllexport) bool DLLLoadNPCTypes(CALLBACK_DBLoadNPCTypes cbDBLoadNPCTypes, uint32 iNPCTypeStructSize, int32* iNPCTypesCount, uint32* iMaxNPCTypeID) {
return pDLLLoadNPCTypes(cbDBLoadNPCTypes, iNPCTypeStructSize, iNPCTypesCount, iMaxNPCTypeID);
};*/
#else
extern "C" const NPCType* GetNPCType(uint32 id) {
return pGetNPCType(id);
};
extern "C" bool AddNPCType(uint32 id, const NPCType* npctype) {
return pAddNPCType(id, npctype);
};
extern "C" bool DLLLoadNPCTypes(CALLBACK_DBLoadNPCTypes cbDBLoadNPCTypes, uint32 iNPCTypeStructSize, int32* iNPCTypesCount, uint32* iMaxNPCTypeID) {
return pDLLLoadNPCTypes(cbDBLoadNPCTypes, iNPCTypeStructSize, iNPCTypesCount, iMaxNPCTypeID);
};
#endif
bool pAddNPCType(uint32 id, const NPCType* npctype) {
if (!MMFNPCTypesData_Writable)
return false;
if (id > MMF_MAX_NPCTYPE_ID || MMFNPCTypesData_Writable->NextFreeIndex >= MMFNPCTypesData_Writable->NPCTypeCount)
return false;
if (MMFNPCTypesData_Writable->NPCTypeIndex[id] != 0xFFFFFFFF)
return false;
MMFNPCTypesData_Writable->NPCTypeIndex[id] = MMFNPCTypesData_Writable->NextFreeIndex++;
memcpy(&MMFNPCTypesData_Writable->NPCTypes[MMFNPCTypesData_Writable->NPCTypeIndex[id]], npctype, sizeof(NPCType));
return true;
}
/*bool pDLLLoadNPCTypes(CALLBACK_DBLoadNPCTypes cbDBLoadNPCTypes, uint32 iNPCTypeStructSize, int32* iNPCTypesCount, uint32* iMaxNPCTypeID) {
if (iNPCTypeStructSize != sizeof(NPCType)) {
cout << "Error: EMuShareMem: DLLLoadNPCTypes: iNPCTypeStructSize != sizeof(NPCType)" << endl;
cout << "NPCType struct has changed, EMuShareMem.dll needs to be recompiled." << endl;
return false;
}
if (*iMaxNPCTypeID > MMF_MAX_NPCTYPE_ID) {
cout << "Error: EMuShareMem: pDLLLoadNPCTypes: iMaxNPCTypeID > MMF_MAX_NPCTYPE_ID" << endl;
cout << "You need to increase the define in NPCTypes.h." << endl;
return false;
}
uint32 tmpMemSize = sizeof(MMFNPCTypes_Struct) + 256 + (sizeof(NPCType) * (*iNPCTypesCount));
if (NPCTypesMMF.Open("EQEMuNPCTypes", tmpMemSize)) {
// MMFNPCTypesData = (const MMFNPCTypes_Struct*) NPCTypesMMF.GetHandle();
if (NPCTypesMMF.CanWrite()) {
MMFNPCTypesData_Writable = (MMFNPCTypes_Struct*) NPCTypesMMF.GetWriteableHandle();
if (!MMFNPCTypesData_Writable) {
cout << "Error: EMuShareMem: DLLLoadNPCTypes: !MMFNPCTypesData_Writable" << endl;
return false;
}
memset(MMFNPCTypesData_Writable, 0, tmpMemSize);
for(int i=0; i<MMF_MAX_NPCTYPE_ID; i++)
MMFNPCTypesData_Writable->NPCTypeIndex[i] = 0xFFFFFFFF;
MMFNPCTypesData_Writable->MaxNPCTypeID = *iMaxNPCTypeID;
MMFNPCTypesData_Writable->NPCTypeCount = *iNPCTypesCount;
// use a callback so the DB functions are done in the main exe
// this way the DLL doesnt have to open a connection to mysql
if (!cbDBLoadNPCTypes(MMFNPCTypesData_Writable->NPCTypeCount, MMFNPCTypesData_Writable->MaxNPCTypeID)) {
cout << "Error: EMuShareMem: DLLLoadNPCTypes: !cbDBLoadNPCTypes" << endl;
return false;
}
MMFNPCTypesData_Writable = 0;
NPCTypesMMF.SetLoaded();
MMFNPCTypesData = (const MMFNPCTypes_Struct*) NPCTypesMMF.GetHandle();
if (!MMFNPCTypesData) {
cout << "Error: EMuShareMem: DLLLoadNPCTypes: !MMFNPCTypesData (CanWrite=true)" << endl;
return false;
}
return true;
}
else {
if (!NPCTypesMMF.IsLoaded()) {
Timer::SetCurrentTime();
uint32 starttime = Timer::GetCurrentTime();
while ((!NPCTypesMMF.IsLoaded()) && ((Timer::GetCurrentTime() - starttime) < 300000)) {
Sleep(100);
Timer::SetCurrentTime();
}
if (!NPCTypesMMF.IsLoaded()) {
cout << "Error: EMuShareMem: DLLLoadNPCTypes: !NPCTypesMMF.IsLoaded() (timeout)" << endl;
return false;
}
}
MMFNPCTypesData = (const MMFNPCTypes_Struct*) NPCTypesMMF.GetHandle();
if (!MMFNPCTypesData) {
cout << "Error: EMuShareMem: DLLLoadNPCTypes: !MMFNPCTypesData (CanWrite=false)" << endl;
return false;
}
*iMaxNPCTypeID = MMFNPCTypesData->MaxNPCTypeID;
*iNPCTypesCount = MMFNPCTypesData->NPCTypeCount;
return true;
}
}
else {
cout << "Error Loading NPCTypes: NPCTypes.cpp: pDLLLoadNPCTypes: Open() == false" << endl;
return false;
}
return false;
};*/
const NPCType* pGetNPCType(uint32 id) {
if (MMFNPCTypesData == 0 || (!NPCTypesMMF.IsLoaded()) || id > MMF_MAX_NPCTYPE_ID || MMFNPCTypesData->NPCTypeIndex[id] == 0xFFFFFFFF)
return 0;
return &MMFNPCTypesData->NPCTypes[MMFNPCTypesData->NPCTypeIndex[id]];
}
-18
View File
@@ -1,18 +0,0 @@
#include "../common/types.h"
#include "../zone/zonedump.h"
#include "../common/EMuShareMem.h"
// MMF_MAX_NPCTYPE_ID: Make sure this is bigger than the highest NPCType ID#
#define MMF_MAX_NPCTYPE_ID 400000
struct MMFNPCTypes_Struct {
uint32 MaxNPCTypeID;
uint32 NextFreeIndex;
uint32 NPCTypeCount;
uint32 NPCTypeIndex[MMF_MAX_NPCTYPE_ID+1];
NPCType NPCTypes[0];
};
//bool pDLLLoadNPCTypes(CALLBACK_DBLoadNPCTypes cbDBLoadNPCTypes, uint32 iNPCTypeStructSize, int32* iNPCTypesCount, uint32* iMaxNPCTypeID);
bool pAddNPCType(uint32 id, const NPCType* npctype);
const NPCType* pGetNPCType(uint32 id);
-140
View File
@@ -1,140 +0,0 @@
#include "../common/debug.h"
#ifdef _WINDOWS
#include <windows.h>
#else
#include "../common/unix.h"
#endif
#include <memory.h>
#include <iostream>
using namespace std;
#include "Opcodes.h"
#include "../common/timer.h"
#include "MMF.h"
MMF OpcodesMMF;
const MMFOpcodes_Struct* MMFOpcodesData = 0;
MMFOpcodes_Struct* MMFOpcodesData_Writable = 0;
const uint16 *MMFOpcodesData_emu_to_eq = NULL;
uint16 *MMFOpcodesData_emu_to_eq_write = NULL;
//we choose to store all opcodes as 16 bits, so if they are a different
//size in emu, they are gunna get casted to 16 bits... prolly will never
//be a problem, but I figured it was noteworthy
DLLFUNC uint16 GetEQOpcode(uint16 emu_op) {
if (MMFOpcodesData == 0 || (!OpcodesMMF.IsLoaded()) || emu_op >= MMFOpcodesData->EmuOpcodeCount )
return 0;
return MMFOpcodesData_emu_to_eq[emu_op];
}
DLLFUNC uint16 GetEmuOpcode(uint16 eq_op) {
if (MMFOpcodesData == 0 || (!OpcodesMMF.IsLoaded()) || eq_op >= MMFOpcodesData->EQOpcodeCount )
return 0;
return MMFOpcodesData->eq_to_emu[eq_op];
}
DLLFUNC bool SetOpcodePair(uint16 emu_op, uint16 eq_op) {
if (!MMFOpcodesData_Writable || !MMFOpcodesData_emu_to_eq_write)
return false;
if (emu_op >= MMFOpcodesData_Writable->EmuOpcodeCount || eq_op >= MMFOpcodesData_Writable->EQOpcodeCount)
return false;
MMFOpcodesData_emu_to_eq_write[emu_op] = eq_op;
MMFOpcodesData_Writable->eq_to_emu[eq_op] = emu_op;
return true;
}
DLLFUNC void ClearEQOpcodes() {
if (!MMFOpcodesData_Writable)
return;
memset(MMFOpcodesData_Writable->eq_to_emu, 0, sizeof(uint16)*MMFOpcodesData->EQOpcodeCount);
}
DLLFUNC bool DLLLoadOpcodes(CALLBACK_DBLoadOpcodes cb, uint32 opsize, uint32 eq_count, uint32 emu_count, const char *filename) {
if(opsize != sizeof(uint16)) {
cout << "Error: EMuShareMem: DLLLoadOpcodes: opsize != sizeof(uint16)" << endl;
cout << "Opcode size has changed, EMuShareMem.dll needs to be recompiled." << endl;
return false;
}
uint32 tmpMemSize = sizeof(MMFOpcodes_Struct) + opsize * (eq_count+emu_count);
if (OpcodesMMF.Open("EQEMuOpcodes", tmpMemSize)) {
if (OpcodesMMF.CanWrite()) {
MMFOpcodesData_Writable = (MMFOpcodes_Struct*) OpcodesMMF.GetWriteableHandle();
if (!MMFOpcodesData_Writable) {
cout << "Error: EMuShareMem: DLLLoadOpcodes: !MMFOpcodesData_Writable" << endl;
return false;
}
//emu_to_eq is right after eq_to_emu
MMFOpcodesData_emu_to_eq = MMFOpcodesData_Writable->eq_to_emu + eq_count;
MMFOpcodesData_emu_to_eq_write = MMFOpcodesData_Writable->eq_to_emu + eq_count;
//we need to memset the eq opcodes
memset(MMFOpcodesData_Writable->eq_to_emu, 0, sizeof(uint16)*eq_count);
MMFOpcodesData_Writable->EQOpcodeCount = eq_count;
MMFOpcodesData_Writable->EmuOpcodeCount = emu_count;
// use a callback so the DB functions are done in the main exe
// this way the DLL doesnt have to open a connection to mysql
if (!cb(filename)) {
cout << "Error: EMuShareMem: DLLLoadOpcodes: !cbDBLoadOpcodes" << endl;
return false;
}
//we dont disable the write handle here, so we can reload them
//MMFOpcodesData_Writable = 0;
OpcodesMMF.SetLoaded();
MMFOpcodesData = (const MMFOpcodes_Struct*) OpcodesMMF.GetHandle();
if (!MMFOpcodesData) {
cout << "Error: EMuShareMem: DLLLoadOpcodes: !MMFOpcodesData (CanWrite=true)" << endl;
return false;
}
return true;
} else {
if (!OpcodesMMF.IsLoaded()) {
Timer::SetCurrentTime();
uint32 starttime = Timer::GetCurrentTime();
while ((!OpcodesMMF.IsLoaded()) && ((Timer::GetCurrentTime() - starttime) < 300000)) {
Sleep(10);
Timer::SetCurrentTime();
}
if (!OpcodesMMF.IsLoaded()) {
cout << "Error: EMuShareMem: DLLLoadOpcodes: !OpcodesMMF.IsLoaded() (timeout)" << endl;
return false;
}
}
MMFOpcodesData = (const MMFOpcodes_Struct*) OpcodesMMF.GetHandle();
if (!MMFOpcodesData) {
cout << "Error: EMuShareMem: DLLLoadOpcodes: !MMFOpcodesData (CanWrite=false)" << endl;
return false;
}
//emu_to_eq is right after eq_to_emu
MMFOpcodesData_emu_to_eq = MMFOpcodesData->eq_to_emu + MMFOpcodesData->EQOpcodeCount;
//cheat a little so we can retain writeable handles for reloading
MMFOpcodesData_Writable = const_cast<MMFOpcodes_Struct*>(MMFOpcodesData);
MMFOpcodesData_emu_to_eq_write = MMFOpcodesData_Writable->eq_to_emu + eq_count;
return true;
}
}
else {
cout << "Error Loading Opcodes: Opcodes.cpp: pDLLLoadOpcodes: ret == 0, size = " << tmpMemSize << endl;
return false;
}
return false;
}
-10
View File
@@ -1,10 +0,0 @@
#include "../common/types.h"
#include "../common/EMuShareMem.h"
struct MMFOpcodes_Struct {
uint32 EQOpcodeCount;
uint32 EmuOpcodeCount;
uint16 eq_to_emu[0];
//uint16 emu_to_eq[0]; //logical, not really here... EQOpcodeCount indexes in
};
-142
View File
@@ -1,142 +0,0 @@
#include "../common/debug.h"
#ifdef _WINDOWS
#include <windows.h>
#else
#include "../common/unix.h"
#endif
#include <memory.h>
#include <iostream>
using namespace std;
#include "SkillCaps.h"
#include "../common/timer.h"
#include "MMF.h"
MMF SkillCapsMMF;
const MMFSkillCaps_Struct* MMFSkillCapsData = 0;
MMFSkillCaps_Struct* MMFSkillCapsData_Writable = 0;
DLLFUNC uint16 GetSkillCap(uint8 Class_, uint8 Skill, uint8 Level) {
if (MMFSkillCapsData == 0 || (!SkillCapsMMF.IsLoaded()))
return 0;
if (Class_ >= MMFSkillCapsData->ClassCount || Skill >= MMFSkillCapsData->SkillCount || Level >= MMFSkillCapsData->LevelCount)
return(0);
uint32 index =
(((Class_ * MMFSkillCapsData->SkillCount) + Skill) * MMFSkillCapsData->LevelCount)
+ Level;
return MMFSkillCapsData->caps[index];
}
DLLFUNC bool SetSkillCap(uint8 Class_, uint8 Skill, uint8 Level, uint16 cap) {
if (!MMFSkillCapsData_Writable)
return false;
if (Class_ >= MMFSkillCapsData_Writable->ClassCount || Skill >= MMFSkillCapsData_Writable->SkillCount || Level >= MMFSkillCapsData_Writable->LevelCount)
return false;
uint32 index =
(((Class_ * MMFSkillCapsData_Writable->SkillCount) + Skill) * MMFSkillCapsData_Writable->LevelCount)
+ Level;
MMFSkillCapsData_Writable->caps[index] = cap;
return true;
}
DLLFUNC uint8 GetTrainLevel(uint8 Class_, uint8 Skill, uint8 Level){
if (MMFSkillCapsData == 0 || (!SkillCapsMMF.IsLoaded()))
return 0;
if (Class_ >= MMFSkillCapsData->ClassCount || Skill >= MMFSkillCapsData->SkillCount || Level >= MMFSkillCapsData->LevelCount)
return(0);
uint32 index = (((Class_ * MMFSkillCapsData->SkillCount) + Skill) * MMFSkillCapsData->LevelCount);
for(int x = 0; x < Level; x++){
if(MMFSkillCapsData->caps[index + x]){
return (x);
}
}
return(0);
}
DLLFUNC void ClearSkillCaps() {
if (!MMFSkillCapsData_Writable)
return;
memset(MMFSkillCapsData_Writable->caps, 0,
sizeof(uint16)*(MMFSkillCapsData->ClassCount*MMFSkillCapsData->SkillCount*MMFSkillCapsData->LevelCount));
}
DLLFUNC bool LoadSkillCaps(CALLBACK_DBLoadSkillCaps cb, uint32 opsize, uint8 ClassCount, uint8 SkillCount, uint8 LevelCount) {
if(opsize != sizeof(uint16)) {
cout << "Error: EMuShareMem: DLLLoadSkillCaps: opsize != sizeof(uint16)" << endl;
cout << "SkillCap size has changed, EMuShareMem.dll needs to be recompiled." << endl;
return false;
}
uint32 tmpMemSize = sizeof(MMFSkillCaps_Struct) + opsize * (ClassCount*SkillCount*LevelCount);
if (SkillCapsMMF.Open("EQEMuKSkillCaps", tmpMemSize)) {
if (SkillCapsMMF.CanWrite()) {
MMFSkillCapsData_Writable = (MMFSkillCaps_Struct*) SkillCapsMMF.GetWriteableHandle();
if (!MMFSkillCapsData_Writable) {
cout << "Error: EMuShareMem: DLLLoadSkillCaps: !MMFSkillCapsData_Writable" << endl;
return false;
}
//we need to memset the eq SkillCaps
memset(MMFSkillCapsData_Writable->caps, 0, sizeof(uint16)*(ClassCount*SkillCount*LevelCount));
MMFSkillCapsData_Writable->ClassCount = ClassCount;
MMFSkillCapsData_Writable->SkillCount = SkillCount;
MMFSkillCapsData_Writable->LevelCount = LevelCount;
// use a callback so the DB functions are done in the main exe
// this way the DLL doesnt have to open a connection to mysql
if (!cb()) {
cout << "Error: EMuShareMem: DLLLoadSkillCaps: !cbDBLoadSkillCaps" << endl;
return false;
}
MMFSkillCapsData_Writable = 0;
SkillCapsMMF.SetLoaded();
MMFSkillCapsData = (const MMFSkillCaps_Struct*) SkillCapsMMF.GetHandle();
if (!MMFSkillCapsData) {
cout << "Error: EMuShareMem: DLLLoadSkillCaps: !MMFSkillCapsData (CanWrite=true)" << endl;
return false;
}
return true;
} else {
if (!SkillCapsMMF.IsLoaded()) {
Timer::SetCurrentTime();
uint32 starttime = Timer::GetCurrentTime();
while ((!SkillCapsMMF.IsLoaded()) && ((Timer::GetCurrentTime() - starttime) < 300000)) {
Sleep(10);
Timer::SetCurrentTime();
}
if (!SkillCapsMMF.IsLoaded()) {
cout << "Error: EMuShareMem: DLLLoadSkillCaps: !SkillCapsMMF.IsLoaded() (timeout)" << endl;
return false;
}
}
MMFSkillCapsData = (const MMFSkillCaps_Struct*) SkillCapsMMF.GetHandle();
if (!MMFSkillCapsData) {
cout << "Error: EMuShareMem: DLLLoadSkillCaps: !MMFSkillCapsData (CanWrite=false)" << endl;
return false;
}
return true;
}
}
else {
cout << "Error Loading SkillCaps: SkillCaps.cpp: pDLLLoadSkillCaps: ret == 0, size = " << tmpMemSize << endl;
return false;
}
return false;
}
-10
View File
@@ -1,10 +0,0 @@
#include "../common/types.h"
#include "../common/EMuShareMem.h"
struct MMFSkillCaps_Struct {
uint8 ClassCount;
uint8 SkillCount;
uint8 LevelCount;
uint16 caps[0];
};
-98
View File
@@ -1,98 +0,0 @@
#include "../common/debug.h"
#ifdef _WINDOWS
#include <windows.h>
#else
#include "../common/unix.h"
#endif
#include <memory.h>
#include <iostream>
using namespace std;
#include "Spells.h"
#include "../common/timer.h"
//#include "../zone/masterentity.h"
#include "MMF.h"
MMF SpellsMMF;
const MMFSpells_Struct* MMFSpellsData = 0;
MMFSpells_Struct* MMFSpellsData_Writable = 0;
#ifdef _WINDOWS
extern "C" __declspec(dllexport) bool DLLLoadSPDat(const CALLBACK_FileLoadSPDat cbFileLoadSPDat, const void** oSpellsPointer, int32* oSPDAT_RECORDS, uint32 iSPDat_Struct_Size) {
return pDLLLoadSPDat(cbFileLoadSPDat, oSpellsPointer, oSPDAT_RECORDS, iSPDat_Struct_Size);
};
#else
extern "C" bool DLLLoadSPDat(const CALLBACK_FileLoadSPDat cbFileLoadSPDat, const void** oSpellsPointer, int32* oSPDAT_RECORDS, uint32 iSPDat_Struct_Size) {
return pDLLLoadSPDat(cbFileLoadSPDat, oSpellsPointer, oSPDAT_RECORDS, iSPDat_Struct_Size);
};
#endif
bool pDLLLoadSPDat(const CALLBACK_FileLoadSPDat cbFileLoadSPDat, const void** oSpellsPointer, int32* oSPDAT_RECORDS, uint32 iSPDat_Struct_Size) {
if (iSPDat_Struct_Size != sizeof(SPDat_Spell_Struct)) {
cout << "Error: EMuShareMem: DLLLoadSPDat: iSPDat_Struct_Size != sizeof(SPDat_Spell_Struct)" << endl;
cout << "SPDat_Spell_Struct has changed, EMuShareMem.dll needs to be recompiled." << endl;
return false;
}
uint32 tmpMemSize = sizeof(MMFSpells_Struct) + 256 + (sizeof(SPDat_Spell_Struct) * (*oSPDAT_RECORDS));
if (SpellsMMF.Open("EQEMuSpells", tmpMemSize)) {
if (SpellsMMF.CanWrite()) {
MMFSpellsData_Writable = (MMFSpells_Struct*) SpellsMMF.GetWriteableHandle();
if (!MMFSpellsData_Writable) {
cout << "Error: EMuShareMem: DLLLoadSPDat: !MMFSpellsData_Writable" << endl;
return false;
}
memset(MMFSpellsData_Writable, 0, tmpMemSize);
MMFSpellsData_Writable->SPDAT_RECORDS = *oSPDAT_RECORDS;
// use a callback so the DB functions are done in the main exe
// this way the DLL doesnt have to open a connection to mysql
if (MMFSpellsData_Writable->SPDAT_RECORDS > 0) {
cbFileLoadSPDat(&MMFSpellsData_Writable->spells[0], MMFSpellsData_Writable->SPDAT_RECORDS-1);
*oSpellsPointer = &MMFSpellsData_Writable->spells[0];
}
else
*oSpellsPointer = 0;
MMFSpellsData_Writable = 0;
SpellsMMF.SetLoaded();
MMFSpellsData = (const MMFSpells_Struct*) SpellsMMF.GetHandle();
if (!MMFSpellsData) {
cout << "Error: EMuShareMem: DLLLoadSPDat: !MMFSpellsData (CanWrite=true)" << endl;
return false;
}
return true;
}
else {
if (!SpellsMMF.IsLoaded()) {
Timer::SetCurrentTime();
uint32 starttime = Timer::GetCurrentTime();
while ((!SpellsMMF.IsLoaded()) && ((Timer::GetCurrentTime() - starttime) < 300000)) {
Sleep(100);
Timer::SetCurrentTime();
}
if (!SpellsMMF.IsLoaded()) {
cout << "Error: EMuShareMem: DLLLoadSPDat: !SpellsMMF.IsLoaded() (timeout)" << endl;
return false;
}
}
MMFSpellsData = (const MMFSpells_Struct*) SpellsMMF.GetHandle();
if (!MMFSpellsData) {
cout << "Error: EMuShareMem: DLLLoadSPDat: !SpellsMMF (CanWrite=false)" << endl;
return false;
}
*oSPDAT_RECORDS = MMFSpellsData->SPDAT_RECORDS;
if (MMFSpellsData->SPDAT_RECORDS > 0)
*oSpellsPointer = &MMFSpellsData->spells[0];
else
*oSpellsPointer = 0;
return true;
}
}
else {
cout << "Error Loading SPDat: Spells.cpp: pDLLLoadSPDat: Open() == false" << endl;
return false;
}
return false;
}
-16
View File
@@ -1,16 +0,0 @@
#ifndef MEMSHARE_SPELLS_H
#define MEMSHARE_SPELLS_H
#include "../common/types.h"
#include "../zone/spdat.h"
#include "../common/EMuShareMem.h"
struct MMFSpells_Struct {
uint32 SPDAT_RECORDS; // maxspellid + 1, size of array
SPDat_Spell_Struct spells[0];
};
bool pDLLLoadSPDat(const CALLBACK_FileLoadSPDat cbFileLoadSPDat, const void** oSpellsPointer, int32* oSPDAT_RECORDS, uint32 iSPDat_Struct_Size);
#endif
+3 -1
View File
@@ -1,4 +1,4 @@
The server code and utilities are released under GPL.
The server code and utilities are released under GPLv3.
We also include some small libraries for convienence that may be under different licensing:
@@ -8,3 +8,5 @@ StackWalker - New BSD License
ZLib - ZLib License
MySQL - GPL
Perl - GPL / ActiveState (under the assumption that this is a free project).
CPPUnit - GLP
StringUtilities - Apache
+52 -1
View File
@@ -1,2 +1,53 @@
EQEmu - Custom Game Implementation for EverQuest
EQEmu
===
[![Build Status](https://travis-ci.org/EQEmu/Server.svg?branch=master)](https://travis-ci.org/EQEmu/Server)
Overview
---
EQEmu is a custom server implementation for EverQuest
Dependencies
---
For Windows: http://eqemu.github.io
Login Server dependencies for Windows/Linux/OSX: http://eqemu.github.io
For Debian based distros (adjust to your local flavor):
- libmysqlclient-dev
- libperl-dev
- liblua5.1-0-dev (5.2 should work as well)
- libboost-dev
Further instructions on building the source can be found on the
[wiki](http://wiki.eqemulator.org/i?M=Wiki).
Bug reports
---
Please use the [issue tracker](https://github.com/EQEmu/Server/issues) provided by GitHub to send us bug
reports or feature requests.
The [EQEmu Forums](http://www.eqemulator.org/forums/) also have forums to submit
bugs/get help with bugs.
Contributions
---
The preferred way to contribute is to fork the repo and submit a pull request on
GitHub. If you need help with your changes, you can always post on the forums or
try IRC. You can also post unified diffs (`git diff` should do the trick) on the
[Server Code Submissions](http://www.eqemulator.org/forums/forumdisplay.php?f=669)
forum, although pull requests will be much quicker and easier on all parties.
Contact
---
- **User IRC Channel**: `#eqemu` on `irc.eqemulator.net`
- **Developer IRC Channel**: `#eqemucoders` on `irc.eqemulator.net`
- [EQEmulator Forums](http://www.eqemulator.org/forums)
- [EQEmulator Wiki](http://wiki.eqemulator.org/i?M=Wiki)
+1158
View File
File diff suppressed because it is too large Load Diff
+4
View File
@@ -0,0 +1,4 @@
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
add_subdirectory(import)
add_subdirectory(export)
+36
View File
@@ -0,0 +1,36 @@
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
SET(export_sources
main.cpp
)
SET(export_headers
)
ADD_EXECUTABLE(export_client_files ${export_sources} ${export_headers})
INSTALL(TARGETS export_client_files RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})
TARGET_LINK_LIBRARIES(export_client_files common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY})
IF(MSVC)
SET_TARGET_PROPERTIES(export_client_files PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
TARGET_LINK_LIBRARIES(export_client_files "Ws2_32.lib")
ENDIF(MSVC)
IF(MINGW)
TARGET_LINK_LIBRARIES(export_client_files "WS2_32")
ENDIF(MINGW)
IF(UNIX)
TARGET_LINK_LIBRARIES(export_client_files "${CMAKE_DL_LIBS}")
TARGET_LINK_LIBRARIES(export_client_files "z")
TARGET_LINK_LIBRARIES(export_client_files "m")
IF(NOT DARWIN)
TARGET_LINK_LIBRARIES(export_client_files "rt")
ENDIF(NOT DARWIN)
TARGET_LINK_LIBRARIES(export_client_files "pthread")
ADD_DEFINITIONS(-fPIC)
ENDIF(UNIX)
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
+198
View File
@@ -0,0 +1,198 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2013 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdio.h>
#include "../../common/debug.h"
#include "../../common/shareddb.h"
#include "../../common/eqemu_config.h"
#include "../../common/platform.h"
#include "../../common/crash.h"
#include "../../common/rulesys.h"
#include "../../common/string_util.h"
void ExportSpells(SharedDatabase *db);
void ExportSkillCaps(SharedDatabase *db);
void ExportBaseData(SharedDatabase *db);
int main(int argc, char **argv) {
RegisterExecutablePlatform(ExePlatformClientExport);
set_exception_handler();
LogFile->write(EQEMuLog::Status, "Client Files Export Utility");
if(!EQEmuConfig::LoadConfig()) {
LogFile->write(EQEMuLog::Error, "Unable to load configuration file.");
return 1;
}
const EQEmuConfig *config = EQEmuConfig::get();
if(!load_log_settings(config->LogSettingsFile.c_str())) {
LogFile->write(EQEMuLog::Error, "Warning: unable to read %s.", config->LogSettingsFile.c_str());
}
SharedDatabase database;
LogFile->write(EQEMuLog::Status, "Connecting to database...");
if(!database.Connect(config->DatabaseHost.c_str(), config->DatabaseUsername.c_str(),
config->DatabasePassword.c_str(), config->DatabaseDB.c_str(), config->DatabasePort)) {
LogFile->write(EQEMuLog::Error, "Unable to connect to the database, cannot continue without a "
"database connection");
return 1;
}
ExportSpells(&database);
ExportSkillCaps(&database);
ExportBaseData(&database);
return 0;
}
void ExportSpells(SharedDatabase *db) {
LogFile->write(EQEMuLog::Status, "Exporting Spells...");
FILE *f = fopen("export/spells_us.txt", "w");
if(!f) {
LogFile->write(EQEMuLog::Error, "Unable to open export/spells_us.txt to write, skipping.");
return;
}
const std::string query = "SELECT * FROM spells_new ORDER BY id";
auto results = db->QueryDatabase(query);
if(results.Success()) {
for (auto row = results.begin(); row != results.end(); ++row) {
std::string line;
unsigned int fields = results.ColumnCount();
for(unsigned int i = 0; i < fields; ++i) {
if(i != 0) {
line.push_back('^');
}
if(row[i] != nullptr) {
line += row[i];
}
}
fprintf(f, "%s\n", line.c_str());
}
} else {
LogFile->write(EQEMuLog::Error, "Error in ExportSpells query '%s' %s", query.c_str(), results.ErrorMessage().c_str());
}
fclose(f);
}
bool SkillUsable(SharedDatabase *db, int skill_id, int class_id) {
bool res = false;
std::string query = StringFormat("SELECT max(cap) FROM skill_caps WHERE class=%d AND skillID=%d",
class_id, skill_id);
auto results = db->QueryDatabase(query);
if(!results.Success()) {
LogFile->write(EQEMuLog::Error, "Error in skill_usable query '%s' %s", query.c_str(), results.ErrorMessage().c_str());
return false;
}
if (results.RowCount() == 0)
return false;
auto row = results.begin();
if(row[0] && atoi(row[0]) > 0)
return true;
return false;
}
int GetSkill(SharedDatabase *db, int skill_id, int class_id, int level) {
std::string query = StringFormat("SELECT cap FROM skill_caps WHERE class=%d AND skillID=%d AND level=%d",
class_id, skill_id, level);
auto results = db->QueryDatabase(query);
if (!results.Success()) {
LogFile->write(EQEMuLog::Error, "Error in get_skill query '%s' %s", query.c_str(), results.ErrorMessage().c_str());
return 0;
}
if (results.RowCount() == 0)
return 0;
auto row = results.begin();
return atoi(row[0]);
}
void ExportSkillCaps(SharedDatabase *db) {
LogFile->write(EQEMuLog::Status, "Exporting Skill Caps...");
FILE *f = fopen("export/SkillCaps.txt", "w");
if(!f) {
LogFile->write(EQEMuLog::Error, "Unable to open export/SkillCaps.txt to write, skipping.");
return;
}
for(int cl = 1; cl <= 16; ++cl) {
for(int skill = 0; skill <= 77; ++skill) {
if(SkillUsable(db, skill, cl)) {
int previous_cap = 0;
for(int level = 1; level <= 100; ++level) {
int cap = GetSkill(db, skill, cl, level);
if(cap < previous_cap) {
cap = previous_cap;
}
fprintf(f, "%d^%d^%d^%d^0\n", cl, skill, level, cap);
previous_cap = cap;
}
}
}
}
fclose(f);
}
void ExportBaseData(SharedDatabase *db) {
LogFile->write(EQEMuLog::Status, "Exporting Base Data...");
FILE *f = fopen("export/BaseData.txt", "w");
if(!f) {
LogFile->write(EQEMuLog::Error, "Unable to open export/BaseData.txt to write, skipping.");
return;
}
const std::string query = "SELECT * FROM base_data ORDER BY level, class";
auto results = db->QueryDatabase(query);
if(results.Success()) {
for (auto row = results.begin();row != results.end();++row) {
std::string line;
unsigned int fields = results.ColumnCount();
for(unsigned int rowIndex = 0; rowIndex < fields; ++rowIndex) {
if(rowIndex != 0)
line.push_back('^');
if(row[rowIndex] != nullptr) {
line += row[rowIndex];
}
}
fprintf(f, "%s\n", line.c_str());
}
} else {
LogFile->write(EQEMuLog::Error, "Error in ExportBaseData query '%s' %s", query.c_str(), results.ErrorMessage().c_str());
}
fclose(f);
}
+36
View File
@@ -0,0 +1,36 @@
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
SET(import_sources
main.cpp
)
SET(import_headers
)
ADD_EXECUTABLE(import_client_files ${import_sources} ${import_headers})
INSTALL(TARGETS import_client_files RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})
TARGET_LINK_LIBRARIES(import_client_files common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY})
IF(MSVC)
SET_TARGET_PROPERTIES(import_client_files PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
TARGET_LINK_LIBRARIES(import_client_files "Ws2_32.lib")
ENDIF(MSVC)
IF(MINGW)
TARGET_LINK_LIBRARIES(import_client_files "WS2_32")
ENDIF(MINGW)
IF(UNIX)
TARGET_LINK_LIBRARIES(import_client_files "${CMAKE_DL_LIBS}")
TARGET_LINK_LIBRARIES(import_client_files "z")
TARGET_LINK_LIBRARIES(import_client_files "m")
IF(NOT DARWIN)
TARGET_LINK_LIBRARIES(import_client_files "rt")
ENDIF(NOT DARWIN)
TARGET_LINK_LIBRARIES(import_client_files "pthread")
ADD_DEFINITIONS(-fPIC)
ENDIF(UNIX)
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
+231
View File
@@ -0,0 +1,231 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2013 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "../../common/debug.h"
#include "../../common/shareddb.h"
#include "../../common/eqemu_config.h"
#include "../../common/platform.h"
#include "../../common/crash.h"
#include "../../common/rulesys.h"
#include "../../common/string_util.h"
void ImportSpells(SharedDatabase *db);
void ImportSkillCaps(SharedDatabase *db);
void ImportBaseData(SharedDatabase *db);
int main(int argc, char **argv) {
RegisterExecutablePlatform(ExePlatformClientImport);
set_exception_handler();
LogFile->write(EQEMuLog::Status, "Client Files Import Utility");
if(!EQEmuConfig::LoadConfig()) {
LogFile->write(EQEMuLog::Error, "Unable to load configuration file.");
return 1;
}
const EQEmuConfig *config = EQEmuConfig::get();
if(!load_log_settings(config->LogSettingsFile.c_str())) {
LogFile->write(EQEMuLog::Error, "Warning: unable to read %s.", config->LogSettingsFile.c_str());
}
SharedDatabase database;
LogFile->write(EQEMuLog::Status, "Connecting to database...");
if(!database.Connect(config->DatabaseHost.c_str(), config->DatabaseUsername.c_str(),
config->DatabasePassword.c_str(), config->DatabaseDB.c_str(), config->DatabasePort)) {
LogFile->write(EQEMuLog::Error, "Unable to connect to the database, cannot continue without a "
"database connection");
return 1;
}
ImportSpells(&database);
ImportSkillCaps(&database);
ImportBaseData(&database);
return 0;
}
int GetSpellColumns(SharedDatabase *db) {
const std::string query = "DESCRIBE spells_new";
auto results = db->QueryDatabase(query);
if(!results.Success()) {
LogFile->write(EQEMuLog::Error, "Error in GetSpellColumns query '%s' %s", query.c_str(), results.ErrorMessage().c_str());
return 0;
}
return results.RowCount();
}
void ImportSpells(SharedDatabase *db) {
LogFile->write(EQEMuLog::Status, "Importing Spells...");
FILE *f = fopen("import/spells_us.txt", "r");
if(!f) {
LogFile->write(EQEMuLog::Error, "Unable to open import/spells_us.txt to read, skipping.");
return;
}
std::string query = "DELETE FROM spells_new";
db->QueryDatabase(query);
int columns = GetSpellColumns(db);
int spells_imported = 0;
char buffer[2048];
while(fgets(buffer, 2048, f)) {
for(int i = 0; i < 2048; ++i) {
if(buffer[i] == '\n') {
buffer[i] = 0;
break;
}
}
std::string escaped = ::EscapeString(buffer);
auto split = SplitString(escaped, '^');
int line_columns = (int)split.size();
std::string sql;
if(line_columns >= columns) {
sql = "INSERT INTO spells_new VALUES(";
for(int i = 0; i < columns; ++i) {
if(i != 0) {
sql += ", '";
} else {
sql += "'";
}
sql += split[i];
sql += "'";
}
sql += ");";
} else {
int i = 0;
sql = "INSERT INTO spells_new VALUES(";
for(; i < line_columns; ++i) {
if(i != 0) {
sql += ", '";
} else {
sql += "'";
}
sql += split[i];
sql += "'";
}
for(; i < columns; ++i) {
sql += ", '0'";
}
sql += ");";
}
db->QueryDatabase(sql);
spells_imported++;
if(spells_imported % 1000 == 0) {
LogFile->write(EQEMuLog::Status, "%d spells imported.", spells_imported);
}
}
if(spells_imported % 1000 != 0) {
LogFile->write(EQEMuLog::Status, "%d spells imported.", spells_imported);
}
fclose(f);
}
void ImportSkillCaps(SharedDatabase *db) {
LogFile->write(EQEMuLog::Status, "Importing Skill Caps...");
FILE *f = fopen("import/SkillCaps.txt", "r");
if(!f) {
LogFile->write(EQEMuLog::Error, "Unable to open import/SkillCaps.txt to read, skipping.");
return;
}
std::string delete_sql = "DELETE FROM skill_caps";
db->QueryDatabase(delete_sql);
char buffer[2048];
while(fgets(buffer, 2048, f)) {
auto split = SplitString(buffer, '^');
if(split.size() < 4) {
continue;
}
int class_id, skill_id, level, cap;
class_id = atoi(split[0].c_str());
skill_id = atoi(split[1].c_str());
level = atoi(split[2].c_str());
cap = atoi(split[3].c_str());
std::string sql = StringFormat("INSERT INTO skill_caps(class, skillID, level, cap) VALUES(%d, %d, %d, %d)",
class_id, skill_id, level, cap);
db->QueryDatabase(sql);
}
fclose(f);
}
void ImportBaseData(SharedDatabase *db) {
LogFile->write(EQEMuLog::Status, "Importing Base Data...");
FILE *f = fopen("import/BaseData.txt", "r");
if(!f) {
LogFile->write(EQEMuLog::Error, "Unable to open import/BaseData.txt to read, skipping.");
return;
}
std::string delete_sql = "DELETE FROM base_data";
db->QueryDatabase(delete_sql);
char buffer[2048];
while(fgets(buffer, 2048, f)) {
auto split = SplitString(buffer, '^');
if(split.size() < 10) {
continue;
}
std::string sql;
int level, class_id;
double hp, mana, end, unk1, unk2, hp_fac, mana_fac, end_fac;
level = atoi(split[0].c_str());
class_id = atoi(split[1].c_str());
hp = atof(split[2].c_str());
mana = atof(split[3].c_str());
end = atof(split[4].c_str());
unk1 = atof(split[5].c_str());
unk2 = atof(split[6].c_str());
hp_fac = atof(split[7].c_str());
mana_fac = atof(split[8].c_str());
end_fac = atof(split[9].c_str());
sql = StringFormat("INSERT INTO base_data(level, class, hp, mana, end, unk1, unk2, hp_fac, "
"mana_fac, end_fac) VALUES(%d, %d, %f, %f, %f, %f, %f, %f, %f, %f)",
level, class_id, hp, mana, end, unk1, unk2, hp_fac, mana_fac, end_fac);
db->QueryDatabase(sql);
}
fclose(f);
}
+124
View File
@@ -0,0 +1,124 @@
#CMake - Cross Platform Makefile Generator
#Copyright 2000-2011 Kitware, Inc., Insight Software Consortium
#All rights reserved.
#
#Redistribution and use in source and binary forms, with or without
#modification, are permitted provided that the following conditions
#are met:
#
#* Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
#* Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
#* Neither the names of Kitware, Inc., the Insight Software Consortium,
# nor the names of their contributors may be used to endorse or promote
# products derived from this software without specific prior written
# permission.
#
#THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
#"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
#LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
#A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
#HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
#SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
#LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
#DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
#THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
#(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
#OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# This module defines
# LUA51_FOUND, if false, do not try to link to Lua
# LUA_LIBRARIES
# LUA_INCLUDE_DIR, where to find lua.h
# LUA_VERSION_STRING, the version of Lua found (since CMake 2.8.8)
IF(LUA_ROOT)
FIND_PATH(LUA_INCLUDE_DIR
NAMES lua.h
HINTS
ENV LUA_DIR
PATHS
${LUA_ROOT}
~/Library/Frameworks
/Library/Frameworks
/sw
/opt/local
/opt/csw
/opt
PATH_SUFFIXES include/lua51 include/lua5.1 include/lua include src
)
FIND_LIBRARY(LUA_LIBRARY
NAMES lua51 lua5.1 lua-5.1 lua
HINTS
ENV LUA_DIR
PATHS
${LUA_ROOT}
~/Library/Frameworks
/Library/Frameworks
/sw
/opt/local
/opt/csw
/opt
PATH_SUFFIXES lib bin
)
ELSE(LUA_ROOT)
FIND_PATH(LUA_INCLUDE_DIR
NAMES lua.h
HINTS
ENV LUA_DIR
PATHS
~/Library/Frameworks
/Library/Frameworks
/sw
/opt/local
/opt/csw
/opt
PATH_SUFFIXES include/lua51 include/lua5.1 include/lua include
)
FIND_LIBRARY(LUA_LIBRARY
NAMES lua51 lua5.1 lua-5.1 lua
HINTS
ENV LUA_DIR
PATHS
~/Library/Frameworks
/Library/Frameworks
/sw
/opt/local
/opt/csw
/opt
PATH_SUFFIXES lib bin
)
ENDIF(LUA_ROOT)
IF(LUA_LIBRARY)
# include the math library for Unix
IF(UNIX AND NOT APPLE)
FIND_LIBRARY(LUA_MATH_LIBRARY m)
SET(LUA_LIBRARIES "${LUA_LIBRARY};${LUA_MATH_LIBRARY}" CACHE STRING "Lua Libraries")
# For Windows and Mac, don't need to explicitly include the math library
ELSE()
SET( LUA_LIBRARIES "${LUA_LIBRARY}" CACHE STRING "Lua Libraries")
ENDIF()
ENDIF()
IF(LUA_INCLUDE_DIR AND EXISTS "${LUA_INCLUDE_DIR}/lua.h")
FILE(STRINGS "${LUA_INCLUDE_DIR}/lua.h" lua_version_str REGEX "^#define[ \t]+LUA_RELEASE[ \t]+\"Lua .+\"")
STRING(REGEX REPLACE "^#define[ \t]+LUA_RELEASE[ \t]+\"Lua ([^\"]+)\".*" "\\1" LUA_VERSION_STRING "${lua_version_str}")
UNSET(lua_version_str)
ENDIF()
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Lua51
REQUIRED_VARS LUA_LIBRARIES LUA_INCLUDE_DIR
VERSION_VAR LUA_VERSION_STRING)
MARK_AS_ADVANCED(LUA_INCLUDE_DIR LUA_LIBRARIES LUA_LIBRARY LUA_MATH_LIBRARY)
-1
View File
@@ -82,4 +82,3 @@ MARK_AS_ADVANCED(
MySQL_LIBRARY_RELEASE
MySQL_INCLUDE_DIR
)
+160 -133
View File
@@ -1,73 +1,79 @@
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
SET(common_sources
BasePacket.cpp
base_packet.cpp
classes.cpp
Condition.cpp
condition.cpp
crash.cpp
CRC16.cpp
crc16.cpp
crc32.cpp
database.cpp
dbasync.cpp
dbcore.cpp
DBMemLeak.cpp
debug.cpp
emu_opcodes.cpp
EMuShareMem.cpp
EmuTCPConnection.cpp
EmuTCPServer.cpp
EQDB.cpp
EQDBRes.cpp
EQEmuConfig.cpp
EQEMuError.cpp
EQPacket.cpp
EQStream.cpp
EQStreamFactory.cpp
EQStreamIdent.cpp
EQStreamProxy.cpp
emu_tcp_connection.cpp
emu_tcp_server.cpp
eq_dictionary.cpp
eqdb.cpp
eqdb_res.cpp
eqemu_exception.cpp
eqemu_config.cpp
eqemu_error.cpp
eq_packet.cpp
eq_stream.cpp
eq_stream_factory.cpp
eq_stream_ident.cpp
eq_stream_proxy.cpp
eqtime.cpp
extprofile.cpp
faction.cpp
guild_base.cpp
guilds.cpp
Item.cpp
ipc_mutex.cpp
item.cpp
logsys.cpp
logsys_eqemu.cpp
md5.cpp
memory_mapped_file.cpp
misc.cpp
MiscFunctions.cpp
misc_functions.cpp
moremath.cpp
Mutex.cpp
mutex.cpp
mysql_request_result.cpp
mysql_request_row.cpp
opcode_map.cpp
opcodemgr.cpp
packet_dump.cpp
packet_dump_file.cpp
packet_functions.cpp
perl_EQDB.cpp
perl_EQDBRes.cpp
ProcLauncher.cpp
perl_eqdb.cpp
perl_eqdb_res.cpp
proc_launcher.cpp
ptimer.cpp
races.cpp
rdtsc.cpp
rulesys.cpp
serverinfo.cpp
shareddb.cpp
SharedLibrary.cpp
StructStrategy.cpp
TCPConnection.cpp
TCPServer.cpp
spdat.cpp
string_util.cpp
struct_strategy.cpp
tcp_connection.cpp
tcp_server.cpp
timeoutmgr.cpp
timer.cpp
unix.cpp
worldconn.cpp
XMLParser.cpp
xml_parser.cpp
platform.cpp
patches/Client62.cpp
patches/client62.cpp
patches/patches.cpp
patches/SoD.cpp
patches/SoF.cpp
patches/RoF.cpp
patches/Titanium.cpp
patches/Underfoot.cpp
patches/sod.cpp
patches/sof.cpp
patches/rof.cpp
patches/titanium.cpp
patches/underfoot.cpp
SocketLib/Base64.cpp
SocketLib/File.cpp
SocketLib/HttpdCookies.cpp
@@ -87,67 +93,77 @@ SET(common_sources
)
SET(common_headers
BasePacket.h
any.h
base_packet.h
base_data.h
bodytypes.h
breakdowns.h
classes.h
common_profile.h
Condition.h
condition.h
crash.h
CRC16.h
crc16.h
crc32.h
database.h
dbasync.h
dbcore.h
DBMemLeak.h
debug.h
deity.h
emu_opcodes.h
emu_oplist.h
EMuShareMem.h
EmuTCPConnection.h
EmuTCPServer.h
emu_tcp_connection.h
emu_tcp_server.h
eq_constants.h
eq_opcodes.h
eq_dictionary.h
eq_packet_structs.h
EQDB.h
EQDBRes.h
EQEmuConfig.h
EQEmuConfig_elements.h
EQEMuError.h
EQPacket.h
EQStream.h
EQStreamFactory.h
EQStreamIdent.h
EQStreamIntf.h
EQStreamLocator.h
EQStreamProxy.h
EQStreamType.h
eqdb.h
eqdb_res.h
eqemu_exception.h
eqemu_config.h
eqemu_config_elements.h
eqemu_error.h
eq_packet.h
eq_stream.h
eq_stream_factory.h
eq_stream_ident.h
eq_stream_intf.h
eq_stream_locator.h
eq_stream_proxy.h
eq_stream_type.h
eqtime.h
errmsg.h
extprofile.h
faction.h
features.h
fixed_memory_hash_set.h
fixed_memory_variable_hash_set.h
guild_base.h
guilds.h
Item.h
ipc_mutex.h
item.h
item_fieldlist.h
item_struct.h
languages.h
linked_list.h
logsys.h
logtypes.h
loottable.h
mail_oplist.h
md5.h
memory_mapped_file.h
misc.h
MiscFunctions.h
misc_functions.h
moremath.h
Mutex.h
mutex.h
mysql_request_result.h
mysql_request_row.h
op_codes.h
opcode_dispatch.h
opcodemgr.h
packet_dump.h
packet_dump_file.h
packet_functions.h
ProcLauncher.h
platform.h
proc_launcher.h
profiler.h
ptimer.h
queue.h
@@ -159,12 +175,13 @@ SET(common_headers
serverinfo.h
servertalk.h
shareddb.h
SharedLibrary.h
skills.h
StructStrategy.h
TCPBasicServer.h
TCPConnection.h
TCPServer.h
spdat.h
string_util.h
struct_strategy.h
tcp_basic_server.h
tcp_connection.h
tcp_server.h
timeoutmgr.h
timer.h
types.h
@@ -172,38 +189,43 @@ SET(common_headers
useperl.h
version.h
worldconn.h
XMLParser.h
ZoneNumbers.h
platform.h
patches/Client62.h
patches/Client62_itemfields.h
patches/Client62_ops.h
patches/Client62_structs.h
xml_parser.h
zone_numbers.h
patches/client62.h
patches/client62_constants.h
patches/client62_itemfields.h
patches/client62_ops.h
patches/client62_structs.h
patches/patches.h
patches/SoD.h
patches/SoD_itemfields.h
patches/SoD_ops.h
patches/SoD_structs.h
patches/SoF.h
patches/SoF_itemfields.h
patches/SoF_opcode_list.h
patches/SoF_ops.h
patches/SoF_structs.h
patches/SSDeclare.h
patches/SSDefine.h
patches/SSRegister.h
patches/RoF.h
patches/RoF_itemfields.h
patches/RoF_ops.h
patches/RoF_structs.h
patches/Titanium.h
patches/Titanium_itemfields.h
patches/Titanium_ops.h
patches/Titanium_structs.h
patches/Underfoot.h
patches/Underfoot_itemfields.h
patches/Underfoot_ops.h
patches/Underfoot_structs.h
patches/sod.h
patches/sod_constants.h
patches/sod_itemfields.h
patches/sod_ops.h
patches/sod_structs.h
patches/sof.h
patches/sof_constants.h
patches/sof_itemfields.h
patches/sof_opcode_list.h
patches/sof_ops.h
patches/sof_structs.h
patches/ss_declare.h
patches/ss_define.h
patches/ss_register.h
patches/rof.h
patches/rof_constants.h
patches/rof_itemfields.h
patches/rof_ops.h
patches/rof_structs.h
patches/titanium.h
patches/titanium_constants.h
patches/titanium_itemfields.h
patches/titanium_ops.h
patches/titanium_structs.h
patches/underfoot.h
patches/underfoot_constants.h
patches/underfoot_itemfields.h
patches/underfoot_ops.h
patches/underfoot_structs.h
SocketLib/Base64.h
SocketLib/File.h
SocketLib/HttpdCookies.h
@@ -222,42 +244,48 @@ SET(common_headers
)
SOURCE_GROUP(Patches FILES
patches/Client62.h
patches/Client62_itemfields.h
patches/Client62_ops.h
patches/Client62_structs.h
patches/client62.h
patches/client62_itemfields.h
patches/client62_ops.h
patches/client62_constants.h
patches/client62_structs.h
patches/patches.h
patches/SoD.h
patches/SoD_itemfields.h
patches/SoD_ops.h
patches/SoD_structs.h
patches/SoF.h
patches/SoF_itemfields.h
patches/SoF_opcode_list.h
patches/SoF_ops.h
patches/SoF_structs.h
patches/SSDeclare.h
patches/SSDefine.h
patches/SSRegister.h
patches/RoF.h
patches/RoF_itemfields.h
patches/RoF_ops.h
patches/RoF_structs.h
patches/Titanium.h
patches/Titanium_itemfields.h
patches/Titanium_ops.h
patches/Titanium_structs.h
patches/Underfoot.h
patches/Underfoot_itemfields.h
patches/Underfoot_ops.h
patches/Underfoot_structs.h
patches/Client62.cpp
patches/sod.h
patches/sod_itemfields.h
patches/sod_ops.h
patches/sod_constants.h
patches/sod_structs.h
patches/sof.h
patches/sof_itemfields.h
patches/sof_opcode_list.h
patches/sof_ops.h
patches/sof_constants.h
patches/sof_structs.h
patches/ss_declare.h
patches/ss_define.h
patches/ss_register.h
patches/rof.h
patches/rof_itemfields.h
patches/rof_ops.h
patches/rof_constants.h
patches/rof_structs.h
patches/titanium.h
patches/titanium_itemfields.h
patches/titanium_ops.h
patches/titanium_constants.h
patches/titanium_structs.h
patches/underfoot.h
patches/underfoot_itemfields.h
patches/underfoot_ops.h
patches/underfoot_constants.h
patches/underfoot_structs.h
patches/client62.cpp
patches/patches.cpp
patches/SoD.cpp
patches/SoF.cpp
patches/RoF.cpp
patches/Titanium.cpp
patches/Underfoot.cpp
patches/sod.cpp
patches/sof.cpp
patches/rof.cpp
patches/titanium.cpp
patches/underfoot.cpp
)
SOURCE_GROUP(SocketLib FILES
@@ -302,12 +330,11 @@ SOURCE_GROUP(TinyXML FILES
INCLUDE_DIRECTORIES(Patches SocketLib StackWalker TinyXML)
ADD_LIBRARY(Common ${common_sources} ${common_headers})
ADD_LIBRARY(common ${common_sources} ${common_headers})
IF(UNIX)
ADD_DEFINITIONS(-fPIC)
SET_SOURCE_FILES_PROPERTIES("patches/SoD.cpp" "patches/SoF.cpp" "patches/RoF.cpp" "patches/Underfoot.cpp" PROPERTIES COMPILE_FLAGS -O0)
SET_SOURCE_FILES_PROPERTIES("patches/sod.cpp" "patches/sof.cpp" "patches/rof.cpp" "patches/underfoot.cpp" PROPERTIES COMPILE_FLAGS -O0)
ENDIF(UNIX)
SET(LIBRARY_OUTPUT_PATH ../Bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
-346
View File
@@ -1,346 +0,0 @@
#include <stdio.h>
unsigned long IntArray[]={
0x00000000,
0x77073096,
0xEE0E612C,
0x990951BA,
0x076DC419,
0x706AF48F,
0xE963A535,
0x9E6495A3,
0x0EDB8832,
0x79DCB8A4,
0xE0D5E91E,
0x97D2D988,
0x09B64C2B,
0x7EB17CBD,
0xE7B82D07,
0x90BF1D91,
0x1DB71064,
0x6AB020F2,
0xF3B97148,
0x84BE41DE,
0x1ADAD47D,
0x6DDDE4EB,
0xF4D4B551,
0x83D385C7,
0x136C9856,
0x646BA8C0,
0xFD62F97A,
0x8A65C9EC,
0x14015C4F,
0x63066CD9,
0xFA0F3D63,
0x8D080DF5,
0x3B6E20C8,
0x4C69105E,
0xD56041E4,
0xA2677172,
0x3C03E4D1,
0x4B04D447,
0xD20D85FD,
0xA50AB56B,
0x35B5A8FA,
0x42B2986C,
0xDBBBC9D6,
0xACBCF940,
0x32D86CE3,
0x45DF5C75,
0xDCD60DCF,
0xABD13D59,
0x26D930AC,
0x51DE003A,
0xC8D75180,
0xBFD06116,
0x21B4F4B5,
0x56B3C423,
0xCFBA9599,
0xB8BDA50F,
0x2802B89E,
0x5F058808,
0xC60CD9B2,
0xB10BE924,
0x2F6F7C87,
0x58684C11,
0xC1611DAB,
0xB6662D3D,
0x76DC4190,
0x01DB7106,
0x98D220BC,
0xEFD5102A,
0x71B18589,
0x06B6B51F,
0x9FBFE4A5,
0xE8B8D433,
0x7807C9A2,
0x0F00F934,
0x9609A88E,
0xE10E9818,
0x7F6A0DBB,
0x086D3D2D,
0x91646C97,
0xE6635C01,
0x6B6B51F4,
0x1C6C6162,
0x856530D8,
0xF262004E,
0x6C0695ED,
0x1B01A57B,
0x8208F4C1,
0xF50FC457,
0x65B0D9C6,
0x12B7E950,
0x8BBEB8EA,
0xFCB9887C,
0x62DD1DDF,
0x15DA2D49,
0x8CD37CF3,
0xFBD44C65,
0x4DB26158,
0x3AB551CE,
0xA3BC0074,
0xD4BB30E2,
0x4ADFA541,
0x3DD895D7,
0xA4D1C46D,
0xD3D6F4FB,
0x4369E96A,
0x346ED9FC,
0xAD678846,
0xDA60B8D0,
0x44042D73,
0x33031DE5,
0xAA0A4C5F,
0xDD0D7CC9,
0x5005713C,
0x270241AA,
0xBE0B1010,
0xC90C2086,
0x5768B525,
0x206F85B3,
0xB966D409,
0xCE61E49F,
0x5EDEF90E,
0x29D9C998,
0xB0D09822,
0xC7D7A8B4,
0x59B33D17,
0x2EB40D81,
0xB7BD5C3B,
0xC0BA6CAD,
0xEDB88320,
0x9ABFB3B6,
0x03B6E20C,
0x74B1D29A,
0xEAD54739,
0x9DD277AF,
0x04DB2615,
0x73DC1683,
0xE3630B12,
0x94643B84,
0x0D6D6A3E,
0x7A6A5AA8,
0xE40ECF0B,
0x9309FF9D,
0x0A00AE27,
0x7D079EB1,
0xF00F9344,
0x8708A3D2,
0x1E01F268,
0x6906C2FE,
0xF762575D,
0x806567CB,
0x196C3671,
0x6E6B06E7,
0xFED41B76,
0x89D32BE0,
0x10DA7A5A,
0x67DD4ACC,
0xF9B9DF6F,
0x8EBEEFF9,
0x17B7BE43,
0x60B08ED5,
0xD6D6A3E8,
0xA1D1937E,
0x38D8C2C4,
0x4FDFF252,
0xD1BB67F1,
0xA6BC5767,
0x3FB506DD,
0x48B2364B,
0xD80D2BDA,
0xAF0A1B4C,
0x36034AF6,
0x41047A60,
0xDF60EFC3,
0xA867DF55,
0x316E8EEF,
0x4669BE79,
0xCB61B38C,
0xBC66831A,
0x256FD2A0,
0x5268E236,
0xCC0C7795,
0xBB0B4703,
0x220216B9,
0x5505262F,
0xC5BA3BBE,
0xB2BD0B28,
0x2BB45A92,
0x5CB36A04,
0xC2D7FFA7,
0xB5D0CF31,
0x2CD99E8B,
0x5BDEAE1D,
0x9B64C2B0,
0xEC63F226,
0x756AA39C,
0x026D930A,
0x9C0906A9,
0xEB0E363F,
0x72076785,
0x05005713,
0x95BF4A82,
0xE2B87A14,
0x7BB12BAE,
0x0CB61B38,
0x92D28E9B,
0xE5D5BE0D,
0x7CDCEFB7,
0x0BDBDF21,
0x86D3D2D4,
0xF1D4E242,
0x68DDB3F8,
0x1FDA836E,
0x81BE16CD,
0xF6B9265B,
0x6FB077E1,
0x18B74777,
0x88085AE6,
0xFF0F6A70,
0x66063BCA,
0x11010B5C,
0x8F659EFF,
0xF862AE69,
0x616BFFD3,
0x166CCF45,
0xA00AE278,
0xD70DD2EE,
0x4E048354,
0x3903B3C2,
0xA7672661,
0xD06016F7,
0x4969474D,
0x3E6E77DB,
0xAED16A4A,
0xD9D65ADC,
0x40DF0B66,
0x37D83BF0,
0xA9BCAE53,
0xDEBB9EC5,
0x47B2CF7F,
0x30B5FFE9,
0xBDBDF21C,
0xCABAC28A,
0x53B39330,
0x24B4A3A6,
0xBAD03605,
0xCDD70693,
0x54DE5729,
0x23D967BF,
0xB3667A2E,
0xC4614AB8,
0x5D681B02,
0x2A6F2B94,
0xB40BBE37,
0xC30C8EA1,
0x5A05DF1B,
0x2D02EF8D,
};
unsigned long CRC16(const unsigned char *buf, int size, int key)
{
//printf("CRC16() key=%d\n",key);
/*
sub_0_10020760 proc near ; CODE XREF: sub_0_10008620+AEp
; sub_0_10022A90+14Fp ...
arg_0 = dword ptr 4
arg_4 = dword ptr 8
arg_8 = dword ptr 0Ch
*/
//int *pecx = buf;
unsigned long ecx = key; //mov ecx, [esp+arg_8]
unsigned long eax = ecx; //mov eax, ecx
unsigned long edi;
/* int ecx = key; //mov ecx, [esp+arg_8]
int eax = ecx; //mov eax, ecx
int edi;
*/
eax = ~ eax; //not eax
eax&=0xFF; //and eax, 0FFh
eax=IntArray[eax]; //mov eax, dword_0_10115D38[eax*4] IntArray
eax ^= 0x00FFFFFF; //xor eax, 0FFFFFFh
int edx = ecx; //mov edx, ecx
edx = edx >> 8; //sar edx, 8
edx = edx ^ eax; //xor edx, eax
eax = eax >> 8; //sar eax, 8
edx &= 0xFF; //and edx, 0FFh
eax &= 0x00FFFFFF; //and eax, 0FFFFFFh
//push esi
eax ^= IntArray[edx]; //xor eax, dword_0_10115D38[edx*4]
edx = ecx; //mov edx, ecx
edx = edx >> 0x10; //sar edx, 10h
edx ^= eax; //xor edx, eax
eax = eax >> 8; //sar eax, 8
edx &= 0xFF; //and edx, 0FFh
int esi = IntArray[edx]; //mov esi, dword_0_10115D38[edx*4]
edx = size; //mov edx, [esp+4+arg_4]
eax &= 0x00FFFFFF; //and eax, 0FFFFFFh
eax ^= esi; //xor eax, esi
ecx = ecx >> 0x18; //sar ecx, 18h
ecx ^= eax; //xor ecx, eax
ecx &= 0xFF; //and ecx, 0FFh
esi = IntArray[ecx]; //mov esi, dword_0_10115D38[ecx*4]
/*ecx = (int) buf; not used */ //mov ecx, [esp+4+arg_0]
eax = eax >> 8; //sar eax, 8
eax &= 0x00FFFFFF; //and eax, 0FFFFFFh
eax ^= esi; //xor eax, esi
/* int* esi = ecx+edx //??*///lea esi, [ecx+edx]
for(int x = 0; x < size; x++)
{ //eax is the crc, ecx is the current part of the buffer
int edx = 0; //xor edx, edx
edx = buf[x] & 0x00FF; //mov dl, [ecx]
/*if(pos > size) //cmp ecx, esi
return ~eax; //jnb short loc_0_10020803
*/
//push edi
//loc_0_100207E0: ; CODE XREF: sub_0_10020760+A0j
//LOOP
edx ^= eax; //xor edx, eax
eax = eax >> 8; //sar eax, 8
edx &= 0xFF; //and edx, 0FFh
edi = IntArray[edx]; //mov edi, dword_0_10115D38[edx*4]
eax &= 0x00FFFFFF; //and eax, 0FFFFFFh
eax ^= edi; //xor eax, edi
//inc ecx
//cmp ecx, esi
// jb short loc_0_100207E0
//pop edi
}
return ~eax;
}
/*loc_0_10020803: ; CODE XREF: sub_0_10020760+7Dj
not eax
pop esi
retn
sub_0_10020760 endp
*/
-6
View File
@@ -1,6 +0,0 @@
#ifndef _CRC16_H
#define _CRC16_H
unsigned long CRC16(const unsigned char *buf, int size, int key);
#endif
-153
View File
@@ -1,153 +0,0 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "debug.h"
#include "Condition.h"
#ifdef _WINDOWS
#else
#include <pthread.h>
#include <sys/time.h>
#include <errno.h>
#endif
#ifdef _WINDOWS
Condition::Condition()
{
m_events[SignalEvent] = CreateEvent (NULL, // security
FALSE, // is auto-reset event?
FALSE, // is signaled initially?
NULL); // name
m_events[BroadcastEvent] = CreateEvent (NULL, // security
TRUE, // is auto-reset event?
FALSE, // is signaled initially?
NULL); // name
m_waiters = 0;
InitializeCriticalSection(&CSMutex);
}
Condition::~Condition()
{
DeleteCriticalSection(&CSMutex);
CloseHandle(m_events[SignalEvent]);
CloseHandle(m_events[BroadcastEvent]);
}
void Condition::Signal()
{
EnterCriticalSection(&CSMutex);
if(m_waiters > 0)
SetEvent(m_events[SignalEvent]);
LeaveCriticalSection(&CSMutex);
}
void Condition::SignalAll()
{
EnterCriticalSection(&CSMutex);
if(m_waiters > 0)
SetEvent(m_events[BroadcastEvent]);
LeaveCriticalSection(&CSMutex);
}
void Condition::Wait()
{
EnterCriticalSection(&CSMutex);
m_waiters++;
LeaveCriticalSection(&CSMutex);
int result = WaitForMultipleObjects (_eventCount, m_events, FALSE, INFINITE);
EnterCriticalSection(&CSMutex);
m_waiters--;
//see if we are the last person waiting on the condition, and there was a broadcast
//if so, we need to reset the broadcast event.
if(m_waiters == 0 && result == (WAIT_OBJECT_0+BroadcastEvent))
ResetEvent(m_events[BroadcastEvent]);
LeaveCriticalSection(&CSMutex);
}
#else //!WIN32
Condition::Condition()
{
pthread_cond_init(&cond,NULL);
pthread_mutex_init(&mutex,NULL);
}
void Condition::Signal()
{
pthread_mutex_lock(&mutex);
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}
void Condition::SignalAll()
{
pthread_mutex_lock(&mutex);
pthread_cond_broadcast(&cond);
pthread_mutex_unlock(&mutex);
}
void Condition::Wait()
{
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond,&mutex);
pthread_mutex_unlock(&mutex);
}
/*
I commented this specifically because I think it might be very
difficult to write a windows counterpart to it, so I would like
to discourage its use until we can confirm that it can be reasonably
implemented on windows.
bool Condition::TimedWait(unsigned long usec)
{
struct timeval now;
struct timespec timeout;
int retcode=0;
pthread_mutex_lock(&mutex);
gettimeofday(&now,NULL);
now.tv_usec+=usec;
timeout.tv_sec = now.tv_sec + (now.tv_usec/1000000);
timeout.tv_nsec = (now.tv_usec%1000000) *1000;
//cout << "now=" << now.tv_sec << "."<<now.tv_usec << endl;
//cout << "timeout=" << timeout.tv_sec << "."<<timeout.tv_nsec << endl;
retcode=pthread_cond_timedwait(&cond,&mutex,&timeout);
pthread_mutex_unlock(&mutex);
return retcode!=ETIMEDOUT;
}
*/
Condition::~Condition()
{
pthread_mutex_lock(&mutex);
pthread_cond_destroy(&cond);
pthread_mutex_unlock(&mutex);
pthread_mutex_destroy(&mutex);
}
#endif
-56
View File
@@ -1,56 +0,0 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef __CONDITION_H
#define __CONDITION_H
#include "debug.h"
#ifndef WIN32
#include <pthread.h>
#endif
//Sombody, someday needs to figure out how to implement a condition
//system on windows...
class Condition {
private:
#ifdef WIN32
enum {
SignalEvent = 0,
BroadcastEvent,
_eventCount
};
HANDLE m_events[_eventCount];
uint32 m_waiters;
CRITICAL_SECTION CSMutex;
#else
pthread_cond_t cond;
pthread_mutex_t mutex;
#endif
public:
Condition();
void Signal();
void SignalAll();
void Wait();
// bool TimedWait(unsigned long usec);
~Condition();
};
#endif
-62
View File
@@ -1,62 +0,0 @@
#ifdef _EQDEBUG
#include "../common/debug.h"
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include "../common/Mutex.h"
#include "DBMemLeak.h"
#include <crtdbg.h>
#ifdef _WINDOWS
#define snprintf _snprintf
#define strncasecmp _strnicmp
#define strcasecmp _stricmp
#endif
DBMemLeak dbmemleak;
LinkedList<DBMemLeakStruct*>* list = 0;
Mutex MDBMemLeak;
DBMemLeak::DBMemLeak() {
list = new LinkedList<DBMemLeakStruct*>;
}
DBMemLeak::~DBMemLeak() {
LinkedListIterator<DBMemLeakStruct*> iterator(*list);
iterator.Reset();
while (iterator.MoreElements()) {
char tmp[200];
snprintf(tmp, sizeof(tmp) - 3, "DB Mem Leak: Block=%6d, Query=%s", iterator.GetData()->memblock, iterator.GetData()->query);
snprintf(tmp, sizeof(tmp), "%s\n", tmp);
OutputDebugString(tmp);
iterator.Advance();
}
safe_delete(list);
}
void DBMemLeak::Alloc(const void* result, const char* query) {
LockMutex lock(&MDBMemLeak);
long requestNumber;
uint8* tmp2 = new uint8;
_CrtIsMemoryBlock( tmp2, 1, &requestNumber, 0, 0 );
safe_delete(tmp2);
DBMemLeakStruct* tmp = (DBMemLeakStruct*) new uchar[sizeof(DBMemLeakStruct) + strlen(query) + 1];
tmp->result = result;
tmp->memblock = requestNumber;
strcpy(tmp->query, query);
list->Append(tmp);
}
void DBMemLeak::Free(const void* result) {
LockMutex lock(&MDBMemLeak);
LinkedListIterator<DBMemLeakStruct*> iterator(*list);
iterator.Reset();
while (iterator.MoreElements()) {
if (result == iterator.GetData()->result)
iterator.RemoveCurrent();
else
iterator.Advance();
}
}
#endif
-25
View File
@@ -1,25 +0,0 @@
#ifdef _EQDEBUG
#ifndef DBMemLeak_H
#define DBMemLeak_H
#include "../common/types.h"
#include "../common/linked_list.h"
#define mysql_free_result(r) { DBMemLeak::Free(r); mysql_free_result(r); }
struct DBMemLeakStruct {
const void* result;
uint32 memblock;
char query[0];
};
class DBMemLeak {
public:
DBMemLeak();
~DBMemLeak();
static void Alloc(const void* result, const char* query);
static void Free(const void* result);
};
#endif
#endif
-300
View File
@@ -1,300 +0,0 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "../common/debug.h"
#include <iostream>
using namespace std;
#include "../common/types.h"
#include "EMuShareMem.h"
#ifdef _WINDOWS
#define snprintf _snprintf
#if (_MSC_VER < 1500)
#define vsnprintf _vsnprintf
#endif
#define strncasecmp _strnicmp
#define strcasecmp _stricmp
#define EmuLibName "EMuShareMem"
#else
#define EmuLibName "libEMuShareMem.so"
#endif
LoadEMuShareMemDLL EMuShareMemDLL;
#ifndef WIN32
uint32 LoadEMuShareMemDLL::refCount = 0;
#endif
LoadEMuShareMemDLL::LoadEMuShareMemDLL() {
ClearFunc();
#ifndef WIN32
refCountU();
#endif
}
LoadEMuShareMemDLL::~LoadEMuShareMemDLL() {
#ifndef WIN32
if (refCountD() <= 0) {
#endif
Unload();
#ifndef WIN32
}
#endif
}
bool LoadEMuShareMemDLL::Load() {
if(loaded)
return(true);
if(!SharedLibrary::Load(EmuLibName))
return(false);
if (Loaded()) {
Items.GetItem = (DLLFUNC_GetItem) GetSym("GetItem");
Items.IterateItems = (DLLFUNC_IterateItems) GetSym("IterateItems");
Items.cbAddItem = (DLLFUNC_AddItem) GetSym("AddItem");
Items.DLLLoadItems = (DLLFUNC_DLLLoadItems) GetSym("DLLLoadItems");
Doors.GetDoor = (DLLFUNC_GetDoor) GetSym("GetDoor");
Doors.cbAddDoor = (DLLFUNC_AddDoor) GetSym("AddDoor");
Doors.DLLLoadDoors = (DLLFUNC_DLLLoadDoors) GetSym("DLLLoadDoors");
Spells.DLLLoadSPDat = (DLLFUNC_DLLLoadSPDat) GetSym("DLLLoadSPDat");
NPCFactionList.DLLLoadNPCFactionLists = (DLLFUNC_DLLLoadNPCFactionLists) GetSym("DLLLoadNPCFactionLists");
NPCFactionList.GetNPCFactionList = (DLLFUNC_GetNPCFactionList) GetSym("GetNPCFactionList");
NPCFactionList.cbAddNPCFactionList = (DLLFUNC_AddNPCFactionList) GetSym("AddNPCFactionList");
NPCFactionList.cbSetFaction = (DLLFUNC_SetFaction) GetSym("SetNPCFaction");
Loot.DLLLoadLoot = (DLLFUNC_DLLLoadLoot) GetSym("DLLLoadLoot");
Loot.cbAddLootTable = (DLLFUNC_AddLootTable) GetSym("AddLootTable");
Loot.cbAddLootDrop = (DLLFUNC_AddLootDrop) GetSym("AddLootDrop");
Loot.GetLootTable = (DLLFUNC_GetLootTable) GetSym("GetLootTable");
Loot.GetLootDrop = (DLLFUNC_GetLootDrop) GetSym("GetLootDrop");
Opcodes.GetEQOpcode = (DLLFUNC_GetEQOpcode) GetSym("GetEQOpcode");
Opcodes.GetEmuOpcode = (DLLFUNC_GetEmuOpcode) GetSym("GetEmuOpcode");
Opcodes.SetOpcodePair = (DLLFUNC_SetOpcodePair) GetSym("SetOpcodePair");
Opcodes.DLLLoadOpcodes = (DLLFUNC_DLLLoadOpcodes) GetSym("DLLLoadOpcodes");
Opcodes.ClearEQOpcodes = (DLLFUNC_ClearEQOpcodes) GetSym("ClearEQOpcodes");
SkillCaps.LoadSkillCaps = (DLLFUNC_DLLLoadSkillCaps) GetSym("LoadSkillCaps");
SkillCaps.GetSkillCap = (DLLFUNC_GetSkillCap) GetSym("GetSkillCap");
SkillCaps.SetSkillCap = (DLLFUNC_SetSkillCap) GetSym("SetSkillCap");
SkillCaps.ClearSkillCaps = (DLLFUNC_ClearSkillCaps) GetSym("ClearSkillCaps");
SkillCaps.GetTrainLevel = (DLLFUNC_GetTrainLevel) GetSym("GetTrainLevel");
if(Items.GetItem == NULL) {
Unload();
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Items.GetItem");
return(false);
}
if(Items.IterateItems == NULL) {
Unload();
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Items.IterateItems");
return(false);
}
if(Items.cbAddItem == NULL) {
Unload();
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Items.cbAddItem");
return(false);
}
if(Items.DLLLoadItems == NULL) {
Unload();
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Items.DLLLoadItems");
return(false);
}
if(Doors.GetDoor == NULL) {
Unload();
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Doors.GetDoor");
return(false);
}
if(Doors.cbAddDoor == NULL) {
Unload();
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Doors.cbAddDoor");
return(false);
}
if(Doors.DLLLoadDoors == NULL) {
Unload();
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Doors.DLLLoadDoors");
return(false);
}
if(Spells.DLLLoadSPDat == NULL) {
Unload();
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Spells.DLLLoadSPDat");
return(false);
}
if(NPCFactionList.DLLLoadNPCFactionLists == NULL) {
Unload();
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach NPCFactionList.DLLLoadNPCFactionLists");
return(false);
}
if(NPCFactionList.GetNPCFactionList == NULL) {
Unload();
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach NPCFactionList.GetNPCFactionList");
return(false);
}
if(NPCFactionList.cbAddNPCFactionList == NULL) {
Unload();
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach NPCFactionList.cbAddNPCFactionList");
return(false);
}
if(NPCFactionList.cbSetFaction == NULL) {
Unload();
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach NPCFactionList.cbSetFaction");
return(false);
}
if(Loot.DLLLoadLoot == NULL) {
Unload();
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Loot.DLLLoadLoot");
return(false);
}
if(Loot.cbAddLootTable == NULL) {
Unload();
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Loot.cbAddLootTable");
return(false);
}
if(Loot.cbAddLootDrop == NULL) {
Unload();
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Loot.cbAddLootDrop");
return(false);
}
if(Loot.GetLootTable == NULL) {
Unload();
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Loot.GetLootTable");
return(false);
}
if(Loot.GetLootDrop == NULL) {
Unload();
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Loot.GetLootDrop");
return(false);
}
if(Opcodes.GetEQOpcode == NULL) {
Unload();
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Opcodes.GetEQOpcode");
return(false);
}
if(Opcodes.GetEmuOpcode == NULL) {
Unload();
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Opcodes.GetEmuOpcode");
return(false);
}
if(Opcodes.SetOpcodePair == NULL) {
Unload();
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Opcodes.SetOpcodePair");
return(false);
}
if(Opcodes.DLLLoadOpcodes == NULL) {
Unload();
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Opcodes.DLLLoadOpcodes");
return(false);
}
if(Opcodes.ClearEQOpcodes == NULL) {
Unload();
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach Opcodes.ClearEQOpcodes");
return(false);
}
if(SkillCaps.LoadSkillCaps == NULL) {
Unload();
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach SkillCaps.LoadSkillCaps");
return(false);
}
if(SkillCaps.GetSkillCap == NULL) {
Unload();
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach SkillCaps.GetSkillCap");
return(false);
}
if(SkillCaps.SetSkillCap == NULL) {
Unload();
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach SkillCaps.SetSkillCap");
return(false);
}
if(SkillCaps.ClearSkillCaps == NULL) {
Unload();
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach SkillCaps.ClearSkillCaps");
return(false);
}
if(SkillCaps.GetTrainLevel == NULL) {
Unload();
LogFile->write(EQEMuLog::Error, "LoadEMuShareMemDLL::Load() failed to attach SkillCaps.GetTrainLevel");
return(false);
}
LogFile->write(EQEMuLog::Status, "%s loaded", EmuLibName);
loaded = true;
return true;
}
else {
LogFile->write(EQEMuLog::Error, "%s was not loaded, but did not report an error.", EmuLibName);
}
return false;
}
void LoadEMuShareMemDLL::Unload() {
ClearFunc();
SharedLibrary::Unload();
}
void LoadEMuShareMemDLL::ClearFunc() {
Items.GetItem = 0;
Items.IterateItems = 0;
Items.cbAddItem = 0;
Items.DLLLoadItems = 0;
Doors.GetDoor = 0;
Doors.cbAddDoor = 0;
Doors.DLLLoadDoors = 0;
NPCFactionList.DLLLoadNPCFactionLists = 0;
NPCFactionList.GetNPCFactionList = 0;
NPCFactionList.cbAddNPCFactionList = 0;
NPCFactionList.cbSetFaction = 0;
Loot.DLLLoadLoot = 0;
Loot.cbAddLootTable = 0;
Loot.cbAddLootDrop = 0;
Loot.GetLootTable = 0;
Loot.GetLootDrop = 0;
Opcodes.GetEQOpcode = NULL;
Opcodes.GetEmuOpcode = NULL;
Opcodes.SetOpcodePair = NULL;
Opcodes.DLLLoadOpcodes = NULL;
Opcodes.ClearEQOpcodes = NULL;
SkillCaps.LoadSkillCaps = NULL;
SkillCaps.GetSkillCap = NULL;
SkillCaps.SetSkillCap = NULL;
SkillCaps.ClearSkillCaps = NULL;
SkillCaps.GetTrainLevel = NULL;
loaded = false;
}
-187
View File
@@ -1,187 +0,0 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef EMuShareMem_H
#define EMuShareMem_H
#ifdef _WINDOWS
#include <windows.h>
#else
#include "../common/unix.h"
#endif
#include "../common/eq_packet_structs.h"
#include "../zone/zonedump.h"
#include "../zone/loottable.h"
#include "SharedLibrary.h"
////////////
// Items //
///////////
typedef bool(*CALLBACK_DBLoadItems)(int32, uint32);
typedef bool(*DLLFUNC_DLLLoadItems)(const CALLBACK_DBLoadItems, uint32, int32*, uint32*);
typedef const Item_Struct*(*DLLFUNC_GetItem)(uint32);
typedef const Item_Struct*(*DLLFUNC_IterateItems)(uint32*);
typedef bool(*DLLFUNC_AddItem)(uint32, const Item_Struct*);
struct ItemsDLLFunc_Struct {
DLLFUNC_DLLLoadItems DLLLoadItems;
DLLFUNC_GetItem GetItem;
DLLFUNC_IterateItems IterateItems;
DLLFUNC_AddItem cbAddItem;
};
/*
typedef bool(*CALLBACK_DBLoadNPCTypes)(int32, uint32);
typedef bool(*DLLFUNC_DLLLoadNPCTypes)(const CALLBACK_DBLoadNPCTypes, uint32, int32*, uint32*);
typedef const NPCType*(*DLLFUNC_GetNPCType)(uint32);
typedef bool(*DLLFUNC_AddNPCType)(uint32, const NPCType*);
struct NPCTypesDLLFunc_Struct {
DLLFUNC_DLLLoadNPCTypes DLLLoadNPCTypes;
DLLFUNC_GetNPCType GetNPCType;
DLLFUNC_AddNPCType cbAddNPCType;
};
*/
////////////
// Doors ///
////////////
typedef bool(*CALLBACK_DBLoadDoors)(int32, uint32);
typedef bool(*DLLFUNC_DLLLoadDoors)(const CALLBACK_DBLoadDoors, uint32, int32*, uint32*);
typedef const Door*(*DLLFUNC_GetDoor)(uint32);
typedef bool(*DLLFUNC_AddDoor)(uint32, const Door*);
struct DoorsDLLFunc_Struct {
DLLFUNC_DLLLoadDoors DLLLoadDoors;
DLLFUNC_GetDoor GetDoor;
DLLFUNC_AddDoor cbAddDoor;
};
////////////
// Spells //
////////////
typedef bool(*CALLBACK_FileLoadSPDat)(void*, int32);
typedef bool(*DLLFUNC_DLLLoadSPDat)(const CALLBACK_FileLoadSPDat, const void**, int32*, uint32);
struct SpellsDLLFunc_Struct {
DLLFUNC_DLLLoadSPDat DLLLoadSPDat;
};
//////////////
// Factions //
//////////////
typedef bool(*CALLBACK_DBLoadNPCFactionLists)(int32, uint32);
typedef bool(*DLLFUNC_DLLLoadNPCFactionLists)(const CALLBACK_DBLoadNPCFactionLists, uint32, int32*, uint32*, uint8);
typedef const NPCFactionList*(*DLLFUNC_GetNPCFactionList)(uint32);
typedef bool(*DLLFUNC_AddNPCFactionList)(uint32, const NPCFactionList*);
typedef bool(*DLLFUNC_SetFaction)(uint32, uint32*, int32*, int8*, uint8*);
struct NPCFactionListDLLFunc_Struct {
DLLFUNC_DLLLoadNPCFactionLists DLLLoadNPCFactionLists;
DLLFUNC_GetNPCFactionList GetNPCFactionList;
DLLFUNC_AddNPCFactionList cbAddNPCFactionList;
DLLFUNC_SetFaction cbSetFaction;
};
////////////
// Loot //
///////////
typedef bool(*CALLBACK_DBLoadLoot)();
typedef bool(*DLLFUNC_DLLLoadLoot)(const CALLBACK_DBLoadLoot, uint32, uint32, uint32, uint32, uint32, uint32, uint32, uint32, uint32, uint32);
typedef bool(*DLLFUNC_AddLootTable)(uint32, const LootTable_Struct*);
typedef bool(*DLLFUNC_AddLootDrop)(uint32, const LootDrop_Struct*);
typedef const LootTable_Struct*(*DLLFUNC_GetLootTable)(uint32);
typedef const LootDrop_Struct*(*DLLFUNC_GetLootDrop)(uint32);
struct LootDLLFunc_Struct {
DLLFUNC_DLLLoadLoot DLLLoadLoot;
DLLFUNC_AddLootTable cbAddLootTable;
DLLFUNC_AddLootDrop cbAddLootDrop;
DLLFUNC_GetLootTable GetLootTable;
DLLFUNC_GetLootDrop GetLootDrop;
};
/////////////
// Opcodes //
/////////////
typedef bool(*CALLBACK_DBLoadOpcodes)(const char *filename);
typedef bool(*DLLFUNC_DLLLoadOpcodes)(const CALLBACK_DBLoadOpcodes, uint32 opsize, uint32 eq_count, uint32 emu_count, const char *filename);
typedef uint16 (*DLLFUNC_GetEQOpcode)(uint16 emu_op);
typedef uint16 (*DLLFUNC_GetEmuOpcode)(uint16 eq_op);
typedef void (*DLLFUNC_ClearEQOpcodes)();
typedef bool(*DLLFUNC_SetOpcodePair)(uint16 emu_op, uint16 eq_op);
struct OpcodeDLLFunc_Struct {
DLLFUNC_DLLLoadOpcodes DLLLoadOpcodes;
DLLFUNC_GetEQOpcode GetEQOpcode;
DLLFUNC_GetEmuOpcode GetEmuOpcode;
DLLFUNC_SetOpcodePair SetOpcodePair;
DLLFUNC_ClearEQOpcodes ClearEQOpcodes;
};
////////////////
// Skill Caps //
////////////////
typedef bool(*CALLBACK_DBLoadSkillCaps)();
typedef bool(*DLLFUNC_DLLLoadSkillCaps)(const CALLBACK_DBLoadSkillCaps, uint32 opsize, uint8 ClassCount, uint8 SkillCount, uint8 LevelCount);
typedef uint16 (*DLLFUNC_GetSkillCap)(uint8 Class_, uint8 Skill, uint8 Level);
typedef void (*DLLFUNC_ClearSkillCaps)();
typedef bool(*DLLFUNC_SetSkillCap)(uint8 Class_, uint8 Skill, uint8 Level, uint16 cap);
typedef uint8 (*DLLFUNC_GetTrainLevel)(uint8 Class_, uint8 Skill, uint8 Level);
struct SkillCapDLLFunc_Struct {
DLLFUNC_DLLLoadSkillCaps LoadSkillCaps;
DLLFUNC_GetSkillCap GetSkillCap;
DLLFUNC_SetSkillCap SetSkillCap;
DLLFUNC_ClearSkillCaps ClearSkillCaps;
DLLFUNC_GetTrainLevel GetTrainLevel;
};
class LoadEMuShareMemDLL : public SharedLibrary {
public:
LoadEMuShareMemDLL();
~LoadEMuShareMemDLL();
bool Load();
void Unload();
ItemsDLLFunc_Struct Items;
//NPCTypesDLLFunc_Struct NPCTypes;
DoorsDLLFunc_Struct Doors;
SpellsDLLFunc_Struct Spells;
NPCFactionListDLLFunc_Struct NPCFactionList;
LootDLLFunc_Struct Loot;
OpcodeDLLFunc_Struct Opcodes;
SkillCapDLLFunc_Struct SkillCaps;
private:
void ClearFunc();
bool loaded;
#ifdef _WINDOWS
#else
static uint32 refCount;
static uint32 refCountU() { return ++refCount; };
static uint32 refCountD() { return --refCount; };
#endif
};
#endif
-51
View File
@@ -1,51 +0,0 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "debug.h"
#include "EQDBRes.h"
#include <mysql.h>
vector<string> EQDBRes::fetch_row_array() {
vector<string> array;
if(res == NULL)
return(array);
int count=mysql_num_fields(res);
MYSQL_ROW row=mysql_fetch_row(res);
for (int i=0;i<count;i++)
array.push_back(row[i]);
return array;
}
map<string,string> EQDBRes::fetch_row_hash() {
map<string,string> rowhash;
if(res == NULL)
return(rowhash);
MYSQL_FIELD *fields;
MYSQL_ROW row;
unsigned long num_fields,i;
if (res && (num_fields=mysql_num_fields(res)) && (row = mysql_fetch_row(res))!=NULL && (fields = mysql_fetch_fields(res))!=NULL) {
for(i=0;i<num_fields;i++) {
rowhash[fields[i].name]=(row[i] ? row[i] : "");
}
}
return rowhash;
}
-48
View File
@@ -1,48 +0,0 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef EQDBRes_H_
#define EQDBRes_H_
#include <string>
#include <vector>
#include <map>
#include "types.h"
#include "database.h"
#include <mysql.h>
//this is the main object exported to perl.
class EQDBRes {
public:
EQDBRes(MYSQL_RES *r) { res=r; }
~EQDBRes() { finish(); }
//BEGIN PERL EXPORT
unsigned long num_rows() { return (res) ? mysql_num_rows(res) : 0; }
unsigned long num_fields() { return (res) ? mysql_num_fields(res) : 0; }
void DESTROY() { }
void finish() { if (res) mysql_free_result(res); res=NULL; };
vector<string> fetch_row_array();
map<string,string> fetch_row_hash();
unsigned long * fetch_lengths() { return (res) ? mysql_fetch_lengths(res) : 0; }
//END PERL EXPORT
private:
MYSQL_RES *res;
};
#endif /*EQDBRes_H_*/
-36
View File
@@ -1,36 +0,0 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef EQEMuError_H
#define EQEMuError_H
#include "../common/types.h"
enum eEQEMuError { EQEMuError_NoError,
EQEMuError_Mysql_1405,
EQEMuError_Mysql_2003,
EQEMuError_Mysql_2005,
EQEMuError_Mysql_2007,
EQEMuError_MaxErrorID };
void AddEQEMuError(eEQEMuError iError, bool iExitNow = false);
void AddEQEMuError(char* iError, bool iExitNow = false);
uint32 CheckEQEMuError();
void CheckEQEMuErrorAndPause();
#endif
-414
View File
@@ -1,414 +0,0 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2002 EQEMu Development Team (http://eqemu.org)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
* EQStream classes, by Quagmire
*/
#include "../common/debug.h"
#include <iostream>
#include <iomanip>
#ifdef WIN32
#include <process.h>
#else
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include "../common/unix.h"
#define SOCKET_ERROR -1
#endif
#include "EQNetwork.h"
#include "EQStream.h"
#include "../common/packet_dump.h"
#include "../common/packet_dump_file.h"
#include "../common/packet_functions.h"
#include "../common/MiscFunctions.h"
#include "../common/crc32.h"
#include "../common/eq_packet_structs.h"
using namespace std;
#define EQN_DEBUG 0
#define EQN_DEBUG_Error 0
#define EQN_DEBUG_Packet 0
#define EQN_DEBUG_Fragment 0
#define EQN_DEBUG_ACK 0
#define EQN_DEBUG_Unknown 0
#define EQN_DEBUG_NewStream 0
#define LOG_PACKETS 0
#define LOG_RAW_PACKETS_OUT 0
#define LOG_RAW_PACKETS_IN 0
//#define PRIORITYTEST
template <typename type> // LO_BYTE
type LO_BYTE (type a) {return (a&=0xff);}
template <typename type> // HI_BYTE
type HI_BYTE (type a) {return (a&=0xff00);}
template <typename type> // LO_WORD
type LO_WORD (type a) {return (a&=0xffff);}
template <typename type> // HI_WORD
type HI_WORD (type a) {return (a&=0xffff0000);}
template <typename type> // HI_LOSWAPshort
type HI_LOSWAPshort (type a) {return (LO_BYTE(a)<<8) | (HI_BYTE(a)>>8);}
template <typename type> // HI_LOSWAPlong
type HI_LOSWAPlong (type x) {return (LO_WORD(a)<<16) | (HIWORD(a)>>16);}
EQStreamServer::EQStreamServer(uint16 iPort) {
RunLoop = false;
pPort = iPort;
pOpen = false;
#ifdef WIN32
WORD version = MAKEWORD (1,1);
WSADATA wsadata;
WSAStartup (version, &wsadata);
#endif
sock = 0;
}
EQStreamServer::~EQStreamServer() {
Close();
RunLoop = false;
MLoopRunning.lock();
MLoopRunning.unlock();
#ifdef WIN32
WSACleanup();
#endif
connection_list.clear();
while (!NewQueue.empty())
NewQueue.pop(); // they're deleted with the list, clear this queue so it doesnt try to delete them again
}
bool EQStreamServer::Open(uint16 iPort) {
LockMutex lock(&MOpen);
if (iPort && pPort != iPort) {
if (pOpen)
return false;
pPort = iPort;
}
if (!RunLoop) {
RunLoop = true;
#ifdef WIN32
_beginthread(EQStreamServerLoop, 0, this);
#else
pthread_t thread;
pthread_create(&thread, NULL, &EQStreamServerLoop, this);
#endif
}
if (pOpen) {
return true;
}
else {
struct sockaddr_in address;
// int reuse_addr = 1;
int bufsize = 64 * 1024; // 64kbyte send/recieve buffers, up from default of 8k
#ifdef WIN32
unsigned long nonblocking = 1;
#endif
/* Setup internet address information.
This is used with the bind() call */
memset((char *) &address, 0, sizeof(address));
address.sin_family = AF_INET;
address.sin_port = htons(pPort);
address.sin_addr.s_addr = htonl(INADDR_ANY);
/* Setting up UDP port for new clients */
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0) {
return false;
}
//#ifdef WIN32
// setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &reuse_addr, sizeof(reuse_addr));
setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char*) &bufsize, sizeof(bufsize));
setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char*) &bufsize, sizeof(bufsize));
//#else
// setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuse_addr, sizeof(reuse_addr));
// setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &bufsize, sizeof(bufsize));
// setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &bufsize, sizeof(bufsize));
//#endif
if (bind(sock, (struct sockaddr *) &address, sizeof(address)) < 0) {
#ifdef WIN32
closesocket(sock);
#else
close(sock);
#endif
return false;
}
#ifdef WIN32
ioctlsocket (sock, FIONBIO, &nonblocking);
#else
fcntl(sock, F_SETFL, O_NONBLOCK);
#endif
pOpen = true;
return true;
}
}
void EQStreamServer::Close() {
SetOpen(false);
if (sock) {
#ifdef WIN32
closesocket(sock);
#else
close(sock);
#endif
}
sock = 0;
}
bool EQStreamServer::IsOpen() {
MOpen.lock();
bool ret = pOpen;
MOpen.unlock();
return ret;
}
void EQStreamServer::SetOpen(bool iOpen) {
MOpen.lock();
pOpen = iOpen;
MOpen.unlock();
}
void EQStreamServer::Process() {
_CP(EQStreamServer_Process);
if (!IsOpen()) {
if (sock) {
#ifdef WIN32
closesocket(sock);
#else
close(sock);
#endif
sock = 0;
}
return;
}
uchar buffer[1518];
int status;
struct sockaddr_in from;
unsigned int fromlen;
from.sin_family = AF_INET;
fromlen = sizeof(from);
while (1) {
#ifdef WIN32
status = recvfrom(sock, (char *) buffer, sizeof(buffer), 0,(struct sockaddr*) &from, (int *) &fromlen);
#else
status = recvfrom(sock, buffer, sizeof(buffer), 0,(struct sockaddr*) &from, &fromlen);
#endif
if (status >= 1) {
cout << "Got data from recvfrom" << endl;
RecvData(buffer, status, from.sin_addr.s_addr, from.sin_port);
}
else {
break;
}
}
map <string, EQStream*>::iterator connection;
for (connection = connection_list.begin( ); connection != connection_list.end( );)
{
if(!connection->second)
{
map <string, EQStream*>::iterator tmp=connection;
connection++;
connection_list.erase(tmp);
continue;
}
EQStream* eqs_data = connection->second;
if (eqs_data->IsFree() && (!eqs_data->CheckNetActive())) {
map <string, EQStream*>::iterator tmp=connection;
connection++;
safe_delete(eqs_data);
connection_list.erase(tmp);
}
else if(!eqs_data->RunLoop) {
eqs_data->Process(sock);
connection++;
}
}
}
void EQStreamServer::RecvData(uchar* data, uint32 size, uint32 irIP, uint16 irPort) {
/*
CHANGE HISTORY
Version Author Date Comment
1 Unknown Unknown Initial Revision
2 Joolz 05-Jan-2003 Optimised
3 Quagmire 05-Feb-2003 Changed so 2 connection objects wouldnt be created for the same ip/port pair, often happened
*/
// Check for invalid data
if (!data || size <= 4) return;
//if (CRC32::Generate(data, size-4) != ntohl(*((uint32*) &data[size-4]))) {
#if EQN_DEBUG_Error >= 1
//cout << "Incomming Packet failed checksum" << endl;
#endif
//return;
//}
char temp[25];
sprintf(temp,"%lu:%u",(unsigned long)irIP,irPort);
cout << "Data from " << temp << endl;
EQStream* tmp = NULL;
map <string, EQStream*>::iterator connection;
if ((connection=connection_list.find(temp))!=connection_list.end())
tmp=connection->second;
if(tmp != NULL && tmp->GetrPort() == irPort)
{
tmp->RecvData(data, size);
return;
}
else if(tmp != NULL && tmp->GetrPort() != irPort)
{
printf("Conflicting IPs & Ports: IP %i and Port %i is conflicting with IP %i and Port %i\n",irIP,irPort,tmp->GetrIP(),tmp->GetrPort());
return;
}
if (data[1]==0x01) {
cout << "New EQStream Connection." << endl;
EQStream* tmp = new EQStream(irIP, irPort);
tmp->RecvData(data, size);
connection_list[temp]=tmp;
if (connection_list.find(temp)==connection_list.end()) {
cerr <<"Could not find new connection we just added!" << endl;
}
MNewQueue.lock();
NewQueue.push(tmp);
MNewQueue.unlock();
return;
}
#if EQN_DEBUG >= 4
struct in_addr in;
in.s_addr = irIP;
cout << "WARNING: Stray packet? " << inet_ntoa(in) << ":" << irPort << endl;
#endif
}
EQStream* EQStreamServer::NewQueuePop() {
EQStream* ret = 0;
MNewQueue.lock();
if (!NewQueue.empty()) {
ret = NewQueue.front();
NewQueue.pop();
}
MNewQueue.unlock();
return ret;
}
#ifdef WIN32
void EQStreamServerLoop(void* tmp)
#else
void* EQStreamServerLoop(void* tmp)
#endif
{
#ifdef WIN32
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL);
#endif
EQStreamServer* eqns = (EQStreamServer*) tmp;
eqns->MLoopRunning.lock();
while (eqns->RunLoop) {
{
_CP(EQStreamServerLoop);
eqns->Process();
}
Sleep(1);
}
eqns->MLoopRunning.unlock();
#ifdef WIN32
_endthread();
#else
return 0;
#endif
}
#ifdef WIN32
void EQStreamInLoop(void* tmp)
#else
void* EQStreamInLoop(void* tmp)
#endif
{
EQStream* eqs = (EQStream*) tmp;
#ifdef _DEBUG
if (eqs->ConnectionType != Outgoing) {
ThrowError("EQStreamInLoop: eqs->ConnectionType != Outgoing");
}
#endif
eqs->MLoopRunning.lock();
Timer* tmp_timer = new Timer(100);
tmp_timer->Start();
while (eqs->RunLoop) {
{
_CP(EQStreamInLoop);
if(tmp_timer->Check())
eqs->DoRecvData();
}
Sleep(1);
}
safe_delete(tmp_timer);
eqs->MLoopRunning.unlock();
#ifdef WIN32
_endthread();
#else
return 0;
#endif
}
#ifdef WIN32
void EQStreamOutLoop(void* tmp)
#else
void* EQStreamOutLoop(void* tmp)
#endif
{
EQStream* eqs = (EQStream*) tmp;
#ifdef _DEBUG
if (eqs->ConnectionType != Outgoing) {
ThrowError("EQStreamOutLoop: eqs->ConnectionType != Outgoing");
}
#endif
eqs->MLoopRunning.lock();
Timer* tmp_timer = new Timer(100);
tmp_timer->Start();
while (eqs->RunLoop) {
{
_CP(EQStreamOutLoop);
if(tmp_timer->Check())
eqs->Process(eqs->outsock);
}
Sleep(1);
}
safe_delete(tmp_timer);
eqs->MLoopRunning.unlock();
#ifdef WIN32
_endthread();
#else
return 0;
#endif
}
-121
View File
@@ -1,121 +0,0 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2002 EQEMu Development Team (http://eqemu.org)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef EQNETWORK_H
#define EQNETWORK_H
#include "../common/debug.h"
//uncomment this to enable the packet profiler. Counts the number
//of each type of packet sent or received on a connection.
#ifdef ZONE
//#define PACKET_PROFILER 1
#endif
#include <string.h>
#include <map>
#include <list>
#include <queue>
using namespace std;
#include "../common/types.h"
#include "../common/timer.h"
#include "../common/linked_list.h"
#include "../common/queue.h"
#include "../common/Mutex.h"
#include "../common/packet_functions.h"
#include "EQStream.h"
#ifdef PACKET_PROFILER
#include "../common/rdtsc.h"
#endif
#define EQNC_TIMEOUT 60000
#define NAS_TIMER 100
#define KA_TIMER 400 /* keeps the lag bar constant */
#define MAX_HEADER_SIZE 39 // Quag: 39 is the max header + opcode + crc32 + unknowns size
class EQStreamServer;
class EQStream;
class EQStreamPacket;
class EQStreamFragmentGroupList;
class EQStreamFragmentGroup;
typedef EQStreamServer EQNServer;
typedef EQStream EQNConnection;
typedef EQStreamPacket EQNPacket;
typedef EQStreamFragmentGroupList EQNFragmentGroupList;
typedef EQStreamFragmentGroup EQNFragmentGroup;
#define FLAG_COMPRESSED 0x1000
#define FLAG_COMBINED 0x2000
#define FLAG_ENCRYPTED 0x4000
#define FLAG_IMPLICIT 0x8000
#define FLAG_ALL 0xF000
#define StripFlags(x) (x & ~FLAG_ALL)
// Optimistic compression, used for guessing pre-alloc size on debug output
#define BEST_COMPR_RATIO 300
enum eappCompressed { appNormal, appInflated, appDeflated };
#ifdef WIN32
void EQStreamServerLoop(void* tmp);
void EQStreamInLoop(void* tmp);
void EQStreamOutLoop(void* tmp);
#else
void* EQStreamServerLoop(void* tmp);
void* EQStreamInLoop(void* tmp);
void* EQStreamOutLoop(void* tmp);
#endif
class EQStreamServer {
public:
EQStreamServer(uint16 iPort = 0);
virtual ~EQStreamServer();
bool Open(uint16 iPort = 0); // opens the port
void Close(); // closes the port
void KillAll(); // kills all clients
inline uint16 GetPort() { return pPort; }
EQStream* NewQueuePop();
protected:
#ifdef WIN32
friend void EQStreamServerLoop(void* tmp);
#else
friend void* EQStreamServerLoop(void* tmp);
#endif
void Process();
bool IsOpen();
void SetOpen(bool iOpen);
bool RunLoop;
Mutex MLoopRunning;
private:
void RecvData(uchar* data, uint32 size, uint32 irIP, uint16 irPort);
#ifdef WIN32
SOCKET sock;
#else
int sock;
#endif
uint16 pPort;
bool pOpen;
Mutex MNewQueue;
Mutex MOpen;
map<string,EQStream*> connection_list;
queue<EQStream *> NewQueue;
};
#endif
-1951
View File
File diff suppressed because it is too large Load Diff
-1901
View File
File diff suppressed because it is too large Load Diff
-650
View File
@@ -1,650 +0,0 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2002 EQEMu Development Team (http://eqemu.org)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "../common/debug.h"
#include "MiscFunctions.h"
#include <string.h>
#include <time.h>
#include <math.h>
#ifndef WIN32
#include <netinet/in.h>
#include <sys/socket.h>
#endif
#include <iostream>
#include <iomanip>
#ifdef _WINDOWS
#include <io.h>
#endif
#include "../common/timer.h"
#include "../common/seperator.h"
using namespace std;
#ifdef _WINDOWS
#include <windows.h>
#define snprintf _snprintf
#if (_MSC_VER < 1500)
#define vsnprintf _vsnprintf
#endif
#define strncasecmp _strnicmp
#define strcasecmp _stricmp
#else
#include <stdlib.h>
#include <ctype.h>
#include <stdarg.h>
#include <sys/types.h>
#include <sys/time.h>
#ifdef FREEBSD //Timothy Whitman - January 7, 2003
#include <sys/socket.h>
#include <netinet/in.h>
#endif
#include <sys/stat.h>
#include <unistd.h>
#include <netdb.h>
#include <errno.h>
#endif
#ifndef va_copy
#define va_copy(d,s) ((d) = (s))
#endif
static bool WELLRNG_init = false;
static int state_i = 0;
static unsigned int STATE[R];
static unsigned int z0, z1, z2;
unsigned int (*WELLRNG19937)(void);
static unsigned int case_1 (void);
static unsigned int case_2 (void);
static unsigned int case_3 (void);
static unsigned int case_4 (void);
static unsigned int case_5 (void);
static unsigned int case_6 (void);
uint32 rnd_hash(time_t t, clock_t c);
void oneseed(const uint32 seed);
void CoutTimestamp(bool ms) {
time_t rawtime;
struct tm* gmt_t;
time(&rawtime);
gmt_t = gmtime(&rawtime);
struct timeval read_time;
gettimeofday(&read_time,0);
cout << (gmt_t->tm_year + 1900) << "/" << setw(2) << setfill('0') << (gmt_t->tm_mon + 1) << "/" << setw(2) << setfill('0') << gmt_t->tm_mday << " " << setw(2) << setfill('0') << gmt_t->tm_hour << ":" << setw(2) << setfill('0') << gmt_t->tm_min << ":" << setw(2) << setfill('0') << gmt_t->tm_sec;
if (ms)
cout << "." << setw(3) << setfill('0') << (read_time.tv_usec / 1000);
cout << " GMT";
}
// normal strncpy doesnt put a null term on copied strings, this one does
// ref: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcecrt/htm/_wcecrt_strncpy_wcsncpy.asp
char* strn0cpy(char* dest, const char* source, uint32 size) {
if (!dest)
return 0;
if (size == 0 || source == 0) {
dest[0] = 0;
return dest;
}
strncpy(dest, source, size);
dest[size - 1] = 0;
return dest;
}
// String N w/null Copy Truncated?
// return value =true if entire string(source) fit, false if it was truncated
bool strn0cpyt(char* dest, const char* source, uint32 size) {
if (!dest)
return 0;
if (size == 0 || source == 0) {
dest[0] = 0;
return false;
}
strncpy(dest, source, size);
dest[size - 1] = 0;
return (bool) (source[strlen(dest)] == 0);
}
const char *MakeUpperString(const char *source) {
static char str[128];
if (!source)
return NULL;
MakeUpperString(source, str);
return str;
}
void MakeUpperString(const char *source, char *target) {
if (!source || !target) {
*target=0;
return;
}
while (*source)
{
*target = toupper(*source);
target++;source++;
}
*target = 0;
}
const char *MakeLowerString(const char *source) {
static char str[128];
if (!source)
return NULL;
MakeLowerString(source, str);
return str;
}
void MakeLowerString(const char *source, char *target) {
if (!source || !target) {
*target=0;
return;
}
while (*source)
{
*target = tolower(*source);
target++;source++;
}
*target = 0;
}
int MakeAnyLenString(char** ret, const char* format, ...) {
int buf_len = 128;
int chars = -1;
va_list argptr, tmpargptr;
va_start(argptr, format);
while (chars == -1 || chars >= buf_len) {
safe_delete_array(*ret);
if (chars == -1)
buf_len *= 2;
else
buf_len = chars + 1;
*ret = new char[buf_len];
va_copy(tmpargptr, argptr);
chars = vsnprintf(*ret, buf_len, format, tmpargptr);
}
va_end(argptr);
return chars;
}
uint32 AppendAnyLenString(char** ret, uint32* bufsize, uint32* strlen, const char* format, ...) {
if (*bufsize == 0)
*bufsize = 256;
if (*ret == 0)
*strlen = 0;
int chars = -1;
char* oldret = 0;
va_list argptr, tmpargptr;
va_start(argptr, format);
while (chars == -1 || chars >= (int32)(*bufsize-*strlen)) {
if (chars == -1)
*bufsize += 256;
else
*bufsize += chars + 25;
oldret = *ret;
*ret = new char[*bufsize];
if (oldret) {
if (*strlen)
memcpy(*ret, oldret, *strlen);
safe_delete_array(oldret);
}
va_copy(tmpargptr, argptr);
chars = vsnprintf(&(*ret)[*strlen], (*bufsize-*strlen), format, tmpargptr);
}
va_end(argptr);
*strlen += chars;
return *strlen;
}
uint32 hextoi(char* num) {
int len = strlen(num);
if (len < 3)
return 0;
if (num[0] != '0' || (num[1] != 'x' && num[1] != 'X'))
return 0;
uint32 ret = 0;
int mul = 1;
for (int i=len-1; i>=2; i--) {
if (num[i] >= 'A' && num[i] <= 'F')
ret += ((num[i] - 'A') + 10) * mul;
else if (num[i] >= 'a' && num[i] <= 'f')
ret += ((num[i] - 'a') + 10) * mul;
else if (num[i] >= '0' && num[i] <= '9')
ret += (num[i] - '0') * mul;
else
return 0;
mul *= 16;
}
return ret;
}
uint64 hextoi64(char* num) {
int len = strlen(num);
if (len < 3)
return 0;
if (num[0] != '0' || (num[1] != 'x' && num[1] != 'X'))
return 0;
uint64 ret = 0;
int mul = 1;
for (int i=len-1; i>=2; i--) {
if (num[i] >= 'A' && num[i] <= 'F')
ret += ((num[i] - 'A') + 10) * mul;
else if (num[i] >= 'a' && num[i] <= 'f')
ret += ((num[i] - 'a') + 10) * mul;
else if (num[i] >= '0' && num[i] <= '9')
ret += (num[i] - '0') * mul;
else
return 0;
mul *= 16;
}
return ret;
}
bool atobool(char* iBool) {
if (!strcasecmp(iBool, "true"))
return true;
if (!strcasecmp(iBool, "false"))
return false;
if (!strcasecmp(iBool, "yes"))
return true;
if (!strcasecmp(iBool, "no"))
return false;
if (!strcasecmp(iBool, "on"))
return true;
if (!strcasecmp(iBool, "off"))
return false;
if (!strcasecmp(iBool, "enable"))
return true;
if (!strcasecmp(iBool, "disable"))
return false;
if (!strcasecmp(iBool, "enabled"))
return true;
if (!strcasecmp(iBool, "disabled"))
return false;
if (!strcasecmp(iBool, "y"))
return true;
if (!strcasecmp(iBool, "n"))
return false;
if (atoi(iBool))
return true;
return false;
}
int32 filesize(FILE* fp) {
#ifdef _WINDOWS
return _filelength(_fileno(fp));
#else
struct stat file_stat;
fstat(fileno(fp), &file_stat);
return (int32) file_stat.st_size;
/* uint32 tmp = 0;
while (!feof(fp)) {
fseek(fp, tmp++, SEEK_SET);
}
return tmp;*/
#endif
}
uint32 ResolveIP(const char* hostname, char* errbuf) {
#ifdef _WINDOWS
static InitWinsock ws;
#endif
if (errbuf)
errbuf[0] = 0;
if (hostname == 0) {
if (errbuf)
snprintf(errbuf, ERRBUF_SIZE, "ResolveIP(): hostname == 0");
return 0;
}
struct sockaddr_in server_sin;
#ifdef _WINDOWS
PHOSTENT phostent = NULL;
#else
struct hostent *phostent = NULL;
#endif
server_sin.sin_family = AF_INET;
if ((phostent = gethostbyname(hostname)) == NULL) {
#ifdef _WINDOWS
if (errbuf)
snprintf(errbuf, ERRBUF_SIZE, "Unable to get the host name. Error: %i", WSAGetLastError());
#else
if (errbuf)
snprintf(errbuf, ERRBUF_SIZE, "Unable to get the host name. Error: %s", strerror(errno));
#endif
return 0;
}
#ifdef _WINDOWS
memcpy ((char FAR *)&(server_sin.sin_addr), phostent->h_addr, phostent->h_length);
#else
memcpy ((char*)&(server_sin.sin_addr), phostent->h_addr, phostent->h_length);
#endif
return server_sin.sin_addr.s_addr;
}
bool ParseAddress(const char* iAddress, uint32* oIP, uint16* oPort, char* errbuf) {
Seperator sep(iAddress, ':', 2, 250, false, 0, 0);
if (sep.argnum == 1 && sep.IsNumber(1)) {
*oIP = ResolveIP(sep.arg[0], errbuf);
if (*oIP == 0)
return false;
if (oPort)
*oPort = atoi(sep.arg[1]);
return true;
}
return false;
}
#ifdef _WINDOWS
InitWinsock::InitWinsock() {
WORD version = MAKEWORD (1,1);
WSADATA wsadata;
WSAStartup (version, &wsadata);
}
InitWinsock::~InitWinsock() {
WSACleanup();
}
#endif
const char * itoa(int num) {
static char temp[_ITOA_BUFLEN];
memset(temp,0,_ITOA_BUFLEN);
snprintf(temp,_ITOA_BUFLEN,"%d",num);
return temp;
}
#ifndef WIN32
const char * itoa(int num, char* a,int b) {
static char temp[_ITOA_BUFLEN];
memset(temp,0,_ITOA_BUFLEN);
snprintf(temp,_ITOA_BUFLEN,"%d",num);
return temp;
return temp;
}
#endif
/*
* generate a random integer in the range low-high this
* should be used instead of the rand()%limit method
*/
int MakeRandomInt(int low, int high)
{
_CP(MakeRandomInt);
if(low >= high)
return(low);
//return (rand()%(high-low+1) + (low));
if(!WELLRNG_init) {
WELLRNG_init = true;
oneseed( rnd_hash( time(NULL), clock() ) );
WELLRNG19937 = case_1;
}
unsigned int randomnum = ((WELLRNG19937)());
if(randomnum == 0xffffffffUL)
return high;
return int ((randomnum / (double)0xffffffffUL) * (high - low + 1) + low);
}
double MakeRandomFloat(double low, double high)
{
_CP(MakeRandomFloat);
if(low >= high)
return(low);
//return (rand() / (double)RAND_MAX * (high - low) + low);
if(!WELLRNG_init) {
WELLRNG_init = true;
oneseed( rnd_hash( time(NULL), clock() ) );
WELLRNG19937 = case_1;
}
return ((WELLRNG19937)() / (double)0xffffffffUL * (high - low) + low);
}
uint32 rnd_hash( time_t t, clock_t c )
{
// Get a uint32 from t and c
// Better than uint32(x) in case x is floating point in [0,1]
// Based on code by Lawrence Kirby (fred@genesis.demon.co.uk)
static uint32 differ = 0; // guarantee time-based seeds will change
uint32 h1 = 0;
unsigned char *p = (unsigned char *) &t;
for( size_t i = 0; i < sizeof(t); ++i )
{
h1 *= 255 + 2U;
h1 += p[i];
}
uint32 h2 = 0;
p = (unsigned char *) &c;
for( size_t j = 0; j < sizeof(c); ++j )
{
h2 *= 255 + 2U;
h2 += p[j];
}
return ( h1 + differ++ ) ^ h2;
}
void oneseed( const uint32 seed )
{
// Initialize generator state with seed
// See Knuth TAOCP Vol 2, 3rd Ed, p.106 for multiplier.
// In previous versions, most significant bits (MSBs) of the seed affect
// only MSBs of the state array. Modified 9 Jan 2002 by Makoto Matsumoto.
register int j = 0;
STATE[j] = seed & 0xffffffffUL;
for (j = 1; j < R; j++)
{
STATE[j] = ( 1812433253UL * ( STATE[j-1] ^ (STATE[j-1] >> 30) ) + j ) & 0xffffffffUL;
}
}
// WELL RNG code
/* ***************************************************************************** */
/* Copyright: Francois Panneton and Pierre L'Ecuyer, University of Montreal */
/* Makoto Matsumoto, Hiroshima University */
/* Notice: This code can be used freely for personal, academic, */
/* or non-commercial purposes. For commercial purposes, */
/* please contact P. L'Ecuyer at: lecuyer@iro.UMontreal.ca */
/* A modified "maximally equidistributed" implementation */
/* by Shin Harase, Hiroshima University. */
/* ***************************************************************************** */
unsigned int case_1 (void){
// state_i == 0
z0 = (VRm1Under & MASKL) | (VRm2Under & MASKU);
z1 = MAT0NEG (-25, V0) ^ MAT0POS (27, VM1);
z2 = MAT3POS (9, VM2) ^ MAT0POS (1, VM3);
newV1 = z1 ^ z2;
newV0Under = MAT1 (z0) ^ MAT0NEG (-9, z1) ^ MAT0NEG (-21, z2) ^ MAT0POS (21, newV1);
state_i = R - 1;
WELLRNG19937 = case_3;
return (STATE[state_i] ^ (newVM2Over & BITMASK));
}
static unsigned int case_2 (void){
// state_i == 1
z0 = (VRm1 & MASKL) | (VRm2Under & MASKU);
z1 = MAT0NEG (-25, V0) ^ MAT0POS (27, VM1);
z2 = MAT3POS (9, VM2) ^ MAT0POS (1, VM3);
newV1 = z1 ^ z2;
newV0 = MAT1 (z0) ^ MAT0NEG (-9, z1) ^ MAT0NEG (-21, z2) ^ MAT0POS (21, newV1);
state_i = 0;
WELLRNG19937 = case_1;
return (STATE[state_i] ^ (newVM2 & BITMASK));
}
static unsigned int case_3 (void){
// state_i+M1 >= R
z0 = (VRm1 & MASKL) | (VRm2 & MASKU);
z1 = MAT0NEG (-25, V0) ^ MAT0POS (27, VM1Over);
z2 = MAT3POS (9, VM2Over) ^ MAT0POS (1, VM3Over);
newV1 = z1 ^ z2;
newV0 = MAT1 (z0) ^ MAT0NEG (-9, z1) ^ MAT0NEG (-21, z2) ^ MAT0POS (21, newV1);
state_i--;
if (state_i + M1 < R)
WELLRNG19937 = case_5;
return (STATE[state_i] ^ (newVM2Over & BITMASK));
}
static unsigned int case_4 (void){
// state_i+M3 >= R
z0 = (VRm1 & MASKL) | (VRm2 & MASKU);
z1 = MAT0NEG (-25, V0) ^ MAT0POS (27, VM1);
z2 = MAT3POS (9, VM2) ^ MAT0POS (1, VM3Over);
newV1 = z1 ^ z2;
newV0 = MAT1 (z0) ^ MAT0NEG (-9, z1) ^ MAT0NEG (-21, z2) ^ MAT0POS (21, newV1);
state_i--;
if (state_i + M3 < R)
WELLRNG19937 = case_6;
return (STATE[state_i] ^ (newVM2 & BITMASK));
}
static unsigned int case_5 (void){
// state_i+M2 >= R
z0 = (VRm1 & MASKL) | (VRm2 & MASKU);
z1 = MAT0NEG (-25, V0) ^ MAT0POS (27, VM1);
z2 = MAT3POS (9, VM2Over) ^ MAT0POS (1, VM3Over);
newV1 = z1 ^ z2;
newV0 = MAT1 (z0) ^ MAT0NEG (-9, z1) ^ MAT0NEG (-21, z2) ^ MAT0POS (21, newV1);
state_i--;
if (state_i + M2 < R)
WELLRNG19937 = case_4;
return (STATE[state_i] ^ (newVM2Over & BITMASK));
}
static unsigned int case_6 (void){
// 2 <= state_i <= (R - M3 - 1)
z0 = (VRm1 & MASKL) | (VRm2 & MASKU);
z1 = MAT0NEG (-25, V0) ^ MAT0POS (27, VM1);
z2 = MAT3POS (9, VM2) ^ MAT0POS (1, VM3);
newV1 = z1 ^ z2;
newV0 = MAT1 (z0) ^ MAT0NEG (-9, z1) ^ MAT0NEG (-21, z2) ^ MAT0POS (21, newV1);
state_i--;
if (state_i == 1)
WELLRNG19937 = case_2;
return (STATE[state_i] ^ (newVM2 & BITMASK));
}
// end WELL RNG code
// solar: removes the crap and turns the underscores into spaces.
char *CleanMobName(const char *in, char *out)
{
unsigned i, j;
for(i = j = 0; i < strlen(in); i++)
{
// convert _ to space.. any other conversions like this? I *think* this
// is the only non alpha char that's not stripped but converted.
if(in[i] == '_')
{
out[j++] = ' ';
}
else
{
if(isalpha(in[i]) || (in[i] == '`')) // numbers, #, or any other crap just gets skipped
out[j++] = in[i];
}
}
out[j] = 0; // terimnate the string before returning it
return out;
}
const char *ConvertArray(int input, char *returnchar)
{
sprintf(returnchar, "%i" ,input);
return returnchar;
}
const char *ConvertArrayF(float input, char *returnchar)
{
sprintf(returnchar, "%0.2f", input);
return returnchar;
}
float EQ13toFloat(int d)
{
return ( float(d)/float(1<<2));
}
float NewEQ13toFloat(int d)
{
return ( float(d)/float(1<<6));
}
float EQ19toFloat(int d)
{
return ( float(d)/float(1<<3));
}
int FloatToEQ13(float d)
{
return int(d*float(1<<2));
}
int NewFloatToEQ13(float d)
{
return int(d*float(1<<6));
}
int FloatToEQ19(float d)
{
return int(d*float(1<<3));
}
/*
Heading of 0 points in the pure positive Y direction
*/
int FloatToEQH(float d)
{
return(int((360.0f - d) * float(1<<11)) / 360);
}
float EQHtoFloat(int d)
{
return(360.0f - float((d * 360) >> 11));
}
void RemoveApostrophes(std::string &s)
{
for(unsigned int i = 0; i < s.length(); ++i)
if(s[i] == '\'')
s[i] = '_';
}
char *RemoveApostrophes(const char *s)
{
char *NewString = new char[strlen(s) + 1];
strcpy(NewString, s);
for(unsigned int i = 0 ; i < strlen(NewString); ++i)
if(NewString[i] == '\'')
NewString[i] = '_';
return NewString;
}
-171
View File
@@ -1,171 +0,0 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2002 EQEMu Development Team (http://eqemu.org)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef MISCFUNCTIONS_H
#define MISCFUNCTIONS_H
#include "types.h"
#include <stdio.h>
#include <ctype.h>
#include <string>
#include <time.h>
#ifndef ERRBUF_SIZE
#define ERRBUF_SIZE 1024
#endif
// These are helper macros for dealing with packets of variable length, typically those that contain
// variable length strings where it is not convenient to use a fixed length struct.
//
#define VARSTRUCT_DECODE_TYPE(Type, Buffer) *(Type *)Buffer; Buffer += sizeof(Type);
#define VARSTRUCT_DECODE_STRING(String, Buffer) strcpy(String, Buffer); Buffer += strlen(String)+1;
#define VARSTRUCT_ENCODE_STRING(Buffer, String) { sprintf(Buffer, String); Buffer += strlen(String) + 1; }
#define VARSTRUCT_ENCODE_INTSTRING(Buffer, Number) { sprintf(Buffer, "%i", Number); Buffer += strlen(Buffer) + 1; }
#define VARSTRUCT_ENCODE_TYPE(Type, Buffer, Value) { *(Type *)Buffer = Value; Buffer += sizeof(Type); }
#define VARSTRUCT_SKIP_TYPE(Type, Buffer) Buffer += sizeof(Type);
#define VERIFY_PACKET_LENGTH(OPCode, Packet, StructName) \
if(Packet->size != sizeof(StructName)) \
{ \
LogFile->write(EQEMuLog::Debug, "Size mismatch in " #OPCode " expected %i got %i", sizeof(StructName), Packet->size); \
DumpPacket(Packet); \
return; \
}
// Definitions for WELLRNG
//
#define W 32
#define R 624
#define DISCARD 31
#define MASKU (0xffffffffU>>(W-DISCARD))
#define MASKL (~MASKU)
#define M1 70
#define M2 179
#define M3 449
#define MAT0POS(t,v) (v^(v>>t))
#define MAT0NEG(t,v) (v^(v<<(-(t))))
#define MAT1(v) v
#define MAT3POS(t,v) (v>>t)
#define V0 STATE[state_i]
#define VM1Over STATE[state_i+M1-R]
#define VM1 STATE[state_i+M1]
#define VM2Over STATE[state_i+M2-R]
#define VM2 STATE[state_i+M2]
#define VM3Over STATE[state_i+M3-R]
#define VM3 STATE[state_i+M3]
#define VRm1 STATE[state_i-1]
#define VRm1Under STATE[state_i+R-1]
#define VRm2 STATE[state_i-2]
#define VRm2Under STATE[state_i+R-2]
#define newV0 STATE[state_i-1]
#define newV0Under STATE[state_i-1+R]
#define newV1 STATE[state_i]
#define newVRm1 STATE[state_i-2]
#define newVRm1Under STATE[state_i-2+R]
#define newVM2Over STATE[state_i+M2-R+1]
#define newVM2 STATE[state_i+M2+1]
#define BITMASK 0x41180000
//////////////////////////////////////////////////////////////////////
//
// MakeUpperString
// i : source - allocated null-terminated string
// return: pointer to static buffer with the target string
const char *MakeUpperString(const char *source);
const char *MakeLowerString(const char *source);
//////////////////////////////////////////////////////////////////////
//
// MakeUpperString
// i : source - allocated null-terminated string
// io: target - allocated buffer, at least of size strlen(source)+1
void MakeUpperString(const char *source, char *target);
void MakeLowerString(const char *source, char *target);
int MakeAnyLenString(char** ret, const char* format, ...);
uint32 AppendAnyLenString(char** ret, uint32* bufsize, uint32* strlen, const char* format, ...);
uint32 hextoi(char* num);
uint64 hextoi64(char* num);
bool atobool(char* iBool);
int32 filesize(FILE* fp);
uint32 ResolveIP(const char* hostname, char* errbuf = 0);
bool ParseAddress(const char* iAddress, uint32* oIP, uint16* oPort, char* errbuf = 0);
void CoutTimestamp(bool ms = true);
char* strn0cpy(char* dest, const char* source, uint32 size);
// return value =true if entire string(source) fit, false if it was truncated
bool strn0cpyt(char* dest, const char* source, uint32 size);
int MakeRandomInt(int low, int high);
double MakeRandomFloat(double low, double high);
char *CleanMobName(const char *in, char *out);
const char *ConvertArray(int input, char *returnchar);
const char *ConvertArrayF(float input, char *returnchar);
float EQ13toFloat(int d);
float NewEQ13toFloat(int d);
float EQ19toFloat(int d);
float EQHtoFloat(int d);
int FloatToEQ13(float d);
int NewFloatToEQ13(float d);
int FloatToEQ19(float d);
int FloatToEQH(float d);
void RemoveApostrophes(std::string &s);
char *RemoveApostrophes(const char *s);
#define _ITOA_BUFLEN 25
const char *itoa(int num); //not thread safe
#ifndef _WINDOWS
const char *itoa(int num, char* a,int b);
#endif
class InitWinsock {
public:
InitWinsock();
~InitWinsock();
};
template<class T> class AutoDelete {
public:
AutoDelete(T** iVar, T* iSetTo = 0) {
init(iVar, iSetTo);
}
AutoDelete() { pVar = NULL; }
void init(T** iVar, T* iSetTo = 0)
{
pVar = iVar;
if (iSetTo)
*pVar = iSetTo;
}
~AutoDelete() {
if(pVar != NULL)
safe_delete(*pVar);
}
void ReallyClearIt() {
pVar = NULL;
}
private:
T** pVar;
};
#endif
-117
View File
@@ -1,117 +0,0 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "SharedLibrary.h"
#include <stdio.h>
#ifdef _WINDOWS
#define snprintf _snprintf
#if (_MSC_VER < 1500)
#define vsnprintf _vsnprintf
#endif
#define strncasecmp _strnicmp
#define strcasecmp _stricmp
#define EmuLibName "EMuShareMem"
#else
#define EmuLibName "libEMuShareMem.so"
#include "../common/unix.h"
#include <dlfcn.h>
#define GetProcAddress(a,b) dlsym(a,b)
#define LoadLibrary(a) dlopen(a, RTLD_NOW)
#define FreeLibrary(a) dlclose(a)
#define GetLastError() dlerror()
#endif
SharedLibrary::SharedLibrary() {
hDLL = NULL;
}
SharedLibrary::~SharedLibrary() {
Unload();
}
bool SharedLibrary::Load(const char *name)
{
#ifdef _WINDOWS
SetLastError(0);
#endif
hDLL = LoadLibrary(name);
if(!hDLL) {
const char *load_error = GetError();
fprintf(stderr, "[Error] Load Shared Library '%s' failed. Error=%s\n", name, load_error?load_error:"Null Return, no error");
return false;
}
#ifdef _WINDOWS
else { SetLastError(0); } // Clear the win9x error
#endif
return(true);
}
void SharedLibrary::Unload() {
if (hDLL != NULL) {
FreeLibrary(hDLL);
#ifndef WIN32
const char* error;
if ((error = GetError()) != NULL)
fprintf(stderr, "FreeLibrary() error = %s", error);
#endif
hDLL = NULL;
}
}
void *SharedLibrary::GetSym(const char *name) {
if (!Loaded())
return(NULL);
void *r = GetProcAddress(hDLL, name);
if(GetError() != NULL)
r = NULL;
return(r);
}
bool SharedLibrary::GetSym(const char *name, void **sym)
{
bool result=false;
if (Loaded()) {
*sym = GetProcAddress(hDLL, name);
result= (GetError() == NULL);
}
return result;
}
const char *SharedLibrary::GetError()
{
#ifdef _WINDOWS
//not thread safe, dont care.
static char ErrBuf[128];
unsigned long err = GetLastError();
if(err == 0)
return(NULL);
sprintf(ErrBuf, "Error #%lu", (unsigned long)err);
return(ErrBuf);
#else
return GetLastError();
#endif
}
-49
View File
@@ -1,49 +0,0 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef _SHAREDLIBRARY_H
#define _SHAREDLIBRARY_H
#ifdef _WINDOWS
#include <windows.h>
#endif
class SharedLibrary {
public:
SharedLibrary();
virtual ~SharedLibrary();
//two call styles for GetSym, one returns bool, other NULL for fail
bool GetSym(const char *name, void **sym);
void *GetSym(const char *name);
const char *GetError();
virtual bool Load(const char *file);
virtual void Unload();
inline bool Loaded() { return (hDLL != 0); }
protected:
#ifdef _WINDOWS
HINSTANCE hDLL;
#else
void* hDLL;
#endif
};
#endif
+2 -2
View File
@@ -43,7 +43,7 @@ namespace SOCKETS_NAMESPACE {
File::File()
:m_fil(NULL)
:m_fil(nullptr)
{
}
@@ -85,7 +85,7 @@ size_t File::fwrite(const char *ptr, size_t size, size_t nmemb)
char *File::fgets(char *s, int size)
{
return m_fil ? ::fgets(s, size, m_fil) : NULL;
return m_fil ? ::fgets(s, size, m_fil) : nullptr;
}
+1 -1
View File
@@ -46,7 +46,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include <stdarg.h>
#include "Parse.h"
#include "HTTPSocket.h"
#include "../TCPConnection.h"
#include "../tcp_connection.h"
#include <cstdlib>
#include <cstring>
+1 -1
View File
@@ -42,7 +42,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include <map>
#include <string>
#include "../TCPConnection.h"
#include "../tcp_connection.h"
#ifdef SOCKETS_NAMESPACE
+5 -5
View File
@@ -93,14 +93,14 @@ bool HttpdCookies::getvalue(const std::string& name,std::string& buffer) //char
void HttpdCookies::replacevalue(const std::string& name,const std::string& value)
{
COOKIE *c = NULL;
COOKIE *c = nullptr;
for (cookie_v::iterator it = m_cookies.begin(); it != m_cookies.end(); it++)
{
c = *it;
if (!strcasecmp(c -> name.c_str(),name.c_str()))
break;
c = NULL;
c = nullptr;
}
if (c)
@@ -126,14 +126,14 @@ void HttpdCookies::replacevalue(const std::string& name,int i)
size_t HttpdCookies::getlength(const std::string& name)
{
COOKIE *c = NULL;
COOKIE *c = nullptr;
for (cookie_v::iterator it = m_cookies.begin(); it != m_cookies.end(); it++)
{
c = *it;
if (!strcasecmp(c -> name.c_str(),name.c_str()))
break;
c = NULL;
c = nullptr;
}
return c ? c -> value.size() : 0;
}
@@ -223,7 +223,7 @@ void HttpdCookies::setcookie(HTTPSocket *sock, const std::string& domain, const
const std::string& HttpdCookies::expiredatetime()
{
time_t t = time(NULL);
time_t t = time(nullptr);
struct tm * tp = gmtime(&t);
const char *days[7] = {"Sunday", "Monday",
"Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
+10 -10
View File
@@ -47,7 +47,7 @@ namespace SOCKETS_NAMESPACE {
HttpdForm::HttpdForm(IFile *infil) : raw(false)
{
CGI *cgi = NULL;
CGI *cgi = nullptr;
char *c_t = getenv("CONTENT_TYPE");
char *c_l = getenv("CONTENT_LENGTH");
size_t extra = 2;
@@ -59,7 +59,7 @@ HttpdForm::HttpdForm(IFile *infil) : raw(false)
if (c_t && !strncmp(c_t, "multipart/form-data",19))
{
Parse pa(c_t,";=");
char *tempcmp = NULL;
char *tempcmp = nullptr;
size_t tc = 0;
size_t l = 0;
std::string str = pa.getword();
@@ -80,7 +80,7 @@ HttpdForm::HttpdForm(IFile *infil) : raw(false)
std::string content_type;
std::string current_name;
std::string current_filename;
char slask[200];
char slask[2000];
infil -> fgets(slask, 200);
while (!infil -> eof())
{
@@ -209,7 +209,7 @@ HttpdForm::HttpdForm(IFile *infil) : raw(false)
#else
sprintf(fn,"/tmp/%s",current_filename.c_str());
#endif
if ((fil = fopen(fn, "wb")) != NULL)
if ((fil = fopen(fn, "wb")) != nullptr)
{
infil -> fread(&c,1,1);
while (!infil -> eof())
@@ -353,7 +353,7 @@ HttpdForm::HttpdForm(IFile *infil) : raw(false)
HttpdForm::HttpdForm(const std::string& buffer,size_t l) : raw(false)
{
CGI *cgi = NULL;
CGI *cgi = nullptr;
char slask[8888];
char name[200];
int i = 0;
@@ -424,7 +424,7 @@ HttpdForm::HttpdForm(const std::string& buffer,size_t l) : raw(false)
HttpdForm::~HttpdForm()
{
CGI *cgi = NULL; //,*tmp;
CGI *cgi = nullptr; //,*tmp;
for (cgi_v::iterator it = m_cgi.begin(); it != m_cgi.end(); it++)
{
@@ -525,7 +525,7 @@ bool HttpdForm::getnext(std::string& n,std::string& v) //char *n,size_t len,char
int HttpdForm::getvalue(const std::string& n,std::string& v) //char *v,size_t len)
{
CGI *cgi = NULL;
CGI *cgi = nullptr;
int r = 0;
for (cgi_v::iterator it = m_cgi.begin(); it != m_cgi.end(); it++)
@@ -533,7 +533,7 @@ int HttpdForm::getvalue(const std::string& n,std::string& v) //char *v,size_t le
cgi = *it;
if (cgi -> name == n)
break;
cgi = NULL;
cgi = nullptr;
}
if (cgi)
{
@@ -572,7 +572,7 @@ std::string HttpdForm::getvalue(const std::string& n)
size_t HttpdForm::getlength(const std::string& n)
{
CGI *cgi = NULL;
CGI *cgi = nullptr;
size_t l;
for (cgi_v::iterator it = m_cgi.begin(); it != m_cgi.end(); it++)
@@ -580,7 +580,7 @@ size_t HttpdForm::getlength(const std::string& n)
cgi = *it;
if (cgi -> name == n)
break;
cgi = NULL;
cgi = nullptr;
}
l = cgi ? cgi -> value.size() : 0;
if (cgi && !raw)
+7 -7
View File
@@ -64,11 +64,11 @@ std::string HttpdSocket::m_start = "";
HttpdSocket::HttpdSocket(uint32 ID, SOCKET in_socket, uint32 irIP, uint16 irPort)
: HTTPSocket(ID,in_socket,irIP,irPort)
,m_content_length(0)
,m_file(NULL)
,m_file(nullptr)
,m_received(0)
,m_request_id(++m_request_count)
,m_cookies(NULL)
,m_form(NULL)
,m_cookies(nullptr)
,m_form(nullptr)
{
m_http_date = datetime2httpdate(GetDate());
if (!m_start.size())
@@ -289,7 +289,7 @@ std::string HttpdSocket::datetime2httpdate(const std::string& dt)
std::string HttpdSocket::GetDate()
{
time_t t = time(NULL);
time_t t = time(nullptr);
struct tm* tp = localtime(&t);
char slask[40];
if (tp)
@@ -315,16 +315,16 @@ void HttpdSocket::Reset()
if (m_file)
{
delete m_file;
m_file = NULL;
m_file = nullptr;
}
m_received = 0;
m_request_id = ++m_request_count;
if (m_cookies)
delete m_cookies;
m_cookies = NULL;
m_cookies = nullptr;
if (m_form)
delete m_form;
m_form = NULL;
m_form = nullptr;
}
+2 -2
View File
@@ -66,8 +66,8 @@ MemFile::MemFile(const std::string& path)
:m_path(path)
,m_temporary(false)
,m_base(m_files[path])
,m_current_read(NULL)
,m_current_write(NULL)
,m_current_read(nullptr)
,m_current_write(nullptr)
,m_read_ptr(0)
,m_write_ptr(0)
{
+1 -1
View File
@@ -48,7 +48,7 @@ public:
/** File block structure.
\ingroup file */
struct block_t {
block_t() : next(NULL) {}
block_t() : next(nullptr) {}
struct block_t *next;
char data[BLOCKSIZE];
};
+1 -1
View File
@@ -37,7 +37,7 @@ Mime::Mime(const std::string& filename) {
bool Mime::LoadMimeFile(const std::string& filename) {
FILE *fil;
if ((fil = fopen(filename.c_str(),"rt")) != NULL) {
if ((fil = fopen(filename.c_str(),"rt")) != nullptr) {
char * slask = new char[1000];
fgets(slask,1000,fil);
while (!feof(fil))
+1 -1
View File
@@ -211,7 +211,7 @@ typedef unsigned short port_t;
#endif
#ifdef _THREADSAFE_SOCKETS
#include "Mutex.h"
#include "mutex.h"
#include "Lock.h"
#endif
+84 -84
View File
@@ -104,7 +104,7 @@ typedef struct _tagSTACKFRAME64 {
ADDRESS64 AddrFrame; // frame pointer
ADDRESS64 AddrStack; // stack pointer
ADDRESS64 AddrBStore; // backing store pointer
PVOID FuncTableEntry; // pointer to pdata/fpo or NULL
PVOID FuncTableEntry; // pointer to pdata/fpo or nullptr
DWORD64 Params[4]; // possible arguments to the function
BOOL Far; // WOW far call
BOOL Virtual; // is this a virtual frame?
@@ -187,44 +187,44 @@ public:
StackWalkerInternal(StackWalker *parent, HANDLE hProcess)
{
m_parent = parent;
m_hDbhHelp = NULL;
pSC = NULL;
m_hDbhHelp = nullptr;
pSC = nullptr;
m_hProcess = hProcess;
m_szSymPath = NULL;
pSFTA = NULL;
pSGLFA = NULL;
pSGMB = NULL;
pSGMI = NULL;
pSGO = NULL;
pSGSFA = NULL;
pSI = NULL;
pSLM = NULL;
pSSO = NULL;
pSW = NULL;
pUDSN = NULL;
pSGSP = NULL;
m_szSymPath = nullptr;
pSFTA = nullptr;
pSGLFA = nullptr;
pSGMB = nullptr;
pSGMI = nullptr;
pSGO = nullptr;
pSGSFA = nullptr;
pSI = nullptr;
pSLM = nullptr;
pSSO = nullptr;
pSW = nullptr;
pUDSN = nullptr;
pSGSP = nullptr;
}
~StackWalkerInternal()
{
if (pSC != NULL)
if (pSC != nullptr)
pSC(m_hProcess); // SymCleanup
if (m_hDbhHelp != NULL)
if (m_hDbhHelp != nullptr)
FreeLibrary(m_hDbhHelp);
m_hDbhHelp = NULL;
m_parent = NULL;
if(m_szSymPath != NULL)
m_hDbhHelp = nullptr;
m_parent = nullptr;
if(m_szSymPath != nullptr)
free(m_szSymPath);
m_szSymPath = NULL;
m_szSymPath = nullptr;
}
BOOL Init(LPCSTR szSymPath)
{
if (m_parent == NULL)
if (m_parent == nullptr)
return FALSE;
// Dynamically load the Entry-Points for dbghelp.dll:
// First try to load the newsest one from
TCHAR szTemp[4096];
// But before wqe do this, we first check if the ".local" file exists
if (GetModuleFileName(NULL, szTemp, 4096) > 0)
if (GetModuleFileName(nullptr, szTemp, 4096) > 0)
{
_tcscat_s(szTemp, _T(".local"));
if (GetFileAttributes(szTemp) == INVALID_FILE_ATTRIBUTES)
@@ -240,7 +240,7 @@ public:
}
}
// Still not found? Then try to load the 64-Bit version:
if ( (m_hDbhHelp == NULL) && (GetEnvironmentVariable(_T("ProgramFiles"), szTemp, 4096) > 0) )
if ( (m_hDbhHelp == nullptr) && (GetEnvironmentVariable(_T("ProgramFiles"), szTemp, 4096) > 0) )
{
_tcscat_s(szTemp, _T("\\Debugging Tools for Windows 64-Bit\\dbghelp.dll"));
if (GetFileAttributes(szTemp) != INVALID_FILE_ATTRIBUTES)
@@ -250,9 +250,9 @@ public:
}
}
}
if (m_hDbhHelp == NULL) // if not already loaded, try to load a default-one
if (m_hDbhHelp == nullptr) // if not already loaded, try to load a default-one
m_hDbhHelp = LoadLibrary( _T("dbghelp.dll") );
if (m_hDbhHelp == NULL)
if (m_hDbhHelp == nullptr)
return FALSE;
pSI = (tSI) GetProcAddress(m_hDbhHelp, "SymInitialize" );
pSC = (tSC) GetProcAddress(m_hDbhHelp, "SymCleanup" );
@@ -271,18 +271,18 @@ public:
pSLM = (tSLM) GetProcAddress(m_hDbhHelp, "SymLoadModule64" );
pSGSP =(tSGSP) GetProcAddress(m_hDbhHelp, "SymGetSearchPath" );
if ( pSC == NULL || pSFTA == NULL || pSGMB == NULL || pSGMI == NULL ||
pSGO == NULL || pSGSFA == NULL || pSI == NULL || pSSO == NULL ||
pSW == NULL || pUDSN == NULL || pSLM == NULL )
if ( pSC == nullptr || pSFTA == nullptr || pSGMB == nullptr || pSGMI == nullptr ||
pSGO == nullptr || pSGSFA == nullptr || pSI == nullptr || pSSO == nullptr ||
pSW == nullptr || pUDSN == nullptr || pSLM == nullptr )
{
FreeLibrary(m_hDbhHelp);
m_hDbhHelp = NULL;
pSC = NULL;
m_hDbhHelp = nullptr;
pSC = nullptr;
return FALSE;
}
// SymInitialize
if (szSymPath != NULL)
if (szSymPath != nullptr)
m_szSymPath = _strdup(szSymPath);
if (this->pSI(m_hProcess, m_szSymPath, FALSE) == FALSE)
this->m_parent->OnDbgHelpErr("SymInitialize", GetLastError(), 0);
@@ -295,7 +295,7 @@ public:
symOptions = this->pSSO(symOptions);
char buf[StackWalker::STACKWALK_MAX_NAMELEN] = {0};
if (this->pSGSP != NULL)
if (this->pSGSP != nullptr)
{
if (this->pSGSP(m_hProcess, buf, StackWalker::STACKWALK_MAX_NAMELEN) == FALSE)
this->m_parent->OnDbgHelpErr("SymGetSearchPath", GetLastError(), 0);
@@ -458,10 +458,10 @@ private:
// try both dlls...
const TCHAR *dllname[] = { _T("kernel32.dll"), _T("tlhelp32.dll") };
HINSTANCE hToolhelp = NULL;
tCT32S pCT32S = NULL;
tM32F pM32F = NULL;
tM32N pM32N = NULL;
HINSTANCE hToolhelp = nullptr;
tCT32S pCT32S = nullptr;
tM32F pM32F = nullptr;
tM32N pM32N = nullptr;
HANDLE hSnap;
MODULEENTRY32 me;
@@ -472,18 +472,18 @@ private:
for (i = 0; i<(sizeof(dllname) / sizeof(dllname[0])); i++ )
{
hToolhelp = LoadLibrary( dllname[i] );
if (hToolhelp == NULL)
if (hToolhelp == nullptr)
continue;
pCT32S = (tCT32S) GetProcAddress(hToolhelp, "CreateToolhelp32Snapshot");
pM32F = (tM32F) GetProcAddress(hToolhelp, "Module32First");
pM32N = (tM32N) GetProcAddress(hToolhelp, "Module32Next");
if ( (pCT32S != NULL) && (pM32F != NULL) && (pM32N != NULL) )
if ( (pCT32S != nullptr) && (pM32F != nullptr) && (pM32N != nullptr) )
break; // found the functions!
FreeLibrary(hToolhelp);
hToolhelp = NULL;
hToolhelp = nullptr;
}
if (hToolhelp == NULL)
if (hToolhelp == nullptr)
return FALSE;
hSnap = pCT32S( TH32CS_SNAPMODULE, pid );
@@ -534,20 +534,20 @@ private:
DWORD cbNeeded;
MODULEINFO mi;
HMODULE *hMods = 0;
char *tt = NULL;
char *tt2 = NULL;
char *tt = nullptr;
char *tt2 = nullptr;
const SIZE_T TTBUFLEN = 8096;
int cnt = 0;
hPsapi = LoadLibrary( _T("psapi.dll") );
if (hPsapi == NULL)
if (hPsapi == nullptr)
return FALSE;
pEPM = (tEPM) GetProcAddress( hPsapi, "EnumProcessModules" );
pGMFNE = (tGMFNE) GetProcAddress( hPsapi, "GetModuleFileNameExA" );
pGMBN = (tGMFNE) GetProcAddress( hPsapi, "GetModuleBaseNameA" );
pGMI = (tGMI) GetProcAddress( hPsapi, "GetModuleInformation" );
if ( (pEPM == NULL) || (pGMFNE == NULL) || (pGMBN == NULL) || (pGMI == NULL) )
if ( (pEPM == nullptr) || (pGMFNE == nullptr) || (pGMBN == nullptr) || (pGMI == nullptr) )
{
// we couldn?t find all functions
FreeLibrary(hPsapi);
@@ -557,7 +557,7 @@ private:
hMods = (HMODULE*) malloc(sizeof(HMODULE) * (TTBUFLEN / sizeof HMODULE));
tt = (char*) malloc(sizeof(char) * TTBUFLEN);
tt2 = (char*) malloc(sizeof(char) * TTBUFLEN);
if ( (hMods == NULL) || (tt == NULL) || (tt2 == NULL) )
if ( (hMods == nullptr) || (tt == nullptr) || (tt2 == nullptr) )
goto cleanup;
if ( ! pEPM( hProcess, hMods, TTBUFLEN, &cbNeeded ) )
@@ -590,10 +590,10 @@ private:
}
cleanup:
if (hPsapi != NULL) FreeLibrary(hPsapi);
if (tt2 != NULL) free(tt2);
if (tt != NULL) free(tt);
if (hMods != NULL) free(hMods);
if (hPsapi != nullptr) FreeLibrary(hPsapi);
if (tt2 != nullptr) free(tt2);
if (tt != nullptr) free(tt);
if (hMods != nullptr) free(hMods);
return cnt != 0;
} // GetModuleListPSAPI
@@ -603,7 +603,7 @@ private:
CHAR *szImg = _strdup(img);
CHAR *szMod = _strdup(mod);
DWORD result = ERROR_SUCCESS;
if ( (szImg == NULL) || (szMod == NULL) )
if ( (szImg == nullptr) || (szMod == nullptr) )
result = ERROR_NOT_ENOUGH_MEMORY;
else
{
@@ -611,25 +611,25 @@ private:
result = GetLastError();
}
ULONGLONG fileVersion = 0;
if ( (m_parent != NULL) && (szImg != NULL) )
if ( (m_parent != nullptr) && (szImg != nullptr) )
{
// try to retrive the file-version:
if ( (this->m_parent->m_options & StackWalker::RetrieveFileVersion) != 0)
{
VS_FIXEDFILEINFO *fInfo = NULL;
VS_FIXEDFILEINFO *fInfo = nullptr;
DWORD dwHandle;
DWORD dwSize = GetFileVersionInfoSizeA(szImg, &dwHandle);
if (dwSize > 0)
{
LPVOID vData = malloc(dwSize);
if (vData != NULL)
if (vData != nullptr)
{
if (GetFileVersionInfoA(szImg, dwHandle, dwSize, vData) != 0)
{
UINT len;
TCHAR szSubBlock[] = _T("\\");
if (VerQueryValue(vData, szSubBlock, (LPVOID*) &fInfo, &len) == 0)
fInfo = NULL;
fInfo = nullptr;
else
{
fileVersion = ((ULONGLONG)fInfo->dwFileVersionLS) + ((ULONGLONG)fInfo->dwFileVersionMS << 32);
@@ -678,8 +678,8 @@ private:
}
this->m_parent->OnLoadModule(img, mod, baseAddr, size, result, szSymType, Module.LoadedImageName, fileVersion);
}
if (szImg != NULL) free(szImg);
if (szMod != NULL) free(szMod);
if (szImg != nullptr) free(szImg);
if (szMod != nullptr) free(szMod);
return result;
}
public:
@@ -695,7 +695,7 @@ public:
BOOL GetModuleInfo(HANDLE hProcess, DWORD64 baseAddr, IMAGEHLP_MODULE64_V2 *pModuleInfo)
{
if(this->pSGMI == NULL)
if(this->pSGMI == nullptr)
{
SetLastError(ERROR_DLL_INIT_FAILED);
return FALSE;
@@ -703,7 +703,7 @@ public:
// First try to use the larger ModuleInfo-Structure
// memset(pModuleInfo, 0, sizeof(IMAGEHLP_MODULE64_V3));
// pModuleInfo->SizeOfStruct = sizeof(IMAGEHLP_MODULE64_V3);
// if (this->pSGMI_V3 != NULL)
// if (this->pSGMI_V3 != nullptr)
// {
// if (this->pSGMI_V3(hProcess, baseAddr, pModuleInfo) != FALSE)
// return TRUE;
@@ -714,7 +714,7 @@ public:
// could not retrive the bigger structure, try with the smaller one (as defined in VC7.1)...
pModuleInfo->SizeOfStruct = sizeof(IMAGEHLP_MODULE64_V2);
void *pData = malloc(4096); // reserve enough memory, so the bug in v6.3.5.1 does not lead to memory-overwrites...
if (pData == NULL)
if (pData == nullptr)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return FALSE;
@@ -742,7 +742,7 @@ StackWalker::StackWalker(DWORD dwProcessId, HANDLE hProcess)
this->m_hProcess = hProcess;
this->m_sw = new StackWalkerInternal(this, this->m_hProcess);
this->m_dwProcessId = dwProcessId;
this->m_szSymPath = NULL;
this->m_szSymPath = nullptr;
}
StackWalker::StackWalker(int options, LPCSTR szSymPath, DWORD dwProcessId, HANDLE hProcess)
{
@@ -751,28 +751,28 @@ StackWalker::StackWalker(int options, LPCSTR szSymPath, DWORD dwProcessId, HANDL
this->m_hProcess = hProcess;
this->m_sw = new StackWalkerInternal(this, this->m_hProcess);
this->m_dwProcessId = dwProcessId;
if (szSymPath != NULL)
if (szSymPath != nullptr)
{
this->m_szSymPath = _strdup(szSymPath);
this->m_options |= SymBuildPath;
}
else
this->m_szSymPath = NULL;
this->m_szSymPath = nullptr;
}
StackWalker::~StackWalker()
{
if (m_szSymPath != NULL)
if (m_szSymPath != nullptr)
free(m_szSymPath);
m_szSymPath = NULL;
if (this->m_sw != NULL)
m_szSymPath = nullptr;
if (this->m_sw != nullptr)
delete this->m_sw;
this->m_sw = NULL;
this->m_sw = nullptr;
}
BOOL StackWalker::LoadModules()
{
if (this->m_sw == NULL)
if (this->m_sw == nullptr)
{
SetLastError(ERROR_DLL_INIT_FAILED);
return FALSE;
@@ -781,19 +781,19 @@ BOOL StackWalker::LoadModules()
return TRUE;
// Build the sym-path:
char *szSymPath = NULL;
char *szSymPath = nullptr;
if ( (this->m_options & SymBuildPath) != 0)
{
const size_t nSymPathLen = 4096;
szSymPath = (char*) malloc(nSymPathLen);
if (szSymPath == NULL)
if (szSymPath == nullptr)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return FALSE;
}
szSymPath[0] = 0;
// Now first add the (optional) provided sympath:
if (this->m_szSymPath != NULL)
if (this->m_szSymPath != nullptr)
{
strcat_s(szSymPath, nSymPathLen, this->m_szSymPath);
strcat_s(szSymPath, nSymPathLen, ";");
@@ -812,7 +812,7 @@ BOOL StackWalker::LoadModules()
}
// Now add the path for the main-module:
if (GetModuleFileNameA(NULL, szTemp, nTempLen) > 0)
if (GetModuleFileNameA(nullptr, szTemp, nTempLen) > 0)
{
szTemp[nTempLen-1] = 0;
for (char *p = (szTemp+strlen(szTemp)-1); p >= szTemp; --p)
@@ -870,7 +870,7 @@ BOOL StackWalker::LoadModules()
// First Init the whole stuff...
BOOL bRet = this->m_sw->Init(szSymPath);
if (szSymPath != NULL) free(szSymPath); szSymPath = NULL;
if (szSymPath != nullptr) free(szSymPath); szSymPath = nullptr;
if (bRet == FALSE)
{
this->OnDbgHelpErr("Error while initializing dbghelp.dll", 0, 0);
@@ -889,14 +889,14 @@ BOOL StackWalker::LoadModules()
// This has to be done due to a problem with the "hProcess"-parameter in x64...
// Because this class is in no case multi-threading-enabled (because of the limitations
// of dbghelp.dll) it is "safe" to use a static-variable
static StackWalker::PReadProcessMemoryRoutine s_readMemoryFunction = NULL;
static LPVOID s_readMemoryFunction_UserData = NULL;
static StackWalker::PReadProcessMemoryRoutine s_readMemoryFunction = nullptr;
static LPVOID s_readMemoryFunction_UserData = nullptr;
BOOL StackWalker::ShowCallstack(HANDLE hThread, const CONTEXT *context, PReadProcessMemoryRoutine readMemoryFunction, LPVOID pUserData)
{
CONTEXT c;;
CallstackEntry csEntry;
IMAGEHLP_SYMBOL64 *pSym = NULL;
IMAGEHLP_SYMBOL64 *pSym = nullptr;
StackWalkerInternal::IMAGEHLP_MODULE64_V2 Module;
IMAGEHLP_LINE64 Line;
int frameNum;
@@ -904,7 +904,7 @@ BOOL StackWalker::ShowCallstack(HANDLE hThread, const CONTEXT *context, PReadPro
if (m_modulesLoaded == FALSE)
this->LoadModules(); // ignore the result...
if (this->m_sw->m_hDbhHelp == NULL)
if (this->m_sw->m_hDbhHelp == nullptr)
{
SetLastError(ERROR_DLL_INIT_FAILED);
return FALSE;
@@ -913,7 +913,7 @@ BOOL StackWalker::ShowCallstack(HANDLE hThread, const CONTEXT *context, PReadPro
s_readMemoryFunction = readMemoryFunction;
s_readMemoryFunction_UserData = pUserData;
if (context == NULL)
if (context == nullptr)
{
// If no context is provided, capture the context
if (hThread == GetCurrentThread())
@@ -989,7 +989,7 @@ BOOL StackWalker::ShowCallstack(HANDLE hThread, const CONTEXT *context, PReadPro
// assume that either you are done, or that the stack is so hosed that the next
// deeper frame could not be found.
// CONTEXT need not to be suplied if imageTyp is IMAGE_FILE_MACHINE_I386!
if ( ! this->m_sw->pSW(imageType, this->m_hProcess, hThread, &s, &c, myReadProcMem, this->m_sw->pSFTA, this->m_sw->pSGMB, NULL) )
if ( ! this->m_sw->pSW(imageType, this->m_hProcess, hThread, &s, &c, myReadProcMem, this->m_sw->pSFTA, this->m_sw->pSGMB, nullptr) )
{
this->OnDbgHelpErr("StackWalk64", GetLastError(), s.AddrPC.Offset);
break;
@@ -1028,7 +1028,7 @@ BOOL StackWalker::ShowCallstack(HANDLE hThread, const CONTEXT *context, PReadPro
}
// show line number info, NT5.0-method (SymGetLineFromAddr64())
if (this->m_sw->pSGLFA != NULL )
if (this->m_sw->pSGLFA != nullptr )
{ // yes, we have SymGetLineFromAddr64()
if (this->m_sw->pSGLFA(this->m_hProcess, s.AddrPC.Offset, &(csEntry.offsetFromLine), &Line) != FALSE)
{
@@ -1078,7 +1078,7 @@ BOOL StackWalker::ShowCallstack(HANDLE hThread, const CONTEXT *context, PReadPro
break;
default:
//_snprintf( ty, sizeof ty, "symtype=%ld", (long) Module.SymType );
csEntry.symTypeString = NULL;
csEntry.symTypeString = nullptr;
break;
}
@@ -1109,7 +1109,7 @@ BOOL StackWalker::ShowCallstack(HANDLE hThread, const CONTEXT *context, PReadPro
cleanup:
if (pSym) free( pSym );
if (context == NULL)
if (context == nullptr)
ResumeThread(hThread);
return TRUE;
@@ -1123,7 +1123,7 @@ BOOL __stdcall StackWalker::myReadProcMem(
LPDWORD lpNumberOfBytesRead
)
{
if (s_readMemoryFunction == NULL)
if (s_readMemoryFunction == nullptr)
{
SIZE_T st;
BOOL bRet = ReadProcessMemory(hProcess, (LPVOID) qwBaseAddress, lpBuffer, nSize, &st);
+6 -6
View File
@@ -66,7 +66,7 @@ public:
StackWalker(
int options = OptionsAll, // 'int' is by design, to combine the enum-flags
LPCSTR szSymPath = NULL,
LPCSTR szSymPath = nullptr,
DWORD dwProcessId = GetCurrentProcessId(),
HANDLE hProcess = GetCurrentProcess()
);
@@ -86,9 +86,9 @@ public:
BOOL ShowCallstack(
HANDLE hThread = GetCurrentThread(),
const CONTEXT *context = NULL,
PReadProcessMemoryRoutine readMemoryFunction = NULL,
LPVOID pUserData = NULL // optional to identify some data in the 'readMemoryFunction'-callback
const CONTEXT *context = nullptr,
PReadProcessMemoryRoutine readMemoryFunction = nullptr,
LPVOID pUserData = nullptr // optional to identify some data in the 'readMemoryFunction'-callback
);
#if _MSC_VER >= 1300
@@ -157,11 +157,11 @@ protected:
#define GET_CURRENT_CONTEXT(c, contextFlags) \
do { \
memset(&c, 0, sizeof(CONTEXT)); \
EXCEPTION_POINTERS *pExp = NULL; \
EXCEPTION_POINTERS *pExp = nullptr; \
__try { \
throw 0; \
} __except( ( (pExp = GetExceptionInformation()) ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_EXECUTE_HANDLER)) {} \
if (pExp != NULL) \
if (pExp != nullptr) \
memcpy(&c, pExp->ContextRecord, sizeof(CONTEXT)); \
c.ContextFlags = contextFlags; \
} while(0);
-59
View File
@@ -1,59 +0,0 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef XMLParser_H
#define XMLParser_H
#include "debug.h"
#include "tinyxml/tinyxml.h"
#include "../common/types.h"
#include <string>
#include <map>
using namespace std;
/*
* See note in XMLParser::ParseFile() before inheriting this class.
*/
class XMLParser {
public:
typedef void (XMLParser::*ElementHandler)(TiXmlElement *ele);
XMLParser();
virtual ~XMLParser() {}
bool ParseFile(const char *file, const char *root_ele);
bool ParseStatus() const { return ParseOkay; }
protected:
const char *ParseTextBlock(TiXmlNode *within, const char *name, bool optional = false);
const char *GetText(TiXmlNode *within, bool optional = false);
map<string,ElementHandler> Handlers;
bool ParseOkay;
};
#endif
+190
View File
@@ -0,0 +1,190 @@
/*
* Boost Software License - Version 1.0 - August 17th, 2003
*
* Permission is hereby granted, free of charge, to any person or organization
* obtaining a copy of the software and accompanying documentation covered by
* this license (the "Software") to use, reproduce, display, distribute,
* execute, and transmit the Software, and to prepare derivative works of the
* Software, and to permit third-parties to whom the Software is furnished to
* do so, all subject to the following:
*
* The copyright notices in the Software and this entire statement, including
* the above license grant, this restriction and the following disclaimer,
* must be included in all copies of the Software, in whole or in part, and
* all derivative works of the Software, unless such copies or derivative
* works are solely in the form of machine-executable object code generated by
* a source language processor.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
* SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
* FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
// EQEmu::Any is a modified version of Boost::Any and as such retains the Boost licensing.
#ifndef EQEMU_COMMON_ANY_H
#define EQEMU_COMMON_ANY_H
#include <algorithm>
#include <typeinfo>
namespace EQEmu
{
class Any
{
public:
Any()
: content(nullptr)
{
}
template<typename ValueType>
Any(const ValueType &value)
: content(new Holder<ValueType>(value))
{
}
Any(const Any &other)
: content(other.content ? other.content->clone() : 0)
{
}
~Any()
{
if(content)
delete content;
}
Any& swap(Any &rhs)
{
std::swap(content, rhs.content);
return *this;
}
template<typename ValueType>
Any& operator=(const ValueType &rhs)
{
Any(rhs).swap(*this);
return *this;
}
Any& operator=(Any rhs)
{
rhs.swap(*this);
return *this;
}
bool empty() const
{
return !content;
}
const std::type_info& type() const
{
return content ? content->type() : typeid(void);
}
class Placeholder
{
public:
virtual ~Placeholder()
{
}
virtual const std::type_info& type() const = 0;
virtual Placeholder* clone() const = 0;
};
template<typename ValueType>
class Holder : public Placeholder
{
public:
Holder(const ValueType &value)
: held(value)
{
}
virtual const std::type_info& type() const
{
return typeid(ValueType);
}
virtual Placeholder* clone() const
{
return new Holder(held);
}
ValueType held;
private:
Holder& operator=(const Holder&);
};
private:
template<typename ValueType>
friend ValueType* any_cast(Any*);
template<typename ValueType>
friend ValueType* unsafe_any_cast(Any*);
Placeholder* content;
};
class bad_any_cast : public std::bad_cast
{
public:
virtual const char * what() const throw()
{
return "DBI::bad_any_cast: failed conversion using DBI::any_cast";
}
};
template<typename ValueType>
ValueType* any_cast(Any* operand)
{
return operand &&
operand->type() == typeid(ValueType) ? &static_cast<Any::Holder<ValueType>*>(operand->content)->held : nullptr;
}
template<typename ValueType>
inline const ValueType* any_cast(const Any* operand)
{
return any_cast<ValueType>(const_cast<Any*>(operand));
}
template<typename ValueType>
ValueType any_cast(Any& operand)
{
typedef typename std::remove_reference<ValueType>::type nonref;
nonref* result = any_cast<nonref>(&operand);
if(!result)
throw bad_any_cast();
return *result;
}
template<typename ValueType>
inline ValueType any_cast(const Any& operand)
{
typedef typename std::remove_reference<ValueType>::type nonref;
return any_cast<const nonref&>(const_cast<Any&>(operand));
}
template<typename ValueType>
inline ValueType* unsafe_any_cast(Any* operand)
{
return &static_cast<Any::Holder<ValueType>*>(operand->content)->held;
}
template<typename ValueType>
inline const ValueType* unsafe_any_cast(const Any* operand)
{
return unsafe_any_cast<ValueType>(const_cast<Any*>(operand));
}
}
#endif
+34
View File
@@ -0,0 +1,34 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2013 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef __EQEMU_COMMON_BASE_DATA_H
#define __EQEMU_COMMON_BASE_DATA_H
struct BaseDataStruct
{
double base_hp;
double base_mana;
double base_end;
double unk1;
double unk2;
double hp_factor;
double mana_factor;
double endurance_factor;
};
#endif
@@ -16,7 +16,7 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "debug.h"
#include "BasePacket.h"
#include "base_packet.h"
#include "misc.h"
#include "packet_dump.h"
@@ -24,10 +24,11 @@
BasePacket::BasePacket(const unsigned char *buf, uint32 len)
{
this->pBuffer=NULL;
this->pBuffer=nullptr;
this->size=0;
this->_wpos = 0;
this->_rpos = 0;
this->timestamp.tv_sec = 0;
if (len>0) {
this->size=len;
pBuffer= new unsigned char[len];
@@ -43,7 +44,7 @@ BasePacket::~BasePacket()
{
if (pBuffer)
delete[] pBuffer;
pBuffer=NULL;
pBuffer=nullptr;
}
@@ -55,7 +56,7 @@ void BasePacket::build_raw_header_dump(char *buffer, uint16 seq) const
buffer += sprintf(buffer, "%s.%06lu ",temp,timestamp.tv_usec);
}
if (src_ip) {
string sIP,dIP;;
std::string sIP,dIP;;
sIP=long2ip(src_ip);
dIP=long2ip(dst_ip);
buffer += sprintf(buffer, "[%s:%d->%s:%d]\n",sIP.c_str(),src_port,dIP.c_str(),dst_port);
@@ -79,7 +80,7 @@ void BasePacket::build_header_dump(char *buffer) const
void BasePacket::DumpRawHeaderNoTime(uint16 seq, FILE *to) const
{
if (src_ip) {
string sIP,dIP;;
std::string sIP,dIP;;
sIP=long2ip(src_ip);
dIP=long2ip(dst_ip);
fprintf(to, "[%s:%d->%s:%d] ",sIP.c_str(),src_port,dIP.c_str(),dst_port);
@@ -123,24 +124,3 @@ void DumpPacketBin(const BasePacket* app) {
DumpPacketBin(app->pBuffer, app->size);
}
+1 -3
View File
@@ -79,7 +79,7 @@ public:
protected:
virtual ~BasePacket();
BasePacket() { pBuffer=NULL; size=0; _wpos = 0; _rpos = 0; }
BasePacket() { pBuffer=nullptr; size=0; _wpos = 0; _rpos = 0; }
BasePacket(const unsigned char *buf, const uint32 len);
};
@@ -89,5 +89,3 @@ extern void DumpPacketBin(const BasePacket* app);
#endif /*BASEPACKET_H_*/
+22 -7
View File
@@ -7,21 +7,36 @@ static const uint32 BIT_SoF = 4;
static const uint32 BIT_SoD = 8;
static const uint32 BIT_Underfoot = 16;
static const uint32 BIT_RoF = 32;
static const uint32 BIT_TitaniumAndEarlier = 3;
static const uint32 BIT_RoF2 = 64;
static const uint32 BIT_TitaniumAndEarlier = 0x00000003;
static const uint32 BIT_SoFAndLater = 0xFFFFFFFC;
static const uint32 BIT_SoDAndLater = 0xFFFFFFF8;
static const uint32 BIT_UnderfootAndLater = 0xFFFFFFF0;
static const uint32 BIT_RoFAndLater = 0xFFFFFFE0;
static const uint32 BIT_RoF2AndLater = 0xFFFFFFC0;
static const uint32 BIT_AllClients = 0xFFFFFFFF;
typedef enum {
EQClientUnknown = 0,
EQClient62,
EQClientTitanium,
EQClientSoF,
EQClientSoD,
EQClientUnderfoot,
EQClientRoF
EQClient62, // Build: 'Aug 4 2005 15:40:59'
EQClientTitanium, // Build: 'Oct 31 2005 10:33:37'
EQClientSoF, // Build: 'Sep 7 2007 09:11:49'
EQClientSoD, // Build: 'Dec 19 2008 15:22:49'
EQClientUnderfoot, // Build: 'Jun 8 2010 16:44:32'
EQClientRoF, // Build: 'Dec 10 2012 17:35:44'
EQClientRoF2, // Build: 'May 10 2013 23:30:08'
_EQClientCount, // place new clients before this point (preferably, in release/attribute order)
// Values below are not implemented, as yet...
EmuNPC = _EQClientCount,
EmuMerc,
EmuBot,
EmuPet,
_EmuClientCount // array size for EQLimits
} EQClientVersion;
#endif /* CLIENTVERSIONS_H */
-103
View File
@@ -1,103 +0,0 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2004 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef COMMON_PROFILE_H
#define COMMON_PROFILE_H
#ifdef ZONE
#include "../zone/features.h"
#ifndef EQPROFILE
#ifdef COMMON_PROFILE
#undef COMMON_PROFILE
#endif
#endif
#ifdef COMMON_PROFILE
#include "../common/profiler.h"
class CommonProfiler : public GeneralProfiler {
public:
enum {
Database_SaveInventory = 0,
Database_StoreCharacter,
Database_GetCharacterInfoForLogin,
Database_GetCharacterInfoForLogin_result,
Database_GetPlayerProfile,
Database_GetInventory,
Database_GetInventory_name,
Database_SetPlayerProfile,
Database_DBLoadItems,
Database_GetWaypoints,
Database_DBLoadNPCFactionLists,
DBcore_RunQuery,
DBAsync_ProcessWork,
DBAsync_DispatchWork,
DBAsyncLoop_loop,
EQStreamServer_Process,
EQStream_Process,
EQStreamServerLoop,
EQStreamInLoop,
EQStreamOutLoop,
TCPServerLoop,
TCPConnectionLoop,
Inventory_GetItem,
Inventory_HasItem,
BaseTCPServerLoop,
MakeRandomInt,
MakeRandomFloat,
Mutex_lock,
Timer_Check,
WorldConnection_Process,
MaxCommonProfilerId
};
inline CommonProfiler() : GeneralProfiler(MaxCommonProfilerId) { }
};
extern CommonProfiler _cp;
#define _CP(name) _GP(_cp, CommonProfiler, name)
#else
//no zone profiling, dummy functions
#define _CP(name) ;
#endif //COMMON_PROFILE
#else //else !ZONE
#define _CP(name) ;
#endif //!ZONE
#endif
+148
View File
@@ -0,0 +1,148 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "debug.h"
#include "condition.h"
#ifdef _WINDOWS
Condition::Condition()
{
m_events[SignalEvent] = CreateEvent (nullptr, // security
FALSE, // is auto-reset event?
FALSE, // is signaled initially?
nullptr); // name
m_events[BroadcastEvent] = CreateEvent (nullptr, // security
TRUE, // is auto-reset event?
FALSE, // is signaled initially?
nullptr); // name
m_waiters = 0;
InitializeCriticalSection(&CSMutex);
}
Condition::~Condition()
{
DeleteCriticalSection(&CSMutex);
CloseHandle(m_events[SignalEvent]);
CloseHandle(m_events[BroadcastEvent]);
}
void Condition::Signal()
{
EnterCriticalSection(&CSMutex);
if(m_waiters > 0)
SetEvent(m_events[SignalEvent]);
LeaveCriticalSection(&CSMutex);
}
void Condition::SignalAll()
{
EnterCriticalSection(&CSMutex);
if(m_waiters > 0)
SetEvent(m_events[BroadcastEvent]);
LeaveCriticalSection(&CSMutex);
}
void Condition::Wait()
{
EnterCriticalSection(&CSMutex);
m_waiters++;
LeaveCriticalSection(&CSMutex);
int result = WaitForMultipleObjects (_eventCount, m_events, FALSE, INFINITE);
EnterCriticalSection(&CSMutex);
m_waiters--;
//see if we are the last person waiting on the condition, and there was a broadcast
//if so, we need to reset the broadcast event.
if(m_waiters == 0 && result == (WAIT_OBJECT_0+BroadcastEvent))
ResetEvent(m_events[BroadcastEvent]);
LeaveCriticalSection(&CSMutex);
}
#else
#include <pthread.h>
#include <sys/time.h>
#include <errno.h>
Condition::Condition()
{
pthread_cond_init(&cond,nullptr);
pthread_mutex_init(&mutex,nullptr);
}
void Condition::Signal()
{
pthread_mutex_lock(&mutex);
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}
void Condition::SignalAll()
{
pthread_mutex_lock(&mutex);
pthread_cond_broadcast(&cond);
pthread_mutex_unlock(&mutex);
}
void Condition::Wait()
{
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond,&mutex);
pthread_mutex_unlock(&mutex);
}
/*
I commented this specifically because I think it might be very
difficult to write a windows counterpart to it, so I would like
to discourage its use until we can confirm that it can be reasonably
implemented on windows.
bool Condition::TimedWait(unsigned long usec)
{
struct timeval now;
struct timespec timeout;
int retcode=0;
pthread_mutex_lock(&mutex);
gettimeofday(&now,nullptr);
now.tv_usec+=usec;
timeout.tv_sec = now.tv_sec + (now.tv_usec/1000000);
timeout.tv_nsec = (now.tv_usec%1000000) *1000;
//cout << "now=" << now.tv_sec << "."<<now.tv_usec << endl;
//cout << "timeout=" << timeout.tv_sec << "."<<timeout.tv_nsec << endl;
retcode=pthread_cond_timedwait(&cond,&mutex,&timeout);
pthread_mutex_unlock(&mutex);
return retcode!=ETIMEDOUT;
}
*/
Condition::~Condition()
{
pthread_mutex_lock(&mutex);
pthread_cond_destroy(&cond);
pthread_mutex_unlock(&mutex);
pthread_mutex_destroy(&mutex);
}
#endif
+56
View File
@@ -0,0 +1,56 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2006 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef __CONDITION_H
#define __CONDITION_H
#include "debug.h"
#ifndef WIN32
#include <pthread.h>
#endif
//Sombody, someday needs to figure out how to implement a condition
//system on windows...
class Condition {
private:
#ifdef WIN32
enum {
SignalEvent = 0,
BroadcastEvent,
_eventCount
};
HANDLE m_events[_eventCount];
uint32 m_waiters;
CRITICAL_SECTION CSMutex;
#else
pthread_cond_t cond;
pthread_mutex_t mutex;
#endif
public:
Condition();
void Signal();
void SignalAll();
void Wait();
// bool TimedWait(unsigned long usec);
~Condition();
};
#endif
+15
View File
@@ -0,0 +1,15 @@
#include "crc32.h"
uint16 CRC16(const unsigned char *buf, int size, int key)
{
// This is computed as the lowest 16 bits of an Ethernet CRC32 checksum
// where the key is prepended to the data in little endian order.
uint8 keyBuf[] = {(uint8)((key >> 0) & 0xff),
(uint8)((key >> 8) & 0xff),
(uint8)((key >> 16) & 0xff),
(uint8)((key >> 24) & 0xff)};
uint32 crc = CRC32::Update(keyBuf, sizeof(uint32));
crc = CRC32::Update(buf, size, crc);
return CRC32::Finish(crc) & 0xffff;
}
+7
View File
@@ -0,0 +1,7 @@
#ifndef _CRC16_H
#define _CRC16_H
#include "types.h"
uint16 CRC16(const unsigned char *buf, int size, int key);
#endif
+1237 -1891
View File
File diff suppressed because it is too large Load Diff
+29 -21
View File
@@ -26,19 +26,18 @@
#include "dbcore.h"
#include "linked_list.h"
#include "eq_packet_structs.h"
/*#include "EQStream.h"
/*#include "eq_stream.h"
#include "guilds.h"
#include "MiscFunctions.h"
#include "Mutex.h"
#include "Item.h"
#include "misc_functions.h"
#include "mutex.h"
#include "item.h"
#include "extprofile.h"*/
#include <string>
#include <vector>
#include <map>
using namespace std;
//atoi is not uint32 or uint32 safe!!!!
#define atoul(str) strtoul(str, NULL, 10)
#define atoul(str) strtoul(str, nullptr, 10)
//class Spawn;
class Corpse;
@@ -107,10 +106,6 @@ public:
bool Connect(const char* host, const char* user, const char* passwd, const char* database,uint32 port);
~Database();
// void ExtraOptions();
/*
* General Character Related Stuff
*/
@@ -135,7 +130,7 @@ public:
uint32 GetAccountIDByChar(const char* charname, uint32* oCharID = 0);
uint32 GetAccountIDByChar(uint32 char_id);
uint32 GetAccountIDByName(const char* accname, int16* status = 0, uint32* lsid = 0);
uint32 GetGuildDBIDByCharID(uint32 char_id);
uint32 GetGuildIDByCharID(uint32 char_id);
void GetAccountName(uint32 accountid, char* name, uint32* oLSAccountID = 0);
void GetCharName(uint32 char_id, char* name);
uint32 GetCharacterInfo(const char* iName, uint32* oAccID = 0, uint32* oZoneID = 0, uint32* oInstanceID = 0,float* oX = 0, float* oY = 0, float* oZ = 0);
@@ -168,6 +163,7 @@ public:
uint16 GetInstanceVersion(uint16 instance_id);
uint16 GetInstanceID(const char* zone, uint32 charid, int16 version);
uint16 GetInstanceID(uint32 zone, uint32 charid, int16 version);
void GetCharactersInInstance(uint16 instance_id, std::list<uint32> &charid_list);
void AssignGroupToInstance(uint32 gid, uint32 instance_id);
void AssignRaidToInstance(uint32 rid, uint32 instance_id);
void FlagInstanceByGroupLeader(uint32 zone, int16 version, uint32 charid, uint32 gid);
@@ -208,10 +204,11 @@ public:
char* GetGroupLeaderForLogin(const char* name,char* leaderbuf);
void SetGroupLeaderName(uint32 gid, const char* name);
char* GetGroupLeadershipInfo(uint32 gid, char* leaderbuf, char* maintank = NULL, char* assist = NULL, char* puller = NULL, char *marknpc = NULL,
GroupLeadershipAA_Struct* GLAA = NULL);
char* GetGroupLeadershipInfo(uint32 gid, char* leaderbuf, char* maintank = nullptr, char* assist = nullptr, char* puller = nullptr, char *marknpc = nullptr,
GroupLeadershipAA_Struct* GLAA = nullptr);
void ClearGroupLeader(uint32 gid = 0);
/*
* Raids
*/
@@ -221,13 +218,13 @@ public:
const char *GetRaidLeaderName(uint32 rid);
/*
* Database Varaibles
* Database Variables
*/
bool GetVariable(const char* varname, char* varvalue, uint16 varvalue_len);
bool SetVariable(const char* varname, const char* varvalue);
bool LoadVariables();
uint32 LoadVariables_MQ(char** query);
bool LoadVariables_result(MYSQL_RES* result);
bool LoadVariables_result(MySQLRequestResult results);
/*
* General Queries
@@ -240,8 +237,8 @@ public:
uint8 GetPEQZone(uint32 zoneID, uint32 version);
const char* GetZoneName(uint32 zoneID, bool ErrorUnknown = false);
uint8 GetServerType();
bool GetSafePoints(const char* short_name, uint32 version, float* safe_x = 0, float* safe_y = 0, float* safe_z = 0, int16* minstatus = 0, uint8* minlevel = 0, char *flag_needed = NULL);
bool GetSafePoints(uint32 zoneID, uint32 version, float* safe_x = 0, float* safe_y = 0, float* safe_z = 0, int16* minstatus = 0, uint8* minlevel = 0, char *flag_needed = NULL) { return GetSafePoints(GetZoneName(zoneID), version, safe_x, safe_y, safe_z, minstatus, minlevel, flag_needed); }
bool GetSafePoints(const char* short_name, uint32 version, float* safe_x = 0, float* safe_y = 0, float* safe_z = 0, int16* minstatus = 0, uint8* minlevel = 0, char *flag_needed = nullptr);
bool GetSafePoints(uint32 zoneID, uint32 version, float* safe_x = 0, float* safe_y = 0, float* safe_z = 0, int16* minstatus = 0, uint8* minlevel = 0, char *flag_needed = nullptr) { return GetSafePoints(GetZoneName(zoneID), version, safe_x, safe_y, safe_z, minstatus, minlevel, flag_needed); }
uint8 GetSkillCap(uint8 skillid, uint8 in_race, uint8 in_class, uint16 in_level);
uint8 GetRaceSkill(uint8 skillid, uint8 in_race);
bool LoadPTimers(uint32 charid, PTimerList &into);
@@ -256,19 +253,30 @@ public:
protected:
void HandleMysqlError(uint32 errnum);
//bool RunQuery(const char* query, uint32 querylen, char* errbuf = 0, MYSQL_RES** result = 0, uint32* affected_rows = 0, uint32* errnum = 0, bool retry = true);
private:
void DBInitVars();
uint32 max_zonename;
char** zonename_array;
std::map<uint32,std::string> zonename_array;
Mutex Mvarcache;
uint32 varcache_max;
VarCache_Struct** varcache_array;
uint32 varcache_lastupdate;
/*
* Groups, utility methods.
*/
void ClearAllGroupLeaders();
void ClearAllGroups();
/*
* Raid, utility methods.
*/
void ClearAllRaids();
void ClearAllRaidDetails();
};
bool FetchRowMap(MYSQL_RES *result, map<string,string> &rowmap);
#endif
+15 -23
View File
@@ -5,16 +5,15 @@
#include <winsock2.h>
#endif
#include <iostream>
using namespace std;
#include "dbasync.h"
#include "database.h"
#include <errmsg.h>
#include <mysqld_error.h>
#include <limits.h>
#include "dbcore.h"
#include "common_profile.h"
#include <string.h>
#include "../common/MiscFunctions.h"
//#include "../common/misc_functions.h"
#include "string_util.h"
#define ASYNC_LOOP_GRANULARITY 4 //# of ms between checking our work
bool DBAsyncCB_LoadVariables(DBAsyncWork* iWork) {
@@ -24,7 +23,7 @@ bool DBAsyncCB_LoadVariables(DBAsyncWork* iWork) {
if (dbaq->GetAnswer(errbuf, &result))
iWork->GetDB()->LoadVariables_result(result);
else
cout << "Error: DBAsyncCB_LoadVariables failed: !GetAnswer: '" << errbuf << "'" << endl;
std::cout << "Error: DBAsyncCB_LoadVariables failed: !GetAnswer: '" << errbuf << "'" << std::endl;
return true;
}
@@ -54,10 +53,8 @@ ThreadReturnType DBAsyncLoop(void* tmp) {
//we could check dba->RunLoop() again to see if we
//got turned off while we were waiting
{
_CP(DBAsyncLoop_loop);
dba->Process();
}
// Sleep(ASYNC_LOOP_GRANULARITY);
}
dba->MLoopRunning.unlock();
@@ -65,7 +62,7 @@ ThreadReturnType DBAsyncLoop(void* tmp) {
_log(COMMON__THREADS, "Ending DBAsyncLoop with thread ID %d", pthread_self());
#endif
THREAD_RETURN(NULL);
THREAD_RETURN(nullptr);
}
DBAsync::DBAsync(DBcore* iDBC)
@@ -78,7 +75,7 @@ DBAsync::DBAsync(DBcore* iDBC)
_beginthread(DBAsyncLoop, 0, this);
#else
pthread_t thread;
pthread_create(&thread, NULL, DBAsyncLoop, this);
pthread_create(&thread, nullptr, DBAsyncLoop, this);
#endif
}
@@ -115,8 +112,8 @@ uint32 DBAsync::AddWork(DBAsyncWork** iWork, uint32 iDelay) {
if (iDelay)
(*iWork)->pExecuteAfter = Timer::GetCurrentTime() + iDelay;
#if DEBUG_MYSQL_QUERIES >= 2
cout << "Adding AsyncWork #" << (*iWork)->GetWorkID() << endl;
cout << "ExecuteAfter = " << (*iWork)->pExecuteAfter << " (" << Timer::GetCurrentTime() << " + " << iDelay << ")" << endl;
std::cout << "Adding AsyncWork #" << (*iWork)->GetWorkID() << std::endl;
std::cout << "ExecuteAfter = " << (*iWork)->pExecuteAfter << " (" << Timer::GetCurrentTime() << " + " << iDelay << ")" << std::endl;
#endif
*iWork = 0;
MInList.unlock();
@@ -131,7 +128,7 @@ bool DBAsync::CancelWork(uint32 iWorkID) {
if (iWorkID == 0)
return false;
#if DEBUG_MYSQL_QUERIES >= 2
cout << "DBAsync::CancelWork: " << iWorkID << endl;
std::cout << "DBAsync::CancelWork: " << iWorkID << std::endl;
#endif
MCurrentWork.lock();
if (CurrentWork && CurrentWork->GetWorkID() == iWorkID) {
@@ -174,8 +171,8 @@ DBAsyncWork* DBAsync::InListPop() {
if (iterator.GetData()->pExecuteAfter <= Timer::GetCurrentTime()) {
ret = iterator.GetData();
#if DEBUG_MYSQL_QUERIES >= 2
cout << "Poping AsyncWork #" << ret->GetWorkID() << endl;
cout << ret->pExecuteAfter << " <= " << Timer::GetCurrentTime() << endl;
std::cout << "Poping AsyncWork #" << ret->GetWorkID() << std::endl;
std::cout << ret->pExecuteAfter << " <= " << Timer::GetCurrentTime() << std::endl;
#endif
iterator.RemoveCurrent(false);
break;
@@ -232,7 +229,7 @@ void DBAsync::Process() {
tmpStatus = tmpWork->SetStatus(DBAsync::Finished);
if (tmpStatus != Executing) {
if (tmpStatus != Canceled) {
cout << "Error: Unexpected DBAsyncWork->Status in DBAsync::Process #1" << endl;
std::cout << "Error: Unexpected DBAsyncWork->Status in DBAsync::Process #1" << std::endl;
}
MCurrentWork.lock();
safe_delete(tmpWork);
@@ -246,7 +243,7 @@ void DBAsync::Process() {
}
else {
if (tmpStatus != Canceled) {
cout << "Error: Unexpected DBAsyncWork->Status in DBAsync::Process #2" << endl;
std::cout << "Error: Unexpected DBAsyncWork->Status in DBAsync::Process #2" << std::endl;
}
MCurrentWork.lock();
safe_delete(CurrentWork);
@@ -274,7 +271,7 @@ void DBAsync::CheckTimeout() {
void DBAsync::CommitWrites() {
#if DEBUG_MYSQL_QUERIES >= 2
cout << "DBAsync::CommitWrites() called." << endl;
std::cout << "DBAsync::CommitWrites() called." << std::endl;
#endif
DBAsyncWork* tmpWork;
while ((tmpWork = InListPopWrite())) {
@@ -284,7 +281,7 @@ void DBAsync::CommitWrites() {
tmpStatus = tmpWork->SetStatus(DBAsync::Finished);
if (tmpStatus != Executing) {
if (tmpStatus != Canceled) {
cout << "Error: Unexpected DBAsyncWork->Status in DBAsync::CommitWrites #1" << endl;
std::cout << "Error: Unexpected DBAsyncWork->Status in DBAsync::CommitWrites #1" << std::endl;
}
safe_delete(tmpWork);
}
@@ -294,7 +291,7 @@ void DBAsync::CommitWrites() {
}
else {
if (tmpStatus != Canceled) {
cout << "Error: Unexpected DBAsyncWork->Status in DBAsync::CommitWrites #2" << endl;
std::cout << "Error: Unexpected DBAsyncWork->Status in DBAsync::CommitWrites #2" << std::endl;
}
safe_delete(tmpWork);
}
@@ -302,11 +299,7 @@ void DBAsync::CommitWrites() {
}
void DBAsync::ProcessWork(DBAsyncWork* iWork, bool iSleep) {
_CP(DBAsync_ProcessWork);
DBAsyncQuery* CurrentQuery;
#if DEBUG_MYSQL_QUERIES >= 2
cout << "Processing AsyncWork #" << iWork->GetWorkID() << endl;
#endif
while ((CurrentQuery = iWork->PopQuery())) {
CurrentQuery->Process(pDBC);
iWork->PushAnswer(CurrentQuery);
@@ -316,7 +309,6 @@ void DBAsync::ProcessWork(DBAsyncWork* iWork, bool iSleep) {
}
void DBAsync::DispatchWork(DBAsyncWork* iWork) {
_CP(DBAsync_DispatchWork);
//if this work has a callback, call it
//otherwise, stick the work on the finish queue
if (iWork->pCB) {
+103 -20
View File
@@ -5,13 +5,12 @@
#endif
#include <iostream>
using namespace std;
#include <errmsg.h>
#include <mysqld_error.h>
#include <limits.h>
#include "dbcore.h"
#include <string.h>
#include "../common/MiscFunctions.h"
#include "../common/misc_functions.h"
#include <cstdlib>
#ifdef _WINDOWS
@@ -38,6 +37,7 @@ DBcore::DBcore() {
pDatabase = 0;
pCompress = false;
pSSL = false;
pStatus = Closed;
}
DBcore::~DBcore() {
@@ -58,8 +58,94 @@ void DBcore::ping() {
MDatabase.unlock();
}
MySQLRequestResult DBcore::QueryDatabase(std::string query, bool retryOnFailureOnce)
{
return QueryDatabase(query.c_str(), query.length(), retryOnFailureOnce);
}
MySQLRequestResult DBcore::QueryDatabase(const char* query, uint32 querylen, bool retryOnFailureOnce)
{
LockMutex lock(&MDatabase);
// Reconnect if we are not connected before hand.
if (pStatus != Connected)
Open();
// request query. != 0 indicates some kind of error.
if (mysql_real_query(&mysql, query, querylen) != 0)
{
unsigned int errorNumber = mysql_errno(&mysql);
if (errorNumber == CR_SERVER_GONE_ERROR)
pStatus = Error;
// error appears to be a disconnect error, may need to try again.
if (errorNumber == CR_SERVER_LOST || errorNumber == CR_SERVER_GONE_ERROR)
{
if (retryOnFailureOnce)
{
std::cout << "Database Error: Lost connection, attempting to recover...." << std::endl;
MySQLRequestResult requestResult = QueryDatabase(query, querylen, false);
if (requestResult.Success())
{
std::cout << "Reconnection to database successful." << std::endl;
return requestResult;
}
}
pStatus = Error;
char *errorBuffer = new char[MYSQL_ERRMSG_SIZE];
snprintf(errorBuffer, MYSQL_ERRMSG_SIZE, "#%i: %s", mysql_errno(&mysql), mysql_error(&mysql));
std::cout << "DB Query Error #" << mysql_errno(&mysql) << ": " << mysql_error(&mysql) << std::endl;
return MySQLRequestResult(nullptr, 0, 0, 0, 0, (uint32)mysql_errno(&mysql), errorBuffer);
}
char *errorBuffer = new char[MYSQL_ERRMSG_SIZE];
snprintf(errorBuffer, MYSQL_ERRMSG_SIZE, "#%i: %s", mysql_errno(&mysql), mysql_error(&mysql));
#ifdef _EQDEBUG
std::cout << "DB Query Error #" << mysql_errno(&mysql) << ": " << mysql_error(&mysql) << std::endl;
#endif
return MySQLRequestResult(nullptr, 0, 0, 0, 0, mysql_errno(&mysql),errorBuffer);
}
// successful query. get results.
MYSQL_RES* res = mysql_store_result(&mysql);
uint32 rowCount = 0;
if (res != nullptr)
rowCount = (uint32)mysql_num_rows(res);
MySQLRequestResult requestResult(res, (uint32)mysql_affected_rows(&mysql), rowCount, (uint32)mysql_field_count(&mysql), (uint32)mysql_insert_id(&mysql));
#if DEBUG_MYSQL_QUERIES >= 1
if (requestResult.Success())
{
std::cout << "query successful";
if (requestResult.Result())
std::cout << ", " << (int) mysql_num_rows(requestResult.Result()) << " rows returned";
std::cout << ", " << requestResult.RowCount() << " rows affected";
std::cout<< std::endl;
}
else {
std::cout << "QUERY: query FAILED" << std::endl;
}
#endif
return requestResult;
}
bool DBcore::RunQuery(const char* query, uint32 querylen, char* errbuf, MYSQL_RES** result, uint32* affected_rows, uint32* last_insert_id, uint32* errnum, bool retry) {
_CP(DBcore_RunQuery);
if (errnum)
*errnum = 0;
if (errbuf)
@@ -68,20 +154,16 @@ bool DBcore::RunQuery(const char* query, uint32 querylen, char* errbuf, MYSQL_RE
LockMutex lock(&MDatabase);
if (pStatus != Connected)
Open();
#if DEBUG_MYSQL_QUERIES >= 1
char tmp[120];
strn0cpy(tmp, query, sizeof(tmp));
cout << "QUERY: " << tmp << endl;
#endif
if (mysql_real_query(&mysql, query, querylen)) {
if (mysql_errno(&mysql) == CR_SERVER_GONE_ERROR)
pStatus = Error;
if (mysql_errno(&mysql) == CR_SERVER_LOST || mysql_errno(&mysql) == CR_SERVER_GONE_ERROR) {
if (retry) {
cout << "Database Error: Lost connection, attempting to recover...." << endl;
std::cout << "Database Error: Lost connection, attempting to recover...." << std::endl;
ret = RunQuery(query, querylen, errbuf, result, affected_rows, last_insert_id, errnum, false);
if (ret)
cout << "Reconnection to database successful." << endl;
std::cout << "Reconnection to database successful." << std::endl;
}
else {
pStatus = Error;
@@ -89,7 +171,7 @@ bool DBcore::RunQuery(const char* query, uint32 querylen, char* errbuf, MYSQL_RE
*errnum = mysql_errno(&mysql);
if (errbuf)
snprintf(errbuf, MYSQL_ERRMSG_SIZE, "#%i: %s", mysql_errno(&mysql), mysql_error(&mysql));
cout << "DB Query Error #" << mysql_errno(&mysql) << ": " << mysql_error(&mysql) << endl;
std::cout << "DB Query Error #" << mysql_errno(&mysql) << ": " << mysql_error(&mysql) << std::endl;
ret = false;
}
}
@@ -99,7 +181,7 @@ bool DBcore::RunQuery(const char* query, uint32 querylen, char* errbuf, MYSQL_RE
if (errbuf)
snprintf(errbuf, MYSQL_ERRMSG_SIZE, "#%i: %s", mysql_errno(&mysql), mysql_error(&mysql));
#ifdef _EQDEBUG
cout << "DB Query Error #" << mysql_errno(&mysql) << ": " << mysql_error(&mysql) << endl;
std::cout << "DB Query Error #" << mysql_errno(&mysql) << ": " << mysql_error(&mysql) << std::endl;
#endif
ret = false;
}
@@ -116,14 +198,14 @@ bool DBcore::RunQuery(const char* query, uint32 querylen, char* errbuf, MYSQL_RE
if (affected_rows)
*affected_rows = mysql_affected_rows(&mysql);
if (last_insert_id)
*last_insert_id = mysql_insert_id(&mysql);
*last_insert_id = (uint32)mysql_insert_id(&mysql);
if (result) {
if (*result) {
ret = true;
}
else {
#ifdef _EQDEBUG
cout << "DB Query Error: No Result" << endl;
std::cout << "DB Query Error: No Result" << std::endl;
#endif
if (errnum)
*errnum = UINT_MAX;
@@ -138,15 +220,15 @@ bool DBcore::RunQuery(const char* query, uint32 querylen, char* errbuf, MYSQL_RE
}
#if DEBUG_MYSQL_QUERIES >= 1
if (ret) {
cout << "query successful";
std::cout << "query successful";
if (result && (*result))
cout << ", " << (int) mysql_num_rows(*result) << " rows returned";
std::cout << ", " << (int) mysql_num_rows(*result) << " rows returned";
if (affected_rows)
cout << ", " << (*affected_rows) << " rows affected";
cout<< endl;
std::cout << ", " << (*affected_rows) << " rows affected";
std::cout<< std::endl;
}
else {
cout << "QUERY: query FAILED" << endl;
std::cout << "QUERY: query FAILED" << std::endl;
}
#endif
return ret;
@@ -180,9 +262,10 @@ bool DBcore::Open(uint32* errnum, char* errbuf) {
LockMutex lock(&MDatabase);
if (GetStatus() == Connected)
return true;
if (GetStatus() == Error)
if (GetStatus() == Error) {
mysql_close(&mysql);
mysql_init(&mysql); // Initialize structure again
}
if (!pHost)
return false;
/*
+7 -4
View File
@@ -4,16 +4,17 @@
#ifdef _WINDOWS
#include <winsock.h>
#include <windows.h>
//#include <winsock.h>
#endif
#include <mysql.h>
#include "../common/DBMemLeak.h"
#include <string.h>
#include "../common/types.h"
#include "../common/Mutex.h"
#include "../common/mutex.h"
#include "../common/linked_list.h"
#include "../common/queue.h"
#include "../common/timer.h"
#include "../common/Condition.h"
#include "../common/condition.h"
#include "../common/mysql_request_result.h"
class DBcore {
public:
@@ -23,6 +24,8 @@ public:
~DBcore();
eStatus GetStatus() { return pStatus; }
bool RunQuery(const char* query, uint32 querylen, char* errbuf = 0, MYSQL_RES** result = 0, uint32* affected_rows = 0, uint32* last_insert_id = 0, uint32* errnum = 0, bool retry = true);
MySQLRequestResult QueryDatabase(const char* query, uint32 querylen, bool retryOnFailureOnce = true);
MySQLRequestResult QueryDatabase(std::string query, bool retryOnFailureOnce = true);
uint32 DoEscapeString(char* tobuf, const char* frombuf, uint32 fromlen);
void ping();
MYSQL* getMySQL(){ return &mysql; }
-2
View File
@@ -1,5 +1,3 @@
// Doors
#ifdef SHAREMEM
int32 Database::GetDoorsCount(uint32* oMaxID) {
+57 -55
View File
@@ -1,25 +1,27 @@
#include "debug.h"
#include <iostream>
using namespace std;
#include <string>
#include <cstdarg>
#include <time.h>
#include <string.h>
#ifdef _WINDOWS
#include <process.h>
#define snprintf _snprintf
#if (_MSC_VER < 1500)
#define vsnprintf _vsnprintf
#endif
#define strncasecmp _strnicmp
#define strcasecmp _stricmp
#else
#include <sys/types.h>
#include <unistd.h>
#include <stdarg.h>
#endif
#include "../common/MiscFunctions.h"
#include "../common/platform.h"
#include "debug.h"
#include "string_util.h"
#include "misc_functions.h"
#include "platform.h"
#ifndef va_copy
#define va_copy(d,s) ((d) = (s))
@@ -33,29 +35,20 @@ static const char* FileNames[EQEMuLog::MaxLogID] = { "logs/eqemu", "logs/eqemu",
static const char* LogNames[EQEMuLog::MaxLogID] = { "Status", "Normal", "Error", "Debug", "Quest", "Command", "Crash" };
EQEMuLog::EQEMuLog() {
// MOpen = new Mutex;
// MLog = new Mutex*[MaxLogID];
// fp = new FILE*[MaxLogID];
// pLogStatus = new uint8[MaxLogID];
for (int i=0; i<MaxLogID; i++) {
fp[i] = 0;
// MLog[i] = new Mutex;
#if EQDEBUG >= 2
pLogStatus[i] = 1 | 2;
#else
pLogStatus[i] = 0;
#endif
logCallbackFmt[i] = NULL;
logCallbackBuf[i] = NULL;
logCallbackPva[i] = NULL;
logCallbackFmt[i] = nullptr;
logCallbackBuf[i] = nullptr;
logCallbackPva[i] = nullptr;
}
// TODO: Make this read from an ini or something, everyone has different opinions on what it should be
#if EQDEBUG < 2
pLogStatus[Status] = 2;
pLogStatus[Error] = 2;
pLogStatus[Quest] = 2;
pLogStatus[Commands] = 1;
#endif
pLogStatus[Status] = LOG_LEVEL_STATUS;
pLogStatus[Normal] = LOG_LEVEL_NORMAL;
pLogStatus[Error] = LOG_LEVEL_ERROR;
pLogStatus[Debug] = LOG_LEVEL_DEBUG;
pLogStatus[Quest] = LOG_LEVEL_QUEST;
pLogStatus[Commands] = LOG_LEVEL_COMMANDS;
pLogStatus[Crash] = LOG_LEVEL_CRASH;
logFileValid = true;
}
@@ -66,10 +59,6 @@ EQEMuLog::~EQEMuLog() {
if (fp[i])
fclose(fp[i]);
}
// safe_delete_array(fp);
// safe_delete_array(MLog);
// safe_delete_array(pLogStatus);
// safe_delete(MOpen);
}
bool EQEMuLog::open(LogIDs id) {
@@ -100,6 +89,12 @@ bool EQEMuLog::open(LogIDs id) {
snprintf(exename, sizeof(exename), "_ucs");
} else if(platform == ExePlatformQueryServ) {
snprintf(exename, sizeof(exename), "_queryserv");
} else if(platform == ExePlatformSharedMemory) {
snprintf(exename, sizeof(exename), "_shared_memory");
} else if(platform == ExePlatformClientImport) {
snprintf(exename, sizeof(exename), "_import");
} else if(platform == ExePlatformClientExport) {
snprintf(exename, sizeof(exename), "_export");
}
char filename[200];
@@ -110,7 +105,7 @@ bool EQEMuLog::open(LogIDs id) {
#endif
fp[id] = fopen(filename, "a");
if (!fp[id]) {
cerr << "Failed to open log file: " << filename << endl;
std::cerr << "Failed to open log file: " << filename << std::endl;
pLogStatus[id] |= 4; // set file state to error
return false;
}
@@ -326,7 +321,7 @@ bool EQEMuLog::writeNTS(LogIDs id, bool dofile, const char *fmt, ...) {
bool EQEMuLog::Dump(LogIDs id, uint8* data, uint32 size, uint32 cols, uint32 skip) {
if (!logFileValid) {
#if EQDEBUG >= 10
cerr << "Error: Dump() from null pointer"<<endl;
std::cerr << "Error: Dump() from null pointer" << std::endl;
#endif
return false;
}
@@ -348,36 +343,45 @@ bool EQEMuLog::Dump(LogIDs id, uint8* data, uint32 size, uint32 cols, uint32 ski
write(id, "Dumping Packet: %i", size);
// Output as HEX
int j = 0; char* ascii = new char[cols+1]; memset(ascii, 0, cols+1);
uint32 i;
for(i=skip; i<size; i++) {
if ((i-skip)%cols==0) {
if (i != skip)
writeNTS(id, dofile, " | %s\n", ascii);
writeNTS(id, dofile, "%4i: ", i-skip);
memset(ascii, 0, cols+1);
j = 0;
int beginningOfLineOffset = 0;
uint32 indexInData;
std::string asciiOutput;
for(indexInData=skip; indexInData<size; indexInData++) {
if ((indexInData-skip)%cols==0) {
if (indexInData != skip)
writeNTS(id, dofile, " | %s\n", asciiOutput.c_str());
writeNTS(id, dofile, "%4i: ", indexInData-skip);
asciiOutput.clear();
beginningOfLineOffset = 0;
}
else if ((i-skip)%(cols/2) == 0) {
else if ((indexInData-skip)%(cols/2) == 0) {
writeNTS(id, dofile, "- ");
}
writeNTS(id, dofile, "%02X ", (unsigned char)data[i]);
writeNTS(id, dofile, "%02X ", (unsigned char)data[indexInData]);
if (data[i] >= 32 && data[i] < 127)
ascii[j++] = data[i];
else
ascii[j++] = '.';
if (data[indexInData] >= 32 && data[indexInData] < 127)
{
// According to http://msdn.microsoft.com/en-us/library/vstudio/ee404875(v=vs.100).aspx
// Visual Studio 2010 doesn't have std::to_string(int) but it does have the long long
// version.
asciiOutput.append(std::to_string((long long)data[indexInData]));
}
uint32 k = ((i-skip)-1)%cols;
else
{
asciiOutput.append(".");
}
}
uint32 k = ((indexInData-skip)-1)%cols;
if (k < 8)
writeNTS(id, dofile, " ");
for (uint32 h = k+1; h < cols; h++) {
writeNTS(id, dofile, " ");
}
writeNTS(id, dofile, " | %s\n", ascii);
writeNTS(id, dofile, " | %s\n", asciiOutput.c_str());
if (dofile)
fflush(fp[id]);
safe_delete_array(ascii);
return true;
}
@@ -435,5 +439,3 @@ void EQEMuLog::SetAllCallbacks(msgCallbackPva proc) {
}
}
+1 -27
View File
@@ -45,30 +45,8 @@
#ifndef _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#if (_MSC_VER < 1300)
#include <new>
#include <memory>
#define _CRTDBG_MAP_ALLOC
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define malloc(s) _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)
#endif
#endif
#endif
#ifndef ThrowError
void CatchSignal(int);
#if defined(CATCH_CRASH) || defined(_EQDEBUG)
#define ThrowError(errstr) { cout << "Fatal error: " << errstr << " (" << __FILE__ << ", line " << __LINE__ << ")" << endl; LogFile->write(EQEMuLog::Error, "Thown Error: %s (%s:%i)", errstr, __FILE__, __LINE__); throw errstr; }
#else
#define ThrowError(errstr) { cout << "Fatal error: " << errstr << " (" << __FILE__ << ", line " << __LINE__ << ")" << endl; LogFile->write(EQEMuLog::Error, "Thown Error: %s (%s:%i)", errstr, __FILE__, __LINE__); CatchSignal(0); }
#endif
#endif
#ifdef _WINDOWS
// VS6 doesn't like the length of STL generated names: disabling
#pragma warning(disable:4786)
#pragma warning(disable:4996)
#endif
#ifndef EQDEBUG_H
#define EQDEBUG_H
@@ -90,12 +68,8 @@
#endif
#include "logsys.h"
#include "common_profile.h"
#ifdef ZONE
#include "../zone/zone_profile.h"
#endif
#include "../common/Mutex.h"
#include "../common/mutex.h"
#include <stdio.h>
#include <stdarg.h>
+140 -39
View File
@@ -18,48 +18,149 @@
#ifndef DEITY_H
#define DEITY_H
#include "types.h"
#include <string>
// NOTE: This code is not fully implemented since there are no references in the existing code
/*
** Diety List
** Diety types
**
** (ref: eqstr_us.txt)
**
** (Another orphaned enumeration...)
*/
#define DEITY_AGNOSTIC 396 //drop the high bit for 140
#define DEITY_BRELL 202
#define DEITY_CAZIC 203
#define DEITY_EROLLSI 204
#define DEITY_BRISTLE 205
#define DEITY_INNY 206
#define DEITY_KARANA 207
#define DEITY_MITH 208
#define DEITY_PREXUS 209
#define DEITY_QUELLIOUS 210
#define DEITY_RALLOS 211
#define DEITY_SOLUSEK 213
#define DEITY_TRIBUNAL 214
#define DEITY_TUNARE 215
enum DeityTypes
{
/*----*/ DeityUnknown = 0,
/*----*/ DeityAgnostic_LB = 140,
/*3251*/ DeityBertoxxulous = 201,
/*3262*/ DeityBrellSirilis,
/*3253*/ DeityCazicThule,
/*3256*/ DeityErollisiMarr,
/*3252*/ DeityBristlebane,
/*3254*/ DeityInnoruuk,
/*3255*/ DeityKarana,
/*3257*/ DeityMithanielMarr,
/*3259*/ DeityPrexus,
/*3260*/ DeityQuellious,
/*3266*/ DeityRallosZek,
/*3258*/ DeityRodcetNife,
/*3261*/ DeitySolusekRo,
/*3263*/ DeityTheTribunal,
/*3264*/ DeityTunare,
/*3265*/ DeityVeeshan,
/*3250*/ DeityAgnostic = 396
};
//Guessed:
#define DEITY_BERTOX 201
#define DEITY_RODCET 212
#define DEITY_VEESHAN 216
/* on items:
*All 0
AGNOSTIC 1
BERTOX 2
BRELL 4
CAZIC 8
EROLLSI 16
BRISTLE 32
INNY 64
KARANA 128
MITH 256
PREXUS 512
QUELLIOUS 1024
RALLOS 2048
RODCET 4096
SOLUSEK 8192
TRIBUNAL 16384
TUNARE 32768
VEESHAN 65536
/*
** Deity type bits
**
** (New orphan, but make use of it!)
*/
enum DeityTypeBits : uint32
{
BIT_DeityAll = 0x00000000,
BIT_DeityAgnostic = 0x00000001,
BIT_DeityBertoxxulous = 0x00000002,
BIT_DeityBrellSirilis = 0x00000004,
BIT_DeityCazicThule = 0x00000008,
BIT_DeityErollisiMarr = 0x00000010,
BIT_DeityBristlebane = 0x00000020,
BIT_DeityInnoruuk = 0x00000040,
BIT_DeityKarana = 0x00000080,
BIT_DeityMithanielMarr = 0x00000100,
BIT_DeityPrexus = 0x00000200,
BIT_DeityQuellious = 0x00000400,
BIT_DeityRallosZek = 0x00000800,
BIT_DeityRodcetNife = 0x00001000,
BIT_DeitySolusekRo = 0x00002000,
BIT_DeityTheTribunal = 0x00004000,
BIT_DeityTunare = 0x00008000,
BIT_DeityVeeshan = 0x00010000
};
static DeityTypeBits ConvertDeityToBitDeity(DeityTypes deity)
{
switch(deity)
{
case DeityBertoxxulous: { return BIT_DeityBertoxxulous; }
case DeityBrellSirilis: { return BIT_DeityBrellSirilis; }
case DeityCazicThule: { return BIT_DeityCazicThule; }
case DeityErollisiMarr: { return BIT_DeityErollisiMarr; }
case DeityBristlebane: { return BIT_DeityBristlebane; }
case DeityInnoruuk: { return BIT_DeityInnoruuk; }
case DeityKarana: { return BIT_DeityKarana; }
case DeityMithanielMarr: { return BIT_DeityMithanielMarr; }
case DeityPrexus: { return BIT_DeityPrexus; }
case DeityQuellious: { return BIT_DeityQuellious; }
case DeityRallosZek: { return BIT_DeityRallosZek; }
case DeityRodcetNife: { return BIT_DeityRodcetNife; }
case DeitySolusekRo: { return BIT_DeitySolusekRo; }
case DeityTheTribunal: { return BIT_DeityTheTribunal; }
case DeityTunare: { return BIT_DeityTunare; }
case DeityVeeshan: { return BIT_DeityVeeshan; }
case DeityAgnostic_LB:
case DeityAgnostic: { return BIT_DeityAgnostic; }
default: { break; }
};
return BIT_DeityAll;
};
static DeityTypes ConvertBitDeityToDeity(DeityTypeBits deity_bit)
{
switch(deity_bit)
{
case BIT_DeityAgnostic: { return DeityAgnostic; }
case BIT_DeityBertoxxulous: { return DeityBertoxxulous; }
case BIT_DeityBrellSirilis: { return DeityBrellSirilis; }
case BIT_DeityCazicThule: { return DeityCazicThule; }
case BIT_DeityErollisiMarr: { return DeityErollisiMarr; }
case BIT_DeityBristlebane: { return DeityBristlebane; }
case BIT_DeityInnoruuk: { return DeityInnoruuk; }
case BIT_DeityKarana: { return DeityKarana; }
case BIT_DeityMithanielMarr: { return DeityMithanielMarr; }
case BIT_DeityPrexus: { return DeityPrexus; }
case BIT_DeityQuellious: { return DeityQuellious; }
case BIT_DeityRallosZek: { return DeityRallosZek; }
case BIT_DeityRodcetNife: { return DeityRodcetNife; }
case BIT_DeitySolusekRo: { return DeitySolusekRo; }
case BIT_DeityTheTribunal: { return DeityTheTribunal; }
case BIT_DeityTunare: { return DeityTunare; }
case BIT_DeityVeeshan: { return DeityVeeshan; }
default: { break; }
};
return DeityUnknown;
};
static std::string GetDeityName(DeityTypes deity)
{
switch(deity)
{
case DeityBertoxxulous: { return "Bertoxxulous"; }
case DeityBrellSirilis: { return "Brell Serilis"; }
case DeityCazicThule: { return "Cazic-Thule"; }
case DeityErollisiMarr: { return "Erollisi Marr"; }
case DeityBristlebane: { return "Bristlebane"; }
case DeityInnoruuk: { return "Innoruuk"; }
case DeityKarana: { return "Karana"; }
case DeityMithanielMarr: { return "Mithaniel Marr"; }
case DeityPrexus: { return "Prexus"; }
case DeityQuellious: { return "Quellious"; }
case DeityRallosZek: { return "Rallos Zek"; }
case DeityRodcetNife: { return "Rodcet Nife"; }
case DeitySolusekRo: { return "Solusek Ro"; }
case DeityTheTribunal: { return "The Tribunal"; }
case DeityTunare: { return "Tunare"; }
case DeityVeeshan: { return "Veeshan"; }
case DeityAgnostic_LB:
case DeityAgnostic: { return "Agnostic"; }
default: { break; }
};
return "Unknown";
};
#endif
-2
View File
@@ -49,5 +49,3 @@ extern const char *OpcodeNames[_maxEmuOpcode+1];
#endif
+3
View File
@@ -538,3 +538,6 @@ N(OP_MercenaryDismiss),
N(OP_MercenaryTimerRequest),
N(OP_OpenInventory),
N(OP_OpenContainer),
N(OP_Marquee),
N(OP_ClientTimeStamp),
N(OP_GuildPromote),
@@ -17,43 +17,21 @@
*/
/*
*
*
*
*
* There are really two or three different objects shoe-hored into this
* connection object. Sombody really needs to factor out the relay link
* crap into its own subclass of this object, it will clean things up
* tremendously.
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
There are really two or three different objects shoe-hored into this
connection object. Sombody really needs to factor out the relay link
crap into its own subclass of this object, it will clean things up
tremendously.
*/
#include "../common/debug.h"
#include <iostream>
using namespace std;
#include <string.h>
#include <stdio.h>
#include <iomanip>
using namespace std;
#include "EmuTCPConnection.h"
#include "EmuTCPServer.h"
#include "emu_tcp_connection.h"
#include "emu_tcp_server.h"
#include "../common/servertalk.h"
#include "../common/packet_dump.h"
@@ -76,7 +54,7 @@ EmuTCPConnection::EmuTCPConnection(uint32 ID, EmuTCPServer* iServer, SOCKET in_s
timeout_timer(SERVER_TIMEOUT * 2)
{
id = 0;
Server = NULL;
Server = nullptr;
pOldFormat = iOldFormat;
#ifdef MINILOGIN
TCPMode = modePacket;
@@ -113,7 +91,7 @@ EmuTCPConnection::EmuTCPConnection(bool iOldFormat, EmuTCPServer* iRelayServer,
TCPMode = iMode;
PacketMode = packetModeZone;
#if TCPN_DEBUG_Memory >= 7
cout << "Constructor #1 on outgoing TCP# " << GetID() << endl;
std::cout << "Constructor #1 on outgoing TCP# " << GetID() << std::endl;
#endif
}
@@ -128,14 +106,12 @@ EmuTCPConnection::EmuTCPConnection(uint32 ID, EmuTCPServer* iServer, EmuTCPConne
RelayServer = true;
RelayCount = 0;
RemoteID = iRemoteID;
if (!RemoteID)
ThrowError("Error: TCPConnection: RemoteID == 0 on RelayLink constructor");
pOldFormat = false;
ConnectionType = Incomming;
TCPMode = modePacket;
PacketMode = packetModeZone;
#if TCPN_DEBUG_Memory >= 7
cout << "Constructor #3 on outgoing TCP# " << GetID() << endl;
std::cout << "Constructor #3 on outgoing TCP# " << GetID() << std::endl;
#endif
}
@@ -143,7 +119,6 @@ EmuTCPConnection::~EmuTCPConnection() {
//the queues free their content right now I believe.
}
EmuTCPNetPacket_Struct* EmuTCPConnection::MakePacket(ServerPacket* pack, uint32 iDestination) {
int32 size = sizeof(EmuTCPNetPacket_Struct) + pack->size;
if (pack->compressed) {
@@ -196,7 +171,7 @@ bool EmuTCPConnection::SendPacket(ServerPacket* pack, uint32 iDestination) {
struct in_addr in;
in.s_addr = GetrIP();
CoutTimestamp(true);
cout << ": Logging outgoing TCP OldPacket. OPCode: 0x" << hex << setw(4) << setfill('0') << pack->opcode << dec << ", size: " << setw(5) << setfill(' ') << pack->size << " " << inet_ntoa(in) << ":" << GetrPort() << endl;
std::cout << ": Logging outgoing TCP OldPacket. OPCode: 0x" << std::hex << std::setw(4) << std::setfill('0') << pack->opcode << std::dec << ", size: " << std::setw(5) << std::setfill(' ') << pack->size << " " << inet_ntoa(in) << ":" << GetrPort() << std::endl;
#if TCPN_LOG_PACKETS == 2
if (pack->size >= 32)
DumpPacket(pack->pBuffer, 32);
@@ -223,7 +198,7 @@ bool EmuTCPConnection::SendPacket(ServerPacket* pack, uint32 iDestination) {
struct in_addr in;
in.s_addr = GetrIP();
CoutTimestamp(true);
cout << ": Logging outgoing TCP packet. OPCode: 0x" << hex << setw(4) << setfill('0') << pack->opcode << dec << ", size: " << setw(5) << setfill(' ') << pack->size << " " << inet_ntoa(in) << ":" << GetrPort() << endl;
std::cout << ": Logging outgoing TCP packet. OPCode: 0x" << std::hex << std::setw(4) << std::setfill('0') << pack->opcode << std::dec << ", size: " << std::setw(5) << std::setfill(' ') << pack->size << " " << inet_ntoa(in) << ":" << GetrPort() << std::endl;
#if TCPN_LOG_PACKETS == 2
if (pack->size >= 32)
DumpPacket(pack->pBuffer, 32);
@@ -262,10 +237,10 @@ bool EmuTCPConnection::SendPacket(EmuTCPNetPacket_Struct* tnps) {
struct in_addr in;
in.s_addr = GetrIP();
CoutTimestamp(true);
cout << ": Logging outgoing TCP NetPacket. OPCode: 0x" << hex << setw(4) << setfill('0') << tnps->opcode << dec << ", size: " << setw(5) << setfill(' ') << tnps->size << " " << inet_ntoa(in) << ":" << GetrPort();
std::cout << ": Logging outgoing TCP NetPacket. OPCode: 0x" << std::hex << std::setw(4) << std::setfill('0') << tnps->opcode << std::dec << ", size: " << std::setw(5) << std::setfill(' ') << tnps->size << " " << inet_ntoa(in) << ":" << GetrPort();
if (pOldFormat)
cout << " (OldFormat)";
cout << endl;
std::cout << " (OldFormat)";
std::cout << std::endl;
#if TCPN_LOG_PACKETS == 2
if (tnps->size >= 32)
DumpPacket((uchar*) tnps, 32);
@@ -284,7 +259,7 @@ bool EmuTCPConnection::SendPacket(EmuTCPNetPacket_Struct* tnps) {
ServerPacket* EmuTCPConnection::PopPacket() {
ServerPacket* ret;
if (!MOutQueueLock.trylock())
return NULL;
return nullptr;
ret = OutQueue.pop();
MOutQueueLock.unlock();
return ret;
@@ -307,7 +282,7 @@ bool EmuTCPConnection::LineOutQueuePush(char* line) {
#if defined(GOTFRAGS) && 0
if (strcmp(line, "**CRASHME**") == 0) {
int i = 0;
cout << (5 / i) << endl;
std::cout << (5 / i) << std::endl;
}
#endif
if(line[0] == '*') {
@@ -391,7 +366,6 @@ bool EmuTCPConnection::LineOutQueuePush(char* line) {
safe_delete_array(line);
return(true);
}
}
return(TCPConnection::LineOutQueuePush(line));
@@ -444,7 +418,8 @@ bool EmuTCPConnection::ConnectIP(uint32 irIP, uint16 irPort, char* errbuf) {
sendbuf_used = sendbuf_size;
sendbuf = new uchar[sendbuf_size];
memcpy(sendbuf, "\0**PACKETMODEQS**\r", sendbuf_size);
} else {
}
else {
//default: packetModeZone
safe_delete_array(sendbuf);
sendbuf_size = 20;
@@ -475,15 +450,14 @@ void EmuTCPConnection::ClearBuffers() {
timeout_timer.Start();
}
void EmuTCPConnection::SendNetErrorPacket(const char* reason) {
#if TCPC_DEBUG >= 1
struct in_addr in;
in.s_addr = GetrIP();
cout "NetError: '";
std::cout "NetError: '";
if (reason)
cout << reason;
cout << "': " << inet_ntoa(in) << ":" << GetPort() << endl;
std::cout << reason;
std::cout << "': " << inet_ntoa(in) << ":" << GetPort() << std::endl;
#endif
ServerPacket* pack = new ServerPacket(0);
pack->size = 1;
@@ -546,7 +520,7 @@ bool EmuTCPConnection::ProcessReceivedDataAsPackets(char* errbuf) {
size = tnps->size;
if (size >= MaxTCPReceiveBuffferSize) {
#if TCPN_DEBUG_Memory >= 1
cout << "TCPConnection[" << GetID() << "]::ProcessReceivedDataAsPackets(): size[" << size << "] >= MaxTCPReceiveBuffferSize" << endl;
std::cout << "TCPConnection[" << GetID() << "]::ProcessReceivedDataAsPackets(): size[" << size << "] >= MaxTCPReceiveBuffferSize" << std::endl;
DumpPacket(&recvbuf[base], 16);
#endif
if (errbuf)
@@ -586,13 +560,13 @@ bool EmuTCPConnection::ProcessReceivedDataAsPackets(char* errbuf) {
if (pack->opcode == 0) {
if (pack->size) {
#if TCPN_DEBUG >= 2
cout << "Received TCP Network layer packet" << endl;
std::cout << "Received TCP Network layer packet" << std::endl;
#endif
ProcessNetworkLayerPacket(pack);
}
#if TCPN_DEBUG >= 5
else {
cout << "Received TCP keepalive packet. (opcode=0)" << endl;
std::cout << "Received TCP keepalive packet. (opcode=0)" << std::endl;
}
#endif
// keepalive, no need to process
@@ -604,7 +578,7 @@ bool EmuTCPConnection::ProcessReceivedDataAsPackets(char* errbuf) {
struct in_addr in;
in.s_addr = GetrIP();
CoutTimestamp(true);
cout << ": Logging incoming TCP packet. OPCode: 0x" << hex << setw(4) << setfill('0') << pack->opcode << dec << ", size: " << setw(5) << setfill(' ') << pack->size << " " << inet_ntoa(in) << ":" << GetrPort() << endl;
std::cout << ": Logging incoming TCP packet. OPCode: 0x" << std::hex << std::setw(4) << std::setfill('0') << pack->opcode << std::dec << ", size: " << std::setw(5) << std::setfill(' ') << pack->size << " " << inet_ntoa(in) << ":" << GetrPort() << std::endl;
#if TCPN_LOG_PACKETS == 2
if (pack->size >= 32)
DumpPacket(pack->pBuffer, 32);
@@ -620,7 +594,7 @@ bool EmuTCPConnection::ProcessReceivedDataAsPackets(char* errbuf) {
EmuTCPConnection* con = Server->FindConnection(pack->destination);
if (!con) {
#if TCPN_DEBUG >= 1
cout << "Error relaying packet: con = 0" << endl;
std::cout << "Error relaying packet: con = 0" << std::endl;
#endif
safe_delete(pack);
}
@@ -659,7 +633,7 @@ bool EmuTCPConnection::ProcessReceivedDataAsOldPackets(char* errbuf) {
memcpy(&size, &buffer[2], 2);
if (size >= MaxTCPReceiveBuffferSize) {
#if TCPN_DEBUG_Memory >= 1
cout << "TCPConnection[" << GetID() << "]::ProcessReceivedDataAsPackets(): size[" << size << "] >= MaxTCPReceiveBuffferSize" << endl;
std::cout << "TCPConnection[" << GetID() << "]::ProcessReceivedDataAsPackets(): size[" << size << "] >= MaxTCPReceiveBuffferSize" << std::endl;
#endif
if (errbuf)
snprintf(errbuf, TCPConnection_ErrorBufferSize, "EmuTCPConnection::ProcessReceivedDataAsPackets(): size >= MaxTCPReceiveBuffferSize");
@@ -689,7 +663,7 @@ bool EmuTCPConnection::ProcessReceivedDataAsOldPackets(char* errbuf) {
struct in_addr in;
in.s_addr = GetrIP();
CoutTimestamp(true);
cout << ": Logging incoming TCP OldPacket. OPCode: 0x" << hex << setw(4) << setfill('0') << pack->opcode << dec << ", size: " << setw(5) << setfill(' ') << pack->size << " " << inet_ntoa(in) << ":" << GetrPort() << endl;
std::cout << ": Logging incoming TCP OldPacket. OPCode: 0x" << std::hex << std::setw(4) << std::setfill('0') << pack->opcode << std::dec << ", size: " << std::setw(5) << std::setfill(' ') << pack->size << " " << inet_ntoa(in) << ":" << GetrPort() << std::endl;
#if TCPN_LOG_PACKETS == 2
if (pack->size >= 32)
DumpPacket(pack->pBuffer, 32);
@@ -750,7 +724,7 @@ void EmuTCPConnection::ProcessNetworkLayerPacket(ServerPacket* pack) {
#if TCPC_DEBUG >= 3
struct in_addr in;
in.s_addr = GetrIP();
cout << "Switching to RelayServer mode: " << inet_ntoa(in) << ":" << GetPort() << endl;
std::cout << "Switching to RelayServer mode: " << inet_ntoa(in) << ":" << GetPort() << std::endl;
#endif
RelayServer = true;
break;
@@ -798,10 +772,10 @@ void EmuTCPConnection::ProcessNetworkLayerPacket(ServerPacket* pack) {
#if TCPC_DEBUG >= 1
struct in_addr in;
in.s_addr = GetrIP();
cout "Received NetError: '";
std::cout "Received NetError: '";
if (pack->size > 1)
cout << (char*) data;
cout << "': " << inet_ntoa(in) << ":" << GetPort() << endl;
std::cout << (char*) data;
std::cout << "': " << inet_ntoa(in) << ":" << GetPort() << std::endl;
#endif
break;
}
@@ -820,7 +794,7 @@ bool EmuTCPConnection::SendData(bool &sent_something, char* errbuf) {
SendPacket(pack);
safe_delete(pack);
#if TCPN_DEBUG >= 5
cout << "Sending TCP keepalive packet. (timeout=" << timeout_timer.GetRemainingTime() << " remaining)" << endl;
std::cout << "Sending TCP keepalive packet. (timeout=" << timeout_timer.GetRemainingTime() << " remaining)" << std::endl;
#endif
}
@@ -844,14 +818,3 @@ bool EmuTCPConnection::RecvData(char* errbuf) {
return(true);
}
@@ -1,7 +1,7 @@
#ifndef EmuTCPCONNECTION_H_
#define EmuTCPCONNECTION_H_
#include "TCPConnection.h"
#include "tcp_connection.h"
#include "timer.h"
//moved out of TCPConnection:: to be more exportable
@@ -1,10 +1,6 @@
#include "debug.h"
#include "EmuTCPServer.h"
#include "EmuTCPConnection.h"
#include "emu_tcp_server.h"
#include "emu_tcp_connection.h"
EmuTCPServer::EmuTCPServer(uint16 iPort, bool iOldFormat)
: TCPServer<EmuTCPConnection>(iPort),
@@ -42,7 +38,7 @@ void EmuTCPServer::SendPacket(EmuTCPNetPacket_Struct** tnps) {
MInQueue.lock();
m_InQueue.push(*tnps);
MInQueue.unlock();
tnps = NULL;
tnps = nullptr;
}
void EmuTCPServer::CheckInQueue() {
@@ -61,7 +57,7 @@ void EmuTCPServer::CheckInQueue() {
}
EmuTCPNetPacket_Struct* EmuTCPServer::InQueuePop() {
EmuTCPNetPacket_Struct* ret = NULL;
EmuTCPNetPacket_Struct* ret = nullptr;
MInQueue.lock();
if(!m_InQueue.empty()) {
ret = m_InQueue.front();
@@ -80,17 +76,6 @@ EmuTCPConnection *EmuTCPServer::FindConnection(uint32 iID) {
if ((*cur)->GetID() == iID)
return *cur;
}
return(NULL);
return(nullptr);
}
@@ -1,7 +1,7 @@
#ifndef EmuTCPSERVER_H_
#define EmuTCPSERVER_H_
#include "TCPServer.h"
#include "tcp_server.h"
class EmuTCPConnection;
struct EmuTCPNetPacket_Struct;
@@ -20,7 +20,7 @@ public:
EmuTCPConnection *FindConnection(uint32 iID);
//exposed for some crap we pull. Do not call from outside this object.
TCPServer<EmuTCPConnection>::AddConnection;
using TCPServer<EmuTCPConnection>::AddConnection;
protected:
virtual void Process();
+566 -255
View File
@@ -23,95 +23,309 @@
/*
** Item attributes
**
** (There are no grepwin hits other than these declarations... Do they have a use?)
*/
enum ItemAttrib
enum ItemAttributes : uint32
{
ItemAttribLore = (1 << 0),
ItemAttribArtifact = (1 << 1),
ItemAttribSummoned = (1 << 2),
ItemAttribMagic = (1 << 3),
ItemAttribAugment = (1 << 4),
ItemAttribPendingLore = (1 << 5),
ItemAttribNone = 0,
ItemAttribUnknown = 0xFFFFFFFF
ItemAttrNone = 0x00000000,
ItemAttrLore = 0x00000001,
ItemAttrArtifact = 0x00000002,
ItemAttrSummoned = 0x00000004,
ItemAttrMagic = 0x00000008,
ItemAttrAugment = 0x00000010,
ItemAttrPendingLore = 0x00000020,
ItemAttrUnknown = 0xFFFFFFFF
};
/*
** Item types
** Item class types
**
*/
enum ItemClass
enum ItemClassTypes
{
ItemClassCommon = 0,
ItemClassContainer = 1,
ItemClassBook = 2
ItemClassContainer,
ItemClassBook,
_ItemClassCount
};
/*
** Item uses
** Item use types
**
** (ref: database and eqstr_us.txt)
**
** (Looking at a recent database, it's possible that some of the item values may be off [10-27-2013] -U)
*/
enum ItemUseTypes : uint8
{
/*9138*/ ItemType1HSlash = 0,
/*9141*/ ItemType2HSlash,
/*9140*/ ItemType1HPiercing,
/*9139*/ ItemType1HBlunt,
/*9142*/ ItemType2HBlunt,
/*5504*/ ItemTypeBow,
/*----*/ ItemTypeUnknown1,
/*----*/ ItemTypeLargeThrowing,
/*5505*/ ItemTypeShield,
/*5506*/ ItemTypeScroll,
/*5507*/ ItemTypeArmor,
/*5508*/ ItemTypeMisc, // a lot of random crap has this item use.
/*7564*/ ItemTypeLockPick,
/*----*/ ItemTypeUnknown2,
/*5509*/ ItemTypeFood,
/*5510*/ ItemTypeDrink,
/*5511*/ ItemTypeLight,
/*5512*/ ItemTypeCombinable, // not all stackable items are this use...
/*5513*/ ItemTypeBandage,
/*----*/ ItemTypeSmallThrowing,
/*----*/ ItemTypeSpell, // spells and tomes
/*5514*/ ItemTypePotion,
/*----*/ ItemTypeUnknown3,
/*0406*/ ItemTypeWindInstrument,
/*0407*/ ItemTypeStringedInstrument,
/*0408*/ ItemTypeBrassInstrument,
/*0405*/ ItemTypePercussionInstrument,
/*5515*/ ItemTypeArrow,
/*----*/ ItemTypeUnknown4,
/*5521*/ ItemTypeJewelry,
/*----*/ ItemTypeSkull,
/*5516*/ ItemTypeBook, // skill-up tomes/books? (would probably need a pp flag if true...)
/*5517*/ ItemTypeNote,
/*5518*/ ItemTypeKey,
/*----*/ ItemTypeCoin,
/*5520*/ ItemType2HPiercing,
/*----*/ ItemTypeFishingPole,
/*----*/ ItemTypeFishingBait,
/*5519*/ ItemTypeAlcohol,
/*----*/ ItemTypeKey2, // keys and satchels?? (questable keys?)
/*----*/ ItemTypeCompass,
/*----*/ ItemTypeUnknown5,
/*----*/ ItemTypePoison, // might be wrong, but includes poisons
/*----*/ ItemTypeUnknown6,
/*----*/ ItemTypeUnknown7,
/*5522*/ ItemTypeMartial,
/*----*/ ItemTypeUnknown8,
/*----*/ ItemTypeUnknown9,
/*----*/ ItemTypeUnknown10,
/*----*/ ItemTypeUnknown11,
/*----*/ ItemTypeSinging,
/*5750*/ ItemTypeAllInstrumentTypes,
/*5776*/ ItemTypeCharm,
/*----*/ ItemTypeDye,
/*----*/ ItemTypeAugmentation,
/*----*/ ItemTypeAugmentationSolvent,
/*----*/ ItemTypeAugmentationDistiller,
/*----*/ ItemTypeUnknown12,
/*----*/ ItemTypeFellowshipKit,
/*----*/ ItemTypeUnknown13,
/*----*/ ItemTypeRecipe,
/*----*/ ItemTypeAdvancedRecipe,
/*----*/ ItemTypeJournal, // only one(1) database entry
/*----*/ ItemTypeAltCurrency, // alt-currency (as opposed to coinage)
/*5881*/ ItemTypePerfectedAugmentationDistiller,
/*----*/ _ItemTypeCount
/*
Unknowns:
Mounts?
Ornamentations?
GuildBanners?
Collectible?
Placeable?
(others?)
*/
};
/*
** Augmentation use type bitmasks (1-based)
**
** (ref: dbstr_us.txt)
**
*/
enum ItemTypes
{
ItemType1HS = 0,
ItemType2HS = 1,
ItemTypePierce = 2,
ItemType1HB = 3,
ItemType2HB = 4,
ItemTypeBow = 5,
//6
ItemTypeThrowing = 7,
ItemTypeShield = 8,
//9
ItemTypeArmor = 10,
ItemTypeUnknon = 11, //A lot of random crap has this item use.
ItemTypeLockPick = 12,
ItemTypeFood = 14,
ItemTypeDrink = 15,
ItemTypeLightSource = 16,
ItemTypeStackable = 17, //Not all stackable items are this use...
ItemTypeBandage = 18,
ItemTypeThrowingv2 = 19,
ItemTypeSpell = 20, //spells and tomes
ItemTypePotion = 21,
ItemTypeWindInstr = 23,
ItemTypeStringInstr = 24,
ItemTypeBrassInstr = 25,
ItemTypeDrumInstr = 26,
ItemTypeArrow = 27,
ItemTypeJewlery = 29,
ItemTypeSkull = 30,
ItemTypeTome = 31,
ItemTypeNote = 32,
ItemTypeKey = 33,
ItemTypeCoin = 34,
ItemType2HPierce = 35,
ItemTypeFishingPole = 36,
ItemTypeFishingBait = 37,
ItemTypeAlcohol = 38,
ItemTypeCompass = 40,
ItemTypePoison = 42, //might be wrong, but includes poisons
ItemTypeHand2Hand = 45,
ItemUseSinging = 50,
ItemUseAllInstruments = 51,
ItemTypeCharm = 52,
ItemTypeAugment = 54,
ItemTypeAugmentSolvent = 55,
ItemTypeAugmentDistill = 56
enum AugmentationUseTypeBitmasks : uint32 {
AugUseNone = 0x00000000,
AugUseGeneralSingleStat = 0x00000001, /*1^16^1 (General: Single Stat)^0*/
AugUseGeneralMultipleStat = 0x00000002, /*2^16^2 (General: Multiple Stat)^0*/
AugUseGeneralSpellEffect = 0x00000004, /*3^16^3 (General: Spell Effect)^0*/
AugUseWeaponGeneral = 0x00000008, /*4^16^4 (Weapon: General)^0*/
AugUseWeaponElemDamage = 0x00000010, /*5^16^5 (Weapon: Elem Damage)^0*/
AugUseWeaponBaseDamage = 0x00000020, /*6^16^6 (Weapon: Base Damage)^0*/
AugUseGeneralGroup = 0x00000040, /*7^16^7 (General: Group)^0*/
AugUseGeneralRaid = 0x00000080, /*8^16^8 (General: Raid)^0*/
AugUseGeneralDragonsPoints = 0x00000100, /*9^16^9 (General: Dragons Points)^0*/
AugUseCraftedCommon = 0x00000200, /*10^16^10 (Crafted: Common)^0*/
AugUseCraftedGroup1 = 0x00000400, /*11^16^11 (Crafted: Group)^0*/
AugUseCraftedRaid1 = 0x00000800, /*12^16^12 (Crafted: Raid)^0*/
AugUseEnergeiacGroup = 0x00001000, /*13^16^13 (Energeiac: Group)^0*/
AugUseEnergeiacRaid = 0x00002000, /*14^16^14 (Energeiac: Raid)^0*/
AugUseEmblem = 0x00004000, /*15^16^15 (Emblem)^0*/
AugUseCraftedGroup2 = 0x00008000, /*16^16^16 (Crafted: Group)^0*/
AugUseCraftedRaid2 = 0x00010000, /*17^16^17 (Crafted: Raid)^0*/
AugUseUnknown1 = 0x00020000, /*18^16^18^0*/
AugUseUnknown2 = 0x00040000, /*19^16^19^0*/
AugUseOrnamentation = 0x00080000, /*20^16^20 (Ornamentation)^0*/
AugUseSpecialOrnamentation = 0x00100000, /*21^16^21 (Special Ornamentation)^0*/
AugUseUnknown3 = 0x00200000, /*22^16^22^0*/
AugUseUnknown4 = 0x00400000, /*23^16^23^0*/
AugUseUnknown5 = 0x00800000, /*24^16^24^0*/
AugUseUnknown6 = 0x01000000, /*25^16^25^0*/
AugUseUnknown7 = 0x02000000, /*26^16^26^0*/
AugUseUnknown8 = 0x04000000, /*27^16^27^0*/
AugUseUnknown9 = 0x08000000, /*28^16^28^0*/
AugUseUnknown10 = 0x10000000, /*29^16^29^0*/
AugUseEpic25 = 0x20000000, /*30^16^30^0*/
AugUseTest = 0x40000000, /*31^16^Test^0*/ // listed as 31^16^31^0 in 5-10 client
AugUseAll = 0xFFFFFFFF
};
/*
Bag types
** Augmentation use types (enumerated)
**
*/
enum {
bagTypeSmallBag = 0,
bagTypeLargeBag = 1,
bagTypeQuiver = 2,
bagTypeBeltPouch = 3,
bagTypeBandolier = 8
//... there are 50 types
enum AugmentationUseTypes : uint8 {
AugTypeNone = 0,
AugTypeGeneralSingleStat,
AugTypeGeneralMultipleStat,
AugTypeGeneralSpellEffect,
AugTypeWeaponGeneral,
AugTypeWeaponElemDamage,
AugTypeWeaponBaseDamage,
AugTypeGeneralGroup,
AugTypeGeneralRaid,
AugTypeGeneralDragonsPoints,
AugTypeCraftedCommon,
AugTypeCraftedGroup1,
AugTypeCraftedRaid1,
AugTypeEnergeiacGroup,
AugTypeEnergeiacRaid,
AugTypeEmblem,
AugTypeCraftedGroup2,
AugTypeCraftedRaid2,
AugTypeUnknown1,
AugTypeUnknown2,
AugTypeOrnamentation,
AugTypeSpecialOrnamentation,
AugTypeUnknown3,
AugTypeUnknown4,
AugTypeUnknown5,
AugTypeUnknown6,
AugTypeUnknown7,
AugTypeUnknown8,
AugTypeUnknown9,
AugTypeUnknown10,
AugTypeEpic25,
AugTypeTest,
_AugTypeCount,
AugTypeAll = 255
};
/*
** Augmentation restriction types (in-work)
**
** (ref: eqstr_us.txt)
**
*/
enum AugmentationRestrictionTypes : uint8 {
/*4690*/ AugRestrAny = 0,
/*9134*/ AugRestrArmor,
/*9135*/ AugRestrWeapons,
/*9136*/ AugRestr1HWeapons,
/*9137*/ AugRestr2HWeapons,
/*9138*/ AugRestr1HSlash,
/*9139*/ AugRestr1HBlunt,
/*9140*/ AugRestrPiercing,
/*9148*/ AugRestrHandToHand,
/*9141*/ AugRestr2HSlash,
/*9142*/ AugRestr2HBlunt,
/*9143*/ AugRestr2HPierce,
/*9144*/ AugRestrBows,
/*9145*/ AugRestrShields,
/*8052*/ AugRestr1HSlash1HBluntOrHandToHand,
/*9200*/ AugRestr1HBluntOrHandToHand, // no listed peq entries
// these three appear to be post-RoF (12-10-2012) and can not be verified until RoF (05-10-2013) is supported
/*????*/ AugRestrUnknown1,
/*????*/ AugRestrUnknown2,
/*????*/ AugRestrUnknown3, // last value in peq entries
_AugRestrCount
/*4687*/ //AugTypeAllItems, // ?? unknown atm
/*4688*/ //AugTypePrestige, // ?? unknown atm
/*4689*/ //AugTypeNonPrestige, // ?? unknown atm
};
/*
** Container use types
**
** This correlates to world 'object.type' (object.h/Object.cpp) as well as Item_Struct.BagType
**
** (ref: database, web forums and eqstr_us.txt)
*/
enum ContainerUseTypes : uint8
{
/*3400*/ BagTypeSmallBag = 0,
/*3401*/ BagTypeLargeBag,
/*3402*/ BagTypeQuiver,
/*3403*/ BagTypeBeltPouch,
/*3404*/ BagTypeWristPouch,
/*3405*/ BagTypeBackPack,
/*3406*/ BagTypeSmallChest,
/*3407*/ BagTypeLargeChest,
/*----*/ BagTypeBandolier, // <*Database Reference Only>
/*3408*/ BagTypeMedicineBag,
/*3409*/ BagTypeToolBox,
/*3410*/ BagTypeLexicon,
/*3411*/ BagTypeMortar,
/*3412*/ BagTypeSelfDusting, // Quest container (Auto-clear contents?)
/*3413*/ BagTypeMixingBowl,
/*3414*/ BagTypeOven,
/*3415*/ BagTypeSewingKit,
/*3416*/ BagTypeForge,
/*3417*/ BagTypeFletchingKit,
/*3418*/ BagTypeBrewBarrel,
/*3419*/ BagTypeJewelersKit,
/*3420*/ BagTypePotteryWheel,
/*3421*/ BagTypeKiln,
/*3422*/ BagTypeKeymaker, // (no database entries as of peq rev 69)
/*3423*/ BagTypeWizardsLexicon,
/*3424*/ BagTypeMagesLexicon,
/*3425*/ BagTypeNecromancersLexicon,
/*3426*/ BagTypeEnchantersLexicon,
/*----*/ BagTypeUnknown1, // (a coin pouch/purse?) (no database entries as of peq rev 69)
/*----*/ BagTypeConcordanceofResearch, // <*Database Reference Only>
/*3427*/ BagTypeAlwaysWorks, // Quest container (Never-fail combines?)
/*3428*/ BagTypeKoadaDalForge, // High Elf
/*3429*/ BagTypeTeirDalForge, // Dark Elf
/*3430*/ BagTypeOggokForge, // Ogre
/*3431*/ BagTypeStormguardForge, // Dwarf
/*3432*/ BagTypeAkanonForge, // Gnome
/*3433*/ BagTypeNorthmanForge, // Barbarian
/*----*/ BagTypeUnknown2, // (no database entries as of peq rev 69)
/*3434*/ BagTypeCabilisForge, // Iksar
/*3435*/ BagTypeFreeportForge, // Human 1
/*3436*/ BagTypeRoyalQeynosForge, // Human 2
/*3439*/ BagTypeHalflingTailoringKit,
/*3438*/ BagTypeErudTailoringKit,
/*3440*/ BagTypeFierDalTailoringKit, // Wood Elf
/*3441*/ BagTypeFierDalFletchingKit, // Wood Elf
/*3437*/ BagTypeIksarPotteryWheel,
/*3442*/ BagTypeTackleBox,
/*3443*/ BagTypeTrollForge,
/*3445*/ BagTypeFierDalForge, // Wood Elf
/*3444*/ BagTypeValeForge, // Halfling
/*3446*/ BagTypeErudForge,
/*----*/ BagTypeTradersSatchel, // <*Database Reference Only> (db: Yellow Trader's Satchel Token?)
/*5785*/ BagTypeGuktaForge, // Froglok (no database entries as of peq rev 69)
/*3359*/ BagTypeAugmentationSealer,
/*----*/ BagTypeIceCreamChurn, // <*Database Reference Only>
/*6325*/ BagTypeTransformationmold, // Ornamentation
/*6340*/ BagTypeDetransformationmold, // Ornamentation Stripper
/*5400*/ BagTypeUnattuner,
/*7684*/ BagTypeTradeskillBag,
/*7692*/ BagTypeCollectibleBag,
/*----*/ _BagTypeCount
};
/*
** Item Effect Types
@@ -170,30 +384,6 @@ typedef enum {
_eaMaxAppearance
} EmuAppearance;
/*
** Diety List
*/
#define DEITY_UNKNOWN 0
#define DEITY_AGNOSTIC 396
#define DEITY_BRELL 202
#define DEITY_CAZIC 203
#define DEITY_EROL 204
#define DEITY_BRISTLE 205
#define DEITY_INNY 206
#define DEITY_KARANA 207
#define DEITY_MITH 208
#define DEITY_PREXUS 209
#define DEITY_QUELLIOUS 210
#define DEITY_RALLOS 211
#define DEITY_SOLUSEK 213
#define DEITY_TRIBUNAL 214
#define DEITY_TUNARE 215
//Guessed:
#define DEITY_BERT 201
#define DEITY_RODCET 212
#define DEITY_VEESHAN 216
// msg_type's for custom usercolors
#define MT_Say 256
#define MT_Tell 257
@@ -435,31 +625,34 @@ typedef enum {
#define STAT_HASTE 19
#define STAT_DAMAGE_SHIELD 20
/**
* Recast timer types. Used as an off set to charProfileStruct timers.
/*
** Recast timer types. Used as an off set to charProfileStruct timers.
**
** (Another orphaned enumeration...)
*/
enum RecastTypes
enum RecastTimerTypes
{
RecastTimer0 = 0,
RecastTimer1,
WeaponHealClickTimer, // 2
MuramiteBaneNukeClickTimer, // 3
RecastTimer4,
DispellClickTimer, // 5 (also click heal orbs?)
EpicTimer, // 6
OoWBPClickTimer, // 7
VishQuestClassItemTimer, // 8
HealPotionTimer, // 9
RecastTimer10,
RecastTimer11,
RecastTimer12,
RecastTimer13,
RecastTimer14,
RecastTimer15,
RecastTimer16,
RecastTimer17,
RecastTimer18,
ModRodTimer // 19
RecTimer_0 = 0,
RecTimer_1,
RecTimer_WeaponHealClick, // 2
RecTimer_MuramiteBaneNukeClick, // 3
RecTimer_4,
RecTimer_DispellClick, // 5 (also click heal orbs?)
RecTimer_Epic, // 6
RecTimer_OoWBPClick, // 7
RecTimer_VishQuestClassItem, // 8
RecTimer_HealPotion, // 9
RecTimer_10,
RecTimer_11,
RecTimer_12,
RecTimer_13,
RecTimer_14,
RecTimer_15,
RecTimer_16,
RecTimer_17,
RecTimer_18,
RecTimer_ModRod, // 19
_RecTimerCount
};
enum GroupUpdateAction
@@ -472,128 +665,233 @@ typedef enum {
GUA_Started = 9
};
//0x1c is something...
static const uint8 FallingDamageType = 0xFC;
static const uint8 SpellDamageType = 0xe7;
static const uint8 DamageTypeSomething = 0x1C; //0x1c is something...
static const uint8 DamageTypeFalling = 0xFC;
static const uint8 DamageTypeSpell = 0xE7;
static const uint8 DamageTypeUnknown = 0xFF;
//indexed by 'SkillType'
static const uint8 SkillDamageTypes[HIGHEST_SKILL+1] = {
/* _1H_BLUNT */ 0,
/* _1H_SLASHING */ 1,
/* _2H_BLUNT */ 0,
/* _2H_SLASHING */ 1,
/* ABJURE */ SpellDamageType,
/* ALTERATION */ SpellDamageType,
/* APPLY_POISON */ DamageTypeUnknown,
/* ARCHERY */ 7,
/* BACKSTAB */ 8,
/* BIND_WOUND */ DamageTypeUnknown,
/* BASH */ 10,
/* BLOCKSKILL */ DamageTypeUnknown,
/* BRASS_INSTRUMENTS */ SpellDamageType,
/* CHANNELING */ DamageTypeUnknown,
/* CONJURATION */ SpellDamageType,
/* DEFENSE */ DamageTypeUnknown,
/* DISARM */ DamageTypeUnknown,
/* DISARM_TRAPS */ DamageTypeUnknown,
/* DIVINATION */ SpellDamageType,
/* DODGE */ DamageTypeUnknown,
/* DOUBLE_ATTACK */ DamageTypeUnknown,
/* DRAGON_PUNCH */ 21,
/* DUAL_WIELD */ DamageTypeUnknown,
/* EAGLE_STRIKE */ 23,
/* EVOCATION */ SpellDamageType,
/* FEIGN_DEATH */ 4,
/* FLYING_KICK */ 30,
/* FORAGE */ DamageTypeUnknown,
/* HAND_TO_HAND */ 4,
/* HIDE */ DamageTypeUnknown,
/* KICK */ 30,
/* MEDITATE */ DamageTypeUnknown,
/* MEND */ DamageTypeUnknown,
/* OFFENSE */ DamageTypeUnknown,
/* PARRY */ DamageTypeUnknown,
/* PICK_LOCK */ DamageTypeUnknown,
/* PIERCING */ 36,
/* RIPOSTE */ DamageTypeUnknown,
/* ROUND_KICK */ 30,
/* SAFE_FALL */ DamageTypeUnknown,
/* SENSE_HEADING */ DamageTypeUnknown,
/* SINGING */ SpellDamageType,
/* SNEAK */ DamageTypeUnknown,
/* SPECIALIZE_ABJURE */ DamageTypeUnknown,
/* SPECIALIZE_ALTERATION */ DamageTypeUnknown,
/* SPECIALIZE_CONJURATION */ DamageTypeUnknown,
/* SPECIALIZE_DIVINATION */ DamageTypeUnknown,
/* SPECIALIZE_EVOCATION */ DamageTypeUnknown,
/* PICK_POCKETS */ DamageTypeUnknown,
/* STRINGED_INSTRUMENTS */ SpellDamageType,
/* SWIMMING */ DamageTypeUnknown,
/* THROWING */ 51,
/* TIGER_CLAW */ 23,
/* TRACKING */ DamageTypeUnknown,
/* WIND_INSTRUMENTS */ SpellDamageType,
/* FISHING */ DamageTypeUnknown,
/* MAKE_POISON */ DamageTypeUnknown,
/* TINKERING */ DamageTypeUnknown,
/* RESEARCH */ DamageTypeUnknown,
/* ALCHEMY */ DamageTypeUnknown,
/* BAKING */ DamageTypeUnknown,
/* TAILORING */ DamageTypeUnknown,
/* SENSE_TRAPS */ DamageTypeUnknown,
/* BLACKSMITHING */ DamageTypeUnknown,
/* FLETCHING */ DamageTypeUnknown,
/* BREWING */ DamageTypeUnknown,
/* ALCOHOL_TOLERANCE */ DamageTypeUnknown,
/* BEGGING */ DamageTypeUnknown,
/* JEWELRY_MAKING */ DamageTypeUnknown,
/* POTTERY */ DamageTypeUnknown,
/* PERCUSSION_INSTRUMENTS */ SpellDamageType,
/* INTIMIDATION */ DamageTypeUnknown,
/* BERSERKING */ DamageTypeUnknown,
/* TAUNT */ DamageTypeUnknown,
/* FRENZY */ 74
/*
** Skill damage types
**
** (indexed by 'Skill' of SkillUseTypes)
*/
static const uint8 SkillDamageTypes[HIGHEST_SKILL + 1] = // change to _SkillServerArraySize once activated
{
/*1HBlunt*/ 0,
/*1HSlashing*/ 1,
/*2HBlunt*/ 0,
/*2HSlashing*/ 1,
/*Abjuration*/ DamageTypeSpell,
/*Alteration*/ DamageTypeSpell,
/*ApplyPoison*/ DamageTypeUnknown,
/*Archery*/ 7,
/*Backstab*/ 8,
/*BindWound*/ DamageTypeUnknown,
/*Bash*/ 10,
/*Block*/ DamageTypeUnknown,
/*BrassInstruments*/ DamageTypeSpell,
/*Channeling*/ DamageTypeUnknown,
/*Conjuration*/ DamageTypeSpell,
/*Defense*/ DamageTypeUnknown,
/*Disarm*/ DamageTypeUnknown,
/*DisarmTraps*/ DamageTypeUnknown,
/*Divination*/ DamageTypeSpell,
/*Dodge*/ DamageTypeUnknown,
/*DoubleAttack*/ DamageTypeUnknown,
/*DragonPunch*/ 21,
/*DualWield*/ DamageTypeUnknown,
/*EagleStrike*/ 23,
/*Evocation*/ DamageTypeSpell,
/*FeignDeath*/ 4,
/*FlyingKick*/ 30,
/*Forage*/ DamageTypeUnknown,
/*HandtoHand*/ 4,
/*Hide*/ DamageTypeUnknown,
/*Kick*/ 30,
/*Meditate*/ DamageTypeUnknown,
/*Mend*/ DamageTypeUnknown,
/*Offense*/ DamageTypeUnknown,
/*Parry*/ DamageTypeUnknown,
/*PickLock*/ DamageTypeUnknown,
/*1HPiercing*/ 36,
/*Riposte*/ DamageTypeUnknown,
/*RoundKick*/ 30,
/*SafeFall*/ DamageTypeUnknown,
/*SsenseHeading*/ DamageTypeUnknown,
/*Singing*/ DamageTypeSpell,
/*Sneak*/ DamageTypeUnknown,
/*SpecializeAbjure*/ DamageTypeUnknown,
/*SpecializeAlteration*/ DamageTypeUnknown,
/*SpecializeConjuration*/ DamageTypeUnknown,
/*SpecializeDivination*/ DamageTypeUnknown,
/*SpecializeEvocation*/ DamageTypeUnknown,
/*PickPockets*/ DamageTypeUnknown,
/*StringedInstruments*/ DamageTypeSpell,
/*Swimming*/ DamageTypeUnknown,
/*Throwing*/ 51,
/*TigerClaw*/ 23,
/*Tracking*/ DamageTypeUnknown,
/*WindInstruments*/ DamageTypeSpell,
/*Fishing*/ DamageTypeUnknown,
/*MakePoison*/ DamageTypeUnknown,
/*Tinkering*/ DamageTypeUnknown,
/*Research*/ DamageTypeUnknown,
/*Alchemy*/ DamageTypeUnknown,
/*Baking*/ DamageTypeUnknown,
/*Tailoring*/ DamageTypeUnknown,
/*SenseTraps*/ DamageTypeUnknown,
/*Blacksmithing*/ DamageTypeUnknown,
/*Fletching*/ DamageTypeUnknown,
/*Brewing*/ DamageTypeUnknown,
/*AlcoholTolerance*/ DamageTypeUnknown,
/*Begging*/ DamageTypeUnknown,
/*JewelryMaking*/ DamageTypeUnknown,
/*Pottery*/ DamageTypeUnknown,
/*PercussionInstruments*/ DamageTypeSpell,
/*Intimidation*/ DamageTypeUnknown,
/*Berserking*/ DamageTypeUnknown,
/*Taunt*/ DamageTypeUnknown,
/*Frenzy*/ 74 //,
// /*RemoveTrap*/ DamageTypeUnknown, // Needs research (set for SenseTrap value)
// /*TripleAttack*/ DamageTypeUnknown, // Needs research (set for DoubleAttack value)
// /*2HPiercing*/ 36 // Needs research (set for 1HPiercing value - similar to slash/blunt)
};
// Indexing positions into item material arrays
#define MATERIAL_HEAD 0
#define MATERIAL_CHEST 1
#define MATERIAL_ARMS 2
#define MATERIAL_BRACER 3
#define MATERIAL_HANDS 4
#define MATERIAL_LEGS 5
#define MATERIAL_FEET 6
#define MATERIAL_PRIMARY 7
#define MATERIAL_SECONDARY 8
#define MAX_MATERIALS 9 //number of equipables
/*
** Material use slots
**
*/
enum MaterialUseSlots : uint8
{
MaterialHead = 0,
MaterialChest,
MaterialArms,
MaterialWrist,
MaterialHands,
MaterialLegs,
MaterialFeet,
MaterialPrimary,
MaterialSecondary,
_MaterialCount,
_MaterialInvalid = 255
};
/*
// Used for worn NPC inventory tracking. NPCs don't use
// augments, so only the basic slots need to be kept track of.
#define MAX_WORN_INVENTORY 22
*/
/*
** Inventory Slot Equipment Enum
** Mostly used for third-party tools to reference inventory slots
**
** [pre-HoT]
** NOTE: Numbering for personal inventory goes top to bottom, then left to right
** It's the opposite for inside bags: left to right, then top to bottom
** Example:
** inventory: containers:
** 1 6 1 2
** 2 7 3 4
** 3 8 5 6
** 4 9 7 8
** 5 10 9 10
** Inventory: Containers:
** 1 5 1 2
** 2 6 3 4
** 3 7 5 6
** 4 8 7 8
** - - 9 10
**
** [HoT and Higher]
** Note: Numbering for inventory and bags goes left to right, then top to bottom
** Example:
** Inventory: Containers:
** 1 2 1 2
** 3 4 3 4
** 5 6 5 6
** 7 8 7 8
** 9 10 9 10
** - - 11 12 [Note: Additional slots are only available in RoF and higher]
**
*/
enum InventorySlot
{
////////////////////////
// Equip slots
////////////////////////
enum InventoryMapTypes : int16 {
MapPossessions = 0,
MapBank,
MapSharedBank,
MapTrade,
MapWorld,
MapLimbo,
MapTribute,
MapTrophyTribute,
MapGuildTribute,
MapMerchant,
MapDeleted,
MapCorpse,
MapBazaar,
MapInspect,
MapRealEstate,
MapViewMODPC,
MapViewMODBank,
MapViewMODSharedBank,
MapViewMODLimbo,
MapAltStorage,
MapArchived,
MapMail,
MapGuildTrophyTribute,
MapKrono,
MapOther,
_MapCount
};
enum InventoryMainTypes : int16 {
MainCharm = 0,
MainEar1,
MainHead,
MainFace,
MainEar2,
MainNeck,
MainShoulders,
MainArms,
MainBack,
MainWrist1,
MainWrist2,
MainRange,
MainHands,
MainPrimary,
MainSecondary,
MainFinger1,
MainFinger2,
MainChest,
MainLegs,
MainFeet,
MainWaist,
MainPowerSource = 9999, // temp
MainAmmo = 21, // temp
MainGeneral1,
MainGeneral2,
MainGeneral3,
MainGeneral4,
MainGeneral5,
MainGeneral6,
MainGeneral7,
MainGeneral8,
//MainGeneral9,
//MainGeneral10,
MainCursor,
_MainCount
};
#define INVALID_INDEX -1
#define NOT_USED 0
#define NO_ITEM 0
// yes..these are redundant... but, they help to identify and define what is actually being performed
// plus, since they're pre-op's, they don't affect the actual binary size
#define MAP_BEGIN 0
#define MAIN_BEGIN 0
#define SUB_BEGIN 0
#define AUG_BEGIN 0
namespace legacy {
// this is for perl and other legacy systems
typedef enum {
SLOT_CHARM = 0,
SLOT_EAR01 = 1,
SLOT_HEAD = 2,
@@ -615,46 +913,59 @@ enum InventorySlot
SLOT_LEGS = 18,
SLOT_FEET = 19,
SLOT_WAIST = 20,
SLOT_POWER_SOURCE = 9999,
SLOT_AMMO = 21,
////////////////////////
// All other slots
////////////////////////
SLOT_PERSONAL_BEGIN = 22,
SLOT_PERSONAL_END = 29,
SLOT_GENERAL_1 = 22,
SLOT_GENERAL_2 = 23,
SLOT_GENERAL_3 = 24,
SLOT_GENERAL_4 = 25,
SLOT_GENERAL_5 = 26,
SLOT_GENERAL_6 = 27,
SLOT_GENERAL_7 = 28,
SLOT_GENERAL_8 = 29,
//SLOT_GENERAL_9 = not supported
//SLOT_GENERAL_10 = not supported
SLOT_CURSOR = 30,
SLOT_CURSOR_END = (int16)0xFFFE, // Last item on cursor queue
// Cursor bag slots are 331->340 (10 slots)
// Personal Inventory Slots
// Slots 1 through 8 are slots 22->29
// Inventory bag slots are 251->330 (10 slots per bag)
// Tribute slots are 400-404? (upper bound unknown)
// storing these in worn item's map
// Bank slots
// Bank slots 1 through 16 are slots 2000->2015
// Bank bag slots are 2031->2190
// Shared bank slots
// Shared bank slots 1 through 2 are slots 2500->2501
// Shared bank bag slots are 2531->2550
// Trade session slots
// Trade slots 1 through 8 are slots 3000->3007
// Trade bag slots are technically 0->79 when passed to client,
// but in our code, we treat them as slots 3100->3179
// Slot used in OP_TradeSkillCombine for world tradeskill containers
SLOT_CURSOR_END = (int16)0xFFFE, // I hope no one is using this...
SLOT_TRADESKILL = 1000,
SLOT_AUGMENT = 1001,
// SLOT_POWER_SOURCE = 9999,
// Value recognized by client for destroying an item
SLOT_INVALID = (int16)0xFFFF
};
SLOT_INVALID = (int16)0xFFFF,
SLOT_POSSESSIONS_BEGIN = 0,
SLOT_POSSESSIONS_END = 30,
SLOT_EQUIPMENT_BEGIN = 0,
SLOT_EQUIPMENT_END = 21,
SLOT_PERSONAL_BEGIN = 22,
SLOT_PERSONAL_END = 29,
SLOT_PERSONAL_BAGS_BEGIN = 251,
SLOT_PERSONAL_BAGS_END = 330,
SLOT_CURSOR_BAG_BEGIN = 331,
SLOT_CURSOR_BAG_END = 340,
SLOT_TRIBUTE_BEGIN = 400,
SLOT_TRIBUTE_END = 404,
SLOT_BANK_BEGIN = 2000,
SLOT_BANK_END = 2023,
SLOT_BANK_BAGS_BEGIN = 2031,
SLOT_BANK_BAGS_END = 2270,
SLOT_SHARED_BANK_BEGIN = 2500,
SLOT_SHARED_BANK_END = 2501,
SLOT_SHARED_BANK_BAGS_BEGIN = 2531,
SLOT_SHARED_BANK_BAGS_END = 2550,
SLOT_TRADE_BEGIN = 3000,
SLOT_TRADE_END = 3007,
SLOT_TRADE_BAGS_BEGIN = 3031,
SLOT_TRADE_BAGS_END = 3110,
SLOT_WORLD_BEGIN = 4000,
SLOT_WORLD_END = 4009
} InventorySlot;
}
#endif
File diff suppressed because it is too large Load Diff
+210
View File
@@ -0,0 +1,210 @@
/*
EQEMu: Everquest Server Emulator
Copyright (C) 2001-2014 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef EQ_DICTIONARY_H
#define EQ_DICTIONARY_H
#include "types.h"
#include "eq_constants.h"
#include "clientversions.h"
#include <string>
#include "../common/patches/client62_constants.h"
#include "../common/patches/titanium_constants.h"
#include "../common/patches/sof_constants.h"
#include "../common/patches/sod_constants.h"
#include "../common/patches/underfoot_constants.h"
#include "../common/patches/rof_constants.h"
//#include "../common/patches/rof2_constants.h"
// *** DO NOT CHANGE without a full understanding of the consequences..the server is set up to use these settings explicitly!! ***
// *** You will cause compilation failures and corrupt your database if partial or incorrect attempts to change them are made!! ***
// Hard-coded values usually indicate that further research is needed and the values given are from the old (known) system
// (future use)
//using namespace RoF2::maps; // server inventory maps enumeration (code and database sync'd to reference)
//using namespace RoF::slots; // server possessions slots enumeration (code and database sync'd to reference)
class EmuConstants {
// an immutable value is required to initialize arrays, etc... use this class as a repository for those
public:
// database
static const EQClientVersion CHARACTER_CREATION_CLIENT = EQClientRoF; // adjust according to starting item placement and target client
// inventory
static uint16 InventoryMapSize(int16 map);
//static std::string InventoryLocationName(Location_Struct location);
static std::string InventoryMapName(int16 map);
static std::string InventoryMainName(int16 main);
static std::string InventorySubName(int16 sub);
static std::string InventoryAugName(int16 aug);
// these are currently hard-coded for existing inventory system..do not use in place of special client version handlers until ready
static const uint16 MAP_POSSESSIONS_SIZE = _MainCount;
static const uint16 MAP_BANK_SIZE = 24;
static const uint16 MAP_SHARED_BANK_SIZE = 2;
static const uint16 MAP_TRADE_SIZE = 8;
static const uint16 MAP_WORLD_SIZE = 10;
static const uint16 MAP_LIMBO_SIZE = 36;
static const uint16 MAP_TRIBUTE_SIZE = 5; // (need client values)
static const uint16 MAP_TROPHY_TRIBUTE_SIZE = 0;
static const uint16 MAP_GUILD_TRIBUTE_SIZE = 0;
static const uint16 MAP_MERCHANT_SIZE = 0;
static const uint16 MAP_DELETED_SIZE = 0;
static const uint16 MAP_CORPSE_SIZE = _MainCount; // no bitmask use..limits to size of client corpse window (see EQLimits::InventoryMapSize(MapCorpse, <EQClientVersion))
static const uint16 MAP_BAZAAR_SIZE = 80;
static const uint16 MAP_INSPECT_SIZE = 22;
static const uint16 MAP_REAL_ESTATE_SIZE = 0;
static const uint16 MAP_VIEW_MOD_PC_SIZE = NOT_USED;
static const uint16 MAP_VIEW_MOD_BANK_SIZE = NOT_USED;
static const uint16 MAP_VIEW_MOD_SHARED_BANK_SIZE = NOT_USED;
static const uint16 MAP_VIEW_MOD_LIMBO_SIZE = NOT_USED;
static const uint16 MAP_ALT_STORAGE_SIZE = 0;
static const uint16 MAP_ARCHIVED_SIZE = 0;
static const uint16 MAP_MAIL_SIZE = 0;
static const uint16 MAP_GUILD_TROPHY_TRIBUTE_SIZE = 0;
static const uint16 MAP_KRONO_SIZE = 0;
static const uint16 MAP_OTHER_SIZE = 0;
// most of these definitions will go away with the structure-based system..this maintains compatibility for now
// (these are mainly to assign specific values to constants used in conversions and to identify per-client ranges/offsets)
static const int16 EQUIPMENT_BEGIN = MainCharm;
static const int16 EQUIPMENT_END = MainAmmo;
static const uint16 EQUIPMENT_SIZE = 22; // does not account for 'Power Source' - used mainly for npc equipment arrays
static const int16 GENERAL_BEGIN = MainGeneral1;
static const int16 GENERAL_END = MainGeneral8;
static const uint16 GENERAL_SIZE = 8;
static const int16 GENERAL_BAGS_BEGIN = 251;
static const int16 GENERAL_BAGS_END_OFFSET = 79;
static const int16 GENERAL_BAGS_END = GENERAL_BAGS_BEGIN + GENERAL_BAGS_END_OFFSET;
static const int16 CURSOR_BAG_BEGIN = 331;
static const int16 CURSOR_BAG_END_OFFSET = 9;
static const int16 CURSOR_BAG_END = CURSOR_BAG_BEGIN + CURSOR_BAG_END_OFFSET;
static const int16 BANK_BEGIN = 2000;
static const int16 BANK_END = 2023;
static const int16 BANK_BAGS_BEGIN = 2031;
static const int16 BANK_BAGS_END_OFFSET = 239;
static const int16 BANK_BAGS_END = BANK_BAGS_BEGIN + BANK_BAGS_END_OFFSET;
static const int16 SHARED_BANK_BEGIN = 2500;
static const int16 SHARED_BANK_END = 2501;
static const int16 SHARED_BANK_BAGS_BEGIN = 2531;
static const int16 SHARED_BANK_BAGS_END_OFFSET = 19;
static const int16 SHARED_BANK_BAGS_END = SHARED_BANK_BAGS_BEGIN + SHARED_BANK_BAGS_END_OFFSET;
static const int16 TRADE_BEGIN = 3000;
static const int16 TRADE_END = 3007;
static const int16 TRADE_NPC_END = 3003;
static const int16 TRADE_BAGS_BEGIN = 3031;
static const int16 TRADE_BAGS_END_OFFSET = 79;
static const int16 TRADE_BAGS_END = TRADE_BAGS_BEGIN + TRADE_BAGS_END_OFFSET;
static const int16 WORLD_BEGIN = 4000;
static const int16 WORLD_END = 4009;
static const int16 WORLD_SIZE = MAP_WORLD_SIZE;
static const int16 TRIBUTE_BEGIN = 400;
static const int16 TRIBUTE_END = 404;
static const int16 TRIBUTE_SIZE = MAP_TRIBUTE_SIZE;
static const int16 CORPSE_BEGIN = 22;
//static const int16 CORPSE_END = RoF::consts::CORPSE_END; // not ready for use
static const int16 MATERIAL_BEGIN = MaterialHead;
static const int16 MATERIAL_END = MaterialSecondary;
static const int16 MATERIAL_TINT_END = MaterialFeet;
static const int16 MATERIAL_SIZE = _MaterialCount;
// items
// common and container sizes will not increase until the new 'location' struct is implemented
static const uint16 ITEM_COMMON_SIZE = Underfoot::consts::ITEM_COMMON_SIZE;
static const uint16 ITEM_CONTAINER_SIZE = Underfoot::consts::ITEM_CONTAINER_SIZE;
// player profile
//static const uint32 CLASS_BITMASK = 0; // needs value
//static const uint32 RACE_BITMASK = 0; // needs value
// BANDOLIERS_COUNT sets maximum limit..active limit will need to be handled by the appropriate AA
static const uint32 BANDOLIERS_COUNT = Titanium::consts::BANDOLIERS_COUNT; // count = number of bandolier instances
static const uint32 BANDOLIER_SIZE = Titanium::consts::BANDOLIER_SIZE; // size = number of equipment slots in bandolier instance
static const uint32 POTION_BELT_SIZE = Titanium::consts::POTION_BELT_SIZE;
// legacy-related functions
//static int ServerToPerlSlot(int slot); // encode
//static int PerlToServerSlot(int slot); // decode
};
class EQLimits {
// values should default to a non-beneficial value..unless value conflicts with intended operation
//
// EmuConstants may be used as references..but, not every reference needs to be in EmuConstants (i.e., AllowsEmptyBagInBag(), CoinHasWeight(), etc...)
public:
// client version validation (checks to avoid crashing zone server when accessing reference arrays)
// use this inside of class Client (limits to actual clients)
static bool IsValidClientVersion(uint32 version);
static uint32 ValidateClientVersion(uint32 version);
static EQClientVersion ValidateClientVersion(EQClientVersion version);
// basically..any non-client classes - do not when setting a valid client
static bool IsValidNPCVersion(uint32 version);
static uint32 ValidateNPCVersion(uint32 version);
static EQClientVersion ValidateNPCVersion(EQClientVersion version);
// these are 'universal' - do not when setting a valid client
static bool IsValidMobVersion(uint32 version);
static uint32 ValidateMobVersion(uint32 version);
static EQClientVersion ValidateMobVersion(EQClientVersion version);
// inventory
static uint16 InventoryMapSize(int16 map, uint32 version);
static uint64 PossessionsBitmask(uint32 version);
static uint64 EquipmentBitmask(uint32 version);
static uint64 GeneralBitmask(uint32 version);
static uint64 CursorBitmask(uint32 version);
static bool AllowsEmptyBagInBag(uint32 version);
// items
static uint16 ItemCommonSize(uint32 version);
static uint16 ItemContainerSize(uint32 version);
// player profile
static bool CoinHasWeight(uint32 version);
static uint32 BandoliersCount(uint32 version);
static uint32 BandolierSize(uint32 version);
static uint32 PotionBeltSize(uint32 version);
};
#endif /* EQ_LIMITS_H */
/*
Working Notes:
--------------
- full review of client_packet.cpp and client translators needed
*/
-522
View File
@@ -1,522 +0,0 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2003 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 04111-1307 USA
*/
#ifndef EQ_OPCODES_H
#define EQ_OPCODES_H
//THIS FILE IS NOT USED ANYMORE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
/*
*
*
*
*
// solar: updated 2/12/04
//
// Invalid opcodes have been \t'd out, confirmed have no \t
// all the ops have the first nibble as 0, so anything that's not 0x0???
// is just an invalid opcode. if an opcode is known to be wrong set it to
// this to avoid conflicts with real ops
//
// codes preceded by '//' are ones that are known to be right but not used
// by any code yet
//
// codes preceded by '// not used' are ones that are probably wrong and not
// used anywhere
//
//im feeling lazy today and I dont wanna find-replace this include
#include "emu_opcodes.h"
//////////////////////////////////////
// Zone.exe opcodes:
//////////////////////////////////////
//0x029f gives you money
//280 makes you stop receiving and sending chat messages
//260 send spell information
//45 logout
//72 player is in zone blah at dfdsfdsfg
//80 The door says
//89 Your expansion settings are:
//104 scribes a spell to your spellbook
//108,555 kicks player to server select
//123 money split from groups
//11 sense trap response
//296 name approval question
//338 failed to create new player guild
//401 pk question, 0x0191 response
//411 sacrifice question, 0x019b response
//193,213,243,244,431 chat messages
//425,499,505,506,525,526,596 crash
//451 translocate question, 0x01c3 response
//474,537 you escape from combat hiding yourself from view
//492 stat buffs
//496 your petition text is:
//581 you receive money msg with money
//562 you have control of yourself again
//613 CTD
//686 removes the unencumbered
#define LiveOP_Heartbeat 0x0176 // client sends this periodically
#define LiveOP_ReloadUI 0x02d7
#define LiveOP_IncreaseStats 0x01eb
#define LiveOP_ApproveZone 0x0134
#define LiveOP_Dye 0x01d5
// not used #define LiveOP_ExpansionSetting 0x0203
// not used #define LiveOP_GainMoney 0x0209
// not used #define LiveOP_Sacrifice 0x019b
// not used #define LiveOP_BecomePK 0x0191
#define LiveOP_Stamina 0x0168
#define LiveOP_ControlBoat 0x014d
#define LiveOP_MobUpdate 0x003e
#define LiveOP_ClientUpdate 0x0027
#define LiveOP_ChannelMessage 0x0024
#define LiveOP_SimpleMessage 0x01d7
#define LiveOP_FormattedMessage 0x01d8
//#define LiveOP_RaidInvite 0x01e4 // wrong. from seq - not used by eqemu
// #define LiveOP_RaidJoin 0x01e5 // from seq - not used by eqemu
// not used #define LiveOP_ApplyPoison 0x00b7
#define LiveOP_TGB 0x01c6 // /targetgroupbuff
// #define LiveOP_CharInfo 0x0012 // /charinfo
// #define LiveOP_Movelog 0x0290 // /movelog
// #define LiveOP_Beta 0x02cb // /beta
#define LiveOP_TestBuff 0x0285 // /testbuffme
// #define LiveOP_Key 0x01e2 // /keys
#define LiveOP_Bind_Wound 0x012d
#define LiveOP_Charm 0x01ab
#define LiveOP_Begging 0x014c
#define LiveOP_MoveCoin 0x0152
#define LiveOP_SpawnDoor 0x0292
#define LiveOP_Sneak 0x009d // Clicked sneak - Doodman 10/10/2003
#define LiveOP_ExpUpdate 0x0079
#define LiveOP_DumpName 0x027d //no idea what this is: just tired of looking at it as unknown; updated by Shawn319
// #define LiveOP_UpdateAA 0x0222
#define LiveOP_RespondAA 0x01ea // AA table
#define LiveOP_SendAAStats 0x01c9
#define LiveOP_SendAATable 0x0366
#define LiveOP_AAAction 0x01e9 // Used for changing percent, buying? and activating skills
#define LiveOP_BoardBoat 0x00bb
#define LiveOP_LeaveBoat 0x00bc
#define LiveOP_AdventureInfoRequest 0x02b8 //Cofruben:received when client click on the recruiter.
#define LiveOP_AdventureInfo 0x02b9 //Cofruben:sent when client right click on the recruiter.
#define LiveOP_AdventureRequest 0x02a6 //Cofruben: received when client press request button.1 normal,2 hard
#define LiveOP_AdventureDetails 0x02a8 //Cofruben: sent when client press request button.
#define LiveOP_LDoNButton 0x02a9 //Cofruben: Received button.(uint8)00 decline,01 accept.
#define LiveOP_AdventureData 0x02ba //Cofruben: Sent when client press accept button.
#define LiveOP_AdventureFinish 0x02c9 //Cofruben:Used when you win/lose a dungeon
#define LiveOP_LeaveAdventure 0x02c6 //Cofruben:received when client press leave adventure button
#define LiveOP_AdventureUpdate 0x02ce
#define LiveOP_SendExpZonein 0x002b // 0 length packets
#define LiveOP_ZoneInSendName 0x01e4
//Guild Opcodes
#define LiveOP_GuildLeader 0x01bf // /guildleader, was 00a7
#define LiveOP_GuildPeace 0x009a // /guildpeace
#define LiveOP_GuildRemove 0x0132 // /guildremove
#define LiveOP_GuildMemberList 0x0059 //fixed by Shawn319 (dec 18th patch)
#define LiveOP_GuildMemberUpdate 0x026e
#define LiveOP_GuildInvite 0x0130 // /guildinvite
#define LiveOP_GuildMOTD 0x01c0 // /guildmotd, was 01bf
// not used #define LiveOP_GuildManagement 0x005e // LoY guild mgm't tool
#define LiveOP_GuildPublicNote 0x003c
#define LiveOP_GetGuildMOTD 0x027e // /getguildmotd
#define LiveOP_GuildDemote 0x0277
#define LiveOP_GuildInviteAccept 0x0131
#define LiveOP_GuildWar 0x00a4 // /guildwar
#define LiveOP_GuildUpdate 0x0b41
#define LiveOP_GuildDelete 0x0133
#define LiveOP_GuildManageRemove 0x0233
#define LiveOP_GuildManageAdd 0x022d
#define LiveOP_GuildManageStatus 0x0039
//Bazaar
#define LiveOP_Trader 0x01e8 // /trader
#define LiveOP_Bazaar 0x01e7 // /bazaar search
#define LiveOP_BecomeTrader 0x01c4
#define LiveOP_BazaarInspect 0x01f4
#define LiveOP_TraderItemUpdate 0x006e
#define LiveOP_TraderDelItem 0x017c
#define LiveOP_TraderShop 0x01eb // right-click on a trader in bazaar
#define LiveOP_TraderBuy 0x01ca // buy from a trader in bazaar
#define LiveOP_PetCommands 0x01ac
#define LiveOP_TradeSkillCombine 0x0042
#define LiveOP_AugmentItem 0x02e5
#define LiveOP_ItemName 0x0367
//Shops
#define LiveOP_ShopItem 0x02cd // Send merchant item data to client (header = 0x64)
#define LiveOP_ShopPlayerBuy 0x0065
// not used #define LiveOP_ShopTakeMoney 0x0066
#define LiveOP_ShopPlayerSell 0x006a
#define LiveOP_ShopDelItem 0x006d
#define LiveOP_ShopEndConfirm 0x0f6d
#define LiveOP_ShopRequest 0x00f7 // right-click on merchant
#define LiveOP_ShopEnd 0x006c // Finished shopping at merchant
#define LiveOP_AdventureMerchantRequest 0x02d1
#define LiveOP_AdventureMerchantResponse 0x02d2
#define LiveOP_AdventureMerchantPurchase 0x02d3
#define LiveOP_AdventurePointsUpdate 0x02e3
// #define LiveOP_LFPCommand 0x0272 // Looking for player
// #define LiveOP_LFPGetMatchesRequest 0x0273
// #define LiveOP_LFPGetMatchesResponse 0x0275
// #define LiveOP_LFGGetMatchesRequest 0x0271
// #define LiveOP_LFGGetMatchesResponse 0x0274
#define LiveOP_LFGCommand 0x0270 // When client issues /LFG command
// #define LiveOP_LFGResponse 0x01b1
#define LiveOP_LFGAppearance 0x01d0 // Some other char in zone turns LFG on/off
#define LiveOP_MoneyUpdate 0x01b5
#define LiveOP_GroupDelete 0x0721
#define LiveOP_GroupAcknowledge 0x0272
#define LiveOP_GroupUpdate 0x024a
#define LiveOP_GroupInvite 0x025f
#define LiveOP_GroupDisband 0x00ff
#define LiveOP_GroupInvite2 0x00d5
#define LiveOP_GroupFollow 0x025e
#define LiveOP_GroupFollow2 0x00d7
#define LiveOP_GroupCancelInvite 0x00d6
#define LiveOP_Split 0x0156 // /split
#define LiveOP_Jump 0x00d8 // not used atm but will be when stamina is fixed
#define LiveOP_ConsiderCorpse 0x01d6
#define LiveOP_SkillUpdate 0x0064
#define LiveOP_GMEndTrainingResponse 0x0178
#define LiveOP_GMEndTraining 0x013c
#define LiveOP_GMTrainSkill 0x0175
#define LiveOP_GMTraining 0x013b
#define LiveOP_ConsumeAmmo 0x017b
#define LiveOP_CombatAbility 0x0171
#define LiveOP_TrackUnknown 0x009c
#define LiveOP_TrackTarget 0x0234
#define LiveOP_Track 0x0286
#define LiveOP_ReadBook 0x0297
#define LiveOP_ItemLinkClick 0x001f
#define LiveOP_ItemLinkResponse 0x01f4
#define LiveOP_ItemLinkText 0x01d9
#define LiveOP_RezzRequest 0x0a41
#define LiveOP_RezzAnswer 0x00e5
#define LiveOP_RezzComplete 0x019b
#define LiveOP_MoveDoor 0x0128
#define LiveOP_ClickDoor 0x0127 // Click door
#define LiveOP_SendZonepoints 0x0247 // Coords in a zone that will port you to another zone
#define LiveOP_SetRunMode 0x008c // Client hit the "run" button (or control+r)
#define LiveOP_InspectRequest 0x0248
#define LiveOP_InspectAnswer 0x0249
#define LiveOP_SenseTraps 0x0187 // Clicked sense traps - @Doodman 10/10/2003
#define LiveOP_DisarmTraps 0x018e // Clicked disarm traps - @Doodman 10/10/2003
#define LiveOP_Assist 0x01bc
#define LiveOP_PickPocket 0x0240
#define LiveOP_LootRequest 0x0119
#define LiveOP_EndLootRequest 0x011a
#define LiveOP_MoneyOnCorpse 0x011b
#define LiveOP_LootComplete 0x0179
#define LiveOP_LootItem 0x013f
// solar: there was an LiveOP_PlaceItem synonym for this
#define LiveOP_MoveItem 0x0151 // Client moving an item from one slot to another (user action)
#define LiveOP_WhoAllRequest 0x0056
#define LiveOP_WhoAllResponse 0x0229
#define LiveOP_Consume 0x0167
#define LiveOP_AutoAttack 0x0172
#define LiveOP_AutoAttack2 0x0186
#define LiveOP_TargetMouse 0x0173 // mouse targetting a person (also: Pressing F* key to target)
#define LiveOP_TargetCommand 0x01ba // /target user
#define LiveOP_TargetReject 0x01d8 // When /target fails (// solar: untested)
#define LiveOP_Hide 0x009e
#define LiveOP_Forage 0x012e // Clicked forage - @Doodman 10/10/2003
#define LiveOP_Fishing 0x0077
// #define LiveOP_Adventure 0x02d0 // /adventure
// #define LiveOP_Feedback 0x0161 // /feedback
#define LiveOP_Bug 0x0246 // /bug
#define LiveOP_Emote 0x00f2 // /me goes blah
#define LiveOP_EmoteAnim 0x0140 // solar: untested
#define LiveOP_Consider 0x015c
#define LiveOP_FaceChange 0x01cb // /face
// not used #define LiveOP_Report 0x01e0
#define LiveOP_RandomReq 0x0197
#define LiveOP_RandomReply 0x0087
#define LiveOP_Camp 0x01c3
#define LiveOP_YellForHelp 0x0192
#define LiveOP_SafePoint 0x00ef
#define LiveOP_Buff 0x0157
#define LiveOP_BuffFadeMsg 0x00c0
#define LiveOP_MultiLineMsg 0x0440 // is this still good for anything?
#define LiveOP_SpecialMesg 0x021c // Communicate textual info to client
#define LiveOP_Consent 0x0013 // /consent
#define LiveOP_ConsentResponse 0x029d
#define LiveOP_Deny 0x02d4
#define LiveOP_Stun 0x016c
#define LiveOP_BeginCast 0x0021
#define LiveOP_CastSpell 0x00be
#define LiveOP_InterruptCast 0x01a8
#define LiveOP_Death 0x0105
#define LiveOP_FeignDeath 0x023f
#define LiveOP_Illusion 0x012b
#define LiveOP_LevelUpdate 0x0078
#define LiveOP_LevelAppearance 0x0371
// not used #define LiveOP_LocateCorpse 0x00d1 //Sent when a client casts Locate Corpse spells?
#define LiveOP_MemorizeSpell 0x00c2 // Memming a spell from book to spell slot
#define LiveOP_HPUpdate 0x0244 // Update HP % of a PC or NPC
#define LiveOP_SendHPTarget 0x022e
#define LiveOP_Mend 0x007d
#define LiveOP_MendHPUpdate 0x009b
#define LiveOP_Taunt 0x0160
// #define LiveOP_Summoncorpse 0x02b5 // /summoncorpse
// #define LiveOP_GMSearchCorpse 0x0097 // GM /searchcorpse - Search all zones for named corpse
// #define LiveOP_SearchCorpse LiveOP_GMSearchCorpse // /searchcorpse
#define LiveOP_GMDelCorpse 0x0199 // /delcorpse
#define LiveOP_GMFind 0x0047 // GM /find - ?
// not used #define LiveOP_FindResponse 0x02cc
#define LiveOP_GMServers 0x0020 // GM /servers - ?
#define LiveOP_GMGoto 0x010b // GM /goto - Transport to another loc
#define LiveOP_GMSummon 0x028c // GM /summon - Summon PC to self
#define LiveOP_GMKick 0x010a // GM /kick - Boot player
#define LiveOP_GMKill 0x0109 // GM /kill - Insta kill mob/pc
#define LiveOP_GMNameChange 0x0b40 // /name
#define LiveOP_GMLastName 0x00a3 // GM /lastname - Change user lastname
#define LiveOP_GMToggle 0x01b3 // GM /toggle - Toggle ability to receive tells from other PC's
#define LiveOP_GMEmoteZone 0x028f // GM /emotezone - Send zonewide emote
#define LiveOP_GMBecomeNPC 0x0074 // GM /becomenpc - Become an NPC
// (TODO: Use opcode 0x012d, which is also sent with LiveOP_GMBecomeNPC to create correct npc
// #define LiveOP_GMApproval 0x01b0 // GM /approval - Name approval duty?
// not used #define LiveOP_NameApproval 0x011f //Name approval
#define LiveOP_GMHideMe 0x00de // GM /hideme - Remove self from spawn lists and make invis
// #define LiveOP_GMInquire 0x00da // GM /inquire - Search soulmark data
// #define LiveOP_GMSoulmark 0x00dc // GM /praise /warn - Add soulmark comment to user file
#define LiveOP_GMZoneRequest 0x0184 // GM /zone - Transport to another zone
#define LiveOP_GMZoneRequest2 0x0239 // GM /zone 2
#define LiveOP_Petition 0x0068
#define LiveOP_PetitionRefresh 0x0085
#define LiveOP_PDeletePetition 0x01ee
#define LiveOP_PetitionBug 0x0092 // 0094 feedback 0095 guide
// #define LiveOP_PViewPetition 0x01ef
#define LiveOP_PetitionUpdate 0x0069 // Updates the Petitions in the Que
#define LiveOP_PetitionCheckout 0x0076 // Petition Checkout
#define LiveOP_PetitionCheckout2 0x0056 //Also sent when a player checks out a petition Possibly requesting who all
#define LiveOP_PetitionDelete 0x0091 // Client Petition Delete Request
#define LiveOP_PetitionResolve 0x02b4 // Client Petition Resolve Request
#define LiveOP_PetitionCheckIn 0x007e // Petition Checkin
#define LiveOP_PetitionUnCheckout 0x0090
#define LiveOP_PetitionQue 0x01ec //GM looking at petitions
#define LiveOP_SetServerFilter 0x01bb
// not used #define LiveOP_SetServerFilterAck 0x0341
#define LiveOP_NewSpawn 0x0218 // New NPC or PC entering zone
#define LiveOP_Animation 0x0140
// #define LiveOP_MobHealth 0x022e // health sent when a player clicks on the mob
#define LiveOP_ZoneChange 0x0142 // Client requesting transfer to a different zone
#define LiveOP_DeleteSpawn 0x00f3 // Remove a spawn from the current zone
// not used #define LiveOP_ConfirmDelete 0x0178 //Client sends this to server to confirm op_deletespawn
// not used #define LiveOP_NewCorpse 0x00da
#define LiveOP_CrashDump 0x0265
// not used #define LiveOP_CastOn 0x0119
#define LiveOP_EnvDamage 0x00e8
#define LiveOP_Action 0x0101
#define LiveOP_Damage 0x00e2 // seq calls this Action2
#define LiveOP_ManaChange 0x00bf
#define LiveOP_ClientError 0x027c
// #define LiveOP_LoadSpellSet 0x02a4
#define LiveOP_Save 0x00fb // Client asking server to save user state
#define LiveOP_LocInfo 0x0316
#define LiveOP_Surname 0x0188
#define LiveOP_SwapSpell 0x018f // Swapping spell positions within book
#define LiveOP_DeleteSpell 0x01db
#define LiveOP_CloseContainer 0x029f //Client closing world container (i.e., forge)
#define LiveOP_ClickObjectAck 0x029f //Client closing world container (i.e., forge)
#define LiveOP_CreateObject 0x00fa //Zone objects (pok books, objects on ground, etc)
#define LiveOP_ClickObject 0x00f9 //Client clicking on object
#define LiveOP_ClearObject 0x01c1
#define LiveOP_ZoneUnavail 0x0265
// #define LiveOP_FlashMessage 0x02cd //wierd opcode that flashes message on screen
#define LiveOP_ItemPacket 0x02e0 // Variety of ways for sending out item data
//0x0283 hmm
#define LiveOP_TradeRequest 0x029a // Client request trade session
#define LiveOP_TradeRequestAck 0x0037 // Trade request recipient is acknowledging they are able to trade
#define LiveOP_TradeAcceptClick 0x002d
// not used #define LiveOP_ItemToTrade 0x0031
#define LiveOP_TradeMoneyUpdate 0x0162
#define LiveOP_TradeCoins 0x0036
#define LiveOP_CancelTrade 0x002e
#define LiveOP_FinishTrade 0x002f
// #define LiveOP_Translocate 0x01c5
// not used #define LiveOP_WebUpdate 0x01f2
#define LiveOP_SaveOnZoneReq 0x00a1
#define LiveOP_Logout 0x0185 // Last opcode seny by server when you zone or camp
#define LiveOP_RequestDuel 0x0298 //Shawn319: Fixed 1/3/04
// LiveOP_DeclineDuel 0x029c
#define LiveOP_DuelResponse 0x0a5d
#define LiveOP_DuelResponse2 0x016e
#define LiveOP_InstillDoubt 0x007c
#define LiveOP_SafeFallSuccess 0x00ac
#define LiveOP_DisciplineUpdate 0x02fb
//Tribute Master
//send initial tribute update right before inventory
//send the LiveOP_TributeInfo's in response to LiveOP_ReqClientSpawn
#define LiveOP_TributeUpdate 0x02f2
#define LiveOP_TributeItem 0x02f3
#define LiveOP_TributePointUpdate 0x02f4
#define LiveOP_SendTributes 0x02f5
#define LiveOP_TributeInfo 0x02f6
#define LiveOP_SelectTribute 0x02f7
#define LiveOP_TributeTimer 0x02f8
#define LiveOP_StartTribute 0x02f9
#define LiveOP_TributeNPC 0x02fa //no idea what this is for
#define LiveOP_TributeMoney 0x02fe
#define LiveOP_TributeToggle 0x0364
//New Tradeskill Interface
#define LiveOP_RecipesFavorite 0x0322
#define LiveOP_RecipesSearch 0x01f9
#define LiveOP_RecipeReply 0x01fa
#define LiveOP_RecipeDetails 0x01fb
#define LiveOP_RecipeAutoCombine 0x01fc
//for the 'find' command
#define LiveOP_FindPersonRequest 0x02db
#define LiveOP_FindPersonReply 0x02dc
#define LiveOP_Shielding 0x01dd //this is prolly wrong
//////////////////////////////////////
// Zone.exe opcodes for login sequence:
//////////////////////////////////////
#define LiveOP_SetDataRate 0x0198 // Client sending datarate.txt value
#define LiveOP_ZoneEntry 0x023b // Info about char entering zone..
#define LiveOP_PlayerProfile 0x006b // Basic player info (no inventory)
#define LiveOP_CharInventory 0x0291 // Full inventory of player
#define LiveOP_ZoneSpawns 0x0170 // All spawns in current zone
#define LiveOP_TimeOfDay 0x0026 // Notify client of current time
#define LiveOP_Weather 0x015b // Weather update
#define LiveOP_ReqNewZone 0x00ec // Client requesting NewZone_Struct
#define LiveOP_NewZone 0x00eb // Info about zone being loaded (exp multiplier, etc)
#define LiveOP_ReqClientSpawn 0x00fd // Client requesting spawn data
#define LiveOP_SpawnAppearance 0x012F // Sets spawnid/animation/equipment
#define LiveOP_ClientReady 0x0086 // Client fully connected, finished loading
#define LiveOP_ZoneComplete LiveOP_ClientReady //Client sends upon successful zone in
//////////////////////////////////////
// World.exe opcodes:
//////////////////////////////////////
#define LiveOP_LoginComplete 0x02db
#define LiveOP_ApproveWorld 0x0195
#define LiveOP_LogServer 0x035f
#define LiveOP_MOTD 0x01b2 // Server message of the day
#define LiveOP_SendLoginInfo 0x0251
#define LiveOP_DeleteCharacter 0x00ea // Delete character @ char select
#define LiveOP_SendCharInfo 0x0102 // Send all chars visible @ char select
#define LiveOP_ExpansionInfo 0x00e1 // Which expansions user has
#define LiveOP_CharacterCreate 0x0104 // Create character @ char select
#define LiveOP_RandomNameGenerator 0x02ab // Returns a random name
#define LiveOP_GuildsList 0x005d // Server sending client list of guilds
#define LiveOP_ApproveName 0x0125 // Approving new character name @ char creation
#define LiveOP_EnterWorld 0x0261 // Server approval for client to enter world
#define LiveOP_World_Client_CRC1 0x015a // Contains a snippet of spell data
#define LiveOP_World_Client_CRC2 0x015e // Second client verification packet
#define LiveOP_SetChatServer 0x0269 // Chatserver? IP,Port,servername.Charname,password(?)
#define LiveOP_ZoneServerInfo 0x0264 // Zone server? IP,0's,uint16?
// not used #define LiveOP_UserCompInfo 0x02a5 // User submitting computer information
//////////////////////////////////////
// Zone.exe/World.exe shared opcodes:
//////////////////////////////////////
#define LiveOP_AckPacket 0x0017 // Appears to be generic ack at the presentation level
#define LiveOP_WearChange 0x012c // Client texture/color update
////////////////////////////
// OLD opcodes:
////////////////////////////
// not used #define LiveOP_SummonedItem 0x0841
// not used #define LiveOP_HarmTouch 0x0E41
// not used #define LiveOP_Drink 0x0641
// not used #define LiveOP_Medding 0x0841
// not used #define LiveOP_SenseHeading 0x00c3 // Clicked sense heading button - solar: not used anymore
#define PET_BACKOFF 1
#define PET_GETLOST 2
#define PET_HEALTHREPORT 4
#define PET_GUARDHERE 5
#define PET_GUARDME 6
#define PET_ATTACK 7
#define PET_FOLLOWME 8
#define PET_SITDOWN 9
#define PET_STANDUP 10
#define PET_TAUNT 11
#define PET_HOLD 12
#define PET_NOTAUNT 14
#define PET_LEADER 16
#define PET_SLUMBER 17
// Agz: The following is from the old source I used as base
/ENUMERATED PACKET OPCODE
#define ALL_FINISH 0x0005
#define LS_REQUEST_VERSION 0x0059
#define LS_SEND_VERSION 0x0059
#define LS_SEND_LOGIN_INFO 0x0001
#define LS_SEND_SESSION_ID 0x0004
#define LS_REQUEST_UPDATE 0x0052
#define LS_SEND_UPDATE 0x0052
#define LS_REQUEST_SERVERLIST 0x0046
#define LS_SEND_SERVERLIST 0x0046
#define LS_REQUEST_SERVERSTATUS 0x0048
#define LS_SEND_SERVERSTATUS 0x004A
#define LS_GET_WORLDID 0x0047
#define LS_SEND_WORLDID 0x0047
#define WS_SEND_LOGIN_INFO 0x5818
#define WS_SEND_LOGIN_APPROVED 0x0710
#define WS_SEND_LOGIN_APPROVED2 0x0180
#define WS_SEND_CHAR_INFO 0x4720*/
#endif
+12 -14
View File
@@ -19,10 +19,10 @@
#include <stdio.h>
#include <iostream>
#include <iomanip>
#include "EQPacket.h"
#include "eq_packet.h"
#include "misc.h"
#include "op_codes.h"
#include "CRC16.h"
#include "crc16.h"
#include "platform.h"
#ifndef STATIC_OPCODE
#include "opcodemgr.h"
@@ -32,8 +32,6 @@
#include <cstdlib>
#include <cstring>
using namespace std;
EQPacket::EQPacket(EmuOpcode op, const unsigned char *buf, uint32 len)
: BasePacket(buf, len),
emu_opcode(op)
@@ -61,7 +59,7 @@ void EQPacket::build_header_dump(char *buffer) const {
void EQPacket::DumpRawHeaderNoTime(uint16 seq, FILE *to) const
{
if (src_ip) {
string sIP,dIP;;
std::string sIP,dIP;;
sIP=long2ip(src_ip);
dIP=long2ip(dst_ip);
fprintf(to, "[%s:%d->%s:%d] ",sIP.c_str(),src_port,dIP.c_str(),dst_port);
@@ -95,7 +93,7 @@ void EQProtocolPacket::build_header_dump(char *buffer) const
void EQProtocolPacket::DumpRawHeaderNoTime(uint16 seq, FILE *to) const
{
if (src_ip) {
string sIP,dIP;;
std::string sIP,dIP;;
sIP=long2ip(src_ip);
dIP=long2ip(dst_ip);
fprintf(to, "[%s:%d->%s:%d] ",sIP.c_str(),src_port,dIP.c_str(),dst_port);
@@ -137,7 +135,7 @@ void EQApplicationPacket::build_header_dump(char *buffer) const
void EQApplicationPacket::DumpRawHeaderNoTime(uint16 seq, FILE *to) const
{
if (src_ip) {
string sIP,dIP;;
std::string sIP,dIP;;
sIP=long2ip(src_ip);
dIP=long2ip(dst_ip);
fprintf(to, "[%s:%d->%s:%d] ",sIP.c_str(),src_port,dIP.c_str(),dst_port);
@@ -183,7 +181,7 @@ void EQRawApplicationPacket::build_header_dump(char *buffer) const
void EQRawApplicationPacket::DumpRawHeaderNoTime(uint16 seq, FILE *to) const
{
if (src_ip) {
string sIP,dIP;;
std::string sIP,dIP;;
sIP=long2ip(src_ip);
dIP=long2ip(dst_ip);
fprintf(to, "[%s:%d->%s:%d] ",sIP.c_str(),src_port,dIP.c_str(),dst_port);
@@ -248,7 +246,7 @@ uint32 offset;
memcpy(pBuffer,buf+offset,len-offset);
size=len-offset;
} else {
pBuffer=NULL;
pBuffer=nullptr;
size=0;
}
OpMgr=&RawOpcodeManager;
@@ -294,7 +292,7 @@ get running again... but might be a good thing some day.
bool EQApplicationPacket::combine(const EQApplicationPacket *rhs)
{
uint32 newsize=0, offset=0;
unsigned char *tmpbuffer=NULL;
unsigned char *tmpbuffer=nullptr;
if (opcode!=OP_AppCombined) {
newsize=app_opcode_size+size+(size>254?3:1)+app_opcode_size+rhs->size+(rhs->size>254?3:1);
@@ -345,7 +343,7 @@ bool valid=false;
uint16 packet_crc=ntohs(*(const uint16 *)(buffer+length-2));
#ifdef EQN_DEBUG
if (packet_crc && comp_crc != packet_crc) {
cout << "CRC mismatch: comp=" << hex << comp_crc << ", packet=" << packet_crc << dec << endl;
std::cout << "CRC mismatch: comp=" << std::hex << comp_crc << ", packet=" << packet_crc << std::dec << std::endl;
}
#endif
valid = (!packet_crc || comp_crc == packet_crc);
@@ -478,7 +476,7 @@ EQRawApplicationPacket::EQRawApplicationPacket(const unsigned char *buf, const u
const unsigned char *packet_start = (buf + 3);
const int32 packet_length = len - 3;
safe_delete_array(pBuffer);
if(len >= 0)
if(packet_length >= 0)
{
size = packet_length;
pBuffer = new unsigned char[size];
@@ -502,8 +500,8 @@ EQRawApplicationPacket::EQRawApplicationPacket(const unsigned char *buf, const u
void DumpPacket(const EQApplicationPacket* app, bool iShowInfo) {
if (iShowInfo) {
cout << "Dumping Applayer: 0x" << hex << setfill('0') << setw(4) << app->GetOpcode() << dec;
cout << " size:" << app->size << endl;
std::cout << "Dumping Applayer: 0x" << std::hex << std::setfill('0') << std::setw(4) << app->GetOpcode() << std::dec;
std::cout << " size:" << app->size << std::endl;
}
DumpPacketHex(app->pBuffer, app->size);
// DumpPacketAscii(app->pBuffer, app->size);
+6 -8
View File
@@ -18,8 +18,8 @@
#ifndef _EQPACKET_H
#define _EQPACKET_H
#include "BasePacket.h"
#include "EQStreamType.h"
#include "base_packet.h"
#include "eq_stream_type.h"
#include "op_codes.h"
#include "platform.h"
@@ -30,8 +30,6 @@
#include "emu_opcodes.h"
#endif
using namespace std;
class EQStream;
class EQStreamPair;
@@ -58,7 +56,7 @@ protected:
EQPacket(EmuOpcode opcode, const unsigned char *buf, const uint32 len);
// EQPacket(const EQPacket &p) { }
EQPacket() { emu_opcode=OP_Unknown; pBuffer=NULL; size=0; }
EQPacket() { emu_opcode=OP_Unknown; pBuffer=nullptr; size=0; }
};
@@ -102,11 +100,11 @@ class EQApplicationPacket : public EQPacket {
// friend class EQProtocolPacket;
friend class EQStream;
public:
EQApplicationPacket() : EQPacket(OP_Unknown,NULL,0)
EQApplicationPacket() : EQPacket(OP_Unknown,nullptr,0)
{ app_opcode_size = GetExecutablePlatform() == ExePlatformUCS ? 1 : 2; }
EQApplicationPacket(const EmuOpcode op) : EQPacket(op,NULL,0)
EQApplicationPacket(const EmuOpcode op) : EQPacket(op,nullptr,0)
{ app_opcode_size = GetExecutablePlatform() == ExePlatformUCS ? 1 : 2; }
EQApplicationPacket(const EmuOpcode op, const uint32 len) : EQPacket(op,NULL,len)
EQApplicationPacket(const EmuOpcode op, const uint32 len) : EQPacket(op,nullptr,len)
{ app_opcode_size = GetExecutablePlatform() == ExePlatformUCS ? 1 : 2; }
EQApplicationPacket(const EmuOpcode op, const unsigned char *buf, const uint32 len) : EQPacket(op,buf,len)
{ app_opcode_size = GetExecutablePlatform() == ExePlatformUCS ? 1 : 2; }
+153 -52
View File
@@ -21,14 +21,19 @@
#include "types.h"
#include <string.h>
#include <string>
#include <list>
#include <time.h>
#include "../common/version.h"
//#include "../common/item_struct.h"
static const uint32 BUFF_COUNT = 25;
static const uint32 MAX_MERC = 100;
static const uint32 MAX_MERC_GRADES = 10;
static const uint32 MAX_MERC_STANCES = 10;
static const uint32 BLOCKED_BUFF_COUNT = 20;
#include "eq_constants.h"
//#include "eq_constants.h"
#include "eq_dictionary.h"
/*
** Compiler override to ensure
@@ -221,18 +226,18 @@ struct Spawn_Struct {
/*0088*/ uint8 findable; // 0=can't be found, 1=can be found
/*0089*/ uint8 unknown0089[5];
/*0094*/ signed deltaHeading:10; // change in heading
signed x:19; // x coord
signed padding0054:3; // ***Placeholder
/*????*/ signed x:19; // x coord
/*????*/ signed padding0054:3; // ***Placeholder
/*0098*/ signed y:19; // y coord
signed animation:10; // animation
signed padding0058:3; // ***Placeholder
/*????*/ signed animation:10; // animation
/*????*/ signed padding0058:3; // ***Placeholder
/*0102*/ signed z:19; // z coord
signed deltaY:13; // change in y
/*????*/ signed deltaY:13; // change in y
/*0106*/ signed deltaX:13; // change in x
unsigned heading:12; // heading
signed padding0066:7; // ***Placeholder
/*????*/ unsigned heading:12; // heading
/*????*/ signed padding0066:7; // ***Placeholder
/*0110*/ signed deltaZ:13; // change in z
signed padding0070:19; // ***Placeholder
/*????*/ signed padding0070:19; // ***Placeholder
/*0114*/ uint8 eyecolor1; // Player's left eye color
/*0115*/ uint8 unknown0115[11]; // Was [24]
/*0126*/ uint8 StandState; // stand state for SoF+ 0x64 for normal animation
@@ -266,7 +271,7 @@ struct Spawn_Struct {
/*0225*/ uint32 equip_primary; // Equipment: Primary Visual
/*0229*/ uint32 equip_secondary; // Equipment: Secondary Visual
} equip;
/*0197*/ uint32 equipment[MAX_MATERIALS]; // Array elements correspond to struct equipment above
/*0197*/ uint32 equipment[_MaterialCount]; // Array elements correspond to struct equipment above
};
/*0233*/ float runspeed; // Speed when running
/*0036*/ uint8 afk; // 0=no, 1=afk
@@ -312,7 +317,7 @@ union
/*0376*/ Color_Struct color_primary; // Color of primary item
/*0380*/ Color_Struct color_secondary; // Color of secondary item
} equipment_colors;
/*0348*/ Color_Struct colors[MAX_MATERIALS]; // Array elements correspond to struct equipment_colors above
/*0348*/ Color_Struct colors[_MaterialCount]; // Array elements correspond to struct equipment_colors above
};
/*0384*/ uint8 lfg; // 0=off, 1=lfg on
/*0385*/
@@ -376,7 +381,11 @@ struct NewZone_Struct {
/*0404*/ float fog_maxclip[4];
/*0420*/ float gravity;
/*0424*/ uint8 time_type;
/*0425*/ uint8 unknown360[49];
/*0425*/ uint8 rain_chance[4];
/*0429*/ uint8 rain_duration[4];
/*0433*/ uint8 snow_chance[4];
/*0437*/ uint8 snow_duration[4];
/*0441*/ uint8 unknown360[33];
/*0474*/ uint8 sky; // Sky Type
/*0475*/ uint8 unknown331[13]; // ***Placeholder
/*0488*/ float zone_exp_multiplier; // Experience Multiplier
@@ -712,12 +721,8 @@ struct Disciplines_Struct {
uint32 values[MAX_PP_DISCIPLINES];
};
static const uint32 TRIBUTE_SLOT_START = 400;
static const uint32 MAX_PLAYER_TRIBUTES = 5;
static const uint32 MAX_PLAYER_BANDOLIER = 4;
static const uint32 MAX_PLAYER_BANDOLIER_ITEMS = 4;
static const uint32 MAX_POTIONS_IN_BELT = 4;
static const uint32 TRIBUTE_NONE = 0xFFFFFFFF;
struct Tribute_Struct {
uint32 tribute;
uint32 tier;
@@ -739,10 +744,10 @@ enum { //bandolier item positions
};
struct Bandolier_Struct {
char name[32];
BandolierItem_Struct items[MAX_PLAYER_BANDOLIER_ITEMS];
BandolierItem_Struct items[EmuConstants::BANDOLIER_SIZE];
};
struct PotionBelt_Struct {
BandolierItem_Struct items[MAX_POTIONS_IN_BELT];
BandolierItem_Struct items[EmuConstants::POTION_BELT_SIZE];
};
struct MovePotionToBelt_Struct {
@@ -783,7 +788,7 @@ struct SuspendedMinion_Struct
/*002*/ uint32 HP;
/*006*/ uint32 Mana;
/*010*/ SpellBuff_Struct Buffs[BUFF_COUNT];
/*510*/ uint32 Items[MAX_MATERIALS];
/*510*/ uint32 Items[_MaterialCount];
/*546*/ char Name[64];
/*610*/
};
@@ -798,7 +803,7 @@ struct SuspendedMinion_Struct
static const uint32 MAX_PP_LANGUAGE = 28;
static const uint32 MAX_PP_SPELLBOOK = 480; // Increased to 480 to support SoF
static const uint32 MAX_PP_MEMSPELL = 9;
static const uint32 MAX_PP_SKILL = 75;
static const uint32 MAX_PP_SKILL = _SkillPacketArraySize; // 100 - actual skills buffer size
static const uint32 MAX_PP_AA_ARRAY = 240;
static const uint32 MAX_GROUP_MEMBERS = 6;
static const uint32 MAX_RECAST_TYPES = 20;
@@ -888,9 +893,9 @@ struct PlayerProfile_Struct
/*0304*/ uint8 ability_time_minutes;
/*0305*/ uint8 ability_time_hours; //place holder
/*0306*/ uint8 unknown0306[6]; // @bp Spacer/Flag?
/*0312*/ uint32 item_material[MAX_MATERIALS]; // Item texture/material of worn/held items
/*0312*/ uint32 item_material[_MaterialCount]; // Item texture/material of worn/held items
/*0348*/ uint8 unknown0348[44];
/*0392*/ Color_Struct item_tint[MAX_MATERIALS];
/*0392*/ Color_Struct item_tint[_MaterialCount];
/*0428*/ AA_Array aa_array[MAX_PP_AA_ARRAY];
/*2348*/ float unknown2384; //seen ~128, ~47
/*2352*/ char servername[32]; // length probably not right
@@ -936,9 +941,9 @@ struct PlayerProfile_Struct
/*4760*/ int32 silver_cursor; // Silver on cursor
/*4764*/ int32 copper_cursor; // Copper on cursor
/*4768*/ int32 platinum_shared; // Platinum shared between characters
/*4772*/ uint8 unknown4808[24]; // @bp unknown skills?
/*4796*/ uint32 skills[MAX_PP_SKILL];
/*5096*/ uint8 unknown5132[284]; // @bp unknown skills?
/*4772*/ uint8 unknown4808[24];
/*4796*/ uint32 skills[MAX_PP_SKILL]; // [400] List of skills // 100 dword buffer
/*5196*/ uint8 unknown5132[184];
/*5380*/ uint32 pvp2; //
/*5384*/ uint32 unknown5420; //
/*5388*/ uint32 pvptype; //
@@ -991,7 +996,7 @@ struct PlayerProfile_Struct
/*7212*/ uint32 tribute_points;
/*7216*/ uint32 unknown7252;
/*7220*/ uint32 tribute_active; //1=active
/*7224*/ Tribute_Struct tributes[MAX_PLAYER_TRIBUTES];
/*7224*/ Tribute_Struct tributes[EmuConstants::TRIBUTE_SIZE];
/*7264*/ Disciplines_Struct disciplines;
/*7664*/ uint32 recastTimers[MAX_RECAST_TYPES]; // Timers (GMT of last use)
/*7744*/ char unknown7780[160];
@@ -1018,7 +1023,7 @@ struct PlayerProfile_Struct
/*12800*/ uint32 expAA;
/*12804*/ uint32 aapoints; //avaliable, unspent
/*12808*/ uint8 unknown12844[36];
/*12844*/ Bandolier_Struct bandoliers[MAX_PLAYER_BANDOLIER];
/*12844*/ Bandolier_Struct bandoliers[EmuConstants::BANDOLIERS_COUNT];
/*14124*/ uint8 unknown14160[4506];
/*18630*/ SuspendedMinion_Struct SuspendedMinion; // No longer in use
/*19240*/ uint32 timeentitledonaccount;
@@ -1115,8 +1120,7 @@ struct SpecialMesg_Struct
};
/*
** When somebody changes what they're wearing
** or give a pet a weapon (model changes)
** When somebody changes what they're wearing or give a pet a weapon (model changes)
** Length: 19 Bytes
*/
struct WearChange_Struct{
@@ -1317,8 +1321,7 @@ struct SpawnPositionUpdate_Struct
/*0000*/ uint16 spawn_id;
/*0002*/ uint64 y_pos:19, z_pos:19, x_pos:19, padding002:7;
/*0010*/ unsigned heading:12;
signed padding010:4;
/*0012*/
/*0012*/ signed padding010:4;
};
/*
@@ -1463,6 +1466,16 @@ struct MoveItem_Struct
/*0008*/ uint32 number_in_stack;
};
// both MoveItem_Struct/DeleteItem_Struct server structures will be changing to a structure-based slot format..this will
// be used for handling SoF/SoD/etc... time stamps sent using the MoveItem_Struct format. (nothing will be done with this
// info at the moment..but, it forwards it on to the server for handling/future use)
struct ClientTimeStamp_Struct
{
/*0000*/ uint32 from_slot;
/*0004*/ uint32 to_slot;
/*0008*/ uint32 number_in_stack;
};
//
// from_slot/to_slot
// -1 - destroy
@@ -2011,7 +2024,7 @@ struct Illusion_Struct { //size: 256 - SoF
/*092*/ uint32 drakkin_heritage; //
/*096*/ uint32 drakkin_tattoo; //
/*100*/ uint32 drakkin_details; //
/*104*/ uint32 armor_tint[MAX_MATERIALS]; //
/*104*/ uint32 armor_tint[_MaterialCount]; //
/*140*/ uint8 eyecolor1; // Field Not Identified in any Illusion Struct
/*141*/ uint8 eyecolor2; // Field Not Identified in any Illusion Struct
/*142*/ uint8 unknown138[114]; //
@@ -2274,10 +2287,13 @@ struct Stun_Struct { // 4 bytes total
};
struct AugmentItem_Struct {
/*00*/ int16 container_slot;
/*02*/ char unknown02[2];
/*04*/ int32 augment_slot;
/*08*/
/*00*/ uint32 container_index;
/*04*/ int32 container_slot;
/*08*/ uint32 augment_index;
/*12*/ int32 augment_slot;
/*16*/ uint32 dest_inst_id; // The unique serial number for the item instance that is being augmented
/*20*/ int32 augment_action; // Guessed - 0 = augment, 1 = remove with distiller, 3 = delete aug
/*24*/
};
// OP_Emote
@@ -2413,7 +2429,8 @@ struct BookRequest_Struct {
*/
struct Object_Struct {
/*00*/ uint32 linked_list_addr[2];// <Zaphod> They are, get this, prev and next, ala linked list
/*08*/ uint16 unknown008[2]; //
/*08*/ uint16 unknown008; //
/*10*/ uint16 unknown010; //
/*12*/ uint32 drop_id; // Unique object id for zone
/*16*/ uint16 zone_id; // Redudant, but: Zone the object appears in
/*18*/ uint16 zone_instance; //
@@ -2453,7 +2470,7 @@ struct Shielding_Struct {
/*
** Click Object Action Struct
** Response to client clicking on a World Container (ie, forge)
* also sent by the client when they close the container.
** also sent by the client when they close the container.
**
*/
struct ClickObjectAction_Struct {
@@ -2877,7 +2894,7 @@ struct LogServer_Struct {
/*260*/ uint8 enable_petition_wnd;
/*261*/ uint8 enablevoicemacros;
/*262*/ uint8 enablemail;
/*263*/ uint8 disable_tutorial_go_home;
/*263*/ uint8 disable_tutorial_go_home; // This appears valid on Ti and RoF..other clients need verification
/*264*/
};
@@ -3156,6 +3173,26 @@ struct GuildUpdateURLAndChannel_Struct
/*4176*/
};
//Case 5 in Rain of Fear and higher clients for guild permissions.
//RankID is the internal guild rank. There are 8 in Rain of Fear as opposed to the 3 in Titanium.
//PermissionID is the type of permission. There are 32 total, with some unused. Live May 2014 sends and uses 26 of them. Varies through client version.
//Permission value is a char that is either 0 or 1. Enabled for that rank/disabled for that rank.
//The client sends this struct on changing a guild rank. The server sends each rank in 32 or less packets upon zonein if you are in a guild.
struct GuildUpdateRanks_Struct
{
/*0000*/ uint32 Action; // 0 = Update URL, 1 = Update Channel, 5 = RoF Ranks
/*0004*/ uint32 Unknown0004; //Seen 00 00 00 00
/*0008*/ uint32 Unknown0008; //Seen 96 29 00 00
/*0008*/ char Unknown0012[64]; //Seen "CharacterName"
/*0076*/ uint32 GuildID; //Guild ID of "CharacterName"
/*0080*/ uint32 RankID;
/*0084*/ uint32 PermissionID;
/*0088*/ char PermissionVal;
/*0089*/ char Unknown0089[3]; //Seen 2c 01 00 ?
/*0092*/
};
struct GuildStatus_Struct
{
/*000*/ char Name[64];
@@ -3254,7 +3291,7 @@ struct DyeStruct
struct Color_Struct secondary; // or this
}
dyes;
struct Color_Struct dye[MAX_MATERIALS];
struct Color_Struct dye[_MaterialCount];
};
};
@@ -3315,8 +3352,8 @@ struct SelectTributeReply_Struct {
struct TributeInfo_Struct {
uint32 active; //0 == inactive, 1 == active
uint32 tributes[MAX_PLAYER_TRIBUTES]; //-1 == NONE
uint32 tiers[MAX_PLAYER_TRIBUTES]; //all 00's
uint32 tributes[EmuConstants::TRIBUTE_SIZE]; //-1 == NONE
uint32 tiers[EmuConstants::TRIBUTE_SIZE]; //all 00's
uint32 tribute_master_id;
};
@@ -3425,6 +3462,7 @@ struct LevelAppearance_Struct { //Sends a little graphic on level up
uint32 value5b;
/*64*/
};
struct MerchantList {
uint32 id;
uint32 slot;
@@ -3432,7 +3470,10 @@ struct MerchantList{
int16 faction_required;
int8 level_required;
uint16 alt_currency_cost;
uint32 classes_required;
uint8 probability;
};
struct TempMerchantList {
uint32 npcid;
uint32 slot;
@@ -3480,7 +3521,7 @@ struct MobRename_Struct {
};
struct PlayMP3_Struct {
char filename[128];
char filename[0];
};
//this is for custom title display in the skill window
@@ -4423,6 +4464,14 @@ struct GuildBankPromote_Struct
/*12*/ uint32 Slot2; // Always appears to be the same as Slot for Action code 3
};
struct GuildPromoteStruct {
/*000*/ char target[64];
/*064*/ char name[64];
/*128*/ uint32 rank;
/*132*/ uint32 myrank;
/*136*/
};
struct GuildBankPermissions_Struct
{
/*00*/ uint32 Action; // 6
@@ -4870,11 +4919,28 @@ struct ItemPreview_Struct
/*026*/ uint8 unknown026[54];
};
//Not an EQ packet, just a single int for the mercenary merchant structure.
struct MercenaryGrade_Struct {
uint32 GradeCountEntry;
// Used by specific packets
struct MercenaryList_Struct {
/*0000*/ uint32 MercID; // ID unique to each type of mercenary (probably a DB id)
/*0004*/ uint32 MercType; // From dbstr_us.txt - Apprentice (330000100), Journeyman (330000200), Master (330000300)
/*0008*/ uint32 MercSubType; // From dbstr_us.txt - 330020105^23^Race: Guktan<br>Type: Healer<br>Confidence: High<br>Proficiency: Apprentice, Tier V...
/*0012*/ uint32 PurchaseCost; // Purchase Cost (in gold)
/*0016*/ uint32 UpkeepCost; // Upkeep Cost (in gold)
/*0020*/ uint32 Status; // Required Account Status (Free = 0, Silver = 1, Gold = 2) at merchants - Seen 0 (suspended) or 1 (unsuspended) on hired mercs ?
/*0024*/ uint32 AltCurrencyCost; // Alternate Currency Purchase Cost? (all seen costs show N/A Bayle Mark) - Seen 0
/*0028*/ uint32 AltCurrencyUpkeep; // Alternate Currency Upkeep Cost? (all seen costs show 1 Bayle Mark) - Seen 1
/*0032*/ uint32 AltCurrencyType; // Alternate Currency Type? - 19^17^Bayle Mark^0 - Seen 19
/*0036*/ uint8 MercUnk01; // Unknown (always see 0)
/*0037*/ int32 TimeLeft; // Unknown (always see -1 at merchant) - Seen 900000 (15 minutes in ms for newly hired merc)
/*0041*/ uint32 MerchantSlot; // Merchant Slot? Increments, but not always by 1 - May be for Merc Window Options (Seen 5, 36, 1 for active mercs)?
/*0045*/ uint32 MercUnk02; // Unknown (normally see 1, but sometimes 2 or 0)
/*0049*/ uint32 StanceCount; // Iterations of MercenaryStance_Struct - Normally 2 to 4 seen
/*0053*/ int32 MercUnk03; // Unknown (always 0 at merchant) - Seen on active merc: 93 a4 03 77, b8 ed 2f 26, 88 d5 8b c3, and 93 a4 ad 77
/*0057*/ uint8 MercUnk04; // Seen 1
/*0058*/ char MercName[1]; // Null Terminated Mercenary Name (00 at merchants)
};
// Used by MercenaryMerchantList_Struct
struct MercenaryListEntry_Struct {
/*0000*/ uint32 MercID; // ID unique to each type of mercenary (probably a DB id)
@@ -4894,7 +4960,7 @@ struct MercenaryListEntry_Struct {
/*0053*/ int32 MercUnk03; // Unknown (always 0 at merchant) - Seen on active merc: 93 a4 03 77, b8 ed 2f 26, 88 d5 8b c3, and 93 a4 ad 77
/*0057*/ uint8 MercUnk04; // Seen 1
/*0058*/ char MercName[1]; // Null Terminated Mercenary Name (00 at merchants)
/*0000*/ MercenaryStance_Struct* Stances; // Count Varies, but hard set to 5 max for now - From dbstr_us.txt - 1^24^Passive^0, 2^24^Balanced^0, etc (1 to 9 as of April 2012)
/*0000*/ MercenaryStance_Struct Stances[MAX_MERC_STANCES]; // Count Varies, but hard set to 5 max for now - From dbstr_us.txt - 1^24^Passive^0, 2^24^Balanced^0, etc (1 to 9 as of April 2012)
};
// [OPCode: 0x27ac OP_MercenaryDataResponse] On Live as of April 2 2012 [Server->Client]
@@ -4902,9 +4968,9 @@ struct MercenaryListEntry_Struct {
// Sent by the server when browsing the Mercenary Merchant
struct MercenaryMerchantList_Struct {
/*0000*/ uint32 MercTypeCount; // Number of Merc Types to follow
/*0004*/ MercenaryGrade_Struct* MercGrades; // Count varies, but hard set to 3 max for now - From dbstr_us.txt - Apprentice (330000100), Journeyman (330000200), Master (330000300)
/*0004*/ uint32 MercGrades[MAX_MERC_GRADES]; // Count varies, but hard set to 3 max for now - From dbstr_us.txt - Apprentice (330000100), Journeyman (330000200), Master (330000300)
/*0016*/ uint32 MercCount; // Number of MercenaryInfo_Struct to follow
/*0020*/ MercenaryListEntry_Struct* Mercs; // Data for individual mercenaries in the Merchant List
/*0020*/ MercenaryListEntry_Struct Mercs[MAX_MERC]; // Data for individual mercenaries in the Merchant List
};
// [OPCode: 0x4dd9 OP_MercenaryDataRequest] On Live as of April 2 2012 [Client->Server]
@@ -4934,7 +5000,7 @@ struct MercenaryData_Struct {
/*0053*/ int32 MercUnk03; // Unknown (always 0 at merchant) - Seen on active merc: 93 a4 03 77, b8 ed 2f 26, 88 d5 8b c3, and 93 a4 ad 77
/*0057*/ uint8 MercUnk04; // Seen 1
/*0058*/ char MercName[64]; // Null Terminated Mercenary Name (00 at merchants)
/*0000*/ MercenaryStance_Struct* Stances; // Count Varies, but hard set to 2 for now - From dbstr_us.txt - 1^24^Passive^0, 2^24^Balanced^0, etc (1 to 9 as of April 2012)
/*0000*/ MercenaryStance_Struct Stances[MAX_MERC_STANCES]; // Count Varies, but hard set to 2 for now - From dbstr_us.txt - 1^24^Passive^0, 2^24^Balanced^0, etc (1 to 9 as of April 2012)
/*0000*/ uint32 MercUnk05; // Seen 1 - Extra Merc Data field that differs from MercenaryListEntry_Struct
// MercUnk05 may be a field that is at the end of the packet only, even if multiple mercs are listed (haven't seen examples of multiple mercs owned at once)
};
@@ -4946,7 +5012,7 @@ struct MercenaryData_Struct {
struct MercenaryDataUpdate_Struct {
/*0000*/ int32 MercStatus; // Seen 0 with merc and -1 with no merc hired
/*0004*/ uint32 MercCount; // Seen 1 with 1 merc hired and 0 with no merc hired
/*0008*/ MercenaryData_Struct* MercData; // Data for individual mercenaries in the Merchant List
/*0008*/ MercenaryData_Struct MercData[MAX_MERC]; // Data for individual mercenaries in the Merchant List
};
// [OPCode: 0x6537] On Live as of April 2 2012 [Server->Client]
@@ -5039,7 +5105,42 @@ struct MercenaryMerchantResponse_Struct {
/*0004*/
};
struct ServerLootItem_Struct {
uint32 item_id;
int16 equipSlot;
uint8 charges;
uint16 lootslot;
uint32 aug1;
uint32 aug2;
uint32 aug3;
uint32 aug4;
uint32 aug5;
uint8 minlevel;
uint8 maxlevel;
};
//Found in client near a ref to the string:
//"Got a broadcast message for ... %s ...\n"
struct ClientMarqueeMessage_Struct {
uint32 type;
uint32 unk04; // no idea, didn't notice a change when altering it.
//According to asm the following are hard coded values: 2, 4, 5, 6, 7, 10, 12, 13, 14, 15, 16, 18, 20
//There is also a non-hardcoded fall through but to be honest i don't know enough about what it does yet
uint32 priority; //needs a better name but it does:
//opacity = (priority / 255) - floor(priority / 255)
//# of fade in/out blinks = (int)((priority - 1) / 255)
//so 510 would have 100% opacity and 1 extra blink at end
uint32 fade_in_time; //The fade in time, in ms
uint32 fade_out_time; //The fade out time, in ms
uint32 duration; //in ms
char msg[1]; //message plus null terminator
};
typedef std::list<ServerLootItem_Struct*> ItemList;
// Restore structure packing to default
#pragma pack()
#endif
+183 -133
View File
@@ -15,16 +15,26 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "debug.h"
#include "eq_packet.h"
#include "eq_stream.h"
#include "misc.h"
#include "mutex.h"
#include "op_codes.h"
#include "crc16.h"
#include "platform.h"
#include <string>
#include <iomanip>
#include <iostream>
#include <vector>
#include <time.h>
#include <sys/types.h>
#include <algorithm>
#ifdef _WINDOWS
#include <time.h>
#else
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/time.h>
@@ -33,20 +43,6 @@
#include <fcntl.h>
#include <arpa/inet.h>
#endif
#include "EQPacket.h"
#include "EQStream.h"
//#include "EQStreamFactory.h"
#include "misc.h"
#include "Mutex.h"
#include "op_codes.h"
#include "CRC16.h"
#if defined(ZONE) || defined(WORLD)
#define RETRANSMITS
#endif
#ifdef RETRANSMITS
#include "rulesys.h"
#endif
//for logsys
#define _L "%s:%d: "
@@ -65,7 +61,7 @@ void EQStream::init() {
LastAckSent=-1;
MaxSends=5;
LastPacket=0;
oversize_buffer=NULL;
oversize_buffer=nullptr;
oversize_length=0;
oversize_offset=0;
RateThreshold=RATEBASE/250;
@@ -73,14 +69,17 @@ void EQStream::init() {
BytesWritten=0;
SequencedBase = 0;
NextSequencedSend = 0;
#ifdef RETRANSMITS
if(GetExecutablePlatform() == ExePlatformWorld || GetExecutablePlatform() == ExePlatformZone) {
retransmittimer = Timer::GetCurrentTime();
retransmittimeout = 500 * RuleR(EQStream, RetransmitTimeoutMult); //use 500ms as base before we have connection stats
#endif
OpMgr = NULL;
retransmittimeout = 500 * RETRANSMIT_TIMEOUT_MULT;
}
OpMgr = nullptr;
if(uint16(SequencedBase + SequencedQueue.size()) != NextOutSeq) {
_log(NET__ERROR, _L "init Invalid Sequenced queue: BS %d + SQ %d != NOS %d" __L, SequencedBase, SequencedQueue.size(), NextOutSeq);
}
if(NextSequencedSend > SequencedQueue.size()) {
_log(NET__ERROR, _L "init Next Send Sequence is beyond the end of the queue NSS %d > SQ %d" __L, NextSequencedSend, SequencedQueue.size());
}
@@ -88,7 +87,7 @@ if(NextSequencedSend > SequencedQueue.size()) {
EQRawApplicationPacket *EQStream::MakeApplicationPacket(EQProtocolPacket *p)
{
EQRawApplicationPacket *ap=NULL;
EQRawApplicationPacket *ap=nullptr;
_log(NET__APP_CREATE, _L "Creating new application packet, length %d" __L, p->size);
_raw(NET__APP_CREATE_HEX, 0xFFFF, p);
ap = p->MakeAppPacket();
@@ -97,7 +96,7 @@ EQRawApplicationPacket *EQStream::MakeApplicationPacket(EQProtocolPacket *p)
EQRawApplicationPacket *EQStream::MakeApplicationPacket(const unsigned char *buf, uint32 len)
{
EQRawApplicationPacket *ap=NULL;
EQRawApplicationPacket *ap=nullptr;
_log(NET__APP_CREATE, _L "Creating new application packet, length %d" __L, len);
_hex(NET__APP_CREATE_HEX, buf, len);
ap = new EQRawApplicationPacket(buf, len);
@@ -117,7 +116,7 @@ EQProtocolPacket *EQStream::MakeProtocolPacket(const unsigned char *buf, uint32
void EQStream::ProcessPacket(EQProtocolPacket *p)
{
uint32 processed=0, subpacket_length=0;
if (p == NULL)
if (p == nullptr)
return;
// Raw Application packet
if (p->opcode > 0xff) {
@@ -153,7 +152,7 @@ uint32 processed=0,subpacket_length=0;
case OP_AppCombined: {
processed=0;
while(processed<p->size) {
EQRawApplicationPacket *ap=NULL;
EQRawApplicationPacket *ap=nullptr;
if ((subpacket_length=(unsigned char)*(p->pBuffer+processed))!=0xff) {
_log(NET__NET_CREATE, _L "Extracting combined app packet of length %d, short len" __L, subpacket_length);
ap=MakeApplicationPacket(p->pBuffer+processed+1,subpacket_length);
@@ -173,6 +172,11 @@ uint32 processed=0,subpacket_length=0;
break;
case OP_Packet: {
if(!p->pBuffer || (p->Size() < 4))
{
_log(NET__ERROR, _L "Received OP_Packet that was of malformed size" __L);
break;
}
uint16 seq=ntohs(*(uint16 *)(p->pBuffer));
SeqOrder check=CompareSequence(NextInSeq,seq);
if (check == SeqFuture) {
@@ -218,6 +222,11 @@ uint32 processed=0,subpacket_length=0;
break;
case OP_Fragment: {
if(!p->pBuffer || (p->Size() < 4))
{
_log(NET__ERROR, _L "Received OP_Fragment that was of malformed size" __L);
break;
}
uint16 seq=ntohs(*(uint16 *)(p->pBuffer));
SeqOrder check=CompareSequence(NextInSeq,seq);
if (check == SeqFuture) {
@@ -263,7 +272,7 @@ uint32 processed=0,subpacket_length=0;
}
}
delete[] oversize_buffer;
oversize_buffer=NULL;
oversize_buffer=nullptr;
oversize_offset=0;
}
} else {
@@ -284,12 +293,18 @@ uint32 processed=0,subpacket_length=0;
}
break;
case OP_Ack: {
if(!p->pBuffer || (p->Size() < 4))
{
_log(NET__ERROR, _L "Received OP_Ack that was of malformed size" __L);
break;
}
#ifndef COLLECTOR
uint16 seq=ntohs(*(uint16 *)(p->pBuffer));
AckPackets(seq);
#ifdef RETRANSMITS
if(GetExecutablePlatform() == ExePlatformWorld || GetExecutablePlatform() == ExePlatformZone) {
retransmittimer = Timer::GetCurrentTime();
#endif
}
#endif
}
break;
@@ -311,7 +326,7 @@ uint32 processed=0,subpacket_length=0;
break;
}
#endif
//cout << "Got OP_SessionRequest" << endl;
//std::cout << "Got OP_SessionRequest" << std::endl;
init();
OutboundQueueClear();
SessionRequest *Request=(SessionRequest *)p->pBuffer;
@@ -383,6 +398,11 @@ uint32 processed=0,subpacket_length=0;
}
break;
case OP_OutOfOrderAck: {
if(!p->pBuffer || (p->Size() < 4))
{
_log(NET__ERROR, _L "Received OP_OutOfOrderAck that was of malformed size" __L);
break;
}
#ifndef COLLECTOR
uint16 seq=ntohs(*(uint16 *)(p->pBuffer));
MOutboundQueue.lock();
@@ -390,6 +410,7 @@ uint32 processed=0,subpacket_length=0;
if(uint16(SequencedBase + SequencedQueue.size()) != NextOutSeq) {
_log(NET__ERROR, _L "Pre-OOA Invalid Sequenced queue: BS %d + SQ %d != NOS %d" __L, SequencedBase, SequencedQueue.size(), NextOutSeq);
}
if(NextSequencedSend > SequencedQueue.size()) {
_log(NET__ERROR, _L "Pre-OOA Next Send Sequence is beyond the end of the queue NSS %d > SQ %d" __L, NextSequencedSend, SequencedQueue.size());
}
@@ -397,31 +418,37 @@ if(NextSequencedSend > SequencedQueue.size()) {
if (CompareSequence(SequencedBase,seq) != SeqPast && CompareSequence(NextOutSeq,seq) == SeqPast) {
_log(NET__NET_TRACE, _L "Received OP_OutOfOrderAck for sequence %d, starting retransmit at the start of our unacked buffer (seq %d, was %d)." __L,
seq, SequencedBase, SequencedBase+NextSequencedSend);
#ifdef RETRANSMITS
if (!RuleB(EQStream, RetransmitAckedPackets)) {
#endif
bool retransmit_acked_packets = false;
if(GetExecutablePlatform() == ExePlatformWorld || GetExecutablePlatform() == ExePlatformZone) {
retransmit_acked_packets = RETRANSMIT_ACKED_PACKETS;
}
if(!retransmit_acked_packets) {
uint16 sqsize = SequencedQueue.size();
uint16 index = seq - SequencedBase;
_log(NET__NET_TRACE, _L "OP_OutOfOrderAck marking packet acked in queue (queue index = %d, queue size = %d)." __L, index, sqsize);
if (index < sqsize) {
deque<EQProtocolPacket *>::iterator sitr;
std::deque<EQProtocolPacket *>::iterator sitr;
sitr = SequencedQueue.begin();
sitr += index;
(*sitr)->acked = true;
}
#ifdef RETRANSMITS
}
if (RuleR(EQStream, RetransmitTimeoutMult)) { // only choose new behavior if multiplier is set
if(RETRANSMIT_TIMEOUT_MULT) {
retransmittimer = Timer::GetCurrentTime();
}
#endif
NextSequencedSend = 0;
} else {
_log(NET__NET_TRACE, _L "Received OP_OutOfOrderAck for out-of-window %d. Window (%d->%d)." __L, seq, SequencedBase, NextOutSeq);
}
if(uint16(SequencedBase + SequencedQueue.size()) != NextOutSeq) {
_log(NET__ERROR, _L "Post-OOA Invalid Sequenced queue: BS %d + SQ %d != NOS %d" __L, SequencedBase, SequencedQueue.size(), NextOutSeq);
}
if(NextSequencedSend > SequencedQueue.size()) {
_log(NET__ERROR, _L "Post-OOA Next Send Sequence is beyond the end of the queue NSS %d > SQ %d" __L, NextSequencedSend, SequencedQueue.size());
}
@@ -446,19 +473,21 @@ if(NextSequencedSend > SequencedQueue.size()) {
Stats->packets_sent=x;
NonSequencedPush(new EQProtocolPacket(OP_SessionStatResponse,p->pBuffer,p->size));
AdjustRates(ntohl(Stats->average_delta));
#ifdef RETRANSMITS
if (RuleR(EQStream, RetransmitTimeoutMult) && ntohl(Stats->average_delta)) {
if(GetExecutablePlatform() == ExePlatformWorld || GetExecutablePlatform() == ExePlatformZone) {
if(RETRANSMIT_TIMEOUT_MULT && ntohl(Stats->average_delta)) {
//recalculate retransmittimeout using the larger of the last rtt or average rtt, which is multiplied by the rule value
if((ntohl(Stats->last_local_delta) + ntohl(Stats->last_remote_delta)) > (ntohl(Stats->average_delta) * 2)) {
retransmittimeout = (ntohl(Stats->last_local_delta) + ntohl(Stats->last_remote_delta)) * RuleR(EQStream, RetransmitTimeoutMult);
retransmittimeout = (ntohl(Stats->last_local_delta) + ntohl(Stats->last_remote_delta))
* RETRANSMIT_TIMEOUT_MULT;
} else {
retransmittimeout = ntohl(Stats->average_delta) * 2 * RuleR(EQStream, RetransmitTimeoutMult);
retransmittimeout = ntohl(Stats->average_delta) * 2 * RETRANSMIT_TIMEOUT_MULT;
}
if(retransmittimeout > RuleI(EQStream, RetransmitTimeoutMax))
retransmittimeout = RuleI(EQStream, RetransmitTimeoutMax);
if(retransmittimeout > RETRANSMIT_TIMEOUT_MAX)
retransmittimeout = RETRANSMIT_TIMEOUT_MAX;
_log(NET__NET_TRACE, _L "Retransmit timeout recalculated to %dms" __L, retransmittimeout);
}
#endif
}
#endif
}
break;
@@ -480,24 +509,24 @@ if(NextSequencedSend > SequencedQueue.size()) {
void EQStream::QueuePacket(const EQApplicationPacket *p, bool ack_req)
{
if(p == NULL)
if(p == nullptr)
return;
EQApplicationPacket *newp = p->Copy();
if (newp != NULL)
if (newp != nullptr)
FastQueuePacket(&newp, ack_req);
}
void EQStream::FastQueuePacket(EQApplicationPacket **p, bool ack_req)
{
EQApplicationPacket *pack=*p;
*p = NULL; //clear caller's pointer.. effectively takes ownership
*p = nullptr; //clear caller's pointer.. effectively takes ownership
if(pack == NULL)
if(pack == nullptr)
return;
if(OpMgr == NULL || *OpMgr == NULL) {
if(OpMgr == nullptr || *OpMgr == nullptr) {
_log(NET__DEBUG, _L "Packet enqueued into a stream with no opcode manager, dropping." __L);
delete pack;
return;
@@ -505,17 +534,7 @@ void EQStream::FastQueuePacket(EQApplicationPacket **p, bool ack_req)
uint16 opcode = (*OpMgr)->EmuToEQ(pack->emu_opcode);
//make sure this packet is compatible with this stream
/* if(StreamType == UnknownStream || StreamType == ChatOrMailStream) {
_log(NET__DEBUG, _L "Stream type undetermined (%s), packet ignored" __L, StreamTypeString(StreamType));
return;
}
if(pack->GetPacketType() != StreamType) {
_log(NET__ERROR, _L "Trying to queue a packet of type %s into a stream of type %s, dropping it." __L, StreamTypeString(pack->GetPacketType()), StreamTypeString(StreamType));
return;
}*/
_log(NET__APP_TRACE, "Queueing %sacked packet with opcode 0x%x (%s) and length %d", ack_req?"":"non-", opcode, OpcodeManager::EmuToName(pack->emu_opcode), pack->size);
//_log(NET__APP_TRACE, "Queueing %sacked packet with opcode 0x%x (%s) and length %d", ack_req?"":"non-", opcode, OpcodeManager::EmuToName(pack->emu_opcode), pack->size);
if (!ack_req) {
NonSequencedPush(new EQProtocolPacket(opcode, pack->pBuffer, pack->size));
@@ -537,7 +556,7 @@ uint32 length;
unsigned char *tmpbuff=new unsigned char[p->size+3];
length=p->serialize(opcode, tmpbuff);
EQProtocolPacket *out=new EQProtocolPacket(OP_Fragment,NULL,MaxLen-4);
EQProtocolPacket *out=new EQProtocolPacket(OP_Fragment,nullptr,MaxLen-4);
*(uint32 *)(out->pBuffer+2)=htonl(p->Size());
used=MaxLen-10;
memcpy(out->pBuffer+6,tmpbuff,used);
@@ -546,8 +565,8 @@ uint32 length;
while (used<length) {
out=new EQProtocolPacket(OP_Fragment,NULL,MaxLen-4);
chunksize=min(length-used,MaxLen-6);
out=new EQProtocolPacket(OP_Fragment,nullptr,MaxLen-4);
chunksize=std::min(length-used,MaxLen-6);
memcpy(out->pBuffer+2,tmpbuff+used,chunksize);
out->size=chunksize+2;
SequencedPush(out);
@@ -626,16 +645,16 @@ uint16 Seq=htons(seq);
void EQStream::Write(int eq_fd)
{
queue<EQProtocolPacket *> ReadyToSend;
std::queue<EQProtocolPacket *> ReadyToSend;
bool SeqEmpty=false, NonSeqEmpty=false;
deque<EQProtocolPacket *>::iterator sitr;
std::deque<EQProtocolPacket *>::iterator sitr;
// Check our rate to make sure we can send more
MRate.lock();
int32 threshold=RateThreshold;
MRate.unlock();
if (BytesWritten > threshold) {
//cout << "Over threshold: " << BytesWritten << " > " << threshold << endl;
//std::cout << "Over threshold: " << BytesWritten << " > " << threshold << std::endl;
return;
}
@@ -649,16 +668,18 @@ deque<EQProtocolPacket *>::iterator sitr;
MOutboundQueue.lock();
// Place to hold the base packet t combine into
EQProtocolPacket *p=NULL;
EQProtocolPacket *p=nullptr;
#ifdef RETRANSMITS
if(GetExecutablePlatform() == ExePlatformWorld || GetExecutablePlatform() == ExePlatformZone) {
// if we have a timeout defined and we have not received an ack recently enough, retransmit from beginning of queue
if (RuleR(EQStream, RetransmitTimeoutMult) && !SequencedQueue.empty() && NextSequencedSend && (GetState()==ESTABLISHED) && ((retransmittimer+retransmittimeout) < Timer::GetCurrentTime())) {
_log(NET__NET_TRACE, _L "Timeout since last ack received, starting retransmit at the start of our unacked buffer (seq %d, was %d)." __L, SequencedBase, SequencedBase+NextSequencedSend);
if (RETRANSMIT_TIMEOUT_MULT && !SequencedQueue.empty() && NextSequencedSend &&
(GetState()==ESTABLISHED) && ((retransmittimer+retransmittimeout) < Timer::GetCurrentTime())) {
_log(NET__NET_TRACE, _L "Timeout since last ack received, starting retransmit at the start of our unacked "
"buffer (seq %d, was %d)." __L, SequencedBase, SequencedBase+NextSequencedSend);
NextSequencedSend = 0;
retransmittimer = Timer::GetCurrentTime(); // don't want to endlessly retransmit the first packet
}
#endif
}
// Find the next sequenced packet to send from the "queue"
sitr = SequencedQueue.begin();
@@ -682,7 +703,7 @@ deque<EQProtocolPacket *>::iterator sitr;
_log(NET__NET_COMBINE, _L "Combined packet full at len %d, next non-seq packet is len %d" __L, p->size, (NonSequencedQueue.front())->size);
ReadyToSend.push(p);
BytesWritten+=p->size;
p=NULL;
p=nullptr;
if (BytesWritten > threshold) {
// Sent enough this round, lets stop to be fair
@@ -701,39 +722,32 @@ deque<EQProtocolPacket *>::iterator sitr;
}
if (sitr!=SequencedQueue.end()) {
//_log(NET__NET_COMBINE, _L "Send Seq with %d seq packets starting at seq %d, next send %d, and %d non-seq packets." __L,
// SequencedQueue.size(), SequencedBase, NextSequencedSend, NonSequencedQueue.size());
if(uint16(SequencedBase + SequencedQueue.size()) != NextOutSeq) {
_log(NET__ERROR, _L "Pre-Send Seq NSS=%d Invalid Sequenced queue: BS %d + SQ %d != NOS %d" __L, NextSequencedSend, SequencedBase, SequencedQueue.size(), NextOutSeq);
}
if(NextSequencedSend > SequencedQueue.size()) {
_log(NET__ERROR, _L "Pre-Send Next Send Sequence is beyond the end of the queue NSS %d > SQ %d" __L, NextSequencedSend, SequencedQueue.size());
}
uint16 seq_send = SequencedBase + NextSequencedSend; //just for logging...
if(SequencedQueue.empty()) {
_log(NET__ERROR, _L "Tried to write a packet with an empty queue (%d is past next out %d)" __L, seq_send, NextOutSeq);
SeqEmpty=true;
continue;
}
/*if(CompareSequence(NextOutSeq, seq_send) == SeqFuture) {
_log(NET__ERROR, _L "Tried to write a packet beyond the end of the queue! (%d is past next out %d)" __L, seq_send, NextOutSeq);
sitr=SequencedQueue.end();
continue;
}*/
#ifdef RETRANSMITS
if (!RuleB(EQStream, RetransmitAckedPackets) && (*sitr)->acked) {
if(GetExecutablePlatform() == ExePlatformWorld || GetExecutablePlatform() == ExePlatformZone) {
if (!RETRANSMIT_ACKED_PACKETS && (*sitr)->acked) {
_log(NET__NET_TRACE, _L "Not retransmitting seq packet %d because already marked as acked" __L, seq_send);
sitr++;
NextSequencedSend++;
} else if (!p) {
#else
if (!p) {
#endif
// If we don't have a packet to try to combine into, use this one as the base
// Copy it first as it will still live until it is acked
p=(*sitr)->Copy();
_log(NET__NET_COMBINE, _L "Starting combined packet with seq packet %d of len %d" __L, seq_send, p->size);
sitr++;
++sitr;
NextSequencedSend++;
} else if (!p->combine(*sitr)) {
// Trying to combine this packet with the base didn't work (too big maybe)
@@ -741,7 +755,7 @@ continue;
_log(NET__NET_COMBINE, _L "Combined packet full at len %d, next seq packet %d is len %d" __L, p->size, seq_send, (*sitr)->size);
ReadyToSend.push(p);
BytesWritten+=p->size;
p=NULL;
p=nullptr;
if (BytesWritten > threshold) {
// Sent enough this round, lets stop to be fair
@@ -751,9 +765,38 @@ continue;
} else {
// Combine worked
_log(NET__NET_COMBINE, _L "Combined seq packet %d of len %d, yeilding %d combined." __L, seq_send, (*sitr)->size, p->size);
sitr++;
++sitr;
NextSequencedSend++;
}
} else {
if (!p) {
// If we don't have a packet to try to combine into, use this one as the base
// Copy it first as it will still live until it is acked
p=(*sitr)->Copy();
_log(NET__NET_COMBINE, _L "Starting combined packet with seq packet %d of len %d" __L, seq_send, p->size);
++sitr;
NextSequencedSend++;
} else if (!p->combine(*sitr)) {
// Trying to combine this packet with the base didn't work (too big maybe)
// So just send the base packet (we'll try this packet again later)
_log(NET__NET_COMBINE, _L "Combined packet full at len %d, next seq packet %d is len %d" __L, p->size, seq_send, (*sitr)->size);
ReadyToSend.push(p);
BytesWritten+=p->size;
p=nullptr;
if (BytesWritten > threshold) {
// Sent enough this round, lets stop to be fair
_log(NET__RATES, _L "Exceeded write threshold in seq (%d > %d)" __L, BytesWritten, threshold);
break;
}
} else {
// Combine worked
_log(NET__NET_COMBINE, _L "Combined seq packet %d of len %d, yeilding %d combined." __L, seq_send, (*sitr)->size, p->size);
++sitr;
NextSequencedSend++;
}
}
if(uint16(SequencedBase + SequencedQueue.size()) != NextOutSeq) {
_log(NET__ERROR, _L "Post send Invalid Sequenced queue: BS %d + SQ %d != NOS %d" __L, SequencedBase, SequencedQueue.size(), NextOutSeq);
}
@@ -805,15 +848,15 @@ sockaddr_in address;
address.sin_port=remote_port;
#ifdef NOWAY
uint32 ip=address.sin_addr.s_addr;
cout << "Sending to: "
std::cout << "Sending to: "
<< (int)*(unsigned char *)&ip
<< "." << (int)*((unsigned char *)&ip+1)
<< "." << (int)*((unsigned char *)&ip+2)
<< "." << (int)*((unsigned char *)&ip+3)
<< "," << (int)ntohs(address.sin_port) << "(" << p->size << ")" << endl;
<< "," << (int)ntohs(address.sin_port) << "(" << p->size << ")" << std::endl;
p->DumpRaw();
cout << "-------------" << endl;
std::cout << "-------------" << std::endl;
#endif
length=p->serialize(buffer);
if (p->opcode!=OP_SessionRequest && p->opcode!=OP_SessionResponse) {
@@ -844,7 +887,7 @@ EQProtocolPacket *EQStream::Read(int eq_fd, sockaddr_in *from)
{
int socklen;
int length=0;
EQProtocolPacket *p=NULL;
EQProtocolPacket *p=nullptr;
char temp[15];
socklen=sizeof(sockaddr);
@@ -864,7 +907,7 @@ char temp[15];
*((unsigned char *)&ip+2),
*((unsigned char *)&ip+3),
ntohs(from->sin_port));
//cout << timestamp() << "Data from: " << temp << " OpCode 0x" << hex << setw(2) << setfill('0') << (int)p->opcode << dec << endl;
//std::cout << timestamp() << "Data from: " << temp << " OpCode 0x" << std::hex << std::setw(2) << std::setfill('0') << (int)p->opcode << std::dec << std::endl;
//dump_message(p->pBuffer,p->size,timestamp());
}
@@ -873,7 +916,7 @@ char temp[15];
void EQStream::SendSessionResponse()
{
EQProtocolPacket *out=new EQProtocolPacket(OP_SessionResponse,NULL,sizeof(SessionResponse));
EQProtocolPacket *out=new EQProtocolPacket(OP_SessionResponse,nullptr,sizeof(SessionResponse));
SessionResponse *Response=(SessionResponse *)out->pBuffer;
Response->Session=htonl(Session);
Response->MaxLength=htonl(MaxLen);
@@ -895,10 +938,10 @@ EQProtocolPacket *out=new EQProtocolPacket(OP_SessionResponse,NULL,sizeof(Sessio
void EQStream::SendSessionRequest()
{
EQProtocolPacket *out=new EQProtocolPacket(OP_SessionRequest,NULL,sizeof(SessionRequest));
EQProtocolPacket *out=new EQProtocolPacket(OP_SessionRequest,nullptr,sizeof(SessionRequest));
SessionRequest *Request=(SessionRequest *)out->pBuffer;
memset(Request,0,sizeof(SessionRequest));
Request->Session=htonl(time(NULL));
Request->Session=htonl(time(nullptr));
Request->MaxLength=htonl(512);
_log(NET__NET_TRACE, _L "Sending OP_SessionRequest: session %lu, maxlen=%d" __L, (unsigned long)ntohl(Request->Session), ntohl(Request->MaxLength));
@@ -911,7 +954,7 @@ void EQStream::_SendDisconnect()
if(GetState() == CLOSED)
return;
EQProtocolPacket *out=new EQProtocolPacket(OP_SessionDisconnect,NULL,sizeof(uint32));
EQProtocolPacket *out=new EQProtocolPacket(OP_SessionDisconnect,nullptr,sizeof(uint32));
*(uint32 *)out->pBuffer=htonl(Session);
NonSequencedPush(out);
@@ -927,11 +970,11 @@ void EQStream::InboundQueuePush(EQRawApplicationPacket *p)
EQApplicationPacket *EQStream::PopPacket()
{
EQRawApplicationPacket *p=NULL;
EQRawApplicationPacket *p=nullptr;
MInboundQueue.lock();
if (InboundQueue.size()) {
vector<EQRawApplicationPacket *>::iterator itr=InboundQueue.begin();
std::vector<EQRawApplicationPacket *>::iterator itr=InboundQueue.begin();
p=*itr;
InboundQueue.erase(itr);
}
@@ -939,11 +982,11 @@ EQRawApplicationPacket *p=NULL;
//resolve the opcode if we can.
if(p) {
if(OpMgr != NULL && *OpMgr != NULL) {
if(OpMgr != nullptr && *OpMgr != nullptr) {
EmuOpcode emu_op = (*OpMgr)->EQToEmu(p->opcode);
#if EQDEBUG >= 4
if(emu_op == OP_Unknown) {
LogFile->write(EQEMuLog::Debug, "Unable to convert EQ opcode 0x%.4x to an Application opcode.", p->opcode);
_log(NET__ERROR, "Unable to convert EQ opcode 0x%.4x to an Application opcode.", p->opcode);
}
#endif
p->SetOpcode(emu_op);
@@ -955,11 +998,11 @@ EQRawApplicationPacket *p=NULL;
EQRawApplicationPacket *EQStream::PopRawPacket()
{
EQRawApplicationPacket *p=NULL;
EQRawApplicationPacket *p=nullptr;
MInboundQueue.lock();
if (InboundQueue.size()) {
vector<EQRawApplicationPacket *>::iterator itr=InboundQueue.begin();
std::vector<EQRawApplicationPacket *>::iterator itr=InboundQueue.begin();
p=*itr;
InboundQueue.erase(itr);
}
@@ -967,7 +1010,7 @@ EQRawApplicationPacket *p=NULL;
//resolve the opcode if we can.
if(p) {
if(OpMgr != NULL && *OpMgr != NULL) {
if(OpMgr != nullptr && *OpMgr != nullptr) {
EmuOpcode emu_op = (*OpMgr)->EQToEmu(p->opcode);
#if EQDEBUG >= 4
if(emu_op == OP_Unknown) {
@@ -983,11 +1026,11 @@ EQRawApplicationPacket *p=NULL;
EQRawApplicationPacket *EQStream::PeekPacket()
{
EQRawApplicationPacket *p=NULL;
EQRawApplicationPacket *p=nullptr;
MInboundQueue.lock();
if (InboundQueue.size()) {
vector<EQRawApplicationPacket *>::iterator itr=InboundQueue.begin();
std::vector<EQRawApplicationPacket *>::iterator itr=InboundQueue.begin();
p=*itr;
}
MInboundQueue.unlock();
@@ -997,14 +1040,14 @@ EQRawApplicationPacket *p=NULL;
void EQStream::InboundQueueClear()
{
EQApplicationPacket *p=NULL;
EQApplicationPacket *p=nullptr;
_log(NET__APP_TRACE, _L "Clearing inbound queue" __L);
MInboundQueue.lock();
if (!InboundQueue.empty()) {
vector<EQRawApplicationPacket *>::iterator itr;
for(itr=InboundQueue.begin();itr!=InboundQueue.end();itr++) {
std::vector<EQRawApplicationPacket *>::iterator itr;
for(itr=InboundQueue.begin();itr!=InboundQueue.end();++itr) {
p=*itr;
delete p;
}
@@ -1040,7 +1083,7 @@ bool flag;
void EQStream::OutboundQueueClear()
{
EQProtocolPacket *p=NULL;
EQProtocolPacket *p=nullptr;
_log(NET__APP_TRACE, _L "Clearing outbound queue" __L);
@@ -1050,8 +1093,8 @@ EQProtocolPacket *p=NULL;
NonSequencedQueue.pop();
}
if(!SequencedQueue.empty()) {
deque<EQProtocolPacket *>::iterator itr;
for(itr=SequencedQueue.begin();itr!=SequencedQueue.end();itr++) {
std::deque<EQProtocolPacket *>::iterator itr;
for(itr=SequencedQueue.begin();itr!=SequencedQueue.end();++itr) {
p=*itr;
delete p;
}
@@ -1070,13 +1113,13 @@ if(NextSequencedSend > SequencedQueue.size()) {
void EQStream::PacketQueueClear()
{
EQProtocolPacket *p=NULL;
EQProtocolPacket *p=nullptr;
_log(NET__APP_TRACE, _L "Clearing future packet queue" __L);
if(!PacketQueue.empty()) {
map<unsigned short,EQProtocolPacket *>::iterator itr;
for(itr=PacketQueue.begin();itr!=PacketQueue.end();itr++) {
std::map<unsigned short,EQProtocolPacket *>::iterator itr;
for(itr=PacketQueue.begin();itr!=PacketQueue.end();++itr) {
p=itr->second;
delete p;
}
@@ -1129,7 +1172,7 @@ long EQStream::GetLastAckSent()
void EQStream::AckPackets(uint16 seq)
{
deque<EQProtocolPacket *>::iterator itr, tmp;
std::deque<EQProtocolPacket *>::iterator itr, tmp;
MOutboundQueue.lock();
//do a bit of sanity checking.
@@ -1203,8 +1246,8 @@ void EQStream::ProcessQueue()
return;
}
EQProtocolPacket *qp=NULL;
while((qp=RemoveQueue(NextInSeq))!=NULL) {
EQProtocolPacket *qp=nullptr;
while((qp=RemoveQueue(NextInSeq))!=nullptr) {
_log(NET__DEBUG, _L "Processing Queued Packet: Seq=%d" __L, NextInSeq);
ProcessPacket(qp);
delete qp;
@@ -1214,8 +1257,8 @@ void EQStream::ProcessQueue()
EQProtocolPacket *EQStream::RemoveQueue(uint16 seq)
{
map<unsigned short,EQProtocolPacket *>::iterator itr;
EQProtocolPacket *qp=NULL;
std::map<unsigned short,EQProtocolPacket *>::iterator itr;
EQProtocolPacket *qp=nullptr;
if ((itr=PacketQueue.find(seq))!=PacketQueue.end()) {
qp=itr->second;
PacketQueue.erase(itr);
@@ -1336,6 +1379,9 @@ void EQStream::CheckTimeout(uint32 now, uint32 timeout) {
_log(NET__DEBUG, _L "Timeout expired in established state. Closing connection." __L);
_SendDisconnect();
SetState(DISCONNECTING);
break;
default:
break;
}
}
}
@@ -1354,20 +1400,27 @@ void EQStream::Decay()
void EQStream::AdjustRates(uint32 average_delta)
{
#ifdef RETRANSMITS
if (average_delta && (average_delta <= RuleI(EQStream, AverageDeltaMax))) {
#else
if (average_delta) {
#endif
if(GetExecutablePlatform() == ExePlatformWorld || GetExecutablePlatform() == ExePlatformZone) {
if (average_delta && (average_delta <= AVERAGE_DELTA_MAX)) {
MRate.lock();
RateThreshold=RATEBASE/average_delta;
DecayRate=DECAYBASE/average_delta;
_log(NET__RATES, _L "Adjusting data rate to thresh %d, decay %d based on avg delta %d" __L, RateThreshold, DecayRate, average_delta);
_log(NET__RATES, _L "Adjusting data rate to thresh %d, decay %d based on avg delta %d" __L,
RateThreshold, DecayRate, average_delta);
MRate.unlock();
#ifdef RETRANSMITS
} else {
_log(NET__RATES, _L "Not adjusting data rate because avg delta over max (%d > %d)" __L, average_delta, RuleI(EQStream, AverageDeltaMax));
#endif
_log(NET__RATES, _L "Not adjusting data rate because avg delta over max (%d > %d)" __L,
average_delta, AVERAGE_DELTA_MAX);
}
} else {
if (average_delta) {
MRate.lock();
RateThreshold=RATEBASE/average_delta;
DecayRate=DECAYBASE/average_delta;
_log(NET__RATES, _L "Adjusting data rate to thresh %d, decay %d based on avg delta %d" __L,
RateThreshold, DecayRate, average_delta);
MRate.unlock();
}
}
}
@@ -1388,7 +1441,7 @@ void EQStream::Close() {
//this could be expanded to check more than the fitst opcode if
//we needed more complex matching
EQStream::MatchState EQStream::CheckSignature(const Signature *sig) {
EQRawApplicationPacket *p = NULL;
EQRawApplicationPacket *p = nullptr;
MatchState res = MatchNotReady;
MInboundQueue.lock();
@@ -1399,10 +1452,10 @@ EQStream::MatchState EQStream::CheckSignature(const Signature *sig) {
if(InboundQueue.size() > 1) {
p = InboundQueue[1];
} else {
p = NULL;
p = nullptr;
}
}
if(p == NULL) {
if(p == nullptr) {
//first opcode is ignored, and nothing else remains... keep waiting
} else if(p->opcode == sig->first_eq_opcode) {
//opcode matches, check length..
@@ -1428,6 +1481,3 @@ EQStream::MatchState EQStream::CheckSignature(const Signature *sig) {
return(res);
}

Some files were not shown because too many files have changed in this diff Show More