mirror of
https://github.com/EQEmu/Server.git
synced 2026-05-31 13:16:39 +00:00
Compare commits
386 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7c3481daf9 | |||
| b93dec357f | |||
| 2f4af4f0c2 | |||
| a0f2a8a743 | |||
| 4c7016bd7b | |||
| 6c18cd0bee | |||
| 87e63e1e36 | |||
| a771882cff | |||
| b3f6a8c55f | |||
| 605502cd9d | |||
| 4712ca471b | |||
| 836c3d6596 | |||
| 53169ae217 | |||
| fd31915fae | |||
| 52763b6dd2 | |||
| 51cd43b4ea | |||
| 2db84f5a4f | |||
| 79cc2d5351 | |||
| d31cb09214 | |||
| 8bedcd8751 | |||
| 473c5096f6 | |||
| 0b181d5048 | |||
| a7e9af2d27 | |||
| 7a72d5d67e | |||
| 25872203ff | |||
| 6396a6fbef | |||
| 6db0a5c3f0 | |||
| 4fa9e1d66f | |||
| 556af8c5e9 | |||
| f3ef8a0993 | |||
| 267c280db8 | |||
| e06c7d7735 | |||
| 028ebc3a0c | |||
| b3bd44cd76 | |||
| 75a627a3a2 | |||
| 0194aedc92 | |||
| 5cc87cbda7 | |||
| 703862d977 | |||
| 6e325c1ee3 | |||
| 933b83add6 | |||
| b3cd4e63f1 | |||
| 3c894cb533 | |||
| b19ad64800 | |||
| 2cd3d27c67 | |||
| d3b46becd0 | |||
| 286479198f | |||
| 21ec832ca6 | |||
| bdf5f8b4a3 | |||
| 4ca6485398 | |||
| 0c9c2e25c1 | |||
| 7e651877c7 | |||
| 9739c1c8ef | |||
| 8aae59eebe | |||
| c1b07afae9 | |||
| 9c238cd08d | |||
| 33adb9bcc1 | |||
| 2e8bf82861 | |||
| 4d118ab978 | |||
| fcb40daaf1 | |||
| 553bafdbe1 | |||
| d0443db199 | |||
| 9206163190 | |||
| e504482b94 | |||
| 77b88e3dec | |||
| aeeb350068 | |||
| df83113cea | |||
| 940abfaf7a | |||
| a46443b95e | |||
| 871f320311 | |||
| a222128599 | |||
| 45b249e33d | |||
| c24834de5d | |||
| 841d7f2700 | |||
| 56c29154f0 | |||
| 6466c2ff21 | |||
| 16dc210cd8 | |||
| 77045f558e | |||
| e1fa2d5bc5 | |||
| b03f52de18 | |||
| 226cc3d6cb | |||
| 7f54e26dec | |||
| 11a81d8e8a | |||
| e719aa43cf | |||
| 22994e3264 | |||
| cfbdecad19 | |||
| 2427f7e034 | |||
| 9a6403b196 | |||
| d8953c5156 | |||
| 33b40e83b7 | |||
| e75c31d524 | |||
| cf1f8d5460 | |||
| 690cacdaab | |||
| f9f45eedcd | |||
| 93ddffa57f | |||
| c9993fb698 | |||
| aa0fbb8b45 | |||
| 62532c6bdd | |||
| f8c3c03185 | |||
| 692a90f3f0 | |||
| 3a49d851ca | |||
| fdc5c27061 | |||
| 56be69ddb1 | |||
| 9477ff72ac | |||
| 6d8e80b1e5 | |||
| ebeaef598b | |||
| 60b65da7f2 | |||
| 100e6698ea | |||
| 2bd94ab7a2 | |||
| 4c8d68c24b | |||
| 1755678b1f | |||
| 39e2763968 | |||
| f7780b0247 | |||
| c0fe0f11f7 | |||
| a1f1f11940 | |||
| 4c5013e09e | |||
| 838ffbd8c7 | |||
| 42b41d973c | |||
| e7761133a9 | |||
| 93f2bea96e | |||
| ded82ac6d6 | |||
| 6ef182edfd | |||
| e466ca1c6d | |||
| fa5a3155fe | |||
| a20d333f9d | |||
| 853739b538 | |||
| 6094ec9c7b | |||
| 9da1d6b397 | |||
| 8ea7299a57 | |||
| 0811a899d1 | |||
| fad9599642 | |||
| 62711b13d8 | |||
| 2702485206 | |||
| 0aadb891a1 | |||
| d812310c5b | |||
| 1420983700 | |||
| d25cc35f1b | |||
| ed7f395612 | |||
| 8dceb20dd8 | |||
| 6929d180ca | |||
| 011a66a75e | |||
| 07120563a2 | |||
| cc985cbcd5 | |||
| 97caa79472 | |||
| cfa575c756 | |||
| 85063249b4 | |||
| 04d6f8feea | |||
| dfc1bf0381 | |||
| 2237c3a056 | |||
| 4af191c593 | |||
| 0a3972deb9 | |||
| 9d2f258390 | |||
| 0b452f4ec1 | |||
| fef629e1df | |||
| a5a51fbe44 | |||
| 47db92cdb6 | |||
| 690301e80d | |||
| 1887e48b76 | |||
| af2691eb12 | |||
| 2df4289588 | |||
| 49d4d0acc3 | |||
| 5a663910a5 | |||
| b027edd21e | |||
| 0bbfcf7adc | |||
| 7962a0bd38 | |||
| 4d9b51df0a | |||
| 508ecec6ea | |||
| f0c6fa2a26 | |||
| ad6dbb7beb | |||
| 6ddbb41617 | |||
| 8a558f6a29 | |||
| 0585be0360 | |||
| 6927baef7f | |||
| 52d64781b5 | |||
| 0667fe435f | |||
| 9959070f24 | |||
| 2a91f08845 | |||
| adc64005f1 | |||
| 605480f1c4 | |||
| 3b95601c62 | |||
| a4f2ed28f1 | |||
| e19b969541 | |||
| 4241556f75 | |||
| 961332b40c | |||
| a1a861e0c4 | |||
| 4bbb1aa92f | |||
| 1212ccefef | |||
| c203fec9b4 | |||
| 16ab1839e8 | |||
| f5e4c6a127 | |||
| 166c87c931 | |||
| 345dd442dd | |||
| 565baec675 | |||
| 9884c442e9 | |||
| ad0b5d6a1c | |||
| b82b32e1d2 | |||
| 2fb72e5729 | |||
| 3791bc788f | |||
| 833fa55fdf | |||
| 4fc3c27715 | |||
| cea3ad6a42 | |||
| d8926cd5f3 | |||
| efb03164c7 | |||
| 455eb2e6d9 | |||
| b5b0e53da2 | |||
| 68cb94b39c | |||
| 3d95b6c184 | |||
| 7db7631308 | |||
| f053cd3b56 | |||
| cf27f2bc88 | |||
| 79918ebaba | |||
| 2a648507f2 | |||
| f395ee0508 | |||
| 7166fcc650 | |||
| ae8e58ddc5 | |||
| 26e72c6857 | |||
| df1d740ae6 | |||
| d7e810232a | |||
| 9b992167f0 | |||
| 65d4533568 | |||
| eb545a18a4 | |||
| f2f0228aa4 | |||
| 06337fe762 | |||
| 604c7ad4ab | |||
| bab16771aa | |||
| d3a414a048 | |||
| e85a8db8c4 | |||
| 12cc3c90ea | |||
| 9c656bc498 | |||
| bc337979bb | |||
| a64425ebe6 | |||
| ca933fce45 | |||
| 9c3498b431 | |||
| d7e09a1f3b | |||
| 1652e7a976 | |||
| 37dda9bf41 | |||
| a2b78ff4e6 | |||
| 79a3ce8d7e | |||
| d857fb3c48 | |||
| 2b4cd292e4 | |||
| 3b7cfa6454 | |||
| c5fa7e28c8 | |||
| 5d133a2b47 | |||
| 7122ac33b2 | |||
| c47644ea46 | |||
| a61f951d0e | |||
| 4357b8c731 | |||
| 9cbe25f712 | |||
| c14a17e4de | |||
| ab04a4c6df | |||
| c0cf9bb5aa | |||
| b5d23389ee | |||
| dc35ab5251 | |||
| 9cbfd5c8f0 | |||
| 5631a0711f | |||
| 00e02b61ca | |||
| 108397b138 | |||
| 9a07142a9b | |||
| 919a92bda3 | |||
| 140aba9f69 | |||
| c3d41e08f4 | |||
| 5d6a1aad50 | |||
| af91b2b41c | |||
| 2660aa79ab | |||
| 730738faf9 | |||
| 2bb7bba724 | |||
| e93081dde0 | |||
| 3a46bf7383 | |||
| aa6421afdf | |||
| 6a7eaae122 | |||
| 714b474d2c | |||
| e24d82f0fe | |||
| 33a375677e | |||
| 8fce86c396 | |||
| 68b40f0239 | |||
| 2dc2bac456 | |||
| 00a8a0cf88 | |||
| 5a466da96c | |||
| de4f5ae491 | |||
| fb20d92166 | |||
| 6cff433d23 | |||
| 2da7ddad57 | |||
| 55161e18c8 | |||
| 063d4fbd1a | |||
| c25cb0cc23 | |||
| ddac326239 | |||
| 14fe396510 | |||
| c968a0acdc | |||
| 8c4cd34e01 | |||
| 0dbcf83a11 | |||
| a75648f73f | |||
| 6c2886a71d | |||
| 1d96ddb60d | |||
| c30074be66 | |||
| b5652e6010 | |||
| 202d2ed496 | |||
| 81cee49ea1 | |||
| 2d61cd2b9a | |||
| b06505b80a | |||
| 4c2f9a4423 | |||
| fb3159b657 | |||
| 8ebf5bbb78 | |||
| d2aae4d79c | |||
| f9dc9da42b | |||
| 3f3bbe98b5 | |||
| 59537ae977 | |||
| ee45a28efe | |||
| 70ce81fb0a | |||
| e06d28ad20 | |||
| d57489781c | |||
| 21d65c73b7 | |||
| 8f6d606f53 | |||
| f25e37d0c5 | |||
| e55f9b9d27 | |||
| b01486d767 | |||
| 50ce99ce3e | |||
| 4854201b2a | |||
| c81d05940a | |||
| 47be17e2af | |||
| 809b3b6099 | |||
| f06c7e8834 | |||
| 096448d23c | |||
| e55fb1cafd | |||
| d4962bb2ab | |||
| 98e56bdfe9 | |||
| 5c1be3643e | |||
| c2fa61b3a2 | |||
| 01a1186e63 | |||
| 7427318213 | |||
| d3c3d7b384 | |||
| e9e8143778 | |||
| bc71997518 | |||
| 4a9a9fa197 | |||
| ee14aed8de | |||
| 2717fcc339 | |||
| dc28c8d485 | |||
| a633784f78 | |||
| 5519c3e781 | |||
| 9401323708 | |||
| 251993c61b | |||
| 728ce0c519 | |||
| 6a80bcecc7 | |||
| 6324e3687a | |||
| d16ac99033 | |||
| e12368f002 | |||
| a13fa07e68 | |||
| 7873ad3771 | |||
| dfadc237e5 | |||
| a1f2764978 | |||
| 927d379e75 | |||
| a1f154749c | |||
| 42a2e19e73 | |||
| c56b2e3e03 | |||
| b05f1d3218 | |||
| a004924112 | |||
| 8d986c95cd | |||
| ef7a3cae17 | |||
| 050aba65b6 | |||
| 9154c90418 | |||
| d558f9ece2 | |||
| 327dacdbe1 | |||
| f2ff4245c0 | |||
| 3ceb743195 | |||
| 021f04c17d | |||
| f7e2dbdce6 | |||
| 2a679f1002 | |||
| 8c9849ec73 | |||
| 10086ce97c | |||
| 223ae22f73 | |||
| 4330494f57 | |||
| 64ae7e4529 | |||
| 58c3e267e1 | |||
| 598483a1a4 | |||
| c1122022b9 | |||
| f2c4babd8d | |||
| 5249b065d3 | |||
| 9312261444 | |||
| 85054fedf8 | |||
| 6d7beb1796 | |||
| 66e377fd4a | |||
| 67c4c26f70 | |||
| b1c8e3890a | |||
| d6e06a19a7 | |||
| 4092b3a2cb | |||
| f4f0619618 | |||
| 71ca7f9b39 | |||
| 5fcc83b4b6 |
+1
-1
@@ -15,7 +15,7 @@ volumes:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Build Linux X64
|
- name: Build Linux X64
|
||||||
image: akkadius/eqemu-server:v11
|
image: akkadius/eqemu-server:v14
|
||||||
environment:
|
environment:
|
||||||
GITHUB_TOKEN:
|
GITHUB_TOKEN:
|
||||||
from_secret: GH_RELEASE_GITHUB_API_TOKEN
|
from_secret: GH_RELEASE_GITHUB_API_TOKEN
|
||||||
|
|||||||
+989
@@ -1,3 +1,992 @@
|
|||||||
|
## [22.39.1] - 12/31/2023
|
||||||
|
|
||||||
|
### Code
|
||||||
|
|
||||||
|
* Appearance not appearence ([#3819](https://github.com/EQEmu/Server/pull/3819)) @Kinglykrab 2023-12-30
|
||||||
|
* Delete errmsg.h in common and zone ([#3821](https://github.com/EQEmu/Server/pull/3821)) @Kinglykrab 2023-12-30
|
||||||
|
* Gender constants cleanup ([#3817](https://github.com/EQEmu/Server/pull/3817)) @Kinglykrab 2023-12-30
|
||||||
|
* Remove MakeSpawnUpdateNoDelta from mob.cpp/mob.h ([#3816](https://github.com/EQEmu/Server/pull/3816)) @Kinglykrab 2023-12-31
|
||||||
|
* Remove SendStunAppearance from mob.cpp/mob.h ([#3818](https://github.com/EQEmu/Server/pull/3818)) @Kinglykrab 2023-12-31
|
||||||
|
* Remove unused PlotPosition methods from mob.cpp/mob.h ([#3820](https://github.com/EQEmu/Server/pull/3820)) @Kinglykrab 2023-12-31
|
||||||
|
|
||||||
|
### Database
|
||||||
|
|
||||||
|
* Database update improvements, content db and terminal checks ([#3814](https://github.com/EQEmu/Server/pull/3814)) @Akkadius 2023-12-31
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Client:SetBucket Overload Incorrectly Named ([#3825](https://github.com/EQEmu/Server/pull/3825)) @fryguy503 2023-12-30
|
||||||
|
* Fix crash in Client::Handle_OP_GMGoto ([#3832](https://github.com/EQEmu/Server/pull/3832)) @Kinglykrab 2023-12-31
|
||||||
|
|
||||||
|
### Quest API
|
||||||
|
|
||||||
|
* Add HasItemOnCorpse() to Perl/Lua ([#3824](https://github.com/EQEmu/Server/pull/3824)) @Kinglykrab 2023-12-31
|
||||||
|
* Fix issue with death events. ([#3823](https://github.com/EQEmu/Server/pull/3823)) @Kinglykrab 2023-12-31
|
||||||
|
|
||||||
|
### Repositories
|
||||||
|
|
||||||
|
* Protected extended repositories from being overwritten if exists ([#3815](https://github.com/EQEmu/Server/pull/3815)) @Akkadius 2023-12-31
|
||||||
|
|
||||||
|
## [22.39.0] - 12/27/2023
|
||||||
|
|
||||||
|
### Character
|
||||||
|
|
||||||
|
* Fix character copier due to schema change ([#3805](https://github.com/EQEmu/Server/pull/3805)) @Akkadius 2023-12-28
|
||||||
|
|
||||||
|
### Combat
|
||||||
|
|
||||||
|
* Disarm was not dropping item to ground due to bug ([#3811](https://github.com/EQEmu/Server/pull/3811)) @noudess 2023-12-27
|
||||||
|
|
||||||
|
### Logs
|
||||||
|
|
||||||
|
* Bulk insert new log settings ([#3810](https://github.com/EQEmu/Server/pull/3810)) @Akkadius 2023-12-28
|
||||||
|
* Reclassify unhelpful Info message ([#3809](https://github.com/EQEmu/Server/pull/3809)) @Akkadius 2023-12-28
|
||||||
|
|
||||||
|
### MySQL
|
||||||
|
|
||||||
|
* Fix MySQL Query error formatting ([#3808](https://github.com/EQEmu/Server/pull/3808)) @Akkadius 2023-12-28
|
||||||
|
|
||||||
|
### Objects
|
||||||
|
|
||||||
|
* Remove "No objects to load for zone" error message ([#3807](https://github.com/EQEmu/Server/pull/3807)) @Akkadius 2023-12-28
|
||||||
|
|
||||||
|
### Player Events
|
||||||
|
|
||||||
|
* Bulk replace settings on boot ([#3806](https://github.com/EQEmu/Server/pull/3806)) @Akkadius 2023-12-28
|
||||||
|
|
||||||
|
### Tasks
|
||||||
|
|
||||||
|
* Add enabled column ([#3804](https://github.com/EQEmu/Server/pull/3804)) @Akkadius 2023-12-28
|
||||||
|
|
||||||
|
## [22.38.0] - 12/26/2023
|
||||||
|
|
||||||
|
### Bots
|
||||||
|
|
||||||
|
* Remove unnecessary error on SetItemReuse ([#3795](https://github.com/EQEmu/Server/pull/3795)) @nytmyr 2023-12-20
|
||||||
|
|
||||||
|
### Code
|
||||||
|
|
||||||
|
* Consolidate GetHateRandom(), GetHateRandomBot(), GetHateRandomClient(), and GetHateRandomNPC() ([#3794](https://github.com/EQEmu/Server/pull/3794)) @Kinglykrab 2023-12-25
|
||||||
|
* Race constants refactor ([#3782](https://github.com/EQEmu/Server/pull/3782)) @Akkadius 2023-12-23
|
||||||
|
|
||||||
|
### Database
|
||||||
|
|
||||||
|
* Fix issue with saylinks query in MySQL 8.0+ ([#3800](https://github.com/EQEmu/Server/pull/3800)) @Akkadius 2023-12-24
|
||||||
|
* Update faction mods with Live data ([#3799](https://github.com/EQEmu/Server/pull/3799)) @joligario 2023-12-23
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Disable Hide/Improved Hide on Trap damage ([#3791](https://github.com/EQEmu/Server/pull/3791)) @Kinglykrab 2023-12-19
|
||||||
|
* Fix Bard Invisibility Songs breaking every 4 ticks ([#3783](https://github.com/EQEmu/Server/pull/3783)) @Kinglykrab 2023-12-19
|
||||||
|
* Fix can_riposte parameter in DoMeleeSkillAttackDmg ([#3792](https://github.com/EQEmu/Server/pull/3792)) @Kinglykrab 2023-12-19
|
||||||
|
|
||||||
|
### Forage
|
||||||
|
|
||||||
|
* Add a rule to disabled using common_food_ids from the list in forage.cpp. currently set to enabled. ([#3796](https://github.com/EQEmu/Server/pull/3796)) @regneq 2023-12-22
|
||||||
|
|
||||||
|
### NPC
|
||||||
|
|
||||||
|
* Support for multiple emotes per type, emote variables ([#3801](https://github.com/EQEmu/Server/pull/3801)) @regneq 2023-12-25
|
||||||
|
|
||||||
|
### Quest API
|
||||||
|
|
||||||
|
* Add GetHateTopBot(), GetHateTopClient(), and GetHateTopNPC() to Perl/Lua ([#3793](https://github.com/EQEmu/Server/pull/3793)) @Kinglykrab 2023-12-22
|
||||||
|
* Add SummonItemIntoInventory() to Perl/Lua ([#3797](https://github.com/EQEmu/Server/pull/3797)) @Kinglykrab 2023-12-22
|
||||||
|
|
||||||
|
### Repositories
|
||||||
|
|
||||||
|
* Add ReplaceOne and ReplaceMany ([#3802](https://github.com/EQEmu/Server/pull/3802)) @Akkadius 2023-12-26
|
||||||
|
|
||||||
|
## [22.37.0] - 12/18/2023
|
||||||
|
|
||||||
|
### Bots
|
||||||
|
|
||||||
|
* Add ScanCloseMobs support to fix AEs ([#3786](https://github.com/EQEmu/Server/pull/3786)) @nytmyr 2023-12-18
|
||||||
|
* Expand ^itemuse options ([#3756](https://github.com/EQEmu/Server/pull/3756)) @nytmyr 2023-12-17
|
||||||
|
* Fix ^defensive from checking aggressive disciplines. ([#3787](https://github.com/EQEmu/Server/pull/3787)) @nytmyr 2023-12-18
|
||||||
|
* Fix ^oo autodefend from sending bots/pets to invalid haters ([#3772](https://github.com/EQEmu/Server/pull/3772)) @nytmyr 2023-12-16
|
||||||
|
* Fix unnecessary failed to save timer error ([#3788](https://github.com/EQEmu/Server/pull/3788)) @nytmyr 2023-12-18
|
||||||
|
* [Quest API] Add ^clickitem, ^timer, fix GetBestBotSpellForCure ([#3755](https://github.com/EQEmu/Server/pull/3755)) @nytmyr 2023-12-17
|
||||||
|
|
||||||
|
### CI
|
||||||
|
|
||||||
|
* Switch to use clang for Linux builds (speed) ([#3777](https://github.com/EQEmu/Server/pull/3777)) @Akkadius 2023-12-17
|
||||||
|
|
||||||
|
### Compilation
|
||||||
|
|
||||||
|
* Use pre-compiled headers for Windows (speed) ([#3778](https://github.com/EQEmu/Server/pull/3778)) @Akkadius 2023-12-18
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Drop Invisibility when hit by traps ([#3785](https://github.com/EQEmu/Server/pull/3785)) @Kinglykrab 2023-12-18
|
||||||
|
* Fix NPCs routing to 0.0, 0.0 on #summon ([#3780](https://github.com/EQEmu/Server/pull/3780)) @Kinglykrab 2023-12-18
|
||||||
|
* Fix bad merge @Akkadius 2023-12-17
|
||||||
|
* Fix issue with HOTBonusHealingSplitOverDuration Rule ([#3776](https://github.com/EQEmu/Server/pull/3776)) @Kinglykrab 2023-12-17
|
||||||
|
* Fixed the discrepacy with time using command #time and in quests. ([#3767](https://github.com/EQEmu/Server/pull/3767)) @regneq 2023-12-17
|
||||||
|
* Send Entity ID in Death Events to resolve #3721 ([#3779](https://github.com/EQEmu/Server/pull/3779)) @Kinglykrab 2023-12-18
|
||||||
|
|
||||||
|
### Quest API
|
||||||
|
|
||||||
|
* Add EVENT_ALT_CURRENCY_GAIN and EVENT_ALT_CURRENCY_LOSS to Perl/Lua ([#3734](https://github.com/EQEmu/Server/pull/3734)) @Kinglykrab 2023-12-17
|
||||||
|
* Add EVENT_CRYSTAL_GAIN and EVENT_CRYSTAL_LOSS to Perl/Lua ([#3735](https://github.com/EQEmu/Server/pull/3735)) @Kinglykrab 2023-12-17
|
||||||
|
* Add EVENT_LDON_POINTS_GAIN and EVENT_LDON_POINTS_LOSS to Perl/Lua ([#3742](https://github.com/EQEmu/Server/pull/3742)) @Kinglykrab 2023-12-17
|
||||||
|
* Add EVENT_LEVEL_UP and EVENT_LEVEL_DOWN to Bots ([#3750](https://github.com/EQEmu/Server/pull/3750)) @Kinglykrab 2023-12-17
|
||||||
|
* Add EVENT_LOOT_ADDED to Perl/Lua ([#3739](https://github.com/EQEmu/Server/pull/3739)) @Kinglykrab 2023-12-17
|
||||||
|
* Add GetNPCAggro() and SetNPCAggro() to Perl/Lua ([#3781](https://github.com/EQEmu/Server/pull/3781)) @Kinglykrab 2023-12-18
|
||||||
|
|
||||||
|
## [22.36.0] - 12/16/2023
|
||||||
|
|
||||||
|
### Bots
|
||||||
|
|
||||||
|
* Add rule to toggle DT hitting owner ([#3757](https://github.com/EQEmu/Server/pull/3757)) @nytmyr 2023-12-11
|
||||||
|
* Enable auto-saving of bots. ([#3758](https://github.com/EQEmu/Server/pull/3758)) @nytmyr 2023-12-13
|
||||||
|
|
||||||
|
### Code
|
||||||
|
|
||||||
|
* Cleanup classes.cpp/classes.h ([#3752](https://github.com/EQEmu/Server/pull/3752)) @Kinglykrab 2023-12-13
|
||||||
|
|
||||||
|
### Corpse
|
||||||
|
|
||||||
|
* Fix /corpse command regression from #3727 ([#3770](https://github.com/EQEmu/Server/pull/3770)) @Akkadius 2023-12-16
|
||||||
|
|
||||||
|
### Database
|
||||||
|
|
||||||
|
* Make it clearer to users that a database backup is occurring ([#3769](https://github.com/EQEmu/Server/pull/3769)) @Akkadius 2023-12-16
|
||||||
|
* When database version is greater than binary, we are up to date ([#3771](https://github.com/EQEmu/Server/pull/3771)) @Akkadius 2023-12-16
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Fix Starting Items SQL ([#3766](https://github.com/EQEmu/Server/pull/3766)) @Kinglykrab 2023-12-16
|
||||||
|
|
||||||
|
### Logging
|
||||||
|
|
||||||
|
* Change empty object loading to warning ([#3759](https://github.com/EQEmu/Server/pull/3759)) @nytmyr 2023-12-11
|
||||||
|
|
||||||
|
### Rules
|
||||||
|
|
||||||
|
* Add DOT and HOT Rules ([#3760](https://github.com/EQEmu/Server/pull/3760)) @Kinglykrab 2023-12-16
|
||||||
|
|
||||||
|
## [22.35.0] - 12/10/2023
|
||||||
|
|
||||||
|
### Bots
|
||||||
|
|
||||||
|
* Add BotHealOnLevel to fully heal/mana on level. ([#3745](https://github.com/EQEmu/Server/pull/3745)) @nytmyr 2023-12-08
|
||||||
|
* Fix bots learning spells on level ([#3744](https://github.com/EQEmu/Server/pull/3744)) @nytmyr 2023-12-08
|
||||||
|
|
||||||
|
### Bug
|
||||||
|
|
||||||
|
* Fix blocked spells regression from #3638 ([#3753](https://github.com/EQEmu/Server/pull/3753)) @joligario 2023-12-11
|
||||||
|
* PR 3638 Missed the blocked spells repository updates ([#3748](https://github.com/EQEmu/Server/pull/3748)) @fryguy503 2023-12-08
|
||||||
|
|
||||||
|
### CMake
|
||||||
|
|
||||||
|
* Update minimum version of CMake ([#3743](https://github.com/EQEmu/Server/pull/3743)) @joligario 2023-12-08
|
||||||
|
|
||||||
|
### Code
|
||||||
|
|
||||||
|
* Remove hard-coded Status Checks ([#3727](https://github.com/EQEmu/Server/pull/3727)) @Kinglykrab 2023-12-03
|
||||||
|
|
||||||
|
### Commands
|
||||||
|
|
||||||
|
* #guild set CharName 0 did not remove char from guild. ([#3717](https://github.com/EQEmu/Server/pull/3717)) @noudess 2023-11-25
|
||||||
|
* #petname changes PC to Nobody if selected. ([#3720](https://github.com/EQEmu/Server/pull/3720)) @noudess 2023-11-26
|
||||||
|
* Add #show aas Command ([#3710](https://github.com/EQEmu/Server/pull/3710)) @Kinglykrab 2023-11-26
|
||||||
|
* Add #task complete Command ([#3711](https://github.com/EQEmu/Server/pull/3711)) @Kinglykrab 2023-11-26
|
||||||
|
* Cleanup #acceptrules Command ([#3716](https://github.com/EQEmu/Server/pull/3716)) @Kinglykrab 2023-11-26
|
||||||
|
* Cleanup #disarmtrap Command ([#3713](https://github.com/EQEmu/Server/pull/3713)) @Kinglykrab 2023-11-26
|
||||||
|
* Cleanup #list Command ([#3714](https://github.com/EQEmu/Server/pull/3714)) @Kinglykrab 2023-11-26
|
||||||
|
* Cleanup #movement Command ([#3715](https://github.com/EQEmu/Server/pull/3715)) @Kinglykrab 2023-11-26
|
||||||
|
* Cleanup #object Command ([#3722](https://github.com/EQEmu/Server/pull/3722)) @Kinglykrab 2023-12-03
|
||||||
|
* Cleanup #zonebootup and #zoneshutdown Commands ([#3729](https://github.com/EQEmu/Server/pull/3729)) @Kinglykrab 2023-12-03
|
||||||
|
* Fix formatting of #wpinfo output. ([#3728](https://github.com/EQEmu/Server/pull/3728)) @noudess 2023-12-01
|
||||||
|
|
||||||
|
### Database
|
||||||
|
|
||||||
|
* Add primary key to keyring table ([#3746](https://github.com/EQEmu/Server/pull/3746)) @Kinglykrab 2023-12-08
|
||||||
|
* Consolidate Starting Items Table ([#3723](https://github.com/EQEmu/Server/pull/3723)) @Kinglykrab 2023-11-30
|
||||||
|
* Extra whitespace in #3723 ([#3730](https://github.com/EQEmu/Server/pull/3730)) @joligario 2023-12-02
|
||||||
|
* Minor adjustment to #3726 ([#3732](https://github.com/EQEmu/Server/pull/3732)) @joligario 2023-12-03
|
||||||
|
* Modify `updated` column in `items` table with proper default. ([#3726](https://github.com/EQEmu/Server/pull/3726)) @joligario 2023-12-02
|
||||||
|
* Pull Spell Group Cache from Content DB ([#3749](https://github.com/EQEmu/Server/pull/3749)) @fryguy503 2023-12-08
|
||||||
|
|
||||||
|
### Faction
|
||||||
|
|
||||||
|
* Alliance line is only allowed 1 faction change at a time. ([#3718](https://github.com/EQEmu/Server/pull/3718)) @noudess 2023-11-26
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Changing Group Leader Invalidated GetLeaderName() ([#3712](https://github.com/EQEmu/Server/pull/3712)) @Kinglykrab 2023-11-26
|
||||||
|
* Fix 9245 SQL ([#3740](https://github.com/EQEmu/Server/pull/3740)) @Kinglykrab 2023-12-05
|
||||||
|
* Fix Swarm Pets Requiring NPC Aggros Flag ([#3738](https://github.com/EQEmu/Server/pull/3738)) @Kinglykrab 2023-12-05
|
||||||
|
* Guild Message Limits ([#3724](https://github.com/EQEmu/Server/pull/3724)) @neckkola 2023-11-29
|
||||||
|
|
||||||
|
### Quest API
|
||||||
|
|
||||||
|
* Add EVENT_AA_GAIN to AddAAPoints() ([#3733](https://github.com/EQEmu/Server/pull/3733)) @Kinglykrab 2023-12-03
|
||||||
|
* Add GMMove Overloads to Perl/Lua ([#3719](https://github.com/EQEmu/Server/pull/3719)) @Kinglykrab 2023-11-25
|
||||||
|
|
||||||
|
### Scripts
|
||||||
|
|
||||||
|
* Import items into `items_new` table instead of writing directly to the existing `items` table. ([#3725](https://github.com/EQEmu/Server/pull/3725)) @joligario 2023-11-30
|
||||||
|
* Revert database engine change from #3702. ([#3736](https://github.com/EQEmu/Server/pull/3736)) @joligario 2023-12-03
|
||||||
|
* Update 13th Floor Import Tool ([#3702](https://github.com/EQEmu/Server/pull/3702)) @joligario 2023-11-26
|
||||||
|
|
||||||
|
## [22.34.2] - 11/23/2023
|
||||||
|
|
||||||
|
### Admin
|
||||||
|
|
||||||
|
* Update date in changelog ([#3698](https://github.com/EQEmu/Server/pull/3698)) @joligario 2023-11-19
|
||||||
|
|
||||||
|
### Code
|
||||||
|
|
||||||
|
* Fix typo in #giveitem ([#3704](https://github.com/EQEmu/Server/pull/3704)) @Kinglykrab 2023-11-22
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Add "IgnoreLevelBasedHasteCaps" rule to GetHaste() ([#3705](https://github.com/EQEmu/Server/pull/3705)) @jcr4990 2023-11-23
|
||||||
|
* Fix bots/Mercenaries being removed from hatelist ([#3708](https://github.com/EQEmu/Server/pull/3708)) @Kinglykrab 2023-11-23
|
||||||
|
* Fix some spell types failing IsValidSpellRange check ([#3707](https://github.com/EQEmu/Server/pull/3707)) @nytmyr 2023-11-23
|
||||||
|
|
||||||
|
### Loginserver
|
||||||
|
|
||||||
|
* Update ticket login table structure ([#3703](https://github.com/EQEmu/Server/pull/3703)) @KimLS 2023-11-22
|
||||||
|
|
||||||
|
## [22.34.1] - 11/20/2023
|
||||||
|
|
||||||
|
### EQTime
|
||||||
|
|
||||||
|
Hotfix for world not spamming save messages by setting to detail level logging @Akkadius 2023-11-20
|
||||||
|
|
||||||
|
## [22.34.0] - 11/19/2023
|
||||||
|
|
||||||
|
### Bots
|
||||||
|
|
||||||
|
* Add ownerraid, byclass and byrace actionables and fix group-based arguments for raids. ([#3680](https://github.com/EQEmu/Server/pull/3680)) @nytmyr 2023-11-19
|
||||||
|
|
||||||
|
### Code
|
||||||
|
|
||||||
|
* Cleanup #giveitem and #summonitem ([#3692](https://github.com/EQEmu/Server/pull/3692)) @Kinglykrab 2023-11-19
|
||||||
|
* Cleanup #show currencies Command ([#3693](https://github.com/EQEmu/Server/pull/3693)) @Kinglykrab 2023-11-19
|
||||||
|
|
||||||
|
### Commands
|
||||||
|
|
||||||
|
* Add #show aa_points Command ([#3695](https://github.com/EQEmu/Server/pull/3695)) @Kinglykrab 2023-11-19
|
||||||
|
|
||||||
|
### Database
|
||||||
|
|
||||||
|
* Pull pet power from content database ([#3689](https://github.com/EQEmu/Server/pull/3689)) @joligario 2023-11-18
|
||||||
|
|
||||||
|
### GM Commands
|
||||||
|
|
||||||
|
* Add `#takeplatinum` ([#3690](https://github.com/EQEmu/Server/pull/3690)) @joligario 2023-11-19
|
||||||
|
* Remove duplicate comment ([#3691](https://github.com/EQEmu/Server/pull/3691)) @joligario 2023-11-19
|
||||||
|
|
||||||
|
### Illusions
|
||||||
|
|
||||||
|
* RandomizeFeastures erased texture. ([#3686](https://github.com/EQEmu/Server/pull/3686)) @noudess 2023-11-12
|
||||||
|
|
||||||
|
### Spawn
|
||||||
|
|
||||||
|
* (imported from takp) Added min_time and max_time to spawnentry. This will prevent a NPC from… ([#3685](https://github.com/EQEmu/Server/pull/3685)) @regneq 2023-11-18
|
||||||
|
|
||||||
|
## [22.33.0] - 11/11/2023
|
||||||
|
|
||||||
|
### Feature
|
||||||
|
|
||||||
|
* Add Comment to Item Data/Quest API ([#3669](https://github.com/EQEmu/Server/pull/3669)) @Kinglykrab 2023-11-07
|
||||||
|
|
||||||
|
### Spawn2
|
||||||
|
|
||||||
|
* Fix edge case with instances not copying disabled spawn state ([#3688](https://github.com/EQEmu/Server/pull/3688)) @Akkadius 2023-11-12
|
||||||
|
|
||||||
|
## [22.32.1] - 11/6/2023
|
||||||
|
|
||||||
|
### Hotfix
|
||||||
|
|
||||||
|
* Adjust spawn2_disabled migration to copy data over
|
||||||
|
|
||||||
|
## [22.32.0] - 11/6/2023
|
||||||
|
|
||||||
|
### Bots
|
||||||
|
|
||||||
|
* Fix invalid races from being created ([#3681](https://github.com/EQEmu/Server/pull/3681)) @nytmyr 2023-11-06
|
||||||
|
|
||||||
|
### Crash
|
||||||
|
|
||||||
|
* Fix crash on CentOS when forming a raid with PCs or BOTs ([#3676](https://github.com/EQEmu/Server/pull/3676)) @neckkola 2023-11-06
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Add IsTGBCompatibleSpell() to package.add ([#3675](https://github.com/EQEmu/Server/pull/3675)) @Kinglykrab 2023-11-04
|
||||||
|
* Fix Perl__worldwideremovetask package ([#3670](https://github.com/EQEmu/Server/pull/3670)) @Kinglykrab 2023-11-04
|
||||||
|
* Revert " Fix Killed XYZH support in EVENT_DEATH in Perl. " (#3682) ([#3591](https://github.com/EQEmu/Server/pull/3591)) @fryguy503 2023-11-06
|
||||||
|
CRASH
|
||||||
|
|
||||||
|
### GCC
|
||||||
|
|
||||||
|
* Compatibility fix for GCC 13 ([#3677](https://github.com/EQEmu/Server/pull/3677)) @joligario 2023-11-05
|
||||||
|
|
||||||
|
### Parser
|
||||||
|
|
||||||
|
* Cleanup Spire Parsing for crosszonemoveplayerbycharid ([#3674](https://github.com/EQEmu/Server/pull/3674)) @Kinglykrab 2023-11-04
|
||||||
|
* Cleanup Spire Parsing for crosszonemoveplayerbyexpeditionid ([#3671](https://github.com/EQEmu/Server/pull/3671)) @Kinglykrab 2023-11-04
|
||||||
|
* Cleanup Spire Parsing for crosszonemoveplayerbygroupid ([#3673](https://github.com/EQEmu/Server/pull/3673)) @Kinglykrab 2023-11-04
|
||||||
|
* Cleanup Spire Parsing for crosszonemoveplayerbyguildid ([#3672](https://github.com/EQEmu/Server/pull/3672)) @Kinglykrab 2023-11-04
|
||||||
|
|
||||||
|
### Quest API
|
||||||
|
|
||||||
|
* Add GetBaseRaceName() to Perl and Lua ([#3668](https://github.com/EQEmu/Server/pull/3668)) @joligario 2023-11-01
|
||||||
|
* Add details to Lua event dispatch errors ([#3679](https://github.com/EQEmu/Server/pull/3679)) @hgtw 2023-11-06
|
||||||
|
|
||||||
|
### Spawn
|
||||||
|
|
||||||
|
* Split spawn2 enabled into its own state table ([#3664](https://github.com/EQEmu/Server/pull/3664)) @Akkadius 2023-11-06
|
||||||
|
|
||||||
|
### Spells
|
||||||
|
|
||||||
|
* Added IsNightTime() for Dance of the Fireflies ([#3667](https://github.com/EQEmu/Server/pull/3667)) @regneq 2023-11-04
|
||||||
|
|
||||||
|
## [22.31.3] - 10/31/2023
|
||||||
|
|
||||||
|
### Bug
|
||||||
|
|
||||||
|
* Force raids off content database ([#3665](https://github.com/EQEmu/Server/pull/3665)) @joligario 2023-10-31
|
||||||
|
|
||||||
|
### Crash
|
||||||
|
|
||||||
|
* Revert " Fix spell in AESpell related to beacons " ([#3659](https://github.com/EQEmu/Server/pull/3659)) @Akkadius 2023-10-31
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Fix issue with blocked spells not loading properly @Akkadius 2023-10-31
|
||||||
|
|
||||||
|
### Logs
|
||||||
|
|
||||||
|
* Convert Loot Messages to Error Logs ([#3663](https://github.com/EQEmu/Server/pull/3663)) @Kinglykrab 2023-10-31
|
||||||
|
|
||||||
|
## [22.31.2] - 10/31/2023
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Hotfix issue with beacon spells crashing @Akkadius 2023-10-31
|
||||||
|
|
||||||
|
## [22.31.1] - 10/31/2023
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Hotfix issue with blocked spells not loading properly @Akkadius 2023-10-31
|
||||||
|
|
||||||
|
## [22.31.0] - 10/29/2023
|
||||||
|
|
||||||
|
### Crash
|
||||||
|
|
||||||
|
* Fix crash when client pointer does not exist during #hotfix ([#3661](https://github.com/EQEmu/Server/pull/3661)) @Akkadius 2023-10-29
|
||||||
|
* Fix spell in AESpell related to beacons ([#3659](https://github.com/EQEmu/Server/pull/3659)) @Akkadius 2023-10-29
|
||||||
|
|
||||||
|
### Database
|
||||||
|
|
||||||
|
* Add id to variables table ([#3658](https://github.com/EQEmu/Server/pull/3658)) @Akkadius 2023-10-29
|
||||||
|
|
||||||
|
### Linux
|
||||||
|
|
||||||
|
* Add symbols to release builds ([#3660](https://github.com/EQEmu/Server/pull/3660)) @Akkadius 2023-10-29
|
||||||
|
|
||||||
|
### Perl
|
||||||
|
|
||||||
|
* Revert " Reload perl quests on zone bootup " ([#3648](https://github.com/EQEmu/Server/pull/3648)) @Akkadius 2023-10-26
|
||||||
|
|
||||||
|
### Trading
|
||||||
|
|
||||||
|
* Fix part 3 of Issue 932. ([#3654](https://github.com/EQEmu/Server/pull/3654)) @noudess 2023-10-29
|
||||||
|
|
||||||
|
## [22.30.2] - 10/26/2023
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
Revert Perl regression in #3648 causing scripts to not reliably initialize on zone bootup. @Akkadius 2023-10-26
|
||||||
|
|
||||||
|
## [22.30.1] - 10/24/2023
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Fix empty InsertMany in bot starting items. ([#3653](https://github.com/EQEmu/Server/pull/3653)) @Kinglykrab 2023-10-24
|
||||||
|
|
||||||
|
## [22.30.0] - 10/23/2023
|
||||||
|
|
||||||
|
### API
|
||||||
|
|
||||||
|
* Implement Zone Sidecar ([#3635](https://github.com/EQEmu/Server/pull/3635)) @Akkadius 2023-10-24
|
||||||
|
|
||||||
|
### Commands
|
||||||
|
|
||||||
|
* Move #suspend from content database ([#3651](https://github.com/EQEmu/Server/pull/3651)) @joligario 2023-10-24
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Fix Bot Starting Items SQL ([#3649](https://github.com/EQEmu/Server/pull/3649)) @Kinglykrab 2023-10-23
|
||||||
|
|
||||||
|
### Perl
|
||||||
|
|
||||||
|
* Implement eqemu-perl for Linux ([#3652](https://github.com/EQEmu/Server/pull/3652)) @Akkadius 2023-10-24
|
||||||
|
* Reload perl quests on zone bootup ([#3648](https://github.com/EQEmu/Server/pull/3648)) @hgtw 2023-10-24
|
||||||
|
|
||||||
|
### Pets
|
||||||
|
|
||||||
|
* Disallow effect of alliance line when cast on pets. ([#3650](https://github.com/EQEmu/Server/pull/3650)) @noudess 2023-10-24
|
||||||
|
|
||||||
|
## [22.29.1] - 10/21/2023
|
||||||
|
|
||||||
|
### DB
|
||||||
|
|
||||||
|
* Fix manifest for blocked spells ([#3646](https://github.com/EQEmu/Server/pull/3646)) @joligario 2023-10-21
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Fix issue with subcommand settings not working ([#3643](https://github.com/EQEmu/Server/pull/3643)) @Kinglykrab 2023-10-21
|
||||||
|
* Hotfix command without hotfix name ([#3644](https://github.com/EQEmu/Server/pull/3644)) @joligario 2023-10-21
|
||||||
|
* Verifying mail keys when none exist ([#3645](https://github.com/EQEmu/Server/pull/3645)) @joligario 2023-10-21
|
||||||
|
|
||||||
|
## [22.29.0] - 10/20/2023
|
||||||
|
|
||||||
|
### Feature
|
||||||
|
|
||||||
|
* Add Expansion and Content Flag support to Blocked Spells ([#3638](https://github.com/EQEmu/Server/pull/3638)) @Kinglykrab 2023-10-20
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Fix crash when checking Bot Group/Raid membership ([#3641](https://github.com/EQEmu/Server/pull/3641)) @Aeadoin 2023-10-20
|
||||||
|
|
||||||
|
### Perl
|
||||||
|
|
||||||
|
* Static linker fix on Linux ([#3642](https://github.com/EQEmu/Server/pull/3642)) @Akkadius 2023-10-20
|
||||||
|
|
||||||
|
### Rules
|
||||||
|
|
||||||
|
* Add rule to configure max number of procs per round Combat:MaxProcs ([#3640](https://github.com/EQEmu/Server/pull/3640)) @Akkadius 2023-10-20
|
||||||
|
|
||||||
|
## [22.28.1] - 10/20/2023
|
||||||
|
|
||||||
|
### Build
|
||||||
|
|
||||||
|
* Perl Linux build fix
|
||||||
|
|
||||||
|
## [22.28.0] - 10/15/2023
|
||||||
|
|
||||||
|
### Bots
|
||||||
|
|
||||||
|
* Adjust Bot Movement Speed ([#3615](https://github.com/EQEmu/Server/pull/3615)) @Kinglykrab 2023-10-14
|
||||||
|
* Fix bot removal on zone, regression from #3611 ([#3631](https://github.com/EQEmu/Server/pull/3631)) @Akkadius 2023-10-16
|
||||||
|
|
||||||
|
### Crash
|
||||||
|
|
||||||
|
* Fix Crash with #summon ([#3618](https://github.com/EQEmu/Server/pull/3618)) @Kinglykrab 2023-10-14
|
||||||
|
* Fix crash in Mob::ShowBuffs ([#3632](https://github.com/EQEmu/Server/pull/3632)) @Akkadius 2023-10-16
|
||||||
|
* Resolve crash when assigning empty raid note. ([#3628](https://github.com/EQEmu/Server/pull/3628)) @Aeadoin 2023-10-15
|
||||||
|
|
||||||
|
### Feature
|
||||||
|
|
||||||
|
* Add Extra Kick Classes ([#3613](https://github.com/EQEmu/Server/pull/3613)) @Kinglykrab 2023-10-11
|
||||||
|
* Add Immune to Assassinate Special Ability ([#3622](https://github.com/EQEmu/Server/pull/3622)) @Kinglykrab 2023-10-14
|
||||||
|
* Add Immune to Headshot Special Ability ([#3624](https://github.com/EQEmu/Server/pull/3624)) @Kinglykrab 2023-10-14
|
||||||
|
* Update Raid Functions for Titanium and Underfoot ([#3524](https://github.com/EQEmu/Server/pull/3524)) @neckkola 2023-10-14
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Fix #cast defaulting to cast time ([#3617](https://github.com/EQEmu/Server/pull/3617)) @Kinglykrab 2023-10-14
|
||||||
|
|
||||||
|
### Parser Fix
|
||||||
|
|
||||||
|
* Fix SendIllusion Spire parsing ([#3623](https://github.com/EQEmu/Server/pull/3623)) @Kinglykrab 2023-10-14
|
||||||
|
|
||||||
|
### Quest API
|
||||||
|
|
||||||
|
* Add GrantAllAAPoints() to Perl/Lua and Modify #grantaa ([#3616](https://github.com/EQEmu/Server/pull/3616)) @Kinglykrab 2023-10-14
|
||||||
|
* Add target ID and spell exports to events ([#3620](https://github.com/EQEmu/Server/pull/3620)) @Kinglykrab 2023-10-15
|
||||||
|
|
||||||
|
### Scripts
|
||||||
|
|
||||||
|
* Update 13th Floor importer ([#3630](https://github.com/EQEmu/Server/pull/3630)) @joligario 2023-10-16
|
||||||
|
* Update 13th Floor script for legacy research tome bagtypes ([#3621](https://github.com/EQEmu/Server/pull/3621)) @joligario 2023-10-14
|
||||||
|
|
||||||
|
## [22.27.0] - 10/07/2023
|
||||||
|
|
||||||
|
### Crash
|
||||||
|
|
||||||
|
* Bot member zoned crash fix ([#3607](https://github.com/EQEmu/Server/pull/3607)) @Akkadius 2023-10-07
|
||||||
|
* Fix #summon crash ([#3608](https://github.com/EQEmu/Server/pull/3608)) @Akkadius 2023-10-07
|
||||||
|
* Fix CanUseAlternateAdvancementRank crash ([#3609](https://github.com/EQEmu/Server/pull/3609)) @Akkadius 2023-10-07
|
||||||
|
* Fix crash in #movechar ([#3612](https://github.com/EQEmu/Server/pull/3612)) @Akkadius 2023-10-07
|
||||||
|
* Fix crash in CastSpell Quest API input cast ([#3610](https://github.com/EQEmu/Server/pull/3610)) @Akkadius 2023-10-07
|
||||||
|
* Fix dangling pointer crash observed in SendHPPacketsFrom ([#3611](https://github.com/EQEmu/Server/pull/3611)) @Akkadius 2023-10-07
|
||||||
|
* Fix rarer crash with File::Makedir ([#3606](https://github.com/EQEmu/Server/pull/3606)) @Akkadius 2023-10-07
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Add Validation to #find, #set, and #show args ([#3598](https://github.com/EQEmu/Server/pull/3598)) @Kinglykrab 2023-09-18
|
||||||
|
* Ensure Linux builds report failures @Akkadius 2023-10-03
|
||||||
|
* Fix #show group_info Popup ([#3605](https://github.com/EQEmu/Server/pull/3605)) @Kinglykrab 2023-10-04
|
||||||
|
* Fix swarm pet names to use '_' instead of ' ' ([#3601](https://github.com/EQEmu/Server/pull/3601)) @noudess 2023-09-19
|
||||||
|
* Invis vs. Undead/Animal Breaks Charm for Pets ([#3587](https://github.com/EQEmu/Server/pull/3587)) @crdunwel 2023-09-19
|
||||||
|
|
||||||
|
### Logs
|
||||||
|
|
||||||
|
* Change pathing log messages from Error to Pathing. ([#3604](https://github.com/EQEmu/Server/pull/3604)) @joligario 2023-09-29
|
||||||
|
|
||||||
|
### Quest API
|
||||||
|
|
||||||
|
* Add Caster ID Parameter to FindBuff in Perl/Lua ([#3590](https://github.com/EQEmu/Server/pull/3590)) @Kinglykrab 2023-09-29
|
||||||
|
|
||||||
|
## [22.26.2] - 09/18/2023
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Fix an issue with schema versioning for the AA update
|
||||||
|
|
||||||
|
## [22.26.1] - 09/17/2023
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Add Validation to #find, #set, and #show args ([#3598](https://github.com/EQEmu/Server/pull/3598)) @Kinglykrab 2023-09-17
|
||||||
|
|
||||||
|
## [22.26.0] - 09/17/2023
|
||||||
|
|
||||||
|
### Bug
|
||||||
|
|
||||||
|
* Additional Wild Ramp param was causing an overflow it appears at least on local testing. ([#3589](https://github.com/EQEmu/Server/pull/3589)) @fryguy503 2023-09-11
|
||||||
|
|
||||||
|
### Commands
|
||||||
|
|
||||||
|
* npc_edit faction and #setfaction duplicate and incorrect. ([#3577](https://github.com/EQEmu/Server/pull/3577)) @noudess 2023-09-03
|
||||||
|
|
||||||
|
### Feature
|
||||||
|
|
||||||
|
* Add Defensive Proc Rules for Level Gap Penalty ([#3580](https://github.com/EQEmu/Server/pull/3580)) @Kinglykrab 2023-09-17
|
||||||
|
* Add opcodes for Cast and Scribe book buttons ([#3578](https://github.com/EQEmu/Server/pull/3578)) @hgtw 2023-09-17
|
||||||
|
* Cleanup Group Split Money Logic ([#3583](https://github.com/EQEmu/Server/pull/3583)) @crdunwel 2023-09-17
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* AA System Fixes ([#3572](https://github.com/EQEmu/Server/pull/3572)) @KimLS 2023-09-17
|
||||||
|
* Check for Song Skill Increase on Bard Pulse ([#3586](https://github.com/EQEmu/Server/pull/3586)) @crdunwel 2023-09-17
|
||||||
|
* Fix #set faction/#setfaction Command ([#3575](https://github.com/EQEmu/Server/pull/3575)) @Kinglykrab 2023-09-02
|
||||||
|
* Fix Killed XYZH support in EVENT_DEATH in Perl. ([#3591](https://github.com/EQEmu/Server/pull/3591)) @Kinglykrab 2023-09-17
|
||||||
|
* Fix entity ID on death with #castspell ([#3592](https://github.com/EQEmu/Server/pull/3592)) @Kinglykrab 2023-09-17
|
||||||
|
* Zoning logging edge case safety @Akkadius 2023-08-29
|
||||||
|
|
||||||
|
### Logging
|
||||||
|
|
||||||
|
* Add logging to track down Wild Ramp issue ([#3588](https://github.com/EQEmu/Server/pull/3588)) @fryguy503 2023-09-11
|
||||||
|
|
||||||
|
### Messages
|
||||||
|
|
||||||
|
* Remove duplicate message on tracking begin ([#3574](https://github.com/EQEmu/Server/pull/3574)) @noudess 2023-09-11
|
||||||
|
* Swarm pet normal damage messages were missing ([#3594](https://github.com/EQEmu/Server/pull/3594)) @noudess 2023-09-17
|
||||||
|
|
||||||
|
### Quest API
|
||||||
|
|
||||||
|
* Add ApplySpell() and SetBuffDuration() overloads to Perl/Lua ([#3576](https://github.com/EQEmu/Server/pull/3576)) @Kinglykrab 2023-09-17
|
||||||
|
* Add XYZ/XYZH Overloads to Cross Zone Move Methods ([#3581](https://github.com/EQEmu/Server/pull/3581)) @Kinglykrab 2023-09-17
|
||||||
|
|
||||||
|
## [22.25.0] - 08/28/2023
|
||||||
|
|
||||||
|
### Bots
|
||||||
|
|
||||||
|
* Add Support for Mana Pool AA Bonuses. ([#3571](https://github.com/EQEmu/Server/pull/3571)) @Aeadoin 2023-08-21
|
||||||
|
* Remove In-Game Command References to Bot Groups ([#3545](https://github.com/EQEmu/Server/pull/3545)) @Aeadoin 2023-08-13
|
||||||
|
|
||||||
|
### Bug
|
||||||
|
|
||||||
|
* Escape item name in trader audit. ([#3540](https://github.com/EQEmu/Server/pull/3540)) @fryguy503 2023-08-13
|
||||||
|
|
||||||
|
### CMake
|
||||||
|
|
||||||
|
* Add cmake option to re-enable MSVC warnings ([#3537](https://github.com/EQEmu/Server/pull/3537)) @hgtw 2023-08-13
|
||||||
|
* Define perlbind option for all targets ([#3538](https://github.com/EQEmu/Server/pull/3538)) @hgtw 2023-08-13
|
||||||
|
|
||||||
|
### Charm
|
||||||
|
|
||||||
|
* Fix to update target windows on charm on/off ([#3549](https://github.com/EQEmu/Server/pull/3549)) @noudess 2023-08-20
|
||||||
|
|
||||||
|
### Combat Messages
|
||||||
|
|
||||||
|
* Fix issue where pet proc damage was not showing up ([#3551](https://github.com/EQEmu/Server/pull/3551)) @noudess 2023-08-24
|
||||||
|
|
||||||
|
### Database
|
||||||
|
|
||||||
|
* Change primary key entry to NOT NULL ([#3559](https://github.com/EQEmu/Server/pull/3559)) @joligario 2023-08-20
|
||||||
|
* Extend dumper CLI utility to export static instance data ([#3562](https://github.com/EQEmu/Server/pull/3562)) @Akkadius 2023-08-20
|
||||||
|
|
||||||
|
### Expansions
|
||||||
|
|
||||||
|
* Expansion settings tweaks ([#3556](https://github.com/EQEmu/Server/pull/3556)) @Akkadius 2023-08-20
|
||||||
|
|
||||||
|
### Feature
|
||||||
|
|
||||||
|
* Add adjustability for AERampage Range. ([#3548](https://github.com/EQEmu/Server/pull/3548)) @fryguy503 2023-08-20
|
||||||
|
* Change #reload zone to reload zone headers globally. ([#3557](https://github.com/EQEmu/Server/pull/3557)) @Kinglykrab 2023-08-20
|
||||||
|
* Change money type to all lower case as EQ live money shares and split has it that way. ([#3550](https://github.com/EQEmu/Server/pull/3550)) @regneq 2023-08-18
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Add character_stats_record to player tables @Akkadius 2023-08-11
|
||||||
|
* Bots no longer drop group on death, and raid fixes. ([#3542](https://github.com/EQEmu/Server/pull/3542)) @Aeadoin 2023-08-13
|
||||||
|
* Bots will now load AAs properly when spawned. ([#3544](https://github.com/EQEmu/Server/pull/3544)) @Aeadoin 2023-08-13
|
||||||
|
* Clearing target window on CHARM wear off had a side effect ([#3570](https://github.com/EQEmu/Server/pull/3570)) @noudess 2023-08-21
|
||||||
|
* Fix #motd/#set motd Command ([#3558](https://github.com/EQEmu/Server/pull/3558)) @Kinglykrab 2023-08-20
|
||||||
|
* Fix Bot::CheckDataBucket to work with Owner Buckets. ([#3552](https://github.com/EQEmu/Server/pull/3552)) @Aeadoin 2023-08-18
|
||||||
|
* Fix to zoning logging exception @Akkadius 2023-08-29
|
||||||
|
* Instance GetUnusedInstanceID crash fox @Akkadius 2023-08-21
|
||||||
|
* Minor adjustment to formula calc position to fix modifier bug. ([#3565](https://github.com/EQEmu/Server/pull/3565)) @Valorith 2023-08-21
|
||||||
|
|
||||||
|
### Instances
|
||||||
|
|
||||||
|
* Honor reserved instances ([#3563](https://github.com/EQEmu/Server/pull/3563)) @joligario 2023-08-21
|
||||||
|
* Refine id selection ([#3568](https://github.com/EQEmu/Server/pull/3568)) @joligario 2023-08-29
|
||||||
|
|
||||||
|
### Logging
|
||||||
|
|
||||||
|
* Add detailed zoning logging ([#3555](https://github.com/EQEmu/Server/pull/3555)) @Akkadius 2023-08-20
|
||||||
|
|
||||||
|
### Quest API
|
||||||
|
|
||||||
|
* Reload content flags globally when a content flag is set ([#3564](https://github.com/EQEmu/Server/pull/3564)) @Akkadius 2023-08-21
|
||||||
|
|
||||||
|
### Rules
|
||||||
|
|
||||||
|
* Add FinalRaidExpMultiplier Rule ([#3554](https://github.com/EQEmu/Server/pull/3554)) @Valorith 2023-08-20
|
||||||
|
* Add a rule to adjust the randomization range for Wizard\Caster Merc innate critical ratio. ([#3543](https://github.com/EQEmu/Server/pull/3543)) @catapultam-habeo 2023-08-13
|
||||||
|
* Add rule to restrict hand in of quest items to quest flagged NPCs. ([#3536](https://github.com/EQEmu/Server/pull/3536)) @Valorith 2023-08-13
|
||||||
|
* Add rule to toggle pets accepting quest items ([#3533](https://github.com/EQEmu/Server/pull/3533)) @Valorith 2023-08-06
|
||||||
|
* Also reload rules in world when #reload rules invoked ([#3566](https://github.com/EQEmu/Server/pull/3566)) @Akkadius 2023-08-21
|
||||||
|
* Correct explanation of Bots:ManaRegen ([#3569](https://github.com/EQEmu/Server/pull/3569)) @Aeadoin 2023-08-21
|
||||||
|
|
||||||
|
### Spawns
|
||||||
|
|
||||||
|
* Fixes a rarer issue where spawn2 is not being properly content filtered @Akkadius 2023-08-13
|
||||||
|
|
||||||
|
## [22.24.0] - 08/05/2023
|
||||||
|
|
||||||
|
### Character
|
||||||
|
|
||||||
|
* Record character stats to `character_stats_record` table ([#3522](https://github.com/EQEmu/Server/pull/3522)) @Akkadius 2023-08-05
|
||||||
|
|
||||||
|
### Code
|
||||||
|
|
||||||
|
* Cleanup #view zone_loot Command ([#3523](https://github.com/EQEmu/Server/pull/3523)) @Kinglykrab 2023-08-02
|
||||||
|
* Remove Strings::Commify from all identifier values ([#3528](https://github.com/EQEmu/Server/pull/3528)) @Kinglykrab 2023-08-02
|
||||||
|
|
||||||
|
### Feature
|
||||||
|
|
||||||
|
* Add Support for Drakkin Heritage Illusions ([#3521](https://github.com/EQEmu/Server/pull/3521)) @Kinglykrab 2023-08-01
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Bug fix for raid mark NPC across zones ([#3525](https://github.com/EQEmu/Server/pull/3525)) @neckkola 2023-08-05
|
||||||
|
* Bugs table should not target content database ([#3535](https://github.com/EQEmu/Server/pull/3535)) @Akkadius 2023-08-05
|
||||||
|
* Fix +/- 0.1 XYZ Door Manipulation ([#3527](https://github.com/EQEmu/Server/pull/3527)) @Kinglykrab 2023-08-02
|
||||||
|
* Fix issue with mob scanning when trying to use EVENT_SPAWN ([#3529](https://github.com/EQEmu/Server/pull/3529)) @Akkadius 2023-08-04
|
||||||
|
|
||||||
|
### Quest API
|
||||||
|
|
||||||
|
* Adjust GetCloseMobList calls internally ([#3530](https://github.com/EQEmu/Server/pull/3530)) @Akkadius 2023-08-04
|
||||||
|
|
||||||
|
## [22.23.0] - 07/31/2023
|
||||||
|
|
||||||
|
### Databuckets
|
||||||
|
|
||||||
|
* Improvements to distributed cache, reload commands ([#3519](https://github.com/EQEmu/Server/pull/3519)) @Akkadius 2023-08-01
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Fix #gm top level alias for #set gm ([#3517](https://github.com/EQEmu/Server/pull/3517)) @Kinglykrab 2023-07-30
|
||||||
|
* Fix Appearance Issues ([#3520](https://github.com/EQEmu/Server/pull/3520)) @Kinglykrab 2023-08-01
|
||||||
|
* Fix NPC Cast Events not parsing properly. ([#3518](https://github.com/EQEmu/Server/pull/3518)) @Kinglykrab 2023-08-01
|
||||||
|
|
||||||
|
### Scaling/Bug Fix
|
||||||
|
|
||||||
|
* Scaling where min and max damage was bugged ([#3514](https://github.com/EQEmu/Server/pull/3514)) @noudess 2023-08-01
|
||||||
|
|
||||||
|
## [22.22.1] - 07/30/2023
|
||||||
|
|
||||||
|
### Database
|
||||||
|
|
||||||
|
* Hotfix: Add command_subsettings to server tables @Akkadius 2023-07-29
|
||||||
|
|
||||||
|
### Doors
|
||||||
|
|
||||||
|
* Add door blacklist ([#3516](https://github.com/EQEmu/Server/pull/3516)) @Akkadius 2023-07-30
|
||||||
|
|
||||||
|
## [22.22.0] - 07/27/2023
|
||||||
|
|
||||||
|
### Code
|
||||||
|
|
||||||
|
* Fix casing in corpse money and decay time. ([#3511](https://github.com/EQEmu/Server/pull/3511)) @Kinglykrab 2023-07-23
|
||||||
|
|
||||||
|
### Crash Fix
|
||||||
|
|
||||||
|
* Guard against Spells:MaxTotalSlotsPET being set above client allowed maximum. ([#3507](https://github.com/EQEmu/Server/pull/3507)) @Valorith 2023-07-22
|
||||||
|
|
||||||
|
### Data Buckets
|
||||||
|
|
||||||
|
* Distributed Databucket Caching ([#3500](https://github.com/EQEmu/Server/pull/3500)) @Kinglykrab 2023-07-24
|
||||||
|
|
||||||
|
### Database
|
||||||
|
|
||||||
|
* Fix console output in database:dump --dump-output-to-console @Akkadius 2023-07-25
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Escape search string in #find item ([#3510](https://github.com/EQEmu/Server/pull/3510)) @Kinglykrab 2023-07-22
|
||||||
|
|
||||||
|
### Quest API
|
||||||
|
|
||||||
|
* Add GetMobTypeIdentifier() to Perl/Lua ([#3512](https://github.com/EQEmu/Server/pull/3512)) @Kinglykrab 2023-07-28
|
||||||
|
|
||||||
|
### Saylink
|
||||||
|
|
||||||
|
* Fix cases where saylinks were not being cached ([#3508](https://github.com/EQEmu/Server/pull/3508)) @Akkadius 2023-07-20
|
||||||
|
|
||||||
|
## [22.21.2] - 07/19/2023
|
||||||
|
|
||||||
|
### Databuckets
|
||||||
|
|
||||||
|
* Fix rarer same bucket name scoping overlap issue ([#3509](https://github.com/EQEmu/Server/pull/3509)) @Akkadius 2023-07-20
|
||||||
|
|
||||||
|
## [22.21.1] - 07/18/2023
|
||||||
|
|
||||||
|
### Bug
|
||||||
|
|
||||||
|
* Show Petition and Show Petition_Info fix ([#3503](https://github.com/EQEmu/Server/pull/3503)) @fryguy503 2023-07-18
|
||||||
|
|
||||||
|
### Code
|
||||||
|
|
||||||
|
* Remove arbitrary teleport blocking in Tutorial and Load zones ([#3506](https://github.com/EQEmu/Server/pull/3506)) @Valorith 2023-07-19
|
||||||
|
|
||||||
|
### Databuckets
|
||||||
|
|
||||||
|
* Fix issue with expired databuckets not being expired and returned properly ([#3504](https://github.com/EQEmu/Server/pull/3504)) @Akkadius 2023-07-18
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* #set title_suffix Argument Position ([#3505](https://github.com/EQEmu/Server/pull/3505)) @Kinglykrab 2023-07-18
|
||||||
|
|
||||||
|
## [22.21.0] - 07/18/2023
|
||||||
|
|
||||||
|
### Data Buckets
|
||||||
|
|
||||||
|
* Implement scoped data buckets ([#3498](https://github.com/EQEmu/Server/pull/3498)) @Akkadius 2023-07-16
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Fix rule check and add rule for pickpocket command ([#3492](https://github.com/EQEmu/Server/pull/3492)) @tuday2 2023-07-16
|
||||||
|
|
||||||
|
### Pathing
|
||||||
|
|
||||||
|
* Improvements to roambox logic, pathing ([#3502](https://github.com/EQEmu/Server/pull/3502)) @Akkadius 2023-07-18
|
||||||
|
|
||||||
|
### Quest API
|
||||||
|
|
||||||
|
* Add SetLDoNPoints() to Perl/Lua ([#3496](https://github.com/EQEmu/Server/pull/3496)) @Kinglykrab 2023-07-16
|
||||||
|
|
||||||
|
### Z Clipping
|
||||||
|
|
||||||
|
* Don't issue zclip adjustments when NPC is not moving ([#3499](https://github.com/EQEmu/Server/pull/3499)) @Akkadius 2023-07-16
|
||||||
|
|
||||||
|
## [22.20.1] - 07/15/2023
|
||||||
|
|
||||||
|
### Database
|
||||||
|
|
||||||
|
* Fix database manifest entry for #3443 @neckkola 2023-07-15
|
||||||
|
|
||||||
|
## [22.20.0] - 07/15/2023
|
||||||
|
|
||||||
|
### Bots
|
||||||
|
|
||||||
|
* Remove orphaned commands related to botgroup ([#3489](https://github.com/EQEmu/Server/pull/3489)) @tuday2 2023-07-09
|
||||||
|
|
||||||
|
### Commands
|
||||||
|
|
||||||
|
* Consolidate #set-like commands into a singular #set command ([#3486](https://github.com/EQEmu/Server/pull/3486)) @Kinglykrab 2023-07-15
|
||||||
|
|
||||||
|
### Feature
|
||||||
|
|
||||||
|
* Add Support for item textures higher than 65,535 ([#3494](https://github.com/EQEmu/Server/pull/3494)) @Kinglykrab 2023-07-14
|
||||||
|
* Update raid features ([#3443](https://github.com/EQEmu/Server/pull/3443)) @neckkola 2023-07-13
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Fix Tradeskill Combines with augmented items ([#3490](https://github.com/EQEmu/Server/pull/3490)) @Kinglykrab 2023-07-15
|
||||||
|
* Fix charmed pets to follow when charmed. ([#3488](https://github.com/EQEmu/Server/pull/3488)) @noudess 2023-07-08
|
||||||
|
* Update bot naming check and add more explanation ([#3491](https://github.com/EQEmu/Server/pull/3491)) @tuday2 2023-07-13
|
||||||
|
|
||||||
|
### Quest API
|
||||||
|
|
||||||
|
* Add Mob/Entity type check methods to Perl/Lua ([#3493](https://github.com/EQEmu/Server/pull/3493)) @Kinglykrab 2023-07-13
|
||||||
|
|
||||||
|
## [22.19.0] - 07/08/2023
|
||||||
|
|
||||||
|
### Bots
|
||||||
|
|
||||||
|
* Add Pickpocket Command ([#3484](https://github.com/EQEmu/Server/pull/3484)) @tuday2 2023-07-08
|
||||||
|
|
||||||
|
### Code
|
||||||
|
|
||||||
|
* Move #find item summon links to front ([#3483](https://github.com/EQEmu/Server/pull/3483)) @Kinglykrab 2023-07-05
|
||||||
|
* Remove LoadItemDBFieldNames() from common/misc.cpp and common/misc.h ([#3473](https://github.com/EQEmu/Server/pull/3473)) @Kinglykrab 2023-07-04
|
||||||
|
|
||||||
|
### Commands
|
||||||
|
|
||||||
|
* Add #itemsearch alias to #find aliases ([#3485](https://github.com/EQEmu/Server/pull/3485)) @Kinglykrab 2023-07-08
|
||||||
|
* Consolidate #show commands into a singular #show command ([#3478](https://github.com/EQEmu/Server/pull/3478)) @Kinglykrab 2023-07-08
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Fix _PutItem having a slot_id of -1 on mobs with no items ([#3474](https://github.com/EQEmu/Server/pull/3474)) @Kinglykrab 2023-07-04
|
||||||
|
|
||||||
|
### Rules
|
||||||
|
|
||||||
|
* Add Skills:TrivialTradeskillCombinesNoFail Rule ([#3481](https://github.com/EQEmu/Server/pull/3481)) @JasXSL 2023-07-05
|
||||||
|
|
||||||
|
## [22.18.0] - 07/04/2023
|
||||||
|
|
||||||
|
### Commands
|
||||||
|
|
||||||
|
* Add #emotesearch to #find command ([#3480](https://github.com/EQEmu/Server/pull/3480)) @Kinglykrab 2023-07-04
|
||||||
|
* Cleanup #copycharacter Command ([#3479](https://github.com/EQEmu/Server/pull/3479)) @Kinglykrab 2023-07-04
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Add chatchannel_reserved_names to a new manifest ([#3482](https://github.com/EQEmu/Server/pull/3482)) @Kinglykrab 2023-07-04
|
||||||
|
* Fix issue in zone store of returning reference to local variable ([#3477](https://github.com/EQEmu/Server/pull/3477)) @Kinglykrab 2023-07-04
|
||||||
|
|
||||||
|
## [22.17.0] - 07/03/2023
|
||||||
|
|
||||||
|
### Cleanup/Feature
|
||||||
|
|
||||||
|
* Add support for bots to #showstats/#mystats ([#3427](https://github.com/EQEmu/Server/pull/3427)) @Kinglykrab 2023-07-01
|
||||||
|
|
||||||
|
### Code
|
||||||
|
|
||||||
|
* Remove LoadItemDBFieldNames() from common/misc.cpp and common/misc.h ([#3473](https://github.com/EQEmu/Server/pull/3473)) @Kinglykrab 2023-07-04
|
||||||
|
* Remove handle_npc_single_npc from zone/lua_parser_events.cpp and zone/lua_parser_events.h ([#3467](https://github.com/EQEmu/Server/pull/3467)) @Kinglykrab 2023-07-03
|
||||||
|
|
||||||
|
### Database
|
||||||
|
|
||||||
|
* Set multi statements off when returning early ([#3462](https://github.com/EQEmu/Server/pull/3462)) @Akkadius 2023-07-01
|
||||||
|
|
||||||
|
### Feature
|
||||||
|
|
||||||
|
* Add Strings::BeginsWith() and Strings::EndsWith() ([#3471](https://github.com/EQEmu/Server/pull/3471)) @Kinglykrab 2023-07-03
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Add check for underscores in botcreate command ([#3458](https://github.com/EQEmu/Server/pull/3458)) @tuday2 2023-06-29
|
||||||
|
* EVENT_LANGUAGE_SKILL_UP in Lua was using EVENT_SKILL_UP logic ([#3466](https://github.com/EQEmu/Server/pull/3466)) @Kinglykrab 2023-07-03
|
||||||
|
* Fix _PutItem having a slot_id of -1 on mobs with no items ([#3474](https://github.com/EQEmu/Server/pull/3474)) @Kinglykrab 2023-07-04
|
||||||
|
* Fix data type of GetAggroCount() ([#3470](https://github.com/EQEmu/Server/pull/3470)) @Kinglykrab 2023-07-03
|
||||||
|
|
||||||
|
### Logging
|
||||||
|
|
||||||
|
* Fix logging crash when % are sent through query logs ([#3461](https://github.com/EQEmu/Server/pull/3461)) @Akkadius 2023-07-01
|
||||||
|
|
||||||
|
### Quest API
|
||||||
|
|
||||||
|
* Add ClearAccountFlag() and GetAccountFlags() to Perl/Lua ([#3469](https://github.com/EQEmu/Server/pull/3469)) @Kinglykrab 2023-07-03
|
||||||
|
* Add GetClassAbbreviation() and GetRaceAbbreviation() to Perl/Lua ([#3463](https://github.com/EQEmu/Server/pull/3463)) @Kinglykrab 2023-07-02
|
||||||
|
* Add GetClassPlural() and GetRacePlural() to Perl/Lua ([#3468](https://github.com/EQEmu/Server/pull/3468)) @Kinglykrab 2023-07-03
|
||||||
|
* Add GetCloseMobList() and CalculateDistance() overload to Perl/Lua ([#3455](https://github.com/EQEmu/Server/pull/3455)) @Kinglykrab 2023-07-02
|
||||||
|
* Add Hate Entry Methods to Perl ([#3459](https://github.com/EQEmu/Server/pull/3459)) @Kinglykrab 2023-07-02
|
||||||
|
* Add ItemData Class to Perl ([#3465](https://github.com/EQEmu/Server/pull/3465)) @Kinglykrab 2023-07-02
|
||||||
|
* Add Spawn2 Class to Perl ([#3456](https://github.com/EQEmu/Server/pull/3456)) @Kinglykrab 2023-07-02
|
||||||
|
* Add StatBonuses Class to Perl ([#3460](https://github.com/EQEmu/Server/pull/3460)) @Kinglykrab 2023-07-02
|
||||||
|
* Add missing Item Methods to Perl/Lua. ([#3464](https://github.com/EQEmu/Server/pull/3464)) @Kinglykrab 2023-07-02
|
||||||
|
|
||||||
|
## [22.16.0] - 06/27/2023
|
||||||
|
|
||||||
|
### Code
|
||||||
|
|
||||||
|
* Default skill type to Hand to Hand in #npcedit meleetype ([#3422](https://github.com/EQEmu/Server/pull/3422)) @Kinglykrab 2023-06-19
|
||||||
|
* Delete common/worldconn.cpp ([#3436](https://github.com/EQEmu/Server/pull/3436)) @Kinglykrab 2023-06-24
|
||||||
|
* Remove DatabaseCastAccepted() from zone/npc.cpp and zone/npc.h ([#3449](https://github.com/EQEmu/Server/pull/3449)) @Kinglykrab 2023-06-24
|
||||||
|
* Remove GetACAvoid() from zone/merc.h ([#3447](https://github.com/EQEmu/Server/pull/3447)) @Kinglykrab 2023-06-25
|
||||||
|
* Remove GetACMit() from zone/merc.h ([#3446](https://github.com/EQEmu/Server/pull/3446)) @Kinglykrab 2023-06-24
|
||||||
|
* Remove _ClearWaypints() from zone/npc.h ([#3445](https://github.com/EQEmu/Server/pull/3445)) @Kinglykrab 2023-06-24
|
||||||
|
* Remove acmod() from zone/merc.h ([#3448](https://github.com/EQEmu/Server/pull/3448)) @Kinglykrab 2023-06-24
|
||||||
|
* Remove command_packetprofile from zone/command.h ([#3432](https://github.com/EQEmu/Server/pull/3432)) @Kinglykrab 2023-06-24
|
||||||
|
* Remove command_showpetspell in zone/command.h ([#3430](https://github.com/EQEmu/Server/pull/3430)) @Kinglykrab 2023-06-24
|
||||||
|
* Remove command_unlock from zone/command.h ([#3431](https://github.com/EQEmu/Server/pull/3431)) @Kinglykrab 2023-06-24
|
||||||
|
|
||||||
|
### Commands
|
||||||
|
|
||||||
|
* Add #finddeity Command ([#3435](https://github.com/EQEmu/Server/pull/3435)) @Kinglykrab 2023-06-26
|
||||||
|
* Add #findlanguage Command ([#3434](https://github.com/EQEmu/Server/pull/3434)) @Kinglykrab 2023-06-25
|
||||||
|
* Add #showspells Command ([#3429](https://github.com/EQEmu/Server/pull/3429)) @Kinglykrab 2023-06-24
|
||||||
|
* Add missing subcommands to #npcedit ([#3423](https://github.com/EQEmu/Server/pull/3423)) @Kinglykrab 2023-06-19
|
||||||
|
* Cleanup #showbuffs Command ([#3439](https://github.com/EQEmu/Server/pull/3439)) @Kinglykrab 2023-06-26
|
||||||
|
* Cleanup #shownpcgloballoot and #showzonegloballoot Commands ([#3440](https://github.com/EQEmu/Server/pull/3440)) @Kinglykrab 2023-06-24
|
||||||
|
* Cleanup #viewcurrencies Command ([#3441](https://github.com/EQEmu/Server/pull/3441)) @Kinglykrab 2023-06-25
|
||||||
|
* Consolidate #findX commands to a singular #find Command ([#3452](https://github.com/EQEmu/Server/pull/3452)) @Kinglykrab 2023-06-28
|
||||||
|
* Consolidate #merchant_close_shop and #merchant_open_shop to #merchantshop ([#3433](https://github.com/EQEmu/Server/pull/3433)) @Kinglykrab 2023-06-24
|
||||||
|
* Delete #showbonusstats Command ([#3437](https://github.com/EQEmu/Server/pull/3437)) @Kinglykrab 2023-06-24
|
||||||
|
* Delete #spellinfo Command ([#3438](https://github.com/EQEmu/Server/pull/3438)) @Kinglykrab 2023-06-24
|
||||||
|
|
||||||
|
### Database
|
||||||
|
|
||||||
|
* Fix database version checking edge case issue ([#3428](https://github.com/EQEmu/Server/pull/3428)) @Akkadius 2023-06-22
|
||||||
|
* Fix multi-statement error reporting ([#3425](https://github.com/EQEmu/Server/pull/3425)) @Akkadius 2023-06-19
|
||||||
|
* Implement native database migrations in server ([#2857](https://github.com/EQEmu/Server/pull/2857)) @Akkadius 2023-06-19
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Fix NPC Item Stat Bonuses ([#3444](https://github.com/EQEmu/Server/pull/3444)) @Kinglykrab 2023-06-26
|
||||||
|
* Fix error in 023_01_21_bots_raid_members.sql ([#3453](https://github.com/EQEmu/Server/pull/3453)) @mibastian 2023-06-28
|
||||||
|
* Fix possible crash with #npcedit weapon ([#3421](https://github.com/EQEmu/Server/pull/3421)) @Kinglykrab 2023-06-19
|
||||||
|
* Merchant Open Flag set only for regular Merchants ([#3454](https://github.com/EQEmu/Server/pull/3454)) @Kinglykrab 2023-06-27
|
||||||
|
|
||||||
|
### Readme
|
||||||
|
|
||||||
|
* Update new location of database updates ([#3424](https://github.com/EQEmu/Server/pull/3424)) @joligario 2023-06-19
|
||||||
|
|
||||||
|
### Rules
|
||||||
|
|
||||||
|
* Add ClientPetsUserOwnerNameInLastName rule ([#3442](https://github.com/EQEmu/Server/pull/3442)) @Kinglykrab 2023-06-25
|
||||||
|
|
||||||
|
## [22.15.3] - 06/19/2023
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Fix improper condition in Water LOS checks ([#3426](https://github.com/EQEmu/Server/pull/3426)) @Kinglykrab 2023-06-19
|
||||||
|
|
||||||
|
## [22.15.2] - 06/19/2023
|
||||||
|
|
||||||
|
### Database
|
||||||
|
|
||||||
|
* Fix multi-statement error reporting ([#3425](https://github.com/EQEmu/Server/pull/3425)) @Akkadius 2023-06-19
|
||||||
|
|
||||||
|
## [22.15.1] - 06/19/2023
|
||||||
|
|
||||||
|
### Schema
|
||||||
|
|
||||||
|
* Add `chatchannel_reserved_names` table to `database_schema.h`
|
||||||
|
|
||||||
|
## [22.15.0] - 06/19/2023
|
||||||
|
|
||||||
|
### Code
|
||||||
|
|
||||||
|
* Default skill type to Hand to Hand in #npcedit meleetype ([#3422](https://github.com/EQEmu/Server/pull/3422)) @Kinglykrab 2023-06-19
|
||||||
|
|
||||||
|
### Commands
|
||||||
|
|
||||||
|
* Add missing subcommands to #npcedit ([#3423](https://github.com/EQEmu/Server/pull/3423)) @Kinglykrab 2023-06-19
|
||||||
|
|
||||||
|
### Database
|
||||||
|
|
||||||
|
* Implement native database migrations in server ([#2857](https://github.com/EQEmu/Server/pull/2857)) @Akkadius 2023-06-19
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Fix possible crash with #npcedit weapon ([#3421](https://github.com/EQEmu/Server/pull/3421)) @Kinglykrab 2023-06-19
|
||||||
|
|
||||||
## [22.14.1] - 06/18/2023
|
## [22.14.1] - 06/18/2023
|
||||||
|
|
||||||
### Backups
|
### Backups
|
||||||
|
|||||||
+23
-2
@@ -17,13 +17,19 @@ SET(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|||||||
SET(CMAKE_CXX_EXTENSIONS OFF)
|
SET(CMAKE_CXX_EXTENSIONS OFF)
|
||||||
|
|
||||||
OPTION(EQEMU_BUILD_STATIC "Build with static linking" OFF)
|
OPTION(EQEMU_BUILD_STATIC "Build with static linking" OFF)
|
||||||
|
OPTION(EQEMU_BUILD_PCH "Build with precompiled headers (Windows)" ON)
|
||||||
|
|
||||||
IF (EQEMU_BUILD_STATIC)
|
IF (EQEMU_BUILD_STATIC)
|
||||||
SET(BUILD_SHARED_LIBS OFF)
|
SET(BUILD_SHARED_LIBS OFF)
|
||||||
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".lib" ".a")
|
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".lib" ".a")
|
||||||
MESSAGE(STATUS "Building with static linking")
|
MESSAGE(STATUS "Building with static linking")
|
||||||
SET(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")
|
SET(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")
|
||||||
ENDIF(EQEMU_BUILD_STATIC)
|
IF (UNIX)
|
||||||
|
SET(PERL_LIBRARY "/opt/eqemu-perl/lib/5.32.1/x86_64-linux-thread-multi/CORE/libperl.so")
|
||||||
|
SET(PERL_INCLUDE_PATH "/opt/eqemu-perl/lib/5.32.1/x86_64-linux-thread-multi/CORE/")
|
||||||
|
SET(PERL_EXECUTABLE "/opt/eqemu-perl/bin/perl")
|
||||||
|
ENDIF ()
|
||||||
|
ENDIF (EQEMU_BUILD_STATIC)
|
||||||
|
|
||||||
IF(MSVC)
|
IF(MSVC)
|
||||||
ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
|
ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
|
||||||
@@ -32,7 +38,11 @@ IF(MSVC)
|
|||||||
ADD_DEFINITIONS(-D_HAS_AUTO_PTR_ETC) # for Luabind on C++17
|
ADD_DEFINITIONS(-D_HAS_AUTO_PTR_ETC) # for Luabind on C++17
|
||||||
|
|
||||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
|
||||||
ADD_DEFINITIONS( "/W0 /D_CRT_SECURE_NO_WARNINGS /wd4005 /wd4996 /nologo /Os")
|
|
||||||
|
OPTION(EQEMU_DISABLE_MSVC_WARNINGS "Disable MSVC compile warnings." ON)
|
||||||
|
IF(EQEMU_DISABLE_MSVC_WARNINGS)
|
||||||
|
ADD_DEFINITIONS( "/W0 /D_CRT_SECURE_NO_WARNINGS /wd4005 /wd4996 /nologo /Os")
|
||||||
|
ENDIF(EQEMU_DISABLE_MSVC_WARNINGS)
|
||||||
ELSE(MSVC)
|
ELSE(MSVC)
|
||||||
ADD_DEFINITIONS(-DHAS_UNION_SEMUN)
|
ADD_DEFINITIONS(-DHAS_UNION_SEMUN)
|
||||||
ENDIF(MSVC)
|
ENDIF(MSVC)
|
||||||
@@ -129,6 +139,13 @@ ELSE()
|
|||||||
MESSAGE(STATUS "* mbedTLS: MISSING *")
|
MESSAGE(STATUS "* mbedTLS: MISSING *")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
MESSAGE(STATUS "PERL_INCLUDE_PATH: ${PERL_INCLUDE_PATH}")
|
||||||
|
MESSAGE(STATUS "PERL_LIBRARY: ${PERL_LIBRARY}")
|
||||||
|
MESSAGE(STATUS "PERL_INCLUDE_DIR: ${PERL_INCLUDE_DIR}")
|
||||||
|
MESSAGE(STATUS "PERL_INCLUDE_DIRS: ${PERL_INCLUDE_DIRS}")
|
||||||
|
MESSAGE(STATUS "PERL_LIBRARIES: ${PERL_LIBRARIES}")
|
||||||
|
MESSAGE(STATUS "PERL_VERSION: ${PERL_VERSION}")
|
||||||
|
|
||||||
MESSAGE(STATUS "**************************************************")
|
MESSAGE(STATUS "**************************************************")
|
||||||
|
|
||||||
#options
|
#options
|
||||||
@@ -384,6 +401,10 @@ IF(PERL_LIBRARY_ENABLED)
|
|||||||
INCLUDE_DIRECTORIES(SYSTEM "${PERL_LIBRARY_INCLUDE}")
|
INCLUDE_DIRECTORIES(SYSTEM "${PERL_LIBRARY_INCLUDE}")
|
||||||
ADD_DEFINITIONS(-DEMBPERL)
|
ADD_DEFINITIONS(-DEMBPERL)
|
||||||
ADD_DEFINITIONS(-DEMBPERL_PLUGIN)
|
ADD_DEFINITIONS(-DEMBPERL_PLUGIN)
|
||||||
|
ADD_DEFINITIONS(-DPERLBIND_NO_STRICT_SCALAR_TYPES)
|
||||||
|
IF (UNIX AND EQEMU_BUILD_STATIC)
|
||||||
|
SET(SERVER_LIBS ${SERVER_LIBS} libcrypt.a)
|
||||||
|
ENDIF ()
|
||||||
ENDIF()
|
ENDIF()
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
CMAKE_MINIMUM_REQUIRED(VERSION 3.2)
|
CMAKE_MINIMUM_REQUIRED(VERSION 3.5)
|
||||||
|
|
||||||
add_subdirectory(import)
|
add_subdirectory(import)
|
||||||
add_subdirectory(export)
|
add_subdirectory(export)
|
||||||
|
|||||||
+13
-3
@@ -13,8 +13,10 @@ SET(common_sources
|
|||||||
crc32.cpp
|
crc32.cpp
|
||||||
database/database_dump_service.cpp
|
database/database_dump_service.cpp
|
||||||
database.cpp
|
database.cpp
|
||||||
database_conversions.cpp
|
|
||||||
database_instances.cpp
|
database_instances.cpp
|
||||||
|
database/database_update_manifest.cpp
|
||||||
|
database/database_update_manifest_bots.cpp
|
||||||
|
database/database_update.cpp
|
||||||
dbcore.cpp
|
dbcore.cpp
|
||||||
deity.cpp
|
deity.cpp
|
||||||
dynamic_zone_base.cpp
|
dynamic_zone_base.cpp
|
||||||
@@ -67,6 +69,7 @@ SET(common_sources
|
|||||||
perl_eqdb.cpp
|
perl_eqdb.cpp
|
||||||
perl_eqdb_res.cpp
|
perl_eqdb_res.cpp
|
||||||
process/process.cpp
|
process/process.cpp
|
||||||
|
process.cpp
|
||||||
proc_launcher.cpp
|
proc_launcher.cpp
|
||||||
profanity_manager.cpp
|
profanity_manager.cpp
|
||||||
ptimer.cpp
|
ptimer.cpp
|
||||||
@@ -87,6 +90,7 @@ SET(common_sources
|
|||||||
timer.cpp
|
timer.cpp
|
||||||
unix.cpp
|
unix.cpp
|
||||||
platform.cpp
|
platform.cpp
|
||||||
|
json/json.hpp
|
||||||
json/jsoncpp.cpp
|
json/jsoncpp.cpp
|
||||||
zone_store.cpp
|
zone_store.cpp
|
||||||
net/console_server.cpp
|
net/console_server.cpp
|
||||||
@@ -506,6 +510,7 @@ SET(common_headers
|
|||||||
data_verification.h
|
data_verification.h
|
||||||
database.h
|
database.h
|
||||||
database_schema.h
|
database_schema.h
|
||||||
|
database/database_update.h
|
||||||
dbcore.h
|
dbcore.h
|
||||||
deity.h
|
deity.h
|
||||||
discord/discord.h
|
discord/discord.h
|
||||||
@@ -535,7 +540,6 @@ SET(common_headers
|
|||||||
events/player_event_logs.h
|
events/player_event_logs.h
|
||||||
events/player_event_discord_formatter.h
|
events/player_event_discord_formatter.h
|
||||||
events/player_events.h
|
events/player_events.h
|
||||||
errmsg.h
|
|
||||||
event_sub.h
|
event_sub.h
|
||||||
expedition_lockout_timer.h
|
expedition_lockout_timer.h
|
||||||
extprofile.h
|
extprofile.h
|
||||||
@@ -579,12 +583,14 @@ SET(common_headers
|
|||||||
path_manager.cpp
|
path_manager.cpp
|
||||||
platform.h
|
platform.h
|
||||||
process/process.h
|
process/process.h
|
||||||
|
process.h
|
||||||
proc_launcher.h
|
proc_launcher.h
|
||||||
profanity_manager.h
|
profanity_manager.h
|
||||||
profiler.h
|
profiler.h
|
||||||
ptimer.h
|
ptimer.h
|
||||||
queue.h
|
queue.h
|
||||||
races.h
|
races.h
|
||||||
|
raid.h
|
||||||
random.h
|
random.h
|
||||||
rdtsc.h
|
rdtsc.h
|
||||||
rulesys.h
|
rulesys.h
|
||||||
@@ -666,7 +672,8 @@ SET(common_headers
|
|||||||
StackWalker/StackWalker.h
|
StackWalker/StackWalker.h
|
||||||
util/memory_stream.h
|
util/memory_stream.h
|
||||||
util/directory.h
|
util/directory.h
|
||||||
util/uuid.h)
|
util/uuid.h
|
||||||
|
)
|
||||||
|
|
||||||
SOURCE_GROUP(Event FILES
|
SOURCE_GROUP(Event FILES
|
||||||
event/event_loop.h
|
event/event_loop.h
|
||||||
@@ -783,5 +790,8 @@ IF (UNIX)
|
|||||||
SET_SOURCE_FILES_PROPERTIES("patches/sod.cpp" "patches/sof.cpp" "patches/rof.cpp" "patches/rof2.cpp" "patches/uf.cpp" PROPERTIES COMPILE_FLAGS -O0)
|
SET_SOURCE_FILES_PROPERTIES("patches/sod.cpp" "patches/sof.cpp" "patches/rof.cpp" "patches/rof2.cpp" "patches/uf.cpp" PROPERTIES COMPILE_FLAGS -O0)
|
||||||
ENDIF (UNIX)
|
ENDIF (UNIX)
|
||||||
|
|
||||||
|
IF (WIN32 AND EQEMU_BUILD_PCH)
|
||||||
|
TARGET_PRECOMPILE_HEADERS(common PRIVATE pch/pch.h)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
|
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
|
||||||
|
|||||||
+327
-455
File diff suppressed because it is too large
Load Diff
+99
-92
@@ -19,98 +19,106 @@
|
|||||||
#define CLASSES_CH
|
#define CLASSES_CH
|
||||||
|
|
||||||
#include "../common/types.h"
|
#include "../common/types.h"
|
||||||
|
#include "../common/rulesys.h"
|
||||||
|
#include <string>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
#define NO_CLASS 0
|
namespace Class {
|
||||||
#define WARRIOR 1
|
constexpr uint8 None = 0;
|
||||||
#define CLERIC 2
|
constexpr uint8 Warrior = 1;
|
||||||
#define PALADIN 3
|
constexpr uint8 Cleric = 2;
|
||||||
#define RANGER 4
|
constexpr uint8 Paladin = 3;
|
||||||
#define SHADOWKNIGHT 5
|
constexpr uint8 Ranger = 4;
|
||||||
#define DRUID 6
|
constexpr uint8 ShadowKnight = 5;
|
||||||
#define MONK 7
|
constexpr uint8 Druid = 6;
|
||||||
#define BARD 8
|
constexpr uint8 Monk = 7;
|
||||||
#define ROGUE 9
|
constexpr uint8 Bard = 8;
|
||||||
#define SHAMAN 10
|
constexpr uint8 Rogue = 9;
|
||||||
#define NECROMANCER 11
|
constexpr uint8 Shaman = 10;
|
||||||
#define WIZARD 12
|
constexpr uint8 Necromancer = 11;
|
||||||
#define MAGICIAN 13
|
constexpr uint8 Wizard = 12;
|
||||||
#define ENCHANTER 14
|
constexpr uint8 Magician = 13;
|
||||||
#define BEASTLORD 15
|
constexpr uint8 Enchanter = 14;
|
||||||
#define BERSERKER 16
|
constexpr uint8 Beastlord = 15;
|
||||||
#define WARRIORGM 20
|
constexpr uint8 Berserker = 16;
|
||||||
#define CLERICGM 21
|
constexpr uint8 WarriorGM = 20;
|
||||||
#define PALADINGM 22
|
constexpr uint8 ClericGM = 21;
|
||||||
#define RANGERGM 23
|
constexpr uint8 PaladinGM = 22;
|
||||||
#define SHADOWKNIGHTGM 24
|
constexpr uint8 RangerGM = 23;
|
||||||
#define DRUIDGM 25
|
constexpr uint8 ShadowKnightGM = 24;
|
||||||
#define MONKGM 26
|
constexpr uint8 DruidGM = 25;
|
||||||
#define BARDGM 27
|
constexpr uint8 MonkGM = 26;
|
||||||
#define ROGUEGM 28
|
constexpr uint8 BardGM = 27;
|
||||||
#define SHAMANGM 29
|
constexpr uint8 RogueGM = 28;
|
||||||
#define NECROMANCERGM 30
|
constexpr uint8 ShamanGM = 29;
|
||||||
#define WIZARDGM 31
|
constexpr uint8 NecromancerGM = 30;
|
||||||
#define MAGICIANGM 32
|
constexpr uint8 WizardGM = 31;
|
||||||
#define ENCHANTERGM 33
|
constexpr uint8 MagicianGM = 32;
|
||||||
#define BEASTLORDGM 34
|
constexpr uint8 EnchanterGM = 33;
|
||||||
#define BERSERKERGM 35
|
constexpr uint8 BeastlordGM = 34;
|
||||||
#define BANKER 40
|
constexpr uint8 BerserkerGM = 35;
|
||||||
#define MERCHANT 41
|
constexpr uint8 Banker = 40;
|
||||||
#define DISCORD_MERCHANT 59
|
constexpr uint8 Merchant = 41;
|
||||||
#define ADVENTURE_RECRUITER 60
|
constexpr uint8 DiscordMerchant = 59;
|
||||||
#define ADVENTURE_MERCHANT 61
|
constexpr uint8 AdventureRecruiter = 60;
|
||||||
#define LDON_TREASURE 62 // objects you can use /open on first seen in LDONs, seen on Danvi's Corpse in Akheva
|
constexpr uint8 AdventureMerchant = 61;
|
||||||
#define TRIBUTE_MASTER 63
|
constexpr uint8 LDoNTreasure = 62;
|
||||||
#define GUILD_TRIBUTE_MASTER 64 // not sure
|
constexpr uint8 TributeMaster = 63;
|
||||||
#define GUILD_BANKER 66
|
constexpr uint8 GuildTributeMaster = 64;
|
||||||
#define NORRATHS_KEEPERS_MERCHANT 67
|
constexpr uint8 GuildBanker = 66;
|
||||||
#define DARK_REIGN_MERCHANT 68
|
constexpr uint8 NorrathsKeepersMerchant = 67;
|
||||||
#define FELLOWSHIP_MASTER 69
|
constexpr uint8 DarkReignMerchant = 68;
|
||||||
#define ALT_CURRENCY_MERCHANT 70
|
constexpr uint8 FellowshipMaster = 69;
|
||||||
#define MERCENARY_MASTER 71
|
constexpr uint8 AlternateCurrencyMerchant = 70;
|
||||||
|
constexpr uint8 MercenaryLiaison = 71;
|
||||||
|
|
||||||
|
constexpr uint8 PLAYER_CLASS_COUNT = 16;
|
||||||
|
constexpr uint16 ALL_CLASSES_BITMASK = 65535;
|
||||||
|
};
|
||||||
|
|
||||||
// player class values
|
static std::map<uint8, uint16> player_class_bitmasks = {
|
||||||
#define PLAYER_CLASS_UNKNOWN 0
|
{Class::Warrior, 1},
|
||||||
#define PLAYER_CLASS_WARRIOR 1
|
{Class::Cleric, 2},
|
||||||
#define PLAYER_CLASS_CLERIC 2
|
{Class::Paladin, 4},
|
||||||
#define PLAYER_CLASS_PALADIN 3
|
{Class::Ranger, 8},
|
||||||
#define PLAYER_CLASS_RANGER 4
|
{Class::ShadowKnight, 16},
|
||||||
#define PLAYER_CLASS_SHADOWKNIGHT 5
|
{Class::Druid, 32},
|
||||||
#define PLAYER_CLASS_DRUID 6
|
{Class::Monk, 64},
|
||||||
#define PLAYER_CLASS_MONK 7
|
{Class::Bard, 128},
|
||||||
#define PLAYER_CLASS_BARD 8
|
{Class::Rogue, 256},
|
||||||
#define PLAYER_CLASS_ROGUE 9
|
{Class::Shaman, 512},
|
||||||
#define PLAYER_CLASS_SHAMAN 10
|
{Class::Necromancer, 1024},
|
||||||
#define PLAYER_CLASS_NECROMANCER 11
|
{Class::Wizard, 2048},
|
||||||
#define PLAYER_CLASS_WIZARD 12
|
{Class::Magician, 4096},
|
||||||
#define PLAYER_CLASS_MAGICIAN 13
|
{Class::Enchanter, 8192},
|
||||||
#define PLAYER_CLASS_ENCHANTER 14
|
{Class::Beastlord, 16384},
|
||||||
#define PLAYER_CLASS_BEASTLORD 15
|
{Class::Berserker, 32768},
|
||||||
#define PLAYER_CLASS_BERSERKER 16
|
};
|
||||||
|
|
||||||
#define PLAYER_CLASS_COUNT 16
|
static std::string shadow_knight_class_name = (
|
||||||
|
RuleB(World, UseOldShadowKnightClassExport) ?
|
||||||
|
"Shadowknight" :
|
||||||
|
"Shadow Knight"
|
||||||
|
);
|
||||||
|
|
||||||
|
static std::map<uint8, std::string> class_names = {
|
||||||
// player class bits
|
{Class::Warrior, "Warrior"},
|
||||||
#define PLAYER_CLASS_UNKNOWN_BIT 0
|
{Class::Cleric, "Cleric"},
|
||||||
#define PLAYER_CLASS_WARRIOR_BIT 1
|
{Class::Paladin, "Paladin"},
|
||||||
#define PLAYER_CLASS_CLERIC_BIT 2
|
{Class::Ranger, "Ranger"},
|
||||||
#define PLAYER_CLASS_PALADIN_BIT 4
|
{Class::ShadowKnight, shadow_knight_class_name},
|
||||||
#define PLAYER_CLASS_RANGER_BIT 8
|
{Class::Druid, "Druid"},
|
||||||
#define PLAYER_CLASS_SHADOWKNIGHT_BIT 16
|
{Class::Monk, "Monk"},
|
||||||
#define PLAYER_CLASS_DRUID_BIT 32
|
{Class::Bard, "Bard"},
|
||||||
#define PLAYER_CLASS_MONK_BIT 64
|
{Class::Rogue, "Rogue"},
|
||||||
#define PLAYER_CLASS_BARD_BIT 128
|
{Class::Shaman, "Shaman"},
|
||||||
#define PLAYER_CLASS_ROGUE_BIT 256
|
{Class::Necromancer, "Necromancer"},
|
||||||
#define PLAYER_CLASS_SHAMAN_BIT 512
|
{Class::Wizard, "Wizard"},
|
||||||
#define PLAYER_CLASS_NECROMANCER_BIT 1024
|
{Class::Magician, "Magician"},
|
||||||
#define PLAYER_CLASS_WIZARD_BIT 2048
|
{Class::Enchanter, "Enchanter"},
|
||||||
#define PLAYER_CLASS_MAGICIAN_BIT 4096
|
{Class::Beastlord, "Beastlord"},
|
||||||
#define PLAYER_CLASS_ENCHANTER_BIT 8192
|
{Class::Berserker, "Berserker"},
|
||||||
#define PLAYER_CLASS_BEASTLORD_BIT 16384
|
};
|
||||||
#define PLAYER_CLASS_BERSERKER_BIT 32768
|
|
||||||
|
|
||||||
#define PLAYER_CLASS_ALL_MASK 65535 // was 65536
|
|
||||||
|
|
||||||
|
|
||||||
#define ARMOR_TYPE_UNKNOWN 0
|
#define ARMOR_TYPE_UNKNOWN 0
|
||||||
@@ -125,13 +133,12 @@
|
|||||||
|
|
||||||
|
|
||||||
const char* GetClassIDName(uint8 class_id, uint8 level = 0);
|
const char* GetClassIDName(uint8 class_id, uint8 level = 0);
|
||||||
const char* GetPlayerClassName(uint32 player_class_value, uint8 level = 0);
|
|
||||||
|
|
||||||
uint32 GetPlayerClassValue(uint8 class_id);
|
bool IsPlayerClass(uint8 class_id);
|
||||||
uint32 GetPlayerClassBit(uint8 class_id);
|
const std::string GetPlayerClassAbbreviation(uint8 class_id);
|
||||||
|
|
||||||
uint8 GetClassIDFromPlayerClassValue(uint32 player_class_value);
|
uint8 GetPlayerClassValue(uint8 class_id);
|
||||||
uint8 GetClassIDFromPlayerClassBit(uint32 player_class_bit);
|
uint16 GetPlayerClassBit(uint8 class_id);
|
||||||
|
|
||||||
bool IsFighterClass(uint8 class_id);
|
bool IsFighterClass(uint8 class_id);
|
||||||
bool IsSpellFighterClass(uint8 class_id);
|
bool IsSpellFighterClass(uint8 class_id);
|
||||||
|
|||||||
@@ -39,15 +39,15 @@ namespace EQEmuCommand {
|
|||||||
{
|
{
|
||||||
if (cmd[{"-d", "--debug"}]) {
|
if (cmd[{"-d", "--debug"}]) {
|
||||||
std::cout << "Positional args:\n";
|
std::cout << "Positional args:\n";
|
||||||
for (auto &pos_arg : cmd.pos_args())
|
for (auto &pos_arg: cmd.pos_args())
|
||||||
std::cout << '\t' << pos_arg << std::endl;
|
std::cout << '\t' << pos_arg << std::endl;
|
||||||
|
|
||||||
std::cout << "\nFlags:\n";
|
std::cout << "\nFlags:\n";
|
||||||
for (auto &flag : cmd.flags())
|
for (auto &flag: cmd.flags())
|
||||||
std::cout << '\t' << flag << std::endl;
|
std::cout << '\t' << flag << std::endl;
|
||||||
|
|
||||||
std::cout << "\nParameters:\n";
|
std::cout << "\nParameters:\n";
|
||||||
for (auto ¶m : cmd.params())
|
for (auto ¶m: cmd.params())
|
||||||
std::cout << '\t' << param.first << " : " << param.second << std::endl;
|
std::cout << '\t' << param.first << " : " << param.second << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -69,8 +69,8 @@ namespace EQEmuCommand {
|
|||||||
{
|
{
|
||||||
bool arguments_filled = true;
|
bool arguments_filled = true;
|
||||||
|
|
||||||
int index = 2;
|
int index = 2;
|
||||||
for (auto &arg : arguments) {
|
for (auto &arg: arguments) {
|
||||||
if (cmd(arg).str().empty() && cmd(index).str().empty()) {
|
if (cmd(arg).str().empty() && cmd(index).str().empty()) {
|
||||||
arguments_filled = false;
|
arguments_filled = false;
|
||||||
}
|
}
|
||||||
@@ -79,12 +79,12 @@ namespace EQEmuCommand {
|
|||||||
|
|
||||||
if (!arguments_filled || (argc == 2 && !cmd[{"-h", "--help"}]) || (argc == 3 && cmd[{"-h", "--help"}])) {
|
if (!arguments_filled || (argc == 2 && !cmd[{"-h", "--help"}]) || (argc == 3 && cmd[{"-h", "--help"}])) {
|
||||||
std::string arguments_string;
|
std::string arguments_string;
|
||||||
for (auto &arg : arguments) {
|
for (auto &arg: arguments) {
|
||||||
arguments_string += " " + arg;
|
arguments_string += " " + arg;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string options_string;
|
std::string options_string;
|
||||||
for (auto &opt : options) {
|
for (auto &opt: options) {
|
||||||
options_string += " " + opt + "\n";
|
options_string += " " + opt + "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,14 +124,6 @@ namespace EQEmuCommand {
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
std::string description;
|
std::string description;
|
||||||
bool ran_command = false;
|
|
||||||
for (auto &it: in_function_map) {
|
|
||||||
if (it.first == argv[1]) {
|
|
||||||
(it.second)(argc, argv, cmd, description);
|
|
||||||
ran_command = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cmd[{"-h", "--help"}]) {
|
if (cmd[{"-h", "--help"}]) {
|
||||||
std::cout << std::endl;
|
std::cout << std::endl;
|
||||||
std::cout <<
|
std::cout <<
|
||||||
@@ -142,9 +134,7 @@ namespace EQEmuCommand {
|
|||||||
<< std::endl
|
<< std::endl
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
|
|
||||||
/**
|
// Get max command length for padding length
|
||||||
* Get max command length for padding length
|
|
||||||
*/
|
|
||||||
int max_command_length = 0;
|
int max_command_length = 0;
|
||||||
|
|
||||||
for (auto &it: in_function_map) {
|
for (auto &it: in_function_map) {
|
||||||
@@ -155,18 +145,14 @@ namespace EQEmuCommand {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// Display command menu
|
||||||
* Display command menu
|
|
||||||
*/
|
|
||||||
std::string command_section;
|
std::string command_section;
|
||||||
for (auto &it: in_function_map) {
|
for (auto &it: in_function_map) {
|
||||||
description.clear();
|
description.clear();
|
||||||
|
|
||||||
(it.second)(argc, argv, cmd, description);
|
(it.second)(argc, argv, cmd, description);
|
||||||
|
|
||||||
/**
|
// Print section header
|
||||||
* Print section header
|
|
||||||
*/
|
|
||||||
std::string command_prefix = it.first.substr(0, it.first.find(":"));
|
std::string command_prefix = it.first.substr(0, it.first.find(":"));
|
||||||
|
|
||||||
if (command_prefix.find("test") != std::string::npos) {
|
if (command_prefix.find("test") != std::string::npos) {
|
||||||
@@ -178,9 +164,7 @@ namespace EQEmuCommand {
|
|||||||
std::cout << termcolor::reset << command_prefix << std::endl;
|
std::cout << termcolor::reset << command_prefix << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// Print commands
|
||||||
* Print commands
|
|
||||||
*/
|
|
||||||
std::stringstream command;
|
std::stringstream command;
|
||||||
command << termcolor::colorize << termcolor::yellow << it.first << termcolor::reset;
|
command << termcolor::colorize << termcolor::yellow << it.first << termcolor::reset;
|
||||||
printf(" %-*s %s\n", max_command_length, command.str().c_str(), description.c_str());
|
printf(" %-*s %s\n", max_command_length, command.str().c_str(), description.c_str());
|
||||||
@@ -191,6 +175,15 @@ namespace EQEmuCommand {
|
|||||||
std::exit(0);
|
std::exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ran_command = false;
|
||||||
|
|
||||||
|
for (auto &it: in_function_map) {
|
||||||
|
if (it.first == argv[1]) {
|
||||||
|
(it.second)(argc, argv, cmd, description);
|
||||||
|
ran_command = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (ran_command) {
|
if (ran_command) {
|
||||||
std::exit(0);
|
std::exit(0);
|
||||||
}
|
}
|
||||||
|
|||||||
+52
-39
@@ -29,6 +29,8 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "../common/repositories/account_repository.h"
|
||||||
|
|
||||||
// Disgrace: for windows compile
|
// Disgrace: for windows compile
|
||||||
#ifdef _WINDOWS
|
#ifdef _WINDOWS
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
@@ -1643,25 +1645,20 @@ void Database::ClearGroupLeader(uint32 gid) {
|
|||||||
std::cout << "Unable to clear group leader: " << results.ErrorMessage() << std::endl;
|
std::cout << "Unable to clear group leader: " << results.ErrorMessage() << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8 Database::GetAgreementFlag(uint32 acctid) {
|
uint8 Database::GetAgreementFlag(uint32 account_id)
|
||||||
|
{
|
||||||
std::string query = StringFormat("SELECT rulesflag FROM account WHERE id=%i",acctid);
|
const auto& e = AccountRepository::FindOne(*this, account_id);
|
||||||
auto results = QueryDatabase(query);
|
if (!e.id) {
|
||||||
|
|
||||||
if (!results.Success())
|
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (results.RowCount() != 1)
|
return e.rulesflag;
|
||||||
return 0;
|
|
||||||
|
|
||||||
auto row = results.begin();
|
|
||||||
|
|
||||||
return Strings::ToUnsignedInt(row[0]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Database::SetAgreementFlag(uint32 acctid) {
|
void Database::SetAgreementFlag(uint32 account_id) {
|
||||||
std::string query = StringFormat("UPDATE account SET rulesflag=1 where id=%i", acctid);
|
auto e = AccountRepository::FindOne(*this, account_id);
|
||||||
QueryDatabase(query);
|
e.rulesflag = 1;
|
||||||
|
AccountRepository::UpdateOne(*this, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Database::ClearRaid(uint32 rid) {
|
void Database::ClearRaid(uint32 rid) {
|
||||||
@@ -2097,37 +2094,45 @@ void Database::ClearInvSnapshots(bool from_now) {
|
|||||||
|
|
||||||
struct TimeOfDay_Struct Database::LoadTime(time_t &realtime)
|
struct TimeOfDay_Struct Database::LoadTime(time_t &realtime)
|
||||||
{
|
{
|
||||||
|
TimeOfDay_Struct t{};
|
||||||
TimeOfDay_Struct eqTime;
|
std::string query = StringFormat("SELECT minute,hour,day,month,year,realtime FROM eqtime limit 1");
|
||||||
std::string query = StringFormat("SELECT minute,hour,day,month,year,realtime FROM eqtime limit 1");
|
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
|
|
||||||
if (!results.Success() || results.RowCount() == 0){
|
if (!results.Success() || results.RowCount() == 0) {
|
||||||
LogInfo("Loading EQ time of day failed. Using defaults");
|
LogInfo("Loading EQ time of day failed. Using defaults");
|
||||||
eqTime.minute = 0;
|
t.minute = 0;
|
||||||
eqTime.hour = 9;
|
t.hour = 9;
|
||||||
eqTime.day = 1;
|
t.day = 1;
|
||||||
eqTime.month = 1;
|
t.month = 1;
|
||||||
eqTime.year = 3100;
|
t.year = 3100;
|
||||||
realtime = time(nullptr);
|
realtime = time(nullptr);
|
||||||
}
|
return t;
|
||||||
else{
|
|
||||||
auto row = results.begin();
|
|
||||||
|
|
||||||
eqTime.minute = Strings::ToUnsignedInt(row[0]);
|
|
||||||
eqTime.hour = Strings::ToUnsignedInt(row[1]);
|
|
||||||
eqTime.day = Strings::ToUnsignedInt(row[2]);
|
|
||||||
eqTime.month = Strings::ToUnsignedInt(row[3]);
|
|
||||||
eqTime.year = Strings::ToUnsignedInt(row[4]);
|
|
||||||
realtime = Strings::ToBigInt(row[5]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return eqTime;
|
auto row = results.begin();
|
||||||
|
|
||||||
|
uint8 hour = Strings::ToUnsignedInt(row[1]);
|
||||||
|
time_t realtime_ = Strings::ToBigInt(row[5]);
|
||||||
|
if (RuleI(World, BootHour) > 0 && RuleI(World, BootHour) <= 24) {
|
||||||
|
hour = RuleI(World, BootHour);
|
||||||
|
realtime_ = time(nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
t.minute = Strings::ToUnsignedInt(row[0]);
|
||||||
|
t.hour = hour;
|
||||||
|
t.day = Strings::ToUnsignedInt(row[2]);
|
||||||
|
t.month = Strings::ToUnsignedInt(row[3]);
|
||||||
|
t.year = Strings::ToUnsignedInt(row[4]);
|
||||||
|
realtime = realtime_;
|
||||||
|
|
||||||
|
LogEqTime("Setting hour to [{}]", hour);
|
||||||
|
|
||||||
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Database::SaveTime(int8 minute, int8 hour, int8 day, int8 month, int16 year)
|
bool Database::SaveTime(int8 minute, int8 hour, int8 day, int8 month, int16 year)
|
||||||
{
|
{
|
||||||
std::string query = StringFormat("UPDATE eqtime set minute = %d, hour = %d, day = %d, month = %d, year = %d, realtime = %d limit 1", minute, hour, day, month, year, time(0));
|
std::string query = StringFormat("UPDATE eqtime set minute = %d, hour = %d, day = %d, month = %d, year = %d, realtime = %d limit 1", minute, hour, day, month, year, time(nullptr));
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
|
|
||||||
return results.Success();
|
return results.Success();
|
||||||
@@ -2241,6 +2246,11 @@ bool Database::CopyCharacter(
|
|||||||
row = results.begin();
|
row = results.begin();
|
||||||
std::string new_character_id = row[0];
|
std::string new_character_id = row[0];
|
||||||
|
|
||||||
|
std::vector<std::string> tables_to_zero_id = {
|
||||||
|
"keyring",
|
||||||
|
"data_buckets",
|
||||||
|
};
|
||||||
|
|
||||||
TransactionBegin();
|
TransactionBegin();
|
||||||
for (const auto &iter : DatabaseSchema::GetCharacterTables()) {
|
for (const auto &iter : DatabaseSchema::GetCharacterTables()) {
|
||||||
std::string table_name = iter.first;
|
std::string table_name = iter.first;
|
||||||
@@ -2274,6 +2284,10 @@ bool Database::CopyCharacter(
|
|||||||
std::string column = columns[column_index];
|
std::string column = columns[column_index];
|
||||||
std::string value = row[column_index] ? row[column_index] : "null";
|
std::string value = row[column_index] ? row[column_index] : "null";
|
||||||
|
|
||||||
|
if (column == "id" && Strings::Contains(tables_to_zero_id, table_name)) {
|
||||||
|
value = "0";
|
||||||
|
}
|
||||||
|
|
||||||
if (column == character_id_column_name) {
|
if (column == character_id_column_name) {
|
||||||
value = new_character_id;
|
value = new_character_id;
|
||||||
}
|
}
|
||||||
@@ -2321,7 +2335,6 @@ bool Database::CopyCharacter(
|
|||||||
if (!insert.ErrorMessage().empty()) {
|
if (!insert.ErrorMessage().empty()) {
|
||||||
TransactionRollback();
|
TransactionRollback();
|
||||||
return false;
|
return false;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2347,7 +2360,7 @@ void Database::SourceDatabaseTableFromUrl(std::string table_name, std::string ur
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (!DoesTableExist(table_name)) {
|
if (!DoesTableExist(table_name)) {
|
||||||
LogMySQLQuery("Table [{}] does not exist. Downloading from Github and installing...", table_name);
|
LogMySQLQuery("Table [{}] does not exist. Downloading and installing...", table_name);
|
||||||
|
|
||||||
// http get request
|
// http get request
|
||||||
httplib::Client cli(
|
httplib::Client cli(
|
||||||
@@ -2355,7 +2368,7 @@ void Database::SourceDatabaseTableFromUrl(std::string table_name, std::string ur
|
|||||||
"{}://{}",
|
"{}://{}",
|
||||||
request_uri.get_scheme(),
|
request_uri.get_scheme(),
|
||||||
request_uri.get_host()
|
request_uri.get_host()
|
||||||
).c_str()
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
cli.set_connection_timeout(0, 60000000); // 60 sec
|
cli.set_connection_timeout(0, 60000000); // 60 sec
|
||||||
|
|||||||
+2
-7
@@ -188,10 +188,10 @@ public:
|
|||||||
uint32 CheckLogin(const char* name, const char* password, const char *loginserver, int16* oStatus = 0);
|
uint32 CheckLogin(const char* name, const char* password, const char *loginserver, int16* oStatus = 0);
|
||||||
uint32 CreateAccount(const char* name, const char* password, int16 status, const char* loginserver, uint32 lsaccount_id);
|
uint32 CreateAccount(const char* name, const char* password, int16 status, const char* loginserver, uint32 lsaccount_id);
|
||||||
uint32 GetAccountIDFromLSID(const std::string& in_loginserver_id, uint32 in_loginserver_account_id, char* in_account_name = 0, int16* in_status = 0);
|
uint32 GetAccountIDFromLSID(const std::string& in_loginserver_id, uint32 in_loginserver_account_id, char* in_account_name = 0, int16* in_status = 0);
|
||||||
uint8 GetAgreementFlag(uint32 acctid);
|
uint8 GetAgreementFlag(uint32 account_id);
|
||||||
|
|
||||||
void GetAccountFromID(uint32 id, char* oAccountName, int16* oStatus);
|
void GetAccountFromID(uint32 id, char* oAccountName, int16* oStatus);
|
||||||
void SetAgreementFlag(uint32 acctid);
|
void SetAgreementFlag(uint32 account_id);
|
||||||
|
|
||||||
int GetIPExemption(std::string account_ip);
|
int GetIPExemption(std::string account_ip);
|
||||||
void SetIPExemption(std::string account_ip, int exemption_amount);
|
void SetIPExemption(std::string account_ip, int exemption_amount);
|
||||||
@@ -226,11 +226,6 @@ public:
|
|||||||
|
|
||||||
void PurgeAllDeletedDataBuckets();
|
void PurgeAllDeletedDataBuckets();
|
||||||
|
|
||||||
/* Database Conversions 'database_conversions.cpp' */
|
|
||||||
|
|
||||||
bool CheckDatabaseConversions();
|
|
||||||
bool CheckDatabaseConvertCorpseDeblob();
|
|
||||||
bool CheckDatabaseConvertPPDeblob();
|
|
||||||
|
|
||||||
/* Database Variables */
|
/* Database Variables */
|
||||||
|
|
||||||
|
|||||||
@@ -279,6 +279,11 @@ void DatabaseDumpService::DatabaseDump()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (IsDumpStaticInstanceData()) {
|
||||||
|
tables_to_dump += "instance_list";
|
||||||
|
options += " --no-create-info --where=\"instance_list.is_global > 0 and instance_list.never_expires > 0\"";
|
||||||
|
}
|
||||||
|
|
||||||
if (!dump_descriptor.empty()) {
|
if (!dump_descriptor.empty()) {
|
||||||
SetDumpFileName(GetDumpFileName() + dump_descriptor);
|
SetDumpFileName(GetDumpFileName() + dump_descriptor);
|
||||||
}
|
}
|
||||||
@@ -317,6 +322,10 @@ void DatabaseDumpService::DatabaseDump()
|
|||||||
pipe_file
|
pipe_file
|
||||||
);
|
);
|
||||||
|
|
||||||
|
LogInfo("Backing up database [{}]", execute_command);
|
||||||
|
LogInfo("This can take a few minutes depending on the size of your database");
|
||||||
|
LogInfo("LOADING... PLEASE WAIT...");
|
||||||
|
|
||||||
BuildCredentialsFile();
|
BuildCredentialsFile();
|
||||||
std::string execution_result = Process::execute(execute_command);
|
std::string execution_result = Process::execute(execute_command);
|
||||||
if (!execution_result.empty() && IsDumpOutputToConsole()) {
|
if (!execution_result.empty() && IsDumpOutputToConsole()) {
|
||||||
@@ -324,7 +333,9 @@ void DatabaseDumpService::DatabaseDump()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LogSys.LoadLogSettingsDefaults();
|
if (!IsDumpOutputToConsole()) {
|
||||||
|
LogSys.LoadLogSettingsDefaults();
|
||||||
|
}
|
||||||
|
|
||||||
if (!pipe_file.empty()) {
|
if (!pipe_file.empty()) {
|
||||||
std::string file = fmt::format("{}.sql", GetDumpFileNameWithPath());
|
std::string file = fmt::format("{}.sql", GetDumpFileNameWithPath());
|
||||||
@@ -604,3 +615,13 @@ void DatabaseDumpService::RemoveCredentialsFile()
|
|||||||
std::filesystem::remove(CREDENTIALS_FILE);
|
std::filesystem::remove(CREDENTIALS_FILE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool DatabaseDumpService::IsDumpStaticInstanceData()
|
||||||
|
{
|
||||||
|
return dump_static_instance_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DatabaseDumpService::SetDumpStaticInstanceData(bool b)
|
||||||
|
{
|
||||||
|
dump_static_instance_data = b;
|
||||||
|
}
|
||||||
|
|||||||
@@ -58,6 +58,9 @@ public:
|
|||||||
bool IsDumpMercTables() const;
|
bool IsDumpMercTables() const;
|
||||||
void SetDumpMercTables(bool dump_bot_tables);
|
void SetDumpMercTables(bool dump_bot_tables);
|
||||||
|
|
||||||
|
void SetDumpStaticInstanceData(bool b);
|
||||||
|
bool IsDumpStaticInstanceData();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool dump_all_tables = false;
|
bool dump_all_tables = false;
|
||||||
bool dump_state_tables = false;
|
bool dump_state_tables = false;
|
||||||
@@ -73,6 +76,8 @@ private:
|
|||||||
bool dump_drop_table_syntax_only = false;
|
bool dump_drop_table_syntax_only = false;
|
||||||
bool dump_bot_tables = false;
|
bool dump_bot_tables = false;
|
||||||
bool dump_merc_tables = false;
|
bool dump_merc_tables = false;
|
||||||
|
bool dump_static_instance_data = false;
|
||||||
|
|
||||||
std::string dump_path;
|
std::string dump_path;
|
||||||
std::string dump_file_name;
|
std::string dump_file_name;
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,324 @@
|
|||||||
|
#include <filesystem>
|
||||||
|
#include "database_update.h"
|
||||||
|
#include "../eqemu_logsys.h"
|
||||||
|
#include "../database.h"
|
||||||
|
#include "../strings.h"
|
||||||
|
#include "../rulesys.h"
|
||||||
|
#include "../http/httplib.h"
|
||||||
|
|
||||||
|
#include "database_update_manifest.cpp"
|
||||||
|
#include "database_update_manifest_bots.cpp"
|
||||||
|
#include "database_dump_service.h"
|
||||||
|
|
||||||
|
constexpr int BREAK_LENGTH = 70;
|
||||||
|
|
||||||
|
DatabaseVersion DatabaseUpdate::GetDatabaseVersions()
|
||||||
|
{
|
||||||
|
auto results = m_database->QueryDatabase("SELECT `version`, `bots_version` FROM `db_version` LIMIT 1");
|
||||||
|
if (!results.Success() || !results.RowCount()) {
|
||||||
|
LogError("Failed to read from [db_version] table!");
|
||||||
|
return DatabaseVersion{};
|
||||||
|
}
|
||||||
|
|
||||||
|
auto r = results.begin();
|
||||||
|
|
||||||
|
return DatabaseVersion{
|
||||||
|
.server_database_version = Strings::ToInt(r[0]),
|
||||||
|
.bots_database_version = Strings::ToInt(r[1]),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
DatabaseVersion DatabaseUpdate::GetBinaryDatabaseVersions()
|
||||||
|
{
|
||||||
|
return DatabaseVersion{
|
||||||
|
.server_database_version = CURRENT_BINARY_DATABASE_VERSION,
|
||||||
|
.bots_database_version = (RuleB(Bots, Enabled) ? CURRENT_BINARY_BOTS_DATABASE_VERSION : 0),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// the amount of versions we look-back to ensure we have all migrations
|
||||||
|
// we may not want to force these, but just warn about the look-backs
|
||||||
|
constexpr int LOOK_BACK_AMOUNT = 10;
|
||||||
|
|
||||||
|
// this check will take action
|
||||||
|
void DatabaseUpdate::CheckDbUpdates()
|
||||||
|
{
|
||||||
|
InjectBotsVersionColumn();
|
||||||
|
auto v = GetDatabaseVersions();
|
||||||
|
auto b = GetBinaryDatabaseVersions();
|
||||||
|
if (CheckVersionsUpToDate(v, b)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (UpdateManifest(manifest_entries, v.server_database_version, b.server_database_version)) {
|
||||||
|
LogInfo(
|
||||||
|
"Updates ran successfully, setting database version to [{}] from [{}]",
|
||||||
|
b.server_database_version,
|
||||||
|
v.server_database_version
|
||||||
|
);
|
||||||
|
m_database->QueryDatabase(fmt::format("UPDATE `db_version` SET `version` = {}", b.server_database_version));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (b.bots_database_version > 0) {
|
||||||
|
if (UpdateManifest(bot_manifest_entries, v.bots_database_version, b.bots_database_version)) {
|
||||||
|
LogInfo(
|
||||||
|
"Updates ran successfully, setting database version to [{}] from [{}]",
|
||||||
|
b.bots_database_version,
|
||||||
|
v.bots_database_version
|
||||||
|
);
|
||||||
|
m_database->QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"UPDATE `db_version` SET `bots_version` = {}",
|
||||||
|
b.bots_database_version
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string DatabaseUpdate::GetQueryResult(const ManifestEntry& e)
|
||||||
|
{
|
||||||
|
auto results = (e.content_schema_update ? m_content_database : m_database)->QueryDatabase(e.check);
|
||||||
|
|
||||||
|
std::vector<std::string> result_lines = {};
|
||||||
|
|
||||||
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
|
std::vector<std::string> cols;
|
||||||
|
|
||||||
|
int field_count = results.ColumnCount();
|
||||||
|
cols.reserve(field_count);
|
||||||
|
for (int i = 0; i < field_count; ++i) {
|
||||||
|
if (row[i] != nullptr) {
|
||||||
|
cols.emplace_back(row[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result_lines.emplace_back(Strings::Join(cols, " "));
|
||||||
|
}
|
||||||
|
|
||||||
|
return Strings::Join(result_lines, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DatabaseUpdate::ShouldRunMigration(ManifestEntry &e, std::string query_result)
|
||||||
|
{
|
||||||
|
std::string r = Strings::Trim(query_result);
|
||||||
|
if (e.condition == "contains") {
|
||||||
|
return Strings::Contains(r, e.match);
|
||||||
|
}
|
||||||
|
else if (e.condition == "match") {
|
||||||
|
return r == e.match;
|
||||||
|
}
|
||||||
|
else if (e.condition == "missing") {
|
||||||
|
return !Strings::Contains(r, e.match);
|
||||||
|
}
|
||||||
|
else if (e.condition == "empty") {
|
||||||
|
return r.empty();
|
||||||
|
}
|
||||||
|
else if (e.condition == "not_empty") {
|
||||||
|
return !r.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if we are running in a terminal
|
||||||
|
bool is_atty()
|
||||||
|
{
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
return ::_isatty(_fileno(stdin));
|
||||||
|
#else
|
||||||
|
return isatty(fileno(stdin));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// return true if we ran updates
|
||||||
|
bool DatabaseUpdate::UpdateManifest(
|
||||||
|
std::vector<ManifestEntry> entries,
|
||||||
|
int version_low,
|
||||||
|
int version_high
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<int> missing_migrations = {};
|
||||||
|
if (version_low != version_high) {
|
||||||
|
|
||||||
|
LogSys.DisableMySQLErrorLogs();
|
||||||
|
for (int version = version_low + 1; version <= version_high; ++version) {
|
||||||
|
for (auto &e: entries) {
|
||||||
|
if (e.version == version) {
|
||||||
|
bool has_migration = true;
|
||||||
|
std::string r = GetQueryResult(e);
|
||||||
|
if (ShouldRunMigration(e, r)) {
|
||||||
|
has_migration = false;
|
||||||
|
missing_migrations.emplace_back(e.version);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string prefix = fmt::format(
|
||||||
|
"[{}]",
|
||||||
|
has_migration ? "ok" : "missing"
|
||||||
|
);
|
||||||
|
|
||||||
|
LogInfo(
|
||||||
|
"[{}] {:>10} | [{}]",
|
||||||
|
e.version,
|
||||||
|
prefix,
|
||||||
|
e.description
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LogSys.EnableMySQLErrorLogs();
|
||||||
|
LogInfo("{}", Strings::Repeat("-", BREAK_LENGTH));
|
||||||
|
|
||||||
|
if (!missing_migrations.empty()) {
|
||||||
|
LogInfo("Automatically backing up database before applying updates");
|
||||||
|
LogInfo("{}", Strings::Repeat("-", BREAK_LENGTH));
|
||||||
|
auto s = DatabaseDumpService();
|
||||||
|
s.SetDumpAllTables(true);
|
||||||
|
s.SetDumpWithCompression(true);
|
||||||
|
s.DatabaseDump();
|
||||||
|
LogInfo("{}", Strings::Repeat("-", BREAK_LENGTH));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!missing_migrations.empty()) {
|
||||||
|
LogInfo("Running database migrations. Please wait...");
|
||||||
|
LogInfo("{}", Strings::Repeat("-", BREAK_LENGTH));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto &m: missing_migrations) {
|
||||||
|
for (auto &e: entries) {
|
||||||
|
if (e.version == m) {
|
||||||
|
bool errored_migration = false;
|
||||||
|
|
||||||
|
auto r = (e.content_schema_update ? m_content_database : m_database)->QueryDatabaseMulti(e.sql);
|
||||||
|
|
||||||
|
// ignore empty query result "errors"
|
||||||
|
if (r.ErrorNumber() != 1065 && !r.ErrorMessage().empty()) {
|
||||||
|
LogError("(#{}) [{}]", r.ErrorNumber(), r.ErrorMessage());
|
||||||
|
errored_migration = true;
|
||||||
|
|
||||||
|
LogInfo("Required database update failed. This could be a problem");
|
||||||
|
|
||||||
|
// if terminal attached then prompt for skip
|
||||||
|
if (is_atty()) {
|
||||||
|
LogInfo("Would you like to skip this update? [y/n] (Timeout 60s)");
|
||||||
|
|
||||||
|
// user input
|
||||||
|
std::string input;
|
||||||
|
bool gave_input = false;
|
||||||
|
time_t start_time = time(nullptr);
|
||||||
|
time_t wait_time_seconds = 60;
|
||||||
|
|
||||||
|
// spawn a concurrent thread that waits for input from std::cin
|
||||||
|
std::thread t1(
|
||||||
|
[&]() {
|
||||||
|
std::cin >> input;
|
||||||
|
gave_input = true;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
t1.detach();
|
||||||
|
|
||||||
|
// check the inputReceived flag once every 50ms for 10 seconds
|
||||||
|
while (time(nullptr) < start_time + wait_time_seconds && !gave_input) {
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(50));
|
||||||
|
}
|
||||||
|
|
||||||
|
// prompt for user skip
|
||||||
|
if (Strings::Trim(input) == "y") {
|
||||||
|
errored_migration = false;
|
||||||
|
LogInfo("Skipping update [{}] [{}]", e.version, e.description);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
errored_migration = true;
|
||||||
|
LogInfo("Skipping update [{}] [{}]", e.version, e.description);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LogInfo(
|
||||||
|
"[{}] [{}] [{}]",
|
||||||
|
e.version,
|
||||||
|
e.description,
|
||||||
|
(errored_migration ? "error" : "ok")
|
||||||
|
);
|
||||||
|
|
||||||
|
if (errored_migration) {
|
||||||
|
LogError("Fatal | Database migration [{}] failed to run", e.description);
|
||||||
|
LogError("Fatal | Shutting down");
|
||||||
|
std::exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LogInfo("{}", Strings::Repeat("-", BREAK_LENGTH));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
DatabaseUpdate *DatabaseUpdate::SetDatabase(Database *db)
|
||||||
|
{
|
||||||
|
m_database = db;
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
DatabaseUpdate *DatabaseUpdate::SetContentDatabase(Database *db)
|
||||||
|
{
|
||||||
|
m_content_database = db;
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DatabaseUpdate::CheckVersionsUpToDate(DatabaseVersion v, DatabaseVersion b)
|
||||||
|
{
|
||||||
|
LogInfo("{}", Strings::Repeat("-", BREAK_LENGTH));
|
||||||
|
|
||||||
|
LogInfo(
|
||||||
|
"{:>8} | database [{}] binary [{}] {}",
|
||||||
|
"Server",
|
||||||
|
v.server_database_version,
|
||||||
|
b.server_database_version,
|
||||||
|
(v.server_database_version == b.server_database_version) ? "up to date" : "checking updates"
|
||||||
|
);
|
||||||
|
|
||||||
|
if (RuleB(Bots, Enabled) && b.bots_database_version > 0) {
|
||||||
|
LogInfo(
|
||||||
|
"{:>8} | database [{}] binary [{}] {}",
|
||||||
|
"Bots",
|
||||||
|
v.bots_database_version,
|
||||||
|
b.bots_database_version,
|
||||||
|
(v.bots_database_version == b.bots_database_version) ? "up to date" : "checking updates"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
LogInfo("{:>8} | [server.auto_database_updates] [<green>true]", "Config");
|
||||||
|
|
||||||
|
LogInfo("{}", Strings::Repeat("-", BREAK_LENGTH));
|
||||||
|
|
||||||
|
// server database version is required
|
||||||
|
bool server_up_to_date = v.server_database_version >= b.server_database_version;
|
||||||
|
// bots database version is optional, if not enabled then it is always up-to-date
|
||||||
|
bool bots_up_to_date = RuleB(Bots, Enabled) ? v.bots_database_version >= b.bots_database_version : true;
|
||||||
|
|
||||||
|
return server_up_to_date && bots_up_to_date;
|
||||||
|
}
|
||||||
|
|
||||||
|
// checks to see if there are pending updates
|
||||||
|
// used by zone to prevent launch or boot loop until updates are applied
|
||||||
|
bool DatabaseUpdate::HasPendingUpdates()
|
||||||
|
{
|
||||||
|
auto v = GetDatabaseVersions();
|
||||||
|
auto b = GetBinaryDatabaseVersions();
|
||||||
|
|
||||||
|
return !CheckVersionsUpToDate(v, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DatabaseUpdate::InjectBotsVersionColumn()
|
||||||
|
{
|
||||||
|
auto r = m_database->QueryDatabase("show columns from db_version where Field like '%bots_version%'");
|
||||||
|
if (r.RowCount() == 0) {
|
||||||
|
m_database->QueryDatabase("ALTER TABLE db_version ADD bots_version int(11) DEFAULT '0' AFTER version");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
#ifndef EQEMU_DATABASE_UPDATE_H
|
||||||
|
#define EQEMU_DATABASE_UPDATE_H
|
||||||
|
|
||||||
|
#include "../database.h"
|
||||||
|
|
||||||
|
struct ManifestEntry {
|
||||||
|
int version{}; // database version of the migration
|
||||||
|
std::string description{}; // description of the migration ex: "add_new_table" or "add_index_to_table"
|
||||||
|
std::string check{}; // query that checks against the condition
|
||||||
|
std::string condition{}; // condition or "match_type" - Possible values [contains|match|missing|empty|not_empty]
|
||||||
|
std::string match{}; // match field that is not always used, but works in conjunction with "condition" values [missing|match|contains]
|
||||||
|
std::string sql{}; // the SQL DDL that gets ran when the condition is true
|
||||||
|
bool content_schema_update{}; // if true, this migration is a content schema update and should be ran against the content database
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DatabaseVersion {
|
||||||
|
int server_database_version;
|
||||||
|
int bots_database_version;
|
||||||
|
};
|
||||||
|
|
||||||
|
class DatabaseUpdate {
|
||||||
|
public:
|
||||||
|
DatabaseVersion GetDatabaseVersions();
|
||||||
|
DatabaseVersion GetBinaryDatabaseVersions();
|
||||||
|
void CheckDbUpdates();
|
||||||
|
std::string GetQueryResult(const ManifestEntry& e);
|
||||||
|
static bool ShouldRunMigration(ManifestEntry &e, std::string query_result);
|
||||||
|
bool UpdateManifest(std::vector<ManifestEntry> entries, int version_low, int version_high);
|
||||||
|
|
||||||
|
DatabaseUpdate *SetDatabase(Database *db);
|
||||||
|
DatabaseUpdate *SetContentDatabase(Database *db);
|
||||||
|
bool HasPendingUpdates();
|
||||||
|
private:
|
||||||
|
Database *m_database;
|
||||||
|
Database *m_content_database;
|
||||||
|
static bool CheckVersionsUpToDate(DatabaseVersion v, DatabaseVersion b);
|
||||||
|
void InjectBotsVersionColumn();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //EQEMU_DATABASE_UPDATE_H
|
||||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,129 @@
|
|||||||
|
#include "database_update.h"
|
||||||
|
|
||||||
|
std::vector<ManifestEntry> bot_manifest_entries = {
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9035,
|
||||||
|
.description = "2022_12_04_bot_archery.sql",
|
||||||
|
.check = "SHOW COLUMNS FROM `bot_data` LIKE 'archery_setting'",
|
||||||
|
.condition = "empty",
|
||||||
|
.match = "",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `bot_data`
|
||||||
|
ADD COLUMN `archery_setting` TINYINT(2) UNSIGNED NOT NULL DEFAULT '0' AFTER `enforce_spell_settings`;
|
||||||
|
)",
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9036,
|
||||||
|
.description = "2023_01_19_drop_bot_views.sql",
|
||||||
|
.check = "SHOW TABLES LIKE 'vw_groups'",
|
||||||
|
.condition = "not_empty",
|
||||||
|
.match = "",
|
||||||
|
.sql = R"(
|
||||||
|
DROP VIEW vw_bot_groups;
|
||||||
|
DROP VIEW vw_bot_character_mobs;
|
||||||
|
DROP VIEW vw_groups;
|
||||||
|
DROP VIEW vw_guild_members;
|
||||||
|
DROP TABLE bot_guild_members;
|
||||||
|
|
||||||
|
)",
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9037,
|
||||||
|
.description = "2023_01_22_add_name_index.sql",
|
||||||
|
.check = "show index from bot_data WHERE key_name = 'name`",
|
||||||
|
.condition = "",
|
||||||
|
.match = "empty",
|
||||||
|
.sql = R"(
|
||||||
|
create index `name` on bot_data(`name`);
|
||||||
|
)",
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9038,
|
||||||
|
.description = "2023_02_16_add_caster_range.sql",
|
||||||
|
.check = "SHOW COLUMNS FROM `bot_data` LIKE 'caster_range'",
|
||||||
|
.condition = "",
|
||||||
|
.match = "empty",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `bot_data`
|
||||||
|
ADD COLUMN `caster_range` INT(11) UNSIGNED NOT NULL DEFAULT '300' AFTER `archery_setting`;
|
||||||
|
)",
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9039,
|
||||||
|
.description = "2023_03_31_remove_bot_groups.sql",
|
||||||
|
.check = "SHOW TABLES LIKE 'bot_groups'",
|
||||||
|
.condition = "",
|
||||||
|
.match = "not_empty",
|
||||||
|
.sql = R"(
|
||||||
|
SET FOREIGN_KEY_CHECKS = 0;
|
||||||
|
DROP TABLE IF EXISTS `bot_groups`;
|
||||||
|
DROP TABLE IF EXISTS `bot_group_members`;
|
||||||
|
SET FOREIGN_KEY_CHECKS = 1;
|
||||||
|
)",
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9040,
|
||||||
|
.description = "2023_11_16_bot_starting_items.sql",
|
||||||
|
.check = "SHOW TABLES LIKE 'bot_starting_items'",
|
||||||
|
.condition = "empty",
|
||||||
|
.match = "",
|
||||||
|
.sql = R"(
|
||||||
|
CREATE TABLE `bot_starting_items` (
|
||||||
|
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
|
`races` int(11) UNSIGNED NOT NULL DEFAULT 0,
|
||||||
|
`classes` int(11) UNSIGNED NOT NULL DEFAULT 0,
|
||||||
|
`item_id` int(11) UNSIGNED NOT NULL DEFAULT 0,
|
||||||
|
`item_charges` tinyint(3) UNSIGNED NOT NULL DEFAULT 1,
|
||||||
|
`min_status` tinyint(3) UNSIGNED NOT NULL DEFAULT 0,
|
||||||
|
`slot_id` mediumint(9) NOT NULL DEFAULT -1,
|
||||||
|
`min_expansion` tinyint(4) NOT NULL DEFAULT -1,
|
||||||
|
`max_expansion` tinyint(4) NOT NULL DEFAULT -1,
|
||||||
|
`content_flags` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,
|
||||||
|
`content_flags_disabled` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci;
|
||||||
|
)",
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9041,
|
||||||
|
.description = "2023_12_04_bot_timers.sql",
|
||||||
|
.check = "SHOW COLUMNS FROM `bot_timers` LIKE 'recast_time'",
|
||||||
|
.condition = "empty",
|
||||||
|
.match = "",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `bot_timers`
|
||||||
|
ADD COLUMN `recast_time` INT(11) UNSIGNED NOT NULL DEFAULT '0' AFTER `timer_value`,
|
||||||
|
ADD COLUMN `is_spell` TINYINT(2) UNSIGNED NOT NULL DEFAULT 0 AFTER `recast_time`,
|
||||||
|
ADD COLUMN `is_disc` TINYINT(2) UNSIGNED NOT NULL DEFAULT 0 AFTER `is_spell`,
|
||||||
|
ADD COLUMN `spell_id` INT(11) UNSIGNED NOT NULL DEFAULT '0' AFTER `is_disc`,
|
||||||
|
ADD COLUMN `is_item` TINYINT(2) UNSIGNED NOT NULL DEFAULT 0 AFTER `spell_id`,
|
||||||
|
ADD COLUMN `item_id` INT(11) UNSIGNED NOT NULL DEFAULT '0' AFTER `is_item`;
|
||||||
|
ALTER TABLE `bot_timers`
|
||||||
|
DROP FOREIGN KEY `FK_bot_timers_1`;
|
||||||
|
ALTER TABLE `bot_timers`
|
||||||
|
DROP PRIMARY KEY;
|
||||||
|
ALTER TABLE `bot_timers`
|
||||||
|
ADD PRIMARY KEY (`bot_id`, `timer_id`, `spell_id`, `item_id`);
|
||||||
|
)"
|
||||||
|
}
|
||||||
|
// -- template; copy/paste this when you need to create a new entry
|
||||||
|
// ManifestEntry{
|
||||||
|
// .version = 9228,
|
||||||
|
// .description = "some_new_migration.sql",
|
||||||
|
// .check = "SHOW COLUMNS FROM `table_name` LIKE 'column_name'",
|
||||||
|
// .condition = "empty",
|
||||||
|
// .match = "",
|
||||||
|
// .sql = R"(
|
||||||
|
//
|
||||||
|
//)"
|
||||||
|
};
|
||||||
|
|
||||||
|
// see struct definitions for what each field does
|
||||||
|
// struct ManifestEntry {
|
||||||
|
// int version{}; // database version of the migration
|
||||||
|
// std::string description{}; // description of the migration ex: "add_new_table" or "add_index_to_table"
|
||||||
|
// std::string check{}; // query that checks against the condition
|
||||||
|
// std::string condition{}; // condition or "match_type" - Possible values [contains|match|missing|empty|not_empty]
|
||||||
|
// std::string match{}; // match field that is not always used, but works in conjunction with "condition" values [missing|match|contains]
|
||||||
|
// std::string sql{}; // the SQL DDL that gets ran when the condition is true
|
||||||
|
// };
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -29,6 +29,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|||||||
#include "../common/repositories/raid_members_repository.h"
|
#include "../common/repositories/raid_members_repository.h"
|
||||||
#include "../common/repositories/respawn_times_repository.h"
|
#include "../common/repositories/respawn_times_repository.h"
|
||||||
#include "../common/repositories/spawn_condition_values_repository.h"
|
#include "../common/repositories/spawn_condition_values_repository.h"
|
||||||
|
#include "repositories/spawn2_disabled_repository.h"
|
||||||
|
|
||||||
|
|
||||||
#include "database.h"
|
#include "database.h"
|
||||||
@@ -49,6 +50,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
bool Database::AddClientToInstance(uint16 instance_id, uint32 character_id)
|
bool Database::AddClientToInstance(uint16 instance_id, uint32 character_id)
|
||||||
{
|
{
|
||||||
auto e = InstanceListPlayerRepository::NewEntity();
|
auto e = InstanceListPlayerRepository::NewEntity();
|
||||||
@@ -131,85 +133,118 @@ bool Database::CreateInstance(uint16 instance_id, uint32 zone_id, uint32 version
|
|||||||
bool Database::GetUnusedInstanceID(uint16 &instance_id)
|
bool Database::GetUnusedInstanceID(uint16 &instance_id)
|
||||||
{
|
{
|
||||||
uint32 max_reserved_instance_id = RuleI(Instances, ReservedInstances);
|
uint32 max_reserved_instance_id = RuleI(Instances, ReservedInstances);
|
||||||
uint32 max = 32000;
|
uint32 max_instance_id = 32000;
|
||||||
|
|
||||||
|
// sanity check reserved
|
||||||
|
if (max_reserved_instance_id >= max_instance_id) {
|
||||||
|
instance_id = 0;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// recycle instances
|
||||||
|
if (RuleB(Instances, RecycleInstanceIds)) {
|
||||||
|
|
||||||
|
//query to get first unused id above reserved
|
||||||
|
auto query = fmt::format(
|
||||||
|
SQL(
|
||||||
|
SELECT id
|
||||||
|
FROM instance_list
|
||||||
|
WHERE id = {};
|
||||||
|
),
|
||||||
|
max_reserved_instance_id + 1
|
||||||
|
);
|
||||||
|
|
||||||
|
auto results = QueryDatabase(query);
|
||||||
|
|
||||||
|
// could not successfully query - bail out
|
||||||
|
if (!results.Success()) {
|
||||||
|
instance_id = 0;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// first id is available
|
||||||
|
if (results.RowCount() == 0) {
|
||||||
|
instance_id = max_reserved_instance_id + 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// now look for next available above reserved
|
||||||
|
query = fmt::format(
|
||||||
|
SQL(
|
||||||
|
SELECT MIN(i.id + 1) AS next_available
|
||||||
|
FROM instance_list i
|
||||||
|
LEFT JOIN instance_list i2 ON i.id + 1 = i2.id
|
||||||
|
WHERE i.id >= {}
|
||||||
|
AND i2.id IS NULL;
|
||||||
|
),
|
||||||
|
max_reserved_instance_id
|
||||||
|
);
|
||||||
|
|
||||||
|
results = QueryDatabase(query);
|
||||||
|
|
||||||
|
// could not successfully query - bail out
|
||||||
|
if (!results.Success()) {
|
||||||
|
instance_id = 0;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// did not retrieve any rows - bail out
|
||||||
|
if (results.RowCount() == 0) {
|
||||||
|
instance_id = 0;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto row = results.begin();
|
||||||
|
|
||||||
|
// check that id is within limits
|
||||||
|
if (row[0] && Strings::ToInt(row[0]) <= max_instance_id) {
|
||||||
|
instance_id = Strings::ToInt(row[0]);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// no available instance ids
|
||||||
|
instance_id = 0;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// get max unused id above reserved
|
||||||
auto query = fmt::format(
|
auto query = fmt::format(
|
||||||
"SELECT IFNULL(MAX(id), {}) + 1 FROM instance_list WHERE id > {}",
|
"SELECT IFNULL(MAX(id), {}) + 1 FROM instance_list WHERE id > {}",
|
||||||
max_reserved_instance_id,
|
max_reserved_instance_id,
|
||||||
max_reserved_instance_id
|
max_reserved_instance_id
|
||||||
);
|
);
|
||||||
|
|
||||||
if (RuleB(Instances, RecycleInstanceIds)) {
|
|
||||||
query = (
|
|
||||||
SQL(
|
|
||||||
SELECT i.id + 1 AS next_available
|
|
||||||
FROM instance_list i
|
|
||||||
LEFT JOIN instance_list i2 ON i2.id = i.id + 1
|
|
||||||
WHERE i2.id IS NULL
|
|
||||||
ORDER BY i.id
|
|
||||||
LIMIT 0, 1;
|
|
||||||
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
|
|
||||||
|
// could not successfully query - bail out
|
||||||
if (!results.Success()) {
|
if (!results.Success()) {
|
||||||
instance_id = 0;
|
instance_id = 0;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// did not retrieve any rows - bail out
|
||||||
if (results.RowCount() == 0) {
|
if (results.RowCount() == 0) {
|
||||||
instance_id = max_reserved_instance_id;
|
instance_id = 0;
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto row = results.begin();
|
auto row = results.begin();
|
||||||
|
|
||||||
if (Strings::ToInt(row[0]) <= max) {
|
// no instances currently used
|
||||||
|
if (!row[0]) {
|
||||||
|
instance_id = max_reserved_instance_id + 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check that id is within limits
|
||||||
|
if (Strings::ToInt(row[0]) <= max_instance_id) {
|
||||||
instance_id = Strings::ToInt(row[0]);
|
instance_id = Strings::ToInt(row[0]);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (instance_id < max_reserved_instance_id) {
|
// no available instance ids
|
||||||
instance_id = max_reserved_instance_id;
|
instance_id = 0;
|
||||||
return true;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
query = fmt::format("SELECT id FROM instance_list where id > {} ORDER BY id", max_reserved_instance_id);
|
|
||||||
results = QueryDatabase(query);
|
|
||||||
|
|
||||||
if (!results.Success()) {
|
|
||||||
instance_id = 0;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (results.RowCount() == 0) {
|
|
||||||
instance_id = 0;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
max_reserved_instance_id++;
|
|
||||||
|
|
||||||
for (auto row : results) {
|
|
||||||
if (max_reserved_instance_id < Strings::ToUnsignedInt(row[0])) {
|
|
||||||
instance_id = max_reserved_instance_id;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (max_reserved_instance_id > max) {
|
|
||||||
instance_id = 0;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
max_reserved_instance_id++;
|
|
||||||
}
|
|
||||||
|
|
||||||
instance_id = max_reserved_instance_id;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Database::IsGlobalInstance(uint16 instance_id)
|
bool Database::IsGlobalInstance(uint16 instance_id)
|
||||||
@@ -520,6 +555,7 @@ void Database::PurgeExpiredInstances()
|
|||||||
CharacterCorpsesRepository::BuryInstances(*this, imploded_instance_ids);
|
CharacterCorpsesRepository::BuryInstances(*this, imploded_instance_ids);
|
||||||
DynamicZoneMembersRepository::DeleteByManyInstances(*this, imploded_instance_ids);
|
DynamicZoneMembersRepository::DeleteByManyInstances(*this, imploded_instance_ids);
|
||||||
DynamicZonesRepository::DeleteWhere(*this, fmt::format("instance_id IN ({})", imploded_instance_ids));
|
DynamicZonesRepository::DeleteWhere(*this, fmt::format("instance_id IN ({})", imploded_instance_ids));
|
||||||
|
Spawn2DisabledRepository::DeleteWhere(*this, fmt::format("instance_id IN ({})", imploded_instance_ids));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Database::SetInstanceDuration(uint16 instance_id, uint32 new_duration)
|
void Database::SetInstanceDuration(uint16 instance_id, uint32 new_duration)
|
||||||
|
|||||||
@@ -66,11 +66,12 @@ namespace DatabaseSchema {
|
|||||||
{"character_potionbelt", "id"},
|
{"character_potionbelt", "id"},
|
||||||
{"character_skills", "id"},
|
{"character_skills", "id"},
|
||||||
{"character_spells", "id"},
|
{"character_spells", "id"},
|
||||||
|
{"character_stats_record", "character_id"},
|
||||||
{"character_task_timers", "character_id"},
|
{"character_task_timers", "character_id"},
|
||||||
{"character_tasks", "charid"},
|
{"character_tasks", "charid"},
|
||||||
{"character_tribute", "character_id"},
|
{"character_tribute", "character_id"},
|
||||||
{"completed_tasks", "charid"},
|
{"completed_tasks", "charid"},
|
||||||
{"data_buckets", "id"},
|
{"data_buckets", "character_id"},
|
||||||
{"faction_values", "char_id"},
|
{"faction_values", "char_id"},
|
||||||
{"friends", "charid"},
|
{"friends", "charid"},
|
||||||
{"guild_members", "char_id"},
|
{"guild_members", "char_id"},
|
||||||
@@ -134,6 +135,7 @@ namespace DatabaseSchema {
|
|||||||
"character_potionbelt",
|
"character_potionbelt",
|
||||||
"character_skills",
|
"character_skills",
|
||||||
"character_spells",
|
"character_spells",
|
||||||
|
"character_stats_record",
|
||||||
"character_task_timers",
|
"character_task_timers",
|
||||||
"character_tasks",
|
"character_tasks",
|
||||||
"character_tribute",
|
"character_tribute",
|
||||||
@@ -256,7 +258,9 @@ namespace DatabaseSchema {
|
|||||||
{
|
{
|
||||||
return {
|
return {
|
||||||
"chatchannels",
|
"chatchannels",
|
||||||
|
"chatchannel_reserved_names",
|
||||||
"command_settings",
|
"command_settings",
|
||||||
|
"command_subsettings",
|
||||||
"content_flags",
|
"content_flags",
|
||||||
"db_str",
|
"db_str",
|
||||||
"eqtime",
|
"eqtime",
|
||||||
@@ -341,6 +345,7 @@ namespace DatabaseSchema {
|
|||||||
"respawn_times",
|
"respawn_times",
|
||||||
"saylink",
|
"saylink",
|
||||||
"server_scheduled_events",
|
"server_scheduled_events",
|
||||||
|
"spawn2_disabled",
|
||||||
"player_event_log_settings",
|
"player_event_log_settings",
|
||||||
"player_event_logs",
|
"player_event_logs",
|
||||||
"shared_task_activity_state",
|
"shared_task_activity_state",
|
||||||
|
|||||||
+51
-10
@@ -8,7 +8,6 @@
|
|||||||
|
|
||||||
#include "dbcore.h"
|
#include "dbcore.h"
|
||||||
|
|
||||||
#include <errmsg.h>
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <mysqld_error.h>
|
#include <mysqld_error.h>
|
||||||
@@ -138,7 +137,7 @@ MySQLRequestResult DBcore::QueryDatabase(const char *query, uint32 querylen, boo
|
|||||||
* Error logging
|
* Error logging
|
||||||
*/
|
*/
|
||||||
if (mysql_errno(mysql) > 0 && query[0] != '\0') {
|
if (mysql_errno(mysql) > 0 && query[0] != '\0') {
|
||||||
LogMySQLError("[{}] [{}]\n[{}]", mysql_errno(mysql), mysql_error(mysql), query);
|
LogMySQLError("MySQL Error ({}) [{}] Query [{}]", mysql_errno(mysql), mysql_error(mysql), query);
|
||||||
}
|
}
|
||||||
|
|
||||||
return MySQLRequestResult(nullptr, 0, 0, 0, 0, mysql_errno(mysql), errorBuffer);
|
return MySQLRequestResult(nullptr, 0, 0, 0, 0, mysql_errno(mysql), errorBuffer);
|
||||||
@@ -323,8 +322,11 @@ MySQLRequestResult DBcore::QueryDatabaseMulti(const std::string &query)
|
|||||||
if (pStatus != Connected) {
|
if (pStatus != Connected) {
|
||||||
Open();
|
Open();
|
||||||
}
|
}
|
||||||
|
auto r = MySQLRequestResult{};
|
||||||
|
|
||||||
int status = mysql_real_query(mysql, query.c_str(), query.length());
|
int status = mysql_real_query(mysql, query.c_str(), query.length());
|
||||||
|
|
||||||
|
// process single result
|
||||||
if (status != 0) {
|
if (status != 0) {
|
||||||
unsigned int error_number = mysql_errno(mysql);
|
unsigned int error_number = mysql_errno(mysql);
|
||||||
|
|
||||||
@@ -337,11 +339,37 @@ MySQLRequestResult DBcore::QueryDatabaseMulti(const std::string &query)
|
|||||||
std::string error_raw = fmt::format("{}", mysql_error(mysql));
|
std::string error_raw = fmt::format("{}", mysql_error(mysql));
|
||||||
std::string mysql_err = Strings::Trim(error_raw);
|
std::string mysql_err = Strings::Trim(error_raw);
|
||||||
std::string clean_query = Strings::Replace(query, "\n", "");
|
std::string clean_query = Strings::Replace(query, "\n", "");
|
||||||
LogMySQLQuery("[{}] ({}) query [{}]", mysql_err, mysql_errno(mysql), clean_query);
|
LogMySQLError("[{}] ({}) query [{}]", mysql_err, mysql_errno(mysql), clean_query);
|
||||||
|
|
||||||
|
MYSQL_RES *res = mysql_store_result(mysql);
|
||||||
|
|
||||||
|
uint32 row_count = 0;
|
||||||
|
if (res) {
|
||||||
|
row_count = (uint32) mysql_num_rows(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
r = MySQLRequestResult(
|
||||||
|
res,
|
||||||
|
(uint32) mysql_affected_rows(mysql),
|
||||||
|
row_count,
|
||||||
|
(uint32) mysql_field_count(mysql),
|
||||||
|
(uint32) mysql_insert_id(mysql)
|
||||||
|
);
|
||||||
|
|
||||||
|
std::string error_message = mysql_error(mysql);
|
||||||
|
r.SetErrorMessage(error_message);
|
||||||
|
r.SetErrorNumber(mysql_errno(mysql));
|
||||||
|
|
||||||
|
if (res) {
|
||||||
|
mysql_free_result(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
SetMultiStatementsOff();
|
||||||
|
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto result = MySQLRequestResult{};
|
|
||||||
|
|
||||||
int index = 0;
|
int index = 0;
|
||||||
|
|
||||||
@@ -355,7 +383,7 @@ MySQLRequestResult DBcore::QueryDatabaseMulti(const std::string &query)
|
|||||||
uint32 row_count = 0;
|
uint32 row_count = 0;
|
||||||
MYSQL_RES *res = mysql_store_result(mysql);
|
MYSQL_RES *res = mysql_store_result(mysql);
|
||||||
|
|
||||||
result = MySQLRequestResult(
|
r = MySQLRequestResult(
|
||||||
res,
|
res,
|
||||||
(uint32) mysql_affected_rows(mysql),
|
(uint32) mysql_affected_rows(mysql),
|
||||||
row_count,
|
row_count,
|
||||||
@@ -368,15 +396,14 @@ MySQLRequestResult DBcore::QueryDatabaseMulti(const std::string &query)
|
|||||||
LogMySQLQuery(
|
LogMySQLQuery(
|
||||||
"{} -- ({} row{} affected) ({}s)",
|
"{} -- ({} row{} affected) ({}s)",
|
||||||
piece,
|
piece,
|
||||||
result.RowsAffected(),
|
r.RowsAffected(),
|
||||||
result.RowsAffected() == 1 ? "" : "s",
|
r.RowsAffected() == 1 ? "" : "s",
|
||||||
std::to_string(timer.elapsed())
|
std::to_string(timer.elapsed())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (res) {
|
if (res) {
|
||||||
row_count = (uint32) mysql_num_rows(res);
|
row_count = (uint32) mysql_num_rows(res);
|
||||||
mysql_free_result(res);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// more results? -1 = no, >0 = error, 0 = yes (keep looping)
|
// more results? -1 = no, >0 = error, 0 = yes (keep looping)
|
||||||
@@ -385,13 +412,27 @@ MySQLRequestResult DBcore::QueryDatabaseMulti(const std::string &query)
|
|||||||
LogMySQLError("[{}] [{}]", mysql_errno(mysql), mysql_error(mysql));
|
LogMySQLError("[{}] [{}]", mysql_errno(mysql), mysql_error(mysql));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mysql_free_result(res);
|
||||||
|
|
||||||
|
// error logging
|
||||||
|
std::string error_message = mysql_error(mysql);
|
||||||
|
r.SetErrorMessage(error_message);
|
||||||
|
r.SetErrorNumber(mysql_errno(mysql));
|
||||||
|
|
||||||
|
SetMultiStatementsOff();
|
||||||
|
|
||||||
// we handle errors elsewhere
|
// we handle errors elsewhere
|
||||||
return result;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (res) {
|
||||||
|
mysql_free_result(res);
|
||||||
|
}
|
||||||
|
|
||||||
index++;
|
index++;
|
||||||
} while (status == 0);
|
} while (status == 0);
|
||||||
|
|
||||||
SetMultiStatementsOff();
|
SetMultiStatementsOff();
|
||||||
|
|
||||||
return result;
|
return r;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,9 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
|
||||||
|
#define CR_SERVER_GONE_ERROR 2006
|
||||||
|
#define CR_SERVER_LOST 2013
|
||||||
|
|
||||||
class DBcore {
|
class DBcore {
|
||||||
public:
|
public:
|
||||||
enum eStatus {
|
enum eStatus {
|
||||||
|
|||||||
+68
-118
@@ -19,131 +19,81 @@
|
|||||||
|
|
||||||
#include "deity.h"
|
#include "deity.h"
|
||||||
|
|
||||||
|
EQ::deity::DeityTypeBit EQ::deity::GetDeityBitmask(DeityType deity_type)
|
||||||
EQ::deity::DeityTypeBit EQ::deity::ConvertDeityTypeToDeityTypeBit(DeityType deity_type)
|
|
||||||
{
|
{
|
||||||
switch (deity_type) {
|
switch (deity_type) {
|
||||||
case DeityBertoxxulous:
|
case DeityBertoxxulous:
|
||||||
return bit_DeityBertoxxulous;
|
return bit_DeityBertoxxulous;
|
||||||
case DeityBrellSirilis:
|
case DeityBrellSirilis:
|
||||||
return bit_DeityBrellSirilis;
|
return bit_DeityBrellSirilis;
|
||||||
case DeityCazicThule:
|
case DeityCazicThule:
|
||||||
return bit_DeityCazicThule;
|
return bit_DeityCazicThule;
|
||||||
case DeityErollisiMarr:
|
case DeityErollisiMarr:
|
||||||
return bit_DeityErollisiMarr;
|
return bit_DeityErollisiMarr;
|
||||||
case DeityBristlebane:
|
case DeityBristlebane:
|
||||||
return bit_DeityBristlebane;
|
return bit_DeityBristlebane;
|
||||||
case DeityInnoruuk:
|
case DeityInnoruuk:
|
||||||
return bit_DeityInnoruuk;
|
return bit_DeityInnoruuk;
|
||||||
case DeityKarana:
|
case DeityKarana:
|
||||||
return bit_DeityKarana;
|
return bit_DeityKarana;
|
||||||
case DeityMithanielMarr:
|
case DeityMithanielMarr:
|
||||||
return bit_DeityMithanielMarr;
|
return bit_DeityMithanielMarr;
|
||||||
case DeityPrexus:
|
case DeityPrexus:
|
||||||
return bit_DeityPrexus;
|
return bit_DeityPrexus;
|
||||||
case DeityQuellious:
|
case DeityQuellious:
|
||||||
return bit_DeityQuellious;
|
return bit_DeityQuellious;
|
||||||
case DeityRallosZek:
|
case DeityRallosZek:
|
||||||
return bit_DeityRallosZek;
|
return bit_DeityRallosZek;
|
||||||
case DeityRodcetNife:
|
case DeityRodcetNife:
|
||||||
return bit_DeityRodcetNife;
|
return bit_DeityRodcetNife;
|
||||||
case DeitySolusekRo:
|
case DeitySolusekRo:
|
||||||
return bit_DeitySolusekRo;
|
return bit_DeitySolusekRo;
|
||||||
case DeityTheTribunal:
|
case DeityTheTribunal:
|
||||||
return bit_DeityTheTribunal;
|
return bit_DeityTheTribunal;
|
||||||
case DeityTunare:
|
case DeityTunare:
|
||||||
return bit_DeityTunare;
|
return bit_DeityTunare;
|
||||||
case DeityVeeshan:
|
case DeityVeeshan:
|
||||||
return bit_DeityVeeshan;
|
return bit_DeityVeeshan;
|
||||||
case DeityAgnostic_LB:
|
case DeityAgnostic_LB:
|
||||||
case DeityAgnostic:
|
case DeityAgnostic:
|
||||||
return bit_DeityAgnostic;
|
return bit_DeityAgnostic;
|
||||||
default:
|
default:
|
||||||
return bit_DeityAll;
|
return bit_DeityAll;
|
||||||
};
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EQ::deity::DeityType EQ::deity::ConvertDeityTypeBitToDeityType(DeityTypeBit deity_type_bit)
|
const std::map<EQ::deity::DeityType, std::string>& EQ::deity::GetDeityMap()
|
||||||
{
|
{
|
||||||
switch (deity_type_bit) {
|
static const std::map<EQ::deity::DeityType, std::string> deity_map = {
|
||||||
case bit_DeityAgnostic:
|
{ DeityAgnostic, "Agnostic" },
|
||||||
return DeityAgnostic;
|
{ DeityAgnostic_LB, "Agnostic" },
|
||||||
case bit_DeityBertoxxulous:
|
{ DeityBertoxxulous, "Bertoxxulous" },
|
||||||
return DeityBertoxxulous;
|
{ DeityBrellSirilis, "Brell Serilis" },
|
||||||
case bit_DeityBrellSirilis:
|
{ DeityBristlebane, "Bristlebane" },
|
||||||
return DeityBrellSirilis;
|
{ DeityCazicThule, "Cazic-Thule" },
|
||||||
case bit_DeityCazicThule:
|
{ DeityErollisiMarr, "Erollisi Marr" },
|
||||||
return DeityCazicThule;
|
{ DeityInnoruuk, "Innoruuk" },
|
||||||
case bit_DeityErollisiMarr:
|
{ DeityKarana, "Karana" },
|
||||||
return DeityErollisiMarr;
|
{ DeityMithanielMarr, "Mithaniel Marr" },
|
||||||
case bit_DeityBristlebane:
|
{ DeityPrexus, "Prexus" },
|
||||||
return DeityBristlebane;
|
{ DeityQuellious, "Quellious" },
|
||||||
case bit_DeityInnoruuk:
|
{ DeityRallosZek, "Rallos Zek" },
|
||||||
return DeityInnoruuk;
|
{ DeityRodcetNife, "Rodcet Nife" },
|
||||||
case bit_DeityKarana:
|
{ DeitySolusekRo, "Solusek Ro" },
|
||||||
return DeityKarana;
|
{ DeityTheTribunal, "The Tribunal" },
|
||||||
case bit_DeityMithanielMarr:
|
{ DeityTunare, "Tunare" },
|
||||||
return DeityMithanielMarr;
|
{ DeityVeeshan, "Veeshan" }
|
||||||
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:
|
|
||||||
return DeityUnknown;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
return deity_map;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* EQ::deity::DeityName(DeityType deity_type)
|
std::string EQ::deity::GetDeityName(DeityType deity_type)
|
||||||
{
|
{
|
||||||
switch (deity_type) {
|
|
||||||
case DeityBertoxxulous:
|
if (EQ::deity::GetDeityMap().find(deity_type) != EQ::deity::GetDeityMap().end()) {
|
||||||
return "Bertoxxulous";
|
return EQ::deity::GetDeityMap().find(deity_type)->second;
|
||||||
case DeityBrellSirilis:
|
}
|
||||||
return "Brell Serilis";
|
|
||||||
case DeityCazicThule:
|
return std::string();
|
||||||
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:
|
|
||||||
return "Unknown";
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|||||||
+22
-21
@@ -21,6 +21,8 @@
|
|||||||
#define COMMON_DEITY_H
|
#define COMMON_DEITY_H
|
||||||
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
#include <map>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
|
||||||
namespace EQ
|
namespace EQ
|
||||||
@@ -49,30 +51,29 @@ namespace EQ
|
|||||||
};
|
};
|
||||||
|
|
||||||
enum DeityTypeBit : uint32 {
|
enum DeityTypeBit : uint32 {
|
||||||
bit_DeityNone = 0x00000000,
|
bit_DeityAgnostic = 0x00000001,
|
||||||
bit_DeityAgnostic = 0x00000001,
|
bit_DeityBertoxxulous = 0x00000002,
|
||||||
bit_DeityBertoxxulous = 0x00000002,
|
bit_DeityBrellSirilis = 0x00000004,
|
||||||
bit_DeityBrellSirilis = 0x00000004,
|
bit_DeityCazicThule = 0x00000008,
|
||||||
bit_DeityCazicThule = 0x00000008,
|
bit_DeityErollisiMarr = 0x00000010,
|
||||||
bit_DeityErollisiMarr = 0x00000010,
|
bit_DeityBristlebane = 0x00000020,
|
||||||
bit_DeityBristlebane = 0x00000020,
|
bit_DeityInnoruuk = 0x00000040,
|
||||||
bit_DeityInnoruuk = 0x00000040,
|
bit_DeityKarana = 0x00000080,
|
||||||
bit_DeityKarana = 0x00000080,
|
|
||||||
bit_DeityMithanielMarr = 0x00000100,
|
bit_DeityMithanielMarr = 0x00000100,
|
||||||
bit_DeityPrexus = 0x00000200,
|
bit_DeityPrexus = 0x00000200,
|
||||||
bit_DeityQuellious = 0x00000400,
|
bit_DeityQuellious = 0x00000400,
|
||||||
bit_DeityRallosZek = 0x00000800,
|
bit_DeityRallosZek = 0x00000800,
|
||||||
bit_DeityRodcetNife = 0x00001000,
|
bit_DeityRodcetNife = 0x00001000,
|
||||||
bit_DeitySolusekRo = 0x00002000,
|
bit_DeitySolusekRo = 0x00002000,
|
||||||
bit_DeityTheTribunal = 0x00004000,
|
bit_DeityTheTribunal = 0x00004000,
|
||||||
bit_DeityTunare = 0x00008000,
|
bit_DeityTunare = 0x00008000,
|
||||||
bit_DeityVeeshan = 0x00010000,
|
bit_DeityVeeshan = 0x00010000,
|
||||||
bit_DeityAll = 0xFFFFFFFF
|
bit_DeityAll = UINT32_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
extern DeityTypeBit ConvertDeityTypeToDeityTypeBit(DeityType deity_type);
|
extern DeityTypeBit GetDeityBitmask(DeityType deity_type);
|
||||||
extern DeityType ConvertDeityTypeBitToDeityType(DeityTypeBit deity_type_bit);
|
extern std::string GetDeityName(DeityType deity_type);
|
||||||
extern const char* DeityName(DeityType deity_type);
|
extern const std::map<DeityType, std::string>& GetDeityMap();
|
||||||
|
|
||||||
} /*deity*/
|
} /*deity*/
|
||||||
|
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ N(OP_BeginCast),
|
|||||||
N(OP_Bind_Wound),
|
N(OP_Bind_Wound),
|
||||||
N(OP_BlockedBuffs),
|
N(OP_BlockedBuffs),
|
||||||
N(OP_BoardBoat),
|
N(OP_BoardBoat),
|
||||||
|
N(OP_BookButton),
|
||||||
N(OP_Buff),
|
N(OP_Buff),
|
||||||
N(OP_BuffCreate),
|
N(OP_BuffCreate),
|
||||||
N(OP_BuffRemoveRequest),
|
N(OP_BuffRemoveRequest),
|
||||||
@@ -316,6 +317,7 @@ N(OP_LootRequest),
|
|||||||
N(OP_ManaChange),
|
N(OP_ManaChange),
|
||||||
N(OP_ManaUpdate),
|
N(OP_ManaUpdate),
|
||||||
N(OP_MarkNPC),
|
N(OP_MarkNPC),
|
||||||
|
N(OP_MarkRaidNPC),
|
||||||
N(OP_Marquee),
|
N(OP_Marquee),
|
||||||
N(OP_MemorizeSpell),
|
N(OP_MemorizeSpell),
|
||||||
N(OP_Mend),
|
N(OP_Mend),
|
||||||
@@ -398,6 +400,8 @@ N(OP_PVPLeaderBoardRequest),
|
|||||||
N(OP_PVPStats),
|
N(OP_PVPStats),
|
||||||
N(OP_QueryResponseThing),
|
N(OP_QueryResponseThing),
|
||||||
N(OP_QueryUCSServerStatus),
|
N(OP_QueryUCSServerStatus),
|
||||||
|
N(OP_RaidDelegateAbility),
|
||||||
|
N(OP_RaidClearNPCMarks),
|
||||||
N(OP_RaidInvite),
|
N(OP_RaidInvite),
|
||||||
N(OP_RaidJoin),
|
N(OP_RaidJoin),
|
||||||
N(OP_RaidUpdate),
|
N(OP_RaidUpdate),
|
||||||
|
|||||||
@@ -1052,4 +1052,27 @@ enum ScribeSpellActions
|
|||||||
Unmemorize
|
Unmemorize
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum SpellTimeRestrictions
|
||||||
|
{
|
||||||
|
NoRestriction,
|
||||||
|
Day,
|
||||||
|
Night
|
||||||
|
};
|
||||||
|
|
||||||
|
enum MoneyTypes
|
||||||
|
{
|
||||||
|
Copper,
|
||||||
|
Silver,
|
||||||
|
Gold,
|
||||||
|
Platinum
|
||||||
|
};
|
||||||
|
|
||||||
|
enum MoneySubtypes
|
||||||
|
{
|
||||||
|
Personal,
|
||||||
|
Bank,
|
||||||
|
Cursor,
|
||||||
|
SharedBank // Platinum Only
|
||||||
|
};
|
||||||
|
|
||||||
#endif /*COMMON_EQ_CONSTANTS_H*/
|
#endif /*COMMON_EQ_CONSTANTS_H*/
|
||||||
|
|||||||
+34
-10
@@ -124,6 +124,12 @@ struct LDoNTrapTemplate
|
|||||||
uint8 locked;
|
uint8 locked;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum CrystalReclaimTypes
|
||||||
|
{
|
||||||
|
Ebon = 5,
|
||||||
|
Radiant = 4,
|
||||||
|
};
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
@@ -2559,7 +2565,10 @@ struct GMEmoteZone_Struct {
|
|||||||
struct BookText_Struct {
|
struct BookText_Struct {
|
||||||
uint8 window; // where to display the text (0xFF means new window)
|
uint8 window; // where to display the text (0xFF means new window)
|
||||||
uint8 type; //type: 0=scroll, 1=book, 2=item info.. prolly others.
|
uint8 type; //type: 0=scroll, 1=book, 2=item info.. prolly others.
|
||||||
uint32 invslot; // Only used in SoF and later clients.
|
int16 invslot; // Only used in SoF and later clients.
|
||||||
|
int32 target_id;
|
||||||
|
int8 can_cast;
|
||||||
|
int8 can_scribe;
|
||||||
char booktext[1]; // Variable Length
|
char booktext[1]; // Variable Length
|
||||||
};
|
};
|
||||||
// This is the request to read a book.
|
// This is the request to read a book.
|
||||||
@@ -2568,11 +2577,18 @@ struct BookText_Struct {
|
|||||||
struct BookRequest_Struct {
|
struct BookRequest_Struct {
|
||||||
uint8 window; // where to display the text (0xFF means new window)
|
uint8 window; // where to display the text (0xFF means new window)
|
||||||
uint8 type; //type: 0=scroll, 1=book, 2=item info.. prolly others.
|
uint8 type; //type: 0=scroll, 1=book, 2=item info.. prolly others.
|
||||||
uint32 invslot; // Only used in Sof and later clients;
|
int16 invslot; // Only used in Sof and later clients;
|
||||||
int16 subslot; // The subslot inside of a bag if it is inside one.
|
int32 target_id;
|
||||||
char txtfile[20];
|
char txtfile[20];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// used by Scribe and CastSpell book buttons
|
||||||
|
struct BookButton_Struct
|
||||||
|
{
|
||||||
|
int16 invslot; // server slot
|
||||||
|
int32 target_id;
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Object/Ground Spawn struct
|
** Object/Ground Spawn struct
|
||||||
** Used for Forges, Ovens, ground spawns, items dropped to ground, etc
|
** Used for Forges, Ovens, ground spawns, items dropped to ground, etc
|
||||||
@@ -2584,11 +2600,11 @@ struct BookRequest_Struct {
|
|||||||
struct Object_Struct {
|
struct Object_Struct {
|
||||||
/*00*/ uint32 linked_list_addr[2];// They are, get this, prev and next, ala linked list
|
/*00*/ uint32 linked_list_addr[2];// They are, get this, prev and next, ala linked list
|
||||||
/*08*/ float size; //
|
/*08*/ float size; //
|
||||||
/*10*/ uint16 solidtype; //
|
/*10*/ uint16 solid_type; //
|
||||||
/*12*/ uint32 drop_id; // Unique object id for zone
|
/*12*/ uint32 drop_id; // Unique object id for zone
|
||||||
/*16*/ uint16 zone_id; // Redudant, but: Zone the object appears in
|
/*16*/ uint16 zone_id; // Redudant, but: Zone the object appears in
|
||||||
/*18*/ uint16 zone_instance; //
|
/*18*/ uint16 zone_instance; //
|
||||||
/*20*/ uint32 unknown020; //
|
/*20*/ uint32 incline; //
|
||||||
/*24*/ uint32 unknown024; //
|
/*24*/ uint32 unknown024; //
|
||||||
/*28*/ float tilt_x;
|
/*28*/ float tilt_x;
|
||||||
/*32*/ float tilt_y;
|
/*32*/ float tilt_y;
|
||||||
@@ -4105,7 +4121,9 @@ struct UpdateLeadershipAA_Struct {
|
|||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
GroupLeadershipAbility_MarkNPC = 0
|
GroupLeadershipAbility_MarkNPC = 0,
|
||||||
|
RaidLeadershipAbility_MarkNPC = 16,
|
||||||
|
RaidLeadershipAbility_MainAssist = 19
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DoGroupLeadershipAbility_Struct
|
struct DoGroupLeadershipAbility_Struct
|
||||||
@@ -4149,8 +4167,9 @@ struct InspectBuffs_Struct {
|
|||||||
struct RaidGeneral_Struct {
|
struct RaidGeneral_Struct {
|
||||||
/*00*/ uint32 action; //=10
|
/*00*/ uint32 action; //=10
|
||||||
/*04*/ char player_name[64]; //should both be the player's name
|
/*04*/ char player_name[64]; //should both be the player's name
|
||||||
/*64*/ char leader_name[64];
|
/*68*/ uint32 unknown1;
|
||||||
/*132*/ uint32 parameter;
|
/*72*/ char leader_name[64];
|
||||||
|
/*136*/ uint32 parameter;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RaidAddMember_Struct {
|
struct RaidAddMember_Struct {
|
||||||
@@ -4161,9 +4180,14 @@ struct RaidAddMember_Struct {
|
|||||||
/*139*/ uint8 flags[5]; //no idea if these are needed...
|
/*139*/ uint8 flags[5]; //no idea if these are needed...
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct RaidNote_Struct {
|
||||||
|
/*000*/ RaidGeneral_Struct general;
|
||||||
|
/*140*/ char note[64];
|
||||||
|
};
|
||||||
|
|
||||||
struct RaidMOTD_Struct {
|
struct RaidMOTD_Struct {
|
||||||
/*000*/ RaidGeneral_Struct general; // leader_name and action only used
|
/*000*/ RaidGeneral_Struct general;
|
||||||
/*136*/ char motd[0]; // max size is 1024, but reply is variable
|
/*140*/ char motd[1024];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RaidLeadershipUpdate_Struct {
|
struct RaidLeadershipUpdate_Struct {
|
||||||
|
|||||||
@@ -85,6 +85,12 @@ void EQEmuConfig::parse_config()
|
|||||||
//The only way to enable locked is by switching to true, meaning this value is always false until manually set true
|
//The only way to enable locked is by switching to true, meaning this value is always false until manually set true
|
||||||
Locked = false;
|
Locked = false;
|
||||||
if (_root["server"]["world"].get("locked", "false").asString() == "true") { Locked = true; }
|
if (_root["server"]["world"].get("locked", "false").asString() == "true") { Locked = true; }
|
||||||
|
|
||||||
|
auto_database_updates = false;
|
||||||
|
if (_root["server"].get("auto_database_updates", "true").asString() == "true") {
|
||||||
|
auto_database_updates = true;
|
||||||
|
}
|
||||||
|
|
||||||
WorldIP = _root["server"]["world"]["tcp"].get("host", "127.0.0.1").asString();
|
WorldIP = _root["server"]["world"]["tcp"].get("host", "127.0.0.1").asString();
|
||||||
WorldTCPPort = Strings::ToUnsignedInt(_root["server"]["world"]["tcp"].get("port", "9000").asString());
|
WorldTCPPort = Strings::ToUnsignedInt(_root["server"]["world"]["tcp"].get("port", "9000").asString());
|
||||||
|
|
||||||
|
|||||||
@@ -120,6 +120,8 @@ class EQEmuConfig
|
|||||||
uint16 ZonePortHigh;
|
uint16 ZonePortHigh;
|
||||||
uint8 DefaultStatus;
|
uint8 DefaultStatus;
|
||||||
|
|
||||||
|
bool auto_database_updates;
|
||||||
|
|
||||||
// uint16 DynamicCount;
|
// uint16 DynamicCount;
|
||||||
|
|
||||||
// map<string,uint16> StaticZones;
|
// map<string,uint16> StaticZones;
|
||||||
|
|||||||
+15
-7
@@ -100,6 +100,8 @@ EQEmuLogSys *EQEmuLogSys::LoadLogSettingsDefaults()
|
|||||||
log_settings[Logs::Discord].log_to_console = static_cast<uint8>(Logs::General);
|
log_settings[Logs::Discord].log_to_console = static_cast<uint8>(Logs::General);
|
||||||
log_settings[Logs::QuestErrors].log_to_gmsay = static_cast<uint8>(Logs::General);
|
log_settings[Logs::QuestErrors].log_to_gmsay = static_cast<uint8>(Logs::General);
|
||||||
log_settings[Logs::QuestErrors].log_to_console = static_cast<uint8>(Logs::General);
|
log_settings[Logs::QuestErrors].log_to_console = static_cast<uint8>(Logs::General);
|
||||||
|
log_settings[Logs::EqTime].log_to_console = static_cast<uint8>(Logs::General);
|
||||||
|
log_settings[Logs::EqTime].log_to_gmsay = static_cast<uint8>(Logs::General);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* RFC 5424
|
* RFC 5424
|
||||||
@@ -446,6 +448,8 @@ void EQEmuLogSys::Out(
|
|||||||
// remove this when we remove all legacy logs
|
// remove this when we remove all legacy logs
|
||||||
bool ignore_log_legacy_format = (
|
bool ignore_log_legacy_format = (
|
||||||
log_category == Logs::Netcode ||
|
log_category == Logs::Netcode ||
|
||||||
|
log_category == Logs::MySQLQuery ||
|
||||||
|
log_category == Logs::MySQLError ||
|
||||||
log_category == Logs::PacketServerClient ||
|
log_category == Logs::PacketServerClient ||
|
||||||
log_category == Logs::PacketClientServer ||
|
log_category == Logs::PacketClientServer ||
|
||||||
log_category == Logs::PacketServerToServer
|
log_category == Logs::PacketServerToServer
|
||||||
@@ -647,6 +651,9 @@ EQEmuLogSys *EQEmuLogSys::LoadLogDatabaseSettings()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Auto inject categories that don't exist in the database...
|
// Auto inject categories that don't exist in the database...
|
||||||
|
|
||||||
|
std::vector<LogsysCategoriesRepository::LogsysCategories> db_categories_to_add{};
|
||||||
|
|
||||||
for (int i = Logs::AA; i != Logs::MaxCategoryID; i++) {
|
for (int i = Logs::AA; i != Logs::MaxCategoryID; i++) {
|
||||||
|
|
||||||
bool is_missing_in_database = std::find(db_categories.begin(), db_categories.end(), i) == db_categories.end();
|
bool is_missing_in_database = std::find(db_categories.begin(), db_categories.end(), i) == db_categories.end();
|
||||||
@@ -661,11 +668,7 @@ EQEmuLogSys *EQEmuLogSys::LoadLogDatabaseSettings()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (is_missing_in_database && !is_deprecated_category) {
|
if (is_missing_in_database && !is_deprecated_category) {
|
||||||
LogInfo(
|
LogInfo("Automatically adding new log category [{}] ({})", Logs::LogCategoryName[i], i);
|
||||||
"Automatically adding new log category [{}] ({})",
|
|
||||||
Logs::LogCategoryName[i],
|
|
||||||
i
|
|
||||||
);
|
|
||||||
|
|
||||||
auto new_category = LogsysCategoriesRepository::NewEntity();
|
auto new_category = LogsysCategoriesRepository::NewEntity();
|
||||||
new_category.log_category_id = i;
|
new_category.log_category_id = i;
|
||||||
@@ -674,11 +677,16 @@ EQEmuLogSys *EQEmuLogSys::LoadLogDatabaseSettings()
|
|||||||
new_category.log_to_gmsay = log_settings[i].log_to_gmsay;
|
new_category.log_to_gmsay = log_settings[i].log_to_gmsay;
|
||||||
new_category.log_to_file = log_settings[i].log_to_file;
|
new_category.log_to_file = log_settings[i].log_to_file;
|
||||||
new_category.log_to_discord = log_settings[i].log_to_discord;
|
new_category.log_to_discord = log_settings[i].log_to_discord;
|
||||||
|
db_categories_to_add.emplace_back(new_category);
|
||||||
LogsysCategoriesRepository::InsertOne(*m_database, new_category);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!db_categories_to_add.empty()) {
|
||||||
|
LogsysCategoriesRepository::ReplaceMany(*m_database, db_categories_to_add);
|
||||||
|
LoadLogDatabaseSettings();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
LogInfo("Loaded [{}] log categories", categories.size());
|
LogInfo("Loaded [{}] log categories", categories.size());
|
||||||
|
|
||||||
auto webhooks = DiscordWebhooksRepository::GetWhere(*m_database, fmt::format("id < {}", MAX_DISCORD_WEBHOOK_ID));
|
auto webhooks = DiscordWebhooksRepository::GetWhere(*m_database, fmt::format("id < {}", MAX_DISCORD_WEBHOOK_ID));
|
||||||
|
|||||||
@@ -137,6 +137,9 @@ namespace Logs {
|
|||||||
Bugs,
|
Bugs,
|
||||||
QuestErrors,
|
QuestErrors,
|
||||||
PlayerEvents,
|
PlayerEvents,
|
||||||
|
DataBuckets,
|
||||||
|
Zoning,
|
||||||
|
EqTime,
|
||||||
MaxCategoryID /* Don't Remove this */
|
MaxCategoryID /* Don't Remove this */
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -233,6 +236,9 @@ namespace Logs {
|
|||||||
"Bugs",
|
"Bugs",
|
||||||
"QuestErrors",
|
"QuestErrors",
|
||||||
"PlayerEvents",
|
"PlayerEvents",
|
||||||
|
"DataBuckets",
|
||||||
|
"Zoning",
|
||||||
|
"EqTime",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -794,6 +794,36 @@
|
|||||||
OutF(LogSys, Logs::Detail, Logs::PlayerEvents, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
OutF(LogSys, Logs::Detail, Logs::PlayerEvents, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
#define LogDataBuckets(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::General, Logs::DataBuckets))\
|
||||||
|
OutF(LogSys, Logs::General, Logs::DataBuckets, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogDataBucketsDetail(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::Detail, Logs::DataBuckets))\
|
||||||
|
OutF(LogSys, Logs::Detail, Logs::DataBuckets, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogZoning(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::General, Logs::Zoning))\
|
||||||
|
OutF(LogSys, Logs::General, Logs::Zoning, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogZoningDetail(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::Detail, Logs::Zoning))\
|
||||||
|
OutF(LogSys, Logs::Detail, Logs::Zoning, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogEqTime(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::General, Logs::EqTime))\
|
||||||
|
OutF(LogSys, Logs::General, Logs::EqTime, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogEqTimeDetail(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::Detail, Logs::EqTime))\
|
||||||
|
OutF(LogSys, Logs::Detail, Logs::EqTime, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
#define Log(debug_level, log_category, message, ...) do {\
|
#define Log(debug_level, log_category, message, ...) do {\
|
||||||
if (LogSys.IsLogEnabled(debug_level, log_category))\
|
if (LogSys.IsLogEnabled(debug_level, log_category))\
|
||||||
LogSys.Out(debug_level, log_category, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
LogSys.Out(debug_level, log_category, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
|||||||
+51
-7
@@ -46,16 +46,16 @@ EQTime::EQTime()
|
|||||||
timezone = 0;
|
timezone = 0;
|
||||||
memset(&eqTime, 0, sizeof(eqTime));
|
memset(&eqTime, 0, sizeof(eqTime));
|
||||||
//Defaults for time
|
//Defaults for time
|
||||||
TimeOfDay_Struct start;
|
TimeOfDay_Struct t{};
|
||||||
start.day = 1;
|
t.day = 1;
|
||||||
start.hour = 9;
|
t.hour = 9;
|
||||||
start.minute = 0;
|
t.minute = 0;
|
||||||
start.month = 1;
|
t.month = 1;
|
||||||
start.year = 3100;
|
t.year = 3100;
|
||||||
//Set default time zone
|
//Set default time zone
|
||||||
timezone = 0;
|
timezone = 0;
|
||||||
//Start EQTimer
|
//Start EQTimer
|
||||||
SetCurrentEQTimeOfDay(start, time(0));
|
SetCurrentEQTimeOfDay(t, time(nullptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
//getEQTimeOfDay - Reads timeConvert and writes the result to eqTimeOfDay
|
//getEQTimeOfDay - Reads timeConvert and writes the result to eqTimeOfDay
|
||||||
@@ -200,3 +200,47 @@ void EQTime::ToString(TimeOfDay_Struct *t, std::string &str) {
|
|||||||
buf[127] = '\0';
|
buf[127] = '\0';
|
||||||
str = buf;
|
str = buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool EQTime::IsDayTime() {
|
||||||
|
TimeOfDay_Struct tod{}; //Day time is 5am to 6:59pm (14 hours in-game)
|
||||||
|
GetCurrentEQTimeOfDay(&tod); //TODO: what if it fails and returns zero?
|
||||||
|
|
||||||
|
if (tod.hour >= 5 || tod.hour < 19) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool EQTime::IsNightTime() {
|
||||||
|
TimeOfDay_Struct tod{}; //Night time is 7pm to 4:59am (10 hours in-game)
|
||||||
|
GetCurrentEQTimeOfDay(&tod); //TODO: what if it fails and returns zero?
|
||||||
|
|
||||||
|
if (tod.hour >= 19 || tod.hour < 5) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool EQTime::IsInbetweenTime(uint8 min_time, uint8 max_time) {
|
||||||
|
TimeOfDay_Struct tod{};
|
||||||
|
GetCurrentEQTimeOfDay(&tod);
|
||||||
|
|
||||||
|
if (min_time == 0 || max_time == 0 || min_time > 24 || max_time > 24) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (max_time < min_time) {
|
||||||
|
if ((tod.hour >= min_time && tod.hour > max_time) || (tod.hour < min_time && tod.hour <= max_time)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (tod.hour >= min_time && tod.hour <= max_time) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|||||||
@@ -28,6 +28,9 @@ public:
|
|||||||
uint32 getEQTimeZone() { return timezone; }
|
uint32 getEQTimeZone() { return timezone; }
|
||||||
uint32 getEQTimeZoneHr() { return timezone/60; }
|
uint32 getEQTimeZoneHr() { return timezone/60; }
|
||||||
uint32 getEQTimeZoneMin() { return timezone%60; }
|
uint32 getEQTimeZoneMin() { return timezone%60; }
|
||||||
|
bool IsDayTime();
|
||||||
|
bool IsNightTime();
|
||||||
|
bool IsInbetweenTime(uint8 min_time, uint8 max_time);
|
||||||
|
|
||||||
//Set functions
|
//Set functions
|
||||||
int SetCurrentEQTimeOfDay(TimeOfDay_Struct start_eq, time_t start_real);
|
int SetCurrentEQTimeOfDay(TimeOfDay_Struct start_eq, time_t start_real);
|
||||||
|
|||||||
@@ -1,59 +0,0 @@
|
|||||||
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Library General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Library General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
|
||||||
License along with this library; if not, write to the Free
|
|
||||||
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
|
||||||
MA 02111-1307, USA */
|
|
||||||
|
|
||||||
/* Error messages for mysql clients */
|
|
||||||
/* error messages for the demon is in share/language/errmsg.sys */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
void init_client_errs(void);
|
|
||||||
extern const char *client_errors[]; /* Error messages */
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define CR_MIN_ERROR 2000 /* For easier client code */
|
|
||||||
#define CR_MAX_ERROR 2999
|
|
||||||
#if defined(OS2) && defined( MYSQL_SERVER)
|
|
||||||
#define CER(X) client_errors[(X)-CR_MIN_ERROR]
|
|
||||||
#else
|
|
||||||
#define ER(X) client_errors[(X)-CR_MIN_ERROR]
|
|
||||||
#endif
|
|
||||||
#define CLIENT_ERRMAP 2 /* Errormap used by my_error() */
|
|
||||||
|
|
||||||
#define CR_UNKNOWN_ERROR 2000
|
|
||||||
#define CR_SOCKET_CREATE_ERROR 2001
|
|
||||||
#define CR_CONNECTION_ERROR 2002
|
|
||||||
#define CR_CONN_HOST_ERROR 2003
|
|
||||||
#define CR_IPSOCK_ERROR 2004
|
|
||||||
#define CR_UNKNOWN_HOST 2005
|
|
||||||
#define CR_SERVER_GONE_ERROR 2006
|
|
||||||
#define CR_VERSION_ERROR 2007
|
|
||||||
#define CR_OUT_OF_MEMORY 2008
|
|
||||||
#define CR_WRONG_HOST_INFO 2009
|
|
||||||
#define CR_LOCALHOST_CONNECTION 2010
|
|
||||||
#define CR_TCP_CONNECTION 2011
|
|
||||||
#define CR_SERVER_HANDSHAKE_ERR 2012
|
|
||||||
#define CR_SERVER_LOST 2013
|
|
||||||
#define CR_COMMANDS_OUT_OF_SYNC 2014
|
|
||||||
#define CR_NAMEDPIPE_CONNECTION 2015
|
|
||||||
#define CR_NAMEDPIPEWAIT_ERROR 2016
|
|
||||||
#define CR_NAMEDPIPEOPEN_ERROR 2017
|
|
||||||
#define CR_NAMEDPIPESETSTATE_ERROR 2018
|
|
||||||
#define CR_CANT_READ_CHARSET 2019
|
|
||||||
#define CR_NET_PACKET_TOO_LARGE 2020
|
|
||||||
@@ -37,6 +37,8 @@ void PlayerEventLogs::Init()
|
|||||||
db.emplace_back(e.id);
|
db.emplace_back(e.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<PlayerEventLogSettingsRepository::PlayerEventLogSettings> settings_to_insert{};
|
||||||
|
|
||||||
// insert entries that don't exist in database
|
// insert entries that don't exist in database
|
||||||
for (int i = PlayerEvent::GM_COMMAND; i != PlayerEvent::MAX; i++) {
|
for (int i = PlayerEvent::GM_COMMAND; i != PlayerEvent::MAX; i++) {
|
||||||
bool is_in_database = std::find(db.begin(), db.end(), i) != db.end();
|
bool is_in_database = std::find(db.begin(), db.end(), i) != db.end();
|
||||||
@@ -56,21 +58,21 @@ void PlayerEventLogs::Init()
|
|||||||
|
|
||||||
bool is_missing_in_database = std::find(db.begin(), db.end(), i) == db.end();
|
bool is_missing_in_database = std::find(db.begin(), db.end(), i) == db.end();
|
||||||
if (is_missing_in_database && is_implemented && !is_deprecated) {
|
if (is_missing_in_database && is_implemented && !is_deprecated) {
|
||||||
LogInfo(
|
LogInfo("[New] PlayerEvent [{}] ({})", PlayerEvent::EventName[i], i);
|
||||||
"[New] PlayerEvent [{}] ({})",
|
|
||||||
PlayerEvent::EventName[i],
|
|
||||||
i
|
|
||||||
);
|
|
||||||
|
|
||||||
auto c = PlayerEventLogSettingsRepository::NewEntity();
|
auto c = PlayerEventLogSettingsRepository::NewEntity();
|
||||||
c.id = i;
|
c.id = i;
|
||||||
c.event_name = PlayerEvent::EventName[i];
|
c.event_name = PlayerEvent::EventName[i];
|
||||||
c.event_enabled = m_settings[i].event_enabled;
|
c.event_enabled = m_settings[i].event_enabled;
|
||||||
c.retention_days = m_settings[i].retention_days;
|
c.retention_days = m_settings[i].retention_days;
|
||||||
PlayerEventLogSettingsRepository::InsertOne(*m_database, c);
|
settings_to_insert.emplace_back(c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!settings_to_insert.empty()) {
|
||||||
|
PlayerEventLogSettingsRepository::ReplaceMany(*m_database, settings_to_insert);
|
||||||
|
}
|
||||||
|
|
||||||
bool processing_in_world = !RuleB(Logging, PlayerEventsQSProcess) && IsWorld();
|
bool processing_in_world = !RuleB(Logging, PlayerEventsQSProcess) && IsWorld();
|
||||||
bool processing_in_qs = RuleB(Logging, PlayerEventsQSProcess) && IsQueryServ();
|
bool processing_in_qs = RuleB(Logging, PlayerEventsQSProcess) && IsQueryServ();
|
||||||
|
|
||||||
@@ -611,7 +613,7 @@ void PlayerEventLogs::Process()
|
|||||||
|
|
||||||
void PlayerEventLogs::ProcessRetentionTruncation()
|
void PlayerEventLogs::ProcessRetentionTruncation()
|
||||||
{
|
{
|
||||||
LogInfo("Running truncation");
|
LogPlayerEvents("Running truncation");
|
||||||
|
|
||||||
for (int i = PlayerEvent::GM_COMMAND; i != PlayerEvent::MAX; i++) {
|
for (int i = PlayerEvent::GM_COMMAND; i != PlayerEvent::MAX; i++) {
|
||||||
if (m_settings[i].retention_days > 0) {
|
if (m_settings[i].retention_days > 0) {
|
||||||
|
|||||||
+2
-2
@@ -96,12 +96,12 @@ bool IsOfEqualRace(int r1, int r2)
|
|||||||
// TODO: add more values
|
// TODO: add more values
|
||||||
switch (r1) {
|
switch (r1) {
|
||||||
case DARK_ELF:
|
case DARK_ELF:
|
||||||
if (r2 == RACE_NERIAK_CITIZEN_77) {
|
if (r2 == Race::NeriakCitizen) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case BARBARIAN:
|
case BARBARIAN:
|
||||||
if (r2 == RACE_HALAS_CITIZEN_90) {
|
if (r2 == Race::HalasCitizen) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -238,41 +238,6 @@ enum { //some random constants
|
|||||||
// Timer to update aggrometer
|
// Timer to update aggrometer
|
||||||
#define AGGRO_METER_UPDATE_MS 1000
|
#define AGGRO_METER_UPDATE_MS 1000
|
||||||
|
|
||||||
//Some hard coded statuses from commands and other places:
|
|
||||||
enum {
|
|
||||||
minStatusToBeGM = 40,
|
|
||||||
minStatusToUseGMCommands = 80,
|
|
||||||
minStatusToKick = 150,
|
|
||||||
minStatusToAvoidFalling = 100,
|
|
||||||
minStatusToHaveInvalidSpells = 80,
|
|
||||||
minStatusToHaveInvalidSkills = 80,
|
|
||||||
minStatusToIgnoreZoneFlags = 80,
|
|
||||||
minStatusToSeeOthersZoneFlags = 80,
|
|
||||||
minStatusToEditOtherGuilds = 80,
|
|
||||||
commandMovecharSelfOnly = 80, //below this == only self move allowed
|
|
||||||
commandMovecharToSpecials = 200, //ability to send people to cshom/load zones
|
|
||||||
commandZoneToSpecials = 80, //zone to cshome, out of load zones
|
|
||||||
commandToggleAI = 250, //can turn NPC AI on and off
|
|
||||||
commandCastSpecials = 100, //can cast special spells
|
|
||||||
commandInstacast = 100, //insta-cast all #casted spells
|
|
||||||
commandLevelAboveCap = 100, //can #level players above level cap
|
|
||||||
commandLevelNPCAboveCap = 100, //can #level NPCs above level cap
|
|
||||||
commandSetSkillsOther = 100, //ability to setskills on others
|
|
||||||
commandRaceOthers = 100, //ability to #race on others
|
|
||||||
commandGenderOthers = 100, //ability to #gender on others
|
|
||||||
commandTextureOthers = 100, //ability to #texture on others
|
|
||||||
commandDoAnimOthers = 100, //can #doanim on others
|
|
||||||
commandLockZones = 101, //can lock or unlock zones
|
|
||||||
commandEditPlayerCorpses = 150, //can Edit Player Corpses
|
|
||||||
commandChangeFlags = 200, //ability to set/refresh flags
|
|
||||||
commandBanPlayers = 100, //can set bans on players
|
|
||||||
commandChangeDatarate = 201, //edit client's data rate
|
|
||||||
commandZoneToCoords = 0, //can #zone with coords
|
|
||||||
commandInterrogateInv = 100, //below this == only log on error state and self-only target dump
|
|
||||||
commandInvSnapshot = 150 //ability to clear/restore snapshots
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// This is the item ID we use for say links, we use the max that fits in 5 ASCII chars
|
// This is the item ID we use for say links, we use the max that fits in 5 ASCII chars
|
||||||
#define SAYLINK_ITEM_ID 0xFFFFF
|
#define SAYLINK_ITEM_ID 0xFFFFF
|
||||||
|
|
||||||
|
|||||||
+8
-2
@@ -55,8 +55,14 @@ bool File::Exists(const std::string &name)
|
|||||||
*/
|
*/
|
||||||
void File::Makedir(const std::string &directory_name)
|
void File::Makedir(const std::string &directory_name)
|
||||||
{
|
{
|
||||||
fs::create_directory(directory_name);
|
try {
|
||||||
fs::permissions(directory_name, fs::perms::owner_all);
|
fs::create_directory(directory_name);
|
||||||
|
fs::permissions(directory_name, fs::perms::owner_all);
|
||||||
|
}
|
||||||
|
catch (const fs::filesystem_error &ex) {
|
||||||
|
std::cout << "Failed to create directory: " << directory_name << std::endl;
|
||||||
|
std::cout << ex.what() << std::endl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string File::FindEqemuConfigPath()
|
std::string File::FindEqemuConfigPath()
|
||||||
|
|||||||
@@ -353,7 +353,7 @@ bool EQ::InventoryProfile::SwapItem(
|
|||||||
fail_state = swapRaceClass;
|
fail_state = swapRaceClass;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (deity_id && source_item->Deity && !(deity::ConvertDeityTypeToDeityTypeBit((deity::DeityType)deity_id) & source_item->Deity)) {
|
if (deity_id && source_item->Deity && !(deity::GetDeityBitmask((deity::DeityType)deity_id) & source_item->Deity)) {
|
||||||
fail_state = swapDeity;
|
fail_state = swapDeity;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -379,7 +379,7 @@ bool EQ::InventoryProfile::SwapItem(
|
|||||||
fail_state = swapRaceClass;
|
fail_state = swapRaceClass;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (deity_id && destination_item->Deity && !(deity::ConvertDeityTypeToDeityTypeBit((deity::DeityType)deity_id) & destination_item->Deity)) {
|
if (deity_id && destination_item->Deity && !(deity::GetDeityBitmask((deity::DeityType)deity_id) & destination_item->Deity)) {
|
||||||
fail_state = swapDeity;
|
fail_state = swapDeity;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -801,34 +801,35 @@ int16 EQ::InventoryProfile::HasItemByLoreGroup(uint32 loregroup, uint8 where)
|
|||||||
// Returns slot_id when there's one available, else SLOT_INVALID
|
// Returns slot_id when there's one available, else SLOT_INVALID
|
||||||
int16 EQ::InventoryProfile::FindFreeSlot(bool for_bag, bool try_cursor, uint8 min_size, bool is_arrow)
|
int16 EQ::InventoryProfile::FindFreeSlot(bool for_bag, bool try_cursor, uint8 min_size, bool is_arrow)
|
||||||
{
|
{
|
||||||
// Check basic inventory
|
const int16 last_bag_slot = RuleI(World, ExpansionSettings) & EQ::expansions::bitHoT ? EQ::invslot::slotGeneral10 : EQ::invslot::slotGeneral8;
|
||||||
for (int16 i = invslot::GENERAL_BEGIN; i <= invslot::GENERAL_END; i++) {
|
|
||||||
if ((((uint64)1 << i) & m_lookup->PossessionsBitmask) == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!GetItem(i))
|
for (int16 i = invslot::GENERAL_BEGIN; i <= last_bag_slot; i++) { // Check basic inventory
|
||||||
// Found available slot in personal inventory
|
if ((((uint64) 1 << i) & m_lookup->PossessionsBitmask) == 0) {
|
||||||
return i;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!GetItem(i)) {
|
||||||
|
return i; // Found available slot in personal inventory
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!for_bag) {
|
if (!for_bag) {
|
||||||
for (int16 i = invslot::GENERAL_BEGIN; i <= invslot::GENERAL_END; i++) {
|
for (int16 i = invslot::GENERAL_BEGIN; i <= last_bag_slot; i++) {
|
||||||
if ((((uint64)1 << i) & m_lookup->PossessionsBitmask) == 0)
|
if ((((uint64) 1 << i) & m_lookup->PossessionsBitmask) == 0) {
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
const ItemInstance* inst = GetItem(i);
|
const auto *inst = GetItem(i);
|
||||||
if (inst && inst->IsClassBag() && inst->GetItem()->BagSize >= min_size)
|
if (inst && inst->IsClassBag() && inst->GetItem()->BagSize >= min_size) {
|
||||||
{
|
if (inst->GetItem()->BagType == item::BagTypeQuiver &&
|
||||||
if (inst->GetItem()->BagType == item::BagTypeQuiver && inst->GetItem()->ItemType != item::ItemTypeArrow)
|
inst->GetItem()->ItemType != item::ItemTypeArrow) {
|
||||||
{
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
int16 base_slot_id = InventoryProfile::CalcSlotId(i, invbag::SLOT_BEGIN);
|
const int16 base_slot_id = InventoryProfile::CalcSlotId(i, invbag::SLOT_BEGIN);
|
||||||
|
|
||||||
uint8 slots = inst->GetItem()->BagSlots;
|
const uint8 slots = inst->GetItem()->BagSlots;
|
||||||
uint8 j;
|
for (uint8 j = invbag::SLOT_BEGIN; j < slots; j++) {
|
||||||
for (j = invbag::SLOT_BEGIN; j<slots; j++) {
|
|
||||||
if (!GetItem(base_slot_id + j)) {
|
if (!GetItem(base_slot_id + j)) {
|
||||||
// Found available slot within bag
|
// Found available slot within bag
|
||||||
return (base_slot_id + j);
|
return (base_slot_id + j);
|
||||||
@@ -1444,7 +1445,7 @@ int16 EQ::InventoryProfile::_PutItem(int16 slot_id, ItemInstance* inst)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (result == INVALID_INDEX) {
|
if (result == INVALID_INDEX) {
|
||||||
LogError("InventoryProfile::_PutItem: Invalid slot_id specified ({}) with parent slot id ({})", slot_id, parentSlot);
|
LogError("Invalid slot_id specified ({}) with parent slot id ({})", slot_id, parentSlot);
|
||||||
InventoryProfile::MarkDirty(inst); // Slot not found, clean up
|
InventoryProfile::MarkDirty(inst); // Slot not found, clean up
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ namespace EQ
|
|||||||
|
|
||||||
// Swap items in inventory
|
// Swap items in inventory
|
||||||
enum SwapItemFailState : int8 { swapInvalid = -1, swapPass = 0, swapNotAllowed, swapNullData, swapRaceClass, swapDeity, swapLevel };
|
enum SwapItemFailState : int8 { swapInvalid = -1, swapPass = 0, swapNotAllowed, swapNullData, swapRaceClass, swapDeity, swapLevel };
|
||||||
bool SwapItem(int16 source_slot, int16 destination_slot, SwapItemFailState& fail_state, uint16 race_id = RACE_DOUG_0, uint8 class_id = NO_CLASS, uint16 deity_id = deity::DeityType::DeityUnknown, uint8 level = 0);
|
bool SwapItem(int16 source_slot, int16 destination_slot, SwapItemFailState& fail_state, uint16 race_id = Race::Doug, uint8 class_id = Class::None, uint16 deity_id = deity::DeityType::DeityUnknown, uint8 level = 0);
|
||||||
|
|
||||||
// Remove item from inventory
|
// Remove item from inventory
|
||||||
bool DeleteItem(int16 slot_id, int16 quantity = 0);
|
bool DeleteItem(int16 slot_id, int16 quantity = 0);
|
||||||
|
|||||||
@@ -230,6 +230,10 @@ bool EQ::ItemData::IsTypeShield() const
|
|||||||
return (ItemType == item::ItemTypeShield);
|
return (ItemType == item::ItemTypeShield);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool EQ::ItemData::IsQuestItem() const {
|
||||||
|
return QuestItemFlag;
|
||||||
|
}
|
||||||
|
|
||||||
bool EQ::ItemData::CheckLoreConflict(const ItemData* l_item, const ItemData* r_item)
|
bool EQ::ItemData::CheckLoreConflict(const ItemData* l_item, const ItemData* r_item)
|
||||||
{
|
{
|
||||||
if (!l_item || !r_item)
|
if (!l_item || !r_item)
|
||||||
|
|||||||
@@ -356,6 +356,7 @@ namespace EQ
|
|||||||
struct ItemData {
|
struct ItemData {
|
||||||
// Non packet based fields
|
// Non packet based fields
|
||||||
uint8 MinStatus {};
|
uint8 MinStatus {};
|
||||||
|
char Comment[255] {};
|
||||||
|
|
||||||
// Packet based fields
|
// Packet based fields
|
||||||
uint8 ItemClass {}; // Item Type: 0=common, 1=container, 2=book
|
uint8 ItemClass {}; // Item Type: 0=common, 1=container, 2=book
|
||||||
@@ -546,6 +547,7 @@ namespace EQ
|
|||||||
bool IsType1HWeapon() const;
|
bool IsType1HWeapon() const;
|
||||||
bool IsType2HWeapon() const;
|
bool IsType2HWeapon() const;
|
||||||
bool IsTypeShield() const;
|
bool IsTypeShield() const;
|
||||||
|
bool IsQuestItem() const;
|
||||||
|
|
||||||
static bool CheckLoreConflict(const ItemData* l_item, const ItemData* r_item);
|
static bool CheckLoreConflict(const ItemData* l_item, const ItemData* r_item);
|
||||||
bool CheckLoreConflict(const ItemData* item) const { return CheckLoreConflict(this, item); }
|
bool CheckLoreConflict(const ItemData* item) const { return CheckLoreConflict(this, item); }
|
||||||
|
|||||||
@@ -720,12 +720,14 @@ EQ::ItemInstance* EQ::ItemInstance::RemoveAugment(uint8 index)
|
|||||||
|
|
||||||
bool EQ::ItemInstance::IsAugmented()
|
bool EQ::ItemInstance::IsAugmented()
|
||||||
{
|
{
|
||||||
if (!m_item || !m_item->IsClassCommon())
|
if (!m_item || !m_item->IsClassCommon()) {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
for (int index = invaug::SOCKET_BEGIN; index <= invaug::SOCKET_END; ++index) {
|
for (uint8 slot_id = invaug::SOCKET_BEGIN; slot_id <= invaug::SOCKET_END; ++slot_id) {
|
||||||
if (GetAugmentItemID(index))
|
if (GetAugmentItemID(slot_id)) {
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@@ -1271,7 +1273,7 @@ int EQ::ItemInstance::GetItemBaneDamageBody(bool augments) const
|
|||||||
|
|
||||||
int EQ::ItemInstance::GetItemBaneDamageRace(bool augments) const
|
int EQ::ItemInstance::GetItemBaneDamageRace(bool augments) const
|
||||||
{
|
{
|
||||||
int race = RACE_DOUG_0;
|
int race = Race::Doug;
|
||||||
const auto item = GetItem();
|
const auto item = GetItem();
|
||||||
if (item) {
|
if (item) {
|
||||||
race = item->BaneDmgRace;
|
race = item->BaneDmgRace;
|
||||||
|
|||||||
+24640
File diff suppressed because it is too large
Load Diff
@@ -48,5 +48,7 @@
|
|||||||
#define LANG_HADAL 26
|
#define LANG_HADAL 26
|
||||||
#define LANG_UNKNOWN 27
|
#define LANG_UNKNOWN 27
|
||||||
|
|
||||||
|
#define MAX_LANGUAGE_SKILL 100
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
-117
@@ -214,123 +214,6 @@ std::string x;
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
void LoadItemDBFieldNames() {
|
|
||||||
DBFieldNames[0]="N/A"; // Charges
|
|
||||||
DBFieldNames[1]="unknown002"; // ?
|
|
||||||
DBFieldNames[2]="N/A"; // Current Equip Slot
|
|
||||||
DBFieldNames[3]="unknown004";
|
|
||||||
DBFieldNames[4]="unknown005"; // ?
|
|
||||||
DBFieldNames[5]="itemclass"; // "Item Type (0=common, 1=container, 2=book)"
|
|
||||||
DBFieldNames[6]="name"; // Name
|
|
||||||
DBFieldNames[7]="lore"; // "Lore Name (*=lore, &=summoned, #=artifact)"
|
|
||||||
DBFieldNames[8]="idfile"; // IDFile
|
|
||||||
DBFieldNames[9]="id"; // ItemNumber
|
|
||||||
DBFieldNames[10]="weight"; // Weight
|
|
||||||
DBFieldNames[11]="norent"; // "NoRent (0=norent, 255=not norent)"
|
|
||||||
DBFieldNames[12]="nodrop"; // "NoDrop (0=nodrop, 255=not nodrop)"
|
|
||||||
DBFieldNames[13]="size"; // "Size (0=tiny, 1=small, 2=medium, 3=large, 4=giant)"
|
|
||||||
DBFieldNames[14]="slots"; // EquipSlots
|
|
||||||
DBFieldNames[15]="cost"; // Cost
|
|
||||||
DBFieldNames[16]="icon"; // IconNumber
|
|
||||||
DBFieldNames[17]="unknown018";
|
|
||||||
DBFieldNames[18]="unknown019";
|
|
||||||
DBFieldNames[19]="unknown020"; // ?
|
|
||||||
DBFieldNames[20]="tradeskills"; // "Tradeskill Item (1=is a tradeskill item, 0=not)"
|
|
||||||
DBFieldNames[21]="cr"; // SvCold
|
|
||||||
DBFieldNames[22]="dr"; // SvDisease
|
|
||||||
DBFieldNames[23]="pr"; // SvPoison
|
|
||||||
DBFieldNames[24]="mr"; // SvMagic
|
|
||||||
DBFieldNames[25]="fr"; // SvFire
|
|
||||||
DBFieldNames[26]="astr"; // STR
|
|
||||||
DBFieldNames[27]="asta"; // STA
|
|
||||||
DBFieldNames[28]="aagi"; // AGI
|
|
||||||
DBFieldNames[29]="adex"; // DEX
|
|
||||||
DBFieldNames[30]="acha"; // CHA
|
|
||||||
DBFieldNames[31]="aint"; // INT
|
|
||||||
DBFieldNames[32]="awis"; // WIS
|
|
||||||
DBFieldNames[33]="hp"; // HP
|
|
||||||
DBFieldNames[34]="mana"; // Mana
|
|
||||||
DBFieldNames[35]="ac"; // AC
|
|
||||||
DBFieldNames[36]="deity"; // Deity
|
|
||||||
DBFieldNames[37]="skillmodvalue"; // Skill Mod Value
|
|
||||||
DBFieldNames[38]="skillmodtype"; // Skill Mod Type
|
|
||||||
DBFieldNames[39]="banedmgrace"; // Bane Dmg Race
|
|
||||||
DBFieldNames[40]="banedmgamt"; // Band Dmg
|
|
||||||
DBFieldNames[41]="banedmgbody"; // Band Dmg Body
|
|
||||||
DBFieldNames[42]="magic"; // "Magic (0=not magic, 1=magic)"
|
|
||||||
DBFieldNames[43]="casttime2"; // Casttime appears twice
|
|
||||||
DBFieldNames[44]="hasteproclvl"; // "Level (Haste value, rather)"
|
|
||||||
DBFieldNames[45]="reqlevel"; // Required Level
|
|
||||||
DBFieldNames[46]="bardtype"; // Bard Type
|
|
||||||
DBFieldNames[47]="bardvalue"; // Bard Type Amount
|
|
||||||
DBFieldNames[48]="light"; // Light
|
|
||||||
DBFieldNames[49]="delay"; // Attack Delay
|
|
||||||
DBFieldNames[50]="reclevel"; // Recommended Level
|
|
||||||
DBFieldNames[51]="recskill"; // Recommended Skill
|
|
||||||
DBFieldNames[52]="elemdmgamt"; // "Elemental Dmg Type (1=magic, 2=fire, 3=cold, 4=poison, 5=disease)"
|
|
||||||
DBFieldNames[53]="elemdmgtype"; // Elemental Dmg
|
|
||||||
DBFieldNames[54]="effecttype"; // "Effect Type (0=combat, 1=clicky, 2=Worn, 3=Expendable charges, 4=Must Equip Clicky, 5=clicky)"
|
|
||||||
DBFieldNames[55]="range"; // Range
|
|
||||||
DBFieldNames[56]="damage"; // Damage
|
|
||||||
DBFieldNames[57]="color"; // Color
|
|
||||||
DBFieldNames[58]="classes"; // Classes
|
|
||||||
DBFieldNames[59]="races"; // Races
|
|
||||||
DBFieldNames[60]="unknown061";
|
|
||||||
DBFieldNames[61]="spellid"; // SpellId
|
|
||||||
DBFieldNames[62]="maxcharges"; // MaxCharges
|
|
||||||
DBFieldNames[63]="itemtype"; // "Skill (ItemType: 1hs, etc)"
|
|
||||||
DBFieldNames[64]="material"; // Material
|
|
||||||
DBFieldNames[65]="sellrate"; // ** Sell Rate
|
|
||||||
DBFieldNames[66]="unknown067";
|
|
||||||
DBFieldNames[67]="casttime"; // CastTime (milliseconds)
|
|
||||||
DBFieldNames[68]="unknown069";
|
|
||||||
DBFieldNames[69]="unknown070"; // ?
|
|
||||||
DBFieldNames[70]="focusid"; // Focus Effect Spell Id
|
|
||||||
DBFieldNames[71]="combateffects"; // CombatEffects
|
|
||||||
DBFieldNames[72]="shielding"; // Shielding
|
|
||||||
DBFieldNames[73]="stunresist"; // StunResist
|
|
||||||
DBFieldNames[74]="strikethrough"; // StrikeThrough
|
|
||||||
DBFieldNames[75]="unknown076";
|
|
||||||
DBFieldNames[76]="unknown077"; // ?
|
|
||||||
DBFieldNames[77]="spellshield"; // Spell Shield
|
|
||||||
DBFieldNames[78]="avoidance"; // Avoidance
|
|
||||||
DBFieldNames[79]="accuracy"; // Accuracy
|
|
||||||
DBFieldNames[80]="factionmod1"; // Faction Mod Index 1
|
|
||||||
DBFieldNames[81]="factionmod2"; // Faction Mod Index 2
|
|
||||||
DBFieldNames[82]="factionmod3"; // Faction Mod Index 3
|
|
||||||
DBFieldNames[83]="factionmod4"; // Faction Mod Index 4
|
|
||||||
DBFieldNames[84]="factionamt1"; // Faction Mod Value 1
|
|
||||||
DBFieldNames[85]="factionamt2"; // Faction Mod Value 2
|
|
||||||
DBFieldNames[86]="factionamt3"; // Faction Mod Value 3
|
|
||||||
DBFieldNames[87]="factionamt4"; // Faction Mod Value 4
|
|
||||||
DBFieldNames[88]="unknown089";
|
|
||||||
DBFieldNames[89]="charmfile"; // ** Charm File
|
|
||||||
DBFieldNames[90]="unknown091";
|
|
||||||
DBFieldNames[91]="augslot1type"; // Slot1Type
|
|
||||||
DBFieldNames[92]="augslot2type"; // Slot2Type
|
|
||||||
DBFieldNames[93]="augslot3type"; // Slot3Type
|
|
||||||
DBFieldNames[94]="augslot4type"; // Slot4Type
|
|
||||||
DBFieldNames[95]="augslot5type"; // Slot5Type
|
|
||||||
DBFieldNames[96]="ldonpointtheme";
|
|
||||||
DBFieldNames[97]="ldonpointcost"; // ?
|
|
||||||
DBFieldNames[98]="unknown099";
|
|
||||||
DBFieldNames[99]="bagtype"; // bag type
|
|
||||||
DBFieldNames[100]="bagslots"; // bag slots
|
|
||||||
DBFieldNames[101]="bagsize"; // bag size capacity
|
|
||||||
DBFieldNames[102]="bagwr"; // bag weight reduction
|
|
||||||
DBFieldNames[103]="booktype"; // "book type (0=rolled up note, 1=book)"
|
|
||||||
DBFieldNames[104]="unknown105";
|
|
||||||
DBFieldNames[105]="filename"; // Book Filename
|
|
||||||
DBFieldNames[106]="unknown107";
|
|
||||||
DBFieldNames[107]="unknown108";
|
|
||||||
DBFieldNames[108]="loreflag";
|
|
||||||
DBFieldNames[109]="unknown111";
|
|
||||||
DBFieldNames[110]="unknown112";
|
|
||||||
DBFieldNames[111]="unknown113";
|
|
||||||
DBFieldNames[112]="unknown114";
|
|
||||||
DBFieldNames[113]="unknown115"; // ? (end quote)
|
|
||||||
}
|
|
||||||
|
|
||||||
void dump_message_column(unsigned char *buffer, unsigned long length, std::string leader, FILE *to)
|
void dump_message_column(unsigned char *buffer, unsigned long length, std::string leader, FILE *to)
|
||||||
{
|
{
|
||||||
unsigned long i,j;
|
unsigned long i,j;
|
||||||
|
|||||||
@@ -15,8 +15,6 @@ bool ItemParse(const char *data, int length, std::map<int,std::map<int,std::stri
|
|||||||
|
|
||||||
int Tokenize(std::string s, std::map<int,std::string> & tokens, char delim='|');
|
int Tokenize(std::string s, std::map<int,std::string> & tokens, char delim='|');
|
||||||
|
|
||||||
void LoadItemDBFieldNames();
|
|
||||||
|
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
int print_stacktrace();
|
int print_stacktrace();
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ void MySQLRequestResult::ZeroOut()
|
|||||||
m_RowCount = 0;
|
m_RowCount = 0;
|
||||||
m_RowsAffected = 0;
|
m_RowsAffected = 0;
|
||||||
m_LastInsertedID = 0;
|
m_LastInsertedID = 0;
|
||||||
|
m_error_message = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
MySQLRequestResult::~MySQLRequestResult()
|
MySQLRequestResult::~MySQLRequestResult()
|
||||||
@@ -137,3 +138,23 @@ MySQLRequestResult& MySQLRequestResult::operator=(MySQLRequestResult&& other)
|
|||||||
other.ZeroOut();
|
other.ZeroOut();
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32 MySQLRequestResult::GetErrorNumber() const
|
||||||
|
{
|
||||||
|
return m_ErrorNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MySQLRequestResult::SetErrorNumber(uint32 m_error_number)
|
||||||
|
{
|
||||||
|
m_ErrorNumber = m_error_number;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string &MySQLRequestResult::GetErrorMessage() const
|
||||||
|
{
|
||||||
|
return m_error_message;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MySQLRequestResult::SetErrorMessage(const std::string &m_error_message)
|
||||||
|
{
|
||||||
|
MySQLRequestResult::m_error_message = m_error_message;
|
||||||
|
}
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ private:
|
|||||||
uint32 m_LastInsertedID;
|
uint32 m_LastInsertedID;
|
||||||
uint32 m_ErrorNumber;
|
uint32 m_ErrorNumber;
|
||||||
|
|
||||||
|
std::string m_error_message;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@@ -44,7 +45,13 @@ public:
|
|||||||
MySQLRequestResult& operator=(MySQLRequestResult&& other);
|
MySQLRequestResult& operator=(MySQLRequestResult&& other);
|
||||||
|
|
||||||
bool Success() const { return m_Success;}
|
bool Success() const { return m_Success;}
|
||||||
std::string ErrorMessage() const {return m_ErrorBuffer ? std::string(m_ErrorBuffer) : std::string("");}
|
std::string ErrorMessage() const {
|
||||||
|
if (!m_error_message.empty()) {
|
||||||
|
return m_error_message;
|
||||||
|
}
|
||||||
|
|
||||||
|
return m_ErrorBuffer ? std::string(m_ErrorBuffer) : std::string("");
|
||||||
|
}
|
||||||
uint32 ErrorNumber() const {return m_ErrorNumber;}
|
uint32 ErrorNumber() const {return m_ErrorNumber;}
|
||||||
uint32 RowsAffected() const {return m_RowsAffected;}
|
uint32 RowsAffected() const {return m_RowsAffected;}
|
||||||
uint32 RowCount() const {return m_RowCount;}
|
uint32 RowCount() const {return m_RowCount;}
|
||||||
@@ -57,6 +64,11 @@ public:
|
|||||||
MySQLRequestRow& begin() { return m_CurrentRow; }
|
MySQLRequestRow& begin() { return m_CurrentRow; }
|
||||||
MySQLRequestRow& end() { return m_OneBeyondRow; }
|
MySQLRequestRow& end() { return m_OneBeyondRow; }
|
||||||
|
|
||||||
|
uint32 GetErrorNumber() const;
|
||||||
|
void SetErrorNumber(uint32 m_error_number);
|
||||||
|
const std::string &GetErrorMessage() const;
|
||||||
|
void SetErrorMessage(const std::string &m_error_message);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void FreeInternals();
|
void FreeInternals();
|
||||||
void ZeroOut();
|
void ZeroOut();
|
||||||
|
|||||||
+139
-92
@@ -34,6 +34,7 @@
|
|||||||
#include "../rulesys.h"
|
#include "../rulesys.h"
|
||||||
#include "../path_manager.h"
|
#include "../path_manager.h"
|
||||||
#include "../races.h"
|
#include "../races.h"
|
||||||
|
#include "../raid.h"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
@@ -2608,88 +2609,124 @@ namespace RoF
|
|||||||
|
|
||||||
ENCODE(OP_RaidJoin)
|
ENCODE(OP_RaidJoin)
|
||||||
{
|
{
|
||||||
EQApplicationPacket *inapp = *p;
|
EQApplicationPacket* inapp = *p;
|
||||||
unsigned char * __emu_buffer = inapp->pBuffer;
|
*p = nullptr;
|
||||||
RaidCreate_Struct *raid_create = (RaidCreate_Struct*)__emu_buffer;
|
unsigned char* __emu_buffer = inapp->pBuffer;
|
||||||
|
RaidCreate_Struct* emu = (RaidCreate_Struct*)__emu_buffer;
|
||||||
|
|
||||||
auto outapp_create = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
||||||
structs::RaidGeneral_Struct *general = (structs::RaidGeneral_Struct*)outapp_create->pBuffer;
|
structs::RaidGeneral_Struct* general = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
general->action = 8;
|
general->action = raidCreate;
|
||||||
general->parameter = 1;
|
general->parameter = RaidCommandAcceptInvite;
|
||||||
strn0cpy(general->leader_name, raid_create->leader_name, 64);
|
strn0cpy(general->leader_name, emu->leader_name, sizeof(emu->leader_name));
|
||||||
strn0cpy(general->player_name, raid_create->leader_name, 64);
|
strn0cpy(general->player_name, emu->leader_name, sizeof(emu->leader_name));
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
|
||||||
dest->FastQueuePacket(&outapp_create);
|
|
||||||
safe_delete(inapp);
|
safe_delete(inapp);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ENCODE(OP_RaidUpdate)
|
ENCODE(OP_RaidUpdate)
|
||||||
{
|
{
|
||||||
EQApplicationPacket *inapp = *p;
|
EQApplicationPacket* inapp = *p;
|
||||||
*p = nullptr;
|
*p = nullptr;
|
||||||
unsigned char * __emu_buffer = inapp->pBuffer;
|
unsigned char* __emu_buffer = inapp->pBuffer;
|
||||||
RaidGeneral_Struct *raid_gen = (RaidGeneral_Struct*)__emu_buffer;
|
RaidGeneral_Struct* raid_gen = (RaidGeneral_Struct*)__emu_buffer;
|
||||||
|
|
||||||
if (raid_gen->action == 0) // raid add has longer length than other raid updates
|
switch (raid_gen->action)
|
||||||
{
|
{
|
||||||
RaidAddMember_Struct* in_add_member = (RaidAddMember_Struct*)__emu_buffer;
|
case raidAdd:
|
||||||
|
{
|
||||||
|
RaidAddMember_Struct* emu = (RaidAddMember_Struct*)__emu_buffer;
|
||||||
|
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidAddMember_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidAddMember_Struct));
|
||||||
structs::RaidAddMember_Struct *add_member = (structs::RaidAddMember_Struct*)outapp->pBuffer;
|
structs::RaidAddMember_Struct* eq = (structs::RaidAddMember_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
add_member->raidGen.action = in_add_member->raidGen.action;
|
OUT(raidGen.action);
|
||||||
add_member->raidGen.parameter = in_add_member->raidGen.parameter;
|
OUT(raidGen.parameter);
|
||||||
strn0cpy(add_member->raidGen.leader_name, in_add_member->raidGen.leader_name, 64);
|
OUT_str(raidGen.leader_name);
|
||||||
strn0cpy(add_member->raidGen.player_name, in_add_member->raidGen.player_name, 64);
|
OUT_str(raidGen.player_name);
|
||||||
add_member->_class = in_add_member->_class;
|
OUT(_class);
|
||||||
add_member->level = in_add_member->level;
|
OUT(level);
|
||||||
add_member->isGroupLeader = in_add_member->isGroupLeader;
|
OUT(isGroupLeader);
|
||||||
add_member->flags[0] = in_add_member->flags[0];
|
OUT(flags[0]);
|
||||||
add_member->flags[1] = in_add_member->flags[1];
|
OUT(flags[1]);
|
||||||
add_member->flags[2] = in_add_member->flags[2];
|
OUT(flags[2]);
|
||||||
add_member->flags[3] = in_add_member->flags[3];
|
OUT(flags[3]);
|
||||||
add_member->flags[4] = in_add_member->flags[4];
|
OUT(flags[4]);
|
||||||
dest->FastQueuePacket(&outapp);
|
|
||||||
}
|
|
||||||
else if (raid_gen->action == 35)
|
|
||||||
{
|
|
||||||
RaidMOTD_Struct *inmotd = (RaidMOTD_Struct *)__emu_buffer;
|
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidMOTD_Struct) +
|
|
||||||
strlen(inmotd->motd) + 1);
|
|
||||||
structs::RaidMOTD_Struct *outmotd = (structs::RaidMOTD_Struct *)outapp->pBuffer;
|
|
||||||
|
|
||||||
outmotd->general.action = inmotd->general.action;
|
|
||||||
strn0cpy(outmotd->general.player_name, inmotd->general.player_name, 64);
|
|
||||||
strn0cpy(outmotd->motd, inmotd->motd, strlen(inmotd->motd) + 1);
|
|
||||||
dest->FastQueuePacket(&outapp);
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if (raid_gen->action == 14 || raid_gen->action == 30)
|
case raidSetMotd:
|
||||||
{
|
{
|
||||||
RaidLeadershipUpdate_Struct *inlaa = (RaidLeadershipUpdate_Struct *)__emu_buffer;
|
RaidMOTD_Struct* emu = (RaidMOTD_Struct*)__emu_buffer;
|
||||||
auto outapp =
|
|
||||||
new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidLeadershipUpdate_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidMOTD_Struct));
|
||||||
structs::RaidLeadershipUpdate_Struct *outlaa = (structs::RaidLeadershipUpdate_Struct *)outapp->pBuffer;
|
structs::RaidMOTD_Struct* eq = (structs::RaidMOTD_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(general.action);
|
||||||
|
OUT_str(general.player_name);
|
||||||
|
OUT_str(general.leader_name);
|
||||||
|
OUT_str(motd);
|
||||||
|
|
||||||
outlaa->action = inlaa->action;
|
|
||||||
strn0cpy(outlaa->player_name, inlaa->player_name, 64);
|
|
||||||
strn0cpy(outlaa->leader_name, inlaa->leader_name, 64);
|
|
||||||
memcpy(&outlaa->raid, &inlaa->raid, sizeof(RaidLeadershipAA_Struct));
|
|
||||||
dest->FastQueuePacket(&outapp);
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else
|
case raidSetLeaderAbilities:
|
||||||
|
case raidMakeLeader:
|
||||||
{
|
{
|
||||||
RaidGeneral_Struct* in_raid_general = (RaidGeneral_Struct*)__emu_buffer;
|
RaidLeadershipUpdate_Struct* emu = (RaidLeadershipUpdate_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidLeadershipUpdate_Struct));
|
||||||
|
structs::RaidLeadershipUpdate_Struct* eq = (structs::RaidLeadershipUpdate_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(action);
|
||||||
|
OUT_str(player_name);
|
||||||
|
OUT_str(leader_name);
|
||||||
|
memcpy(&eq->raid, &emu->raid, sizeof(RaidLeadershipAA_Struct));
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case raidSetNote:
|
||||||
|
{
|
||||||
|
auto emu = (RaidNote_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidNote_Struct));
|
||||||
|
auto eq = (structs::RaidNote_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(general.action);
|
||||||
|
OUT_str(general.leader_name);
|
||||||
|
OUT_str(general.player_name);
|
||||||
|
OUT_str(note);
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case raidNoRaid:
|
||||||
|
{
|
||||||
|
dest->QueuePacket(inapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
RaidGeneral_Struct* emu = (RaidGeneral_Struct*)__emu_buffer;
|
||||||
|
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
||||||
structs::RaidGeneral_Struct *raid_general = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
structs::RaidGeneral_Struct* eq = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
||||||
strn0cpy(raid_general->leader_name, in_raid_general->leader_name, 64);
|
|
||||||
strn0cpy(raid_general->player_name, in_raid_general->player_name, 64);
|
|
||||||
raid_general->action = in_raid_general->action;
|
|
||||||
raid_general->parameter = in_raid_general->parameter;
|
|
||||||
dest->FastQueuePacket(&outapp);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
OUT(action);
|
||||||
|
OUT(parameter);
|
||||||
|
OUT_str(leader_name);
|
||||||
|
OUT_str(player_name);
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
safe_delete(inapp);
|
safe_delete(inapp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3831,8 +3868,8 @@ namespace RoF
|
|||||||
}
|
}
|
||||||
|
|
||||||
float SpawnSize = emu->size;
|
float SpawnSize = emu->size;
|
||||||
if (!((emu->NPC == 0) || (emu->race <= RACE_GNOME_12) || (emu->race == RACE_IKSAR_128) ||
|
if (!((emu->NPC == 0) || (emu->race <= Race::Gnome) || (emu->race == Race::Iksar) ||
|
||||||
(emu->race == RACE_VAH_SHIR_130) || (emu->race == RACE_FROGLOK_330) || (emu->race == RACE_DRAKKIN_522))
|
(emu->race == Race::VahShir) || (emu->race == Race::Froglok2) || (emu->race == Race::Drakkin))
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
PacketSize += 60;
|
PacketSize += 60;
|
||||||
@@ -3965,8 +4002,8 @@ namespace RoF
|
|||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0xffffffff); // unknown18
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0xffffffff); // unknown18
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0xffffffff); // unknown19
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0xffffffff); // unknown19
|
||||||
|
|
||||||
if ((emu->NPC == 0) || (emu->race <= RACE_GNOME_12) || (emu->race == RACE_IKSAR_128) ||
|
if ((emu->NPC == 0) || (emu->race <= Race::Gnome) || (emu->race == Race::Iksar) ||
|
||||||
(emu->race == RACE_VAH_SHIR_130) || (emu->race == RACE_FROGLOK_330) || (emu->race == RACE_DRAKKIN_522)
|
(emu->race == Race::VahShir) || (emu->race == Race::Froglok2) || (emu->race == Race::Drakkin)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; ++k)
|
for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; ++k)
|
||||||
@@ -4861,37 +4898,47 @@ namespace RoF
|
|||||||
{
|
{
|
||||||
DECODE_LENGTH_ATLEAST(structs::RaidGeneral_Struct);
|
DECODE_LENGTH_ATLEAST(structs::RaidGeneral_Struct);
|
||||||
|
|
||||||
// This is a switch on the RaidGeneral action
|
RaidGeneral_Struct* rgs = (RaidGeneral_Struct*)__packet->pBuffer;
|
||||||
switch (*(uint32 *)__packet->pBuffer) {
|
|
||||||
case 35: { // raidMOTD
|
switch (rgs->action)
|
||||||
// we don't have a nice macro for this
|
{
|
||||||
structs::RaidMOTD_Struct *__eq_buffer = (structs::RaidMOTD_Struct *)__packet->pBuffer;
|
case raidSetMotd:
|
||||||
__eq_buffer->motd[1023] = '\0';
|
{
|
||||||
size_t motd_size = strlen(__eq_buffer->motd) + 1;
|
SETUP_VAR_DECODE(RaidMOTD_Struct, structs::RaidMOTD_Struct, motd);
|
||||||
__packet->size = sizeof(RaidMOTD_Struct) + motd_size;
|
|
||||||
__packet->pBuffer = new unsigned char[__packet->size];
|
IN(general.action);
|
||||||
RaidMOTD_Struct *emu = (RaidMOTD_Struct *)__packet->pBuffer;
|
IN(general.parameter);
|
||||||
structs::RaidMOTD_Struct *eq = (structs::RaidMOTD_Struct *)__eq_buffer;
|
IN_str(general.leader_name);
|
||||||
strn0cpy(emu->general.player_name, eq->general.player_name, 64);
|
IN_str(general.player_name);
|
||||||
strn0cpy(emu->motd, eq->motd, motd_size);
|
IN_str(motd);
|
||||||
IN(general.action);
|
|
||||||
IN(general.parameter);
|
FINISH_VAR_DECODE();
|
||||||
FINISH_DIRECT_DECODE();
|
break;
|
||||||
break;
|
}
|
||||||
}
|
case raidSetNote:
|
||||||
case 36: { // raidPlayerNote unhandled
|
{
|
||||||
break;
|
SETUP_VAR_DECODE(RaidNote_Struct, structs::RaidNote_Struct, note);
|
||||||
}
|
|
||||||
default: {
|
IN(general.action);
|
||||||
DECODE_LENGTH_EXACT(structs::RaidGeneral_Struct);
|
IN(general.parameter);
|
||||||
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
IN_str(general.leader_name);
|
||||||
strn0cpy(emu->leader_name, eq->leader_name, 64);
|
IN_str(general.player_name);
|
||||||
strn0cpy(emu->player_name, eq->player_name, 64);
|
IN_str(note);
|
||||||
IN(action);
|
|
||||||
IN(parameter);
|
FINISH_VAR_DECODE();
|
||||||
FINISH_DIRECT_DECODE();
|
break;
|
||||||
break;
|
}
|
||||||
}
|
default:
|
||||||
|
{
|
||||||
|
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
||||||
|
IN(action);
|
||||||
|
IN(parameter);
|
||||||
|
IN_str(leader_name);
|
||||||
|
IN_str(player_name);
|
||||||
|
|
||||||
|
FINISH_DIRECT_DECODE();
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+159
-98
@@ -35,6 +35,7 @@
|
|||||||
#include "../path_manager.h"
|
#include "../path_manager.h"
|
||||||
#include "../classes.h"
|
#include "../classes.h"
|
||||||
#include "../races.h"
|
#include "../races.h"
|
||||||
|
#include "../raid.h"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
@@ -2677,88 +2678,124 @@ namespace RoF2
|
|||||||
|
|
||||||
ENCODE(OP_RaidJoin)
|
ENCODE(OP_RaidJoin)
|
||||||
{
|
{
|
||||||
EQApplicationPacket *inapp = *p;
|
EQApplicationPacket* inapp = *p;
|
||||||
unsigned char * __emu_buffer = inapp->pBuffer;
|
*p = nullptr;
|
||||||
RaidCreate_Struct *raid_create = (RaidCreate_Struct*)__emu_buffer;
|
unsigned char* __emu_buffer = inapp->pBuffer;
|
||||||
|
RaidCreate_Struct* emu = (RaidCreate_Struct*)__emu_buffer;
|
||||||
|
|
||||||
auto outapp_create = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
||||||
structs::RaidGeneral_Struct *general = (structs::RaidGeneral_Struct*)outapp_create->pBuffer;
|
structs::RaidGeneral_Struct* general = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
general->action = 8;
|
general->action = raidCreate;
|
||||||
general->parameter = 1;
|
general->parameter = RaidCommandAcceptInvite;
|
||||||
strn0cpy(general->leader_name, raid_create->leader_name, 64);
|
strn0cpy(general->leader_name, emu->leader_name, sizeof(emu->leader_name));
|
||||||
strn0cpy(general->player_name, raid_create->leader_name, 64);
|
strn0cpy(general->player_name, emu->leader_name, sizeof(emu->leader_name));
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
|
||||||
dest->FastQueuePacket(&outapp_create);
|
|
||||||
safe_delete(inapp);
|
safe_delete(inapp);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ENCODE(OP_RaidUpdate)
|
ENCODE(OP_RaidUpdate)
|
||||||
{
|
{
|
||||||
EQApplicationPacket *inapp = *p;
|
EQApplicationPacket* inapp = *p;
|
||||||
*p = nullptr;
|
*p = nullptr;
|
||||||
unsigned char * __emu_buffer = inapp->pBuffer;
|
unsigned char* __emu_buffer = inapp->pBuffer;
|
||||||
RaidGeneral_Struct *raid_gen = (RaidGeneral_Struct*)__emu_buffer;
|
RaidGeneral_Struct* raid_gen = (RaidGeneral_Struct*)__emu_buffer;
|
||||||
|
|
||||||
if (raid_gen->action == 0) // raid add has longer length than other raid updates
|
switch (raid_gen->action)
|
||||||
{
|
{
|
||||||
RaidAddMember_Struct* in_add_member = (RaidAddMember_Struct*)__emu_buffer;
|
case raidAdd:
|
||||||
|
{
|
||||||
|
RaidAddMember_Struct* emu = (RaidAddMember_Struct*)__emu_buffer;
|
||||||
|
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidAddMember_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidAddMember_Struct));
|
||||||
structs::RaidAddMember_Struct *add_member = (structs::RaidAddMember_Struct*)outapp->pBuffer;
|
structs::RaidAddMember_Struct* eq = (structs::RaidAddMember_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
add_member->raidGen.action = in_add_member->raidGen.action;
|
OUT(raidGen.action);
|
||||||
add_member->raidGen.parameter = in_add_member->raidGen.parameter;
|
OUT(raidGen.parameter);
|
||||||
strn0cpy(add_member->raidGen.leader_name, in_add_member->raidGen.leader_name, 64);
|
OUT_str(raidGen.leader_name);
|
||||||
strn0cpy(add_member->raidGen.player_name, in_add_member->raidGen.player_name, 64);
|
OUT_str(raidGen.player_name);
|
||||||
add_member->_class = in_add_member->_class;
|
OUT(_class);
|
||||||
add_member->level = in_add_member->level;
|
OUT(level);
|
||||||
add_member->isGroupLeader = in_add_member->isGroupLeader;
|
OUT(isGroupLeader);
|
||||||
add_member->flags[0] = in_add_member->flags[0];
|
OUT(flags[0]);
|
||||||
add_member->flags[1] = in_add_member->flags[1];
|
OUT(flags[1]);
|
||||||
add_member->flags[2] = in_add_member->flags[2];
|
OUT(flags[2]);
|
||||||
add_member->flags[3] = in_add_member->flags[3];
|
OUT(flags[3]);
|
||||||
add_member->flags[4] = in_add_member->flags[4];
|
OUT(flags[4]);
|
||||||
dest->FastQueuePacket(&outapp);
|
|
||||||
}
|
|
||||||
else if (raid_gen->action == 35)
|
|
||||||
{
|
|
||||||
RaidMOTD_Struct *inmotd = (RaidMOTD_Struct *)__emu_buffer;
|
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidMOTD_Struct) +
|
|
||||||
strlen(inmotd->motd) + 1);
|
|
||||||
structs::RaidMOTD_Struct *outmotd = (structs::RaidMOTD_Struct *)outapp->pBuffer;
|
|
||||||
|
|
||||||
outmotd->general.action = inmotd->general.action;
|
|
||||||
strn0cpy(outmotd->general.player_name, inmotd->general.player_name, 64);
|
|
||||||
strn0cpy(outmotd->motd, inmotd->motd, strlen(inmotd->motd) + 1);
|
|
||||||
dest->FastQueuePacket(&outapp);
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if (raid_gen->action == 14 || raid_gen->action == 30)
|
case raidSetMotd:
|
||||||
{
|
{
|
||||||
RaidLeadershipUpdate_Struct *inlaa = (RaidLeadershipUpdate_Struct *)__emu_buffer;
|
RaidMOTD_Struct* emu = (RaidMOTD_Struct*)__emu_buffer;
|
||||||
auto outapp =
|
|
||||||
new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidLeadershipUpdate_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidMOTD_Struct));
|
||||||
structs::RaidLeadershipUpdate_Struct *outlaa = (structs::RaidLeadershipUpdate_Struct *)outapp->pBuffer;
|
structs::RaidMOTD_Struct* eq = (structs::RaidMOTD_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(general.action);
|
||||||
|
OUT_str(general.player_name);
|
||||||
|
OUT_str(general.leader_name);
|
||||||
|
OUT_str(motd);
|
||||||
|
|
||||||
outlaa->action = inlaa->action;
|
|
||||||
strn0cpy(outlaa->player_name, inlaa->player_name, 64);
|
|
||||||
strn0cpy(outlaa->leader_name, inlaa->leader_name, 64);
|
|
||||||
memcpy(&outlaa->raid, &inlaa->raid, sizeof(RaidLeadershipAA_Struct));
|
|
||||||
dest->FastQueuePacket(&outapp);
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else
|
case raidSetLeaderAbilities:
|
||||||
|
case raidMakeLeader:
|
||||||
{
|
{
|
||||||
RaidGeneral_Struct* in_raid_general = (RaidGeneral_Struct*)__emu_buffer;
|
RaidLeadershipUpdate_Struct* emu = (RaidLeadershipUpdate_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidLeadershipUpdate_Struct));
|
||||||
|
structs::RaidLeadershipUpdate_Struct* eq = (structs::RaidLeadershipUpdate_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(action);
|
||||||
|
OUT_str(player_name);
|
||||||
|
OUT_str(leader_name);
|
||||||
|
memcpy(&eq->raid, &emu->raid, sizeof(RaidLeadershipAA_Struct));
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case raidSetNote:
|
||||||
|
{
|
||||||
|
auto emu = (RaidNote_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidNote_Struct));
|
||||||
|
auto eq = (structs::RaidNote_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(general.action);
|
||||||
|
OUT_str(general.leader_name);
|
||||||
|
OUT_str(general.player_name);
|
||||||
|
OUT_str(note);
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case raidNoRaid:
|
||||||
|
{
|
||||||
|
dest->QueuePacket(inapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
RaidGeneral_Struct* emu = (RaidGeneral_Struct*)__emu_buffer;
|
||||||
|
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
||||||
structs::RaidGeneral_Struct *raid_general = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
structs::RaidGeneral_Struct* eq = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
||||||
strn0cpy(raid_general->leader_name, in_raid_general->leader_name, 64);
|
|
||||||
strn0cpy(raid_general->player_name, in_raid_general->player_name, 64);
|
|
||||||
raid_general->action = in_raid_general->action;
|
|
||||||
raid_general->parameter = in_raid_general->parameter;
|
|
||||||
dest->FastQueuePacket(&outapp);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
OUT(action);
|
||||||
|
OUT(parameter);
|
||||||
|
OUT_str(leader_name);
|
||||||
|
OUT_str(player_name);
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
safe_delete(inapp);
|
safe_delete(inapp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2772,7 +2809,10 @@ namespace RoF2
|
|||||||
else
|
else
|
||||||
eq->window = emu->window;
|
eq->window = emu->window;
|
||||||
OUT(type);
|
OUT(type);
|
||||||
OUT(invslot);
|
eq->invslot = ServerToRoF2TypelessSlot(emu->invslot, invtype::typePossessions);
|
||||||
|
OUT(target_id);
|
||||||
|
OUT(can_cast);
|
||||||
|
OUT(can_scribe);
|
||||||
strn0cpy(eq->txtfile, emu->booktext, sizeof(eq->txtfile));
|
strn0cpy(eq->txtfile, emu->booktext, sizeof(eq->txtfile));
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
@@ -3946,7 +3986,7 @@ namespace RoF2
|
|||||||
if (strlen(emu->suffix))
|
if (strlen(emu->suffix))
|
||||||
PacketSize += strlen(emu->suffix) + 1;
|
PacketSize += strlen(emu->suffix) + 1;
|
||||||
|
|
||||||
if (emu->DestructibleObject || emu->class_ == LDON_TREASURE)
|
if (emu->DestructibleObject || emu->class_ == Class::LDoNTreasure)
|
||||||
{
|
{
|
||||||
if (emu->DestructibleObject)
|
if (emu->DestructibleObject)
|
||||||
PacketSize = PacketSize - 4; // No bodytype
|
PacketSize = PacketSize - 4; // No bodytype
|
||||||
@@ -3967,8 +4007,8 @@ namespace RoF2
|
|||||||
}
|
}
|
||||||
|
|
||||||
float SpawnSize = emu->size;
|
float SpawnSize = emu->size;
|
||||||
if (!((emu->NPC == 0) || (emu->race <= RACE_GNOME_12) || (emu->race == RACE_IKSAR_128) ||
|
if (!((emu->NPC == 0) || (emu->race <= Race::Gnome) || (emu->race == Race::Iksar) ||
|
||||||
(emu->race == RACE_VAH_SHIR_130) || (emu->race == RACE_FROGLOK_330) || (emu->race == RACE_DRAKKIN_522))
|
(emu->race == Race::VahShir) || (emu->race == Race::Froglok2) || (emu->race == Race::Drakkin))
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
PacketSize += 60;
|
PacketSize += 60;
|
||||||
@@ -4036,7 +4076,7 @@ namespace RoF2
|
|||||||
// actually part of bitfields
|
// actually part of bitfields
|
||||||
uint8 OtherData = 0;
|
uint8 OtherData = 0;
|
||||||
|
|
||||||
if (emu->class_ == LDON_TREASURE) //LDoN Chest
|
if (emu->class_ == Class::LDoNTreasure) //LDoN Chest
|
||||||
{
|
{
|
||||||
OtherData = OtherData | 0x04;
|
OtherData = OtherData | 0x04;
|
||||||
}
|
}
|
||||||
@@ -4064,7 +4104,7 @@ namespace RoF2
|
|||||||
// int DefaultEmitterID
|
// int DefaultEmitterID
|
||||||
VARSTRUCT_ENCODE_TYPE(float, Buffer, 0); // unknown4
|
VARSTRUCT_ENCODE_TYPE(float, Buffer, 0); // unknown4
|
||||||
|
|
||||||
if (emu->DestructibleObject || emu->class_ == LDON_TREASURE)
|
if (emu->DestructibleObject || emu->class_ == Class::LDoNTreasure)
|
||||||
{
|
{
|
||||||
VARSTRUCT_ENCODE_STRING(Buffer, emu->DestructibleModel);
|
VARSTRUCT_ENCODE_STRING(Buffer, emu->DestructibleModel);
|
||||||
VARSTRUCT_ENCODE_STRING(Buffer, emu->DestructibleName2);
|
VARSTRUCT_ENCODE_STRING(Buffer, emu->DestructibleName2);
|
||||||
@@ -4172,8 +4212,8 @@ namespace RoF2
|
|||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0xffffffff); // These do something with OP_WeaponEquip1
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0xffffffff); // These do something with OP_WeaponEquip1
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0xffffffff); // ^
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0xffffffff); // ^
|
||||||
|
|
||||||
if ((emu->NPC == 0) || (emu->race <= RACE_GNOME_12) || (emu->race == RACE_IKSAR_128) ||
|
if ((emu->NPC == 0) || (emu->race <= Race::Gnome) || (emu->race == Race::Iksar) ||
|
||||||
(emu->race == RACE_VAH_SHIR_130) || (emu->race == RACE_FROGLOK_330) || (emu->race == RACE_DRAKKIN_522)
|
(emu->race == Race::VahShir) || (emu->race == Race::Froglok2) || (emu->race == Race::Drakkin)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; ++k)
|
for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; ++k)
|
||||||
@@ -4398,6 +4438,17 @@ namespace RoF2
|
|||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DECODE(OP_BookButton)
|
||||||
|
{
|
||||||
|
DECODE_LENGTH_EXACT(structs::BookButton_Struct);
|
||||||
|
SETUP_DIRECT_DECODE(BookButton_Struct, structs::BookButton_Struct);
|
||||||
|
|
||||||
|
emu->invslot = static_cast<int16_t>(RoF2ToServerTypelessSlot(eq->slot, invtype::typePossessions));
|
||||||
|
IN(target_id);
|
||||||
|
|
||||||
|
FINISH_DIRECT_DECODE();
|
||||||
|
}
|
||||||
|
|
||||||
DECODE(OP_Buff)
|
DECODE(OP_Buff)
|
||||||
{
|
{
|
||||||
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
|
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
|
||||||
@@ -5064,37 +5115,47 @@ namespace RoF2
|
|||||||
{
|
{
|
||||||
DECODE_LENGTH_ATLEAST(structs::RaidGeneral_Struct);
|
DECODE_LENGTH_ATLEAST(structs::RaidGeneral_Struct);
|
||||||
|
|
||||||
// This is a switch on the RaidGeneral action
|
RaidGeneral_Struct* rgs = (RaidGeneral_Struct*)__packet->pBuffer;
|
||||||
switch (*(uint32 *)__packet->pBuffer) {
|
|
||||||
case 35: { // raidMOTD
|
switch (rgs->action)
|
||||||
// we don't have a nice macro for this
|
{
|
||||||
structs::RaidMOTD_Struct *__eq_buffer = (structs::RaidMOTD_Struct *)__packet->pBuffer;
|
case raidSetMotd:
|
||||||
__eq_buffer->motd[1023] = '\0';
|
{
|
||||||
size_t motd_size = strlen(__eq_buffer->motd) + 1;
|
SETUP_VAR_DECODE(RaidMOTD_Struct, structs::RaidMOTD_Struct, motd);
|
||||||
__packet->size = sizeof(RaidMOTD_Struct) + motd_size;
|
|
||||||
__packet->pBuffer = new unsigned char[__packet->size];
|
IN(general.action);
|
||||||
RaidMOTD_Struct *emu = (RaidMOTD_Struct *)__packet->pBuffer;
|
IN(general.parameter);
|
||||||
structs::RaidMOTD_Struct *eq = (structs::RaidMOTD_Struct *)__eq_buffer;
|
IN_str(general.leader_name);
|
||||||
strn0cpy(emu->general.player_name, eq->general.player_name, 64);
|
IN_str(general.player_name);
|
||||||
strn0cpy(emu->motd, eq->motd, motd_size);
|
IN_str(motd);
|
||||||
IN(general.action);
|
|
||||||
IN(general.parameter);
|
FINISH_VAR_DECODE();
|
||||||
FINISH_DIRECT_DECODE();
|
break;
|
||||||
break;
|
}
|
||||||
}
|
case raidSetNote:
|
||||||
case 36: { // raidPlayerNote unhandled
|
{
|
||||||
break;
|
SETUP_VAR_DECODE(RaidNote_Struct, structs::RaidNote_Struct, note);
|
||||||
}
|
|
||||||
default: {
|
IN(general.action);
|
||||||
DECODE_LENGTH_EXACT(structs::RaidGeneral_Struct);
|
IN(general.parameter);
|
||||||
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
IN_str(general.leader_name);
|
||||||
strn0cpy(emu->leader_name, eq->leader_name, 64);
|
IN_str(general.player_name);
|
||||||
strn0cpy(emu->player_name, eq->player_name, 64);
|
IN_str(note);
|
||||||
IN(action);
|
|
||||||
IN(parameter);
|
FINISH_VAR_DECODE();
|
||||||
FINISH_DIRECT_DECODE();
|
break;
|
||||||
break;
|
}
|
||||||
}
|
default:
|
||||||
|
{
|
||||||
|
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
||||||
|
IN(action);
|
||||||
|
IN(parameter);
|
||||||
|
IN_str(leader_name);
|
||||||
|
IN_str(player_name);
|
||||||
|
|
||||||
|
FINISH_DIRECT_DECODE();
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5104,8 +5165,8 @@ namespace RoF2
|
|||||||
SETUP_DIRECT_DECODE(BookRequest_Struct, structs::BookRequest_Struct);
|
SETUP_DIRECT_DECODE(BookRequest_Struct, structs::BookRequest_Struct);
|
||||||
|
|
||||||
IN(type);
|
IN(type);
|
||||||
IN(invslot);
|
emu->invslot = static_cast<int16_t>(RoF2ToServerTypelessSlot(eq->invslot, invtype::typePossessions));
|
||||||
IN(subslot);
|
IN(target_id);
|
||||||
emu->window = (uint8)eq->window;
|
emu->window = (uint8)eq->window;
|
||||||
strn0cpy(emu->txtfile, eq->txtfile, sizeof(emu->txtfile));
|
strn0cpy(emu->txtfile, eq->txtfile, sizeof(emu->txtfile));
|
||||||
|
|
||||||
|
|||||||
@@ -150,6 +150,7 @@ D(OP_AugmentInfo)
|
|||||||
D(OP_AugmentItem)
|
D(OP_AugmentItem)
|
||||||
D(OP_BazaarSearch)
|
D(OP_BazaarSearch)
|
||||||
D(OP_BlockedBuffs)
|
D(OP_BlockedBuffs)
|
||||||
|
D(OP_BookButton)
|
||||||
D(OP_Buff)
|
D(OP_Buff)
|
||||||
D(OP_BuffRemoveRequest)
|
D(OP_BuffRemoveRequest)
|
||||||
D(OP_CastSpell)
|
D(OP_CastSpell)
|
||||||
|
|||||||
@@ -2868,15 +2868,23 @@ struct BookText_Struct {
|
|||||||
// This is just a "text file" on the server
|
// This is just a "text file" on the server
|
||||||
// or in our case, the 'name' column in our books table.
|
// or in our case, the 'name' column in our books table.
|
||||||
struct BookRequest_Struct {
|
struct BookRequest_Struct {
|
||||||
/*0000*/ uint32 window; // where to display the text (0xFFFFFFFF means new window).
|
/*0000*/ uint32 window; // where to display the text (0xFFFFFFFF means new window).
|
||||||
/*0004*/ uint16 invslot; // Is the slot, but the RoF2 conversion causes it to fail. Turned to 0 since it isnt required anyway.
|
/*0004*/ TypelessInventorySlot_Struct invslot; // book ItemIndex (with int16_t alignment padding)
|
||||||
/*0006*/ int16 subslot; // Inventory sub-slot (0-x)
|
/*0012*/ uint32 type; // 0 = Scroll, 1 = Book, 2 = Item Info. Possibly others
|
||||||
/*0008*/ uint16 unknown006; // Seen FFFF
|
/*0016*/ uint32 target_id; // client's target when using the book
|
||||||
/*0010*/ uint16 unknown008; // seen 0000
|
/*0020*/ uint8 can_cast; // show Cast Spell button in book window
|
||||||
/*0012*/ uint32 type; // 0 = Scroll, 1 = Book, 2 = Item Info. Possibly others
|
/*0021*/ uint8 can_scribe; // show Scribe button in book window
|
||||||
/*0016*/ uint32 unknown0012;
|
/*0022*/ char txtfile[8194];
|
||||||
/*0020*/ uint16 unknown0016;
|
/*8216*/
|
||||||
/*0022*/ char txtfile[8194];
|
};
|
||||||
|
|
||||||
|
// used by Scribe and CastSpell book buttons
|
||||||
|
struct BookButton_Struct
|
||||||
|
{
|
||||||
|
/*0000*/ TypelessInventorySlot_Struct slot; // book ItemIndex (with int16_t alignment padding)
|
||||||
|
/*0008*/ int32 target_id; // client's target when using the book button
|
||||||
|
/*0012*/ int32 unused; // always 0 from button packets
|
||||||
|
/*0016*/
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -4190,9 +4198,14 @@ struct RaidAddMember_Struct {
|
|||||||
/*139*/ uint8 flags[5]; //no idea if these are needed...
|
/*139*/ uint8 flags[5]; //no idea if these are needed...
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct RaidNote_Struct {
|
||||||
|
/*000*/ RaidGeneral_Struct general;
|
||||||
|
/*140*/ char note[64];
|
||||||
|
};
|
||||||
|
|
||||||
struct RaidMOTD_Struct {
|
struct RaidMOTD_Struct {
|
||||||
/*000*/ RaidGeneral_Struct general; // leader_name and action only used
|
/*000*/ RaidGeneral_Struct general;
|
||||||
/*140*/ char motd[0]; // max size 1024, but reply is variable
|
/*140*/ char motd[1024];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RaidLeadershipUpdate_Struct {
|
struct RaidLeadershipUpdate_Struct {
|
||||||
|
|||||||
@@ -4136,9 +4136,14 @@ struct RaidAddMember_Struct {
|
|||||||
/*139*/ uint8 flags[5]; //no idea if these are needed...
|
/*139*/ uint8 flags[5]; //no idea if these are needed...
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct RaidNote_Struct {
|
||||||
|
/*000*/ RaidGeneral_Struct general;
|
||||||
|
/*140*/ char note[64];
|
||||||
|
};
|
||||||
|
|
||||||
struct RaidMOTD_Struct {
|
struct RaidMOTD_Struct {
|
||||||
/*000*/ RaidGeneral_Struct general; // leader_name and action only used
|
/*000*/ RaidGeneral_Struct general; // leader_name and action only used
|
||||||
/*140*/ char motd[0]; // max size 1024, but reply is variable
|
/*140*/ char motd[1024]; // max size is 1024, but reply is variable
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RaidLeadershipUpdate_Struct {
|
struct RaidLeadershipUpdate_Struct {
|
||||||
|
|||||||
+157
-95
@@ -34,6 +34,7 @@
|
|||||||
#include "../rulesys.h"
|
#include "../rulesys.h"
|
||||||
#include "../path_manager.h"
|
#include "../path_manager.h"
|
||||||
#include "../races.h"
|
#include "../races.h"
|
||||||
|
#include "../raid.h"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
@@ -1686,88 +1687,124 @@ namespace SoD
|
|||||||
|
|
||||||
ENCODE(OP_RaidJoin)
|
ENCODE(OP_RaidJoin)
|
||||||
{
|
{
|
||||||
EQApplicationPacket *inapp = *p;
|
EQApplicationPacket* inapp = *p;
|
||||||
unsigned char * __emu_buffer = inapp->pBuffer;
|
*p = nullptr;
|
||||||
RaidCreate_Struct *raid_create = (RaidCreate_Struct*)__emu_buffer;
|
unsigned char* __emu_buffer = inapp->pBuffer;
|
||||||
|
RaidCreate_Struct* emu = (RaidCreate_Struct*)__emu_buffer;
|
||||||
|
|
||||||
auto outapp_create = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
||||||
structs::RaidGeneral_Struct *general = (structs::RaidGeneral_Struct*)outapp_create->pBuffer;
|
structs::RaidGeneral_Struct* general = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
general->action = 8;
|
general->action = raidCreate;
|
||||||
general->parameter = 1;
|
general->parameter = RaidCommandAcceptInvite;
|
||||||
strn0cpy(general->leader_name, raid_create->leader_name, 64);
|
strn0cpy(general->leader_name, emu->leader_name, sizeof(emu->leader_name));
|
||||||
strn0cpy(general->player_name, raid_create->leader_name, 64);
|
strn0cpy(general->player_name, emu->leader_name, sizeof(emu->leader_name));
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
|
||||||
dest->FastQueuePacket(&outapp_create);
|
|
||||||
safe_delete(inapp);
|
safe_delete(inapp);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ENCODE(OP_RaidUpdate)
|
ENCODE(OP_RaidUpdate)
|
||||||
{
|
{
|
||||||
EQApplicationPacket *inapp = *p;
|
EQApplicationPacket* inapp = *p;
|
||||||
*p = nullptr;
|
*p = nullptr;
|
||||||
unsigned char * __emu_buffer = inapp->pBuffer;
|
unsigned char* __emu_buffer = inapp->pBuffer;
|
||||||
RaidGeneral_Struct *raid_gen = (RaidGeneral_Struct*)__emu_buffer;
|
RaidGeneral_Struct* raid_gen = (RaidGeneral_Struct*)__emu_buffer;
|
||||||
|
|
||||||
if (raid_gen->action == 0) // raid add has longer length than other raid updates
|
switch (raid_gen->action)
|
||||||
{
|
{
|
||||||
RaidAddMember_Struct* in_add_member = (RaidAddMember_Struct*)__emu_buffer;
|
case raidAdd:
|
||||||
|
{
|
||||||
|
RaidAddMember_Struct* emu = (RaidAddMember_Struct*)__emu_buffer;
|
||||||
|
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidAddMember_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidAddMember_Struct));
|
||||||
structs::RaidAddMember_Struct *add_member = (structs::RaidAddMember_Struct*)outapp->pBuffer;
|
structs::RaidAddMember_Struct* eq = (structs::RaidAddMember_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
add_member->raidGen.action = in_add_member->raidGen.action;
|
OUT(raidGen.action);
|
||||||
add_member->raidGen.parameter = in_add_member->raidGen.parameter;
|
OUT(raidGen.parameter);
|
||||||
strn0cpy(add_member->raidGen.leader_name, in_add_member->raidGen.leader_name, 64);
|
OUT_str(raidGen.leader_name);
|
||||||
strn0cpy(add_member->raidGen.player_name, in_add_member->raidGen.player_name, 64);
|
OUT_str(raidGen.player_name);
|
||||||
add_member->_class = in_add_member->_class;
|
OUT(_class);
|
||||||
add_member->level = in_add_member->level;
|
OUT(level);
|
||||||
add_member->isGroupLeader = in_add_member->isGroupLeader;
|
OUT(isGroupLeader);
|
||||||
add_member->flags[0] = in_add_member->flags[0];
|
OUT(flags[0]);
|
||||||
add_member->flags[1] = in_add_member->flags[1];
|
OUT(flags[1]);
|
||||||
add_member->flags[2] = in_add_member->flags[2];
|
OUT(flags[2]);
|
||||||
add_member->flags[3] = in_add_member->flags[3];
|
OUT(flags[3]);
|
||||||
add_member->flags[4] = in_add_member->flags[4];
|
OUT(flags[4]);
|
||||||
dest->FastQueuePacket(&outapp);
|
|
||||||
}
|
|
||||||
else if (raid_gen->action == 35)
|
|
||||||
{
|
|
||||||
RaidMOTD_Struct *inmotd = (RaidMOTD_Struct *)__emu_buffer;
|
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidMOTD_Struct) +
|
|
||||||
strlen(inmotd->motd) + 1);
|
|
||||||
structs::RaidMOTD_Struct *outmotd = (structs::RaidMOTD_Struct *)outapp->pBuffer;
|
|
||||||
|
|
||||||
outmotd->general.action = inmotd->general.action;
|
|
||||||
strn0cpy(outmotd->general.player_name, inmotd->general.player_name, 64);
|
|
||||||
strn0cpy(outmotd->motd, inmotd->motd, strlen(inmotd->motd) + 1);
|
|
||||||
dest->FastQueuePacket(&outapp);
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if (raid_gen->action == 14 || raid_gen->action == 30)
|
case raidSetMotd:
|
||||||
{
|
{
|
||||||
RaidLeadershipUpdate_Struct *inlaa = (RaidLeadershipUpdate_Struct *)__emu_buffer;
|
RaidMOTD_Struct* emu = (RaidMOTD_Struct*)__emu_buffer;
|
||||||
auto outapp =
|
|
||||||
new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidLeadershipUpdate_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidMOTD_Struct));
|
||||||
structs::RaidLeadershipUpdate_Struct *outlaa = (structs::RaidLeadershipUpdate_Struct *)outapp->pBuffer;
|
structs::RaidMOTD_Struct* eq = (structs::RaidMOTD_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(general.action);
|
||||||
|
OUT_str(general.player_name);
|
||||||
|
OUT_str(general.leader_name);
|
||||||
|
OUT_str(motd);
|
||||||
|
|
||||||
outlaa->action = inlaa->action;
|
|
||||||
strn0cpy(outlaa->player_name, inlaa->player_name, 64);
|
|
||||||
strn0cpy(outlaa->leader_name, inlaa->leader_name, 64);
|
|
||||||
memcpy(&outlaa->raid, &inlaa->raid, sizeof(RaidLeadershipAA_Struct));
|
|
||||||
dest->FastQueuePacket(&outapp);
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else
|
case raidSetLeaderAbilities:
|
||||||
|
case raidMakeLeader:
|
||||||
{
|
{
|
||||||
RaidGeneral_Struct* in_raid_general = (RaidGeneral_Struct*)__emu_buffer;
|
RaidLeadershipUpdate_Struct* emu = (RaidLeadershipUpdate_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidLeadershipUpdate_Struct));
|
||||||
|
structs::RaidLeadershipUpdate_Struct* eq = (structs::RaidLeadershipUpdate_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(action);
|
||||||
|
OUT_str(player_name);
|
||||||
|
OUT_str(leader_name);
|
||||||
|
memcpy(&eq->raid, &emu->raid, sizeof(RaidLeadershipAA_Struct));
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case raidSetNote:
|
||||||
|
{
|
||||||
|
auto emu = (RaidNote_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidNote_Struct));
|
||||||
|
auto eq = (structs::RaidNote_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(general.action);
|
||||||
|
OUT_str(general.leader_name);
|
||||||
|
OUT_str(general.player_name);
|
||||||
|
OUT_str(note);
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case raidNoRaid:
|
||||||
|
{
|
||||||
|
dest->QueuePacket(inapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
RaidGeneral_Struct* emu = (RaidGeneral_Struct*)__emu_buffer;
|
||||||
|
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
||||||
structs::RaidGeneral_Struct *raid_general = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
structs::RaidGeneral_Struct* eq = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
||||||
strn0cpy(raid_general->leader_name, in_raid_general->leader_name, 64);
|
|
||||||
strn0cpy(raid_general->player_name, in_raid_general->player_name, 64);
|
|
||||||
raid_general->action = in_raid_general->action;
|
|
||||||
raid_general->parameter = in_raid_general->parameter;
|
|
||||||
dest->FastQueuePacket(&outapp);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
OUT(action);
|
||||||
|
OUT(parameter);
|
||||||
|
OUT_str(leader_name);
|
||||||
|
OUT_str(player_name);
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
safe_delete(inapp);
|
safe_delete(inapp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1782,6 +1819,9 @@ namespace SoD
|
|||||||
eq->window = emu->window;
|
eq->window = emu->window;
|
||||||
OUT(type);
|
OUT(type);
|
||||||
eq->invslot = ServerToSoDSlot(emu->invslot);
|
eq->invslot = ServerToSoDSlot(emu->invslot);
|
||||||
|
OUT(target_id);
|
||||||
|
OUT(can_cast);
|
||||||
|
OUT(can_scribe);
|
||||||
strn0cpy(eq->txtfile, emu->booktext, sizeof(eq->txtfile));
|
strn0cpy(eq->txtfile, emu->booktext, sizeof(eq->txtfile));
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
@@ -2467,8 +2507,8 @@ namespace SoD
|
|||||||
}
|
}
|
||||||
|
|
||||||
float SpawnSize = emu->size;
|
float SpawnSize = emu->size;
|
||||||
if (!((emu->NPC == 0) || (emu->race <= RACE_GNOME_12) || (emu->race == RACE_IKSAR_128) ||
|
if (!((emu->NPC == 0) || (emu->race <= Race::Gnome) || (emu->race == Race::Iksar) ||
|
||||||
(emu->race == RACE_VAH_SHIR_130) || (emu->race == RACE_FROGLOK_330) || (emu->race == RACE_DRAKKIN_522))
|
(emu->race == Race::VahShir) || (emu->race == Race::Froglok2) || (emu->race == Race::Drakkin))
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
PacketSize -= (sizeof(structs::Texture_Struct) * EQ::textures::materialCount);
|
PacketSize -= (sizeof(structs::Texture_Struct) * EQ::textures::materialCount);
|
||||||
@@ -2666,8 +2706,8 @@ namespace SoD
|
|||||||
|
|
||||||
Buffer += sizeof(structs::Spawn_Struct_Position);
|
Buffer += sizeof(structs::Spawn_Struct_Position);
|
||||||
|
|
||||||
if ((emu->NPC == 0) || (emu->race <= RACE_GNOME_12) || (emu->race == RACE_IKSAR_128) ||
|
if ((emu->NPC == 0) || (emu->race <= Race::Gnome) || (emu->race == Race::Iksar) ||
|
||||||
(emu->race == RACE_VAH_SHIR_130) || (emu->race == RACE_FROGLOK_330) || (emu->race == RACE_DRAKKIN_522)
|
(emu->race == Race::VahShir) || (emu->race == Race::Froglok2) || (emu->race == Race::Drakkin)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; ++k)
|
for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; ++k)
|
||||||
@@ -2693,8 +2733,8 @@ namespace SoD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if ((emu->NPC == 0) || (emu->race <= RACE_GNOME_12) || (emu->race == RACE_IKSAR_128) ||
|
if ((emu->NPC == 0) || (emu->race <= Race::Gnome) || (emu->race == Race::Iksar) ||
|
||||||
(emu->race == RACE_VAH_SHIR_130) || (emu->race == RACE_FROGLOK_330) || (emu->race == RACE_DRAKKIN_522)
|
(emu->race == Race::VahShir) || (emu->race == Race::Froglok2) || (emu->race == Race::Drakkin)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
structs::Texture_Struct *Equipment = (structs::Texture_Struct *)Buffer;
|
structs::Texture_Struct *Equipment = (structs::Texture_Struct *)Buffer;
|
||||||
@@ -2817,6 +2857,17 @@ namespace SoD
|
|||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DECODE(OP_BookButton)
|
||||||
|
{
|
||||||
|
DECODE_LENGTH_EXACT(structs::BookButton_Struct);
|
||||||
|
SETUP_DIRECT_DECODE(BookButton_Struct, structs::BookButton_Struct);
|
||||||
|
|
||||||
|
emu->invslot = static_cast<int16_t>(SoDToServerSlot(eq->invslot));
|
||||||
|
IN(target_id);
|
||||||
|
|
||||||
|
FINISH_DIRECT_DECODE();
|
||||||
|
}
|
||||||
|
|
||||||
DECODE(OP_Buff)
|
DECODE(OP_Buff)
|
||||||
{
|
{
|
||||||
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
|
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
|
||||||
@@ -3324,37 +3375,47 @@ namespace SoD
|
|||||||
{
|
{
|
||||||
DECODE_LENGTH_ATLEAST(structs::RaidGeneral_Struct);
|
DECODE_LENGTH_ATLEAST(structs::RaidGeneral_Struct);
|
||||||
|
|
||||||
// This is a switch on the RaidGeneral action
|
RaidGeneral_Struct* rgs = (RaidGeneral_Struct*)__packet->pBuffer;
|
||||||
switch (*(uint32 *)__packet->pBuffer) {
|
|
||||||
case 35: { // raidMOTD
|
switch (rgs->action)
|
||||||
// we don't have a nice macro for this
|
{
|
||||||
structs::RaidMOTD_Struct *__eq_buffer = (structs::RaidMOTD_Struct *)__packet->pBuffer;
|
case raidSetMotd:
|
||||||
__eq_buffer->motd[1023] = '\0';
|
{
|
||||||
size_t motd_size = strlen(__eq_buffer->motd) + 1;
|
SETUP_VAR_DECODE(RaidMOTD_Struct, structs::RaidMOTD_Struct, motd);
|
||||||
__packet->size = sizeof(RaidMOTD_Struct) + motd_size;
|
|
||||||
__packet->pBuffer = new unsigned char[__packet->size];
|
IN(general.action);
|
||||||
RaidMOTD_Struct *emu = (RaidMOTD_Struct *)__packet->pBuffer;
|
IN(general.parameter);
|
||||||
structs::RaidMOTD_Struct *eq = (structs::RaidMOTD_Struct *)__eq_buffer;
|
IN_str(general.leader_name);
|
||||||
strn0cpy(emu->general.player_name, eq->general.player_name, 64);
|
IN_str(general.player_name);
|
||||||
strn0cpy(emu->motd, eq->motd, motd_size);
|
IN_str(motd);
|
||||||
IN(general.action);
|
|
||||||
IN(general.parameter);
|
FINISH_VAR_DECODE();
|
||||||
FINISH_DIRECT_DECODE();
|
break;
|
||||||
break;
|
}
|
||||||
}
|
case raidSetNote:
|
||||||
case 36: { // raidPlayerNote unhandled
|
{
|
||||||
break;
|
SETUP_VAR_DECODE(RaidNote_Struct, structs::RaidNote_Struct, note);
|
||||||
}
|
|
||||||
default: {
|
IN(general.action);
|
||||||
DECODE_LENGTH_EXACT(structs::RaidGeneral_Struct);
|
IN(general.parameter);
|
||||||
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
IN_str(general.leader_name);
|
||||||
strn0cpy(emu->leader_name, eq->leader_name, 64);
|
IN_str(general.player_name);
|
||||||
strn0cpy(emu->player_name, eq->player_name, 64);
|
IN_str(note);
|
||||||
IN(action);
|
|
||||||
IN(parameter);
|
FINISH_VAR_DECODE();
|
||||||
FINISH_DIRECT_DECODE();
|
break;
|
||||||
break;
|
}
|
||||||
}
|
default:
|
||||||
|
{
|
||||||
|
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
||||||
|
IN(action);
|
||||||
|
IN(parameter);
|
||||||
|
IN_str(leader_name);
|
||||||
|
IN_str(player_name);
|
||||||
|
|
||||||
|
FINISH_DIRECT_DECODE();
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3364,7 +3425,8 @@ namespace SoD
|
|||||||
SETUP_DIRECT_DECODE(BookRequest_Struct, structs::BookRequest_Struct);
|
SETUP_DIRECT_DECODE(BookRequest_Struct, structs::BookRequest_Struct);
|
||||||
|
|
||||||
IN(type);
|
IN(type);
|
||||||
emu->invslot = SoDToServerSlot(eq->invslot);
|
emu->invslot = static_cast<int16_t>(SoDToServerSlot(eq->invslot));
|
||||||
|
IN(target_id);
|
||||||
emu->window = (uint8)eq->window;
|
emu->window = (uint8)eq->window;
|
||||||
strn0cpy(emu->txtfile, eq->txtfile, sizeof(emu->txtfile));
|
strn0cpy(emu->txtfile, eq->txtfile, sizeof(emu->txtfile));
|
||||||
|
|
||||||
|
|||||||
@@ -103,6 +103,7 @@ D(OP_ApplyPoison)
|
|||||||
D(OP_AugmentInfo)
|
D(OP_AugmentInfo)
|
||||||
D(OP_AugmentItem)
|
D(OP_AugmentItem)
|
||||||
D(OP_BazaarSearch)
|
D(OP_BazaarSearch)
|
||||||
|
D(OP_BookButton)
|
||||||
D(OP_Buff)
|
D(OP_Buff)
|
||||||
D(OP_CastSpell)
|
D(OP_CastSpell)
|
||||||
D(OP_ChannelMessage)
|
D(OP_ChannelMessage)
|
||||||
|
|||||||
@@ -2351,12 +2351,21 @@ struct BookText_Struct {
|
|||||||
// This is just a "text file" on the server
|
// This is just a "text file" on the server
|
||||||
// or in our case, the 'name' column in our books table.
|
// or in our case, the 'name' column in our books table.
|
||||||
struct BookRequest_Struct {
|
struct BookRequest_Struct {
|
||||||
/*0000*/ uint32 window; // where to display the text (0xFFFFFFFF means new window).
|
/*0000*/ uint32 window; // where to display the text (0xFFFFFFFF means new window).
|
||||||
/*0004*/ uint32 invslot; // The inventory slot the book is in. Not used, but echoed in the response packet.
|
/*0004*/ uint32 invslot; // The inventory slot the book is in
|
||||||
/*0008*/ uint32 type; // 0 = Scroll, 1 = Book, 2 = Item Info. Possibly others
|
/*0008*/ uint32 type; // 0 = Scroll, 1 = Book, 2 = Item Info. Possibly others
|
||||||
/*0012*/ uint32 unknown0012;
|
/*0012*/ uint32 target_id;
|
||||||
/*0016*/ uint16 unknown0016;
|
/*0016*/ uint8 can_cast;
|
||||||
/*0018*/ char txtfile[8194];
|
/*0017*/ uint8 can_scribe;
|
||||||
|
/*0018*/ char txtfile[8194];
|
||||||
|
};
|
||||||
|
|
||||||
|
// used by Scribe and CastSpell book buttons
|
||||||
|
struct BookButton_Struct
|
||||||
|
{
|
||||||
|
/*0000*/ int32 invslot;
|
||||||
|
/*0004*/ int32 target_id; // client's target when using the book
|
||||||
|
/*0008*/ int32 unused; // always 0 from button packets
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -3583,9 +3592,14 @@ struct RaidAddMember_Struct {
|
|||||||
/*139*/ uint8 flags[5]; //no idea if these are needed...
|
/*139*/ uint8 flags[5]; //no idea if these are needed...
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct RaidNote_Struct {
|
||||||
|
/*000*/ RaidGeneral_Struct general;
|
||||||
|
/*140*/ char note[64];
|
||||||
|
};
|
||||||
|
|
||||||
struct RaidMOTD_Struct {
|
struct RaidMOTD_Struct {
|
||||||
/*000*/ RaidGeneral_Struct general; // leader_name and action only used
|
/*000*/ RaidGeneral_Struct general; // leader_name and action only used
|
||||||
/*140*/ char motd[0]; // max size 1024, but reply is variable
|
/*140*/ char motd[1024]; // max size is 1024, but reply is variable
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RaidLeadershipUpdate_Struct {
|
struct RaidLeadershipUpdate_Struct {
|
||||||
|
|||||||
+151
-89
@@ -33,6 +33,7 @@
|
|||||||
#include "sof_structs.h"
|
#include "sof_structs.h"
|
||||||
#include "../rulesys.h"
|
#include "../rulesys.h"
|
||||||
#include "../path_manager.h"
|
#include "../path_manager.h"
|
||||||
|
#include "../raid.h"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
@@ -1356,88 +1357,124 @@ namespace SoF
|
|||||||
|
|
||||||
ENCODE(OP_RaidJoin)
|
ENCODE(OP_RaidJoin)
|
||||||
{
|
{
|
||||||
EQApplicationPacket *inapp = *p;
|
EQApplicationPacket* inapp = *p;
|
||||||
unsigned char * __emu_buffer = inapp->pBuffer;
|
*p = nullptr;
|
||||||
RaidCreate_Struct *raid_create = (RaidCreate_Struct*)__emu_buffer;
|
unsigned char* __emu_buffer = inapp->pBuffer;
|
||||||
|
RaidCreate_Struct* emu = (RaidCreate_Struct*)__emu_buffer;
|
||||||
|
|
||||||
auto outapp_create = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
||||||
structs::RaidGeneral_Struct *general = (structs::RaidGeneral_Struct*)outapp_create->pBuffer;
|
structs::RaidGeneral_Struct* general = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
general->action = 8;
|
general->action = raidCreate;
|
||||||
general->parameter = 1;
|
general->parameter = RaidCommandAcceptInvite;
|
||||||
strn0cpy(general->leader_name, raid_create->leader_name, 64);
|
strn0cpy(general->leader_name, emu->leader_name, sizeof(emu->leader_name));
|
||||||
strn0cpy(general->player_name, raid_create->leader_name, 64);
|
strn0cpy(general->player_name, emu->leader_name, sizeof(emu->leader_name));
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
|
||||||
dest->FastQueuePacket(&outapp_create);
|
|
||||||
safe_delete(inapp);
|
safe_delete(inapp);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ENCODE(OP_RaidUpdate)
|
ENCODE(OP_RaidUpdate)
|
||||||
{
|
{
|
||||||
EQApplicationPacket *inapp = *p;
|
EQApplicationPacket* inapp = *p;
|
||||||
*p = nullptr;
|
*p = nullptr;
|
||||||
unsigned char * __emu_buffer = inapp->pBuffer;
|
unsigned char* __emu_buffer = inapp->pBuffer;
|
||||||
RaidGeneral_Struct *raid_gen = (RaidGeneral_Struct*)__emu_buffer;
|
RaidGeneral_Struct* raid_gen = (RaidGeneral_Struct*)__emu_buffer;
|
||||||
|
|
||||||
if (raid_gen->action == 0) // raid add has longer length than other raid updates
|
switch (raid_gen->action)
|
||||||
{
|
{
|
||||||
RaidAddMember_Struct* in_add_member = (RaidAddMember_Struct*)__emu_buffer;
|
case raidAdd:
|
||||||
|
{
|
||||||
|
RaidAddMember_Struct* emu = (RaidAddMember_Struct*)__emu_buffer;
|
||||||
|
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidAddMember_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidAddMember_Struct));
|
||||||
structs::RaidAddMember_Struct *add_member = (structs::RaidAddMember_Struct*)outapp->pBuffer;
|
structs::RaidAddMember_Struct* eq = (structs::RaidAddMember_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
add_member->raidGen.action = in_add_member->raidGen.action;
|
OUT(raidGen.action);
|
||||||
add_member->raidGen.parameter = in_add_member->raidGen.parameter;
|
OUT(raidGen.parameter);
|
||||||
strn0cpy(add_member->raidGen.leader_name, in_add_member->raidGen.leader_name, 64);
|
OUT_str(raidGen.leader_name);
|
||||||
strn0cpy(add_member->raidGen.player_name, in_add_member->raidGen.player_name, 64);
|
OUT_str(raidGen.player_name);
|
||||||
add_member->_class = in_add_member->_class;
|
OUT(_class);
|
||||||
add_member->level = in_add_member->level;
|
OUT(level);
|
||||||
add_member->isGroupLeader = in_add_member->isGroupLeader;
|
OUT(isGroupLeader);
|
||||||
add_member->flags[0] = in_add_member->flags[0];
|
OUT(flags[0]);
|
||||||
add_member->flags[1] = in_add_member->flags[1];
|
OUT(flags[1]);
|
||||||
add_member->flags[2] = in_add_member->flags[2];
|
OUT(flags[2]);
|
||||||
add_member->flags[3] = in_add_member->flags[3];
|
OUT(flags[3]);
|
||||||
add_member->flags[4] = in_add_member->flags[4];
|
OUT(flags[4]);
|
||||||
dest->FastQueuePacket(&outapp);
|
|
||||||
}
|
|
||||||
else if (raid_gen->action == 35)
|
|
||||||
{
|
|
||||||
RaidMOTD_Struct *inmotd = (RaidMOTD_Struct *)__emu_buffer;
|
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidMOTD_Struct) +
|
|
||||||
strlen(inmotd->motd) + 1);
|
|
||||||
structs::RaidMOTD_Struct *outmotd = (structs::RaidMOTD_Struct *)outapp->pBuffer;
|
|
||||||
|
|
||||||
outmotd->general.action = inmotd->general.action;
|
|
||||||
strn0cpy(outmotd->general.player_name, inmotd->general.player_name, 64);
|
|
||||||
strn0cpy(outmotd->motd, inmotd->motd, strlen(inmotd->motd) + 1);
|
|
||||||
dest->FastQueuePacket(&outapp);
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if (raid_gen->action == 14 || raid_gen->action == 30)
|
case raidSetMotd:
|
||||||
{
|
{
|
||||||
RaidLeadershipUpdate_Struct *inlaa = (RaidLeadershipUpdate_Struct *)__emu_buffer;
|
RaidMOTD_Struct* emu = (RaidMOTD_Struct*)__emu_buffer;
|
||||||
auto outapp =
|
|
||||||
new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidLeadershipUpdate_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidMOTD_Struct));
|
||||||
structs::RaidLeadershipUpdate_Struct *outlaa = (structs::RaidLeadershipUpdate_Struct *)outapp->pBuffer;
|
structs::RaidMOTD_Struct* eq = (structs::RaidMOTD_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(general.action);
|
||||||
|
OUT_str(general.player_name);
|
||||||
|
OUT_str(general.leader_name);
|
||||||
|
OUT_str(motd);
|
||||||
|
|
||||||
outlaa->action = inlaa->action;
|
|
||||||
strn0cpy(outlaa->player_name, inlaa->player_name, 64);
|
|
||||||
strn0cpy(outlaa->leader_name, inlaa->leader_name, 64);
|
|
||||||
memcpy(&outlaa->raid, &inlaa->raid, sizeof(RaidLeadershipAA_Struct));
|
|
||||||
dest->FastQueuePacket(&outapp);
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else
|
case raidSetLeaderAbilities:
|
||||||
|
case raidMakeLeader:
|
||||||
{
|
{
|
||||||
RaidGeneral_Struct* in_raid_general = (RaidGeneral_Struct*)__emu_buffer;
|
RaidLeadershipUpdate_Struct* emu = (RaidLeadershipUpdate_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidLeadershipUpdate_Struct));
|
||||||
|
structs::RaidLeadershipUpdate_Struct* eq = (structs::RaidLeadershipUpdate_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(action);
|
||||||
|
OUT_str(player_name);
|
||||||
|
OUT_str(leader_name);
|
||||||
|
memcpy(&eq->raid, &emu->raid, sizeof(RaidLeadershipAA_Struct));
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case raidSetNote:
|
||||||
|
{
|
||||||
|
auto emu = (RaidNote_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidNote_Struct));
|
||||||
|
auto eq = (structs::RaidNote_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(general.action);
|
||||||
|
OUT_str(general.leader_name);
|
||||||
|
OUT_str(general.player_name);
|
||||||
|
OUT_str(note);
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case raidNoRaid:
|
||||||
|
{
|
||||||
|
dest->QueuePacket(inapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
RaidGeneral_Struct* emu = (RaidGeneral_Struct*)__emu_buffer;
|
||||||
|
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
||||||
structs::RaidGeneral_Struct *raid_general = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
structs::RaidGeneral_Struct* eq = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
||||||
strn0cpy(raid_general->leader_name, in_raid_general->leader_name, 64);
|
|
||||||
strn0cpy(raid_general->player_name, in_raid_general->player_name, 64);
|
|
||||||
raid_general->action = in_raid_general->action;
|
|
||||||
raid_general->parameter = in_raid_general->parameter;
|
|
||||||
dest->FastQueuePacket(&outapp);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
OUT(action);
|
||||||
|
OUT(parameter);
|
||||||
|
OUT_str(leader_name);
|
||||||
|
OUT_str(player_name);
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
safe_delete(inapp);
|
safe_delete(inapp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1452,6 +1489,9 @@ namespace SoF
|
|||||||
eq->window = emu->window;
|
eq->window = emu->window;
|
||||||
OUT(type);
|
OUT(type);
|
||||||
eq->invslot = ServerToSoFSlot(emu->invslot);
|
eq->invslot = ServerToSoFSlot(emu->invslot);
|
||||||
|
OUT(target_id);
|
||||||
|
OUT(can_cast);
|
||||||
|
OUT(can_scribe);
|
||||||
strn0cpy(eq->txtfile, emu->booktext, sizeof(eq->txtfile));
|
strn0cpy(eq->txtfile, emu->booktext, sizeof(eq->txtfile));
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
@@ -2261,6 +2301,17 @@ namespace SoF
|
|||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DECODE(OP_BookButton)
|
||||||
|
{
|
||||||
|
DECODE_LENGTH_EXACT(structs::BookButton_Struct);
|
||||||
|
SETUP_DIRECT_DECODE(BookButton_Struct, structs::BookButton_Struct);
|
||||||
|
|
||||||
|
emu->invslot = static_cast<int16_t>(SoFToServerSlot(eq->invslot));
|
||||||
|
IN(target_id);
|
||||||
|
|
||||||
|
FINISH_DIRECT_DECODE();
|
||||||
|
}
|
||||||
|
|
||||||
DECODE(OP_Buff)
|
DECODE(OP_Buff)
|
||||||
{
|
{
|
||||||
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
|
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
|
||||||
@@ -2729,37 +2780,47 @@ namespace SoF
|
|||||||
{
|
{
|
||||||
DECODE_LENGTH_ATLEAST(structs::RaidGeneral_Struct);
|
DECODE_LENGTH_ATLEAST(structs::RaidGeneral_Struct);
|
||||||
|
|
||||||
// This is a switch on the RaidGeneral action
|
RaidGeneral_Struct* rgs = (RaidGeneral_Struct*)__packet->pBuffer;
|
||||||
switch (*(uint32 *)__packet->pBuffer) {
|
|
||||||
case 35: { // raidMOTD
|
switch (rgs->action)
|
||||||
// we don't have a nice macro for this
|
{
|
||||||
structs::RaidMOTD_Struct *__eq_buffer = (structs::RaidMOTD_Struct *)__packet->pBuffer;
|
case raidSetMotd:
|
||||||
__eq_buffer->motd[1023] = '\0';
|
{
|
||||||
size_t motd_size = strlen(__eq_buffer->motd) + 1;
|
SETUP_VAR_DECODE(RaidMOTD_Struct, structs::RaidMOTD_Struct, motd);
|
||||||
__packet->size = sizeof(RaidMOTD_Struct) + motd_size;
|
|
||||||
__packet->pBuffer = new unsigned char[__packet->size];
|
IN(general.action);
|
||||||
RaidMOTD_Struct *emu = (RaidMOTD_Struct *)__packet->pBuffer;
|
IN(general.parameter);
|
||||||
structs::RaidMOTD_Struct *eq = (structs::RaidMOTD_Struct *)__eq_buffer;
|
IN_str(general.leader_name);
|
||||||
strn0cpy(emu->general.player_name, eq->general.player_name, 64);
|
IN_str(general.player_name);
|
||||||
strn0cpy(emu->motd, eq->motd, motd_size);
|
IN_str(motd);
|
||||||
IN(general.action);
|
|
||||||
IN(general.parameter);
|
FINISH_VAR_DECODE();
|
||||||
FINISH_DIRECT_DECODE();
|
break;
|
||||||
break;
|
}
|
||||||
}
|
case raidSetNote:
|
||||||
case 36: { // raidPlayerNote unhandled
|
{
|
||||||
break;
|
SETUP_VAR_DECODE(RaidNote_Struct, structs::RaidNote_Struct, note);
|
||||||
}
|
|
||||||
default: {
|
IN(general.action);
|
||||||
DECODE_LENGTH_EXACT(structs::RaidGeneral_Struct);
|
IN(general.parameter);
|
||||||
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
IN_str(general.leader_name);
|
||||||
strn0cpy(emu->leader_name, eq->leader_name, 64);
|
IN_str(general.player_name);
|
||||||
strn0cpy(emu->player_name, eq->player_name, 64);
|
IN_str(note);
|
||||||
IN(action);
|
|
||||||
IN(parameter);
|
FINISH_VAR_DECODE();
|
||||||
FINISH_DIRECT_DECODE();
|
break;
|
||||||
break;
|
}
|
||||||
}
|
default:
|
||||||
|
{
|
||||||
|
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
||||||
|
IN(action);
|
||||||
|
IN(parameter);
|
||||||
|
IN_str(leader_name);
|
||||||
|
IN_str(player_name);
|
||||||
|
|
||||||
|
FINISH_DIRECT_DECODE();
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2769,7 +2830,8 @@ namespace SoF
|
|||||||
SETUP_DIRECT_DECODE(BookRequest_Struct, structs::BookRequest_Struct);
|
SETUP_DIRECT_DECODE(BookRequest_Struct, structs::BookRequest_Struct);
|
||||||
|
|
||||||
IN(type);
|
IN(type);
|
||||||
emu->invslot = SoFToServerSlot(eq->invslot);
|
emu->invslot = static_cast<int16_t>(SoFToServerSlot(eq->invslot));
|
||||||
|
IN(target_id);
|
||||||
emu->window = (uint8)eq->window;
|
emu->window = (uint8)eq->window;
|
||||||
strn0cpy(emu->txtfile, eq->txtfile, sizeof(emu->txtfile));
|
strn0cpy(emu->txtfile, eq->txtfile, sizeof(emu->txtfile));
|
||||||
|
|
||||||
|
|||||||
@@ -94,6 +94,7 @@ D(OP_AltCurrencySellSelection)
|
|||||||
D(OP_ApplyPoison)
|
D(OP_ApplyPoison)
|
||||||
D(OP_AugmentInfo)
|
D(OP_AugmentInfo)
|
||||||
D(OP_AugmentItem)
|
D(OP_AugmentItem)
|
||||||
|
D(OP_BookButton)
|
||||||
D(OP_Buff)
|
D(OP_Buff)
|
||||||
D(OP_Bug)
|
D(OP_Bug)
|
||||||
D(OP_CastSpell)
|
D(OP_CastSpell)
|
||||||
|
|||||||
@@ -2321,12 +2321,21 @@ struct BookText_Struct {
|
|||||||
// This is just a "text file" on the server
|
// This is just a "text file" on the server
|
||||||
// or in our case, the 'name' column in our books table.
|
// or in our case, the 'name' column in our books table.
|
||||||
struct BookRequest_Struct {
|
struct BookRequest_Struct {
|
||||||
/*0000*/ uint32 window; // where to display the text (0xFFFFFFFF means new window).
|
/*0000*/ uint32 window; // where to display the text (0xFFFFFFFF means new window).
|
||||||
/*0004*/ uint32 invslot; // The inventory slot the book is in. Not used, but echoed in the response packet.
|
/*0004*/ uint32 invslot; // The inventory slot the book is in
|
||||||
/*0008*/ uint32 type; // 0 = Scroll, 1 = Book, 2 = Item Info. Possibly others
|
/*0008*/ uint32 type; // 0 = Scroll, 1 = Book, 2 = Item Info. Possibly others
|
||||||
/*0012*/ uint32 unknown0012;
|
/*0012*/ uint32 target_id;
|
||||||
/*0016*/ uint16 unknown0016;
|
/*0016*/ uint8 can_cast;
|
||||||
/*0018*/ char txtfile[8194];
|
/*0017*/ uint8 can_scribe;
|
||||||
|
/*0018*/ char txtfile[8194];
|
||||||
|
};
|
||||||
|
|
||||||
|
// used by Scribe and CastSpell book buttons
|
||||||
|
struct BookButton_Struct
|
||||||
|
{
|
||||||
|
/*0000*/ int32 invslot;
|
||||||
|
/*0004*/ int32 target_id; // client's target when using the book
|
||||||
|
/*0008*/ int32 unused; // always 0 from button packets
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -3508,9 +3517,14 @@ struct RaidAddMember_Struct {
|
|||||||
/*139*/ uint8 flags[5]; //no idea if these are needed...
|
/*139*/ uint8 flags[5]; //no idea if these are needed...
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct RaidNote_Struct {
|
||||||
|
/*000*/ RaidGeneral_Struct general;
|
||||||
|
/*140*/ char note[64];
|
||||||
|
};
|
||||||
|
|
||||||
struct RaidMOTD_Struct {
|
struct RaidMOTD_Struct {
|
||||||
/*000*/ RaidGeneral_Struct general; // leader_name and action only used
|
/*000*/ RaidGeneral_Struct general; // leader_name and action only used
|
||||||
/*140*/ char motd[0]; // max size 1024, but reply is variable
|
/*140*/ char motd[1024]; // max size is 1024, but reply is variable
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RaidLeadershipUpdate_Struct {
|
struct RaidLeadershipUpdate_Struct {
|
||||||
|
|||||||
@@ -128,6 +128,15 @@
|
|||||||
emu_struct *emu = (emu_struct *) __packet->pBuffer; \
|
emu_struct *emu = (emu_struct *) __packet->pBuffer; \
|
||||||
eq_struct *eq = (eq_struct *) __eq_buffer;
|
eq_struct *eq = (eq_struct *) __eq_buffer;
|
||||||
|
|
||||||
|
#define SETUP_VAR_DECODE(emu_struct, eq_struct, var_field) \
|
||||||
|
unsigned char *__eq_buffer = __packet->pBuffer; \
|
||||||
|
eq_struct* in = (eq_struct*)__packet->pBuffer; \
|
||||||
|
auto size = strlen(in->var_field); \
|
||||||
|
__packet->size = sizeof(emu_struct) + size + 1; \
|
||||||
|
__packet->pBuffer = new unsigned char[__packet->size]; \
|
||||||
|
emu_struct *emu = (emu_struct *) __packet->pBuffer; \
|
||||||
|
eq_struct *eq = (eq_struct *) __eq_buffer;
|
||||||
|
|
||||||
#define MEMSET_IN(emu_struct) \
|
#define MEMSET_IN(emu_struct) \
|
||||||
memset(__packet->pBuffer, 0, sizeof(emu_struct));
|
memset(__packet->pBuffer, 0, sizeof(emu_struct));
|
||||||
|
|
||||||
@@ -146,6 +155,9 @@
|
|||||||
delete[] __eq_buffer; \
|
delete[] __eq_buffer; \
|
||||||
p->SetOpcode(OP_Unknown);
|
p->SetOpcode(OP_Unknown);
|
||||||
|
|
||||||
|
#define FINISH_VAR_DECODE() \
|
||||||
|
delete[] __eq_buffer;
|
||||||
|
|
||||||
//call to finish an encoder using SETUP_DIRECT_DECODE
|
//call to finish an encoder using SETUP_DIRECT_DECODE
|
||||||
#define FINISH_DIRECT_DECODE() \
|
#define FINISH_DIRECT_DECODE() \
|
||||||
delete[] __eq_buffer;
|
delete[] __eq_buffer;
|
||||||
|
|||||||
@@ -33,6 +33,7 @@
|
|||||||
#include "../item_instance.h"
|
#include "../item_instance.h"
|
||||||
#include "titanium_structs.h"
|
#include "titanium_structs.h"
|
||||||
#include "../path_manager.h"
|
#include "../path_manager.h"
|
||||||
|
#include "../raid.h"
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
@@ -1245,6 +1246,119 @@ namespace Titanium
|
|||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ENCODE(OP_MarkRaidNPC)
|
||||||
|
{
|
||||||
|
ENCODE_LENGTH_EXACT(MarkNPC_Struct);
|
||||||
|
SETUP_DIRECT_ENCODE(MarkNPC_Struct, MarkNPC_Struct);
|
||||||
|
|
||||||
|
EQApplicationPacket* outapp = new EQApplicationPacket(OP_MarkNPC, sizeof(MarkNPC_Struct));
|
||||||
|
MarkNPC_Struct* mnpcs = (MarkNPC_Struct*)outapp->pBuffer;
|
||||||
|
mnpcs->TargetID = emu->TargetID;
|
||||||
|
mnpcs->Number = emu->Number;
|
||||||
|
dest->QueuePacket(outapp);
|
||||||
|
safe_delete(outapp);
|
||||||
|
|
||||||
|
FINISH_ENCODE();
|
||||||
|
}
|
||||||
|
|
||||||
|
ENCODE(OP_RaidUpdate)
|
||||||
|
{
|
||||||
|
EQApplicationPacket* inapp = *p;
|
||||||
|
*p = nullptr;
|
||||||
|
unsigned char* __emu_buffer = inapp->pBuffer;
|
||||||
|
RaidGeneral_Struct* raid_gen = (RaidGeneral_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
switch (raid_gen->action)
|
||||||
|
{
|
||||||
|
case raidAdd:
|
||||||
|
{
|
||||||
|
RaidAddMember_Struct* emu = (RaidAddMember_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidAddMember_Struct));
|
||||||
|
structs::RaidAddMember_Struct* eq = (structs::RaidAddMember_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(raidGen.action);
|
||||||
|
OUT(raidGen.parameter);
|
||||||
|
OUT_str(raidGen.leader_name);
|
||||||
|
OUT_str(raidGen.player_name);
|
||||||
|
OUT(_class);
|
||||||
|
OUT(level);
|
||||||
|
OUT(isGroupLeader);
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
case raidSetMotd:
|
||||||
|
{
|
||||||
|
RaidMOTD_Struct* emu = (RaidMOTD_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidMOTD_Struct));
|
||||||
|
structs::RaidMOTD_Struct* eq = (structs::RaidMOTD_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(general.action);
|
||||||
|
OUT_str(general.player_name);
|
||||||
|
OUT_str(general.leader_name);
|
||||||
|
OUT_str(motd);
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case raidSetLeaderAbilities:
|
||||||
|
case raidMakeLeader:
|
||||||
|
{
|
||||||
|
RaidLeadershipUpdate_Struct* emu = (RaidLeadershipUpdate_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidLeadershipUpdate_Struct));
|
||||||
|
structs::RaidLeadershipUpdate_Struct* eq = (structs::RaidLeadershipUpdate_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(action);
|
||||||
|
OUT_str(player_name);
|
||||||
|
OUT_str(leader_name);
|
||||||
|
memcpy(&eq->raid, &emu->raid, sizeof(RaidLeadershipAA_Struct));
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case raidSetNote:
|
||||||
|
{
|
||||||
|
auto emu = (RaidNote_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidNote_Struct));
|
||||||
|
auto eq = (structs::RaidNote_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(general.action);
|
||||||
|
OUT_str(general.leader_name);
|
||||||
|
OUT_str(general.player_name);
|
||||||
|
OUT_str(note);
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case raidNoRaid:
|
||||||
|
{
|
||||||
|
dest->QueuePacket(inapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
RaidGeneral_Struct* emu = (RaidGeneral_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
||||||
|
structs::RaidGeneral_Struct* eq = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(action);
|
||||||
|
OUT(parameter);
|
||||||
|
OUT_str(leader_name);
|
||||||
|
OUT_str(player_name);
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
safe_delete(inapp);
|
||||||
|
}
|
||||||
|
|
||||||
ENCODE(OP_ReadBook)
|
ENCODE(OP_ReadBook)
|
||||||
{
|
{
|
||||||
// no apparent slot translation needed
|
// no apparent slot translation needed
|
||||||
@@ -2272,6 +2386,63 @@ namespace Titanium
|
|||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DECODE(OP_RaidInvite)
|
||||||
|
{
|
||||||
|
DECODE_LENGTH_ATLEAST(structs::RaidGeneral_Struct);
|
||||||
|
RaidGeneral_Struct* rgs = (RaidGeneral_Struct*)__packet->pBuffer;
|
||||||
|
|
||||||
|
switch (rgs->action)
|
||||||
|
{
|
||||||
|
case raidSetMotd:
|
||||||
|
{
|
||||||
|
SETUP_VAR_DECODE(RaidMOTD_Struct, structs::RaidMOTD_Struct, motd);
|
||||||
|
|
||||||
|
IN(general.action);
|
||||||
|
IN(general.parameter);
|
||||||
|
IN_str(general.leader_name);
|
||||||
|
IN_str(general.player_name);
|
||||||
|
|
||||||
|
auto len = 0;
|
||||||
|
if (__packet->size < sizeof(structs::RaidMOTD_Struct)) {
|
||||||
|
len = __packet->size - sizeof(structs::RaidGeneral_Struct);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
len = sizeof(eq->motd);
|
||||||
|
}
|
||||||
|
|
||||||
|
strn0cpy(emu->motd, eq->motd, len > 1024 ? 1024 : len);
|
||||||
|
emu->motd[len - 1] = '\0';
|
||||||
|
|
||||||
|
FINISH_VAR_DECODE();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case raidSetNote:
|
||||||
|
{
|
||||||
|
SETUP_VAR_DECODE(RaidNote_Struct, structs::RaidNote_Struct, note);
|
||||||
|
|
||||||
|
IN(general.action);
|
||||||
|
IN(general.parameter);
|
||||||
|
IN_str(general.leader_name);
|
||||||
|
IN_str(general.player_name);
|
||||||
|
IN_str(note);
|
||||||
|
|
||||||
|
FINISH_VAR_DECODE();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
||||||
|
IN(action);
|
||||||
|
IN(parameter);
|
||||||
|
IN_str(leader_name);
|
||||||
|
IN_str(player_name);
|
||||||
|
|
||||||
|
FINISH_DIRECT_DECODE();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
DECODE(OP_ReadBook)
|
DECODE(OP_ReadBook)
|
||||||
{
|
{
|
||||||
// no apparent slot translation needed
|
// no apparent slot translation needed
|
||||||
|
|||||||
@@ -61,6 +61,8 @@ E(OP_OnLevelMessage)
|
|||||||
E(OP_PetBuffWindow)
|
E(OP_PetBuffWindow)
|
||||||
E(OP_PlayerProfile)
|
E(OP_PlayerProfile)
|
||||||
E(OP_NewSpawn)
|
E(OP_NewSpawn)
|
||||||
|
E(OP_MarkRaidNPC)
|
||||||
|
E(OP_RaidUpdate)
|
||||||
E(OP_ReadBook)
|
E(OP_ReadBook)
|
||||||
E(OP_RespondAA)
|
E(OP_RespondAA)
|
||||||
E(OP_SendCharInfo)
|
E(OP_SendCharInfo)
|
||||||
@@ -106,6 +108,7 @@ D(OP_LoadSpellSet)
|
|||||||
D(OP_LootItem)
|
D(OP_LootItem)
|
||||||
D(OP_MoveItem)
|
D(OP_MoveItem)
|
||||||
D(OP_PetCommands)
|
D(OP_PetCommands)
|
||||||
|
D(OP_RaidInvite)
|
||||||
D(OP_ReadBook)
|
D(OP_ReadBook)
|
||||||
D(OP_SetServerFilter)
|
D(OP_SetServerFilter)
|
||||||
D(OP_ShopPlayerSell)
|
D(OP_ShopPlayerSell)
|
||||||
|
|||||||
@@ -3017,23 +3017,39 @@ struct leadExpUpdateStruct {
|
|||||||
/*0028*/ uint32 unknown0028;
|
/*0028*/ uint32 unknown0028;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct RaidGeneral_Struct {
|
struct RaidGeneral_Struct {
|
||||||
/*00*/ uint32 action; //=10
|
/*000*/ uint32 action; //=10
|
||||||
/*04*/ char player_name[64]; //should both be the player's name
|
/*004*/ char player_name[64]; //should both be the player's name
|
||||||
/*04*/ char leader_name[64];
|
/*068*/ char leader_name[64];
|
||||||
/*132*/ uint32 parameter;
|
/*132*/ uint32 parameter;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RaidAdd_Struct {
|
struct RaidAddMember_Struct {
|
||||||
/*000*/ uint32 action; //=0
|
/*000*/ RaidGeneral_Struct raidGen;
|
||||||
/*004*/ char player_name[64]; //should both be the player's name
|
/*136*/ uint8 _class;
|
||||||
/*068*/ char leader_name[64];
|
/*137*/ uint8 level;
|
||||||
/*132*/ uint8 _class;
|
/*138*/ uint8 isGroupLeader;
|
||||||
/*133*/ uint8 level;
|
/*139*/ uint8 unknown139; //seems to be 0x42 or 0
|
||||||
/*134*/ uint8 has_group;
|
};
|
||||||
/*135*/ uint8 unknown135; //seems to be 0x42 or 0
|
|
||||||
|
struct RaidNote_Struct {
|
||||||
|
/*000*/ RaidGeneral_Struct general;
|
||||||
|
/*136*/ char note[64];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RaidMOTD_Struct {
|
||||||
|
/*000*/ RaidGeneral_Struct general; // leader_name and action only used
|
||||||
|
/*136*/ char motd[1024]; // max size is 1024, but reply is variable
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RaidLeadershipUpdate_Struct {
|
||||||
|
/*000*/ uint32 action;
|
||||||
|
/*004*/ char player_name[64];
|
||||||
|
// /*068*/ uint32 Unknown068;
|
||||||
|
/*072*/ char leader_name[64];
|
||||||
|
/*136*/ GroupLeadershipAA_Struct group; //unneeded
|
||||||
|
/*200*/ RaidLeadershipAA_Struct raid;
|
||||||
|
/*264*/ char Unknown264[128];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RaidCreate_Struct {
|
struct RaidCreate_Struct {
|
||||||
|
|||||||
+160
-99
@@ -35,6 +35,7 @@
|
|||||||
#include "../path_manager.h"
|
#include "../path_manager.h"
|
||||||
#include "../classes.h"
|
#include "../classes.h"
|
||||||
#include "../races.h"
|
#include "../races.h"
|
||||||
|
#include "../raid.h"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
@@ -1931,88 +1932,124 @@ namespace UF
|
|||||||
|
|
||||||
ENCODE(OP_RaidJoin)
|
ENCODE(OP_RaidJoin)
|
||||||
{
|
{
|
||||||
EQApplicationPacket *inapp = *p;
|
EQApplicationPacket* inapp = *p;
|
||||||
unsigned char * __emu_buffer = inapp->pBuffer;
|
*p = nullptr;
|
||||||
RaidCreate_Struct *raid_create = (RaidCreate_Struct*)__emu_buffer;
|
unsigned char* __emu_buffer = inapp->pBuffer;
|
||||||
|
RaidCreate_Struct* emu = (RaidCreate_Struct*)__emu_buffer;
|
||||||
|
|
||||||
auto outapp_create = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
||||||
structs::RaidGeneral_Struct *general = (structs::RaidGeneral_Struct*)outapp_create->pBuffer;
|
structs::RaidGeneral_Struct* general = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
general->action = 8;
|
general->action = raidCreate;
|
||||||
general->parameter = 1;
|
general->parameter = RaidCommandAcceptInvite;
|
||||||
strn0cpy(general->leader_name, raid_create->leader_name, 64);
|
strn0cpy(general->leader_name, emu->leader_name, sizeof(emu->leader_name));
|
||||||
strn0cpy(general->player_name, raid_create->leader_name, 64);
|
strn0cpy(general->player_name, emu->leader_name, sizeof(emu->leader_name));
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
|
||||||
dest->FastQueuePacket(&outapp_create);
|
|
||||||
safe_delete(inapp);
|
safe_delete(inapp);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ENCODE(OP_RaidUpdate)
|
ENCODE(OP_RaidUpdate)
|
||||||
{
|
{
|
||||||
EQApplicationPacket *inapp = *p;
|
EQApplicationPacket* inapp = *p;
|
||||||
*p = nullptr;
|
*p = nullptr;
|
||||||
unsigned char * __emu_buffer = inapp->pBuffer;
|
unsigned char* __emu_buffer = inapp->pBuffer;
|
||||||
RaidGeneral_Struct *raid_gen = (RaidGeneral_Struct*)__emu_buffer;
|
RaidGeneral_Struct* raid_gen = (RaidGeneral_Struct*)__emu_buffer;
|
||||||
|
|
||||||
if (raid_gen->action == 0) // raid add has longer length than other raid updates
|
switch (raid_gen->action)
|
||||||
{
|
{
|
||||||
RaidAddMember_Struct* in_add_member = (RaidAddMember_Struct*)__emu_buffer;
|
case raidAdd:
|
||||||
|
{
|
||||||
|
RaidAddMember_Struct* emu = (RaidAddMember_Struct*)__emu_buffer;
|
||||||
|
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidAddMember_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidAddMember_Struct));
|
||||||
structs::RaidAddMember_Struct *add_member = (structs::RaidAddMember_Struct*)outapp->pBuffer;
|
structs::RaidAddMember_Struct* eq = (structs::RaidAddMember_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
add_member->raidGen.action = in_add_member->raidGen.action;
|
OUT(raidGen.action);
|
||||||
add_member->raidGen.parameter = in_add_member->raidGen.parameter;
|
OUT(raidGen.parameter);
|
||||||
strn0cpy(add_member->raidGen.leader_name, in_add_member->raidGen.leader_name, 64);
|
OUT_str(raidGen.leader_name);
|
||||||
strn0cpy(add_member->raidGen.player_name, in_add_member->raidGen.player_name, 64);
|
OUT_str(raidGen.player_name);
|
||||||
add_member->_class = in_add_member->_class;
|
OUT(_class);
|
||||||
add_member->level = in_add_member->level;
|
OUT(level);
|
||||||
add_member->isGroupLeader = in_add_member->isGroupLeader;
|
OUT(isGroupLeader);
|
||||||
add_member->flags[0] = in_add_member->flags[0];
|
OUT(flags[0]);
|
||||||
add_member->flags[1] = in_add_member->flags[1];
|
OUT(flags[1]);
|
||||||
add_member->flags[2] = in_add_member->flags[2];
|
OUT(flags[2]);
|
||||||
add_member->flags[3] = in_add_member->flags[3];
|
OUT(flags[3]);
|
||||||
add_member->flags[4] = in_add_member->flags[4];
|
OUT(flags[4]);
|
||||||
dest->FastQueuePacket(&outapp);
|
|
||||||
}
|
|
||||||
else if (raid_gen->action == 35)
|
|
||||||
{
|
|
||||||
RaidMOTD_Struct *inmotd = (RaidMOTD_Struct *)__emu_buffer;
|
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidMOTD_Struct) +
|
|
||||||
strlen(inmotd->motd) + 1);
|
|
||||||
structs::RaidMOTD_Struct *outmotd = (structs::RaidMOTD_Struct *)outapp->pBuffer;
|
|
||||||
|
|
||||||
outmotd->general.action = inmotd->general.action;
|
|
||||||
strn0cpy(outmotd->general.player_name, inmotd->general.player_name, 64);
|
|
||||||
strn0cpy(outmotd->motd, inmotd->motd, strlen(inmotd->motd) + 1);
|
|
||||||
dest->FastQueuePacket(&outapp);
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if (raid_gen->action == 14 || raid_gen->action == 30)
|
case raidSetMotd:
|
||||||
{
|
{
|
||||||
RaidLeadershipUpdate_Struct *inlaa = (RaidLeadershipUpdate_Struct *)__emu_buffer;
|
RaidMOTD_Struct* emu = (RaidMOTD_Struct*)__emu_buffer;
|
||||||
auto outapp =
|
|
||||||
new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidLeadershipUpdate_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidMOTD_Struct));
|
||||||
structs::RaidLeadershipUpdate_Struct *outlaa = (structs::RaidLeadershipUpdate_Struct *)outapp->pBuffer;
|
structs::RaidMOTD_Struct* eq = (structs::RaidMOTD_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(general.action);
|
||||||
|
OUT_str(general.player_name);
|
||||||
|
OUT_str(general.leader_name);
|
||||||
|
OUT_str(motd);
|
||||||
|
|
||||||
outlaa->action = inlaa->action;
|
|
||||||
strn0cpy(outlaa->player_name, inlaa->player_name, 64);
|
|
||||||
strn0cpy(outlaa->leader_name, inlaa->leader_name, 64);
|
|
||||||
memcpy(&outlaa->raid, &inlaa->raid, sizeof(RaidLeadershipAA_Struct));
|
|
||||||
dest->FastQueuePacket(&outapp);
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else
|
case raidSetLeaderAbilities:
|
||||||
|
case raidMakeLeader:
|
||||||
{
|
{
|
||||||
RaidGeneral_Struct* in_raid_general = (RaidGeneral_Struct*)__emu_buffer;
|
RaidLeadershipUpdate_Struct* emu = (RaidLeadershipUpdate_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidLeadershipUpdate_Struct));
|
||||||
|
structs::RaidLeadershipUpdate_Struct* eq = (structs::RaidLeadershipUpdate_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(action);
|
||||||
|
OUT_str(player_name);
|
||||||
|
OUT_str(leader_name);
|
||||||
|
memcpy(&eq->raid, &emu->raid, sizeof(RaidLeadershipAA_Struct));
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case raidSetNote:
|
||||||
|
{
|
||||||
|
auto emu = (RaidNote_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidNote_Struct));
|
||||||
|
auto eq = (structs::RaidNote_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(general.action);
|
||||||
|
OUT_str(general.leader_name);
|
||||||
|
OUT_str(general.player_name);
|
||||||
|
OUT_str(note);
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case raidNoRaid:
|
||||||
|
{
|
||||||
|
dest->QueuePacket(inapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
RaidGeneral_Struct* emu = (RaidGeneral_Struct*)__emu_buffer;
|
||||||
|
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
||||||
structs::RaidGeneral_Struct *raid_general = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
structs::RaidGeneral_Struct* eq = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
||||||
strn0cpy(raid_general->leader_name, in_raid_general->leader_name, 64);
|
|
||||||
strn0cpy(raid_general->player_name, in_raid_general->player_name, 64);
|
|
||||||
raid_general->action = in_raid_general->action;
|
|
||||||
raid_general->parameter = in_raid_general->parameter;
|
|
||||||
dest->FastQueuePacket(&outapp);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
OUT(action);
|
||||||
|
OUT(parameter);
|
||||||
|
OUT_str(leader_name);
|
||||||
|
OUT_str(player_name);
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
safe_delete(inapp);
|
safe_delete(inapp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2027,6 +2064,9 @@ namespace UF
|
|||||||
eq->window = emu->window;
|
eq->window = emu->window;
|
||||||
OUT(type);
|
OUT(type);
|
||||||
eq->invslot = ServerToUFSlot(emu->invslot);
|
eq->invslot = ServerToUFSlot(emu->invslot);
|
||||||
|
OUT(target_id);
|
||||||
|
OUT(can_cast);
|
||||||
|
OUT(can_scribe);
|
||||||
strn0cpy(eq->txtfile, emu->booktext, sizeof(eq->txtfile));
|
strn0cpy(eq->txtfile, emu->booktext, sizeof(eq->txtfile));
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
@@ -2718,7 +2758,7 @@ namespace UF
|
|||||||
if (strlen(emu->suffix))
|
if (strlen(emu->suffix))
|
||||||
PacketSize += strlen(emu->suffix) + 1;
|
PacketSize += strlen(emu->suffix) + 1;
|
||||||
|
|
||||||
if (emu->DestructibleObject || emu->class_ == LDON_TREASURE)
|
if (emu->DestructibleObject || emu->class_ == Class::LDoNTreasure)
|
||||||
{
|
{
|
||||||
if (emu->DestructibleObject)
|
if (emu->DestructibleObject)
|
||||||
PacketSize = PacketSize - 4; // No bodytype
|
PacketSize = PacketSize - 4; // No bodytype
|
||||||
@@ -2739,8 +2779,8 @@ namespace UF
|
|||||||
}
|
}
|
||||||
|
|
||||||
float SpawnSize = emu->size;
|
float SpawnSize = emu->size;
|
||||||
if (!((emu->NPC == 0) || (emu->race <= RACE_GNOME_12) || (emu->race == RACE_IKSAR_128) ||
|
if (!((emu->NPC == 0) || (emu->race <= Race::Gnome) || (emu->race == Race::Iksar) ||
|
||||||
(emu->race == RACE_VAH_SHIR_130) || (emu->race == RACE_FROGLOK_330) || (emu->race == RACE_DRAKKIN_522))
|
(emu->race == Race::VahShir) || (emu->race == Race::Froglok2) || (emu->race == Race::Drakkin))
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
PacketSize -= (sizeof(structs::Texture_Struct) * EQ::textures::materialCount);
|
PacketSize -= (sizeof(structs::Texture_Struct) * EQ::textures::materialCount);
|
||||||
@@ -2807,7 +2847,7 @@ namespace UF
|
|||||||
|
|
||||||
uint8 OtherData = 0;
|
uint8 OtherData = 0;
|
||||||
|
|
||||||
if (emu->class_ == LDON_TREASURE) //Ldon chest
|
if (emu->class_ == Class::LDoNTreasure) //Ldon chest
|
||||||
{
|
{
|
||||||
OtherData = OtherData | 0x01;
|
OtherData = OtherData | 0x01;
|
||||||
}
|
}
|
||||||
@@ -2833,7 +2873,7 @@ namespace UF
|
|||||||
}
|
}
|
||||||
VARSTRUCT_ENCODE_TYPE(float, Buffer, 0); // unknown4
|
VARSTRUCT_ENCODE_TYPE(float, Buffer, 0); // unknown4
|
||||||
|
|
||||||
if (emu->DestructibleObject || emu->class_ == LDON_TREASURE)
|
if (emu->DestructibleObject || emu->class_ == Class::LDoNTreasure)
|
||||||
{
|
{
|
||||||
VARSTRUCT_ENCODE_STRING(Buffer, emu->DestructibleModel);
|
VARSTRUCT_ENCODE_STRING(Buffer, emu->DestructibleModel);
|
||||||
VARSTRUCT_ENCODE_STRING(Buffer, emu->DestructibleName2);
|
VARSTRUCT_ENCODE_STRING(Buffer, emu->DestructibleName2);
|
||||||
@@ -2942,8 +2982,8 @@ namespace UF
|
|||||||
|
|
||||||
Buffer += sizeof(structs::Spawn_Struct_Position);
|
Buffer += sizeof(structs::Spawn_Struct_Position);
|
||||||
|
|
||||||
if ((emu->NPC == 0) || (emu->race <= RACE_GNOME_12) || (emu->race == RACE_IKSAR_128) ||
|
if ((emu->NPC == 0) || (emu->race <= Race::Gnome) || (emu->race == Race::Iksar) ||
|
||||||
(emu->race == RACE_VAH_SHIR_130) || (emu->race == RACE_FROGLOK_330) || (emu->race == RACE_DRAKKIN_522)
|
(emu->race == Race::VahShir) || (emu->race == Race::Froglok2) || (emu->race == Race::Drakkin)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; ++k)
|
for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; ++k)
|
||||||
@@ -2978,8 +3018,8 @@ namespace UF
|
|||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((emu->NPC == 0) || (emu->race <= RACE_GNOME_12) || (emu->race == RACE_IKSAR_128) ||
|
if ((emu->NPC == 0) || (emu->race <= Race::Gnome) || (emu->race == Race::Iksar) ||
|
||||||
(emu->race == RACE_VAH_SHIR_130) || (emu->race == RACE_FROGLOK_330) || (emu->race == RACE_DRAKKIN_522)
|
(emu->race == Race::VahShir) || (emu->race == Race::Froglok2) || (emu->race == Race::Drakkin)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
structs::Texture_Struct *Equipment = (structs::Texture_Struct *)Buffer;
|
structs::Texture_Struct *Equipment = (structs::Texture_Struct *)Buffer;
|
||||||
@@ -3105,6 +3145,17 @@ namespace UF
|
|||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DECODE(OP_BookButton)
|
||||||
|
{
|
||||||
|
DECODE_LENGTH_EXACT(structs::BookButton_Struct);
|
||||||
|
SETUP_DIRECT_DECODE(BookButton_Struct, structs::BookButton_Struct);
|
||||||
|
|
||||||
|
emu->invslot = static_cast<int16_t>(UFToServerSlot(eq->invslot));
|
||||||
|
IN(target_id);
|
||||||
|
|
||||||
|
FINISH_DIRECT_DECODE();
|
||||||
|
}
|
||||||
|
|
||||||
DECODE(OP_Buff)
|
DECODE(OP_Buff)
|
||||||
{
|
{
|
||||||
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
|
DECODE_LENGTH_EXACT(structs::SpellBuffPacket_Struct);
|
||||||
@@ -3623,39 +3674,48 @@ namespace UF
|
|||||||
{
|
{
|
||||||
DECODE_LENGTH_ATLEAST(structs::RaidGeneral_Struct);
|
DECODE_LENGTH_ATLEAST(structs::RaidGeneral_Struct);
|
||||||
|
|
||||||
// This is a switch on the RaidGeneral action
|
RaidGeneral_Struct* rgs = (RaidGeneral_Struct*)__packet->pBuffer;
|
||||||
switch (*(uint32 *)__packet->pBuffer) {
|
|
||||||
case 35: { // raidMOTD
|
|
||||||
// we don't have a nice macro for this
|
|
||||||
structs::RaidMOTD_Struct *__eq_buffer = (structs::RaidMOTD_Struct *)__packet->pBuffer;
|
|
||||||
__eq_buffer->motd[1023] = '\0';
|
|
||||||
size_t motd_size = strlen(__eq_buffer->motd) + 1;
|
|
||||||
__packet->size = sizeof(RaidMOTD_Struct) + motd_size;
|
|
||||||
__packet->pBuffer = new unsigned char[__packet->size];
|
|
||||||
RaidMOTD_Struct *emu = (RaidMOTD_Struct *)__packet->pBuffer;
|
|
||||||
structs::RaidMOTD_Struct *eq = (structs::RaidMOTD_Struct *)__eq_buffer;
|
|
||||||
strn0cpy(emu->general.player_name, eq->general.player_name, 64);
|
|
||||||
strn0cpy(emu->motd, eq->motd, motd_size);
|
|
||||||
IN(general.action);
|
|
||||||
IN(general.parameter);
|
|
||||||
FINISH_DIRECT_DECODE();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 36: { // raidPlayerNote unhandled
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default: {
|
|
||||||
DECODE_LENGTH_EXACT(structs::RaidGeneral_Struct);
|
|
||||||
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
|
||||||
strn0cpy(emu->leader_name, eq->leader_name, 64);
|
|
||||||
strn0cpy(emu->player_name, eq->player_name, 64);
|
|
||||||
IN(action);
|
|
||||||
IN(parameter);
|
|
||||||
FINISH_DIRECT_DECODE();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
switch (rgs->action)
|
||||||
|
{
|
||||||
|
case raidSetMotd:
|
||||||
|
{
|
||||||
|
SETUP_VAR_DECODE(RaidMOTD_Struct, structs::RaidMOTD_Struct, motd);
|
||||||
|
|
||||||
|
IN(general.action);
|
||||||
|
IN(general.parameter);
|
||||||
|
IN_str(general.leader_name);
|
||||||
|
IN_str(general.player_name);
|
||||||
|
IN_str(motd);
|
||||||
|
|
||||||
|
FINISH_VAR_DECODE();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case raidSetNote:
|
||||||
|
{
|
||||||
|
SETUP_VAR_DECODE(RaidNote_Struct, structs::RaidNote_Struct, note);
|
||||||
|
|
||||||
|
IN(general.action);
|
||||||
|
IN(general.parameter);
|
||||||
|
IN_str(general.leader_name);
|
||||||
|
IN_str(general.player_name);
|
||||||
|
IN_str(note);
|
||||||
|
|
||||||
|
FINISH_VAR_DECODE();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
||||||
|
IN(action);
|
||||||
|
IN(parameter);
|
||||||
|
IN_str(leader_name);
|
||||||
|
IN_str(player_name);
|
||||||
|
|
||||||
|
FINISH_DIRECT_DECODE();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DECODE(OP_ReadBook)
|
DECODE(OP_ReadBook)
|
||||||
@@ -3664,7 +3724,8 @@ namespace UF
|
|||||||
SETUP_DIRECT_DECODE(BookRequest_Struct, structs::BookRequest_Struct);
|
SETUP_DIRECT_DECODE(BookRequest_Struct, structs::BookRequest_Struct);
|
||||||
|
|
||||||
IN(type);
|
IN(type);
|
||||||
emu->invslot = UFToServerSlot(eq->invslot);
|
emu->invslot = static_cast<int16_t>(UFToServerSlot(eq->invslot));
|
||||||
|
IN(target_id);
|
||||||
emu->window = (uint8)eq->window;
|
emu->window = (uint8)eq->window;
|
||||||
strn0cpy(emu->txtfile, eq->txtfile, sizeof(emu->txtfile));
|
strn0cpy(emu->txtfile, eq->txtfile, sizeof(emu->txtfile));
|
||||||
|
|
||||||
|
|||||||
@@ -110,6 +110,7 @@ D(OP_ApplyPoison)
|
|||||||
D(OP_AugmentInfo)
|
D(OP_AugmentInfo)
|
||||||
D(OP_AugmentItem)
|
D(OP_AugmentItem)
|
||||||
D(OP_BazaarSearch)
|
D(OP_BazaarSearch)
|
||||||
|
D(OP_BookButton)
|
||||||
D(OP_Buff)
|
D(OP_Buff)
|
||||||
D(OP_BuffRemoveRequest)
|
D(OP_BuffRemoveRequest)
|
||||||
D(OP_CastSpell)
|
D(OP_CastSpell)
|
||||||
|
|||||||
@@ -2400,12 +2400,21 @@ struct BookText_Struct {
|
|||||||
// This is just a "text file" on the server
|
// This is just a "text file" on the server
|
||||||
// or in our case, the 'name' column in our books table.
|
// or in our case, the 'name' column in our books table.
|
||||||
struct BookRequest_Struct {
|
struct BookRequest_Struct {
|
||||||
/*0000*/ uint32 window; // where to display the text (0xFFFFFFFF means new window).
|
/*0000*/ uint32 window; // where to display the text (0xFFFFFFFF means new window).
|
||||||
/*0004*/ uint32 invslot; // The inventory slot the book is in. Not used, but echoed in the response packet.
|
/*0004*/ uint32 invslot; // The inventory slot the book is in
|
||||||
/*0008*/ uint32 type; // 0 = Scroll, 1 = Book, 2 = Item Info. Possibly others
|
/*0008*/ uint32 type; // 0 = Scroll, 1 = Book, 2 = Item Info. Possibly others
|
||||||
/*0012*/ uint32 unknown0012;
|
/*0012*/ uint32 target_id;
|
||||||
/*0016*/ uint16 unknown0016;
|
/*0016*/ uint8 can_cast;
|
||||||
/*0018*/ char txtfile[8194];
|
/*0017*/ uint8 can_scribe;
|
||||||
|
/*0018*/ char txtfile[8194];
|
||||||
|
};
|
||||||
|
|
||||||
|
// used by Scribe and CastSpell book buttons
|
||||||
|
struct BookButton_Struct
|
||||||
|
{
|
||||||
|
/*0000*/ int32 invslot;
|
||||||
|
/*0004*/ int32 target_id; // client's target when using the book
|
||||||
|
/*0008*/ int32 unused; // always 0 from button packets
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -3638,9 +3647,14 @@ struct RaidAddMember_Struct {
|
|||||||
/*139*/ uint8 flags[5]; //no idea if these are needed...
|
/*139*/ uint8 flags[5]; //no idea if these are needed...
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct RaidNote_Struct {
|
||||||
|
/*000*/ RaidGeneral_Struct general;
|
||||||
|
/*140*/ char note[64];
|
||||||
|
};
|
||||||
|
|
||||||
struct RaidMOTD_Struct {
|
struct RaidMOTD_Struct {
|
||||||
/*000*/ RaidGeneral_Struct general; // leader_name and action only used
|
/*000*/ RaidGeneral_Struct general;
|
||||||
/*140*/ char motd[0]; // max size 1024, but reply is variable
|
/*140*/ char motd[1024];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RaidLeadershipUpdate_Struct {
|
struct RaidLeadershipUpdate_Struct {
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
// types
|
||||||
|
#include <limits>
|
||||||
|
#include <string>
|
||||||
|
#include <cctype>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
|
// containers
|
||||||
|
#include <iterator>
|
||||||
|
#include <set>
|
||||||
|
#include <unordered_set>
|
||||||
|
#include <map>
|
||||||
|
#include <unordered_map>
|
||||||
|
#include <list>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
// utilities
|
||||||
|
#include <iostream>
|
||||||
|
#include <cassert>
|
||||||
|
#include <cmath>
|
||||||
|
#include <memory>
|
||||||
|
#include <functional>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <utility>
|
||||||
|
#include <tuple>
|
||||||
|
#include <fstream>
|
||||||
|
#include <cstdio>
|
||||||
|
|
||||||
|
// fmt
|
||||||
|
#include <fmt/format.h>
|
||||||
|
|
||||||
|
// lua
|
||||||
|
#include "lua.hpp"
|
||||||
|
#include <luabind/luabind.hpp>
|
||||||
|
#include <luabind/object.hpp>
|
||||||
@@ -72,6 +72,8 @@ std::string GetPlatformName()
|
|||||||
return "HC";
|
return "HC";
|
||||||
case EQEmuExePlatform::ExePlatformTests:
|
case EQEmuExePlatform::ExePlatformTests:
|
||||||
return "Tests";
|
return "Tests";
|
||||||
|
case EQEmuExePlatform::ExePlatformZoneSidecar:
|
||||||
|
return "ZoneSidecar";
|
||||||
default:
|
default:
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -37,7 +37,8 @@ enum EQEmuExePlatform
|
|||||||
ExePlatformClientImport,
|
ExePlatformClientImport,
|
||||||
ExePlatformClientExport,
|
ExePlatformClientExport,
|
||||||
ExePlatformHC,
|
ExePlatformHC,
|
||||||
ExePlatformTests
|
ExePlatformTests,
|
||||||
|
ExePlatformZoneSidecar
|
||||||
};
|
};
|
||||||
|
|
||||||
void RegisterExecutablePlatform(EQEmuExePlatform p);
|
void RegisterExecutablePlatform(EQEmuExePlatform p);
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
#include <string>
|
||||||
|
#include <fstream>
|
||||||
|
#include <algorithm>
|
||||||
|
#include "process.h"
|
||||||
|
|
||||||
|
inline std::string random_string(size_t length)
|
||||||
|
{
|
||||||
|
auto randchar = []() -> char {
|
||||||
|
const char charset[] = "0123456789" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz";
|
||||||
|
const size_t max_index = (sizeof(charset) - 1);
|
||||||
|
return charset[static_cast<size_t>(std::rand()) % max_index];
|
||||||
|
};
|
||||||
|
std::string str(length, 0);
|
||||||
|
std::generate_n(str.begin(), length, randchar);
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string Process::execute(const std::string &cmd, bool return_result)
|
||||||
|
{
|
||||||
|
std::string random = "/tmp/" + random_string(25);
|
||||||
|
const char *file_name = random.c_str();
|
||||||
|
|
||||||
|
if (return_result) {
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
std::system((cmd + " > " + file_name + " 2>&1").c_str());
|
||||||
|
#else
|
||||||
|
std::system((cmd + " > " + file_name + " 2>&1").c_str());
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
std::system((cmd).c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string result;
|
||||||
|
|
||||||
|
if (return_result) {
|
||||||
|
std::ifstream file(file_name);
|
||||||
|
result = {std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>()};
|
||||||
|
std::remove(file_name);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
#ifndef EQEMU_PROCESS_H
|
||||||
|
#define EQEMU_PROCESS_H
|
||||||
|
|
||||||
|
class Process {
|
||||||
|
public:
|
||||||
|
static std::string execute(const std::string &cmd, bool return_result = true);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif //EQEMU_PROCESS_H
|
||||||
+828
-771
File diff suppressed because it is too large
Load Diff
+748
-1474
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,72 @@
|
|||||||
|
/* EQEMu: Everquest Server Emulator
|
||||||
|
Copyright (C) 2001-2016 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 RAID_H
|
||||||
|
#define RAID_H
|
||||||
|
|
||||||
|
enum { //raid packet types:
|
||||||
|
raidAdd = 0,
|
||||||
|
raidRemove2 = 1, //parameter=0
|
||||||
|
raidMemberNameChange = 2,
|
||||||
|
raidRemove1 = 3, //parameter=0xFFFFFFFF
|
||||||
|
raidNoLongerLeader = 4,
|
||||||
|
raidDisband = 5,
|
||||||
|
raidMembers = 6, //len 395+, details + members list
|
||||||
|
raidNoAssignLeadership = 7,
|
||||||
|
raidCreate = 8, //len 72
|
||||||
|
raidUnknown = 9, // unused?
|
||||||
|
raidNoRaid = 10, //parameter=0
|
||||||
|
raidChangeLootType = 11,
|
||||||
|
raidStringID = 12,
|
||||||
|
raidChangeGroupLeader = 13, //136 raid leader, new group leader, group_id?
|
||||||
|
raidSetLeaderAbilities = 14, //472
|
||||||
|
raidSetLeaderData = 15, // 14,15 SoE names, not sure on difference, 14 packet has 0x100 bytes 15 0x214 in addition to raid general
|
||||||
|
raidChangeGroup = 16, //?? len 136 old leader, new leader, 0 (preceeded with a remove2)
|
||||||
|
raidLock = 17, //len 136 leader?, leader, 0
|
||||||
|
raidUnlock = 18, //len 136 leader?, leader, 0
|
||||||
|
raidRedStringID = 19,
|
||||||
|
raidSetLeader = 20, //len 388, contains 'details' struct without members; also used for "invite to raid"
|
||||||
|
raidMakeLeader = 30,
|
||||||
|
raidSetMotd = 35,
|
||||||
|
raidSetNote = 36,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
enum { //raid command types
|
||||||
|
RaidCommandInviteIntoExisting = 0, //in use
|
||||||
|
RaidCommandAcceptInvite = 1, //in use
|
||||||
|
RaidCommandInvite = 3, //in use
|
||||||
|
RaidCommandDisband = 5, //in use
|
||||||
|
RaidCommandMoveGroup = 6, //in use
|
||||||
|
RaidCommandRemoveGroupLeader = 7,
|
||||||
|
RaidCommandRaidLock = 8, //in use
|
||||||
|
RaidCommandRaidUnlock = 9, //in use
|
||||||
|
RaidCommandLootType = 20, //in use
|
||||||
|
RaidCommandAddLooter = 21, //in use
|
||||||
|
RaidCommandRemoveLooter = 22, //in use
|
||||||
|
RaidCommandMakeLeader = 30,
|
||||||
|
RaidCommandInviteFail = 31, //already in raid, waiting on invite from other raid, etc
|
||||||
|
RaidCommandLootType2 = 32, //in use
|
||||||
|
RaidCommandAddLooter2 = 33, //in use
|
||||||
|
RaidCommandRemoveLooter2 = 34, //in use
|
||||||
|
RaidCommandSetMotd = 35,
|
||||||
|
RaidCommandSetNote = 36,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -44,7 +44,35 @@ public:
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// Custom extended repository methods here
|
// Custom extended repository methods here
|
||||||
|
static void ClearFlag(
|
||||||
|
Database& db,
|
||||||
|
AccountFlagsRepository::AccountFlags e
|
||||||
|
) {
|
||||||
|
AccountFlagsRepository::DeleteWhere(
|
||||||
|
database,
|
||||||
|
fmt::format(
|
||||||
|
"p_accid = {} AND p_flag = '{}'",
|
||||||
|
e.p_accid,
|
||||||
|
Strings::Escape(e.p_flag)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ReplaceFlag(
|
||||||
|
Database& db,
|
||||||
|
AccountFlagsRepository::AccountFlags e
|
||||||
|
) {
|
||||||
|
db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"REPLACE INTO {} ({}) VALUES ({}, '{}', '{}')",
|
||||||
|
TableName(),
|
||||||
|
ColumnsRaw(),
|
||||||
|
e.p_accid,
|
||||||
|
Strings::Escape(e.p_flag),
|
||||||
|
Strings::Escape(e.p_value)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //EQEMU_ACCOUNT_FLAGS_REPOSITORY_H
|
#endif //EQEMU_ACCOUNT_FLAGS_REPOSITORY_H
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
#include "../../strings.h"
|
#include "../../strings.h"
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
|
|
||||||
|
|
||||||
class BaseBlockedSpellsRepository {
|
class BaseBlockedSpellsRepository {
|
||||||
public:
|
public:
|
||||||
struct BlockedSpells {
|
struct BlockedSpells {
|
||||||
@@ -31,6 +32,10 @@ public:
|
|||||||
float z_diff;
|
float z_diff;
|
||||||
std::string message;
|
std::string message;
|
||||||
std::string description;
|
std::string description;
|
||||||
|
int8_t min_expansion;
|
||||||
|
int8_t max_expansion;
|
||||||
|
std::string content_flags;
|
||||||
|
std::string content_flags_disabled;
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::string PrimaryKey()
|
static std::string PrimaryKey()
|
||||||
@@ -53,6 +58,10 @@ public:
|
|||||||
"z_diff",
|
"z_diff",
|
||||||
"message",
|
"message",
|
||||||
"description",
|
"description",
|
||||||
|
"min_expansion",
|
||||||
|
"max_expansion",
|
||||||
|
"content_flags",
|
||||||
|
"content_flags_disabled",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,6 +80,10 @@ public:
|
|||||||
"z_diff",
|
"z_diff",
|
||||||
"message",
|
"message",
|
||||||
"description",
|
"description",
|
||||||
|
"min_expansion",
|
||||||
|
"max_expansion",
|
||||||
|
"content_flags",
|
||||||
|
"content_flags_disabled",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,18 +124,22 @@ public:
|
|||||||
{
|
{
|
||||||
BlockedSpells e{};
|
BlockedSpells e{};
|
||||||
|
|
||||||
e.id = 0;
|
e.id = 0;
|
||||||
e.spellid = 0;
|
e.spellid = 0;
|
||||||
e.type = 0;
|
e.type = 0;
|
||||||
e.zoneid = 0;
|
e.zoneid = 0;
|
||||||
e.x = 0;
|
e.x = 0;
|
||||||
e.y = 0;
|
e.y = 0;
|
||||||
e.z = 0;
|
e.z = 0;
|
||||||
e.x_diff = 0;
|
e.x_diff = 0;
|
||||||
e.y_diff = 0;
|
e.y_diff = 0;
|
||||||
e.z_diff = 0;
|
e.z_diff = 0;
|
||||||
e.message = "";
|
e.message = "";
|
||||||
e.description = "";
|
e.description = "";
|
||||||
|
e.min_expansion = -1;
|
||||||
|
e.max_expansion = -1;
|
||||||
|
e.content_flags = "";
|
||||||
|
e.content_flags_disabled = "";
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@@ -148,8 +165,9 @@ public:
|
|||||||
{
|
{
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
"{} WHERE id = {} LIMIT 1",
|
"{} WHERE {} = {} LIMIT 1",
|
||||||
BaseSelect(),
|
BaseSelect(),
|
||||||
|
PrimaryKey(),
|
||||||
blocked_spells_id
|
blocked_spells_id
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -158,18 +176,22 @@ public:
|
|||||||
if (results.RowCount() == 1) {
|
if (results.RowCount() == 1) {
|
||||||
BlockedSpells e{};
|
BlockedSpells e{};
|
||||||
|
|
||||||
e.id = static_cast<int32_t>(atoi(row[0]));
|
e.id = static_cast<int32_t>(atoi(row[0]));
|
||||||
e.spellid = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
e.spellid = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
||||||
e.type = static_cast<int8_t>(atoi(row[2]));
|
e.type = static_cast<int8_t>(atoi(row[2]));
|
||||||
e.zoneid = static_cast<int32_t>(atoi(row[3]));
|
e.zoneid = static_cast<int32_t>(atoi(row[3]));
|
||||||
e.x = strtof(row[4], nullptr);
|
e.x = strtof(row[4], nullptr);
|
||||||
e.y = strtof(row[5], nullptr);
|
e.y = strtof(row[5], nullptr);
|
||||||
e.z = strtof(row[6], nullptr);
|
e.z = strtof(row[6], nullptr);
|
||||||
e.x_diff = strtof(row[7], nullptr);
|
e.x_diff = strtof(row[7], nullptr);
|
||||||
e.y_diff = strtof(row[8], nullptr);
|
e.y_diff = strtof(row[8], nullptr);
|
||||||
e.z_diff = strtof(row[9], nullptr);
|
e.z_diff = strtof(row[9], nullptr);
|
||||||
e.message = row[10] ? row[10] : "";
|
e.message = row[10] ? row[10] : "";
|
||||||
e.description = row[11] ? row[11] : "";
|
e.description = row[11] ? row[11] : "";
|
||||||
|
e.min_expansion = static_cast<int8_t>(atoi(row[12]));
|
||||||
|
e.max_expansion = static_cast<int8_t>(atoi(row[13]));
|
||||||
|
e.content_flags = row[14] ? row[14] : "";
|
||||||
|
e.content_flags_disabled = row[15] ? row[15] : "";
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@@ -214,6 +236,10 @@ public:
|
|||||||
v.push_back(columns[9] + " = " + std::to_string(e.z_diff));
|
v.push_back(columns[9] + " = " + std::to_string(e.z_diff));
|
||||||
v.push_back(columns[10] + " = '" + Strings::Escape(e.message) + "'");
|
v.push_back(columns[10] + " = '" + Strings::Escape(e.message) + "'");
|
||||||
v.push_back(columns[11] + " = '" + Strings::Escape(e.description) + "'");
|
v.push_back(columns[11] + " = '" + Strings::Escape(e.description) + "'");
|
||||||
|
v.push_back(columns[12] + " = " + std::to_string(e.min_expansion));
|
||||||
|
v.push_back(columns[13] + " = " + std::to_string(e.max_expansion));
|
||||||
|
v.push_back(columns[14] + " = '" + Strings::Escape(e.content_flags) + "'");
|
||||||
|
v.push_back(columns[15] + " = '" + Strings::Escape(e.content_flags_disabled) + "'");
|
||||||
|
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
@@ -247,6 +273,10 @@ public:
|
|||||||
v.push_back(std::to_string(e.z_diff));
|
v.push_back(std::to_string(e.z_diff));
|
||||||
v.push_back("'" + Strings::Escape(e.message) + "'");
|
v.push_back("'" + Strings::Escape(e.message) + "'");
|
||||||
v.push_back("'" + Strings::Escape(e.description) + "'");
|
v.push_back("'" + Strings::Escape(e.description) + "'");
|
||||||
|
v.push_back(std::to_string(e.min_expansion));
|
||||||
|
v.push_back(std::to_string(e.max_expansion));
|
||||||
|
v.push_back("'" + Strings::Escape(e.content_flags) + "'");
|
||||||
|
v.push_back("'" + Strings::Escape(e.content_flags_disabled) + "'");
|
||||||
|
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
@@ -288,6 +318,10 @@ public:
|
|||||||
v.push_back(std::to_string(e.z_diff));
|
v.push_back(std::to_string(e.z_diff));
|
||||||
v.push_back("'" + Strings::Escape(e.message) + "'");
|
v.push_back("'" + Strings::Escape(e.message) + "'");
|
||||||
v.push_back("'" + Strings::Escape(e.description) + "'");
|
v.push_back("'" + Strings::Escape(e.description) + "'");
|
||||||
|
v.push_back(std::to_string(e.min_expansion));
|
||||||
|
v.push_back(std::to_string(e.max_expansion));
|
||||||
|
v.push_back("'" + Strings::Escape(e.content_flags) + "'");
|
||||||
|
v.push_back("'" + Strings::Escape(e.content_flags_disabled) + "'");
|
||||||
|
|
||||||
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
||||||
}
|
}
|
||||||
@@ -321,18 +355,22 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
BlockedSpells e{};
|
BlockedSpells e{};
|
||||||
|
|
||||||
e.id = static_cast<int32_t>(atoi(row[0]));
|
e.id = static_cast<int32_t>(atoi(row[0]));
|
||||||
e.spellid = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
e.spellid = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
||||||
e.type = static_cast<int8_t>(atoi(row[2]));
|
e.type = static_cast<int8_t>(atoi(row[2]));
|
||||||
e.zoneid = static_cast<int32_t>(atoi(row[3]));
|
e.zoneid = static_cast<int32_t>(atoi(row[3]));
|
||||||
e.x = strtof(row[4], nullptr);
|
e.x = strtof(row[4], nullptr);
|
||||||
e.y = strtof(row[5], nullptr);
|
e.y = strtof(row[5], nullptr);
|
||||||
e.z = strtof(row[6], nullptr);
|
e.z = strtof(row[6], nullptr);
|
||||||
e.x_diff = strtof(row[7], nullptr);
|
e.x_diff = strtof(row[7], nullptr);
|
||||||
e.y_diff = strtof(row[8], nullptr);
|
e.y_diff = strtof(row[8], nullptr);
|
||||||
e.z_diff = strtof(row[9], nullptr);
|
e.z_diff = strtof(row[9], nullptr);
|
||||||
e.message = row[10] ? row[10] : "";
|
e.message = row[10] ? row[10] : "";
|
||||||
e.description = row[11] ? row[11] : "";
|
e.description = row[11] ? row[11] : "";
|
||||||
|
e.min_expansion = static_cast<int8_t>(atoi(row[12]));
|
||||||
|
e.max_expansion = static_cast<int8_t>(atoi(row[13]));
|
||||||
|
e.content_flags = row[14] ? row[14] : "";
|
||||||
|
e.content_flags_disabled = row[15] ? row[15] : "";
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -357,18 +395,22 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
BlockedSpells e{};
|
BlockedSpells e{};
|
||||||
|
|
||||||
e.id = static_cast<int32_t>(atoi(row[0]));
|
e.id = static_cast<int32_t>(atoi(row[0]));
|
||||||
e.spellid = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
e.spellid = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
||||||
e.type = static_cast<int8_t>(atoi(row[2]));
|
e.type = static_cast<int8_t>(atoi(row[2]));
|
||||||
e.zoneid = static_cast<int32_t>(atoi(row[3]));
|
e.zoneid = static_cast<int32_t>(atoi(row[3]));
|
||||||
e.x = strtof(row[4], nullptr);
|
e.x = strtof(row[4], nullptr);
|
||||||
e.y = strtof(row[5], nullptr);
|
e.y = strtof(row[5], nullptr);
|
||||||
e.z = strtof(row[6], nullptr);
|
e.z = strtof(row[6], nullptr);
|
||||||
e.x_diff = strtof(row[7], nullptr);
|
e.x_diff = strtof(row[7], nullptr);
|
||||||
e.y_diff = strtof(row[8], nullptr);
|
e.y_diff = strtof(row[8], nullptr);
|
||||||
e.z_diff = strtof(row[9], nullptr);
|
e.z_diff = strtof(row[9], nullptr);
|
||||||
e.message = row[10] ? row[10] : "";
|
e.message = row[10] ? row[10] : "";
|
||||||
e.description = row[11] ? row[11] : "";
|
e.description = row[11] ? row[11] : "";
|
||||||
|
e.min_expansion = static_cast<int8_t>(atoi(row[12]));
|
||||||
|
e.max_expansion = static_cast<int8_t>(atoi(row[13]));
|
||||||
|
e.content_flags = row[14] ? row[14] : "";
|
||||||
|
e.content_flags_disabled = row[15] ? row[15] : "";
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,414 @@
|
|||||||
|
/**
|
||||||
|
* DO NOT MODIFY THIS FILE
|
||||||
|
*
|
||||||
|
* This repository was automatically generated and is NOT to be modified directly.
|
||||||
|
* Any repository modifications are meant to be made to the repository extending the base.
|
||||||
|
* Any modifications to base repositories are to be made by the generator only
|
||||||
|
*
|
||||||
|
* @generator ./utils/scripts/generators/repository-generator.pl
|
||||||
|
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef EQEMU_BASE_BOT_STARTING_ITEMS_REPOSITORY_H
|
||||||
|
#define EQEMU_BASE_BOT_STARTING_ITEMS_REPOSITORY_H
|
||||||
|
|
||||||
|
#include "../../database.h"
|
||||||
|
#include "../../strings.h"
|
||||||
|
#include <ctime>
|
||||||
|
|
||||||
|
|
||||||
|
class BaseBotStartingItemsRepository {
|
||||||
|
public:
|
||||||
|
struct BotStartingItems {
|
||||||
|
uint32_t id;
|
||||||
|
uint32_t races;
|
||||||
|
uint32_t classes;
|
||||||
|
uint32_t item_id;
|
||||||
|
uint8_t item_charges;
|
||||||
|
int32_t slot_id;
|
||||||
|
int8_t min_expansion;
|
||||||
|
int8_t max_expansion;
|
||||||
|
std::string content_flags;
|
||||||
|
std::string content_flags_disabled;
|
||||||
|
};
|
||||||
|
|
||||||
|
static std::string PrimaryKey()
|
||||||
|
{
|
||||||
|
return std::string("id");
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::vector<std::string> Columns()
|
||||||
|
{
|
||||||
|
return {
|
||||||
|
"id",
|
||||||
|
"races",
|
||||||
|
"classes",
|
||||||
|
"item_id",
|
||||||
|
"item_charges",
|
||||||
|
"slot_id",
|
||||||
|
"min_expansion",
|
||||||
|
"max_expansion",
|
||||||
|
"content_flags",
|
||||||
|
"content_flags_disabled",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::vector<std::string> SelectColumns()
|
||||||
|
{
|
||||||
|
return {
|
||||||
|
"id",
|
||||||
|
"races",
|
||||||
|
"classes",
|
||||||
|
"item_id",
|
||||||
|
"item_charges",
|
||||||
|
"slot_id",
|
||||||
|
"min_expansion",
|
||||||
|
"max_expansion",
|
||||||
|
"content_flags",
|
||||||
|
"content_flags_disabled",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string ColumnsRaw()
|
||||||
|
{
|
||||||
|
return std::string(Strings::Implode(", ", Columns()));
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string SelectColumnsRaw()
|
||||||
|
{
|
||||||
|
return std::string(Strings::Implode(", ", SelectColumns()));
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string TableName()
|
||||||
|
{
|
||||||
|
return std::string("bot_starting_items");
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string BaseSelect()
|
||||||
|
{
|
||||||
|
return fmt::format(
|
||||||
|
"SELECT {} FROM {}",
|
||||||
|
SelectColumnsRaw(),
|
||||||
|
TableName()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string BaseInsert()
|
||||||
|
{
|
||||||
|
return fmt::format(
|
||||||
|
"INSERT INTO {} ({}) ",
|
||||||
|
TableName(),
|
||||||
|
ColumnsRaw()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static BotStartingItems NewEntity()
|
||||||
|
{
|
||||||
|
BotStartingItems e{};
|
||||||
|
|
||||||
|
e.id = 0;
|
||||||
|
e.races = 0;
|
||||||
|
e.classes = 0;
|
||||||
|
e.item_id = 0;
|
||||||
|
e.item_charges = 1;
|
||||||
|
e.slot_id = -1;
|
||||||
|
e.min_expansion = -1;
|
||||||
|
e.max_expansion = -1;
|
||||||
|
e.content_flags = "";
|
||||||
|
e.content_flags_disabled = "";
|
||||||
|
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
static BotStartingItems GetBotStartingItems(
|
||||||
|
const std::vector<BotStartingItems> &bot_starting_itemss,
|
||||||
|
int bot_starting_items_id
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (auto &bot_starting_items : bot_starting_itemss) {
|
||||||
|
if (bot_starting_items.id == bot_starting_items_id) {
|
||||||
|
return bot_starting_items;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NewEntity();
|
||||||
|
}
|
||||||
|
|
||||||
|
static BotStartingItems FindOne(
|
||||||
|
Database& db,
|
||||||
|
int bot_starting_items_id
|
||||||
|
)
|
||||||
|
{
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"{} WHERE {} = {} LIMIT 1",
|
||||||
|
BaseSelect(),
|
||||||
|
PrimaryKey(),
|
||||||
|
bot_starting_items_id
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
auto row = results.begin();
|
||||||
|
if (results.RowCount() == 1) {
|
||||||
|
BotStartingItems e{};
|
||||||
|
|
||||||
|
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
||||||
|
e.races = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
||||||
|
e.classes = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
|
||||||
|
e.item_id = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
|
||||||
|
e.item_charges = static_cast<uint8_t>(strtoul(row[4], nullptr, 10));
|
||||||
|
e.slot_id = static_cast<int32_t>(atoi(row[5]));
|
||||||
|
e.min_expansion = static_cast<int8_t>(atoi(row[6]));
|
||||||
|
e.max_expansion = static_cast<int8_t>(atoi(row[7]));
|
||||||
|
e.content_flags = row[8] ? row[8] : "";
|
||||||
|
e.content_flags_disabled = row[9] ? row[9] : "";
|
||||||
|
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NewEntity();
|
||||||
|
}
|
||||||
|
|
||||||
|
static int DeleteOne(
|
||||||
|
Database& db,
|
||||||
|
int bot_starting_items_id
|
||||||
|
)
|
||||||
|
{
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"DELETE FROM {} WHERE {} = {}",
|
||||||
|
TableName(),
|
||||||
|
PrimaryKey(),
|
||||||
|
bot_starting_items_id
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() ? results.RowsAffected() : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int UpdateOne(
|
||||||
|
Database& db,
|
||||||
|
const BotStartingItems &e
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
auto columns = Columns();
|
||||||
|
|
||||||
|
v.push_back(columns[1] + " = " + std::to_string(e.races));
|
||||||
|
v.push_back(columns[2] + " = " + std::to_string(e.classes));
|
||||||
|
v.push_back(columns[3] + " = " + std::to_string(e.item_id));
|
||||||
|
v.push_back(columns[4] + " = " + std::to_string(e.item_charges));
|
||||||
|
v.push_back(columns[5] + " = " + std::to_string(e.slot_id));
|
||||||
|
v.push_back(columns[6] + " = " + std::to_string(e.min_expansion));
|
||||||
|
v.push_back(columns[7] + " = " + std::to_string(e.max_expansion));
|
||||||
|
v.push_back(columns[8] + " = '" + Strings::Escape(e.content_flags) + "'");
|
||||||
|
v.push_back(columns[9] + " = '" + Strings::Escape(e.content_flags_disabled) + "'");
|
||||||
|
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"UPDATE {} SET {} WHERE {} = {}",
|
||||||
|
TableName(),
|
||||||
|
Strings::Implode(", ", v),
|
||||||
|
PrimaryKey(),
|
||||||
|
e.id
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() ? results.RowsAffected() : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static BotStartingItems InsertOne(
|
||||||
|
Database& db,
|
||||||
|
BotStartingItems e
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.id));
|
||||||
|
v.push_back(std::to_string(e.races));
|
||||||
|
v.push_back(std::to_string(e.classes));
|
||||||
|
v.push_back(std::to_string(e.item_id));
|
||||||
|
v.push_back(std::to_string(e.item_charges));
|
||||||
|
v.push_back(std::to_string(e.slot_id));
|
||||||
|
v.push_back(std::to_string(e.min_expansion));
|
||||||
|
v.push_back(std::to_string(e.max_expansion));
|
||||||
|
v.push_back("'" + Strings::Escape(e.content_flags) + "'");
|
||||||
|
v.push_back("'" + Strings::Escape(e.content_flags_disabled) + "'");
|
||||||
|
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"{} VALUES ({})",
|
||||||
|
BaseInsert(),
|
||||||
|
Strings::Implode(",", v)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (results.Success()) {
|
||||||
|
e.id = results.LastInsertedID();
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
e = NewEntity();
|
||||||
|
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int InsertMany(
|
||||||
|
Database& db,
|
||||||
|
const std::vector<BotStartingItems> &entries
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> insert_chunks;
|
||||||
|
|
||||||
|
for (auto &e: entries) {
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.id));
|
||||||
|
v.push_back(std::to_string(e.races));
|
||||||
|
v.push_back(std::to_string(e.classes));
|
||||||
|
v.push_back(std::to_string(e.item_id));
|
||||||
|
v.push_back(std::to_string(e.item_charges));
|
||||||
|
v.push_back(std::to_string(e.slot_id));
|
||||||
|
v.push_back(std::to_string(e.min_expansion));
|
||||||
|
v.push_back(std::to_string(e.max_expansion));
|
||||||
|
v.push_back("'" + Strings::Escape(e.content_flags) + "'");
|
||||||
|
v.push_back("'" + Strings::Escape(e.content_flags_disabled) + "'");
|
||||||
|
|
||||||
|
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"{} VALUES {}",
|
||||||
|
BaseInsert(),
|
||||||
|
Strings::Implode(",", insert_chunks)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() ? results.RowsAffected() : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::vector<BotStartingItems> All(Database& db)
|
||||||
|
{
|
||||||
|
std::vector<BotStartingItems> all_entries;
|
||||||
|
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"{}",
|
||||||
|
BaseSelect()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
all_entries.reserve(results.RowCount());
|
||||||
|
|
||||||
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
|
BotStartingItems e{};
|
||||||
|
|
||||||
|
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
||||||
|
e.races = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
||||||
|
e.classes = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
|
||||||
|
e.item_id = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
|
||||||
|
e.item_charges = static_cast<uint8_t>(strtoul(row[4], nullptr, 10));
|
||||||
|
e.slot_id = static_cast<int32_t>(atoi(row[5]));
|
||||||
|
e.min_expansion = static_cast<int8_t>(atoi(row[6]));
|
||||||
|
e.max_expansion = static_cast<int8_t>(atoi(row[7]));
|
||||||
|
e.content_flags = row[8] ? row[8] : "";
|
||||||
|
e.content_flags_disabled = row[9] ? row[9] : "";
|
||||||
|
|
||||||
|
all_entries.push_back(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return all_entries;
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::vector<BotStartingItems> GetWhere(Database& db, const std::string &where_filter)
|
||||||
|
{
|
||||||
|
std::vector<BotStartingItems> all_entries;
|
||||||
|
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"{} WHERE {}",
|
||||||
|
BaseSelect(),
|
||||||
|
where_filter
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
all_entries.reserve(results.RowCount());
|
||||||
|
|
||||||
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
|
BotStartingItems e{};
|
||||||
|
|
||||||
|
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
||||||
|
e.races = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
||||||
|
e.classes = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
|
||||||
|
e.item_id = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
|
||||||
|
e.item_charges = static_cast<uint8_t>(strtoul(row[4], nullptr, 10));
|
||||||
|
e.slot_id = static_cast<int32_t>(atoi(row[5]));
|
||||||
|
e.min_expansion = static_cast<int8_t>(atoi(row[6]));
|
||||||
|
e.max_expansion = static_cast<int8_t>(atoi(row[7]));
|
||||||
|
e.content_flags = row[8] ? row[8] : "";
|
||||||
|
e.content_flags_disabled = row[9] ? row[9] : "";
|
||||||
|
|
||||||
|
all_entries.push_back(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return all_entries;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int DeleteWhere(Database& db, const std::string &where_filter)
|
||||||
|
{
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"DELETE FROM {} WHERE {}",
|
||||||
|
TableName(),
|
||||||
|
where_filter
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() ? results.RowsAffected() : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int Truncate(Database& db)
|
||||||
|
{
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"TRUNCATE TABLE {}",
|
||||||
|
TableName()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() ? results.RowsAffected() : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int64 GetMaxId(Database& db)
|
||||||
|
{
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"SELECT COALESCE(MAX({}), 0) FROM {}",
|
||||||
|
PrimaryKey(),
|
||||||
|
TableName()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int64 Count(Database& db, const std::string &where_filter = "")
|
||||||
|
{
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"SELECT COUNT(*) FROM {} {}",
|
||||||
|
TableName(),
|
||||||
|
(where_filter.empty() ? "" : "WHERE " + where_filter)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //EQEMU_BASE_BOT_STARTING_ITEMS_REPOSITORY_H
|
||||||
@@ -16,12 +16,19 @@
|
|||||||
#include "../../strings.h"
|
#include "../../strings.h"
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
|
|
||||||
|
|
||||||
class BaseBotTimersRepository {
|
class BaseBotTimersRepository {
|
||||||
public:
|
public:
|
||||||
struct BotTimers {
|
struct BotTimers {
|
||||||
uint32_t bot_id;
|
uint32_t bot_id;
|
||||||
uint32_t timer_id;
|
uint32_t timer_id;
|
||||||
uint32_t timer_value;
|
uint32_t timer_value;
|
||||||
|
uint32_t recast_time;
|
||||||
|
uint8_t is_spell;
|
||||||
|
uint8_t is_disc;
|
||||||
|
uint32_t spell_id;
|
||||||
|
uint8_t is_item;
|
||||||
|
uint32_t item_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::string PrimaryKey()
|
static std::string PrimaryKey()
|
||||||
@@ -35,6 +42,12 @@ public:
|
|||||||
"bot_id",
|
"bot_id",
|
||||||
"timer_id",
|
"timer_id",
|
||||||
"timer_value",
|
"timer_value",
|
||||||
|
"recast_time",
|
||||||
|
"is_spell",
|
||||||
|
"is_disc",
|
||||||
|
"spell_id",
|
||||||
|
"is_item",
|
||||||
|
"item_id",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -44,6 +57,12 @@ public:
|
|||||||
"bot_id",
|
"bot_id",
|
||||||
"timer_id",
|
"timer_id",
|
||||||
"timer_value",
|
"timer_value",
|
||||||
|
"recast_time",
|
||||||
|
"is_spell",
|
||||||
|
"is_disc",
|
||||||
|
"spell_id",
|
||||||
|
"is_item",
|
||||||
|
"item_id",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,6 +106,12 @@ public:
|
|||||||
e.bot_id = 0;
|
e.bot_id = 0;
|
||||||
e.timer_id = 0;
|
e.timer_id = 0;
|
||||||
e.timer_value = 0;
|
e.timer_value = 0;
|
||||||
|
e.recast_time = 0;
|
||||||
|
e.is_spell = 0;
|
||||||
|
e.is_disc = 0;
|
||||||
|
e.spell_id = 0;
|
||||||
|
e.is_item = 0;
|
||||||
|
e.item_id = 0;
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@@ -112,8 +137,9 @@ public:
|
|||||||
{
|
{
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
"{} WHERE id = {} LIMIT 1",
|
"{} WHERE {} = {} LIMIT 1",
|
||||||
BaseSelect(),
|
BaseSelect(),
|
||||||
|
PrimaryKey(),
|
||||||
bot_timers_id
|
bot_timers_id
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -125,6 +151,12 @@ public:
|
|||||||
e.bot_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.bot_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
||||||
e.timer_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
e.timer_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
||||||
e.timer_value = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
|
e.timer_value = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
|
||||||
|
e.recast_time = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
|
||||||
|
e.is_spell = static_cast<uint8_t>(strtoul(row[4], nullptr, 10));
|
||||||
|
e.is_disc = static_cast<uint8_t>(strtoul(row[5], nullptr, 10));
|
||||||
|
e.spell_id = static_cast<uint32_t>(strtoul(row[6], nullptr, 10));
|
||||||
|
e.is_item = static_cast<uint8_t>(strtoul(row[7], nullptr, 10));
|
||||||
|
e.item_id = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@@ -161,6 +193,12 @@ public:
|
|||||||
v.push_back(columns[0] + " = " + std::to_string(e.bot_id));
|
v.push_back(columns[0] + " = " + std::to_string(e.bot_id));
|
||||||
v.push_back(columns[1] + " = " + std::to_string(e.timer_id));
|
v.push_back(columns[1] + " = " + std::to_string(e.timer_id));
|
||||||
v.push_back(columns[2] + " = " + std::to_string(e.timer_value));
|
v.push_back(columns[2] + " = " + std::to_string(e.timer_value));
|
||||||
|
v.push_back(columns[3] + " = " + std::to_string(e.recast_time));
|
||||||
|
v.push_back(columns[4] + " = " + std::to_string(e.is_spell));
|
||||||
|
v.push_back(columns[5] + " = " + std::to_string(e.is_disc));
|
||||||
|
v.push_back(columns[6] + " = " + std::to_string(e.spell_id));
|
||||||
|
v.push_back(columns[7] + " = " + std::to_string(e.is_item));
|
||||||
|
v.push_back(columns[8] + " = " + std::to_string(e.item_id));
|
||||||
|
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
@@ -185,6 +223,12 @@ public:
|
|||||||
v.push_back(std::to_string(e.bot_id));
|
v.push_back(std::to_string(e.bot_id));
|
||||||
v.push_back(std::to_string(e.timer_id));
|
v.push_back(std::to_string(e.timer_id));
|
||||||
v.push_back(std::to_string(e.timer_value));
|
v.push_back(std::to_string(e.timer_value));
|
||||||
|
v.push_back(std::to_string(e.recast_time));
|
||||||
|
v.push_back(std::to_string(e.is_spell));
|
||||||
|
v.push_back(std::to_string(e.is_disc));
|
||||||
|
v.push_back(std::to_string(e.spell_id));
|
||||||
|
v.push_back(std::to_string(e.is_item));
|
||||||
|
v.push_back(std::to_string(e.item_id));
|
||||||
|
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
@@ -217,6 +261,12 @@ public:
|
|||||||
v.push_back(std::to_string(e.bot_id));
|
v.push_back(std::to_string(e.bot_id));
|
||||||
v.push_back(std::to_string(e.timer_id));
|
v.push_back(std::to_string(e.timer_id));
|
||||||
v.push_back(std::to_string(e.timer_value));
|
v.push_back(std::to_string(e.timer_value));
|
||||||
|
v.push_back(std::to_string(e.recast_time));
|
||||||
|
v.push_back(std::to_string(e.is_spell));
|
||||||
|
v.push_back(std::to_string(e.is_disc));
|
||||||
|
v.push_back(std::to_string(e.spell_id));
|
||||||
|
v.push_back(std::to_string(e.is_item));
|
||||||
|
v.push_back(std::to_string(e.item_id));
|
||||||
|
|
||||||
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
||||||
}
|
}
|
||||||
@@ -253,6 +303,12 @@ public:
|
|||||||
e.bot_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.bot_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
||||||
e.timer_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
e.timer_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
||||||
e.timer_value = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
|
e.timer_value = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
|
||||||
|
e.recast_time = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
|
||||||
|
e.is_spell = static_cast<uint8_t>(strtoul(row[4], nullptr, 10));
|
||||||
|
e.is_disc = static_cast<uint8_t>(strtoul(row[5], nullptr, 10));
|
||||||
|
e.spell_id = static_cast<uint32_t>(strtoul(row[6], nullptr, 10));
|
||||||
|
e.is_item = static_cast<uint8_t>(strtoul(row[7], nullptr, 10));
|
||||||
|
e.item_id = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -280,6 +336,12 @@ public:
|
|||||||
e.bot_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.bot_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
||||||
e.timer_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
e.timer_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
||||||
e.timer_value = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
|
e.timer_value = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
|
||||||
|
e.recast_time = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
|
||||||
|
e.is_spell = static_cast<uint8_t>(strtoul(row[4], nullptr, 10));
|
||||||
|
e.is_disc = static_cast<uint8_t>(strtoul(row[5], nullptr, 10));
|
||||||
|
e.spell_id = static_cast<uint32_t>(strtoul(row[6], nullptr, 10));
|
||||||
|
e.is_item = static_cast<uint8_t>(strtoul(row[7], nullptr, 10));
|
||||||
|
e.item_id = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,364 @@
|
|||||||
|
/**
|
||||||
|
* DO NOT MODIFY THIS FILE
|
||||||
|
*
|
||||||
|
* This repository was automatically generated and is NOT to be modified directly.
|
||||||
|
* Any repository modifications are meant to be made to the repository extending the base.
|
||||||
|
* Any modifications to base repositories are to be made by the generator only
|
||||||
|
*
|
||||||
|
* @generator ./utils/scripts/generators/repository-generator.pl
|
||||||
|
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef EQEMU_BASE_COMMAND_SUBSETTINGS_REPOSITORY_H
|
||||||
|
#define EQEMU_BASE_COMMAND_SUBSETTINGS_REPOSITORY_H
|
||||||
|
|
||||||
|
#include "../../database.h"
|
||||||
|
#include "../../strings.h"
|
||||||
|
#include <ctime>
|
||||||
|
|
||||||
|
|
||||||
|
class BaseCommandSubsettingsRepository {
|
||||||
|
public:
|
||||||
|
struct CommandSubsettings {
|
||||||
|
uint32_t id;
|
||||||
|
std::string parent_command;
|
||||||
|
std::string sub_command;
|
||||||
|
uint32_t access_level;
|
||||||
|
std::string top_level_aliases;
|
||||||
|
};
|
||||||
|
|
||||||
|
static std::string PrimaryKey()
|
||||||
|
{
|
||||||
|
return std::string("id");
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::vector<std::string> Columns()
|
||||||
|
{
|
||||||
|
return {
|
||||||
|
"id",
|
||||||
|
"parent_command",
|
||||||
|
"sub_command",
|
||||||
|
"access_level",
|
||||||
|
"top_level_aliases",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::vector<std::string> SelectColumns()
|
||||||
|
{
|
||||||
|
return {
|
||||||
|
"id",
|
||||||
|
"parent_command",
|
||||||
|
"sub_command",
|
||||||
|
"access_level",
|
||||||
|
"top_level_aliases",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string ColumnsRaw()
|
||||||
|
{
|
||||||
|
return std::string(Strings::Implode(", ", Columns()));
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string SelectColumnsRaw()
|
||||||
|
{
|
||||||
|
return std::string(Strings::Implode(", ", SelectColumns()));
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string TableName()
|
||||||
|
{
|
||||||
|
return std::string("command_subsettings");
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string BaseSelect()
|
||||||
|
{
|
||||||
|
return fmt::format(
|
||||||
|
"SELECT {} FROM {}",
|
||||||
|
SelectColumnsRaw(),
|
||||||
|
TableName()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string BaseInsert()
|
||||||
|
{
|
||||||
|
return fmt::format(
|
||||||
|
"INSERT INTO {} ({}) ",
|
||||||
|
TableName(),
|
||||||
|
ColumnsRaw()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static CommandSubsettings NewEntity()
|
||||||
|
{
|
||||||
|
CommandSubsettings e{};
|
||||||
|
|
||||||
|
e.id = 0;
|
||||||
|
e.parent_command = "";
|
||||||
|
e.sub_command = "";
|
||||||
|
e.access_level = 0;
|
||||||
|
e.top_level_aliases = "";
|
||||||
|
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
static CommandSubsettings GetCommandSubsettings(
|
||||||
|
const std::vector<CommandSubsettings> &command_subsettingss,
|
||||||
|
int command_subsettings_id
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (auto &command_subsettings : command_subsettingss) {
|
||||||
|
if (command_subsettings.id == command_subsettings_id) {
|
||||||
|
return command_subsettings;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NewEntity();
|
||||||
|
}
|
||||||
|
|
||||||
|
static CommandSubsettings FindOne(
|
||||||
|
Database& db,
|
||||||
|
int command_subsettings_id
|
||||||
|
)
|
||||||
|
{
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"{} WHERE {} = {} LIMIT 1",
|
||||||
|
BaseSelect(),
|
||||||
|
PrimaryKey(),
|
||||||
|
command_subsettings_id
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
auto row = results.begin();
|
||||||
|
if (results.RowCount() == 1) {
|
||||||
|
CommandSubsettings e{};
|
||||||
|
|
||||||
|
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
||||||
|
e.parent_command = row[1] ? row[1] : "";
|
||||||
|
e.sub_command = row[2] ? row[2] : "";
|
||||||
|
e.access_level = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
|
||||||
|
e.top_level_aliases = row[4] ? row[4] : "";
|
||||||
|
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NewEntity();
|
||||||
|
}
|
||||||
|
|
||||||
|
static int DeleteOne(
|
||||||
|
Database& db,
|
||||||
|
int command_subsettings_id
|
||||||
|
)
|
||||||
|
{
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"DELETE FROM {} WHERE {} = {}",
|
||||||
|
TableName(),
|
||||||
|
PrimaryKey(),
|
||||||
|
command_subsettings_id
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() ? results.RowsAffected() : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int UpdateOne(
|
||||||
|
Database& db,
|
||||||
|
const CommandSubsettings &e
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
auto columns = Columns();
|
||||||
|
|
||||||
|
v.push_back(columns[1] + " = '" + Strings::Escape(e.parent_command) + "'");
|
||||||
|
v.push_back(columns[2] + " = '" + Strings::Escape(e.sub_command) + "'");
|
||||||
|
v.push_back(columns[3] + " = " + std::to_string(e.access_level));
|
||||||
|
v.push_back(columns[4] + " = '" + Strings::Escape(e.top_level_aliases) + "'");
|
||||||
|
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"UPDATE {} SET {} WHERE {} = {}",
|
||||||
|
TableName(),
|
||||||
|
Strings::Implode(", ", v),
|
||||||
|
PrimaryKey(),
|
||||||
|
e.id
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() ? results.RowsAffected() : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static CommandSubsettings InsertOne(
|
||||||
|
Database& db,
|
||||||
|
CommandSubsettings e
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.id));
|
||||||
|
v.push_back("'" + Strings::Escape(e.parent_command) + "'");
|
||||||
|
v.push_back("'" + Strings::Escape(e.sub_command) + "'");
|
||||||
|
v.push_back(std::to_string(e.access_level));
|
||||||
|
v.push_back("'" + Strings::Escape(e.top_level_aliases) + "'");
|
||||||
|
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"{} VALUES ({})",
|
||||||
|
BaseInsert(),
|
||||||
|
Strings::Implode(",", v)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (results.Success()) {
|
||||||
|
e.id = results.LastInsertedID();
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
e = NewEntity();
|
||||||
|
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int InsertMany(
|
||||||
|
Database& db,
|
||||||
|
const std::vector<CommandSubsettings> &entries
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> insert_chunks;
|
||||||
|
|
||||||
|
for (auto &e: entries) {
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.id));
|
||||||
|
v.push_back("'" + Strings::Escape(e.parent_command) + "'");
|
||||||
|
v.push_back("'" + Strings::Escape(e.sub_command) + "'");
|
||||||
|
v.push_back(std::to_string(e.access_level));
|
||||||
|
v.push_back("'" + Strings::Escape(e.top_level_aliases) + "'");
|
||||||
|
|
||||||
|
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"{} VALUES {}",
|
||||||
|
BaseInsert(),
|
||||||
|
Strings::Implode(",", insert_chunks)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() ? results.RowsAffected() : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::vector<CommandSubsettings> All(Database& db)
|
||||||
|
{
|
||||||
|
std::vector<CommandSubsettings> all_entries;
|
||||||
|
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"{}",
|
||||||
|
BaseSelect()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
all_entries.reserve(results.RowCount());
|
||||||
|
|
||||||
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
|
CommandSubsettings e{};
|
||||||
|
|
||||||
|
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
||||||
|
e.parent_command = row[1] ? row[1] : "";
|
||||||
|
e.sub_command = row[2] ? row[2] : "";
|
||||||
|
e.access_level = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
|
||||||
|
e.top_level_aliases = row[4] ? row[4] : "";
|
||||||
|
|
||||||
|
all_entries.push_back(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return all_entries;
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::vector<CommandSubsettings> GetWhere(Database& db, const std::string &where_filter)
|
||||||
|
{
|
||||||
|
std::vector<CommandSubsettings> all_entries;
|
||||||
|
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"{} WHERE {}",
|
||||||
|
BaseSelect(),
|
||||||
|
where_filter
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
all_entries.reserve(results.RowCount());
|
||||||
|
|
||||||
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
|
CommandSubsettings e{};
|
||||||
|
|
||||||
|
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
||||||
|
e.parent_command = row[1] ? row[1] : "";
|
||||||
|
e.sub_command = row[2] ? row[2] : "";
|
||||||
|
e.access_level = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
|
||||||
|
e.top_level_aliases = row[4] ? row[4] : "";
|
||||||
|
|
||||||
|
all_entries.push_back(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return all_entries;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int DeleteWhere(Database& db, const std::string &where_filter)
|
||||||
|
{
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"DELETE FROM {} WHERE {}",
|
||||||
|
TableName(),
|
||||||
|
where_filter
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() ? results.RowsAffected() : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int Truncate(Database& db)
|
||||||
|
{
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"TRUNCATE TABLE {}",
|
||||||
|
TableName()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() ? results.RowsAffected() : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int64 GetMaxId(Database& db)
|
||||||
|
{
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"SELECT COALESCE(MAX({}), 0) FROM {}",
|
||||||
|
PrimaryKey(),
|
||||||
|
TableName()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int64 Count(Database& db, const std::string &where_filter = "")
|
||||||
|
{
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"SELECT COUNT(*) FROM {} {}",
|
||||||
|
TableName(),
|
||||||
|
(where_filter.empty() ? "" : "WHERE " + where_filter)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //EQEMU_BASE_COMMAND_SUBSETTINGS_REPOSITORY_H
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
#include "../../database.h"
|
#include "../../database.h"
|
||||||
#include "../../strings.h"
|
#include "../../strings.h"
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
|
#include <cereal/cereal.hpp>
|
||||||
|
|
||||||
class BaseDataBucketsRepository {
|
class BaseDataBucketsRepository {
|
||||||
public:
|
public:
|
||||||
@@ -24,6 +24,24 @@ public:
|
|||||||
std::string key_;
|
std::string key_;
|
||||||
std::string value;
|
std::string value;
|
||||||
uint32_t expires;
|
uint32_t expires;
|
||||||
|
int64_t character_id;
|
||||||
|
int64_t npc_id;
|
||||||
|
int64_t bot_id;
|
||||||
|
|
||||||
|
// cereal
|
||||||
|
template<class Archive>
|
||||||
|
void serialize(Archive &ar)
|
||||||
|
{
|
||||||
|
ar(
|
||||||
|
CEREAL_NVP(id),
|
||||||
|
CEREAL_NVP(key_),
|
||||||
|
CEREAL_NVP(value),
|
||||||
|
CEREAL_NVP(expires),
|
||||||
|
CEREAL_NVP(character_id),
|
||||||
|
CEREAL_NVP(npc_id),
|
||||||
|
CEREAL_NVP(bot_id)
|
||||||
|
);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::string PrimaryKey()
|
static std::string PrimaryKey()
|
||||||
@@ -38,6 +56,9 @@ public:
|
|||||||
"`key`",
|
"`key`",
|
||||||
"value",
|
"value",
|
||||||
"expires",
|
"expires",
|
||||||
|
"character_id",
|
||||||
|
"npc_id",
|
||||||
|
"bot_id",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -48,6 +69,9 @@ public:
|
|||||||
"`key`",
|
"`key`",
|
||||||
"value",
|
"value",
|
||||||
"expires",
|
"expires",
|
||||||
|
"character_id",
|
||||||
|
"npc_id",
|
||||||
|
"bot_id",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -88,10 +112,13 @@ public:
|
|||||||
{
|
{
|
||||||
DataBuckets e{};
|
DataBuckets e{};
|
||||||
|
|
||||||
e.id = 0;
|
e.id = 0;
|
||||||
e.key_ = "";
|
e.key_ = "";
|
||||||
e.value = "";
|
e.value = "";
|
||||||
e.expires = 0;
|
e.expires = 0;
|
||||||
|
e.character_id = 0;
|
||||||
|
e.npc_id = 0;
|
||||||
|
e.bot_id = 0;
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@@ -128,10 +155,13 @@ public:
|
|||||||
if (results.RowCount() == 1) {
|
if (results.RowCount() == 1) {
|
||||||
DataBuckets e{};
|
DataBuckets e{};
|
||||||
|
|
||||||
e.id = strtoull(row[0], nullptr, 10);
|
e.id = strtoull(row[0], nullptr, 10);
|
||||||
e.key_ = row[1] ? row[1] : "";
|
e.key_ = row[1] ? row[1] : "";
|
||||||
e.value = row[2] ? row[2] : "";
|
e.value = row[2] ? row[2] : "";
|
||||||
e.expires = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
|
e.expires = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
|
||||||
|
e.character_id = strtoll(row[4], nullptr, 10);
|
||||||
|
e.npc_id = strtoll(row[5], nullptr, 10);
|
||||||
|
e.bot_id = strtoll(row[6], nullptr, 10);
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@@ -168,6 +198,9 @@ public:
|
|||||||
v.push_back(columns[1] + " = '" + Strings::Escape(e.key_) + "'");
|
v.push_back(columns[1] + " = '" + Strings::Escape(e.key_) + "'");
|
||||||
v.push_back(columns[2] + " = '" + Strings::Escape(e.value) + "'");
|
v.push_back(columns[2] + " = '" + Strings::Escape(e.value) + "'");
|
||||||
v.push_back(columns[3] + " = " + std::to_string(e.expires));
|
v.push_back(columns[3] + " = " + std::to_string(e.expires));
|
||||||
|
v.push_back(columns[4] + " = " + std::to_string(e.character_id));
|
||||||
|
v.push_back(columns[5] + " = " + std::to_string(e.npc_id));
|
||||||
|
v.push_back(columns[6] + " = " + std::to_string(e.bot_id));
|
||||||
|
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
@@ -193,6 +226,9 @@ public:
|
|||||||
v.push_back("'" + Strings::Escape(e.key_) + "'");
|
v.push_back("'" + Strings::Escape(e.key_) + "'");
|
||||||
v.push_back("'" + Strings::Escape(e.value) + "'");
|
v.push_back("'" + Strings::Escape(e.value) + "'");
|
||||||
v.push_back(std::to_string(e.expires));
|
v.push_back(std::to_string(e.expires));
|
||||||
|
v.push_back(std::to_string(e.character_id));
|
||||||
|
v.push_back(std::to_string(e.npc_id));
|
||||||
|
v.push_back(std::to_string(e.bot_id));
|
||||||
|
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
@@ -226,6 +262,9 @@ public:
|
|||||||
v.push_back("'" + Strings::Escape(e.key_) + "'");
|
v.push_back("'" + Strings::Escape(e.key_) + "'");
|
||||||
v.push_back("'" + Strings::Escape(e.value) + "'");
|
v.push_back("'" + Strings::Escape(e.value) + "'");
|
||||||
v.push_back(std::to_string(e.expires));
|
v.push_back(std::to_string(e.expires));
|
||||||
|
v.push_back(std::to_string(e.character_id));
|
||||||
|
v.push_back(std::to_string(e.npc_id));
|
||||||
|
v.push_back(std::to_string(e.bot_id));
|
||||||
|
|
||||||
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
||||||
}
|
}
|
||||||
@@ -259,10 +298,13 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
DataBuckets e{};
|
DataBuckets e{};
|
||||||
|
|
||||||
e.id = strtoull(row[0], nullptr, 10);
|
e.id = strtoull(row[0], nullptr, 10);
|
||||||
e.key_ = row[1] ? row[1] : "";
|
e.key_ = row[1] ? row[1] : "";
|
||||||
e.value = row[2] ? row[2] : "";
|
e.value = row[2] ? row[2] : "";
|
||||||
e.expires = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
|
e.expires = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
|
||||||
|
e.character_id = strtoll(row[4], nullptr, 10);
|
||||||
|
e.npc_id = strtoll(row[5], nullptr, 10);
|
||||||
|
e.bot_id = strtoll(row[6], nullptr, 10);
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -287,10 +329,13 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
DataBuckets e{};
|
DataBuckets e{};
|
||||||
|
|
||||||
e.id = strtoull(row[0], nullptr, 10);
|
e.id = strtoull(row[0], nullptr, 10);
|
||||||
e.key_ = row[1] ? row[1] : "";
|
e.key_ = row[1] ? row[1] : "";
|
||||||
e.value = row[2] ? row[2] : "";
|
e.value = row[2] ? row[2] : "";
|
||||||
e.expires = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
|
e.expires = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
|
||||||
|
e.character_id = strtoll(row[4], nullptr, 10);
|
||||||
|
e.npc_id = strtoll(row[5], nullptr, 10);
|
||||||
|
e.bot_id = strtoll(row[6], nullptr, 10);
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
#include "../../strings.h"
|
#include "../../strings.h"
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
|
|
||||||
|
|
||||||
class BaseItemsRepository {
|
class BaseItemsRepository {
|
||||||
public:
|
public:
|
||||||
struct Items {
|
struct Items {
|
||||||
@@ -74,7 +75,7 @@ public:
|
|||||||
int32_t damageshield;
|
int32_t damageshield;
|
||||||
int32_t deity;
|
int32_t deity;
|
||||||
int32_t delay;
|
int32_t delay;
|
||||||
int32_t augdistiller;
|
uint32_t augdistiller;
|
||||||
int32_t dotshielding;
|
int32_t dotshielding;
|
||||||
int32_t dr;
|
int32_t dr;
|
||||||
int32_t clicktype;
|
int32_t clicktype;
|
||||||
@@ -122,7 +123,7 @@ public:
|
|||||||
int32_t pr;
|
int32_t pr;
|
||||||
int32_t procrate;
|
int32_t procrate;
|
||||||
int32_t races;
|
int32_t races;
|
||||||
int32_t range;
|
int32_t range_;
|
||||||
int32_t reclevel;
|
int32_t reclevel;
|
||||||
int32_t recskill;
|
int32_t recskill;
|
||||||
int32_t reqlevel;
|
int32_t reqlevel;
|
||||||
@@ -226,7 +227,7 @@ public:
|
|||||||
int32_t focusunk5;
|
int32_t focusunk5;
|
||||||
std::string focusunk6;
|
std::string focusunk6;
|
||||||
int32_t focusunk7;
|
int32_t focusunk7;
|
||||||
int32_t scrollunk1;
|
uint32_t scrollunk1;
|
||||||
int32_t scrollunk2;
|
int32_t scrollunk2;
|
||||||
int32_t scrollunk3;
|
int32_t scrollunk3;
|
||||||
int32_t scrollunk4;
|
int32_t scrollunk4;
|
||||||
@@ -265,10 +266,10 @@ public:
|
|||||||
std::string created;
|
std::string created;
|
||||||
int16_t elitematerial;
|
int16_t elitematerial;
|
||||||
int16_t ldonsellbackrate;
|
int16_t ldonsellbackrate;
|
||||||
int16_t scriptfileid;
|
int32_t scriptfileid;
|
||||||
int16_t expendablearrow;
|
int16_t expendablearrow;
|
||||||
int16_t powersourcecapacity;
|
int32_t powersourcecapacity;
|
||||||
int16_t bardeffect;
|
int32_t bardeffect;
|
||||||
int16_t bardeffecttype;
|
int16_t bardeffecttype;
|
||||||
int16_t bardlevel2;
|
int16_t bardlevel2;
|
||||||
int16_t bardlevel;
|
int16_t bardlevel;
|
||||||
@@ -417,7 +418,7 @@ public:
|
|||||||
"pr",
|
"pr",
|
||||||
"procrate",
|
"procrate",
|
||||||
"races",
|
"races",
|
||||||
"range",
|
"`range`",
|
||||||
"reclevel",
|
"reclevel",
|
||||||
"recskill",
|
"recskill",
|
||||||
"reqlevel",
|
"reqlevel",
|
||||||
@@ -708,7 +709,7 @@ public:
|
|||||||
"pr",
|
"pr",
|
||||||
"procrate",
|
"procrate",
|
||||||
"races",
|
"races",
|
||||||
"range",
|
"`range`",
|
||||||
"reclevel",
|
"reclevel",
|
||||||
"recskill",
|
"recskill",
|
||||||
"reqlevel",
|
"reqlevel",
|
||||||
@@ -1033,7 +1034,7 @@ public:
|
|||||||
e.pr = 0;
|
e.pr = 0;
|
||||||
e.procrate = 0;
|
e.procrate = 0;
|
||||||
e.races = 0;
|
e.races = 0;
|
||||||
e.range = 0;
|
e.range_ = 0;
|
||||||
e.reclevel = 0;
|
e.reclevel = 0;
|
||||||
e.recskill = 0;
|
e.recskill = 0;
|
||||||
e.reqlevel = 0;
|
e.reqlevel = 0;
|
||||||
@@ -1240,8 +1241,9 @@ public:
|
|||||||
{
|
{
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
"{} WHERE id = {} LIMIT 1",
|
"{} WHERE {} = {} LIMIT 1",
|
||||||
BaseSelect(),
|
BaseSelect(),
|
||||||
|
PrimaryKey(),
|
||||||
items_id
|
items_id
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -1305,7 +1307,7 @@ public:
|
|||||||
e.damageshield = static_cast<int32_t>(atoi(row[52]));
|
e.damageshield = static_cast<int32_t>(atoi(row[52]));
|
||||||
e.deity = static_cast<int32_t>(atoi(row[53]));
|
e.deity = static_cast<int32_t>(atoi(row[53]));
|
||||||
e.delay = static_cast<int32_t>(atoi(row[54]));
|
e.delay = static_cast<int32_t>(atoi(row[54]));
|
||||||
e.augdistiller = static_cast<int32_t>(atoi(row[55]));
|
e.augdistiller = static_cast<uint32_t>(strtoul(row[55], nullptr, 10));
|
||||||
e.dotshielding = static_cast<int32_t>(atoi(row[56]));
|
e.dotshielding = static_cast<int32_t>(atoi(row[56]));
|
||||||
e.dr = static_cast<int32_t>(atoi(row[57]));
|
e.dr = static_cast<int32_t>(atoi(row[57]));
|
||||||
e.clicktype = static_cast<int32_t>(atoi(row[58]));
|
e.clicktype = static_cast<int32_t>(atoi(row[58]));
|
||||||
@@ -1353,7 +1355,7 @@ public:
|
|||||||
e.pr = static_cast<int32_t>(atoi(row[100]));
|
e.pr = static_cast<int32_t>(atoi(row[100]));
|
||||||
e.procrate = static_cast<int32_t>(atoi(row[101]));
|
e.procrate = static_cast<int32_t>(atoi(row[101]));
|
||||||
e.races = static_cast<int32_t>(atoi(row[102]));
|
e.races = static_cast<int32_t>(atoi(row[102]));
|
||||||
e.range = static_cast<int32_t>(atoi(row[103]));
|
e.range_ = static_cast<int32_t>(atoi(row[103]));
|
||||||
e.reclevel = static_cast<int32_t>(atoi(row[104]));
|
e.reclevel = static_cast<int32_t>(atoi(row[104]));
|
||||||
e.recskill = static_cast<int32_t>(atoi(row[105]));
|
e.recskill = static_cast<int32_t>(atoi(row[105]));
|
||||||
e.reqlevel = static_cast<int32_t>(atoi(row[106]));
|
e.reqlevel = static_cast<int32_t>(atoi(row[106]));
|
||||||
@@ -1457,7 +1459,7 @@ public:
|
|||||||
e.focusunk5 = static_cast<int32_t>(atoi(row[204]));
|
e.focusunk5 = static_cast<int32_t>(atoi(row[204]));
|
||||||
e.focusunk6 = row[205] ? row[205] : "";
|
e.focusunk6 = row[205] ? row[205] : "";
|
||||||
e.focusunk7 = static_cast<int32_t>(atoi(row[206]));
|
e.focusunk7 = static_cast<int32_t>(atoi(row[206]));
|
||||||
e.scrollunk1 = static_cast<int32_t>(atoi(row[207]));
|
e.scrollunk1 = static_cast<uint32_t>(strtoul(row[207], nullptr, 10));
|
||||||
e.scrollunk2 = static_cast<int32_t>(atoi(row[208]));
|
e.scrollunk2 = static_cast<int32_t>(atoi(row[208]));
|
||||||
e.scrollunk3 = static_cast<int32_t>(atoi(row[209]));
|
e.scrollunk3 = static_cast<int32_t>(atoi(row[209]));
|
||||||
e.scrollunk4 = static_cast<int32_t>(atoi(row[210]));
|
e.scrollunk4 = static_cast<int32_t>(atoi(row[210]));
|
||||||
@@ -1496,10 +1498,10 @@ public:
|
|||||||
e.created = row[243] ? row[243] : "";
|
e.created = row[243] ? row[243] : "";
|
||||||
e.elitematerial = static_cast<int16_t>(atoi(row[244]));
|
e.elitematerial = static_cast<int16_t>(atoi(row[244]));
|
||||||
e.ldonsellbackrate = static_cast<int16_t>(atoi(row[245]));
|
e.ldonsellbackrate = static_cast<int16_t>(atoi(row[245]));
|
||||||
e.scriptfileid = static_cast<int16_t>(atoi(row[246]));
|
e.scriptfileid = static_cast<int32_t>(atoi(row[246]));
|
||||||
e.expendablearrow = static_cast<int16_t>(atoi(row[247]));
|
e.expendablearrow = static_cast<int16_t>(atoi(row[247]));
|
||||||
e.powersourcecapacity = static_cast<int16_t>(atoi(row[248]));
|
e.powersourcecapacity = static_cast<int32_t>(atoi(row[248]));
|
||||||
e.bardeffect = static_cast<int16_t>(atoi(row[249]));
|
e.bardeffect = static_cast<int32_t>(atoi(row[249]));
|
||||||
e.bardeffecttype = static_cast<int16_t>(atoi(row[250]));
|
e.bardeffecttype = static_cast<int16_t>(atoi(row[250]));
|
||||||
e.bardlevel2 = static_cast<int16_t>(atoi(row[251]));
|
e.bardlevel2 = static_cast<int16_t>(atoi(row[251]));
|
||||||
e.bardlevel = static_cast<int16_t>(atoi(row[252]));
|
e.bardlevel = static_cast<int16_t>(atoi(row[252]));
|
||||||
@@ -1671,7 +1673,7 @@ public:
|
|||||||
v.push_back(columns[100] + " = " + std::to_string(e.pr));
|
v.push_back(columns[100] + " = " + std::to_string(e.pr));
|
||||||
v.push_back(columns[101] + " = " + std::to_string(e.procrate));
|
v.push_back(columns[101] + " = " + std::to_string(e.procrate));
|
||||||
v.push_back(columns[102] + " = " + std::to_string(e.races));
|
v.push_back(columns[102] + " = " + std::to_string(e.races));
|
||||||
v.push_back(columns[103] + " = " + std::to_string(e.range));
|
v.push_back(columns[103] + " = " + std::to_string(e.range_));
|
||||||
v.push_back(columns[104] + " = " + std::to_string(e.reclevel));
|
v.push_back(columns[104] + " = " + std::to_string(e.reclevel));
|
||||||
v.push_back(columns[105] + " = " + std::to_string(e.recskill));
|
v.push_back(columns[105] + " = " + std::to_string(e.recskill));
|
||||||
v.push_back(columns[106] + " = " + std::to_string(e.reqlevel));
|
v.push_back(columns[106] + " = " + std::to_string(e.reqlevel));
|
||||||
@@ -1977,7 +1979,7 @@ public:
|
|||||||
v.push_back(std::to_string(e.pr));
|
v.push_back(std::to_string(e.pr));
|
||||||
v.push_back(std::to_string(e.procrate));
|
v.push_back(std::to_string(e.procrate));
|
||||||
v.push_back(std::to_string(e.races));
|
v.push_back(std::to_string(e.races));
|
||||||
v.push_back(std::to_string(e.range));
|
v.push_back(std::to_string(e.range_));
|
||||||
v.push_back(std::to_string(e.reclevel));
|
v.push_back(std::to_string(e.reclevel));
|
||||||
v.push_back(std::to_string(e.recskill));
|
v.push_back(std::to_string(e.recskill));
|
||||||
v.push_back(std::to_string(e.reqlevel));
|
v.push_back(std::to_string(e.reqlevel));
|
||||||
@@ -2291,7 +2293,7 @@ public:
|
|||||||
v.push_back(std::to_string(e.pr));
|
v.push_back(std::to_string(e.pr));
|
||||||
v.push_back(std::to_string(e.procrate));
|
v.push_back(std::to_string(e.procrate));
|
||||||
v.push_back(std::to_string(e.races));
|
v.push_back(std::to_string(e.races));
|
||||||
v.push_back(std::to_string(e.range));
|
v.push_back(std::to_string(e.range_));
|
||||||
v.push_back(std::to_string(e.reclevel));
|
v.push_back(std::to_string(e.reclevel));
|
||||||
v.push_back(std::to_string(e.recskill));
|
v.push_back(std::to_string(e.recskill));
|
||||||
v.push_back(std::to_string(e.reqlevel));
|
v.push_back(std::to_string(e.reqlevel));
|
||||||
@@ -2561,7 +2563,7 @@ public:
|
|||||||
e.damageshield = static_cast<int32_t>(atoi(row[52]));
|
e.damageshield = static_cast<int32_t>(atoi(row[52]));
|
||||||
e.deity = static_cast<int32_t>(atoi(row[53]));
|
e.deity = static_cast<int32_t>(atoi(row[53]));
|
||||||
e.delay = static_cast<int32_t>(atoi(row[54]));
|
e.delay = static_cast<int32_t>(atoi(row[54]));
|
||||||
e.augdistiller = static_cast<int32_t>(atoi(row[55]));
|
e.augdistiller = static_cast<uint32_t>(strtoul(row[55], nullptr, 10));
|
||||||
e.dotshielding = static_cast<int32_t>(atoi(row[56]));
|
e.dotshielding = static_cast<int32_t>(atoi(row[56]));
|
||||||
e.dr = static_cast<int32_t>(atoi(row[57]));
|
e.dr = static_cast<int32_t>(atoi(row[57]));
|
||||||
e.clicktype = static_cast<int32_t>(atoi(row[58]));
|
e.clicktype = static_cast<int32_t>(atoi(row[58]));
|
||||||
@@ -2609,7 +2611,7 @@ public:
|
|||||||
e.pr = static_cast<int32_t>(atoi(row[100]));
|
e.pr = static_cast<int32_t>(atoi(row[100]));
|
||||||
e.procrate = static_cast<int32_t>(atoi(row[101]));
|
e.procrate = static_cast<int32_t>(atoi(row[101]));
|
||||||
e.races = static_cast<int32_t>(atoi(row[102]));
|
e.races = static_cast<int32_t>(atoi(row[102]));
|
||||||
e.range = static_cast<int32_t>(atoi(row[103]));
|
e.range_ = static_cast<int32_t>(atoi(row[103]));
|
||||||
e.reclevel = static_cast<int32_t>(atoi(row[104]));
|
e.reclevel = static_cast<int32_t>(atoi(row[104]));
|
||||||
e.recskill = static_cast<int32_t>(atoi(row[105]));
|
e.recskill = static_cast<int32_t>(atoi(row[105]));
|
||||||
e.reqlevel = static_cast<int32_t>(atoi(row[106]));
|
e.reqlevel = static_cast<int32_t>(atoi(row[106]));
|
||||||
@@ -2713,7 +2715,7 @@ public:
|
|||||||
e.focusunk5 = static_cast<int32_t>(atoi(row[204]));
|
e.focusunk5 = static_cast<int32_t>(atoi(row[204]));
|
||||||
e.focusunk6 = row[205] ? row[205] : "";
|
e.focusunk6 = row[205] ? row[205] : "";
|
||||||
e.focusunk7 = static_cast<int32_t>(atoi(row[206]));
|
e.focusunk7 = static_cast<int32_t>(atoi(row[206]));
|
||||||
e.scrollunk1 = static_cast<int32_t>(atoi(row[207]));
|
e.scrollunk1 = static_cast<uint32_t>(strtoul(row[207], nullptr, 10));
|
||||||
e.scrollunk2 = static_cast<int32_t>(atoi(row[208]));
|
e.scrollunk2 = static_cast<int32_t>(atoi(row[208]));
|
||||||
e.scrollunk3 = static_cast<int32_t>(atoi(row[209]));
|
e.scrollunk3 = static_cast<int32_t>(atoi(row[209]));
|
||||||
e.scrollunk4 = static_cast<int32_t>(atoi(row[210]));
|
e.scrollunk4 = static_cast<int32_t>(atoi(row[210]));
|
||||||
@@ -2752,10 +2754,10 @@ public:
|
|||||||
e.created = row[243] ? row[243] : "";
|
e.created = row[243] ? row[243] : "";
|
||||||
e.elitematerial = static_cast<int16_t>(atoi(row[244]));
|
e.elitematerial = static_cast<int16_t>(atoi(row[244]));
|
||||||
e.ldonsellbackrate = static_cast<int16_t>(atoi(row[245]));
|
e.ldonsellbackrate = static_cast<int16_t>(atoi(row[245]));
|
||||||
e.scriptfileid = static_cast<int16_t>(atoi(row[246]));
|
e.scriptfileid = static_cast<int32_t>(atoi(row[246]));
|
||||||
e.expendablearrow = static_cast<int16_t>(atoi(row[247]));
|
e.expendablearrow = static_cast<int16_t>(atoi(row[247]));
|
||||||
e.powersourcecapacity = static_cast<int16_t>(atoi(row[248]));
|
e.powersourcecapacity = static_cast<int32_t>(atoi(row[248]));
|
||||||
e.bardeffect = static_cast<int16_t>(atoi(row[249]));
|
e.bardeffect = static_cast<int32_t>(atoi(row[249]));
|
||||||
e.bardeffecttype = static_cast<int16_t>(atoi(row[250]));
|
e.bardeffecttype = static_cast<int16_t>(atoi(row[250]));
|
||||||
e.bardlevel2 = static_cast<int16_t>(atoi(row[251]));
|
e.bardlevel2 = static_cast<int16_t>(atoi(row[251]));
|
||||||
e.bardlevel = static_cast<int16_t>(atoi(row[252]));
|
e.bardlevel = static_cast<int16_t>(atoi(row[252]));
|
||||||
@@ -2870,7 +2872,7 @@ public:
|
|||||||
e.damageshield = static_cast<int32_t>(atoi(row[52]));
|
e.damageshield = static_cast<int32_t>(atoi(row[52]));
|
||||||
e.deity = static_cast<int32_t>(atoi(row[53]));
|
e.deity = static_cast<int32_t>(atoi(row[53]));
|
||||||
e.delay = static_cast<int32_t>(atoi(row[54]));
|
e.delay = static_cast<int32_t>(atoi(row[54]));
|
||||||
e.augdistiller = static_cast<int32_t>(atoi(row[55]));
|
e.augdistiller = static_cast<uint32_t>(strtoul(row[55], nullptr, 10));
|
||||||
e.dotshielding = static_cast<int32_t>(atoi(row[56]));
|
e.dotshielding = static_cast<int32_t>(atoi(row[56]));
|
||||||
e.dr = static_cast<int32_t>(atoi(row[57]));
|
e.dr = static_cast<int32_t>(atoi(row[57]));
|
||||||
e.clicktype = static_cast<int32_t>(atoi(row[58]));
|
e.clicktype = static_cast<int32_t>(atoi(row[58]));
|
||||||
@@ -2918,7 +2920,7 @@ public:
|
|||||||
e.pr = static_cast<int32_t>(atoi(row[100]));
|
e.pr = static_cast<int32_t>(atoi(row[100]));
|
||||||
e.procrate = static_cast<int32_t>(atoi(row[101]));
|
e.procrate = static_cast<int32_t>(atoi(row[101]));
|
||||||
e.races = static_cast<int32_t>(atoi(row[102]));
|
e.races = static_cast<int32_t>(atoi(row[102]));
|
||||||
e.range = static_cast<int32_t>(atoi(row[103]));
|
e.range_ = static_cast<int32_t>(atoi(row[103]));
|
||||||
e.reclevel = static_cast<int32_t>(atoi(row[104]));
|
e.reclevel = static_cast<int32_t>(atoi(row[104]));
|
||||||
e.recskill = static_cast<int32_t>(atoi(row[105]));
|
e.recskill = static_cast<int32_t>(atoi(row[105]));
|
||||||
e.reqlevel = static_cast<int32_t>(atoi(row[106]));
|
e.reqlevel = static_cast<int32_t>(atoi(row[106]));
|
||||||
@@ -3022,7 +3024,7 @@ public:
|
|||||||
e.focusunk5 = static_cast<int32_t>(atoi(row[204]));
|
e.focusunk5 = static_cast<int32_t>(atoi(row[204]));
|
||||||
e.focusunk6 = row[205] ? row[205] : "";
|
e.focusunk6 = row[205] ? row[205] : "";
|
||||||
e.focusunk7 = static_cast<int32_t>(atoi(row[206]));
|
e.focusunk7 = static_cast<int32_t>(atoi(row[206]));
|
||||||
e.scrollunk1 = static_cast<int32_t>(atoi(row[207]));
|
e.scrollunk1 = static_cast<uint32_t>(strtoul(row[207], nullptr, 10));
|
||||||
e.scrollunk2 = static_cast<int32_t>(atoi(row[208]));
|
e.scrollunk2 = static_cast<int32_t>(atoi(row[208]));
|
||||||
e.scrollunk3 = static_cast<int32_t>(atoi(row[209]));
|
e.scrollunk3 = static_cast<int32_t>(atoi(row[209]));
|
||||||
e.scrollunk4 = static_cast<int32_t>(atoi(row[210]));
|
e.scrollunk4 = static_cast<int32_t>(atoi(row[210]));
|
||||||
@@ -3061,10 +3063,10 @@ public:
|
|||||||
e.created = row[243] ? row[243] : "";
|
e.created = row[243] ? row[243] : "";
|
||||||
e.elitematerial = static_cast<int16_t>(atoi(row[244]));
|
e.elitematerial = static_cast<int16_t>(atoi(row[244]));
|
||||||
e.ldonsellbackrate = static_cast<int16_t>(atoi(row[245]));
|
e.ldonsellbackrate = static_cast<int16_t>(atoi(row[245]));
|
||||||
e.scriptfileid = static_cast<int16_t>(atoi(row[246]));
|
e.scriptfileid = static_cast<int32_t>(atoi(row[246]));
|
||||||
e.expendablearrow = static_cast<int16_t>(atoi(row[247]));
|
e.expendablearrow = static_cast<int16_t>(atoi(row[247]));
|
||||||
e.powersourcecapacity = static_cast<int16_t>(atoi(row[248]));
|
e.powersourcecapacity = static_cast<int32_t>(atoi(row[248]));
|
||||||
e.bardeffect = static_cast<int16_t>(atoi(row[249]));
|
e.bardeffect = static_cast<int32_t>(atoi(row[249]));
|
||||||
e.bardeffecttype = static_cast<int16_t>(atoi(row[250]));
|
e.bardeffecttype = static_cast<int16_t>(atoi(row[250]));
|
||||||
e.bardlevel2 = static_cast<int16_t>(atoi(row[251]));
|
e.bardlevel2 = static_cast<int16_t>(atoi(row[251]));
|
||||||
e.bardlevel = static_cast<int16_t>(atoi(row[252]));
|
e.bardlevel = static_cast<int16_t>(atoi(row[252]));
|
||||||
|
|||||||
@@ -0,0 +1,344 @@
|
|||||||
|
/**
|
||||||
|
* DO NOT MODIFY THIS FILE
|
||||||
|
*
|
||||||
|
* This repository was automatically generated and is NOT to be modified directly.
|
||||||
|
* Any repository modifications are meant to be made to the repository extending the base.
|
||||||
|
* Any modifications to base repositories are to be made by the generator only
|
||||||
|
*
|
||||||
|
* @generator ./utils/scripts/generators/repository-generator.pl
|
||||||
|
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef EQEMU_BASE_KEYRING_REPOSITORY_H
|
||||||
|
#define EQEMU_BASE_KEYRING_REPOSITORY_H
|
||||||
|
|
||||||
|
#include "../../database.h"
|
||||||
|
#include "../../strings.h"
|
||||||
|
#include <ctime>
|
||||||
|
|
||||||
|
|
||||||
|
class BaseKeyringRepository {
|
||||||
|
public:
|
||||||
|
struct Keyring {
|
||||||
|
uint32_t id;
|
||||||
|
int32_t char_id;
|
||||||
|
int32_t item_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
static std::string PrimaryKey()
|
||||||
|
{
|
||||||
|
return std::string("id");
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::vector<std::string> Columns()
|
||||||
|
{
|
||||||
|
return {
|
||||||
|
"id",
|
||||||
|
"char_id",
|
||||||
|
"item_id",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::vector<std::string> SelectColumns()
|
||||||
|
{
|
||||||
|
return {
|
||||||
|
"id",
|
||||||
|
"char_id",
|
||||||
|
"item_id",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string ColumnsRaw()
|
||||||
|
{
|
||||||
|
return std::string(Strings::Implode(", ", Columns()));
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string SelectColumnsRaw()
|
||||||
|
{
|
||||||
|
return std::string(Strings::Implode(", ", SelectColumns()));
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string TableName()
|
||||||
|
{
|
||||||
|
return std::string("keyring");
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string BaseSelect()
|
||||||
|
{
|
||||||
|
return fmt::format(
|
||||||
|
"SELECT {} FROM {}",
|
||||||
|
SelectColumnsRaw(),
|
||||||
|
TableName()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string BaseInsert()
|
||||||
|
{
|
||||||
|
return fmt::format(
|
||||||
|
"INSERT INTO {} ({}) ",
|
||||||
|
TableName(),
|
||||||
|
ColumnsRaw()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Keyring NewEntity()
|
||||||
|
{
|
||||||
|
Keyring e{};
|
||||||
|
|
||||||
|
e.id = 0;
|
||||||
|
e.char_id = 0;
|
||||||
|
e.item_id = 0;
|
||||||
|
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Keyring GetKeyring(
|
||||||
|
const std::vector<Keyring> &keyrings,
|
||||||
|
int keyring_id
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (auto &keyring : keyrings) {
|
||||||
|
if (keyring.id == keyring_id) {
|
||||||
|
return keyring;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NewEntity();
|
||||||
|
}
|
||||||
|
|
||||||
|
static Keyring FindOne(
|
||||||
|
Database& db,
|
||||||
|
int keyring_id
|
||||||
|
)
|
||||||
|
{
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"{} WHERE {} = {} LIMIT 1",
|
||||||
|
BaseSelect(),
|
||||||
|
PrimaryKey(),
|
||||||
|
keyring_id
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
auto row = results.begin();
|
||||||
|
if (results.RowCount() == 1) {
|
||||||
|
Keyring e{};
|
||||||
|
|
||||||
|
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
||||||
|
e.char_id = static_cast<int32_t>(atoi(row[1]));
|
||||||
|
e.item_id = static_cast<int32_t>(atoi(row[2]));
|
||||||
|
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NewEntity();
|
||||||
|
}
|
||||||
|
|
||||||
|
static int DeleteOne(
|
||||||
|
Database& db,
|
||||||
|
int keyring_id
|
||||||
|
)
|
||||||
|
{
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"DELETE FROM {} WHERE {} = {}",
|
||||||
|
TableName(),
|
||||||
|
PrimaryKey(),
|
||||||
|
keyring_id
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() ? results.RowsAffected() : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int UpdateOne(
|
||||||
|
Database& db,
|
||||||
|
const Keyring &e
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
auto columns = Columns();
|
||||||
|
|
||||||
|
v.push_back(columns[1] + " = " + std::to_string(e.char_id));
|
||||||
|
v.push_back(columns[2] + " = " + std::to_string(e.item_id));
|
||||||
|
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"UPDATE {} SET {} WHERE {} = {}",
|
||||||
|
TableName(),
|
||||||
|
Strings::Implode(", ", v),
|
||||||
|
PrimaryKey(),
|
||||||
|
e.id
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() ? results.RowsAffected() : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Keyring InsertOne(
|
||||||
|
Database& db,
|
||||||
|
Keyring e
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.id));
|
||||||
|
v.push_back(std::to_string(e.char_id));
|
||||||
|
v.push_back(std::to_string(e.item_id));
|
||||||
|
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"{} VALUES ({})",
|
||||||
|
BaseInsert(),
|
||||||
|
Strings::Implode(",", v)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (results.Success()) {
|
||||||
|
e.id = results.LastInsertedID();
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
e = NewEntity();
|
||||||
|
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int InsertMany(
|
||||||
|
Database& db,
|
||||||
|
const std::vector<Keyring> &entries
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> insert_chunks;
|
||||||
|
|
||||||
|
for (auto &e: entries) {
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.id));
|
||||||
|
v.push_back(std::to_string(e.char_id));
|
||||||
|
v.push_back(std::to_string(e.item_id));
|
||||||
|
|
||||||
|
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"{} VALUES {}",
|
||||||
|
BaseInsert(),
|
||||||
|
Strings::Implode(",", insert_chunks)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() ? results.RowsAffected() : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::vector<Keyring> All(Database& db)
|
||||||
|
{
|
||||||
|
std::vector<Keyring> all_entries;
|
||||||
|
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"{}",
|
||||||
|
BaseSelect()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
all_entries.reserve(results.RowCount());
|
||||||
|
|
||||||
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
|
Keyring e{};
|
||||||
|
|
||||||
|
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
||||||
|
e.char_id = static_cast<int32_t>(atoi(row[1]));
|
||||||
|
e.item_id = static_cast<int32_t>(atoi(row[2]));
|
||||||
|
|
||||||
|
all_entries.push_back(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return all_entries;
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::vector<Keyring> GetWhere(Database& db, const std::string &where_filter)
|
||||||
|
{
|
||||||
|
std::vector<Keyring> all_entries;
|
||||||
|
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"{} WHERE {}",
|
||||||
|
BaseSelect(),
|
||||||
|
where_filter
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
all_entries.reserve(results.RowCount());
|
||||||
|
|
||||||
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
|
Keyring e{};
|
||||||
|
|
||||||
|
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
||||||
|
e.char_id = static_cast<int32_t>(atoi(row[1]));
|
||||||
|
e.item_id = static_cast<int32_t>(atoi(row[2]));
|
||||||
|
|
||||||
|
all_entries.push_back(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return all_entries;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int DeleteWhere(Database& db, const std::string &where_filter)
|
||||||
|
{
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"DELETE FROM {} WHERE {}",
|
||||||
|
TableName(),
|
||||||
|
where_filter
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() ? results.RowsAffected() : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int Truncate(Database& db)
|
||||||
|
{
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"TRUNCATE TABLE {}",
|
||||||
|
TableName()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() ? results.RowsAffected() : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int64 GetMaxId(Database& db)
|
||||||
|
{
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"SELECT COALESCE(MAX({}), 0) FROM {}",
|
||||||
|
PrimaryKey(),
|
||||||
|
TableName()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int64 Count(Database& db, const std::string &where_filter = "")
|
||||||
|
{
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"SELECT COUNT(*) FROM {} {}",
|
||||||
|
TableName(),
|
||||||
|
(where_filter.empty() ? "" : "WHERE " + where_filter)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //EQEMU_BASE_KEYRING_REPOSITORY_H
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
* Any modifications to base repositories are to be made by the generator only
|
* Any modifications to base repositories are to be made by the generator only
|
||||||
*
|
*
|
||||||
* @generator ./utils/scripts/generators/repository-generator.pl
|
* @generator ./utils/scripts/generators/repository-generator.pl
|
||||||
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
|
* @docs https://docs.eqemu.io/developer/repositories
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EQEMU_BASE_LOGSYS_CATEGORIES_REPOSITORY_H
|
#ifndef EQEMU_BASE_LOGSYS_CATEGORIES_REPOSITORY_H
|
||||||
@@ -16,6 +16,7 @@
|
|||||||
#include "../../strings.h"
|
#include "../../strings.h"
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
|
|
||||||
|
|
||||||
class BaseLogsysCategoriesRepository {
|
class BaseLogsysCategoriesRepository {
|
||||||
public:
|
public:
|
||||||
struct LogsysCategories {
|
struct LogsysCategories {
|
||||||
@@ -128,8 +129,9 @@ public:
|
|||||||
{
|
{
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
"{} WHERE id = {} LIMIT 1",
|
"{} WHERE {} = {} LIMIT 1",
|
||||||
BaseSelect(),
|
BaseSelect(),
|
||||||
|
PrimaryKey(),
|
||||||
logsys_categories_id
|
logsys_categories_id
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -378,6 +380,74 @@ public:
|
|||||||
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static std::string BaseReplace()
|
||||||
|
{
|
||||||
|
return fmt::format(
|
||||||
|
"REPLACE INTO {} ({}) ",
|
||||||
|
TableName(),
|
||||||
|
ColumnsRaw()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ReplaceOne(
|
||||||
|
Database& db,
|
||||||
|
const LogsysCategories &e
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.log_category_id));
|
||||||
|
v.push_back("'" + Strings::Escape(e.log_category_description) + "'");
|
||||||
|
v.push_back(std::to_string(e.log_to_console));
|
||||||
|
v.push_back(std::to_string(e.log_to_file));
|
||||||
|
v.push_back(std::to_string(e.log_to_gmsay));
|
||||||
|
v.push_back(std::to_string(e.log_to_discord));
|
||||||
|
v.push_back(std::to_string(e.discord_webhook_id));
|
||||||
|
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"{} VALUES ({})",
|
||||||
|
BaseReplace(),
|
||||||
|
Strings::Implode(",", v)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() ? results.RowsAffected() : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ReplaceMany(
|
||||||
|
Database& db,
|
||||||
|
const std::vector<LogsysCategories> &entries
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> insert_chunks;
|
||||||
|
|
||||||
|
for (auto &e: entries) {
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.log_category_id));
|
||||||
|
v.push_back("'" + Strings::Escape(e.log_category_description) + "'");
|
||||||
|
v.push_back(std::to_string(e.log_to_console));
|
||||||
|
v.push_back(std::to_string(e.log_to_file));
|
||||||
|
v.push_back(std::to_string(e.log_to_gmsay));
|
||||||
|
v.push_back(std::to_string(e.log_to_discord));
|
||||||
|
v.push_back(std::to_string(e.discord_webhook_id));
|
||||||
|
|
||||||
|
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"{} VALUES {}",
|
||||||
|
BaseReplace(),
|
||||||
|
Strings::Implode(",", insert_chunks)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() ? results.RowsAffected() : 0);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //EQEMU_BASE_LOGSYS_CATEGORIES_REPOSITORY_H
|
#endif //EQEMU_BASE_LOGSYS_CATEGORIES_REPOSITORY_H
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
#include "../../strings.h"
|
#include "../../strings.h"
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
|
|
||||||
|
|
||||||
class BaseNpcEmotesRepository {
|
class BaseNpcEmotesRepository {
|
||||||
public:
|
public:
|
||||||
struct NpcEmotes {
|
struct NpcEmotes {
|
||||||
@@ -120,8 +121,9 @@ public:
|
|||||||
{
|
{
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
"{} WHERE id = {} LIMIT 1",
|
"{} WHERE {} = {} LIMIT 1",
|
||||||
BaseSelect(),
|
BaseSelect(),
|
||||||
|
PrimaryKey(),
|
||||||
npc_emotes_id
|
npc_emotes_id
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -66,8 +66,8 @@ public:
|
|||||||
uint8_t armortint_red;
|
uint8_t armortint_red;
|
||||||
uint8_t armortint_green;
|
uint8_t armortint_green;
|
||||||
uint8_t armortint_blue;
|
uint8_t armortint_blue;
|
||||||
int32_t d_melee_texture1;
|
uint32_t d_melee_texture1;
|
||||||
int32_t d_melee_texture2;
|
uint32_t d_melee_texture2;
|
||||||
std::string ammo_idfile;
|
std::string ammo_idfile;
|
||||||
uint8_t prim_melee_type;
|
uint8_t prim_melee_type;
|
||||||
uint8_t sec_melee_type;
|
uint8_t sec_melee_type;
|
||||||
@@ -583,7 +583,7 @@ public:
|
|||||||
e.exp_mod = 100;
|
e.exp_mod = 100;
|
||||||
e.heroic_strikethrough = 0;
|
e.heroic_strikethrough = 0;
|
||||||
e.faction_amount = 0;
|
e.faction_amount = 0;
|
||||||
e.keeps_sold_items = 0;
|
e.keeps_sold_items = 1;
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@@ -666,8 +666,8 @@ public:
|
|||||||
e.armortint_red = static_cast<uint8_t>(strtoul(row[43], nullptr, 10));
|
e.armortint_red = static_cast<uint8_t>(strtoul(row[43], nullptr, 10));
|
||||||
e.armortint_green = static_cast<uint8_t>(strtoul(row[44], nullptr, 10));
|
e.armortint_green = static_cast<uint8_t>(strtoul(row[44], nullptr, 10));
|
||||||
e.armortint_blue = static_cast<uint8_t>(strtoul(row[45], nullptr, 10));
|
e.armortint_blue = static_cast<uint8_t>(strtoul(row[45], nullptr, 10));
|
||||||
e.d_melee_texture1 = static_cast<int32_t>(atoi(row[46]));
|
e.d_melee_texture1 = static_cast<uint32_t>(strtoul(row[46], nullptr, 10));
|
||||||
e.d_melee_texture2 = static_cast<int32_t>(atoi(row[47]));
|
e.d_melee_texture2 = static_cast<uint32_t>(strtoul(row[47], nullptr, 10));
|
||||||
e.ammo_idfile = row[48] ? row[48] : "";
|
e.ammo_idfile = row[48] ? row[48] : "";
|
||||||
e.prim_melee_type = static_cast<uint8_t>(strtoul(row[49], nullptr, 10));
|
e.prim_melee_type = static_cast<uint8_t>(strtoul(row[49], nullptr, 10));
|
||||||
e.sec_melee_type = static_cast<uint8_t>(strtoul(row[50], nullptr, 10));
|
e.sec_melee_type = static_cast<uint8_t>(strtoul(row[50], nullptr, 10));
|
||||||
@@ -1289,8 +1289,8 @@ public:
|
|||||||
e.armortint_red = static_cast<uint8_t>(strtoul(row[43], nullptr, 10));
|
e.armortint_red = static_cast<uint8_t>(strtoul(row[43], nullptr, 10));
|
||||||
e.armortint_green = static_cast<uint8_t>(strtoul(row[44], nullptr, 10));
|
e.armortint_green = static_cast<uint8_t>(strtoul(row[44], nullptr, 10));
|
||||||
e.armortint_blue = static_cast<uint8_t>(strtoul(row[45], nullptr, 10));
|
e.armortint_blue = static_cast<uint8_t>(strtoul(row[45], nullptr, 10));
|
||||||
e.d_melee_texture1 = static_cast<int32_t>(atoi(row[46]));
|
e.d_melee_texture1 = static_cast<uint32_t>(strtoul(row[46], nullptr, 10));
|
||||||
e.d_melee_texture2 = static_cast<int32_t>(atoi(row[47]));
|
e.d_melee_texture2 = static_cast<uint32_t>(strtoul(row[47], nullptr, 10));
|
||||||
e.ammo_idfile = row[48] ? row[48] : "";
|
e.ammo_idfile = row[48] ? row[48] : "";
|
||||||
e.prim_melee_type = static_cast<uint8_t>(strtoul(row[49], nullptr, 10));
|
e.prim_melee_type = static_cast<uint8_t>(strtoul(row[49], nullptr, 10));
|
||||||
e.sec_melee_type = static_cast<uint8_t>(strtoul(row[50], nullptr, 10));
|
e.sec_melee_type = static_cast<uint8_t>(strtoul(row[50], nullptr, 10));
|
||||||
@@ -1440,8 +1440,8 @@ public:
|
|||||||
e.armortint_red = static_cast<uint8_t>(strtoul(row[43], nullptr, 10));
|
e.armortint_red = static_cast<uint8_t>(strtoul(row[43], nullptr, 10));
|
||||||
e.armortint_green = static_cast<uint8_t>(strtoul(row[44], nullptr, 10));
|
e.armortint_green = static_cast<uint8_t>(strtoul(row[44], nullptr, 10));
|
||||||
e.armortint_blue = static_cast<uint8_t>(strtoul(row[45], nullptr, 10));
|
e.armortint_blue = static_cast<uint8_t>(strtoul(row[45], nullptr, 10));
|
||||||
e.d_melee_texture1 = static_cast<int32_t>(atoi(row[46]));
|
e.d_melee_texture1 = static_cast<uint32_t>(strtoul(row[46], nullptr, 10));
|
||||||
e.d_melee_texture2 = static_cast<int32_t>(atoi(row[47]));
|
e.d_melee_texture2 = static_cast<uint32_t>(strtoul(row[47], nullptr, 10));
|
||||||
e.ammo_idfile = row[48] ? row[48] : "";
|
e.ammo_idfile = row[48] ? row[48] : "";
|
||||||
e.prim_melee_type = static_cast<uint8_t>(strtoul(row[49], nullptr, 10));
|
e.prim_melee_type = static_cast<uint8_t>(strtoul(row[49], nullptr, 10));
|
||||||
e.sec_melee_type = static_cast<uint8_t>(strtoul(row[50], nullptr, 10));
|
e.sec_melee_type = static_cast<uint8_t>(strtoul(row[50], nullptr, 10));
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
#include "../../strings.h"
|
#include "../../strings.h"
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
|
|
||||||
|
|
||||||
class BaseObjectRepository {
|
class BaseObjectRepository {
|
||||||
public:
|
public:
|
||||||
struct Object {
|
struct Object {
|
||||||
@@ -31,9 +32,9 @@ public:
|
|||||||
std::string objectname;
|
std::string objectname;
|
||||||
int32_t type;
|
int32_t type;
|
||||||
int32_t icon;
|
int32_t icon;
|
||||||
int32_t unknown08;
|
float size_percentage;
|
||||||
int32_t unknown10;
|
int32_t solid_type;
|
||||||
int32_t unknown20;
|
int32_t incline;
|
||||||
int32_t unknown24;
|
int32_t unknown24;
|
||||||
int32_t unknown60;
|
int32_t unknown60;
|
||||||
int32_t unknown64;
|
int32_t unknown64;
|
||||||
@@ -71,9 +72,9 @@ public:
|
|||||||
"objectname",
|
"objectname",
|
||||||
"type",
|
"type",
|
||||||
"icon",
|
"icon",
|
||||||
"unknown08",
|
"size_percentage",
|
||||||
"unknown10",
|
"solid_type",
|
||||||
"unknown20",
|
"incline",
|
||||||
"unknown24",
|
"unknown24",
|
||||||
"unknown60",
|
"unknown60",
|
||||||
"unknown64",
|
"unknown64",
|
||||||
@@ -107,9 +108,9 @@ public:
|
|||||||
"objectname",
|
"objectname",
|
||||||
"type",
|
"type",
|
||||||
"icon",
|
"icon",
|
||||||
"unknown08",
|
"size_percentage",
|
||||||
"unknown10",
|
"solid_type",
|
||||||
"unknown20",
|
"incline",
|
||||||
"unknown24",
|
"unknown24",
|
||||||
"unknown60",
|
"unknown60",
|
||||||
"unknown64",
|
"unknown64",
|
||||||
@@ -177,9 +178,9 @@ public:
|
|||||||
e.objectname = "";
|
e.objectname = "";
|
||||||
e.type = 0;
|
e.type = 0;
|
||||||
e.icon = 0;
|
e.icon = 0;
|
||||||
e.unknown08 = 0;
|
e.size_percentage = 0;
|
||||||
e.unknown10 = 0;
|
e.solid_type = 0;
|
||||||
e.unknown20 = 0;
|
e.incline = 0;
|
||||||
e.unknown24 = 0;
|
e.unknown24 = 0;
|
||||||
e.unknown60 = 0;
|
e.unknown60 = 0;
|
||||||
e.unknown64 = 0;
|
e.unknown64 = 0;
|
||||||
@@ -220,8 +221,9 @@ public:
|
|||||||
{
|
{
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
"{} WHERE id = {} LIMIT 1",
|
"{} WHERE {} = {} LIMIT 1",
|
||||||
BaseSelect(),
|
BaseSelect(),
|
||||||
|
PrimaryKey(),
|
||||||
object_id
|
object_id
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -242,9 +244,9 @@ public:
|
|||||||
e.objectname = row[9] ? row[9] : "";
|
e.objectname = row[9] ? row[9] : "";
|
||||||
e.type = static_cast<int32_t>(atoi(row[10]));
|
e.type = static_cast<int32_t>(atoi(row[10]));
|
||||||
e.icon = static_cast<int32_t>(atoi(row[11]));
|
e.icon = static_cast<int32_t>(atoi(row[11]));
|
||||||
e.unknown08 = static_cast<int32_t>(atoi(row[12]));
|
e.size_percentage = strtof(row[12], nullptr);
|
||||||
e.unknown10 = static_cast<int32_t>(atoi(row[13]));
|
e.solid_type = static_cast<int32_t>(atoi(row[13]));
|
||||||
e.unknown20 = static_cast<int32_t>(atoi(row[14]));
|
e.incline = static_cast<int32_t>(atoi(row[14]));
|
||||||
e.unknown24 = static_cast<int32_t>(atoi(row[15]));
|
e.unknown24 = static_cast<int32_t>(atoi(row[15]));
|
||||||
e.unknown60 = static_cast<int32_t>(atoi(row[16]));
|
e.unknown60 = static_cast<int32_t>(atoi(row[16]));
|
||||||
e.unknown64 = static_cast<int32_t>(atoi(row[17]));
|
e.unknown64 = static_cast<int32_t>(atoi(row[17]));
|
||||||
@@ -304,9 +306,9 @@ public:
|
|||||||
v.push_back(columns[9] + " = '" + Strings::Escape(e.objectname) + "'");
|
v.push_back(columns[9] + " = '" + Strings::Escape(e.objectname) + "'");
|
||||||
v.push_back(columns[10] + " = " + std::to_string(e.type));
|
v.push_back(columns[10] + " = " + std::to_string(e.type));
|
||||||
v.push_back(columns[11] + " = " + std::to_string(e.icon));
|
v.push_back(columns[11] + " = " + std::to_string(e.icon));
|
||||||
v.push_back(columns[12] + " = " + std::to_string(e.unknown08));
|
v.push_back(columns[12] + " = " + std::to_string(e.size_percentage));
|
||||||
v.push_back(columns[13] + " = " + std::to_string(e.unknown10));
|
v.push_back(columns[13] + " = " + std::to_string(e.solid_type));
|
||||||
v.push_back(columns[14] + " = " + std::to_string(e.unknown20));
|
v.push_back(columns[14] + " = " + std::to_string(e.incline));
|
||||||
v.push_back(columns[15] + " = " + std::to_string(e.unknown24));
|
v.push_back(columns[15] + " = " + std::to_string(e.unknown24));
|
||||||
v.push_back(columns[16] + " = " + std::to_string(e.unknown60));
|
v.push_back(columns[16] + " = " + std::to_string(e.unknown60));
|
||||||
v.push_back(columns[17] + " = " + std::to_string(e.unknown64));
|
v.push_back(columns[17] + " = " + std::to_string(e.unknown64));
|
||||||
@@ -355,9 +357,9 @@ public:
|
|||||||
v.push_back("'" + Strings::Escape(e.objectname) + "'");
|
v.push_back("'" + Strings::Escape(e.objectname) + "'");
|
||||||
v.push_back(std::to_string(e.type));
|
v.push_back(std::to_string(e.type));
|
||||||
v.push_back(std::to_string(e.icon));
|
v.push_back(std::to_string(e.icon));
|
||||||
v.push_back(std::to_string(e.unknown08));
|
v.push_back(std::to_string(e.size_percentage));
|
||||||
v.push_back(std::to_string(e.unknown10));
|
v.push_back(std::to_string(e.solid_type));
|
||||||
v.push_back(std::to_string(e.unknown20));
|
v.push_back(std::to_string(e.incline));
|
||||||
v.push_back(std::to_string(e.unknown24));
|
v.push_back(std::to_string(e.unknown24));
|
||||||
v.push_back(std::to_string(e.unknown60));
|
v.push_back(std::to_string(e.unknown60));
|
||||||
v.push_back(std::to_string(e.unknown64));
|
v.push_back(std::to_string(e.unknown64));
|
||||||
@@ -414,9 +416,9 @@ public:
|
|||||||
v.push_back("'" + Strings::Escape(e.objectname) + "'");
|
v.push_back("'" + Strings::Escape(e.objectname) + "'");
|
||||||
v.push_back(std::to_string(e.type));
|
v.push_back(std::to_string(e.type));
|
||||||
v.push_back(std::to_string(e.icon));
|
v.push_back(std::to_string(e.icon));
|
||||||
v.push_back(std::to_string(e.unknown08));
|
v.push_back(std::to_string(e.size_percentage));
|
||||||
v.push_back(std::to_string(e.unknown10));
|
v.push_back(std::to_string(e.solid_type));
|
||||||
v.push_back(std::to_string(e.unknown20));
|
v.push_back(std::to_string(e.incline));
|
||||||
v.push_back(std::to_string(e.unknown24));
|
v.push_back(std::to_string(e.unknown24));
|
||||||
v.push_back(std::to_string(e.unknown60));
|
v.push_back(std::to_string(e.unknown60));
|
||||||
v.push_back(std::to_string(e.unknown64));
|
v.push_back(std::to_string(e.unknown64));
|
||||||
@@ -477,9 +479,9 @@ public:
|
|||||||
e.objectname = row[9] ? row[9] : "";
|
e.objectname = row[9] ? row[9] : "";
|
||||||
e.type = static_cast<int32_t>(atoi(row[10]));
|
e.type = static_cast<int32_t>(atoi(row[10]));
|
||||||
e.icon = static_cast<int32_t>(atoi(row[11]));
|
e.icon = static_cast<int32_t>(atoi(row[11]));
|
||||||
e.unknown08 = static_cast<int32_t>(atoi(row[12]));
|
e.size_percentage = strtof(row[12], nullptr);
|
||||||
e.unknown10 = static_cast<int32_t>(atoi(row[13]));
|
e.solid_type = static_cast<int32_t>(atoi(row[13]));
|
||||||
e.unknown20 = static_cast<int32_t>(atoi(row[14]));
|
e.incline = static_cast<int32_t>(atoi(row[14]));
|
||||||
e.unknown24 = static_cast<int32_t>(atoi(row[15]));
|
e.unknown24 = static_cast<int32_t>(atoi(row[15]));
|
||||||
e.unknown60 = static_cast<int32_t>(atoi(row[16]));
|
e.unknown60 = static_cast<int32_t>(atoi(row[16]));
|
||||||
e.unknown64 = static_cast<int32_t>(atoi(row[17]));
|
e.unknown64 = static_cast<int32_t>(atoi(row[17]));
|
||||||
@@ -531,9 +533,9 @@ public:
|
|||||||
e.objectname = row[9] ? row[9] : "";
|
e.objectname = row[9] ? row[9] : "";
|
||||||
e.type = static_cast<int32_t>(atoi(row[10]));
|
e.type = static_cast<int32_t>(atoi(row[10]));
|
||||||
e.icon = static_cast<int32_t>(atoi(row[11]));
|
e.icon = static_cast<int32_t>(atoi(row[11]));
|
||||||
e.unknown08 = static_cast<int32_t>(atoi(row[12]));
|
e.size_percentage = strtof(row[12], nullptr);
|
||||||
e.unknown10 = static_cast<int32_t>(atoi(row[13]));
|
e.solid_type = static_cast<int32_t>(atoi(row[13]));
|
||||||
e.unknown20 = static_cast<int32_t>(atoi(row[14]));
|
e.incline = static_cast<int32_t>(atoi(row[14]));
|
||||||
e.unknown24 = static_cast<int32_t>(atoi(row[15]));
|
e.unknown24 = static_cast<int32_t>(atoi(row[15]));
|
||||||
e.unknown60 = static_cast<int32_t>(atoi(row[16]));
|
e.unknown60 = static_cast<int32_t>(atoi(row[16]));
|
||||||
e.unknown64 = static_cast<int32_t>(atoi(row[17]));
|
e.unknown64 = static_cast<int32_t>(atoi(row[17]));
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
* Any modifications to base repositories are to be made by the generator only
|
* Any modifications to base repositories are to be made by the generator only
|
||||||
*
|
*
|
||||||
* @generator ./utils/scripts/generators/repository-generator.pl
|
* @generator ./utils/scripts/generators/repository-generator.pl
|
||||||
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
|
* @docs https://docs.eqemu.io/developer/repositories
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EQEMU_BASE_PLAYER_EVENT_LOG_SETTINGS_REPOSITORY_H
|
#ifndef EQEMU_BASE_PLAYER_EVENT_LOG_SETTINGS_REPOSITORY_H
|
||||||
@@ -16,6 +16,7 @@
|
|||||||
#include "../../strings.h"
|
#include "../../strings.h"
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
|
|
||||||
|
|
||||||
class BasePlayerEventLogSettingsRepository {
|
class BasePlayerEventLogSettingsRepository {
|
||||||
public:
|
public:
|
||||||
struct PlayerEventLogSettings {
|
struct PlayerEventLogSettings {
|
||||||
@@ -359,6 +360,70 @@ public:
|
|||||||
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static std::string BaseReplace()
|
||||||
|
{
|
||||||
|
return fmt::format(
|
||||||
|
"REPLACE INTO {} ({}) ",
|
||||||
|
TableName(),
|
||||||
|
ColumnsRaw()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ReplaceOne(
|
||||||
|
Database& db,
|
||||||
|
const PlayerEventLogSettings &e
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.id));
|
||||||
|
v.push_back("'" + Strings::Escape(e.event_name) + "'");
|
||||||
|
v.push_back(std::to_string(e.event_enabled));
|
||||||
|
v.push_back(std::to_string(e.retention_days));
|
||||||
|
v.push_back(std::to_string(e.discord_webhook_id));
|
||||||
|
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"{} VALUES ({})",
|
||||||
|
BaseReplace(),
|
||||||
|
Strings::Implode(",", v)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() ? results.RowsAffected() : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ReplaceMany(
|
||||||
|
Database& db,
|
||||||
|
const std::vector<PlayerEventLogSettings> &entries
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> insert_chunks;
|
||||||
|
|
||||||
|
for (auto &e: entries) {
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.id));
|
||||||
|
v.push_back("'" + Strings::Escape(e.event_name) + "'");
|
||||||
|
v.push_back(std::to_string(e.event_enabled));
|
||||||
|
v.push_back(std::to_string(e.retention_days));
|
||||||
|
v.push_back(std::to_string(e.discord_webhook_id));
|
||||||
|
|
||||||
|
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"{} VALUES {}",
|
||||||
|
BaseReplace(),
|
||||||
|
Strings::Implode(",", insert_chunks)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() ? results.RowsAffected() : 0);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //EQEMU_BASE_PLAYER_EVENT_LOG_SETTINGS_REPOSITORY_H
|
#endif //EQEMU_BASE_PLAYER_EVENT_LOG_SETTINGS_REPOSITORY_H
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
* Any modifications to base repositories are to be made by the generator only
|
* Any modifications to base repositories are to be made by the generator only
|
||||||
*
|
*
|
||||||
* @generator ./utils/scripts/generators/repository-generator.pl
|
* @generator ./utils/scripts/generators/repository-generator.pl
|
||||||
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
|
* @docs https://docs.eqemu.io/developer/repositories
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EQEMU_BASE_PLAYER_EVENT_LOGS_REPOSITORY_H
|
#ifndef EQEMU_BASE_PLAYER_EVENT_LOGS_REPOSITORY_H
|
||||||
@@ -240,8 +240,8 @@ public:
|
|||||||
v.push_back(columns[7] + " = " + std::to_string(e.z));
|
v.push_back(columns[7] + " = " + std::to_string(e.z));
|
||||||
v.push_back(columns[8] + " = " + std::to_string(e.heading));
|
v.push_back(columns[8] + " = " + std::to_string(e.heading));
|
||||||
v.push_back(columns[9] + " = " + std::to_string(e.event_type_id));
|
v.push_back(columns[9] + " = " + std::to_string(e.event_type_id));
|
||||||
v.push_back(columns[10] + " = '" + db.Escape(e.event_type_name) + "'");
|
v.push_back(columns[10] + " = '" + Strings::Escape(e.event_type_name) + "'");
|
||||||
v.push_back(columns[11] + " = '" + db.Escape(e.event_data) + "'");
|
v.push_back(columns[11] + " = '" + Strings::Escape(e.event_data) + "'");
|
||||||
v.push_back(columns[12] + " = FROM_UNIXTIME(" + (e.created_at > 0 ? std::to_string(e.created_at) : "null") + ")");
|
v.push_back(columns[12] + " = FROM_UNIXTIME(" + (e.created_at > 0 ? std::to_string(e.created_at) : "null") + ")");
|
||||||
|
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
@@ -274,8 +274,8 @@ public:
|
|||||||
v.push_back(std::to_string(e.z));
|
v.push_back(std::to_string(e.z));
|
||||||
v.push_back(std::to_string(e.heading));
|
v.push_back(std::to_string(e.heading));
|
||||||
v.push_back(std::to_string(e.event_type_id));
|
v.push_back(std::to_string(e.event_type_id));
|
||||||
v.push_back("'" + db.Escape(e.event_type_name) + "'");
|
v.push_back("'" + Strings::Escape(e.event_type_name) + "'");
|
||||||
v.push_back("'" + db.Escape(e.event_data) + "'");
|
v.push_back("'" + Strings::Escape(e.event_data) + "'");
|
||||||
v.push_back("FROM_UNIXTIME(" + (e.created_at > 0 ? std::to_string(e.created_at) : "null") + ")");
|
v.push_back("FROM_UNIXTIME(" + (e.created_at > 0 ? std::to_string(e.created_at) : "null") + ")");
|
||||||
|
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
@@ -316,8 +316,8 @@ public:
|
|||||||
v.push_back(std::to_string(e.z));
|
v.push_back(std::to_string(e.z));
|
||||||
v.push_back(std::to_string(e.heading));
|
v.push_back(std::to_string(e.heading));
|
||||||
v.push_back(std::to_string(e.event_type_id));
|
v.push_back(std::to_string(e.event_type_id));
|
||||||
v.push_back("'" + db.Escape(e.event_type_name) + "'");
|
v.push_back("'" + Strings::Escape(e.event_type_name) + "'");
|
||||||
v.push_back("'" + db.Escape(e.event_data) + "'");
|
v.push_back("'" + Strings::Escape(e.event_data) + "'");
|
||||||
v.push_back("FROM_UNIXTIME(" + (e.created_at > 0 ? std::to_string(e.created_at) : "null") + ")");
|
v.push_back("FROM_UNIXTIME(" + (e.created_at > 0 ? std::to_string(e.created_at) : "null") + ")");
|
||||||
|
|
||||||
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
||||||
@@ -460,6 +460,86 @@ public:
|
|||||||
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static std::string BaseReplace()
|
||||||
|
{
|
||||||
|
return fmt::format(
|
||||||
|
"REPLACE INTO {} ({}) ",
|
||||||
|
TableName(),
|
||||||
|
ColumnsRaw()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ReplaceOne(
|
||||||
|
Database& db,
|
||||||
|
const PlayerEventLogs &e
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.id));
|
||||||
|
v.push_back(std::to_string(e.account_id));
|
||||||
|
v.push_back(std::to_string(e.character_id));
|
||||||
|
v.push_back(std::to_string(e.zone_id));
|
||||||
|
v.push_back(std::to_string(e.instance_id));
|
||||||
|
v.push_back(std::to_string(e.x));
|
||||||
|
v.push_back(std::to_string(e.y));
|
||||||
|
v.push_back(std::to_string(e.z));
|
||||||
|
v.push_back(std::to_string(e.heading));
|
||||||
|
v.push_back(std::to_string(e.event_type_id));
|
||||||
|
v.push_back("'" + Strings::Escape(e.event_type_name) + "'");
|
||||||
|
v.push_back("'" + Strings::Escape(e.event_data) + "'");
|
||||||
|
v.push_back("FROM_UNIXTIME(" + (e.created_at > 0 ? std::to_string(e.created_at) : "null") + ")");
|
||||||
|
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"{} VALUES ({})",
|
||||||
|
BaseReplace(),
|
||||||
|
Strings::Implode(",", v)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() ? results.RowsAffected() : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ReplaceMany(
|
||||||
|
Database& db,
|
||||||
|
const std::vector<PlayerEventLogs> &entries
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> insert_chunks;
|
||||||
|
|
||||||
|
for (auto &e: entries) {
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.id));
|
||||||
|
v.push_back(std::to_string(e.account_id));
|
||||||
|
v.push_back(std::to_string(e.character_id));
|
||||||
|
v.push_back(std::to_string(e.zone_id));
|
||||||
|
v.push_back(std::to_string(e.instance_id));
|
||||||
|
v.push_back(std::to_string(e.x));
|
||||||
|
v.push_back(std::to_string(e.y));
|
||||||
|
v.push_back(std::to_string(e.z));
|
||||||
|
v.push_back(std::to_string(e.heading));
|
||||||
|
v.push_back(std::to_string(e.event_type_id));
|
||||||
|
v.push_back("'" + Strings::Escape(e.event_type_name) + "'");
|
||||||
|
v.push_back("'" + Strings::Escape(e.event_data) + "'");
|
||||||
|
v.push_back("FROM_UNIXTIME(" + (e.created_at > 0 ? std::to_string(e.created_at) : "null") + ")");
|
||||||
|
|
||||||
|
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"{} VALUES {}",
|
||||||
|
BaseReplace(),
|
||||||
|
Strings::Implode(",", insert_chunks)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() ? results.RowsAffected() : 0);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //EQEMU_BASE_PLAYER_EVENT_LOGS_REPOSITORY_H
|
#endif //EQEMU_BASE_PLAYER_EVENT_LOGS_REPOSITORY_H
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
#include "../../strings.h"
|
#include "../../strings.h"
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
|
|
||||||
|
|
||||||
class BaseRaidDetailsRepository {
|
class BaseRaidDetailsRepository {
|
||||||
public:
|
public:
|
||||||
struct RaidDetails {
|
struct RaidDetails {
|
||||||
@@ -23,6 +24,15 @@ public:
|
|||||||
int32_t loottype;
|
int32_t loottype;
|
||||||
int8_t locked;
|
int8_t locked;
|
||||||
std::string motd;
|
std::string motd;
|
||||||
|
uint32_t marked_npc_1_entity_id;
|
||||||
|
uint32_t marked_npc_1_zone_id;
|
||||||
|
uint32_t marked_npc_1_instance_id;
|
||||||
|
uint32_t marked_npc_2_entity_id;
|
||||||
|
uint32_t marked_npc_2_zone_id;
|
||||||
|
uint32_t marked_npc_2_instance_id;
|
||||||
|
uint32_t marked_npc_3_entity_id;
|
||||||
|
uint32_t marked_npc_3_zone_id;
|
||||||
|
uint32_t marked_npc_3_instance_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::string PrimaryKey()
|
static std::string PrimaryKey()
|
||||||
@@ -37,6 +47,15 @@ public:
|
|||||||
"loottype",
|
"loottype",
|
||||||
"locked",
|
"locked",
|
||||||
"motd",
|
"motd",
|
||||||
|
"marked_npc_1_entity_id",
|
||||||
|
"marked_npc_1_zone_id",
|
||||||
|
"marked_npc_1_instance_id",
|
||||||
|
"marked_npc_2_entity_id",
|
||||||
|
"marked_npc_2_zone_id",
|
||||||
|
"marked_npc_2_instance_id",
|
||||||
|
"marked_npc_3_entity_id",
|
||||||
|
"marked_npc_3_zone_id",
|
||||||
|
"marked_npc_3_instance_id",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,6 +66,15 @@ public:
|
|||||||
"loottype",
|
"loottype",
|
||||||
"locked",
|
"locked",
|
||||||
"motd",
|
"motd",
|
||||||
|
"marked_npc_1_entity_id",
|
||||||
|
"marked_npc_1_zone_id",
|
||||||
|
"marked_npc_1_instance_id",
|
||||||
|
"marked_npc_2_entity_id",
|
||||||
|
"marked_npc_2_zone_id",
|
||||||
|
"marked_npc_2_instance_id",
|
||||||
|
"marked_npc_3_entity_id",
|
||||||
|
"marked_npc_3_zone_id",
|
||||||
|
"marked_npc_3_instance_id",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,10 +115,19 @@ public:
|
|||||||
{
|
{
|
||||||
RaidDetails e{};
|
RaidDetails e{};
|
||||||
|
|
||||||
e.raidid = 0;
|
e.raidid = 0;
|
||||||
e.loottype = 0;
|
e.loottype = 0;
|
||||||
e.locked = 0;
|
e.locked = 0;
|
||||||
e.motd = "";
|
e.motd = "";
|
||||||
|
e.marked_npc_1_entity_id = 0;
|
||||||
|
e.marked_npc_1_zone_id = 0;
|
||||||
|
e.marked_npc_1_instance_id = 0;
|
||||||
|
e.marked_npc_2_entity_id = 0;
|
||||||
|
e.marked_npc_2_zone_id = 0;
|
||||||
|
e.marked_npc_2_instance_id = 0;
|
||||||
|
e.marked_npc_3_entity_id = 0;
|
||||||
|
e.marked_npc_3_zone_id = 0;
|
||||||
|
e.marked_npc_3_instance_id = 0;
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@@ -116,8 +153,9 @@ public:
|
|||||||
{
|
{
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
"{} WHERE id = {} LIMIT 1",
|
"{} WHERE {} = {} LIMIT 1",
|
||||||
BaseSelect(),
|
BaseSelect(),
|
||||||
|
PrimaryKey(),
|
||||||
raid_details_id
|
raid_details_id
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -126,10 +164,19 @@ public:
|
|||||||
if (results.RowCount() == 1) {
|
if (results.RowCount() == 1) {
|
||||||
RaidDetails e{};
|
RaidDetails e{};
|
||||||
|
|
||||||
e.raidid = static_cast<int32_t>(atoi(row[0]));
|
e.raidid = static_cast<int32_t>(atoi(row[0]));
|
||||||
e.loottype = static_cast<int32_t>(atoi(row[1]));
|
e.loottype = static_cast<int32_t>(atoi(row[1]));
|
||||||
e.locked = static_cast<int8_t>(atoi(row[2]));
|
e.locked = static_cast<int8_t>(atoi(row[2]));
|
||||||
e.motd = row[3] ? row[3] : "";
|
e.motd = row[3] ? row[3] : "";
|
||||||
|
e.marked_npc_1_entity_id = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
|
||||||
|
e.marked_npc_1_zone_id = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
|
||||||
|
e.marked_npc_1_instance_id = static_cast<uint32_t>(strtoul(row[6], nullptr, 10));
|
||||||
|
e.marked_npc_2_entity_id = static_cast<uint32_t>(strtoul(row[7], nullptr, 10));
|
||||||
|
e.marked_npc_2_zone_id = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
|
||||||
|
e.marked_npc_2_instance_id = static_cast<uint32_t>(strtoul(row[9], nullptr, 10));
|
||||||
|
e.marked_npc_3_entity_id = static_cast<uint32_t>(strtoul(row[10], nullptr, 10));
|
||||||
|
e.marked_npc_3_zone_id = static_cast<uint32_t>(strtoul(row[11], nullptr, 10));
|
||||||
|
e.marked_npc_3_instance_id = static_cast<uint32_t>(strtoul(row[12], nullptr, 10));
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@@ -167,6 +214,15 @@ public:
|
|||||||
v.push_back(columns[1] + " = " + std::to_string(e.loottype));
|
v.push_back(columns[1] + " = " + std::to_string(e.loottype));
|
||||||
v.push_back(columns[2] + " = " + std::to_string(e.locked));
|
v.push_back(columns[2] + " = " + std::to_string(e.locked));
|
||||||
v.push_back(columns[3] + " = '" + Strings::Escape(e.motd) + "'");
|
v.push_back(columns[3] + " = '" + Strings::Escape(e.motd) + "'");
|
||||||
|
v.push_back(columns[4] + " = " + std::to_string(e.marked_npc_1_entity_id));
|
||||||
|
v.push_back(columns[5] + " = " + std::to_string(e.marked_npc_1_zone_id));
|
||||||
|
v.push_back(columns[6] + " = " + std::to_string(e.marked_npc_1_instance_id));
|
||||||
|
v.push_back(columns[7] + " = " + std::to_string(e.marked_npc_2_entity_id));
|
||||||
|
v.push_back(columns[8] + " = " + std::to_string(e.marked_npc_2_zone_id));
|
||||||
|
v.push_back(columns[9] + " = " + std::to_string(e.marked_npc_2_instance_id));
|
||||||
|
v.push_back(columns[10] + " = " + std::to_string(e.marked_npc_3_entity_id));
|
||||||
|
v.push_back(columns[11] + " = " + std::to_string(e.marked_npc_3_zone_id));
|
||||||
|
v.push_back(columns[12] + " = " + std::to_string(e.marked_npc_3_instance_id));
|
||||||
|
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
@@ -192,6 +248,15 @@ public:
|
|||||||
v.push_back(std::to_string(e.loottype));
|
v.push_back(std::to_string(e.loottype));
|
||||||
v.push_back(std::to_string(e.locked));
|
v.push_back(std::to_string(e.locked));
|
||||||
v.push_back("'" + Strings::Escape(e.motd) + "'");
|
v.push_back("'" + Strings::Escape(e.motd) + "'");
|
||||||
|
v.push_back(std::to_string(e.marked_npc_1_entity_id));
|
||||||
|
v.push_back(std::to_string(e.marked_npc_1_zone_id));
|
||||||
|
v.push_back(std::to_string(e.marked_npc_1_instance_id));
|
||||||
|
v.push_back(std::to_string(e.marked_npc_2_entity_id));
|
||||||
|
v.push_back(std::to_string(e.marked_npc_2_zone_id));
|
||||||
|
v.push_back(std::to_string(e.marked_npc_2_instance_id));
|
||||||
|
v.push_back(std::to_string(e.marked_npc_3_entity_id));
|
||||||
|
v.push_back(std::to_string(e.marked_npc_3_zone_id));
|
||||||
|
v.push_back(std::to_string(e.marked_npc_3_instance_id));
|
||||||
|
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
@@ -225,6 +290,15 @@ public:
|
|||||||
v.push_back(std::to_string(e.loottype));
|
v.push_back(std::to_string(e.loottype));
|
||||||
v.push_back(std::to_string(e.locked));
|
v.push_back(std::to_string(e.locked));
|
||||||
v.push_back("'" + Strings::Escape(e.motd) + "'");
|
v.push_back("'" + Strings::Escape(e.motd) + "'");
|
||||||
|
v.push_back(std::to_string(e.marked_npc_1_entity_id));
|
||||||
|
v.push_back(std::to_string(e.marked_npc_1_zone_id));
|
||||||
|
v.push_back(std::to_string(e.marked_npc_1_instance_id));
|
||||||
|
v.push_back(std::to_string(e.marked_npc_2_entity_id));
|
||||||
|
v.push_back(std::to_string(e.marked_npc_2_zone_id));
|
||||||
|
v.push_back(std::to_string(e.marked_npc_2_instance_id));
|
||||||
|
v.push_back(std::to_string(e.marked_npc_3_entity_id));
|
||||||
|
v.push_back(std::to_string(e.marked_npc_3_zone_id));
|
||||||
|
v.push_back(std::to_string(e.marked_npc_3_instance_id));
|
||||||
|
|
||||||
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
||||||
}
|
}
|
||||||
@@ -258,10 +332,19 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
RaidDetails e{};
|
RaidDetails e{};
|
||||||
|
|
||||||
e.raidid = static_cast<int32_t>(atoi(row[0]));
|
e.raidid = static_cast<int32_t>(atoi(row[0]));
|
||||||
e.loottype = static_cast<int32_t>(atoi(row[1]));
|
e.loottype = static_cast<int32_t>(atoi(row[1]));
|
||||||
e.locked = static_cast<int8_t>(atoi(row[2]));
|
e.locked = static_cast<int8_t>(atoi(row[2]));
|
||||||
e.motd = row[3] ? row[3] : "";
|
e.motd = row[3] ? row[3] : "";
|
||||||
|
e.marked_npc_1_entity_id = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
|
||||||
|
e.marked_npc_1_zone_id = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
|
||||||
|
e.marked_npc_1_instance_id = static_cast<uint32_t>(strtoul(row[6], nullptr, 10));
|
||||||
|
e.marked_npc_2_entity_id = static_cast<uint32_t>(strtoul(row[7], nullptr, 10));
|
||||||
|
e.marked_npc_2_zone_id = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
|
||||||
|
e.marked_npc_2_instance_id = static_cast<uint32_t>(strtoul(row[9], nullptr, 10));
|
||||||
|
e.marked_npc_3_entity_id = static_cast<uint32_t>(strtoul(row[10], nullptr, 10));
|
||||||
|
e.marked_npc_3_zone_id = static_cast<uint32_t>(strtoul(row[11], nullptr, 10));
|
||||||
|
e.marked_npc_3_instance_id = static_cast<uint32_t>(strtoul(row[12], nullptr, 10));
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -286,10 +369,19 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
RaidDetails e{};
|
RaidDetails e{};
|
||||||
|
|
||||||
e.raidid = static_cast<int32_t>(atoi(row[0]));
|
e.raidid = static_cast<int32_t>(atoi(row[0]));
|
||||||
e.loottype = static_cast<int32_t>(atoi(row[1]));
|
e.loottype = static_cast<int32_t>(atoi(row[1]));
|
||||||
e.locked = static_cast<int8_t>(atoi(row[2]));
|
e.locked = static_cast<int8_t>(atoi(row[2]));
|
||||||
e.motd = row[3] ? row[3] : "";
|
e.motd = row[3] ? row[3] : "";
|
||||||
|
e.marked_npc_1_entity_id = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
|
||||||
|
e.marked_npc_1_zone_id = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
|
||||||
|
e.marked_npc_1_instance_id = static_cast<uint32_t>(strtoul(row[6], nullptr, 10));
|
||||||
|
e.marked_npc_2_entity_id = static_cast<uint32_t>(strtoul(row[7], nullptr, 10));
|
||||||
|
e.marked_npc_2_zone_id = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
|
||||||
|
e.marked_npc_2_instance_id = static_cast<uint32_t>(strtoul(row[9], nullptr, 10));
|
||||||
|
e.marked_npc_3_entity_id = static_cast<uint32_t>(strtoul(row[10], nullptr, 10));
|
||||||
|
e.marked_npc_3_zone_id = static_cast<uint32_t>(strtoul(row[11], nullptr, 10));
|
||||||
|
e.marked_npc_3_instance_id = static_cast<uint32_t>(strtoul(row[12], nullptr, 10));
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,6 +31,9 @@ public:
|
|||||||
int8_t isgroupleader;
|
int8_t isgroupleader;
|
||||||
int8_t israidleader;
|
int8_t israidleader;
|
||||||
int8_t islooter;
|
int8_t islooter;
|
||||||
|
uint8_t is_marker;
|
||||||
|
uint8_t is_assister;
|
||||||
|
std::string note;
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::string PrimaryKey()
|
static std::string PrimaryKey()
|
||||||
@@ -52,6 +55,9 @@ public:
|
|||||||
"isgroupleader",
|
"isgroupleader",
|
||||||
"israidleader",
|
"israidleader",
|
||||||
"islooter",
|
"islooter",
|
||||||
|
"is_marker",
|
||||||
|
"is_assister",
|
||||||
|
"note",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,6 +75,9 @@ public:
|
|||||||
"isgroupleader",
|
"isgroupleader",
|
||||||
"israidleader",
|
"israidleader",
|
||||||
"islooter",
|
"islooter",
|
||||||
|
"is_marker",
|
||||||
|
"is_assister",
|
||||||
|
"note",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,6 +129,9 @@ public:
|
|||||||
e.isgroupleader = 0;
|
e.isgroupleader = 0;
|
||||||
e.israidleader = 0;
|
e.israidleader = 0;
|
||||||
e.islooter = 0;
|
e.islooter = 0;
|
||||||
|
e.is_marker = 0;
|
||||||
|
e.is_assister = 0;
|
||||||
|
e.note = "";
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@@ -167,6 +179,9 @@ public:
|
|||||||
e.isgroupleader = static_cast<int8_t>(atoi(row[8]));
|
e.isgroupleader = static_cast<int8_t>(atoi(row[8]));
|
||||||
e.israidleader = static_cast<int8_t>(atoi(row[9]));
|
e.israidleader = static_cast<int8_t>(atoi(row[9]));
|
||||||
e.islooter = static_cast<int8_t>(atoi(row[10]));
|
e.islooter = static_cast<int8_t>(atoi(row[10]));
|
||||||
|
e.is_marker = static_cast<uint8_t>(strtoul(row[11], nullptr, 10));
|
||||||
|
e.is_assister = static_cast<uint8_t>(strtoul(row[12], nullptr, 10));
|
||||||
|
e.note = row[13] ? row[13] : "";
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@@ -210,6 +225,9 @@ public:
|
|||||||
v.push_back(columns[8] + " = " + std::to_string(e.isgroupleader));
|
v.push_back(columns[8] + " = " + std::to_string(e.isgroupleader));
|
||||||
v.push_back(columns[9] + " = " + std::to_string(e.israidleader));
|
v.push_back(columns[9] + " = " + std::to_string(e.israidleader));
|
||||||
v.push_back(columns[10] + " = " + std::to_string(e.islooter));
|
v.push_back(columns[10] + " = " + std::to_string(e.islooter));
|
||||||
|
v.push_back(columns[11] + " = " + std::to_string(e.is_marker));
|
||||||
|
v.push_back(columns[12] + " = " + std::to_string(e.is_assister));
|
||||||
|
v.push_back(columns[13] + " = '" + Strings::Escape(e.note) + "'");
|
||||||
|
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
@@ -242,6 +260,9 @@ public:
|
|||||||
v.push_back(std::to_string(e.isgroupleader));
|
v.push_back(std::to_string(e.isgroupleader));
|
||||||
v.push_back(std::to_string(e.israidleader));
|
v.push_back(std::to_string(e.israidleader));
|
||||||
v.push_back(std::to_string(e.islooter));
|
v.push_back(std::to_string(e.islooter));
|
||||||
|
v.push_back(std::to_string(e.is_marker));
|
||||||
|
v.push_back(std::to_string(e.is_assister));
|
||||||
|
v.push_back("'" + Strings::Escape(e.note) + "'");
|
||||||
|
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
@@ -282,6 +303,9 @@ public:
|
|||||||
v.push_back(std::to_string(e.isgroupleader));
|
v.push_back(std::to_string(e.isgroupleader));
|
||||||
v.push_back(std::to_string(e.israidleader));
|
v.push_back(std::to_string(e.israidleader));
|
||||||
v.push_back(std::to_string(e.islooter));
|
v.push_back(std::to_string(e.islooter));
|
||||||
|
v.push_back(std::to_string(e.is_marker));
|
||||||
|
v.push_back(std::to_string(e.is_assister));
|
||||||
|
v.push_back("'" + Strings::Escape(e.note) + "'");
|
||||||
|
|
||||||
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
||||||
}
|
}
|
||||||
@@ -326,6 +350,9 @@ public:
|
|||||||
e.isgroupleader = static_cast<int8_t>(atoi(row[8]));
|
e.isgroupleader = static_cast<int8_t>(atoi(row[8]));
|
||||||
e.israidleader = static_cast<int8_t>(atoi(row[9]));
|
e.israidleader = static_cast<int8_t>(atoi(row[9]));
|
||||||
e.islooter = static_cast<int8_t>(atoi(row[10]));
|
e.islooter = static_cast<int8_t>(atoi(row[10]));
|
||||||
|
e.is_marker = static_cast<uint8_t>(strtoul(row[11], nullptr, 10));
|
||||||
|
e.is_assister = static_cast<uint8_t>(strtoul(row[12], nullptr, 10));
|
||||||
|
e.note = row[13] ? row[13] : "";
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -361,6 +388,9 @@ public:
|
|||||||
e.isgroupleader = static_cast<int8_t>(atoi(row[8]));
|
e.isgroupleader = static_cast<int8_t>(atoi(row[8]));
|
||||||
e.israidleader = static_cast<int8_t>(atoi(row[9]));
|
e.israidleader = static_cast<int8_t>(atoi(row[9]));
|
||||||
e.islooter = static_cast<int8_t>(atoi(row[10]));
|
e.islooter = static_cast<int8_t>(atoi(row[10]));
|
||||||
|
e.is_marker = static_cast<uint8_t>(strtoul(row[11], nullptr, 10));
|
||||||
|
e.is_assister = static_cast<uint8_t>(strtoul(row[12], nullptr, 10));
|
||||||
|
e.note = row[13] ? row[13] : "";
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,354 @@
|
|||||||
|
/**
|
||||||
|
* DO NOT MODIFY THIS FILE
|
||||||
|
*
|
||||||
|
* This repository was automatically generated and is NOT to be modified directly.
|
||||||
|
* Any repository modifications are meant to be made to the repository extending the base.
|
||||||
|
* Any modifications to base repositories are to be made by the generator only
|
||||||
|
*
|
||||||
|
* @generator ./utils/scripts/generators/repository-generator.pl
|
||||||
|
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef EQEMU_BASE_SPAWN2_DISABLED_REPOSITORY_H
|
||||||
|
#define EQEMU_BASE_SPAWN2_DISABLED_REPOSITORY_H
|
||||||
|
|
||||||
|
#include "../../database.h"
|
||||||
|
#include "../../strings.h"
|
||||||
|
#include <ctime>
|
||||||
|
|
||||||
|
|
||||||
|
class BaseSpawn2DisabledRepository {
|
||||||
|
public:
|
||||||
|
struct Spawn2Disabled {
|
||||||
|
int64_t id;
|
||||||
|
int32_t spawn2_id;
|
||||||
|
int32_t instance_id;
|
||||||
|
int16_t disabled;
|
||||||
|
};
|
||||||
|
|
||||||
|
static std::string PrimaryKey()
|
||||||
|
{
|
||||||
|
return std::string("id");
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::vector<std::string> Columns()
|
||||||
|
{
|
||||||
|
return {
|
||||||
|
"id",
|
||||||
|
"spawn2_id",
|
||||||
|
"instance_id",
|
||||||
|
"disabled",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::vector<std::string> SelectColumns()
|
||||||
|
{
|
||||||
|
return {
|
||||||
|
"id",
|
||||||
|
"spawn2_id",
|
||||||
|
"instance_id",
|
||||||
|
"disabled",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string ColumnsRaw()
|
||||||
|
{
|
||||||
|
return std::string(Strings::Implode(", ", Columns()));
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string SelectColumnsRaw()
|
||||||
|
{
|
||||||
|
return std::string(Strings::Implode(", ", SelectColumns()));
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string TableName()
|
||||||
|
{
|
||||||
|
return std::string("spawn2_disabled");
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string BaseSelect()
|
||||||
|
{
|
||||||
|
return fmt::format(
|
||||||
|
"SELECT {} FROM {}",
|
||||||
|
SelectColumnsRaw(),
|
||||||
|
TableName()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string BaseInsert()
|
||||||
|
{
|
||||||
|
return fmt::format(
|
||||||
|
"INSERT INTO {} ({}) ",
|
||||||
|
TableName(),
|
||||||
|
ColumnsRaw()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Spawn2Disabled NewEntity()
|
||||||
|
{
|
||||||
|
Spawn2Disabled e{};
|
||||||
|
|
||||||
|
e.id = 0;
|
||||||
|
e.spawn2_id = 0;
|
||||||
|
e.instance_id = 0;
|
||||||
|
e.disabled = 0;
|
||||||
|
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Spawn2Disabled GetSpawn2Disabled(
|
||||||
|
const std::vector<Spawn2Disabled> &spawn2_disableds,
|
||||||
|
int spawn2_disabled_id
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (auto &spawn2_disabled : spawn2_disableds) {
|
||||||
|
if (spawn2_disabled.id == spawn2_disabled_id) {
|
||||||
|
return spawn2_disabled;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NewEntity();
|
||||||
|
}
|
||||||
|
|
||||||
|
static Spawn2Disabled FindOne(
|
||||||
|
Database& db,
|
||||||
|
int spawn2_disabled_id
|
||||||
|
)
|
||||||
|
{
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"{} WHERE {} = {} LIMIT 1",
|
||||||
|
BaseSelect(),
|
||||||
|
PrimaryKey(),
|
||||||
|
spawn2_disabled_id
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
auto row = results.begin();
|
||||||
|
if (results.RowCount() == 1) {
|
||||||
|
Spawn2Disabled e{};
|
||||||
|
|
||||||
|
e.id = strtoll(row[0], nullptr, 10);
|
||||||
|
e.spawn2_id = static_cast<int32_t>(atoi(row[1]));
|
||||||
|
e.instance_id = static_cast<int32_t>(atoi(row[2]));
|
||||||
|
e.disabled = static_cast<int16_t>(atoi(row[3]));
|
||||||
|
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NewEntity();
|
||||||
|
}
|
||||||
|
|
||||||
|
static int DeleteOne(
|
||||||
|
Database& db,
|
||||||
|
int spawn2_disabled_id
|
||||||
|
)
|
||||||
|
{
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"DELETE FROM {} WHERE {} = {}",
|
||||||
|
TableName(),
|
||||||
|
PrimaryKey(),
|
||||||
|
spawn2_disabled_id
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() ? results.RowsAffected() : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int UpdateOne(
|
||||||
|
Database& db,
|
||||||
|
const Spawn2Disabled &e
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
auto columns = Columns();
|
||||||
|
|
||||||
|
v.push_back(columns[1] + " = " + std::to_string(e.spawn2_id));
|
||||||
|
v.push_back(columns[2] + " = " + std::to_string(e.instance_id));
|
||||||
|
v.push_back(columns[3] + " = " + std::to_string(e.disabled));
|
||||||
|
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"UPDATE {} SET {} WHERE {} = {}",
|
||||||
|
TableName(),
|
||||||
|
Strings::Implode(", ", v),
|
||||||
|
PrimaryKey(),
|
||||||
|
e.id
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() ? results.RowsAffected() : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Spawn2Disabled InsertOne(
|
||||||
|
Database& db,
|
||||||
|
Spawn2Disabled e
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.id));
|
||||||
|
v.push_back(std::to_string(e.spawn2_id));
|
||||||
|
v.push_back(std::to_string(e.instance_id));
|
||||||
|
v.push_back(std::to_string(e.disabled));
|
||||||
|
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"{} VALUES ({})",
|
||||||
|
BaseInsert(),
|
||||||
|
Strings::Implode(",", v)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (results.Success()) {
|
||||||
|
e.id = results.LastInsertedID();
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
e = NewEntity();
|
||||||
|
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int InsertMany(
|
||||||
|
Database& db,
|
||||||
|
const std::vector<Spawn2Disabled> &entries
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> insert_chunks;
|
||||||
|
|
||||||
|
for (auto &e: entries) {
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.id));
|
||||||
|
v.push_back(std::to_string(e.spawn2_id));
|
||||||
|
v.push_back(std::to_string(e.instance_id));
|
||||||
|
v.push_back(std::to_string(e.disabled));
|
||||||
|
|
||||||
|
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"{} VALUES {}",
|
||||||
|
BaseInsert(),
|
||||||
|
Strings::Implode(",", insert_chunks)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() ? results.RowsAffected() : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::vector<Spawn2Disabled> All(Database& db)
|
||||||
|
{
|
||||||
|
std::vector<Spawn2Disabled> all_entries;
|
||||||
|
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"{}",
|
||||||
|
BaseSelect()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
all_entries.reserve(results.RowCount());
|
||||||
|
|
||||||
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
|
Spawn2Disabled e{};
|
||||||
|
|
||||||
|
e.id = strtoll(row[0], nullptr, 10);
|
||||||
|
e.spawn2_id = static_cast<int32_t>(atoi(row[1]));
|
||||||
|
e.instance_id = static_cast<int32_t>(atoi(row[2]));
|
||||||
|
e.disabled = static_cast<int16_t>(atoi(row[3]));
|
||||||
|
|
||||||
|
all_entries.push_back(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return all_entries;
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::vector<Spawn2Disabled> GetWhere(Database& db, const std::string &where_filter)
|
||||||
|
{
|
||||||
|
std::vector<Spawn2Disabled> all_entries;
|
||||||
|
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"{} WHERE {}",
|
||||||
|
BaseSelect(),
|
||||||
|
where_filter
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
all_entries.reserve(results.RowCount());
|
||||||
|
|
||||||
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
|
Spawn2Disabled e{};
|
||||||
|
|
||||||
|
e.id = strtoll(row[0], nullptr, 10);
|
||||||
|
e.spawn2_id = static_cast<int32_t>(atoi(row[1]));
|
||||||
|
e.instance_id = static_cast<int32_t>(atoi(row[2]));
|
||||||
|
e.disabled = static_cast<int16_t>(atoi(row[3]));
|
||||||
|
|
||||||
|
all_entries.push_back(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return all_entries;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int DeleteWhere(Database& db, const std::string &where_filter)
|
||||||
|
{
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"DELETE FROM {} WHERE {}",
|
||||||
|
TableName(),
|
||||||
|
where_filter
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() ? results.RowsAffected() : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int Truncate(Database& db)
|
||||||
|
{
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"TRUNCATE TABLE {}",
|
||||||
|
TableName()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() ? results.RowsAffected() : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int64 GetMaxId(Database& db)
|
||||||
|
{
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"SELECT COALESCE(MAX({}), 0) FROM {}",
|
||||||
|
PrimaryKey(),
|
||||||
|
TableName()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int64 Count(Database& db, const std::string &where_filter = "")
|
||||||
|
{
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"SELECT COUNT(*) FROM {} {}",
|
||||||
|
TableName(),
|
||||||
|
(where_filter.empty() ? "" : "WHERE " + where_filter)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //EQEMU_BASE_SPAWN2_DISABLED_REPOSITORY_H
|
||||||
@@ -16,6 +16,7 @@
|
|||||||
#include "../../strings.h"
|
#include "../../strings.h"
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
|
|
||||||
|
|
||||||
class BaseSpawn2Repository {
|
class BaseSpawn2Repository {
|
||||||
public:
|
public:
|
||||||
struct Spawn2 {
|
struct Spawn2 {
|
||||||
@@ -33,7 +34,6 @@ public:
|
|||||||
int8_t path_when_zone_idle;
|
int8_t path_when_zone_idle;
|
||||||
uint32_t _condition;
|
uint32_t _condition;
|
||||||
int32_t cond_value;
|
int32_t cond_value;
|
||||||
uint8_t enabled;
|
|
||||||
uint8_t animation;
|
uint8_t animation;
|
||||||
int8_t min_expansion;
|
int8_t min_expansion;
|
||||||
int8_t max_expansion;
|
int8_t max_expansion;
|
||||||
@@ -63,7 +63,6 @@ public:
|
|||||||
"path_when_zone_idle",
|
"path_when_zone_idle",
|
||||||
"_condition",
|
"_condition",
|
||||||
"cond_value",
|
"cond_value",
|
||||||
"enabled",
|
|
||||||
"animation",
|
"animation",
|
||||||
"min_expansion",
|
"min_expansion",
|
||||||
"max_expansion",
|
"max_expansion",
|
||||||
@@ -89,7 +88,6 @@ public:
|
|||||||
"path_when_zone_idle",
|
"path_when_zone_idle",
|
||||||
"_condition",
|
"_condition",
|
||||||
"cond_value",
|
"cond_value",
|
||||||
"enabled",
|
|
||||||
"animation",
|
"animation",
|
||||||
"min_expansion",
|
"min_expansion",
|
||||||
"max_expansion",
|
"max_expansion",
|
||||||
@@ -149,7 +147,6 @@ public:
|
|||||||
e.path_when_zone_idle = 0;
|
e.path_when_zone_idle = 0;
|
||||||
e._condition = 0;
|
e._condition = 0;
|
||||||
e.cond_value = 1;
|
e.cond_value = 1;
|
||||||
e.enabled = 1;
|
|
||||||
e.animation = 0;
|
e.animation = 0;
|
||||||
e.min_expansion = -1;
|
e.min_expansion = -1;
|
||||||
e.max_expansion = -1;
|
e.max_expansion = -1;
|
||||||
@@ -180,8 +177,9 @@ public:
|
|||||||
{
|
{
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
"{} WHERE id = {} LIMIT 1",
|
"{} WHERE {} = {} LIMIT 1",
|
||||||
BaseSelect(),
|
BaseSelect(),
|
||||||
|
PrimaryKey(),
|
||||||
spawn2_id
|
spawn2_id
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -204,12 +202,11 @@ public:
|
|||||||
e.path_when_zone_idle = static_cast<int8_t>(atoi(row[11]));
|
e.path_when_zone_idle = static_cast<int8_t>(atoi(row[11]));
|
||||||
e._condition = static_cast<uint32_t>(strtoul(row[12], nullptr, 10));
|
e._condition = static_cast<uint32_t>(strtoul(row[12], nullptr, 10));
|
||||||
e.cond_value = static_cast<int32_t>(atoi(row[13]));
|
e.cond_value = static_cast<int32_t>(atoi(row[13]));
|
||||||
e.enabled = static_cast<uint8_t>(strtoul(row[14], nullptr, 10));
|
e.animation = static_cast<uint8_t>(strtoul(row[14], nullptr, 10));
|
||||||
e.animation = static_cast<uint8_t>(strtoul(row[15], nullptr, 10));
|
e.min_expansion = static_cast<int8_t>(atoi(row[15]));
|
||||||
e.min_expansion = static_cast<int8_t>(atoi(row[16]));
|
e.max_expansion = static_cast<int8_t>(atoi(row[16]));
|
||||||
e.max_expansion = static_cast<int8_t>(atoi(row[17]));
|
e.content_flags = row[17] ? row[17] : "";
|
||||||
e.content_flags = row[18] ? row[18] : "";
|
e.content_flags_disabled = row[18] ? row[18] : "";
|
||||||
e.content_flags_disabled = row[19] ? row[19] : "";
|
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@@ -256,12 +253,11 @@ public:
|
|||||||
v.push_back(columns[11] + " = " + std::to_string(e.path_when_zone_idle));
|
v.push_back(columns[11] + " = " + std::to_string(e.path_when_zone_idle));
|
||||||
v.push_back(columns[12] + " = " + std::to_string(e._condition));
|
v.push_back(columns[12] + " = " + std::to_string(e._condition));
|
||||||
v.push_back(columns[13] + " = " + std::to_string(e.cond_value));
|
v.push_back(columns[13] + " = " + std::to_string(e.cond_value));
|
||||||
v.push_back(columns[14] + " = " + std::to_string(e.enabled));
|
v.push_back(columns[14] + " = " + std::to_string(e.animation));
|
||||||
v.push_back(columns[15] + " = " + std::to_string(e.animation));
|
v.push_back(columns[15] + " = " + std::to_string(e.min_expansion));
|
||||||
v.push_back(columns[16] + " = " + std::to_string(e.min_expansion));
|
v.push_back(columns[16] + " = " + std::to_string(e.max_expansion));
|
||||||
v.push_back(columns[17] + " = " + std::to_string(e.max_expansion));
|
v.push_back(columns[17] + " = '" + Strings::Escape(e.content_flags) + "'");
|
||||||
v.push_back(columns[18] + " = '" + Strings::Escape(e.content_flags) + "'");
|
v.push_back(columns[18] + " = '" + Strings::Escape(e.content_flags_disabled) + "'");
|
||||||
v.push_back(columns[19] + " = '" + Strings::Escape(e.content_flags_disabled) + "'");
|
|
||||||
|
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
@@ -297,7 +293,6 @@ public:
|
|||||||
v.push_back(std::to_string(e.path_when_zone_idle));
|
v.push_back(std::to_string(e.path_when_zone_idle));
|
||||||
v.push_back(std::to_string(e._condition));
|
v.push_back(std::to_string(e._condition));
|
||||||
v.push_back(std::to_string(e.cond_value));
|
v.push_back(std::to_string(e.cond_value));
|
||||||
v.push_back(std::to_string(e.enabled));
|
|
||||||
v.push_back(std::to_string(e.animation));
|
v.push_back(std::to_string(e.animation));
|
||||||
v.push_back(std::to_string(e.min_expansion));
|
v.push_back(std::to_string(e.min_expansion));
|
||||||
v.push_back(std::to_string(e.max_expansion));
|
v.push_back(std::to_string(e.max_expansion));
|
||||||
@@ -346,7 +341,6 @@ public:
|
|||||||
v.push_back(std::to_string(e.path_when_zone_idle));
|
v.push_back(std::to_string(e.path_when_zone_idle));
|
||||||
v.push_back(std::to_string(e._condition));
|
v.push_back(std::to_string(e._condition));
|
||||||
v.push_back(std::to_string(e.cond_value));
|
v.push_back(std::to_string(e.cond_value));
|
||||||
v.push_back(std::to_string(e.enabled));
|
|
||||||
v.push_back(std::to_string(e.animation));
|
v.push_back(std::to_string(e.animation));
|
||||||
v.push_back(std::to_string(e.min_expansion));
|
v.push_back(std::to_string(e.min_expansion));
|
||||||
v.push_back(std::to_string(e.max_expansion));
|
v.push_back(std::to_string(e.max_expansion));
|
||||||
@@ -399,12 +393,11 @@ public:
|
|||||||
e.path_when_zone_idle = static_cast<int8_t>(atoi(row[11]));
|
e.path_when_zone_idle = static_cast<int8_t>(atoi(row[11]));
|
||||||
e._condition = static_cast<uint32_t>(strtoul(row[12], nullptr, 10));
|
e._condition = static_cast<uint32_t>(strtoul(row[12], nullptr, 10));
|
||||||
e.cond_value = static_cast<int32_t>(atoi(row[13]));
|
e.cond_value = static_cast<int32_t>(atoi(row[13]));
|
||||||
e.enabled = static_cast<uint8_t>(strtoul(row[14], nullptr, 10));
|
e.animation = static_cast<uint8_t>(strtoul(row[14], nullptr, 10));
|
||||||
e.animation = static_cast<uint8_t>(strtoul(row[15], nullptr, 10));
|
e.min_expansion = static_cast<int8_t>(atoi(row[15]));
|
||||||
e.min_expansion = static_cast<int8_t>(atoi(row[16]));
|
e.max_expansion = static_cast<int8_t>(atoi(row[16]));
|
||||||
e.max_expansion = static_cast<int8_t>(atoi(row[17]));
|
e.content_flags = row[17] ? row[17] : "";
|
||||||
e.content_flags = row[18] ? row[18] : "";
|
e.content_flags_disabled = row[18] ? row[18] : "";
|
||||||
e.content_flags_disabled = row[19] ? row[19] : "";
|
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -443,12 +436,11 @@ public:
|
|||||||
e.path_when_zone_idle = static_cast<int8_t>(atoi(row[11]));
|
e.path_when_zone_idle = static_cast<int8_t>(atoi(row[11]));
|
||||||
e._condition = static_cast<uint32_t>(strtoul(row[12], nullptr, 10));
|
e._condition = static_cast<uint32_t>(strtoul(row[12], nullptr, 10));
|
||||||
e.cond_value = static_cast<int32_t>(atoi(row[13]));
|
e.cond_value = static_cast<int32_t>(atoi(row[13]));
|
||||||
e.enabled = static_cast<uint8_t>(strtoul(row[14], nullptr, 10));
|
e.animation = static_cast<uint8_t>(strtoul(row[14], nullptr, 10));
|
||||||
e.animation = static_cast<uint8_t>(strtoul(row[15], nullptr, 10));
|
e.min_expansion = static_cast<int8_t>(atoi(row[15]));
|
||||||
e.min_expansion = static_cast<int8_t>(atoi(row[16]));
|
e.max_expansion = static_cast<int8_t>(atoi(row[16]));
|
||||||
e.max_expansion = static_cast<int8_t>(atoi(row[17]));
|
e.content_flags = row[17] ? row[17] : "";
|
||||||
e.content_flags = row[18] ? row[18] : "";
|
e.content_flags_disabled = row[18] ? row[18] : "";
|
||||||
e.content_flags_disabled = row[19] ? row[19] : "";
|
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
#include "../../strings.h"
|
#include "../../strings.h"
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
|
|
||||||
|
|
||||||
class BaseSpawnentryRepository {
|
class BaseSpawnentryRepository {
|
||||||
public:
|
public:
|
||||||
struct Spawnentry {
|
struct Spawnentry {
|
||||||
@@ -23,6 +24,8 @@ public:
|
|||||||
int32_t npcID;
|
int32_t npcID;
|
||||||
int16_t chance;
|
int16_t chance;
|
||||||
int32_t condition_value_filter;
|
int32_t condition_value_filter;
|
||||||
|
int16_t min_time;
|
||||||
|
int16_t max_time;
|
||||||
int8_t min_expansion;
|
int8_t min_expansion;
|
||||||
int8_t max_expansion;
|
int8_t max_expansion;
|
||||||
std::string content_flags;
|
std::string content_flags;
|
||||||
@@ -41,6 +44,8 @@ public:
|
|||||||
"npcID",
|
"npcID",
|
||||||
"chance",
|
"chance",
|
||||||
"condition_value_filter",
|
"condition_value_filter",
|
||||||
|
"min_time",
|
||||||
|
"max_time",
|
||||||
"min_expansion",
|
"min_expansion",
|
||||||
"max_expansion",
|
"max_expansion",
|
||||||
"content_flags",
|
"content_flags",
|
||||||
@@ -55,6 +60,8 @@ public:
|
|||||||
"npcID",
|
"npcID",
|
||||||
"chance",
|
"chance",
|
||||||
"condition_value_filter",
|
"condition_value_filter",
|
||||||
|
"min_time",
|
||||||
|
"max_time",
|
||||||
"min_expansion",
|
"min_expansion",
|
||||||
"max_expansion",
|
"max_expansion",
|
||||||
"content_flags",
|
"content_flags",
|
||||||
@@ -103,6 +110,8 @@ public:
|
|||||||
e.npcID = 0;
|
e.npcID = 0;
|
||||||
e.chance = 0;
|
e.chance = 0;
|
||||||
e.condition_value_filter = 1;
|
e.condition_value_filter = 1;
|
||||||
|
e.min_time = 0;
|
||||||
|
e.max_time = 0;
|
||||||
e.min_expansion = -1;
|
e.min_expansion = -1;
|
||||||
e.max_expansion = -1;
|
e.max_expansion = -1;
|
||||||
e.content_flags = "";
|
e.content_flags = "";
|
||||||
@@ -132,8 +141,9 @@ public:
|
|||||||
{
|
{
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
"{} WHERE id = {} LIMIT 1",
|
"{} WHERE {} = {} LIMIT 1",
|
||||||
BaseSelect(),
|
BaseSelect(),
|
||||||
|
PrimaryKey(),
|
||||||
spawnentry_id
|
spawnentry_id
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -146,10 +156,12 @@ public:
|
|||||||
e.npcID = static_cast<int32_t>(atoi(row[1]));
|
e.npcID = static_cast<int32_t>(atoi(row[1]));
|
||||||
e.chance = static_cast<int16_t>(atoi(row[2]));
|
e.chance = static_cast<int16_t>(atoi(row[2]));
|
||||||
e.condition_value_filter = static_cast<int32_t>(atoi(row[3]));
|
e.condition_value_filter = static_cast<int32_t>(atoi(row[3]));
|
||||||
e.min_expansion = static_cast<int8_t>(atoi(row[4]));
|
e.min_time = static_cast<int16_t>(atoi(row[4]));
|
||||||
e.max_expansion = static_cast<int8_t>(atoi(row[5]));
|
e.max_time = static_cast<int16_t>(atoi(row[5]));
|
||||||
e.content_flags = row[6] ? row[6] : "";
|
e.min_expansion = static_cast<int8_t>(atoi(row[6]));
|
||||||
e.content_flags_disabled = row[7] ? row[7] : "";
|
e.max_expansion = static_cast<int8_t>(atoi(row[7]));
|
||||||
|
e.content_flags = row[8] ? row[8] : "";
|
||||||
|
e.content_flags_disabled = row[9] ? row[9] : "";
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@@ -187,10 +199,12 @@ public:
|
|||||||
v.push_back(columns[1] + " = " + std::to_string(e.npcID));
|
v.push_back(columns[1] + " = " + std::to_string(e.npcID));
|
||||||
v.push_back(columns[2] + " = " + std::to_string(e.chance));
|
v.push_back(columns[2] + " = " + std::to_string(e.chance));
|
||||||
v.push_back(columns[3] + " = " + std::to_string(e.condition_value_filter));
|
v.push_back(columns[3] + " = " + std::to_string(e.condition_value_filter));
|
||||||
v.push_back(columns[4] + " = " + std::to_string(e.min_expansion));
|
v.push_back(columns[4] + " = " + std::to_string(e.min_time));
|
||||||
v.push_back(columns[5] + " = " + std::to_string(e.max_expansion));
|
v.push_back(columns[5] + " = " + std::to_string(e.max_time));
|
||||||
v.push_back(columns[6] + " = '" + Strings::Escape(e.content_flags) + "'");
|
v.push_back(columns[6] + " = " + std::to_string(e.min_expansion));
|
||||||
v.push_back(columns[7] + " = '" + Strings::Escape(e.content_flags_disabled) + "'");
|
v.push_back(columns[7] + " = " + std::to_string(e.max_expansion));
|
||||||
|
v.push_back(columns[8] + " = '" + Strings::Escape(e.content_flags) + "'");
|
||||||
|
v.push_back(columns[9] + " = '" + Strings::Escape(e.content_flags_disabled) + "'");
|
||||||
|
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
@@ -216,6 +230,8 @@ public:
|
|||||||
v.push_back(std::to_string(e.npcID));
|
v.push_back(std::to_string(e.npcID));
|
||||||
v.push_back(std::to_string(e.chance));
|
v.push_back(std::to_string(e.chance));
|
||||||
v.push_back(std::to_string(e.condition_value_filter));
|
v.push_back(std::to_string(e.condition_value_filter));
|
||||||
|
v.push_back(std::to_string(e.min_time));
|
||||||
|
v.push_back(std::to_string(e.max_time));
|
||||||
v.push_back(std::to_string(e.min_expansion));
|
v.push_back(std::to_string(e.min_expansion));
|
||||||
v.push_back(std::to_string(e.max_expansion));
|
v.push_back(std::to_string(e.max_expansion));
|
||||||
v.push_back("'" + Strings::Escape(e.content_flags) + "'");
|
v.push_back("'" + Strings::Escape(e.content_flags) + "'");
|
||||||
@@ -253,6 +269,8 @@ public:
|
|||||||
v.push_back(std::to_string(e.npcID));
|
v.push_back(std::to_string(e.npcID));
|
||||||
v.push_back(std::to_string(e.chance));
|
v.push_back(std::to_string(e.chance));
|
||||||
v.push_back(std::to_string(e.condition_value_filter));
|
v.push_back(std::to_string(e.condition_value_filter));
|
||||||
|
v.push_back(std::to_string(e.min_time));
|
||||||
|
v.push_back(std::to_string(e.max_time));
|
||||||
v.push_back(std::to_string(e.min_expansion));
|
v.push_back(std::to_string(e.min_expansion));
|
||||||
v.push_back(std::to_string(e.max_expansion));
|
v.push_back(std::to_string(e.max_expansion));
|
||||||
v.push_back("'" + Strings::Escape(e.content_flags) + "'");
|
v.push_back("'" + Strings::Escape(e.content_flags) + "'");
|
||||||
@@ -294,10 +312,12 @@ public:
|
|||||||
e.npcID = static_cast<int32_t>(atoi(row[1]));
|
e.npcID = static_cast<int32_t>(atoi(row[1]));
|
||||||
e.chance = static_cast<int16_t>(atoi(row[2]));
|
e.chance = static_cast<int16_t>(atoi(row[2]));
|
||||||
e.condition_value_filter = static_cast<int32_t>(atoi(row[3]));
|
e.condition_value_filter = static_cast<int32_t>(atoi(row[3]));
|
||||||
e.min_expansion = static_cast<int8_t>(atoi(row[4]));
|
e.min_time = static_cast<int16_t>(atoi(row[4]));
|
||||||
e.max_expansion = static_cast<int8_t>(atoi(row[5]));
|
e.max_time = static_cast<int16_t>(atoi(row[5]));
|
||||||
e.content_flags = row[6] ? row[6] : "";
|
e.min_expansion = static_cast<int8_t>(atoi(row[6]));
|
||||||
e.content_flags_disabled = row[7] ? row[7] : "";
|
e.max_expansion = static_cast<int8_t>(atoi(row[7]));
|
||||||
|
e.content_flags = row[8] ? row[8] : "";
|
||||||
|
e.content_flags_disabled = row[9] ? row[9] : "";
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -326,10 +346,12 @@ public:
|
|||||||
e.npcID = static_cast<int32_t>(atoi(row[1]));
|
e.npcID = static_cast<int32_t>(atoi(row[1]));
|
||||||
e.chance = static_cast<int16_t>(atoi(row[2]));
|
e.chance = static_cast<int16_t>(atoi(row[2]));
|
||||||
e.condition_value_filter = static_cast<int32_t>(atoi(row[3]));
|
e.condition_value_filter = static_cast<int32_t>(atoi(row[3]));
|
||||||
e.min_expansion = static_cast<int8_t>(atoi(row[4]));
|
e.min_time = static_cast<int16_t>(atoi(row[4]));
|
||||||
e.max_expansion = static_cast<int8_t>(atoi(row[5]));
|
e.max_time = static_cast<int16_t>(atoi(row[5]));
|
||||||
e.content_flags = row[6] ? row[6] : "";
|
e.min_expansion = static_cast<int8_t>(atoi(row[6]));
|
||||||
e.content_flags_disabled = row[7] ? row[7] : "";
|
e.max_expansion = static_cast<int8_t>(atoi(row[7]));
|
||||||
|
e.content_flags = row[8] ? row[8] : "";
|
||||||
|
e.content_flags_disabled = row[9] ? row[9] : "";
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,18 +16,19 @@
|
|||||||
#include "../../strings.h"
|
#include "../../strings.h"
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
|
|
||||||
|
|
||||||
class BaseStartingItemsRepository {
|
class BaseStartingItemsRepository {
|
||||||
public:
|
public:
|
||||||
struct StartingItems {
|
struct StartingItems {
|
||||||
uint32_t id;
|
uint32_t id;
|
||||||
int32_t race;
|
std::string class_list;
|
||||||
int32_t class_;
|
std::string race_list;
|
||||||
int32_t deityid;
|
std::string deity_list;
|
||||||
int32_t zoneid;
|
std::string zone_id_list;
|
||||||
int32_t itemid;
|
uint32_t item_id;
|
||||||
uint8_t item_charges;
|
uint8_t item_charges;
|
||||||
int8_t gm;
|
int32_t status;
|
||||||
int32_t slot;
|
int32_t inventory_slot;
|
||||||
int8_t min_expansion;
|
int8_t min_expansion;
|
||||||
int8_t max_expansion;
|
int8_t max_expansion;
|
||||||
std::string content_flags;
|
std::string content_flags;
|
||||||
@@ -43,14 +44,14 @@ public:
|
|||||||
{
|
{
|
||||||
return {
|
return {
|
||||||
"id",
|
"id",
|
||||||
"race",
|
"class_list",
|
||||||
"`class`",
|
"race_list",
|
||||||
"deityid",
|
"deity_list",
|
||||||
"zoneid",
|
"zone_id_list",
|
||||||
"itemid",
|
"item_id",
|
||||||
"item_charges",
|
"item_charges",
|
||||||
"gm",
|
"status",
|
||||||
"slot",
|
"inventory_slot",
|
||||||
"min_expansion",
|
"min_expansion",
|
||||||
"max_expansion",
|
"max_expansion",
|
||||||
"content_flags",
|
"content_flags",
|
||||||
@@ -62,14 +63,14 @@ public:
|
|||||||
{
|
{
|
||||||
return {
|
return {
|
||||||
"id",
|
"id",
|
||||||
"race",
|
"class_list",
|
||||||
"`class`",
|
"race_list",
|
||||||
"deityid",
|
"deity_list",
|
||||||
"zoneid",
|
"zone_id_list",
|
||||||
"itemid",
|
"item_id",
|
||||||
"item_charges",
|
"item_charges",
|
||||||
"gm",
|
"status",
|
||||||
"slot",
|
"inventory_slot",
|
||||||
"min_expansion",
|
"min_expansion",
|
||||||
"max_expansion",
|
"max_expansion",
|
||||||
"content_flags",
|
"content_flags",
|
||||||
@@ -115,14 +116,14 @@ public:
|
|||||||
StartingItems e{};
|
StartingItems e{};
|
||||||
|
|
||||||
e.id = 0;
|
e.id = 0;
|
||||||
e.race = 0;
|
e.class_list = "";
|
||||||
e.class_ = 0;
|
e.race_list = "";
|
||||||
e.deityid = 0;
|
e.deity_list = "";
|
||||||
e.zoneid = 0;
|
e.zone_id_list = "";
|
||||||
e.itemid = 0;
|
e.item_id = 0;
|
||||||
e.item_charges = 1;
|
e.item_charges = 1;
|
||||||
e.gm = 0;
|
e.status = 0;
|
||||||
e.slot = -1;
|
e.inventory_slot = -1;
|
||||||
e.min_expansion = -1;
|
e.min_expansion = -1;
|
||||||
e.max_expansion = -1;
|
e.max_expansion = -1;
|
||||||
e.content_flags = "";
|
e.content_flags = "";
|
||||||
@@ -152,8 +153,9 @@ public:
|
|||||||
{
|
{
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
"{} WHERE id = {} LIMIT 1",
|
"{} WHERE {} = {} LIMIT 1",
|
||||||
BaseSelect(),
|
BaseSelect(),
|
||||||
|
PrimaryKey(),
|
||||||
starting_items_id
|
starting_items_id
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -163,14 +165,14 @@ public:
|
|||||||
StartingItems e{};
|
StartingItems e{};
|
||||||
|
|
||||||
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
||||||
e.race = static_cast<int32_t>(atoi(row[1]));
|
e.class_list = row[1] ? row[1] : "";
|
||||||
e.class_ = static_cast<int32_t>(atoi(row[2]));
|
e.race_list = row[2] ? row[2] : "";
|
||||||
e.deityid = static_cast<int32_t>(atoi(row[3]));
|
e.deity_list = row[3] ? row[3] : "";
|
||||||
e.zoneid = static_cast<int32_t>(atoi(row[4]));
|
e.zone_id_list = row[4] ? row[4] : "";
|
||||||
e.itemid = static_cast<int32_t>(atoi(row[5]));
|
e.item_id = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
|
||||||
e.item_charges = static_cast<uint8_t>(strtoul(row[6], nullptr, 10));
|
e.item_charges = static_cast<uint8_t>(strtoul(row[6], nullptr, 10));
|
||||||
e.gm = static_cast<int8_t>(atoi(row[7]));
|
e.status = static_cast<int32_t>(atoi(row[7]));
|
||||||
e.slot = static_cast<int32_t>(atoi(row[8]));
|
e.inventory_slot = static_cast<int32_t>(atoi(row[8]));
|
||||||
e.min_expansion = static_cast<int8_t>(atoi(row[9]));
|
e.min_expansion = static_cast<int8_t>(atoi(row[9]));
|
||||||
e.max_expansion = static_cast<int8_t>(atoi(row[10]));
|
e.max_expansion = static_cast<int8_t>(atoi(row[10]));
|
||||||
e.content_flags = row[11] ? row[11] : "";
|
e.content_flags = row[11] ? row[11] : "";
|
||||||
@@ -208,14 +210,14 @@ public:
|
|||||||
|
|
||||||
auto columns = Columns();
|
auto columns = Columns();
|
||||||
|
|
||||||
v.push_back(columns[1] + " = " + std::to_string(e.race));
|
v.push_back(columns[1] + " = '" + Strings::Escape(e.class_list) + "'");
|
||||||
v.push_back(columns[2] + " = " + std::to_string(e.class_));
|
v.push_back(columns[2] + " = '" + Strings::Escape(e.race_list) + "'");
|
||||||
v.push_back(columns[3] + " = " + std::to_string(e.deityid));
|
v.push_back(columns[3] + " = '" + Strings::Escape(e.deity_list) + "'");
|
||||||
v.push_back(columns[4] + " = " + std::to_string(e.zoneid));
|
v.push_back(columns[4] + " = '" + Strings::Escape(e.zone_id_list) + "'");
|
||||||
v.push_back(columns[5] + " = " + std::to_string(e.itemid));
|
v.push_back(columns[5] + " = " + std::to_string(e.item_id));
|
||||||
v.push_back(columns[6] + " = " + std::to_string(e.item_charges));
|
v.push_back(columns[6] + " = " + std::to_string(e.item_charges));
|
||||||
v.push_back(columns[7] + " = " + std::to_string(e.gm));
|
v.push_back(columns[7] + " = " + std::to_string(e.status));
|
||||||
v.push_back(columns[8] + " = " + std::to_string(e.slot));
|
v.push_back(columns[8] + " = " + std::to_string(e.inventory_slot));
|
||||||
v.push_back(columns[9] + " = " + std::to_string(e.min_expansion));
|
v.push_back(columns[9] + " = " + std::to_string(e.min_expansion));
|
||||||
v.push_back(columns[10] + " = " + std::to_string(e.max_expansion));
|
v.push_back(columns[10] + " = " + std::to_string(e.max_expansion));
|
||||||
v.push_back(columns[11] + " = '" + Strings::Escape(e.content_flags) + "'");
|
v.push_back(columns[11] + " = '" + Strings::Escape(e.content_flags) + "'");
|
||||||
@@ -242,14 +244,14 @@ public:
|
|||||||
std::vector<std::string> v;
|
std::vector<std::string> v;
|
||||||
|
|
||||||
v.push_back(std::to_string(e.id));
|
v.push_back(std::to_string(e.id));
|
||||||
v.push_back(std::to_string(e.race));
|
v.push_back("'" + Strings::Escape(e.class_list) + "'");
|
||||||
v.push_back(std::to_string(e.class_));
|
v.push_back("'" + Strings::Escape(e.race_list) + "'");
|
||||||
v.push_back(std::to_string(e.deityid));
|
v.push_back("'" + Strings::Escape(e.deity_list) + "'");
|
||||||
v.push_back(std::to_string(e.zoneid));
|
v.push_back("'" + Strings::Escape(e.zone_id_list) + "'");
|
||||||
v.push_back(std::to_string(e.itemid));
|
v.push_back(std::to_string(e.item_id));
|
||||||
v.push_back(std::to_string(e.item_charges));
|
v.push_back(std::to_string(e.item_charges));
|
||||||
v.push_back(std::to_string(e.gm));
|
v.push_back(std::to_string(e.status));
|
||||||
v.push_back(std::to_string(e.slot));
|
v.push_back(std::to_string(e.inventory_slot));
|
||||||
v.push_back(std::to_string(e.min_expansion));
|
v.push_back(std::to_string(e.min_expansion));
|
||||||
v.push_back(std::to_string(e.max_expansion));
|
v.push_back(std::to_string(e.max_expansion));
|
||||||
v.push_back("'" + Strings::Escape(e.content_flags) + "'");
|
v.push_back("'" + Strings::Escape(e.content_flags) + "'");
|
||||||
@@ -284,14 +286,14 @@ public:
|
|||||||
std::vector<std::string> v;
|
std::vector<std::string> v;
|
||||||
|
|
||||||
v.push_back(std::to_string(e.id));
|
v.push_back(std::to_string(e.id));
|
||||||
v.push_back(std::to_string(e.race));
|
v.push_back("'" + Strings::Escape(e.class_list) + "'");
|
||||||
v.push_back(std::to_string(e.class_));
|
v.push_back("'" + Strings::Escape(e.race_list) + "'");
|
||||||
v.push_back(std::to_string(e.deityid));
|
v.push_back("'" + Strings::Escape(e.deity_list) + "'");
|
||||||
v.push_back(std::to_string(e.zoneid));
|
v.push_back("'" + Strings::Escape(e.zone_id_list) + "'");
|
||||||
v.push_back(std::to_string(e.itemid));
|
v.push_back(std::to_string(e.item_id));
|
||||||
v.push_back(std::to_string(e.item_charges));
|
v.push_back(std::to_string(e.item_charges));
|
||||||
v.push_back(std::to_string(e.gm));
|
v.push_back(std::to_string(e.status));
|
||||||
v.push_back(std::to_string(e.slot));
|
v.push_back(std::to_string(e.inventory_slot));
|
||||||
v.push_back(std::to_string(e.min_expansion));
|
v.push_back(std::to_string(e.min_expansion));
|
||||||
v.push_back(std::to_string(e.max_expansion));
|
v.push_back(std::to_string(e.max_expansion));
|
||||||
v.push_back("'" + Strings::Escape(e.content_flags) + "'");
|
v.push_back("'" + Strings::Escape(e.content_flags) + "'");
|
||||||
@@ -330,14 +332,14 @@ public:
|
|||||||
StartingItems e{};
|
StartingItems e{};
|
||||||
|
|
||||||
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
||||||
e.race = static_cast<int32_t>(atoi(row[1]));
|
e.class_list = row[1] ? row[1] : "";
|
||||||
e.class_ = static_cast<int32_t>(atoi(row[2]));
|
e.race_list = row[2] ? row[2] : "";
|
||||||
e.deityid = static_cast<int32_t>(atoi(row[3]));
|
e.deity_list = row[3] ? row[3] : "";
|
||||||
e.zoneid = static_cast<int32_t>(atoi(row[4]));
|
e.zone_id_list = row[4] ? row[4] : "";
|
||||||
e.itemid = static_cast<int32_t>(atoi(row[5]));
|
e.item_id = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
|
||||||
e.item_charges = static_cast<uint8_t>(strtoul(row[6], nullptr, 10));
|
e.item_charges = static_cast<uint8_t>(strtoul(row[6], nullptr, 10));
|
||||||
e.gm = static_cast<int8_t>(atoi(row[7]));
|
e.status = static_cast<int32_t>(atoi(row[7]));
|
||||||
e.slot = static_cast<int32_t>(atoi(row[8]));
|
e.inventory_slot = static_cast<int32_t>(atoi(row[8]));
|
||||||
e.min_expansion = static_cast<int8_t>(atoi(row[9]));
|
e.min_expansion = static_cast<int8_t>(atoi(row[9]));
|
||||||
e.max_expansion = static_cast<int8_t>(atoi(row[10]));
|
e.max_expansion = static_cast<int8_t>(atoi(row[10]));
|
||||||
e.content_flags = row[11] ? row[11] : "";
|
e.content_flags = row[11] ? row[11] : "";
|
||||||
@@ -367,14 +369,14 @@ public:
|
|||||||
StartingItems e{};
|
StartingItems e{};
|
||||||
|
|
||||||
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
||||||
e.race = static_cast<int32_t>(atoi(row[1]));
|
e.class_list = row[1] ? row[1] : "";
|
||||||
e.class_ = static_cast<int32_t>(atoi(row[2]));
|
e.race_list = row[2] ? row[2] : "";
|
||||||
e.deityid = static_cast<int32_t>(atoi(row[3]));
|
e.deity_list = row[3] ? row[3] : "";
|
||||||
e.zoneid = static_cast<int32_t>(atoi(row[4]));
|
e.zone_id_list = row[4] ? row[4] : "";
|
||||||
e.itemid = static_cast<int32_t>(atoi(row[5]));
|
e.item_id = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
|
||||||
e.item_charges = static_cast<uint8_t>(strtoul(row[6], nullptr, 10));
|
e.item_charges = static_cast<uint8_t>(strtoul(row[6], nullptr, 10));
|
||||||
e.gm = static_cast<int8_t>(atoi(row[7]));
|
e.status = static_cast<int32_t>(atoi(row[7]));
|
||||||
e.slot = static_cast<int32_t>(atoi(row[8]));
|
e.inventory_slot = static_cast<int32_t>(atoi(row[8]));
|
||||||
e.min_expansion = static_cast<int8_t>(atoi(row[9]));
|
e.min_expansion = static_cast<int8_t>(atoi(row[9]));
|
||||||
e.max_expansion = static_cast<int8_t>(atoi(row[10]));
|
e.max_expansion = static_cast<int8_t>(atoi(row[10]));
|
||||||
e.content_flags = row[11] ? row[11] : "";
|
e.content_flags = row[11] ? row[11] : "";
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
* Any modifications to base repositories are to be made by the generator only
|
* Any modifications to base repositories are to be made by the generator only
|
||||||
*
|
*
|
||||||
* @generator ./utils/scripts/generators/repository-generator.pl
|
* @generator ./utils/scripts/generators/repository-generator.pl
|
||||||
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
|
* @docs https://docs.eqemu.io/developer/repositories
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EQEMU_BASE_TASKS_REPOSITORY_H
|
#ifndef EQEMU_BASE_TASKS_REPOSITORY_H
|
||||||
@@ -16,6 +16,7 @@
|
|||||||
#include "../../strings.h"
|
#include "../../strings.h"
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
|
|
||||||
|
|
||||||
class BaseTasksRepository {
|
class BaseTasksRepository {
|
||||||
public:
|
public:
|
||||||
struct Tasks {
|
struct Tasks {
|
||||||
@@ -47,6 +48,7 @@ public:
|
|||||||
uint32_t dz_template_id;
|
uint32_t dz_template_id;
|
||||||
int32_t lock_activity_id;
|
int32_t lock_activity_id;
|
||||||
int32_t faction_amount;
|
int32_t faction_amount;
|
||||||
|
int16_t enabled;
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::string PrimaryKey()
|
static std::string PrimaryKey()
|
||||||
@@ -85,6 +87,7 @@ public:
|
|||||||
"dz_template_id",
|
"dz_template_id",
|
||||||
"lock_activity_id",
|
"lock_activity_id",
|
||||||
"faction_amount",
|
"faction_amount",
|
||||||
|
"enabled",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -119,6 +122,7 @@ public:
|
|||||||
"dz_template_id",
|
"dz_template_id",
|
||||||
"lock_activity_id",
|
"lock_activity_id",
|
||||||
"faction_amount",
|
"faction_amount",
|
||||||
|
"enabled",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -187,6 +191,7 @@ public:
|
|||||||
e.dz_template_id = 0;
|
e.dz_template_id = 0;
|
||||||
e.lock_activity_id = -1;
|
e.lock_activity_id = -1;
|
||||||
e.faction_amount = 0;
|
e.faction_amount = 0;
|
||||||
|
e.enabled = 1;
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@@ -212,8 +217,9 @@ public:
|
|||||||
{
|
{
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
"{} WHERE id = {} LIMIT 1",
|
"{} WHERE {} = {} LIMIT 1",
|
||||||
BaseSelect(),
|
BaseSelect(),
|
||||||
|
PrimaryKey(),
|
||||||
tasks_id
|
tasks_id
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -250,6 +256,7 @@ public:
|
|||||||
e.dz_template_id = static_cast<uint32_t>(strtoul(row[25], nullptr, 10));
|
e.dz_template_id = static_cast<uint32_t>(strtoul(row[25], nullptr, 10));
|
||||||
e.lock_activity_id = static_cast<int32_t>(atoi(row[26]));
|
e.lock_activity_id = static_cast<int32_t>(atoi(row[26]));
|
||||||
e.faction_amount = static_cast<int32_t>(atoi(row[27]));
|
e.faction_amount = static_cast<int32_t>(atoi(row[27]));
|
||||||
|
e.enabled = static_cast<int16_t>(atoi(row[28]));
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@@ -311,6 +318,7 @@ public:
|
|||||||
v.push_back(columns[25] + " = " + std::to_string(e.dz_template_id));
|
v.push_back(columns[25] + " = " + std::to_string(e.dz_template_id));
|
||||||
v.push_back(columns[26] + " = " + std::to_string(e.lock_activity_id));
|
v.push_back(columns[26] + " = " + std::to_string(e.lock_activity_id));
|
||||||
v.push_back(columns[27] + " = " + std::to_string(e.faction_amount));
|
v.push_back(columns[27] + " = " + std::to_string(e.faction_amount));
|
||||||
|
v.push_back(columns[28] + " = " + std::to_string(e.enabled));
|
||||||
|
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
@@ -360,6 +368,7 @@ public:
|
|||||||
v.push_back(std::to_string(e.dz_template_id));
|
v.push_back(std::to_string(e.dz_template_id));
|
||||||
v.push_back(std::to_string(e.lock_activity_id));
|
v.push_back(std::to_string(e.lock_activity_id));
|
||||||
v.push_back(std::to_string(e.faction_amount));
|
v.push_back(std::to_string(e.faction_amount));
|
||||||
|
v.push_back(std::to_string(e.enabled));
|
||||||
|
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
@@ -417,6 +426,7 @@ public:
|
|||||||
v.push_back(std::to_string(e.dz_template_id));
|
v.push_back(std::to_string(e.dz_template_id));
|
||||||
v.push_back(std::to_string(e.lock_activity_id));
|
v.push_back(std::to_string(e.lock_activity_id));
|
||||||
v.push_back(std::to_string(e.faction_amount));
|
v.push_back(std::to_string(e.faction_amount));
|
||||||
|
v.push_back(std::to_string(e.enabled));
|
||||||
|
|
||||||
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
||||||
}
|
}
|
||||||
@@ -478,6 +488,7 @@ public:
|
|||||||
e.dz_template_id = static_cast<uint32_t>(strtoul(row[25], nullptr, 10));
|
e.dz_template_id = static_cast<uint32_t>(strtoul(row[25], nullptr, 10));
|
||||||
e.lock_activity_id = static_cast<int32_t>(atoi(row[26]));
|
e.lock_activity_id = static_cast<int32_t>(atoi(row[26]));
|
||||||
e.faction_amount = static_cast<int32_t>(atoi(row[27]));
|
e.faction_amount = static_cast<int32_t>(atoi(row[27]));
|
||||||
|
e.enabled = static_cast<int16_t>(atoi(row[28]));
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -530,6 +541,7 @@ public:
|
|||||||
e.dz_template_id = static_cast<uint32_t>(strtoul(row[25], nullptr, 10));
|
e.dz_template_id = static_cast<uint32_t>(strtoul(row[25], nullptr, 10));
|
||||||
e.lock_activity_id = static_cast<int32_t>(atoi(row[26]));
|
e.lock_activity_id = static_cast<int32_t>(atoi(row[26]));
|
||||||
e.faction_amount = static_cast<int32_t>(atoi(row[27]));
|
e.faction_amount = static_cast<int32_t>(atoi(row[27]));
|
||||||
|
e.enabled = static_cast<int16_t>(atoi(row[28]));
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -588,6 +600,118 @@ public:
|
|||||||
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static std::string BaseReplace()
|
||||||
|
{
|
||||||
|
return fmt::format(
|
||||||
|
"REPLACE INTO {} ({}) ",
|
||||||
|
TableName(),
|
||||||
|
ColumnsRaw()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ReplaceOne(
|
||||||
|
Database& db,
|
||||||
|
const Tasks &e
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.id));
|
||||||
|
v.push_back(std::to_string(e.type));
|
||||||
|
v.push_back(std::to_string(e.duration));
|
||||||
|
v.push_back(std::to_string(e.duration_code));
|
||||||
|
v.push_back("'" + Strings::Escape(e.title) + "'");
|
||||||
|
v.push_back("'" + Strings::Escape(e.description) + "'");
|
||||||
|
v.push_back("'" + Strings::Escape(e.reward_text) + "'");
|
||||||
|
v.push_back("'" + Strings::Escape(e.reward_id_list) + "'");
|
||||||
|
v.push_back(std::to_string(e.cash_reward));
|
||||||
|
v.push_back(std::to_string(e.exp_reward));
|
||||||
|
v.push_back(std::to_string(e.reward_method));
|
||||||
|
v.push_back(std::to_string(e.reward_points));
|
||||||
|
v.push_back(std::to_string(e.reward_point_type));
|
||||||
|
v.push_back(std::to_string(e.min_level));
|
||||||
|
v.push_back(std::to_string(e.max_level));
|
||||||
|
v.push_back(std::to_string(e.level_spread));
|
||||||
|
v.push_back(std::to_string(e.min_players));
|
||||||
|
v.push_back(std::to_string(e.max_players));
|
||||||
|
v.push_back(std::to_string(e.repeatable));
|
||||||
|
v.push_back(std::to_string(e.faction_reward));
|
||||||
|
v.push_back("'" + Strings::Escape(e.completion_emote) + "'");
|
||||||
|
v.push_back(std::to_string(e.replay_timer_group));
|
||||||
|
v.push_back(std::to_string(e.replay_timer_seconds));
|
||||||
|
v.push_back(std::to_string(e.request_timer_group));
|
||||||
|
v.push_back(std::to_string(e.request_timer_seconds));
|
||||||
|
v.push_back(std::to_string(e.dz_template_id));
|
||||||
|
v.push_back(std::to_string(e.lock_activity_id));
|
||||||
|
v.push_back(std::to_string(e.faction_amount));
|
||||||
|
v.push_back(std::to_string(e.enabled));
|
||||||
|
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"{} VALUES ({})",
|
||||||
|
BaseReplace(),
|
||||||
|
Strings::Implode(",", v)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() ? results.RowsAffected() : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ReplaceMany(
|
||||||
|
Database& db,
|
||||||
|
const std::vector<Tasks> &entries
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> insert_chunks;
|
||||||
|
|
||||||
|
for (auto &e: entries) {
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.id));
|
||||||
|
v.push_back(std::to_string(e.type));
|
||||||
|
v.push_back(std::to_string(e.duration));
|
||||||
|
v.push_back(std::to_string(e.duration_code));
|
||||||
|
v.push_back("'" + Strings::Escape(e.title) + "'");
|
||||||
|
v.push_back("'" + Strings::Escape(e.description) + "'");
|
||||||
|
v.push_back("'" + Strings::Escape(e.reward_text) + "'");
|
||||||
|
v.push_back("'" + Strings::Escape(e.reward_id_list) + "'");
|
||||||
|
v.push_back(std::to_string(e.cash_reward));
|
||||||
|
v.push_back(std::to_string(e.exp_reward));
|
||||||
|
v.push_back(std::to_string(e.reward_method));
|
||||||
|
v.push_back(std::to_string(e.reward_points));
|
||||||
|
v.push_back(std::to_string(e.reward_point_type));
|
||||||
|
v.push_back(std::to_string(e.min_level));
|
||||||
|
v.push_back(std::to_string(e.max_level));
|
||||||
|
v.push_back(std::to_string(e.level_spread));
|
||||||
|
v.push_back(std::to_string(e.min_players));
|
||||||
|
v.push_back(std::to_string(e.max_players));
|
||||||
|
v.push_back(std::to_string(e.repeatable));
|
||||||
|
v.push_back(std::to_string(e.faction_reward));
|
||||||
|
v.push_back("'" + Strings::Escape(e.completion_emote) + "'");
|
||||||
|
v.push_back(std::to_string(e.replay_timer_group));
|
||||||
|
v.push_back(std::to_string(e.replay_timer_seconds));
|
||||||
|
v.push_back(std::to_string(e.request_timer_group));
|
||||||
|
v.push_back(std::to_string(e.request_timer_seconds));
|
||||||
|
v.push_back(std::to_string(e.dz_template_id));
|
||||||
|
v.push_back(std::to_string(e.lock_activity_id));
|
||||||
|
v.push_back(std::to_string(e.faction_amount));
|
||||||
|
v.push_back(std::to_string(e.enabled));
|
||||||
|
|
||||||
|
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
auto results = db.QueryDatabase(
|
||||||
|
fmt::format(
|
||||||
|
"{} VALUES {}",
|
||||||
|
BaseReplace(),
|
||||||
|
Strings::Implode(",", insert_chunks)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (results.Success() ? results.RowsAffected() : 0);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //EQEMU_BASE_TASKS_REPOSITORY_H
|
#endif //EQEMU_BASE_TASKS_REPOSITORY_H
|
||||||
|
|||||||
@@ -0,0 +1,50 @@
|
|||||||
|
#ifndef EQEMU_BOT_STARTING_ITEMS_REPOSITORY_H
|
||||||
|
#define EQEMU_BOT_STARTING_ITEMS_REPOSITORY_H
|
||||||
|
|
||||||
|
#include "../database.h"
|
||||||
|
#include "../strings.h"
|
||||||
|
#include "base/base_bot_starting_items_repository.h"
|
||||||
|
|
||||||
|
class BotStartingItemsRepository: public BaseBotStartingItemsRepository {
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This file was auto generated and can be modified and extended upon
|
||||||
|
*
|
||||||
|
* Base repository methods are automatically
|
||||||
|
* generated in the "base" version of this repository. The base repository
|
||||||
|
* is immutable and to be left untouched, while methods in this class
|
||||||
|
* are used as extension methods for more specific persistence-layer
|
||||||
|
* accessors or mutators.
|
||||||
|
*
|
||||||
|
* Base Methods (Subject to be expanded upon in time)
|
||||||
|
*
|
||||||
|
* Note: Not all tables are designed appropriately to fit functionality with all base methods
|
||||||
|
*
|
||||||
|
* InsertOne
|
||||||
|
* UpdateOne
|
||||||
|
* DeleteOne
|
||||||
|
* FindOne
|
||||||
|
* GetWhere(std::string where_filter)
|
||||||
|
* DeleteWhere(std::string where_filter)
|
||||||
|
* InsertMany
|
||||||
|
* All
|
||||||
|
*
|
||||||
|
* Example custom methods in a repository
|
||||||
|
*
|
||||||
|
* BotStartingItemsRepository::GetByZoneAndVersion(int zone_id, int zone_version)
|
||||||
|
* BotStartingItemsRepository::GetWhereNeverExpires()
|
||||||
|
* BotStartingItemsRepository::GetWhereXAndY()
|
||||||
|
* BotStartingItemsRepository::DeleteWhereXAndY()
|
||||||
|
*
|
||||||
|
* Most of the above could be covered by base methods, but if you as a developer
|
||||||
|
* find yourself re-using logic for other parts of the code, its best to just make a
|
||||||
|
* method that can be re-used easily elsewhere especially if it can use a base repository
|
||||||
|
* method and encapsulate filters there
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Custom extended repository methods here
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //EQEMU_BOT_STARTING_ITEMS_REPOSITORY_H
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
#ifndef EQEMU_CHARACTER_STATS_RECORD_REPOSITORY_H
|
||||||
|
#define EQEMU_CHARACTER_STATS_RECORD_REPOSITORY_H
|
||||||
|
|
||||||
|
#include "../database.h"
|
||||||
|
#include "../strings.h"
|
||||||
|
#include "base/base_character_stats_record_repository.h"
|
||||||
|
|
||||||
|
class CharacterStatsRecordRepository: public BaseCharacterStatsRecordRepository {
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This file was auto generated and can be modified and extended upon
|
||||||
|
*
|
||||||
|
* Base repository methods are automatically
|
||||||
|
* generated in the "base" version of this repository. The base repository
|
||||||
|
* is immutable and to be left untouched, while methods in this class
|
||||||
|
* are used as extension methods for more specific persistence-layer
|
||||||
|
* accessors or mutators.
|
||||||
|
*
|
||||||
|
* Base Methods (Subject to be expanded upon in time)
|
||||||
|
*
|
||||||
|
* Note: Not all tables are designed appropriately to fit functionality with all base methods
|
||||||
|
*
|
||||||
|
* InsertOne
|
||||||
|
* UpdateOne
|
||||||
|
* DeleteOne
|
||||||
|
* FindOne
|
||||||
|
* GetWhere(std::string where_filter)
|
||||||
|
* DeleteWhere(std::string where_filter)
|
||||||
|
* InsertMany
|
||||||
|
* All
|
||||||
|
*
|
||||||
|
* Example custom methods in a repository
|
||||||
|
*
|
||||||
|
* CharacterStatsRecordRepository::GetByZoneAndVersion(int zone_id, int zone_version)
|
||||||
|
* CharacterStatsRecordRepository::GetWhereNeverExpires()
|
||||||
|
* CharacterStatsRecordRepository::GetWhereXAndY()
|
||||||
|
* CharacterStatsRecordRepository::DeleteWhereXAndY()
|
||||||
|
*
|
||||||
|
* Most of the above could be covered by base methods, but if you as a developer
|
||||||
|
* find yourself re-using logic for other parts of the code, its best to just make a
|
||||||
|
* method that can be re-used easily elsewhere especially if it can use a base repository
|
||||||
|
* method and encapsulate filters there
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Custom extended repository methods here
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //EQEMU_CHARACTER_STATS_RECORD_REPOSITORY_H
|
||||||
@@ -0,0 +1,223 @@
|
|||||||
|
#ifndef EQEMU_COMMAND_SUBSETTINGS_REPOSITORY_H
|
||||||
|
#define EQEMU_COMMAND_SUBSETTINGS_REPOSITORY_H
|
||||||
|
|
||||||
|
#include "../database.h"
|
||||||
|
#include "../strings.h"
|
||||||
|
#include "base/base_command_subsettings_repository.h"
|
||||||
|
|
||||||
|
class CommandSubsettingsRepository: public BaseCommandSubsettingsRepository {
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This file was auto generated and can be modified and extended upon
|
||||||
|
*
|
||||||
|
* Base repository methods are automatically
|
||||||
|
* generated in the "base" version of this repository. The base repository
|
||||||
|
* is immutable and to be left untouched, while methods in this class
|
||||||
|
* are used as extension methods for more specific persistence-layer
|
||||||
|
* accessors or mutators.
|
||||||
|
*
|
||||||
|
* Base Methods (Subject to be expanded upon in time)
|
||||||
|
*
|
||||||
|
* Note: Not all tables are designed appropriately to fit functionality with all base methods
|
||||||
|
*
|
||||||
|
* InsertOne
|
||||||
|
* UpdateOne
|
||||||
|
* DeleteOne
|
||||||
|
* FindOne
|
||||||
|
* GetWhere(std::string where_filter)
|
||||||
|
* DeleteWhere(std::string where_filter)
|
||||||
|
* InsertMany
|
||||||
|
* All
|
||||||
|
*
|
||||||
|
* Example custom methods in a repository
|
||||||
|
*
|
||||||
|
* CommandSubsettingsRepository::GetByZoneAndVersion(int zone_id, int zone_version)
|
||||||
|
* CommandSubsettingsRepository::GetWhereNeverExpires()
|
||||||
|
* CommandSubsettingsRepository::GetWhereXAndY()
|
||||||
|
* CommandSubsettingsRepository::DeleteWhereXAndY()
|
||||||
|
*
|
||||||
|
* Most of the above could be covered by base methods, but if you as a developer
|
||||||
|
* find yourself re-using logic for other parts of the code, its best to just make a
|
||||||
|
* method that can be re-used easily elsewhere especially if it can use a base repository
|
||||||
|
* method and encapsulate filters there
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Custom extended repository methods here
|
||||||
|
static std::vector<CommandSubsettingsRepository::CommandSubsettings> GetAll(Database& db)
|
||||||
|
{
|
||||||
|
// these are the base definitions for command_subsettings and can be over-ridden by the database
|
||||||
|
std::vector<CommandSubsettingsRepository::CommandSubsettings> static_records = {
|
||||||
|
{.parent_command = "find", .sub_command = "aa", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "findaa"},
|
||||||
|
{.parent_command = "find", .sub_command = "character", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "findcharacter"},
|
||||||
|
{.parent_command = "find", .sub_command = "class", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "findclass"},
|
||||||
|
{.parent_command = "find", .sub_command = "currency", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "findcurrency"},
|
||||||
|
{.parent_command = "find", .sub_command = "deity", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "finddeity"},
|
||||||
|
{.parent_command = "find", .sub_command = "emote", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "findemote"},
|
||||||
|
{.parent_command = "find", .sub_command = "faction", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "findfaction"},
|
||||||
|
{.parent_command = "find", .sub_command = "item", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "fi|finditem|itemsearch"},
|
||||||
|
{.parent_command = "find", .sub_command = "language", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "findlanguage"},
|
||||||
|
{.parent_command = "find", .sub_command = "npc_type", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "fn|findnpc|findnpctype"},
|
||||||
|
{.parent_command = "find", .sub_command = "race", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "findrace"},
|
||||||
|
{.parent_command = "find", .sub_command = "recipe", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "findrecipe"},
|
||||||
|
{.parent_command = "find", .sub_command = "skill", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "findskill"},
|
||||||
|
{.parent_command = "find", .sub_command = "spell", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "fs|findspell"},
|
||||||
|
{.parent_command = "find", .sub_command = "task", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "findtask"},
|
||||||
|
{.parent_command = "find", .sub_command = "zone", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "fz|findzone"},
|
||||||
|
{.parent_command = "set", .sub_command = "aa_exp", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "setaaxp|setaaexp"},
|
||||||
|
{.parent_command = "set", .sub_command = "aa_points", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "setaapts|setaapoints"},
|
||||||
|
{.parent_command = "set", .sub_command = "adventure_points", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "setadventurepoints"},
|
||||||
|
{.parent_command = "set", .sub_command = "alternate_currency", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "setaltcurrency"},
|
||||||
|
{.parent_command = "set", .sub_command = "animation", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "setanim"},
|
||||||
|
{.parent_command = "set", .sub_command = "anon", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "setanon"},
|
||||||
|
{.parent_command = "set", .sub_command = "bind", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "bind"},
|
||||||
|
{.parent_command = "set", .sub_command = "checksum", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "updatechecksum"},
|
||||||
|
{.parent_command = "set", .sub_command = "class_permanent", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "permaclass"},
|
||||||
|
{.parent_command = "set", .sub_command = "crystals", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "setcrystals"},
|
||||||
|
{.parent_command = "set", .sub_command = "date", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "date"},
|
||||||
|
{.parent_command = "set", .sub_command = "endurance", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "setendurance"},
|
||||||
|
{.parent_command = "set", .sub_command = "endurance_full", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "endurance"},
|
||||||
|
{.parent_command = "set", .sub_command = "exp", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "setxp|setexp"},
|
||||||
|
{.parent_command = "set", .sub_command = "faction", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "setfaction"},
|
||||||
|
{.parent_command = "set", .sub_command = "flymode", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "flymode"},
|
||||||
|
{.parent_command = "set", .sub_command = "freeze", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "freeze|unfreeze"},
|
||||||
|
{.parent_command = "set", .sub_command = "gender", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "gender"},
|
||||||
|
{.parent_command = "set", .sub_command = "gender_permanent", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "permagender"},
|
||||||
|
{.parent_command = "set", .sub_command = "gm", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "gm"},
|
||||||
|
{.parent_command = "set", .sub_command = "gm_speed", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "gmspeed"},
|
||||||
|
{.parent_command = "set", .sub_command = "gm_status", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "flag"},
|
||||||
|
{.parent_command = "set", .sub_command = "god_mode", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "godmode"},
|
||||||
|
{.parent_command = "set", .sub_command = "haste", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "haste"},
|
||||||
|
{.parent_command = "set", .sub_command = "hero_model", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "heromodel"},
|
||||||
|
{.parent_command = "set", .sub_command = "hide_me", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "hideme"},
|
||||||
|
{.parent_command = "set", .sub_command = "hp", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "sethp"},
|
||||||
|
{.parent_command = "set", .sub_command = "hp_full", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "heal"},
|
||||||
|
{.parent_command = "set", .sub_command = "invulnerable", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "invul|invulnerable"},
|
||||||
|
{.parent_command = "set", .sub_command = "language", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "setlanguage"},
|
||||||
|
{.parent_command = "set", .sub_command = "last_name", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "lastname"},
|
||||||
|
{.parent_command = "set", .sub_command = "level", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "level"},
|
||||||
|
{.parent_command = "set", .sub_command = "loginserver_info", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "setlsinfo"},
|
||||||
|
{.parent_command = "set", .sub_command = "mana", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "setmana"},
|
||||||
|
{.parent_command = "set", .sub_command = "mana_full", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "mana"},
|
||||||
|
{.parent_command = "set", .sub_command = "motd", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "motd"},
|
||||||
|
{.parent_command = "set", .sub_command = "name", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "name"},
|
||||||
|
{.parent_command = "set", .sub_command = "ooc_mute", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "oocmute"},
|
||||||
|
{.parent_command = "set", .sub_command = "password", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "setpass"},
|
||||||
|
{.parent_command = "set", .sub_command = "pvp", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "pvp"},
|
||||||
|
{.parent_command = "set", .sub_command = "pvp_points", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "setpvppoints"},
|
||||||
|
{.parent_command = "set", .sub_command = "race", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "race"},
|
||||||
|
{.parent_command = "set", .sub_command = "race_permanent", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "permarace"},
|
||||||
|
{.parent_command = "set", .sub_command = "server_locked", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "lock|serverlock|serverunlock|unlock"},
|
||||||
|
{.parent_command = "set", .sub_command = "skill", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "setskill"},
|
||||||
|
{.parent_command = "set", .sub_command = "skill_all", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "setallskill|setallskills|setskillall"},
|
||||||
|
{.parent_command = "set", .sub_command = "skill_all_max", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "maxskills"},
|
||||||
|
{.parent_command = "set", .sub_command = "start_zone", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "setstartzone"},
|
||||||
|
{.parent_command = "set", .sub_command = "temporary_name", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "tempname"},
|
||||||
|
{.parent_command = "set", .sub_command = "texture", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "texture"},
|
||||||
|
{.parent_command = "set", .sub_command = "time", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "time"},
|
||||||
|
{.parent_command = "set", .sub_command = "time_zone", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "timezone"},
|
||||||
|
{.parent_command = "set", .sub_command = "title", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "title"},
|
||||||
|
{.parent_command = "set", .sub_command = "title_suffix", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "titlesuffix"},
|
||||||
|
{.parent_command = "set", .sub_command = "weather", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "weather"},
|
||||||
|
{.parent_command = "set", .sub_command = "zone", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "zclip|zcolor|zheader|zonelock|zsafecoords|zsky|zunderworld"},
|
||||||
|
{.parent_command = "show", .sub_command = "aas", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "showaas"},
|
||||||
|
{.parent_command = "show", .sub_command = "aa_points", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "showaapoints|showaapts"},
|
||||||
|
{.parent_command = "show", .sub_command = "aggro", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "aggro"},
|
||||||
|
{.parent_command = "show", .sub_command = "buffs", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "showbuffs"},
|
||||||
|
{.parent_command = "show", .sub_command = "buried_corpse_count", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "getplayerburiedcorpsecount"},
|
||||||
|
{.parent_command = "show", .sub_command = "client_version_summary", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "cvs"},
|
||||||
|
{.parent_command = "show", .sub_command = "currencies", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "viewcurrencies"},
|
||||||
|
{.parent_command = "show", .sub_command = "distance", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "distance"},
|
||||||
|
{.parent_command = "show", .sub_command = "emote", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "emoteview"},
|
||||||
|
{.parent_command = "show", .sub_command = "field_of_view", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "fov"},
|
||||||
|
{.parent_command = "show", .sub_command = "flags", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "flags"},
|
||||||
|
{.parent_command = "show", .sub_command = "group_info", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "ginfo"},
|
||||||
|
{.parent_command = "show", .sub_command = "hatelist", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "hatelist"},
|
||||||
|
{.parent_command = "show", .sub_command = "inventory", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "peekinv"},
|
||||||
|
{.parent_command = "show", .sub_command = "ip_lookup", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "iplookup"},
|
||||||
|
{.parent_command = "show", .sub_command = "line_of_sight", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "checklos"},
|
||||||
|
{.parent_command = "show", .sub_command = "network", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "network"},
|
||||||
|
{.parent_command = "show", .sub_command = "network_stats", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "netstats"},
|
||||||
|
{.parent_command = "show", .sub_command = "npc_global_loot", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "shownpcgloballoot"},
|
||||||
|
{.parent_command = "show", .sub_command = "npc_stats", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "npcstats"},
|
||||||
|
{.parent_command = "show", .sub_command = "npc_type", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "viewnpctype"},
|
||||||
|
{.parent_command = "show", .sub_command = "peqzone_flags", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "peqzone_flags"},
|
||||||
|
{.parent_command = "show", .sub_command = "petition", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "listpetition|viewpetition"},
|
||||||
|
{.parent_command = "show", .sub_command = "petition_info", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "petitioninfo"},
|
||||||
|
{.parent_command = "show", .sub_command = "proximity", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "proximity"},
|
||||||
|
{.parent_command = "show", .sub_command = "quest_errors", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "questerrors"},
|
||||||
|
{.parent_command = "show", .sub_command = "quest_globals", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "globalview"},
|
||||||
|
{.parent_command = "show", .sub_command = "recipe", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "viewrecipe"},
|
||||||
|
{.parent_command = "show", .sub_command = "server_info", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "serverinfo"},
|
||||||
|
{.parent_command = "show", .sub_command = "skills", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "showskills"},
|
||||||
|
{.parent_command = "show", .sub_command = "spawn_status", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "spawnstatus"},
|
||||||
|
{.parent_command = "show", .sub_command = "spells", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "showspells"},
|
||||||
|
{.parent_command = "show", .sub_command = "spells_list", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "showspellslist"},
|
||||||
|
{.parent_command = "show", .sub_command = "stats", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "showstats"},
|
||||||
|
{.parent_command = "show", .sub_command = "timers", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "timers"},
|
||||||
|
{.parent_command = "show", .sub_command = "traps", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "trapinfo"},
|
||||||
|
{.parent_command = "show", .sub_command = "uptime", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "uptime"},
|
||||||
|
{.parent_command = "show", .sub_command = "variable", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "getvariable"},
|
||||||
|
{.parent_command = "show", .sub_command = "version", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "version"},
|
||||||
|
{.parent_command = "show", .sub_command = "waypoints", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "wpinfo"},
|
||||||
|
{.parent_command = "show", .sub_command = "who", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "who"},
|
||||||
|
{.parent_command = "show", .sub_command = "xtargets", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "xtargets"},
|
||||||
|
{.parent_command = "show", .sub_command = "zone_global_loot", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "showzonegloballoot"},
|
||||||
|
{.parent_command = "show", .sub_command = "zone_loot", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "viewzoneloot"},
|
||||||
|
{.parent_command = "show", .sub_command = "zone_points", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "showzonepoints"},
|
||||||
|
{.parent_command = "show", .sub_command = "zone_stats", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "zstats"},
|
||||||
|
{.parent_command = "show", .sub_command = "zone_status", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "zonestatus"},
|
||||||
|
};
|
||||||
|
|
||||||
|
auto db_sub_settings = All(db);
|
||||||
|
|
||||||
|
// inject commands in the database that are not already there
|
||||||
|
std::vector<CommandSubsettingsRepository::CommandSubsettings> new_records = {};
|
||||||
|
for (const auto &r: static_records) {
|
||||||
|
bool found = false;
|
||||||
|
for (const auto &db_r: db_sub_settings) {
|
||||||
|
if (r.parent_command == db_r.parent_command && r.sub_command == db_r.sub_command) {
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found) {
|
||||||
|
LogInfo("New command [{}] sub-command [{}] added to database table [{}] !", r.parent_command, r.sub_command, TableName());
|
||||||
|
new_records.emplace_back(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!new_records.empty()) {
|
||||||
|
InsertMany(db, new_records);
|
||||||
|
// if any were added, we need to reload the list
|
||||||
|
db_sub_settings = All(db);
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove commands from the database that are not in the static list
|
||||||
|
bool any_deleted = false;
|
||||||
|
for (const auto &db_r: db_sub_settings) {
|
||||||
|
bool found = false;
|
||||||
|
for (const auto &r: static_records) {
|
||||||
|
if (r.parent_command == db_r.parent_command && r.sub_command == db_r.sub_command) {
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found) {
|
||||||
|
LogInfo("Command [{}] sub-command [{}] removed from database table [{}] !", db_r.parent_command, db_r.sub_command, TableName());
|
||||||
|
DeleteWhere(db, fmt::format("parent_command = '{}' AND sub_command = '{}'", db_r.parent_command, db_r.sub_command));
|
||||||
|
any_deleted = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if any were deleted, re-read the database
|
||||||
|
if (any_deleted) {
|
||||||
|
db_sub_settings = All(db);
|
||||||
|
}
|
||||||
|
|
||||||
|
// return the final list of what's in the database
|
||||||
|
return db_sub_settings;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //EQEMU_COMMAND_SUBSETTINGS_REPOSITORY_H
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user