mirror of
https://github.com/EQEmu/Server.git
synced 2026-05-25 15:12:28 +00:00
Compare commits
81 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2fdee255fb | |||
| 35b624034d | |||
| 140fa3e96e | |||
| 9ab93ae7cd | |||
| 03da2e783f | |||
| 63f54a1fb6 | |||
| 632867631e | |||
| ec9476528f | |||
| f726fc8786 | |||
| fbad3ca88a | |||
| 63727cc1e3 | |||
| c616a9588b | |||
| b3788a0cee | |||
| 6031eee429 | |||
| 4d67c12752 | |||
| 57f64a3f2e | |||
| b314b048db | |||
| d1d119d7fb | |||
| f22c08cbdb | |||
| 1711cae4f4 | |||
| 0d740b87aa | |||
| c0ff63e2d8 | |||
| 7934a85086 | |||
| 6d881d0b1b | |||
| 4b20db6ab7 | |||
| 8c9127fc3c | |||
| c8c9d4b010 | |||
| 9df9f213f6 | |||
| 5ab1d7740f | |||
| aa17afd6e0 | |||
| 925780dcd9 | |||
| c86519bae9 | |||
| d223de3e3c | |||
| 5b19ecd800 | |||
| 21479dc517 | |||
| 78616bd014 | |||
| 7007a716bf | |||
| 576d39e04b | |||
| 6ac451b8b3 | |||
| f8f661a343 | |||
| 1f3d18723d | |||
| 33c11005ff | |||
| 144dfb0ec2 | |||
| 1173702b00 | |||
| 08b1f2edcb | |||
| 9833627683 | |||
| e9841b8d9a | |||
| 6103db0c8b | |||
| f50bb6ab59 | |||
| 62f9533614 | |||
| 80abf85528 | |||
| 6fe89dc0aa | |||
| 7496d45f7b | |||
| b03314efe1 | |||
| 268e03206a | |||
| 420c545dbd | |||
| 66bca9549b | |||
| 39c321f449 | |||
| e326e39e8a | |||
| 1eada5259a | |||
| 7ac170627d | |||
| d9c674e888 | |||
| 88fb994357 | |||
| e708b55f4d | |||
| 911ce259e8 | |||
| ccd325f75d | |||
| 45afba6e5f | |||
| 3fc9c470c4 | |||
| c5501a3693 | |||
| ce24b5e442 | |||
| 46fc763f6a | |||
| cbf89e9a1f | |||
| 5a1eefcd13 | |||
| 0aa69504a1 | |||
| 3408d136e2 | |||
| 78b1307f6f | |||
| 337019fb4d | |||
| 840744df9a | |||
| 68954ef965 | |||
| e10c7da2f9 | |||
| b2dc6c88d9 |
+5
-11
@@ -4,6 +4,9 @@ kind: pipeline
|
||||
type: docker
|
||||
name: Build Linux
|
||||
|
||||
clone:
|
||||
depth: 1
|
||||
|
||||
# Limits how many of these builds can run on the drone runner at a time, this isn't about cores
|
||||
concurrency:
|
||||
limit: 1
|
||||
@@ -36,9 +39,8 @@ kind: pipeline
|
||||
type: exec
|
||||
name: Build Windows
|
||||
|
||||
# Limits how many of these builds can run on the drone runner at a time, this isn't about cores
|
||||
concurrency:
|
||||
limit: 1
|
||||
clone:
|
||||
depth: 1
|
||||
|
||||
platform:
|
||||
os: windows
|
||||
@@ -85,14 +87,6 @@ steps:
|
||||
- |
|
||||
rclone delete remote: --include "eqemu-server*.zip"
|
||||
|
||||
trigger:
|
||||
branch:
|
||||
- master
|
||||
event:
|
||||
- push
|
||||
|
||||
depends_on:
|
||||
- Build Windows
|
||||
- Build Linux
|
||||
|
||||
|
||||
|
||||
@@ -68,6 +68,3 @@ compile_flags.txt
|
||||
!utils/scripts/build/
|
||||
!utils/scripts/build/should-release/should-release
|
||||
!utils/scripts/build/should-release/should-release.exe
|
||||
|
||||
# CMake Files
|
||||
cmake-build-relwithdebinfo/*
|
||||
|
||||
+321
-376
@@ -1,131 +1,4 @@
|
||||
## [22.3.0] - 02/06/2023
|
||||
|
||||
### Bots
|
||||
|
||||
* Add GetAugmentIDsBySlotID & AddItem with table ref Methods. ([#2805](https://github.com/EQEmu/Server/pull/2805)) ([Aeadoin](https://github.com/Aeadoin)) 2023-01-29
|
||||
|
||||
### Commands
|
||||
|
||||
* #list now searches without case sensitivity ([#2825](https://github.com/EQEmu/Server/pull/2825)) ([Akkadius](https://github.com/Akkadius)) 2023-02-06
|
||||
* Remove extraneous else from #weather ([#2819](https://github.com/EQEmu/Server/pull/2819)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-02-01
|
||||
|
||||
### Crash
|
||||
|
||||
* Fix IsUnderwaterOnly crash where npc data references can be stale ([#2830](https://github.com/EQEmu/Server/pull/2830)) ([Akkadius](https://github.com/Akkadius)) 2023-02-06
|
||||
* Fix command crash with #npcedit weapon when second weapon not passed ni ([#2829](https://github.com/EQEmu/Server/pull/2829)) ([Akkadius](https://github.com/Akkadius)) 2023-02-06
|
||||
* Fix crash in bot command botdyearmor ([#2832](https://github.com/EQEmu/Server/pull/2832)) ([Akkadius](https://github.com/Akkadius)) 2023-02-06
|
||||
|
||||
### DB Updates
|
||||
|
||||
* Add Windows MySQL path auto detection for users where the path is not found ([#2836](https://github.com/EQEmu/Server/pull/2836)) ([Akkadius](https://github.com/Akkadius)) 2023-02-06
|
||||
|
||||
### Doors
|
||||
|
||||
* Have NPCs trigger double doors ([#2821](https://github.com/EQEmu/Server/pull/2821)) ([Akkadius](https://github.com/Akkadius)) 2023-02-06
|
||||
* Remove door dev tools spam on client controlled doors ([#2824](https://github.com/EQEmu/Server/pull/2824)) ([Akkadius](https://github.com/Akkadius)) 2023-02-06
|
||||
|
||||
### Feature
|
||||
|
||||
* Add Min/Max Status to Merchants ([#2806](https://github.com/EQEmu/Server/pull/2806)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-29
|
||||
|
||||
### Fixes
|
||||
|
||||
* #reload aa will now refresh the AA table properly for every client when changes are made ([#2814](https://github.com/EQEmu/Server/pull/2814)) ([Natedog2012](https://github.com/Natedog2012)) 2023-01-31
|
||||
* #reload static should now properly fill the entity_lists for… ([#2815](https://github.com/EQEmu/Server/pull/2815)) ([Natedog2012](https://github.com/Natedog2012)) 2023-01-31
|
||||
* BuffLevelRestrictions were restricting group buffs if mob targeted ([#2809](https://github.com/EQEmu/Server/pull/2809)) ([noudess](https://github.com/noudess)) 2023-01-29
|
||||
* Fix does_augment_fit_slot method. ([#2817](https://github.com/EQEmu/Server/pull/2817)) ([Aeadoin](https://github.com/Aeadoin)) 2023-02-01
|
||||
* Fix NPC ghosting at safe coordinates ([#2823](https://github.com/EQEmu/Server/pull/2823)) ([Akkadius](https://github.com/Akkadius)) 2023-02-06
|
||||
* Fixing % based mob see invis ([#2802](https://github.com/EQEmu/Server/pull/2802)) ([fryguy503](https://github.com/fryguy503)) 2023-01-29
|
||||
* Resolve issue with max buff count being 25 in ROF2. ([#2800](https://github.com/EQEmu/Server/pull/2800)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-28
|
||||
|
||||
### Hotfix
|
||||
|
||||
* Post revert build fix for https://github.com/EQEmu/Server/commit/54050924d81d1f83268fe01f9c2b36fe10626601 ([Akkadius](https://github.com/Akkadius)) 2023-02-01
|
||||
|
||||
### Lua
|
||||
|
||||
* Resolve stoi Exception ([#2736](https://github.com/EQEmu/Server/pull/2736)) ([Akkadius](https://github.com/Akkadius)) 2023-02-06
|
||||
|
||||
### Pathing
|
||||
|
||||
* Improvements to handling tight corridors pathing, clipping detection and recovery ([#2826](https://github.com/EQEmu/Server/pull/2826)) ([Akkadius](https://github.com/Akkadius)) 2023-02-06
|
||||
|
||||
### Quest API
|
||||
|
||||
* Add Augment Slot support to does_augment_fit ([#2813](https://github.com/EQEmu/Server/pull/2813)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-31
|
||||
* Add EVENT_DAMAGE_GIVEN and EVENT_DAMAGE_TAKEN to Perl/Lua. ([#2804](https://github.com/EQEmu/Server/pull/2804)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-29
|
||||
* Add EVENT_ITEM_CLICK_CLIENT and EVENT_ITEM_CLICK_CAST_CLIENT to Perl/Lua. ([#2810](https://github.com/EQEmu/Server/pull/2810)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-30
|
||||
* Add EVENT_TASKACCEPTED to Player scope ([#2822](https://github.com/EQEmu/Server/pull/2822)) ([Valorith](https://github.com/Valorith)) 2023-02-06
|
||||
* Add GetItemCooldown to return the time remaining on items… ([#2811](https://github.com/EQEmu/Server/pull/2811)) ([Natedog2012](https://github.com/Natedog2012)) 2023-01-30
|
||||
* Add LDoN Methods to Perl/Lua ([#2799](https://github.com/EQEmu/Server/pull/2799)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-29
|
||||
* Add Override Parameters to ScaleNPC() in Perl/Lua. ([#2816](https://github.com/EQEmu/Server/pull/2816)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-02-01
|
||||
* Add rule AlternateAugmentationSealer for using a different bagtype ([#2831](https://github.com/EQEmu/Server/pull/2831)) ([Natedog2012](https://github.com/Natedog2012)) 2023-02-06
|
||||
* Default ScaleNPC to always scale. ([#2818](https://github.com/EQEmu/Server/pull/2818)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-02-06
|
||||
|
||||
### Readme
|
||||
|
||||
* Update build badges with Drone ([Akkadius](https://github.com/Akkadius)) 2023-01-29
|
||||
|
||||
### Rules
|
||||
|
||||
* Add rule to ignore name filter on chat channel creation. ([#2820](https://github.com/EQEmu/Server/pull/2820)) ([Valorith](https://github.com/Valorith)) 2023-02-06
|
||||
* Added rule to bypass level based haste caps ([#2835](https://github.com/EQEmu/Server/pull/2835)) ([jcr4990](https://github.com/jcr4990)) 2023-02-06
|
||||
* Fix rule updates that affected bot booting checks ([#2841](https://github.com/EQEmu/Server/pull/2841)) ([Akkadius](https://github.com/Akkadius)) 2023-02-06
|
||||
|
||||
### Tasks
|
||||
|
||||
* Implement alternate currency rewards ([#2827](https://github.com/EQEmu/Server/pull/2827)) ([Akkadius](https://github.com/Akkadius)) 2023-02-06
|
||||
|
||||
## [22.2.0] - 01/27/2023
|
||||
|
||||
### Bots
|
||||
|
||||
* Add EVENT_UNEQUIP_ITEM_BOT & EVENT_EQUIP_ITEM_BOT ([#2796](https://github.com/EQEmu/Server/pull/2796)) ([Aeadoin](https://github.com/Aeadoin)) 2023-01-27
|
||||
* ^create and ^viewcombos popup messages fix. ([#2797](https://github.com/EQEmu/Server/pull/2797)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-26
|
||||
|
||||
### Code Cleanup
|
||||
|
||||
* Cleanup #door Command. ([#2783](https://github.com/EQEmu/Server/pull/2783)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-24
|
||||
|
||||
### Crash
|
||||
|
||||
* Fix crash issue with log formatting during character creation ([#2798](https://github.com/EQEmu/Server/pull/2798)) ([Akkadius](https://github.com/Akkadius)) 2023-01-27
|
||||
|
||||
### Feature
|
||||
|
||||
* ResetItemCooldown added to lua/perl and fix item re-cast times to show properly ([#2793](https://github.com/EQEmu/Server/pull/2793)) ([Natedog2012](https://github.com/Natedog2012)) 2023-01-26
|
||||
|
||||
### Git
|
||||
|
||||
* Add CMake Files to .gitignore ([#2792](https://github.com/EQEmu/Server/pull/2792)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-25
|
||||
|
||||
## [22.1.2] - 01/24/2023
|
||||
|
||||
### CI/CD
|
||||
|
||||
* Build / Release Pipeline Changes ([#2788](https://github.com/EQEmu/Server/pull/2788)) ([Akkadius](https://github.com/Akkadius)) 2023-01-24
|
||||
|
||||
### Code Cleanup
|
||||
|
||||
* Cleanup #door Command. ([#2783](https://github.com/EQEmu/Server/pull/2783)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-24
|
||||
|
||||
### Crash
|
||||
|
||||
* Fix rarer world crash issue where scheduler database was not available ([#2789](https://github.com/EQEmu/Server/pull/2789)) ([Akkadius](https://github.com/Akkadius)) 2023-01-24
|
||||
|
||||
### Fixes
|
||||
|
||||
* Fix nullptr spell in BCSpells::Load() ([#2790](https://github.com/EQEmu/Server/pull/2790)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-24
|
||||
* Remove duplicate logic in GetActSpellHealing reducing HOT criticals ([#2786](https://github.com/EQEmu/Server/pull/2786)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-24
|
||||
|
||||
## [22.1.1] - 01/23/2023
|
||||
|
||||
### Fixes
|
||||
|
||||
* Fix botgrouplist to display unique entries. ([#2785](https://github.com/EQEmu/Server/pull/2785)) ([Aeadoin](https://github.com/Aeadoin)) 2023-01-23
|
||||
* Fix scenario where dereferenced object could be null. ([#2784](https://github.com/EQEmu/Server/pull/2784)) ([Aeadoin](https://github.com/Aeadoin)) 2023-01-23
|
||||
|
||||
## [22.1.0] - 01/22/2023
|
||||
## [22.1.0] - 01/22/2022
|
||||
|
||||
This is a first release using the new build system. Changelog entry representative of last year. Subsequent releases will consist of incremental changes since the last release.
|
||||
|
||||
@@ -133,10 +6,36 @@ This is a first release using the new build system. Changelog entry representati
|
||||
|
||||
* Fix AA tables dump ([#2769](https://github.com/EQEmu/Server/pull/2769)) ([Akkadius](https://github.com/Akkadius)) 2023-01-22
|
||||
|
||||
### AI
|
||||
|
||||
* Add Support to Heals to allow Trigger based spells ([#2709](https://github.com/EQEmu/Server/pull/2709)) ([Aeadoin](https://github.com/Aeadoin)) 2023-01-08
|
||||
* Spell Type (1024) InCombatBuff were spam casting ([#2030](https://github.com/EQEmu/Server/pull/2030)) ([noudess](https://github.com/noudess)) 2022-03-07
|
||||
|
||||
### API
|
||||
|
||||
* Apply spells with custom buff durations and adjust existing spell buff durations. ([#1997](https://github.com/EQEmu/Server/pull/1997)) ([KayenEQ](https://github.com/KayenEQ)) 2022-02-15
|
||||
* Fix for SetBuffDuration function to check bard slots. ([#2009](https://github.com/EQEmu/Server/pull/2009)) ([KayenEQ](https://github.com/KayenEQ)) 2022-02-17
|
||||
* GetNPCStat can now return default stat values. ([#2048](https://github.com/EQEmu/Server/pull/2048)) ([KayenEQ](https://github.com/KayenEQ)) 2022-03-11
|
||||
* GetNPCStat default better naming ([#2053](https://github.com/EQEmu/Server/pull/2053)) ([KayenEQ](https://github.com/KayenEQ)) 2022-03-13
|
||||
* Methods for getting more information on quest timers. ([#2060](https://github.com/EQEmu/Server/pull/2060)) ([KayenEQ](https://github.com/KayenEQ)) 2022-04-13
|
||||
* Perl functions added to apply spell effects directly to NPCs without requiring buffs. ([#1975](https://github.com/EQEmu/Server/pull/1975)) ([KayenEQ](https://github.com/KayenEQ)) 2022-02-08
|
||||
* Perl functions to set invulnerable to and modify environmental damage. ([#2044](https://github.com/EQEmu/Server/pull/2044)) ([KayenEQ](https://github.com/KayenEQ)) 2022-03-09
|
||||
* Reload API ([#2716](https://github.com/EQEmu/Server/pull/2716)) ([Akkadius](https://github.com/Akkadius)) 2023-01-11
|
||||
* perl added GetNPCStat(identifier) ([#2012](https://github.com/EQEmu/Server/pull/2012)) ([KayenEQ](https://github.com/KayenEQ)) 2022-02-20
|
||||
|
||||
### Aggro
|
||||
|
||||
* Cleanup Mob::CombatRange ([#2652](https://github.com/EQEmu/Server/pull/2652)) ([Aeadoin](https://github.com/Aeadoin)) 2022-12-20
|
||||
* Rooted mobs will add other hated targets to Hate list ([#2180](https://github.com/EQEmu/Server/pull/2180)) ([noudess](https://github.com/noudess)) 2022-05-27
|
||||
|
||||
### Appveyor
|
||||
|
||||
* Remove bots preprocessor ([Akkadius](https://github.com/Akkadius)) 2023-01-20
|
||||
|
||||
### Backups
|
||||
|
||||
* Use World CLI for Database Backups ([#2286](https://github.com/EQEmu/Server/pull/2286)) ([Akkadius](https://github.com/Akkadius)) 2022-07-07
|
||||
|
||||
### Bot/Merc
|
||||
|
||||
* Cleanup methods, and virtual overrides. ([#2734](https://github.com/EQEmu/Server/pull/2734)) ([Aeadoin](https://github.com/Aeadoin)) 2023-01-15
|
||||
@@ -187,11 +86,40 @@ This is a first release using the new build system. Changelog entry representati
|
||||
* Update Bot Heal & Damage methods to more closely match Clients + Bugfixes ([#2045](https://github.com/EQEmu/Server/pull/2045)) ([catapultam-habeo](https://github.com/catapultam-habeo)) 2022-03-11
|
||||
* Update Bot Logic to ignore ST_TargetsTarget when buffing ([#2584](https://github.com/EQEmu/Server/pull/2584)) ([Aeadoin](https://github.com/Aeadoin)) 2022-11-27
|
||||
|
||||
### Bug
|
||||
|
||||
* Fixed trade items record log ([#2003](https://github.com/EQEmu/Server/pull/2003)) ([cybernine186](https://github.com/cybernine186)) 2022-02-17
|
||||
* Loot Drop Randomization adjustment ([#2368](https://github.com/EQEmu/Server/pull/2368)) ([fryguy503](https://github.com/fryguy503)) 2022-08-31
|
||||
* UINT32 EmoteID ([#2369](https://github.com/EQEmu/Server/pull/2369)) ([fryguy503](https://github.com/fryguy503)) 2022-08-13
|
||||
|
||||
### Bug Fix
|
||||
|
||||
* Boats should never get FixZ'd ([#2246](https://github.com/EQEmu/Server/pull/2246)) ([noudess](https://github.com/noudess)) 2022-07-02
|
||||
* Clamp Item Ldon Sell Back Rates. ([#2592](https://github.com/EQEmu/Server/pull/2592)) ([Aeadoin](https://github.com/Aeadoin)) 2022-11-30
|
||||
* Zone Flags Regression ([#2760](https://github.com/EQEmu/Server/pull/2760)) ([Akkadius](https://github.com/Akkadius)) 2023-01-19
|
||||
|
||||
### C++20
|
||||
|
||||
* Arithmetic on different enums is deprecated ([#2752](https://github.com/EQEmu/Server/pull/2752)) ([mackal](https://github.com/mackal)) 2023-01-17
|
||||
* Enable C++20 + Fixes + FMT 9.1 ([#2664](https://github.com/EQEmu/Server/pull/2664)) ([Akkadius](https://github.com/Akkadius)) 2022-12-21
|
||||
|
||||
### CI
|
||||
|
||||
* Hook tests back up ([#2316](https://github.com/EQEmu/Server/pull/2316)) ([Akkadius](https://github.com/Akkadius)) 2022-07-27
|
||||
|
||||
### CPP
|
||||
|
||||
* Update C++ standard to C++17 ([#2308](https://github.com/EQEmu/Server/pull/2308)) ([mackal](https://github.com/mackal)) 2022-07-27
|
||||
|
||||
### Cereal
|
||||
|
||||
* Bump to v1.3.2 from v1.2.2 ([#2654](https://github.com/EQEmu/Server/pull/2654)) ([Akkadius](https://github.com/Akkadius)) 2022-12-20
|
||||
|
||||
### Client
|
||||
|
||||
* Fix IsMoving for Client ([#2318](https://github.com/EQEmu/Server/pull/2318)) ([Akkadius](https://github.com/Akkadius)) 2022-07-27
|
||||
* Remove unimplemented Client Insight Method. ([#2663](https://github.com/EQEmu/Server/pull/2663)) ([Aeadoin](https://github.com/Aeadoin)) 2022-12-21
|
||||
|
||||
### Code
|
||||
|
||||
* Removed vscode setting ([#2753](https://github.com/EQEmu/Server/pull/2753)) ([xackery](https://github.com/xackery)) 2023-01-17
|
||||
@@ -211,19 +139,21 @@ This is a first release using the new build system. Changelog entry representati
|
||||
* Move Client::Undye() to client.cpp from #path Command. ([#2188](https://github.com/EQEmu/Server/pull/2188)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-05-21
|
||||
* Possible issues with variable/parameter name equality. ([#2161](https://github.com/EQEmu/Server/pull/2161)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-05-10
|
||||
* Quest API push methods using invalid types. ([#2172](https://github.com/EQEmu/Server/pull/2172)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-05-16
|
||||
* Remove Unused EQEMU_DEPOP_INVALIDATES_CACHE ([#2292](https://github.com/EQEmu/Server/pull/2292)) ([Akkadius](https://github.com/Akkadius)) 2022-07-14
|
||||
* Remove this-> in code where its implied ([#2088](https://github.com/EQEmu/Server/pull/2088)) ([Akkadius](https://github.com/Akkadius)) 2022-05-01
|
||||
* Remove unused basic_functions.h ([#2729](https://github.com/EQEmu/Server/pull/2729)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-13
|
||||
* Remove unused maxskill.h. ([#2728](https://github.com/EQEmu/Server/pull/2728)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-13
|
||||
* Remove unused methods. ([#2171](https://github.com/EQEmu/Server/pull/2171)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-05-15
|
||||
* Remove unusued Max Item ID Constant ([#2528](https://github.com/EQEmu/Server/pull/2528)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-08
|
||||
* Remove use of bzero since it is deprecated for memset ([#2295](https://github.com/EQEmu/Server/pull/2295)) ([Akkadius](https://github.com/Akkadius)) 2022-07-14
|
||||
* Resharper Warnings ([#2235](https://github.com/EQEmu/Server/pull/2235)) ([Quintinon](https://github.com/Quintinon)) 2022-06-01
|
||||
* Resolve some warnings in loginserver/world_server.cpp ([#2347](https://github.com/EQEmu/Server/pull/2347)) ([mackal](https://github.com/mackal)) 2022-07-31
|
||||
* Rework Lua QuestReward to not use try/catch blocks ([#2417](https://github.com/EQEmu/Server/pull/2417)) ([mackal](https://github.com/mackal)) 2022-09-03
|
||||
* Send eqstr message in AddAAPoints ([#2507](https://github.com/EQEmu/Server/pull/2507)) ([hgtw](https://github.com/hgtw)) 2022-10-29
|
||||
* Update to EQEmu #2253 to clean up message strings ([#2279](https://github.com/EQEmu/Server/pull/2279)) ([fryguy503](https://github.com/fryguy503)) 2022-07-03
|
||||
* Zone Data Loading Refactor ([#2388](https://github.com/EQEmu/Server/pull/2388)) ([Akkadius](https://github.com/Akkadius)) 2022-09-01
|
||||
|
||||
### Combat
|
||||
|
||||
* /shield command "too far away message" ([#1999](https://github.com/EQEmu/Server/pull/1999)) ([KayenEQ](https://github.com/KayenEQ)) 2022-02-14
|
||||
* Basic Combat Recording ([#2090](https://github.com/EQEmu/Server/pull/2090)) ([Akkadius](https://github.com/Akkadius)) 2022-05-01
|
||||
* Fix Frenzy vs opponents immune to non-magic ([#2095](https://github.com/EQEmu/Server/pull/2095)) ([noudess](https://github.com/noudess)) 2022-05-03
|
||||
* Fix shield calculation ([#2234](https://github.com/EQEmu/Server/pull/2234)) ([Quintinon](https://github.com/Quintinon)) 2022-06-01
|
||||
* Legacy Combat Middleware Affected by PR #1858 ([#1939](https://github.com/EQEmu/Server/pull/1939)) ([Akkadius](https://github.com/Akkadius)) 2022-01-30
|
||||
|
||||
### Commands
|
||||
|
||||
@@ -354,10 +284,49 @@ This is a first release using the new build system. Changelog entry representati
|
||||
* Remove unused #bestz and #pf Commands. ([#2112](https://github.com/EQEmu/Server/pull/2112)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-05-07
|
||||
* Remove unused/broken #deletegraveyard and #setgraveyard Commands. ([#2198](https://github.com/EQEmu/Server/pull/2198)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-05-23
|
||||
|
||||
### Compile
|
||||
|
||||
* Decrease build times using unity build strategy ([#2089](https://github.com/EQEmu/Server/pull/2089)) ([Akkadius](https://github.com/Akkadius)) 2022-05-01
|
||||
|
||||
### Crash
|
||||
|
||||
* Fix reload crashes ([#2462](https://github.com/EQEmu/Server/pull/2462)) ([Akkadius](https://github.com/Akkadius)) 2022-09-30
|
||||
* Fix spawn race condition shown by #repop ([#2455](https://github.com/EQEmu/Server/pull/2455)) ([Akkadius](https://github.com/Akkadius)) 2022-09-29
|
||||
* Linux Crash Dump Improvements ([#2296](https://github.com/EQEmu/Server/pull/2296)) ([Akkadius](https://github.com/Akkadius)) 2022-07-14
|
||||
* Pointer validation in mob iteration loops ([#2490](https://github.com/EQEmu/Server/pull/2490)) ([Akkadius](https://github.com/Akkadius)) 2022-10-15
|
||||
* Stability Fixes ([#2489](https://github.com/EQEmu/Server/pull/2489)) ([Akkadius](https://github.com/Akkadius)) 2022-10-15
|
||||
* Websocket Crash fix race when fetching log categories ([#2456](https://github.com/EQEmu/Server/pull/2456)) ([Akkadius](https://github.com/Akkadius)) 2022-09-29
|
||||
|
||||
### Database
|
||||
|
||||
* Add Primary ID Keys to Tables ([#2036](https://github.com/EQEmu/Server/pull/2036)) ([Akkadius](https://github.com/Akkadius)) 2022-03-07
|
||||
* Add fallback migration for logsys columns ([#2457](https://github.com/EQEmu/Server/pull/2457)) ([Akkadius](https://github.com/Akkadius)) 2022-09-29
|
||||
* Update 2022_01_10_checksum_verification.sql ([#2041](https://github.com/EQEmu/Server/pull/2041)) ([joligario](https://github.com/joligario)) 2022-03-07
|
||||
|
||||
### Diawind
|
||||
|
||||
* Plus sign markdown fix ([#2727](https://github.com/EQEmu/Server/pull/2727)) ([Akkadius](https://github.com/Akkadius)) 2023-01-12
|
||||
|
||||
### Doors
|
||||
|
||||
* Fix Misty PoK Stone ([#2482](https://github.com/EQEmu/Server/pull/2482)) ([Akkadius](https://github.com/Akkadius)) 2022-10-14
|
||||
* Fix Neriak PoK Stone ([#2486](https://github.com/EQEmu/Server/pull/2486)) ([Coreidan](https://github.com/Coreidan)) 2022-10-15
|
||||
* Fix door target zone heading data ([#2414](https://github.com/EQEmu/Server/pull/2414)) ([Akkadius](https://github.com/Akkadius)) 2022-09-05
|
||||
* Improvements to door manipulation ([#2370](https://github.com/EQEmu/Server/pull/2370)) ([Akkadius](https://github.com/Akkadius)) 2022-08-13
|
||||
|
||||
### Drone
|
||||
|
||||
* Speed up drone builds ([#2092](https://github.com/EQEmu/Server/pull/2092)) ([Akkadius](https://github.com/Akkadius)) 2022-05-02
|
||||
|
||||
### Expansions
|
||||
|
||||
* Expansion Deprecation Revert ([#2312](https://github.com/EQEmu/Server/pull/2312)) ([Akkadius](https://github.com/Akkadius)) 2022-07-15
|
||||
* Zone expansion consistency changes ([#2380](https://github.com/EQEmu/Server/pull/2380)) ([Akkadius](https://github.com/Akkadius)) 2022-08-22
|
||||
|
||||
### Experience
|
||||
|
||||
* Change Exp Calculations to be 64 bit where needed. ([#2677](https://github.com/EQEmu/Server/pull/2677)) ([Aeadoin](https://github.com/Aeadoin)) 2022-12-31
|
||||
|
||||
### Feature
|
||||
|
||||
* AA Cap Limit ([#2423](https://github.com/EQEmu/Server/pull/2423)) ([fryguy503](https://github.com/fryguy503)) 2022-10-13
|
||||
@@ -391,138 +360,9 @@ This is a first release using the new build system. Changelog entry representati
|
||||
* Spell Ranks will now work with AllowSpellMemorizeFromItem Rule ([#2475](https://github.com/EQEmu/Server/pull/2475)) ([Aeadoin](https://github.com/Aeadoin)) 2022-10-13
|
||||
* Update HateMod used by SPA 114 to Int32. ([#2428](https://github.com/EQEmu/Server/pull/2428)) ([Aeadoin](https://github.com/Aeadoin)) 2022-09-08
|
||||
|
||||
### Fixes
|
||||
### Git
|
||||
|
||||
* #npcstats command displaying incorrect faction ([#2710](https://github.com/EQEmu/Server/pull/2710)) ([noudess](https://github.com/noudess)) 2023-01-08
|
||||
* #peqzone no longer bypass Handle_OP_ZoneChange ([#2063](https://github.com/EQEmu/Server/pull/2063)) ([Natedog2012](https://github.com/Natedog2012)) 2022-03-19
|
||||
* #scribespells triggered error on mysql keyword rank ([#2779](https://github.com/EQEmu/Server/pull/2779)) ([noudess](https://github.com/noudess)) 2023-01-21
|
||||
* #tune command various fixes ([#2046](https://github.com/EQEmu/Server/pull/2046)) ([KayenEQ](https://github.com/KayenEQ)) 2022-03-11
|
||||
* Add Complete Heal Spell back to IsCompleteHealSpell Method ([#2722](https://github.com/EQEmu/Server/pull/2722)) ([Aeadoin](https://github.com/Aeadoin)) 2023-01-11
|
||||
* Add SE_MakeDrunk to avoid error message. ([#2601](https://github.com/EQEmu/Server/pull/2601)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-12-01
|
||||
* Add omitted function call in UCS ([#2768](https://github.com/EQEmu/Server/pull/2768)) ([Valorith](https://github.com/Valorith)) 2023-01-20
|
||||
* Add required distance to CoTH before aggro wipe ([#2253](https://github.com/EQEmu/Server/pull/2253)) ([fryguy503](https://github.com/fryguy503)) 2022-07-03
|
||||
* Adjustment for nullptr crash ([#2232](https://github.com/EQEmu/Server/pull/2232)) ([Akkadius](https://github.com/Akkadius)) 2022-06-01
|
||||
* Alleviate some lag with crosszone/worldwide spell casting. ([#2016](https://github.com/EQEmu/Server/pull/2016)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-02-21
|
||||
* Allow High Level Spells to be Unmemorized. ([#2641](https://github.com/EQEmu/Server/pull/2641)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-12-14
|
||||
* Allow Songs to be scribed from scrolls ([#2460](https://github.com/EQEmu/Server/pull/2460)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-10-12
|
||||
* AltCurrencySelectItemReply_Struct was not handled correctly. ([#2702](https://github.com/EQEmu/Server/pull/2702)) ([Aeadoin](https://github.com/Aeadoin)) 2023-01-04
|
||||
* Any use of TempName left old clean_name. ([#1946](https://github.com/EQEmu/Server/pull/1946)) ([noudess](https://github.com/noudess)) 2022-01-26
|
||||
* Avoid erase in discord queue range loop ([#2411](https://github.com/EQEmu/Server/pull/2411)) ([hgtw](https://github.com/hgtw)) 2022-09-03
|
||||
* Bandolier didn't recognize source weapon on cursor ([#2026](https://github.com/EQEmu/Server/pull/2026)) ([noudess](https://github.com/noudess)) 2022-03-07
|
||||
* Bard Invisible causing display issues. ([#2067](https://github.com/EQEmu/Server/pull/2067)) ([KayenEQ](https://github.com/KayenEQ)) 2022-04-01
|
||||
* Bard update fixes 1 ([#1982](https://github.com/EQEmu/Server/pull/1982)) ([KayenEQ](https://github.com/KayenEQ)) 2022-02-09
|
||||
* Bazaar Search MYSQL Error ([#2252](https://github.com/EQEmu/Server/pull/2252)) ([fryguy503](https://github.com/fryguy503)) 2022-06-08
|
||||
* Blocked spells max spell id increased ([#2207](https://github.com/EQEmu/Server/pull/2207)) ([Isaaru](https://github.com/Isaaru)) 2022-05-25
|
||||
* Boats should never get FixZ'd ([#2246](https://github.com/EQEmu/Server/pull/2246)) ([noudess](https://github.com/noudess)) 2022-07-02
|
||||
* Clamp Item Ldon Sell Back Rates. ([#2592](https://github.com/EQEmu/Server/pull/2592)) ([Aeadoin](https://github.com/Aeadoin)) 2022-11-30
|
||||
* Clear title/suffix bug fix. ([#2068](https://github.com/EQEmu/Server/pull/2068)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-04-02
|
||||
* Correct (probably) unintended bitwise AND instead of logical AND ([#2239](https://github.com/EQEmu/Server/pull/2239)) ([Quintinon](https://github.com/Quintinon)) 2022-06-02
|
||||
* Correct type signed/unsigned int when reading item from database in shareddb ([#2269](https://github.com/EQEmu/Server/pull/2269)) ([Quintinon](https://github.com/Quintinon)) 2022-06-15
|
||||
* Data Bucket Permanent Duration String ([#2624](https://github.com/EQEmu/Server/pull/2624)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-12-06
|
||||
* Delete NpcType Struct returned by Bot::CreateDefaultNPCTypeStructForBot() when unused ([#2267](https://github.com/EQEmu/Server/pull/2267)) ([Quintinon](https://github.com/Quintinon)) 2022-06-18
|
||||
* Do not allow /open to be used on traps or auras, causes crash ([#1951](https://github.com/EQEmu/Server/pull/1951)) ([KayenEQ](https://github.com/KayenEQ)) 2022-01-30
|
||||
* Doors::GetSize() Perl Croak Typo. ([#2027](https://github.com/EQEmu/Server/pull/2027)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-03-04
|
||||
* EVENT_ENTER_AREA/EVENT_LEAVE_AREA. ([#2698](https://github.com/EQEmu/Server/pull/2698)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-02
|
||||
* Edge case AA reset timer issue fixes ([#1995](https://github.com/EQEmu/Server/pull/1995)) ([KayenEQ](https://github.com/KayenEQ)) 2022-02-14
|
||||
* Fix #door Save ([#2699](https://github.com/EQEmu/Server/pull/2699)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-02
|
||||
* Fix #findaa and GetAAName(). ([#2774](https://github.com/EQEmu/Server/pull/2774)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-22
|
||||
* Fix #zone 0. ([#2691](https://github.com/EQEmu/Server/pull/2691)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-01
|
||||
* Fix Aug Clicks where item has no click effect. ([#2725](https://github.com/EQEmu/Server/pull/2725)) ([Aeadoin](https://github.com/Aeadoin)) 2023-01-12
|
||||
* Fix Bot "Failed to Load" Messages. ([#2719](https://github.com/EQEmu/Server/pull/2719)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-11
|
||||
* Fix Bot Group Loading ([#2780](https://github.com/EQEmu/Server/pull/2780)) ([Aeadoin](https://github.com/Aeadoin)) 2023-01-22
|
||||
* Fix Bot ^spellsettingsadd command ([#2603](https://github.com/EQEmu/Server/pull/2603)) ([Aeadoin](https://github.com/Aeadoin)) 2022-12-01
|
||||
* Fix Duplicate Silent Saylink Messages ([#2386](https://github.com/EQEmu/Server/pull/2386)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-08-22
|
||||
* Fix EntityList::GetBotListByCharacterID() ([#2569](https://github.com/EQEmu/Server/pull/2569)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-22
|
||||
* Fix Flag Updating with SetGMStatus() in Lua. ([#2554](https://github.com/EQEmu/Server/pull/2554)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-20
|
||||
* Fix Group XP not working. ([#2748](https://github.com/EQEmu/Server/pull/2748)) ([Aeadoin](https://github.com/Aeadoin)) 2023-01-17
|
||||
* Fix HP Regen Per Second. ([#2206](https://github.com/EQEmu/Server/pull/2206)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-05-25
|
||||
* Fix IDFile Crash with spaces or invalid data. ([#2597](https://github.com/EQEmu/Server/pull/2597)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-12-01
|
||||
* Fix IP Exemptions. ([#2189](https://github.com/EQEmu/Server/pull/2189)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-05-28
|
||||
* Fix Instance Repository ([#2598](https://github.com/EQEmu/Server/pull/2598)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-12-01
|
||||
* Fix Legacy Combat Lua Script ([#2226](https://github.com/EQEmu/Server/pull/2226)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-05-31
|
||||
* Fix MovePC in #zone and #zoneinstance Commands. ([#2236](https://github.com/EQEmu/Server/pull/2236)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-06-01
|
||||
* Fix NPC Reference in EVENT_SPAWN ([#2712](https://github.com/EQEmu/Server/pull/2712)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-08
|
||||
* Fix ST_TargetsTarget Spells with Restrictions ([#2746](https://github.com/EQEmu/Server/pull/2746)) ([Aeadoin](https://github.com/Aeadoin)) 2023-01-15
|
||||
* Fix Silent Saylinks Sending Message to Others. ([#2389](https://github.com/EQEmu/Server/pull/2389)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-08-22
|
||||
* Fix Spell Bucket and Spell Global Logic Checks. ([#2285](https://github.com/EQEmu/Server/pull/2285)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-07-05
|
||||
* Fix Spellinfo Command to work with SpellIDs above int16 ([#2437](https://github.com/EQEmu/Server/pull/2437)) ([Aeadoin](https://github.com/Aeadoin)) 2022-09-20
|
||||
* Fix Strings::Money Missing Conditions. ([#2383](https://github.com/EQEmu/Server/pull/2383)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-08-21
|
||||
* Fix Swarm Pet Flurry/Rampages Messages ([#2444](https://github.com/EQEmu/Server/pull/2444)) ([Aeadoin](https://github.com/Aeadoin)) 2022-09-25
|
||||
* Fix bot compile locking client on server enter. ([#2210](https://github.com/EQEmu/Server/pull/2210)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-05-26
|
||||
* Fix bot guild removal. ([#2194](https://github.com/EQEmu/Server/pull/2194)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-05-23
|
||||
* Fix botgrouplist to display unique entries. ([#2785](https://github.com/EQEmu/Server/pull/2785)) ([Aeadoin](https://github.com/Aeadoin)) 2023-01-23
|
||||
* Fix bots equipping augments. ([#2772](https://github.com/EQEmu/Server/pull/2772)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-22
|
||||
* Fix case-sensitivity in #suspend Command. ([#2613](https://github.com/EQEmu/Server/pull/2613)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-12-05
|
||||
* Fix duplicate and missing messages due to innate in spells ([#2170](https://github.com/EQEmu/Server/pull/2170)) ([noudess](https://github.com/noudess)) 2022-05-20
|
||||
* Fix empty spawned merchants ([#2275](https://github.com/EQEmu/Server/pull/2275)) ([hgtw](https://github.com/hgtw)) 2022-06-28
|
||||
* Fix for Bot command casting ([#1990](https://github.com/EQEmu/Server/pull/1990)) ([KayenEQ](https://github.com/KayenEQ)) 2022-02-12
|
||||
* Fix for PR1954 target restriction with npcpc_only_flag from groupbuffs ([#1986](https://github.com/EQEmu/Server/pull/1986)) ([KayenEQ](https://github.com/KayenEQ)) 2022-02-10
|
||||
* Fix for being able to skill up on corspe. ([#2058](https://github.com/EQEmu/Server/pull/2058)) ([noudess](https://github.com/noudess)) 2022-03-19
|
||||
* Fix for castspell command ([#2010](https://github.com/EQEmu/Server/pull/2010)) ([KayenEQ](https://github.com/KayenEQ)) 2022-02-18
|
||||
* Fix issue where #advnpcspawn addspawn does not add spawn sometimes. ([#2247](https://github.com/EQEmu/Server/pull/2247)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-06-07
|
||||
* Fix issue where you can set your title to titles you don't have. ([#1917](https://github.com/EQEmu/Server/pull/1917)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-01-30
|
||||
* Fix issue with Bot::LoadAndSpawnAllZonedBots. ([#2733](https://github.com/EQEmu/Server/pull/2733)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-15
|
||||
* Fix issue with mobs summoning PCs into ceilings ([#1921](https://github.com/EQEmu/Server/pull/1921)) ([noudess](https://github.com/noudess)) 2022-01-30
|
||||
* Fix loading world shared task state ([#2398](https://github.com/EQEmu/Server/pull/2398)) ([hgtw](https://github.com/hgtw)) 2022-08-28
|
||||
* Fix luamod GetExperienceForKill return value ([Cole-SoD](https://github.com/Cole-SoD)) 2023-01-12
|
||||
* Fix memory leak in ucs ([#2409](https://github.com/EQEmu/Server/pull/2409)) ([hgtw](https://github.com/hgtw)) 2022-09-03
|
||||
* Fix miscellaneous memory leaks related to EQApplicationPacket and it's pBuffer ([#2262](https://github.com/EQEmu/Server/pull/2262)) ([Quintinon](https://github.com/Quintinon)) 2022-07-03
|
||||
* Fix null pointer crash on zones that have not booted a zone yet with #reload commands or anything that calls GetZoneDescription ([#2231](https://github.com/EQEmu/Server/pull/2231)) ([Akkadius](https://github.com/Akkadius)) 2022-06-01
|
||||
* Fix possible crash in ProcessSpecialAbilities. ([#2630](https://github.com/EQEmu/Server/pull/2630)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-12-11
|
||||
* Fix possible crash with zone name methods. ([#2055](https://github.com/EQEmu/Server/pull/2055)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-03-13
|
||||
* Fix possible issue where variables have the same name. ([#2156](https://github.com/EQEmu/Server/pull/2156)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-05-08
|
||||
* Fix quest::updatespawntimer() Perl croak. ([#1947](https://github.com/EQEmu/Server/pull/1947)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-01-26
|
||||
* Fix recipient sound (vtell) on non-player races ([#2066](https://github.com/EQEmu/Server/pull/2066)) ([noudess](https://github.com/noudess)) 2022-04-02
|
||||
* Fix scenario where dereferenced object could be null. ([#2784](https://github.com/EQEmu/Server/pull/2784)) ([Aeadoin](https://github.com/Aeadoin)) 2023-01-23
|
||||
* Fix stack leaks in Lua events #2254 ([hgtw](https://github.com/hgtw)) 2022-06-09
|
||||
* Fix trading with bots when in an illusion. ([#2645](https://github.com/EQEmu/Server/pull/2645)) ([nytmyr](https://github.com/nytmyr)) 2022-12-15
|
||||
* Fix two invalid data accesses in zone/client.cpp ([#2238](https://github.com/EQEmu/Server/pull/2238)) ([Quintinon](https://github.com/Quintinon)) 2022-06-07
|
||||
* Fixed Spell Logic for Bot Nukes ([#2481](https://github.com/EQEmu/Server/pull/2481)) ([Aeadoin](https://github.com/Aeadoin)) 2022-10-13
|
||||
* Fixed message on promote/demote permissions check. ([#2700](https://github.com/EQEmu/Server/pull/2700)) ([Valorith](https://github.com/Valorith)) 2023-01-02
|
||||
* Fixed several instances of incorrect comparision - & executes after == ([#2025](https://github.com/EQEmu/Server/pull/2025)) ([noudess](https://github.com/noudess)) 2022-03-07
|
||||
* Force NPCs to respect special ability 24 and 50 when set on player pets ([#2059](https://github.com/EQEmu/Server/pull/2059)) ([Natedog2012](https://github.com/Natedog2012)) 2022-03-16
|
||||
* Free return value of ZoneDatabase::LoadTraderItemWithCharges() ([#2264](https://github.com/EQEmu/Server/pull/2264)) ([Quintinon](https://github.com/Quintinon)) 2022-06-18
|
||||
* Hacker_Str was causing sql errors - Non Escaped ([#2251](https://github.com/EQEmu/Server/pull/2251)) ([fryguy503](https://github.com/fryguy503)) 2022-06-08
|
||||
* Handle memory leaks from return value of Client::GetTraderItems() ([#2266](https://github.com/EQEmu/Server/pull/2266)) ([Quintinon](https://github.com/Quintinon)) 2022-07-03
|
||||
* Handle_OP_AugmentItem could cause Zone crash ([#2750](https://github.com/EQEmu/Server/pull/2750)) ([Aeadoin](https://github.com/Aeadoin)) 2023-01-17
|
||||
* HasPet() Zone Crashes ([#2744](https://github.com/EQEmu/Server/pull/2744)) ([Aeadoin](https://github.com/Aeadoin)) 2023-01-15
|
||||
* Illusions will now properly display armor to other clients when they zone in. ([#1958](https://github.com/EQEmu/Server/pull/1958)) ([KayenEQ](https://github.com/KayenEQ)) 2022-02-04
|
||||
* Instrument Mods should not affect spells that change model size. ([#2072](https://github.com/EQEmu/Server/pull/2072)) ([KayenEQ](https://github.com/KayenEQ)) 2022-04-13
|
||||
* Invisible will display as dropped now on air pets when they attack. ([#2042](https://github.com/EQEmu/Server/pull/2042)) ([KayenEQ](https://github.com/KayenEQ)) 2022-03-07
|
||||
* IsDamage test for lifetap was not complete. ([#2213](https://github.com/EQEmu/Server/pull/2213)) ([noudess](https://github.com/noudess)) 2022-05-27
|
||||
* Limit merchant temp item list to zone and instance ([#2346](https://github.com/EQEmu/Server/pull/2346)) ([mackal](https://github.com/mackal)) 2022-07-31
|
||||
* Lua GetBlockNextSpell() no return. ([#2151](https://github.com/EQEmu/Server/pull/2151)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-05-07
|
||||
* Make Perl TakeMoneyFromPP int64 ([#2158](https://github.com/EQEmu/Server/pull/2158)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-05-08
|
||||
* Missing break ([#2031](https://github.com/EQEmu/Server/pull/2031)) ([KayenEQ](https://github.com/KayenEQ)) 2022-03-04
|
||||
* Move EVENT_SPAWN for adding NPCs back to original spot, also add NPCs… ([#2749](https://github.com/EQEmu/Server/pull/2749)) ([Natedog2012](https://github.com/Natedog2012)) 2023-01-17
|
||||
* NPC Constructor was passing hp_regen_per_second out of order to Mob(). ([#2681](https://github.com/EQEmu/Server/pull/2681)) ([Aeadoin](https://github.com/Aeadoin)) 2022-12-29
|
||||
* NPC::CountItem and Corpse::CountItem 0 Charge Item Fix. ([#1959](https://github.com/EQEmu/Server/pull/1959)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-02-04
|
||||
* NPC::GetNPCStat has no default return. ([#2150](https://github.com/EQEmu/Server/pull/2150)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-05-07
|
||||
* NPCs were getting weapon proc added twice ([#2277](https://github.com/EQEmu/Server/pull/2277)) ([noudess](https://github.com/noudess)) 2022-07-07
|
||||
* Objects::GetTiltX() and Objects::GetTiltY() Perl Croak Typos. ([#2028](https://github.com/EQEmu/Server/pull/2028)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-03-04
|
||||
* PR 1982 ([#1985](https://github.com/EQEmu/Server/pull/1985)) ([KayenEQ](https://github.com/KayenEQ)) 2022-02-10
|
||||
* PR 2032 would lock client on casting fail as written ([#2038](https://github.com/EQEmu/Server/pull/2038)) ([KayenEQ](https://github.com/KayenEQ)) 2022-03-07
|
||||
* Remove StringUtilTest::EscapeStringMemoryTest ([#2310](https://github.com/EQEmu/Server/pull/2310)) ([mackal](https://github.com/mackal)) 2022-07-15
|
||||
* Remove Unnecessary Attack Log ([#2643](https://github.com/EQEmu/Server/pull/2643)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-12-14
|
||||
* Remove unnecessary log messages. ([#2642](https://github.com/EQEmu/Server/pull/2642)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-12-14
|
||||
* Removed Lua Event Argument Dispatch. ([Kinglykrab](https://github.com/Kinglykrab)) 2022-03-01
|
||||
* Resolve Warning due to Virtual Mob Method GetInv() ([#2650](https://github.com/EQEmu/Server/pull/2650)) ([Aeadoin](https://github.com/Aeadoin)) 2022-12-19
|
||||
* Resolve XP Calculation Bug introduced w/ recent Rule addition ([#2703](https://github.com/EQEmu/Server/pull/2703)) ([Valorith](https://github.com/Valorith)) 2023-01-07
|
||||
* Resolve logic error in Raid::QueueClients ([#2404](https://github.com/EQEmu/Server/pull/2404)) ([mackal](https://github.com/mackal)) 2022-09-01
|
||||
* Resolve subroutine redefinition due to bot methods. ([#2117](https://github.com/EQEmu/Server/pull/2117)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-05-07
|
||||
* Restore missing messages for lifetap and dmg spells. ([#2057](https://github.com/EQEmu/Server/pull/2057)) ([noudess](https://github.com/noudess)) 2022-04-14
|
||||
* Shared Memory Faction Association Typo ([#2419](https://github.com/EQEmu/Server/pull/2419)) ([mackal](https://github.com/mackal)) 2022-09-03
|
||||
* Spell Buckets/Globals SQL Escape. ([#2019](https://github.com/EQEmu/Server/pull/2019)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-02-26
|
||||
* Spell Buckets/Globals did not allow string-based values. ([#2043](https://github.com/EQEmu/Server/pull/2043)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-03-09
|
||||
* Stop skill ups on Charmed NPCs. ([#2249](https://github.com/EQEmu/Server/pull/2249)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-06-10
|
||||
* Summon Companion causing pets to warps away. ([#1972](https://github.com/EQEmu/Server/pull/1972)) ([KayenEQ](https://github.com/KayenEQ)) 2022-02-08
|
||||
* Touch Of Vinitras was ignoring pet DT rule ([#2469](https://github.com/EQEmu/Server/pull/2469)) ([Aeadoin](https://github.com/Aeadoin)) 2022-10-03
|
||||
* Tradeskill Autocombine MinSkill ([#2260](https://github.com/EQEmu/Server/pull/2260)) ([fryguy503](https://github.com/fryguy503)) 2022-06-10
|
||||
* Tradeskill Item 0 Error ([#2256](https://github.com/EQEmu/Server/pull/2256)) ([fryguy503](https://github.com/fryguy503)) 2022-06-10
|
||||
* Zone Flags Regression ([#2760](https://github.com/EQEmu/Server/pull/2760)) ([Akkadius](https://github.com/Akkadius)) 2023-01-19
|
||||
* checking casting_spell_slot before its defined is bad ([#2013](https://github.com/EQEmu/Server/pull/2013)) ([KayenEQ](https://github.com/KayenEQ)) 2022-02-20
|
||||
* manifest for db version 9176 had incorrect field name ([#2062](https://github.com/EQEmu/Server/pull/2062)) ([noudess](https://github.com/noudess)) 2022-03-19
|
||||
* quest::MovePCInstance() Arguments Fix. ([#2020](https://github.com/EQEmu/Server/pull/2020)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-02-27
|
||||
* Add Clangd Generated Files to .gitignore ([#2684](https://github.com/EQEmu/Server/pull/2684)) ([Aeadoin](https://github.com/Aeadoin)) 2022-12-31
|
||||
|
||||
### Hotfix
|
||||
|
||||
@@ -561,6 +401,14 @@ This is a first release using the new build system. Changelog entry representati
|
||||
* Windows compile fix take 3 (final) ([Akkadius](https://github.com/Akkadius)) 2022-07-07
|
||||
* fix manifest ([Akkadius](https://github.com/Akkadius)) 2022-07-16
|
||||
|
||||
### Library
|
||||
|
||||
* Bump httplib to 0.11.2 ([#2442](https://github.com/EQEmu/Server/pull/2442)) ([Akkadius](https://github.com/Akkadius)) 2022-09-28
|
||||
|
||||
### Loading
|
||||
|
||||
* Zone Version Loading Fixes ([#2233](https://github.com/EQEmu/Server/pull/2233)) ([Akkadius](https://github.com/Akkadius)) 2022-06-01
|
||||
|
||||
### Logging
|
||||
|
||||
* Add stack trace in code paths that shouldn't occur ([#2453](https://github.com/EQEmu/Server/pull/2453)) ([Akkadius](https://github.com/Akkadius)) 2022-09-28
|
||||
@@ -578,132 +426,98 @@ This is a first release using the new build system. Changelog entry representati
|
||||
* Table Injection - Member Variable Cleanup ([#2281](https://github.com/EQEmu/Server/pull/2281)) ([Akkadius](https://github.com/Akkadius)) 2022-07-07
|
||||
* Update BUILD_LOGGING=false Blank Aliases ([#2083](https://github.com/EQEmu/Server/pull/2083)) ([Akkadius](https://github.com/Akkadius)) 2022-05-01
|
||||
|
||||
### Login
|
||||
|
||||
* Added OP_ExpansionPacketData for RoF2 and update payload for Titanium ([#2186](https://github.com/EQEmu/Server/pull/2186)) ([neckkola](https://github.com/neckkola)) 2022-07-14
|
||||
|
||||
### Logs
|
||||
|
||||
* #logs list Improvements ([#2302](https://github.com/EQEmu/Server/pull/2302)) ([Akkadius](https://github.com/Akkadius)) 2022-07-14
|
||||
* Fix GMSay Log Regression ([#2298](https://github.com/EQEmu/Server/pull/2298)) ([Akkadius](https://github.com/Akkadius)) 2022-07-14
|
||||
* Have #reload logs also reload UCS logging ([#2491](https://github.com/EQEmu/Server/pull/2491)) ([Akkadius](https://github.com/Akkadius)) 2022-10-15
|
||||
|
||||
### Loot
|
||||
|
||||
* Add #lootsim (Loot Simulator) command ([#2375](https://github.com/EQEmu/Server/pull/2375)) ([Akkadius](https://github.com/Akkadius)) 2022-08-20
|
||||
* Remove unnecessary loot error messages. ([#2261](https://github.com/EQEmu/Server/pull/2261)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-06-12
|
||||
|
||||
### Luabind
|
||||
|
||||
* Silence deprecation warning ([#2657](https://github.com/EQEmu/Server/pull/2657)) ([Akkadius](https://github.com/Akkadius)) 2022-12-20
|
||||
|
||||
### Luamod
|
||||
|
||||
* Add CalcSpellEffectValue_formula to luamods ([#2721](https://github.com/EQEmu/Server/pull/2721)) ([Natedog2012](https://github.com/Natedog2012)) 2023-01-11
|
||||
|
||||
### Manifest
|
||||
|
||||
* Its not_empty not notempty ([#2394](https://github.com/EQEmu/Server/pull/2394)) ([mackal](https://github.com/mackal)) 2022-08-23
|
||||
|
||||
### Merchant
|
||||
|
||||
* LDoNSellBackRate support for Rule Merchant:EnableAltCurrencySell ([#2570](https://github.com/EQEmu/Server/pull/2570)) ([Aeadoin](https://github.com/Aeadoin)) 2022-11-25
|
||||
|
||||
### Mercs
|
||||
|
||||
* Add Mercenary Support ([#2745](https://github.com/EQEmu/Server/pull/2745)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-17
|
||||
|
||||
### Messages
|
||||
|
||||
* Convert messages from Spells to FocusEffect where necessary. ([#2243](https://github.com/EQEmu/Server/pull/2243)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-06-08
|
||||
|
||||
### Netcode
|
||||
|
||||
* Adjust first packet for compress flag ([#2326](https://github.com/EQEmu/Server/pull/2326)) ([hgtw](https://github.com/hgtw)) 2022-07-27
|
||||
|
||||
### Opcode
|
||||
|
||||
* Implement SetFace opcode ([#2167](https://github.com/EQEmu/Server/pull/2167)) ([hgtw](https://github.com/hgtw)) 2022-05-11
|
||||
|
||||
### Optimization
|
||||
|
||||
* Handle channel name filter checks in memory ([#2767](https://github.com/EQEmu/Server/pull/2767)) ([Valorith](https://github.com/Valorith)) 2023-01-20
|
||||
|
||||
### Pathing
|
||||
|
||||
* Fix pathing z-correctness for certain models ([#2430](https://github.com/EQEmu/Server/pull/2430)) ([Akkadius](https://github.com/Akkadius)) 2022-09-11
|
||||
|
||||
### Process
|
||||
|
||||
* Process Execution Refactor ([#2632](https://github.com/EQEmu/Server/pull/2632)) ([Akkadius](https://github.com/Akkadius)) 2022-12-11
|
||||
|
||||
### QS
|
||||
|
||||
* Database class name change ([#2743](https://github.com/EQEmu/Server/pull/2743)) ([Akkadius](https://github.com/Akkadius)) 2023-01-15
|
||||
|
||||
### Quest API
|
||||
### Quests
|
||||
|
||||
* Add AddAISpellEffect(spell_effect_id, base_value, limit_value, max_value) and RemoveAISpellEffect(spell_effect_id) to Lua. ([#1981](https://github.com/EQEmu/Server/pull/1981)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-02-09
|
||||
* Add AddItem() to Perl/Lua. ([#2054](https://github.com/EQEmu/Server/pull/2054)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-03-13
|
||||
* Add AddPlatinum(), GetCarriedPlatinum() and TakePlatinum() to Perl/Lua. ([#2079](https://github.com/EQEmu/Server/pull/2079)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-04-30
|
||||
* Add Area Damage Methods to Perl/Lua. ([#2549](https://github.com/EQEmu/Server/pull/2549)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-17
|
||||
* Add Augment Slot Type/Visible to GetItemStat ([#2686](https://github.com/EQEmu/Server/pull/2686)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-01
|
||||
* Add Bot Methods to Lua. ([#2731](https://github.com/EQEmu/Server/pull/2731)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-14
|
||||
* Add Bot::Camp() to Perl/Lua. ([#2718](https://github.com/EQEmu/Server/pull/2718)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-11
|
||||
* Add BuffCount() Overloads to Perl/Lua. ([#2679](https://github.com/EQEmu/Server/pull/2679)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-12-29
|
||||
* Add CampAllBots() to Perl/Lua. ([#2732](https://github.com/EQEmu/Server/pull/2732)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-14
|
||||
* Add Charges/Augment/Attuned Support to Varlink. ([#2685](https://github.com/EQEmu/Server/pull/2685)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-01
|
||||
* Add CheckNameFilter to Perl/Lua. ([#2175](https://github.com/EQEmu/Server/pull/2175)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-05-20
|
||||
* Add Client Augment Events to Perl/Lua. ([#2735](https://github.com/EQEmu/Server/pull/2735)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-15
|
||||
* Add Client Spell Methods to Perl/Lua. ([#2550](https://github.com/EQEmu/Server/pull/2550)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-22
|
||||
* Add CloneAppearance() to Perl/Lua. ([#2531](https://github.com/EQEmu/Server/pull/2531)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-14
|
||||
* Add CopyHateList() to Perl/Lua. ([#2623](https://github.com/EQEmu/Server/pull/2623)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-12-06
|
||||
* Add Corpse::AddItem overloads for Lua ([#2509](https://github.com/EQEmu/Server/pull/2509)) ([hgtw](https://github.com/hgtw)) 2022-10-29
|
||||
* Add Despawn Events to Perl/Lua. ([#2707](https://github.com/EQEmu/Server/pull/2707)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-07
|
||||
* Add DoAnim Overloads to Perl/Lua. ([#2627](https://github.com/EQEmu/Server/pull/2627)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-12-10
|
||||
* Add DoAugmentSlotsMatch() to Perl/Lua. ([#2687](https://github.com/EQEmu/Server/pull/2687)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-01
|
||||
* Add DoesAugmentFit() to Perl/Lua. ([#2688](https://github.com/EQEmu/Server/pull/2688)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-01
|
||||
* Add Door Methods to Perl/Lua. ([#2724](https://github.com/EQEmu/Server/pull/2724)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-12
|
||||
* Add EVENT_AA_BUY and EVENT_AA_GAIN to Perl/Lua. ([#2504](https://github.com/EQEmu/Server/pull/2504)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-05
|
||||
* Add EVENT_BOT_CREATE to Perl/Lua ([#2713](https://github.com/EQEmu/Server/pull/2713)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-09
|
||||
* Add EVENT_CAST_ON exports to EVENT_CAST and EVENT_CAST_BEGIN. ([#2051](https://github.com/EQEmu/Server/pull/2051)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-03-12
|
||||
* Add EVENT_EQUIP_ITEM_CLIENT and EVENT_UNEQUIP_ITEM_CLIENT to Perl/Lua. ([#2015](https://github.com/EQEmu/Server/pull/2015)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-02-23
|
||||
* Add EVENT_GM_COMMAND to Perl/Lua. ([#2634](https://github.com/EQEmu/Server/pull/2634)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-12-11
|
||||
* Add EVENT_LEVEL_DOWN to Perl/Lua. ([#2620](https://github.com/EQEmu/Server/pull/2620)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-12-11
|
||||
* Add EVENT_PAYLOAD to Perl/Lua. ([#2611](https://github.com/EQEmu/Server/pull/2611)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-12-04
|
||||
* Add EVENT_SKILL_UP & EVENT_LANGUAGE_SKILL_UP to Perl/Lua ([#2076](https://github.com/EQEmu/Server/pull/2076)) ([nytmyr](https://github.com/nytmyr)) 2022-04-25
|
||||
* Add Entity Variable Methods to Perl/Lua. ([#2609](https://github.com/EQEmu/Server/pull/2609)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-12-04
|
||||
* Add Fling Overloads to Perl/Lua. ([#2622](https://github.com/EQEmu/Server/pull/2622)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-12-06
|
||||
* Add GetAugmentIDsBySlotID() to Perl/Lua. ([#2673](https://github.com/EQEmu/Server/pull/2673)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-12-25
|
||||
* Add GetAverageLevel() to Perl/Lua. ([#2524](https://github.com/EQEmu/Server/pull/2524)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-14
|
||||
* Add GetBotItem() and GetBotItemIDBySlot() to Perl/Lua. ([#2350](https://github.com/EQEmu/Server/pull/2350)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-07-31
|
||||
* Add GetBotListByCharacterID() to Perl/Lua. ([#2069](https://github.com/EQEmu/Server/pull/2069)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-04-02
|
||||
* Add GetBotListByClientName() Class Overload to Perl/Lua. ([#2577](https://github.com/EQEmu/Server/pull/2577)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-26
|
||||
* Add GetBotListByClientName(client_name) to Perl/Lua. ([#2064](https://github.com/EQEmu/Server/pull/2064)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-03-23
|
||||
* Add GetEnvironmentalDamageName() to Perl/Lua. ([#1964](https://github.com/EQEmu/Server/pull/1964)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-02-10
|
||||
* Add GetGMStatus() to Perl/Lua. ([#2448](https://github.com/EQEmu/Server/pull/2448)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-09-28
|
||||
* Add GetGuildPublicNote() to Perl/Lua. ([#2608](https://github.com/EQEmu/Server/pull/2608)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-12-04
|
||||
* Add GetHealAmount() and GetSpellDamage() to Perl/Lua. ([#2165](https://github.com/EQEmu/Server/pull/2165)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-05-11
|
||||
* Add GetLeader() and GetLeaderName() to Perl/Lua. ([#2701](https://github.com/EQEmu/Server/pull/2701)) ([Valorith](https://github.com/Valorith)) 2023-01-04
|
||||
* Add GetLowestLevel() to Perl. ([#2517](https://github.com/EQEmu/Server/pull/2517)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-05
|
||||
* Add GetRandomBot() to Perl/Lua ([#2543](https://github.com/EQEmu/Server/pull/2543)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-16
|
||||
* Add GetRandomClient(), GetRandomMob() and GetRandomNPC() overloads to Perl/Lua. ([#2541](https://github.com/EQEmu/Server/pull/2541)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-14
|
||||
* Add GetRandomMob() and GetRandomNPC() to Perl/Lua. ([#2006](https://github.com/EQEmu/Server/pull/2006)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-02-17
|
||||
* Add GetSkillDmgAmt() to Perl. ([#2365](https://github.com/EQEmu/Server/pull/2365)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-08-10
|
||||
* Add GetUltimateOwner() to Perl/Lua. ([#2516](https://github.com/EQEmu/Server/pull/2516)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-05
|
||||
* Add Goto Player Teleport Methods. ([#2379](https://github.com/EQEmu/Server/pull/2379)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-08-20
|
||||
* Add Group/Raid Overloads to Perl/Lua. ([#2587](https://github.com/EQEmu/Server/pull/2587)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-27
|
||||
* Add Group/Raid overloads to Perl/Lua. ([#2526](https://github.com/EQEmu/Server/pull/2526)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-14
|
||||
* Add HasBotSpellEntry() to Perl/Lua. ([#2563](https://github.com/EQEmu/Server/pull/2563)) ([Aeadoin](https://github.com/Aeadoin)) 2022-11-25
|
||||
* Add Hotzone Methods to Perl/Lua. ([#2558](https://github.com/EQEmu/Server/pull/2558)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-22
|
||||
* Add Instance ID/Version exports to EVENT_ZONE. ([#2502](https://github.com/EQEmu/Server/pull/2502)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-05
|
||||
* Add Instance Methods to Perl/Lua. ([#2573](https://github.com/EQEmu/Server/pull/2573)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-26
|
||||
* Add IsAttackAllowed() to Perl/Lua. ([#2672](https://github.com/EQEmu/Server/pull/2672)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-12-25
|
||||
* Add IsRaining() and IsSnowing() to Perl/Lua. ([#2477](https://github.com/EQEmu/Server/pull/2477)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-10-14
|
||||
* Add IsRareSpawn() to Perl/Lua. ([#2338](https://github.com/EQEmu/Server/pull/2338)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-07-30
|
||||
* Add Lua handlers for zone controller events ([#2514](https://github.com/EQEmu/Server/pull/2514)) ([hgtw](https://github.com/hgtw)) 2022-11-05
|
||||
* Add Marquee methods to Perl/Lua. ([#2544](https://github.com/EQEmu/Server/pull/2544)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-16
|
||||
* Add MaxSkills() to Perl/Lua. ([#2621](https://github.com/EQEmu/Server/pull/2621)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-12-06
|
||||
* Add Merchant Events to Perl/Lua. ([#2452](https://github.com/EQEmu/Server/pull/2452)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-09-28
|
||||
* Add Mob Hate Methods to Perl/Lua. ([#2548](https://github.com/EQEmu/Server/pull/2548)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-16
|
||||
* Add Overloads to MoveZone Methods in Perl/Lua. ([#2551](https://github.com/EQEmu/Server/pull/2551)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-22
|
||||
* Add Owner methods to Perl/Lua. ([#2542](https://github.com/EQEmu/Server/pull/2542)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-14
|
||||
* Add Popup methods to Perl/Lua. ([#2533](https://github.com/EQEmu/Server/pull/2533)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-14
|
||||
* Add Proximity Range Methods to Perl/Lua. ([#2572](https://github.com/EQEmu/Server/pull/2572)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-26
|
||||
* Add RandomizeFeature() overloads to Perl/Lua. ([#2532](https://github.com/EQEmu/Server/pull/2532)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-14
|
||||
* Add Recipe Methods ([#2393](https://github.com/EQEmu/Server/pull/2393)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-08-23
|
||||
* Add ResetAlternateAdvancementRank() to Perl/Lua. ([#2510](https://github.com/EQEmu/Server/pull/2510)) ([hgtw](https://github.com/hgtw)) 2022-10-29
|
||||
* Add ResetDecayTimer() to Perl/Lua. ([#2520](https://github.com/EQEmu/Server/pull/2520)) ([hgtw](https://github.com/hgtw)) 2022-11-06
|
||||
* Add SendGMCommand() to Perl/Lua. ([#2527](https://github.com/EQEmu/Server/pull/2527)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-14
|
||||
* Add SendPath() to Perl/Lua. ([#2740](https://github.com/EQEmu/Server/pull/2740)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-15
|
||||
* Add SignalAllBotsByOwnerName() to Perl/Lua. ([#2730](https://github.com/EQEmu/Server/pull/2730)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-13
|
||||
* Add SplitMoney() with Client splitter to Perl. ([#2525](https://github.com/EQEmu/Server/pull/2525)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-14
|
||||
* Add TaskSelector to Perl/Lua. ([#2177](https://github.com/EQEmu/Server/pull/2177)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-05-15
|
||||
* Add Time String to Seconds Method to Perl/Lua. ([#2580](https://github.com/EQEmu/Server/pull/2580)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-27
|
||||
* Add TrackNPC to Perl/Lua. ([#2272](https://github.com/EQEmu/Server/pull/2272)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-06-29
|
||||
* Add WearChange Overloads to Perl/Lua. ([#2600](https://github.com/EQEmu/Server/pull/2600)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-12-01
|
||||
* Add Zone Flag Methods to Perl/Lua. ([#2574](https://github.com/EQEmu/Server/pull/2574)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-26
|
||||
* Add apis to end shared tasks ([#2521](https://github.com/EQEmu/Server/pull/2521)) ([hgtw](https://github.com/hgtw)) 2022-11-06
|
||||
* Add caster_id and caster_level export to EVENT_CAST_ON in Perl/Lua. ([#2049](https://github.com/EQEmu/Server/pull/2049)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-03-11
|
||||
* Add commify to Perl/Lua. ([#2099](https://github.com/EQEmu/Server/pull/2099)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-05-03
|
||||
* Add inventory->CountItemEquippedByID(item_id) and inventory->HasItemEquippedByID(item_id) to Perl/Lua. ([#1963](https://github.com/EQEmu/Server/pull/1963)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-02-06
|
||||
* Add missing methods/package.adds to Perl API. ([#2287](https://github.com/EQEmu/Server/pull/2287)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-07-05
|
||||
* Add multiple inventory method short hands to client. ([#2078](https://github.com/EQEmu/Server/pull/2078)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-04-30
|
||||
* Add option to Ignore Mods to CalcEXP ([#2704](https://github.com/EQEmu/Server/pull/2704)) ([Aeadoin](https://github.com/Aeadoin)) 2023-01-06
|
||||
* Adjustment to depop_all function. ([#2595](https://github.com/EQEmu/Server/pull/2595)) ([fryguy503](https://github.com/fryguy503)) 2022-11-30
|
||||
* Allow CreateInstance to be used without a Client initiator. ([#2399](https://github.com/EQEmu/Server/pull/2399)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-08-28
|
||||
* Allow EVENT_ZONE to be parsed as non-zero to prevent zoning. ([#2052](https://github.com/EQEmu/Server/pull/2052)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-03-12
|
||||
* Allow scripts to prevent door click ([#2327](https://github.com/EQEmu/Server/pull/2327)) ([hgtw](https://github.com/hgtw)) 2022-07-27
|
||||
* Cleanup Proximity Events ([#2697](https://github.com/EQEmu/Server/pull/2697)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-02
|
||||
* Cleanup Signal Methods in Perl/Lua. ([#2604](https://github.com/EQEmu/Server/pull/2604)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-12-04
|
||||
* Expand Bot quest API functionality. ([#2096](https://github.com/EQEmu/Server/pull/2096)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-05-04
|
||||
* Expand SaveGuardSpot ([#2258](https://github.com/EQEmu/Server/pull/2258)) ([fryguy503](https://github.com/fryguy503)) 2022-06-10
|
||||
* Export corpse in EVENT_DEATH_COMPLETE ([#2519](https://github.com/EQEmu/Server/pull/2519)) ([hgtw](https://github.com/hgtw)) 2022-11-06
|
||||
* Export killed XYZH to EVENT_DEATH_ZONE in Perl. ([#2050](https://github.com/EQEmu/Server/pull/2050)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-03-12
|
||||
* Fix Lua Door/Object Create Methods. ([#2633](https://github.com/EQEmu/Server/pull/2633)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-12-11
|
||||
* Fix Perl EVENT_HP double parsing in Spire. ([#2585](https://github.com/EQEmu/Server/pull/2585)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-27
|
||||
* Fix lua task selector count when over max ([#2353](https://github.com/EQEmu/Server/pull/2353)) ([hgtw](https://github.com/hgtw)) 2022-07-31
|
||||
* Fix missing arg in perl set_proximity ([#2291](https://github.com/EQEmu/Server/pull/2291)) ([hgtw](https://github.com/hgtw)) 2022-07-09
|
||||
* Fix parameters in some Perl worldwide methods. ([#2224](https://github.com/EQEmu/Server/pull/2224)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-05-31
|
||||
* Let HasQuestSub check encounters ([#2435](https://github.com/EQEmu/Server/pull/2435)) ([hgtw](https://github.com/hgtw)) 2022-09-20
|
||||
* Perl Doors Fix. ([#2288](https://github.com/EQEmu/Server/pull/2288)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-07-05
|
||||
* Perl Money Fixes. ([#2098](https://github.com/EQEmu/Server/pull/2098)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-05-04
|
||||
* Send delivered task items in trade events ([#2518](https://github.com/EQEmu/Server/pull/2518)) ([hgtw](https://github.com/hgtw)) 2022-11-06
|
||||
* Use Floating Point for CameraEffect Intensity ([#2337](https://github.com/EQEmu/Server/pull/2337)) ([hgtw](https://github.com/hgtw)) 2022-07-31
|
||||
* Use binding library for perl apis ([#2216](https://github.com/EQEmu/Server/pull/2216)) ([hgtw](https://github.com/hgtw)) 2022-07-04
|
||||
* Improve Quest Error Handling ([#2635](https://github.com/EQEmu/Server/pull/2635)) ([Akkadius](https://github.com/Akkadius)) 2022-12-13
|
||||
* Improve Quest Error Handling - Add back in process based syntax validation ([#2646](https://github.com/EQEmu/Server/pull/2646)) ([Akkadius](https://github.com/Akkadius)) 2022-12-15
|
||||
|
||||
### Refactor
|
||||
|
||||
* Simplify NPC Loading ([#2087](https://github.com/EQEmu/Server/pull/2087)) ([Akkadius](https://github.com/Akkadius)) 2022-05-01
|
||||
|
||||
### Regen
|
||||
|
||||
* Fix possible overflow in CalcHPRegenCap(). ([#2185](https://github.com/EQEmu/Server/pull/2185)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-05-27
|
||||
* Implement Per Second HP Regen for NPCs ([#2086](https://github.com/EQEmu/Server/pull/2086)) ([Akkadius](https://github.com/Akkadius)) 2022-05-01
|
||||
|
||||
### Repositories
|
||||
|
||||
* Add Bot Repositories. ([#2529](https://github.com/EQEmu/Server/pull/2529)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-16
|
||||
* Add Cereal support to repository generator ([#2660](https://github.com/EQEmu/Server/pull/2660)) ([Akkadius](https://github.com/Akkadius)) 2022-12-20
|
||||
* Add GetMaxId, Count ([#2371](https://github.com/EQEmu/Server/pull/2371)) ([Akkadius](https://github.com/Akkadius)) 2022-08-13
|
||||
* Add more precise types to repository generator ([#2391](https://github.com/EQEmu/Server/pull/2391)) ([mackal](https://github.com/mackal)) 2022-08-31
|
||||
* Cast floats to avoid grid repository warnings ([#2094](https://github.com/EQEmu/Server/pull/2094)) ([hgtw](https://github.com/hgtw)) 2022-05-02
|
||||
* Migrate LoadPerlEventExportSettings to use repositories ([#2637](https://github.com/EQEmu/Server/pull/2637)) ([Akkadius](https://github.com/Akkadius)) 2022-12-15
|
||||
* Modernize character recipe list ([#2385](https://github.com/EQEmu/Server/pull/2385)) ([Akkadius](https://github.com/Akkadius)) 2022-08-22
|
||||
* Update Character EXP Modifiers Repository ([#2530](https://github.com/EQEmu/Server/pull/2530)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-11-14
|
||||
* Update repositories ([#2040](https://github.com/EQEmu/Server/pull/2040)) ([Akkadius](https://github.com/Akkadius)) 2022-03-11
|
||||
|
||||
### Roambox
|
||||
|
||||
* Improve Path Finding ([#2324](https://github.com/EQEmu/Server/pull/2324)) ([noudess](https://github.com/noudess)) 2022-07-30
|
||||
|
||||
### Rules
|
||||
|
||||
@@ -734,14 +548,145 @@ This is a first release using the new build system. Changelog entry representati
|
||||
* Bugs Table Migration (#2602) ([#2559](https://github.com/EQEmu/Server/pull/2559)) ([joligario](https://github.com/joligario)) 2022-12-01
|
||||
* Update 2023_01_15_merc_data.sql ([#2763](https://github.com/EQEmu/Server/pull/2763)) ([joligario](https://github.com/joligario)) 2023-01-20
|
||||
|
||||
### Saylinks
|
||||
|
||||
* Add Silent helper ([#2372](https://github.com/EQEmu/Server/pull/2372)) ([Akkadius](https://github.com/Akkadius)) 2022-08-13
|
||||
* Convert all GM Command Saylinks to Silent Saylinks. ([#2373](https://github.com/EQEmu/Server/pull/2373)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-08-14
|
||||
* Inject Saylinks in MessageClose API ([#2335](https://github.com/EQEmu/Server/pull/2335)) ([hgtw](https://github.com/hgtw)) 2022-07-31
|
||||
* Refactor saylink injection ([#2315](https://github.com/EQEmu/Server/pull/2315)) ([hgtw](https://github.com/hgtw)) 2022-07-27
|
||||
|
||||
### Server
|
||||
|
||||
* Configuration Issues Checker (LAN Detection) ([#2283](https://github.com/EQEmu/Server/pull/2283)) ([Akkadius](https://github.com/Akkadius)) 2022-07-07
|
||||
|
||||
### Skills
|
||||
|
||||
* Configurable Exponential Decay Formula for Skill Up ([#1887](https://github.com/EQEmu/Server/pull/1887)) ([mmcgarvey](https://github.com/mmcgarvey)) 2022-01-30
|
||||
|
||||
### Spells
|
||||
|
||||
* AE Duration effect (Rains) will now work with Target Ring and PBAE spells. ([#2000](https://github.com/EQEmu/Server/pull/2000)) ([KayenEQ](https://github.com/KayenEQ)) 2022-02-16
|
||||
* Allow damage spells to heal if quest based spell mitigation is over 100 pct. ([#1978](https://github.com/EQEmu/Server/pull/1978)) ([KayenEQ](https://github.com/KayenEQ)) 2022-02-08
|
||||
* Bard songs from item clickies should not require components ([#2011](https://github.com/EQEmu/Server/pull/2011)) ([KayenEQ](https://github.com/KayenEQ)) 2022-02-18
|
||||
* Fix for AA and Discipline recast timers being set on spell casting failure. ([#1971](https://github.com/EQEmu/Server/pull/1971)) ([KayenEQ](https://github.com/KayenEQ)) 2022-02-08
|
||||
* Fix for AA recast timers not resetting properly ([#1989](https://github.com/EQEmu/Server/pull/1989)) ([KayenEQ](https://github.com/KayenEQ)) 2022-02-11
|
||||
* Fixes for numhits type 7 counter incrementing incorrectly. ([#2022](https://github.com/EQEmu/Server/pull/2022)) ([KayenEQ](https://github.com/KayenEQ)) 2022-03-02
|
||||
* Illusions will now persist onto the corpse when mob is killed. ([#1960](https://github.com/EQEmu/Server/pull/1960)) ([KayenEQ](https://github.com/KayenEQ)) 2022-02-05
|
||||
* Invisibility updates and rework ([#1991](https://github.com/EQEmu/Server/pull/1991)) ([KayenEQ](https://github.com/KayenEQ)) 2022-02-15
|
||||
* Major update to Bard song pulsing, Bard item clicks while singing, and spell casting restriction logic. ([#1954](https://github.com/EQEmu/Server/pull/1954)) ([KayenEQ](https://github.com/KayenEQ)) 2022-02-07
|
||||
* SPA 311 SE_LimitCombatSkills should prevent focusing of procs even if proc is a 'casted' spell. ([#1961](https://github.com/EQEmu/Server/pull/1961)) ([KayenEQ](https://github.com/KayenEQ)) 2022-02-05
|
||||
* SPA 79 SE_CurrentHPOnce now will check for focus, critical and partial resist checks, except for buffs. ([#2018](https://github.com/EQEmu/Server/pull/2018)) ([KayenEQ](https://github.com/KayenEQ)) 2022-02-24
|
||||
* Support for 'HateAdded' spell field to apply negative values to reduce hate. ([#1953](https://github.com/EQEmu/Server/pull/1953)) ([KayenEQ](https://github.com/KayenEQ)) 2022-02-03
|
||||
* Support for SPA 194 SE_FadingMemories to use max level checks on aggroed mobs ([#1979](https://github.com/EQEmu/Server/pull/1979)) ([KayenEQ](https://github.com/KayenEQ)) 2022-02-09
|
||||
* Swarm pet aggro logic fix ([#1956](https://github.com/EQEmu/Server/pull/1956)) ([KayenEQ](https://github.com/KayenEQ)) 2022-02-04
|
||||
* Target's Target Combat Range Rule ([#2274](https://github.com/EQEmu/Server/pull/2274)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-06-24
|
||||
* Update to target types Beam and Cone to ignore invalid targets. ([#2080](https://github.com/EQEmu/Server/pull/2080)) ([KayenEQ](https://github.com/KayenEQ)) 2022-05-01
|
||||
* Updates to spell field 'cast not stands' to ignore casting restrictions ([#1938](https://github.com/EQEmu/Server/pull/1938)) ([KayenEQ](https://github.com/KayenEQ)) 2022-01-29
|
||||
|
||||
### Strings
|
||||
|
||||
* Refactor Strings Usage ([#2305](https://github.com/EQEmu/Server/pull/2305)) ([Akkadius](https://github.com/Akkadius)) 2022-07-14
|
||||
|
||||
### Tasks
|
||||
|
||||
* Add Task Reward Points Field ([#2317](https://github.com/EQEmu/Server/pull/2317)) ([hgtw](https://github.com/hgtw)) 2022-07-30
|
||||
* Add method to filter shared task offers ([#2497](https://github.com/EQEmu/Server/pull/2497)) ([hgtw](https://github.com/hgtw)) 2022-10-29
|
||||
* Add pre-task update event ([#2512](https://github.com/EQEmu/Server/pull/2512)) ([hgtw](https://github.com/hgtw)) 2022-10-30
|
||||
* Add rule to update multiple task elements ([#2427](https://github.com/EQEmu/Server/pull/2427)) ([hgtw](https://github.com/hgtw)) 2022-09-06
|
||||
* Add task accept packet validation ([#2354](https://github.com/EQEmu/Server/pull/2354)) ([hgtw](https://github.com/hgtw)) 2022-07-31
|
||||
* Apply full duration mission replay timers ([#2299](https://github.com/EQEmu/Server/pull/2299)) ([hgtw](https://github.com/hgtw)) 2022-07-14
|
||||
* Change zone task data container ([#2410](https://github.com/EQEmu/Server/pull/2410)) ([hgtw](https://github.com/hgtw)) 2022-09-03
|
||||
* Crash fix with data input sanitization ([#2629](https://github.com/EQEmu/Server/pull/2629)) ([Akkadius](https://github.com/Akkadius)) 2022-12-10
|
||||
* Data validation for zone_version ([#2381](https://github.com/EQEmu/Server/pull/2381)) ([Akkadius](https://github.com/Akkadius)) 2022-08-21
|
||||
* Fix #task command crash on bad input ([#2301](https://github.com/EQEmu/Server/pull/2301)) ([hgtw](https://github.com/hgtw)) 2022-07-14
|
||||
* Fix validation loading ([#2230](https://github.com/EQEmu/Server/pull/2230)) ([Akkadius](https://github.com/Akkadius)) 2022-06-01
|
||||
* Implement Task Goal Match List ([#2097](https://github.com/EQEmu/Server/pull/2097)) ([Akkadius](https://github.com/Akkadius)) 2022-05-07
|
||||
* Implement task activity prerequisites ([#2374](https://github.com/EQEmu/Server/pull/2374)) ([hgtw](https://github.com/hgtw)) 2022-08-22
|
||||
* Let task completion event block task rewards ([#2511](https://github.com/EQEmu/Server/pull/2511)) ([hgtw](https://github.com/hgtw)) 2022-10-30
|
||||
* Let task reward find free bag slots ([#2431](https://github.com/EQEmu/Server/pull/2431)) ([hgtw](https://github.com/hgtw)) 2022-09-18
|
||||
* Make #task reloadall not quit shared tasks ([#2351](https://github.com/EQEmu/Server/pull/2351)) ([hgtw](https://github.com/hgtw)) 2022-07-31
|
||||
* Make Task Selector Cooldown Optional ([#2420](https://github.com/EQEmu/Server/pull/2420)) ([hgtw](https://github.com/hgtw)) 2022-09-03
|
||||
* Only allow shared task completion once ([#2422](https://github.com/EQEmu/Server/pull/2422)) ([hgtw](https://github.com/hgtw)) 2022-09-03
|
||||
* Only update loot tasks for NPC corpses ([#2513](https://github.com/EQEmu/Server/pull/2513)) ([hgtw](https://github.com/hgtw)) 2022-11-05
|
||||
* Place task item rewards in free slots ([#2300](https://github.com/EQEmu/Server/pull/2300)) ([hgtw](https://github.com/hgtw)) 2022-07-14
|
||||
* Remove delivered task items from trades ([#2405](https://github.com/EQEmu/Server/pull/2405)) ([hgtw](https://github.com/hgtw)) 2022-09-02
|
||||
* Replace task goals with explicit fields ([#2402](https://github.com/EQEmu/Server/pull/2402)) ([hgtw](https://github.com/hgtw)) 2022-09-02
|
||||
* Reward clients on shared task completion sync ([#2306](https://github.com/EQEmu/Server/pull/2306)) ([hgtw](https://github.com/hgtw)) 2022-07-16
|
||||
* Schema simplification ([#2449](https://github.com/EQEmu/Server/pull/2449)) ([hgtw](https://github.com/hgtw)) 2022-09-28
|
||||
* Send Client Message for All Solo Task Updates ([#2336](https://github.com/EQEmu/Server/pull/2336)) ([hgtw](https://github.com/hgtw)) 2022-07-31
|
||||
* Support Raw NPC Names in Task Goal List ([#2333](https://github.com/EQEmu/Server/pull/2333)) ([hgtw](https://github.com/hgtw)) 2022-07-30
|
||||
* Tweak task update messages ([#2406](https://github.com/EQEmu/Server/pull/2406)) ([hgtw](https://github.com/hgtw)) 2022-09-02
|
||||
* Use CashReward for Tasks ([#2332](https://github.com/EQEmu/Server/pull/2332)) ([hgtw](https://github.com/hgtw)) 2022-07-30
|
||||
* Use dz switch id for task touch events ([#2344](https://github.com/EQEmu/Server/pull/2344)) ([hgtw](https://github.com/hgtw)) 2022-07-31
|
||||
* Use zone currencies instead of hard-coded enum. ([#2459](https://github.com/EQEmu/Server/pull/2459)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-09-29
|
||||
* Zone Version Matching ([#2303](https://github.com/EQEmu/Server/pull/2303)) ([Akkadius](https://github.com/Akkadius)) 2022-07-14
|
||||
|
||||
### Telnet
|
||||
|
||||
* Add guildsay to console commands and Guild Channel to QueueMessage. ([#2263](https://github.com/EQEmu/Server/pull/2263)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-07-03
|
||||
|
||||
### Titles
|
||||
|
||||
* Cleanup titles, title suffix, and last name methods. ([#2174](https://github.com/EQEmu/Server/pull/2174)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-05-20
|
||||
|
||||
### Typo
|
||||
|
||||
* Remove CanTradeFVNoDropItem() Duplicate ([#2352](https://github.com/EQEmu/Server/pull/2352)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-07-31
|
||||
|
||||
### UCS
|
||||
|
||||
* Auto Client Reconnection ([#2154](https://github.com/EQEmu/Server/pull/2154)) ([Akkadius](https://github.com/Akkadius)) 2022-05-08
|
||||
|
||||
### Utility
|
||||
|
||||
* Add std::string_view overloads for std::from_chars ([#2392](https://github.com/EQEmu/Server/pull/2392)) ([mackal](https://github.com/mackal)) 2022-08-31
|
||||
|
||||
### Validation
|
||||
|
||||
* Add Size Validation to #hotfix. ([#2304](https://github.com/EQEmu/Server/pull/2304)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-07-14
|
||||
|
||||
### Websocket
|
||||
|
||||
* Fix cpp20/gcc11 compile failure ([#2737](https://github.com/EQEmu/Server/pull/2737)) ([Akkadius](https://github.com/Akkadius)) 2023-01-15
|
||||
|
||||
### Zone Flags
|
||||
### World
|
||||
|
||||
* Use database connection, not content connection ([#2759](https://github.com/EQEmu/Server/pull/2759)) ([Akkadius](https://github.com/Akkadius)) 2023-01-19
|
||||
* Add more descriptive LS auth erroring ([#2293](https://github.com/EQEmu/Server/pull/2293)) ([Akkadius](https://github.com/Akkadius)) 2022-07-14
|
||||
* World Bootup Consolidation ([#2294](https://github.com/EQEmu/Server/pull/2294)) ([Akkadius](https://github.com/Akkadius)) 2022-07-14
|
||||
|
||||
### XTarget
|
||||
|
||||
* Revert All XTarget Corpse Changes ([#1944](https://github.com/EQEmu/Server/pull/1944)) ([mmcgarvey](https://github.com/mmcgarvey)) 2022-01-24
|
||||
|
||||
### Zone
|
||||
|
||||
* Add missing safe_heading assignment ([#2407](https://github.com/EQEmu/Server/pull/2407)) ([hgtw](https://github.com/hgtw)) 2022-09-02
|
||||
* Deprecate Zone `expansion` Field ([#2297](https://github.com/EQEmu/Server/pull/2297)) ([Akkadius](https://github.com/Akkadius)) 2022-07-14
|
||||
* Fix and simplify zone shutdown logic ([#2390](https://github.com/EQEmu/Server/pull/2390)) ([Akkadius](https://github.com/Akkadius)) 2022-08-31
|
||||
|
||||
### Zones
|
||||
|
||||
* Add Max Level Check to Zones. ([#2714](https://github.com/EQEmu/Server/pull/2714)) ([Kinglykrab](https://github.com/Kinglykrab)) 2023-01-11
|
||||
|
||||
### Zoning
|
||||
|
||||
* Fix zone race condition ([#2479](https://github.com/EQEmu/Server/pull/2479)) ([Akkadius](https://github.com/Akkadius)) 2022-10-12
|
||||
* Fix zoning logic issues ([#2412](https://github.com/EQEmu/Server/pull/2412)) ([Akkadius](https://github.com/Akkadius)) 2022-09-03
|
||||
* Possible zoning under world fix ([#2424](https://github.com/EQEmu/Server/pull/2424)) ([Akkadius](https://github.com/Akkadius)) 2022-10-11
|
||||
* Revert #2424 ([#2492](https://github.com/EQEmu/Server/pull/2492)) ([Akkadius](https://github.com/Akkadius)) 2022-10-16
|
||||
|
||||
### eqemu_server.pl
|
||||
|
||||
* Remove non-working fetch_latest_windows_binaries() ([#2445](https://github.com/EQEmu/Server/pull/2445)) ([Akkadius](https://github.com/Akkadius)) 2022-09-25
|
||||
|
||||
### int64
|
||||
|
||||
* Fix int64 for OOC Regen and GetHP(), GetMaxHP(), GetItemHPBonuses() in Perl/Lua. ([#2218](https://github.com/EQEmu/Server/pull/2218)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-05-29
|
||||
* Further int64 cleanup in Perl SetHP() and GetSpellHPBonuses() in Perl/Lua. ([#2222](https://github.com/EQEmu/Server/pull/2222)) ([Kinglykrab](https://github.com/Kinglykrab)) 2022-05-29
|
||||
* Hate Fixes ([#2163](https://github.com/EQEmu/Server/pull/2163)) ([Akkadius](https://github.com/Akkadius)) 2022-05-10
|
||||
* Support for HP / Mana / End / Damage / Hate ([#2091](https://github.com/EQEmu/Server/pull/2091)) ([Akkadius](https://github.com/Akkadius)) 2022-05-08
|
||||
* Windows Compile Fixes ([#2155](https://github.com/EQEmu/Server/pull/2155)) ([Akkadius](https://github.com/Akkadius)) 2022-05-08
|
||||
|
||||
### libuv
|
||||
|
||||
* Bump to v1.44.2 from v1.26.0 ([#2658](https://github.com/EQEmu/Server/pull/2658)) ([Akkadius](https://github.com/Akkadius)) 2022-12-20
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# EQEmulator Core Server
|
||||
| Drone (Linux x64) | Drone (Windows x64) |
|
||||
|:---:|:---:|
|
||||
|[](http://drone.akkadius.com/EQEmu/Server) |[](http://drone.akkadius.com/EQEmu/Server) |
|
||||
|Travis CI (Linux)|Appveyor (Windows x86) |Appveyor (Windows x64) |
|
||||
|:---:|:---:|:---:|
|
||||
|[](https://travis-ci.org/EQEmu/Server) |[](https://ci.appveyor.com/project/KimLS/server) |[](https://ci.appveyor.com/project/KimLS/server-87crp) |
|
||||
|
||||
***
|
||||
|
||||
|
||||
+11
-28
@@ -13,7 +13,6 @@
|
||||
#include "platform.h"
|
||||
|
||||
#include <cstdio>
|
||||
#include <vector>
|
||||
|
||||
#if WINDOWS
|
||||
#define popen _popen
|
||||
@@ -23,8 +22,8 @@ void SendCrashReport(const std::string &crash_report)
|
||||
{
|
||||
// can configure multiple endpoints if need be
|
||||
std::vector<std::string> endpoints = {
|
||||
"http://spire.akkadius.com/api/v1/analytics/server-crash-report",
|
||||
// "http://localhost:3010/api/v1/analytics/server-crash-report", // development
|
||||
"http://spire.akkadius.com/api/v1/server-crash-report",
|
||||
// "http://localhost:3010/api/v1/server-crash-report", // development
|
||||
};
|
||||
|
||||
auto config = EQEmuConfig::get();
|
||||
@@ -104,30 +103,27 @@ public:
|
||||
EQEmuStackWalker(DWORD dwProcessId, HANDLE hProcess) : StackWalker(dwProcessId, hProcess) { }
|
||||
virtual void OnOutput(LPCSTR szText) {
|
||||
char buffer[4096];
|
||||
for (int i = 0; i < 4096; ++i) {
|
||||
if (szText[i] == 0) {
|
||||
for(int i = 0; i < 4096; ++i) {
|
||||
if(szText[i] == 0) {
|
||||
buffer[i] = '\0';
|
||||
break;
|
||||
}
|
||||
|
||||
if (szText[i] == '\n' || szText[i] == '\r') {
|
||||
if(szText[i] == '\n' || szText[i] == '\r') {
|
||||
buffer[i] = ' ';
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
buffer[i] = szText[i];
|
||||
}
|
||||
}
|
||||
|
||||
std::string line = buffer;
|
||||
_lines.push_back(line);
|
||||
if (RuleB(Analytics, CrashReporting)) {
|
||||
std::string crash_report = buffer;
|
||||
SendCrashReport(crash_report);
|
||||
}
|
||||
|
||||
Log(Logs::General, Logs::Crash, buffer);
|
||||
StackWalker::OnOutput(szText);
|
||||
}
|
||||
|
||||
const std::vector<std::string>& const GetLines() { return _lines; }
|
||||
private:
|
||||
std::vector<std::string> _lines;
|
||||
};
|
||||
|
||||
LONG WINAPI windows_exception_handler(EXCEPTION_POINTERS *ExceptionInfo)
|
||||
@@ -201,20 +197,7 @@ LONG WINAPI windows_exception_handler(EXCEPTION_POINTERS *ExceptionInfo)
|
||||
|
||||
if(EXCEPTION_STACK_OVERFLOW != ExceptionInfo->ExceptionRecord->ExceptionCode)
|
||||
{
|
||||
EQEmuStackWalker sw;
|
||||
sw.ShowCallstack(GetCurrentThread(), ExceptionInfo->ContextRecord);
|
||||
|
||||
if (RuleB(Analytics, CrashReporting)) {
|
||||
std::string crash_report;
|
||||
auto& lines = sw.GetLines();
|
||||
|
||||
for (auto& line : lines) {
|
||||
crash_report += line;
|
||||
crash_report += "\n";
|
||||
}
|
||||
|
||||
SendCrashReport(crash_report);
|
||||
}
|
||||
EQEmuStackWalker sw; sw.ShowCallstack(GetCurrentThread(), ExceptionInfo->ContextRecord);
|
||||
}
|
||||
|
||||
return EXCEPTION_EXECUTE_HANDLER;
|
||||
|
||||
@@ -476,11 +476,10 @@ bool Database::CheckDatabaseConversions() {
|
||||
CheckDatabaseConvertPPDeblob();
|
||||
CheckDatabaseConvertCorpseDeblob();
|
||||
|
||||
auto *r = RuleManager::Instance();
|
||||
r->LoadRules(this, "default", false);
|
||||
RuleManager::Instance()->LoadRules(this, "default", false);
|
||||
if (!RuleB(Bots, Enabled) && DoesTableExist("bot_data")) {
|
||||
LogInfo("Bot tables found but rule not enabled, enabling");
|
||||
r->SetRule("Bots:Enabled", "true", this, true, true);
|
||||
RuleManager::Instance()->SetRule("Bots:Enabled", "true", this, true, true);
|
||||
}
|
||||
|
||||
/* Run EQEmu Server script (Checks for database updates) */
|
||||
|
||||
@@ -79,8 +79,6 @@
|
||||
#define ANIM_DEATH 0x73
|
||||
#define ANIM_LOOT 0x69
|
||||
|
||||
constexpr int16 RECAST_TYPE_UNLINKED_ITEM = -1;
|
||||
|
||||
typedef enum {
|
||||
eaStanding = 0,
|
||||
eaSitting, //1
|
||||
@@ -1028,7 +1026,4 @@ enum ZoningMessage : int8
|
||||
ZoneNoExperience = -7
|
||||
};
|
||||
|
||||
#define ALT_CURRENCY_ID_RADIANT 4
|
||||
#define ALT_CURRENCY_ID_EBON 5
|
||||
|
||||
#endif /*COMMON_EQ_CONSTANTS_H*/
|
||||
|
||||
+11
-13
@@ -29,7 +29,7 @@
|
||||
#include "textures.h"
|
||||
|
||||
|
||||
static const uint32 BUFF_COUNT = 42;
|
||||
static const uint32 BUFF_COUNT = 25;
|
||||
static const uint32 PET_BUFF_COUNT = 30;
|
||||
static const uint32 MAX_MERC = 100;
|
||||
static const uint32 MAX_MERC_GRADES = 10;
|
||||
@@ -3632,19 +3632,17 @@ struct LevelAppearance_Struct { //Sends a little graphic on level up
|
||||
};
|
||||
|
||||
struct MerchantList {
|
||||
uint32 id;
|
||||
uint32 slot;
|
||||
uint32 item;
|
||||
int16 faction_required;
|
||||
int8 level_required;
|
||||
uint8 min_status;
|
||||
uint8 max_status;
|
||||
uint16 alt_currency_cost;
|
||||
uint32 classes_required;
|
||||
uint8 probability;
|
||||
uint32 id;
|
||||
uint32 slot;
|
||||
uint32 item;
|
||||
int16 faction_required;
|
||||
int8 level_required;
|
||||
uint16 alt_currency_cost;
|
||||
uint32 classes_required;
|
||||
uint8 probability;
|
||||
std::string bucket_name;
|
||||
std::string bucket_value;
|
||||
uint8 bucket_comparison;
|
||||
uint8 bucket_comparison;
|
||||
};
|
||||
|
||||
struct TempMerchantList {
|
||||
@@ -4547,7 +4545,7 @@ struct ItemVerifyReply_Struct {
|
||||
struct ItemRecastDelay_Struct {
|
||||
/*000*/ uint32 recast_delay; // in seconds
|
||||
/*004*/ uint32 recast_type;
|
||||
/*008*/ bool ignore_casting_requirement; //Ignores recast times allows items to be reset?
|
||||
/*008*/ uint32 unknown008;
|
||||
/*012*/
|
||||
};
|
||||
|
||||
|
||||
@@ -358,27 +358,15 @@ int8 EQ::ItemInstance::AvailableAugmentSlot(int32 augment_type) const
|
||||
return (i <= invaug::SOCKET_END) ? i : INVALID_INDEX;
|
||||
}
|
||||
|
||||
bool EQ::ItemInstance::IsAugmentSlotAvailable(int32 augment_type, uint8 slot) const
|
||||
bool EQ::ItemInstance::IsAugmentSlotAvailable(int32 augtype, uint8 slot) const
|
||||
{
|
||||
if (!m_item || !m_item->IsClassCommon()) {
|
||||
return false;
|
||||
}
|
||||
if (!m_item || !m_item->IsClassCommon())
|
||||
return false;
|
||||
|
||||
if (
|
||||
(
|
||||
!GetItem(slot) &&
|
||||
m_item->AugSlotVisible[slot]
|
||||
) &&
|
||||
augment_type == -1 ||
|
||||
(
|
||||
m_item->AugSlotType[slot] &&
|
||||
((1 << (m_item->AugSlotType[slot] - 1)) & augment_type)
|
||||
)
|
||||
) {
|
||||
if ((!GetItem(slot) && m_item->AugSlotVisible[slot]) && augtype == -1 || (m_item->AugSlotType[slot] && ((1 << (m_item->AugSlotType[slot] - 1)) & augtype))) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Retrieve item inside container
|
||||
|
||||
@@ -101,8 +101,8 @@ namespace EQ
|
||||
//
|
||||
bool IsAugmentable() const;
|
||||
bool AvailableWearSlot(uint32 aug_wear_slots) const;
|
||||
int8 AvailableAugmentSlot(int32 augment_type) const;
|
||||
bool IsAugmentSlotAvailable(int32 augment_type, uint8 slot) const;
|
||||
int8 AvailableAugmentSlot(int32 augtype) const;
|
||||
bool IsAugmentSlotAvailable(int32 augtype, uint8 slot) const;
|
||||
inline int32 GetAugmentType() const { return ((m_item) ? m_item->AugType : 0); }
|
||||
|
||||
inline bool IsExpendable() const { return ((m_item) ? ((m_item->Click.Type == item::ItemEffectExpendable) || (m_item->ItemType == item::ItemTypePotion)) : false); }
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
#include "../../strings.h"
|
||||
#include <ctime>
|
||||
|
||||
|
||||
class BaseMerchantlistRepository {
|
||||
public:
|
||||
struct Merchantlist {
|
||||
@@ -25,8 +24,6 @@ public:
|
||||
int32_t item;
|
||||
int16_t faction_required;
|
||||
uint8_t level_required;
|
||||
uint8_t min_status;
|
||||
uint8_t max_status;
|
||||
uint16_t alt_currency_cost;
|
||||
int32_t classes_required;
|
||||
int32_t probability;
|
||||
@@ -52,8 +49,6 @@ public:
|
||||
"item",
|
||||
"faction_required",
|
||||
"level_required",
|
||||
"min_status",
|
||||
"max_status",
|
||||
"alt_currency_cost",
|
||||
"classes_required",
|
||||
"probability",
|
||||
@@ -75,8 +70,6 @@ public:
|
||||
"item",
|
||||
"faction_required",
|
||||
"level_required",
|
||||
"min_status",
|
||||
"max_status",
|
||||
"alt_currency_cost",
|
||||
"classes_required",
|
||||
"probability",
|
||||
@@ -132,8 +125,6 @@ public:
|
||||
e.item = 0;
|
||||
e.faction_required = -100;
|
||||
e.level_required = 0;
|
||||
e.min_status = 0;
|
||||
e.max_status = 255;
|
||||
e.alt_currency_cost = 0;
|
||||
e.classes_required = 65535;
|
||||
e.probability = 100;
|
||||
@@ -169,9 +160,8 @@ public:
|
||||
{
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"{} WHERE {} = {} LIMIT 1",
|
||||
"{} WHERE id = {} LIMIT 1",
|
||||
BaseSelect(),
|
||||
PrimaryKey(),
|
||||
merchantlist_id
|
||||
)
|
||||
);
|
||||
@@ -185,18 +175,16 @@ public:
|
||||
e.item = static_cast<int32_t>(atoi(row[2]));
|
||||
e.faction_required = static_cast<int16_t>(atoi(row[3]));
|
||||
e.level_required = static_cast<uint8_t>(strtoul(row[4], nullptr, 10));
|
||||
e.min_status = static_cast<uint8_t>(strtoul(row[5], nullptr, 10));
|
||||
e.max_status = static_cast<uint8_t>(strtoul(row[6], nullptr, 10));
|
||||
e.alt_currency_cost = static_cast<uint16_t>(strtoul(row[7], nullptr, 10));
|
||||
e.classes_required = static_cast<int32_t>(atoi(row[8]));
|
||||
e.probability = static_cast<int32_t>(atoi(row[9]));
|
||||
e.bucket_name = row[10] ? row[10] : "";
|
||||
e.bucket_value = row[11] ? row[11] : "";
|
||||
e.bucket_comparison = static_cast<uint8_t>(strtoul(row[12], nullptr, 10));
|
||||
e.min_expansion = static_cast<int8_t>(atoi(row[13]));
|
||||
e.max_expansion = static_cast<int8_t>(atoi(row[14]));
|
||||
e.content_flags = row[15] ? row[15] : "";
|
||||
e.content_flags_disabled = row[16] ? row[16] : "";
|
||||
e.alt_currency_cost = static_cast<uint16_t>(strtoul(row[5], nullptr, 10));
|
||||
e.classes_required = static_cast<int32_t>(atoi(row[6]));
|
||||
e.probability = static_cast<int32_t>(atoi(row[7]));
|
||||
e.bucket_name = row[8] ? row[8] : "";
|
||||
e.bucket_value = row[9] ? row[9] : "";
|
||||
e.bucket_comparison = static_cast<uint8_t>(strtoul(row[10], nullptr, 10));
|
||||
e.min_expansion = static_cast<int8_t>(atoi(row[11]));
|
||||
e.max_expansion = static_cast<int8_t>(atoi(row[12]));
|
||||
e.content_flags = row[13] ? row[13] : "";
|
||||
e.content_flags_disabled = row[14] ? row[14] : "";
|
||||
|
||||
return e;
|
||||
}
|
||||
@@ -235,18 +223,16 @@ public:
|
||||
v.push_back(columns[2] + " = " + std::to_string(e.item));
|
||||
v.push_back(columns[3] + " = " + std::to_string(e.faction_required));
|
||||
v.push_back(columns[4] + " = " + std::to_string(e.level_required));
|
||||
v.push_back(columns[5] + " = " + std::to_string(e.min_status));
|
||||
v.push_back(columns[6] + " = " + std::to_string(e.max_status));
|
||||
v.push_back(columns[7] + " = " + std::to_string(e.alt_currency_cost));
|
||||
v.push_back(columns[8] + " = " + std::to_string(e.classes_required));
|
||||
v.push_back(columns[9] + " = " + std::to_string(e.probability));
|
||||
v.push_back(columns[10] + " = '" + Strings::Escape(e.bucket_name) + "'");
|
||||
v.push_back(columns[11] + " = '" + Strings::Escape(e.bucket_value) + "'");
|
||||
v.push_back(columns[12] + " = " + std::to_string(e.bucket_comparison));
|
||||
v.push_back(columns[13] + " = " + std::to_string(e.min_expansion));
|
||||
v.push_back(columns[14] + " = " + std::to_string(e.max_expansion));
|
||||
v.push_back(columns[15] + " = '" + Strings::Escape(e.content_flags) + "'");
|
||||
v.push_back(columns[16] + " = '" + Strings::Escape(e.content_flags_disabled) + "'");
|
||||
v.push_back(columns[5] + " = " + std::to_string(e.alt_currency_cost));
|
||||
v.push_back(columns[6] + " = " + std::to_string(e.classes_required));
|
||||
v.push_back(columns[7] + " = " + std::to_string(e.probability));
|
||||
v.push_back(columns[8] + " = '" + Strings::Escape(e.bucket_name) + "'");
|
||||
v.push_back(columns[9] + " = '" + Strings::Escape(e.bucket_value) + "'");
|
||||
v.push_back(columns[10] + " = " + std::to_string(e.bucket_comparison));
|
||||
v.push_back(columns[11] + " = " + std::to_string(e.min_expansion));
|
||||
v.push_back(columns[12] + " = " + std::to_string(e.max_expansion));
|
||||
v.push_back(columns[13] + " = '" + Strings::Escape(e.content_flags) + "'");
|
||||
v.push_back(columns[14] + " = '" + Strings::Escape(e.content_flags_disabled) + "'");
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
@@ -273,8 +259,6 @@ public:
|
||||
v.push_back(std::to_string(e.item));
|
||||
v.push_back(std::to_string(e.faction_required));
|
||||
v.push_back(std::to_string(e.level_required));
|
||||
v.push_back(std::to_string(e.min_status));
|
||||
v.push_back(std::to_string(e.max_status));
|
||||
v.push_back(std::to_string(e.alt_currency_cost));
|
||||
v.push_back(std::to_string(e.classes_required));
|
||||
v.push_back(std::to_string(e.probability));
|
||||
@@ -319,8 +303,6 @@ public:
|
||||
v.push_back(std::to_string(e.item));
|
||||
v.push_back(std::to_string(e.faction_required));
|
||||
v.push_back(std::to_string(e.level_required));
|
||||
v.push_back(std::to_string(e.min_status));
|
||||
v.push_back(std::to_string(e.max_status));
|
||||
v.push_back(std::to_string(e.alt_currency_cost));
|
||||
v.push_back(std::to_string(e.classes_required));
|
||||
v.push_back(std::to_string(e.probability));
|
||||
@@ -369,18 +351,16 @@ public:
|
||||
e.item = static_cast<int32_t>(atoi(row[2]));
|
||||
e.faction_required = static_cast<int16_t>(atoi(row[3]));
|
||||
e.level_required = static_cast<uint8_t>(strtoul(row[4], nullptr, 10));
|
||||
e.min_status = static_cast<uint8_t>(strtoul(row[5], nullptr, 10));
|
||||
e.max_status = static_cast<uint8_t>(strtoul(row[6], nullptr, 10));
|
||||
e.alt_currency_cost = static_cast<uint16_t>(strtoul(row[7], nullptr, 10));
|
||||
e.classes_required = static_cast<int32_t>(atoi(row[8]));
|
||||
e.probability = static_cast<int32_t>(atoi(row[9]));
|
||||
e.bucket_name = row[10] ? row[10] : "";
|
||||
e.bucket_value = row[11] ? row[11] : "";
|
||||
e.bucket_comparison = static_cast<uint8_t>(strtoul(row[12], nullptr, 10));
|
||||
e.min_expansion = static_cast<int8_t>(atoi(row[13]));
|
||||
e.max_expansion = static_cast<int8_t>(atoi(row[14]));
|
||||
e.content_flags = row[15] ? row[15] : "";
|
||||
e.content_flags_disabled = row[16] ? row[16] : "";
|
||||
e.alt_currency_cost = static_cast<uint16_t>(strtoul(row[5], nullptr, 10));
|
||||
e.classes_required = static_cast<int32_t>(atoi(row[6]));
|
||||
e.probability = static_cast<int32_t>(atoi(row[7]));
|
||||
e.bucket_name = row[8] ? row[8] : "";
|
||||
e.bucket_value = row[9] ? row[9] : "";
|
||||
e.bucket_comparison = static_cast<uint8_t>(strtoul(row[10], nullptr, 10));
|
||||
e.min_expansion = static_cast<int8_t>(atoi(row[11]));
|
||||
e.max_expansion = static_cast<int8_t>(atoi(row[12]));
|
||||
e.content_flags = row[13] ? row[13] : "";
|
||||
e.content_flags_disabled = row[14] ? row[14] : "";
|
||||
|
||||
all_entries.push_back(e);
|
||||
}
|
||||
@@ -410,18 +390,16 @@ public:
|
||||
e.item = static_cast<int32_t>(atoi(row[2]));
|
||||
e.faction_required = static_cast<int16_t>(atoi(row[3]));
|
||||
e.level_required = static_cast<uint8_t>(strtoul(row[4], nullptr, 10));
|
||||
e.min_status = static_cast<uint8_t>(strtoul(row[5], nullptr, 10));
|
||||
e.max_status = static_cast<uint8_t>(strtoul(row[6], nullptr, 10));
|
||||
e.alt_currency_cost = static_cast<uint16_t>(strtoul(row[7], nullptr, 10));
|
||||
e.classes_required = static_cast<int32_t>(atoi(row[8]));
|
||||
e.probability = static_cast<int32_t>(atoi(row[9]));
|
||||
e.bucket_name = row[10] ? row[10] : "";
|
||||
e.bucket_value = row[11] ? row[11] : "";
|
||||
e.bucket_comparison = static_cast<uint8_t>(strtoul(row[12], nullptr, 10));
|
||||
e.min_expansion = static_cast<int8_t>(atoi(row[13]));
|
||||
e.max_expansion = static_cast<int8_t>(atoi(row[14]));
|
||||
e.content_flags = row[15] ? row[15] : "";
|
||||
e.content_flags_disabled = row[16] ? row[16] : "";
|
||||
e.alt_currency_cost = static_cast<uint16_t>(strtoul(row[5], nullptr, 10));
|
||||
e.classes_required = static_cast<int32_t>(atoi(row[6]));
|
||||
e.probability = static_cast<int32_t>(atoi(row[7]));
|
||||
e.bucket_name = row[8] ? row[8] : "";
|
||||
e.bucket_value = row[9] ? row[9] : "";
|
||||
e.bucket_comparison = static_cast<uint8_t>(strtoul(row[10], nullptr, 10));
|
||||
e.min_expansion = static_cast<int8_t>(atoi(row[11]));
|
||||
e.max_expansion = static_cast<int8_t>(atoi(row[12]));
|
||||
e.content_flags = row[13] ? row[13] : "";
|
||||
e.content_flags_disabled = row[14] ? row[14] : "";
|
||||
|
||||
all_entries.push_back(e);
|
||||
}
|
||||
|
||||
+1
-10
@@ -385,16 +385,7 @@ void RuleManager::_SaveRule(Database *db, RuleType type, uint16 index) {
|
||||
e.rule_value = rule_value;
|
||||
e.notes = rule_notes;
|
||||
|
||||
db->QueryDatabase(
|
||||
fmt::format(
|
||||
"UPDATE rule_values SET rule_value = '{}', notes = '{}' WHERE ruleset_id = {} AND rule_name = '{}'",
|
||||
rule_value,
|
||||
Strings::Escape(rule_notes),
|
||||
e.ruleset_id,
|
||||
e.rule_name
|
||||
)
|
||||
);
|
||||
|
||||
RuleValuesRepository::UpdateOne(*db, e);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -200,7 +200,6 @@ RULE_INT(Character, ExperiencePercentCapPerKill, -1, "Caps the percentage of exp
|
||||
RULE_BOOL(Character, EnableGroupEXPModifier, true, "Enable or disable the group experience modifier based on number of players in group, default is true")
|
||||
RULE_REAL(Character, GroupMemberEXPModifier, 0.2, "Sets the group experience modifier per members between 2 and 5, default is 0.2")
|
||||
RULE_REAL(Character, FullGroupEXPModifier, 2.16, "Sets the group experience modifier for a full group, default is 2.16")
|
||||
RULE_BOOL(Character, IgnoreLevelBasedHasteCaps, false, "Ignores hard coded level based haste caps.")
|
||||
RULE_CATEGORY_END()
|
||||
|
||||
RULE_CATEGORY(Mercs)
|
||||
@@ -318,7 +317,6 @@ RULE_BOOL(Map, FixPathingZOnSendTo, false, "Try to repair Z coordinates in the S
|
||||
RULE_BOOL(Map, FixZWhenPathing, true, "Automatically fix NPC Z coordinates when moving/pathing/engaged (Far less CPU intensive than its predecessor)")
|
||||
RULE_REAL(Map, DistanceCanTravelBeforeAdjustment, 10.0, "Distance a mob can path before FixZ is called, depends on FixZWhenPathing")
|
||||
RULE_BOOL(Map, MobZVisualDebug, false, "Displays spell effects determining whether or not NPC is hitting Best Z calcs (blue for hit, red for miss)")
|
||||
RULE_BOOL(Map, MobPathingVisualDebug, false, "Displays nodes in pathing points in realtime to help with visual debugging")
|
||||
RULE_REAL(Map, FixPathingZMaxDeltaSendTo, 20, "At runtime in SendTo: maximum change in Z to allow the BestZ code to apply")
|
||||
RULE_INT(Map, FindBestZHeightAdjust, 1, "Adds this to the current Z before seeking the best Z position")
|
||||
RULE_CATEGORY_END()
|
||||
@@ -585,7 +583,6 @@ RULE_INT(Range, SongMessages, 75, "The packet range in which song messages are s
|
||||
RULE_INT(Range, ClientPositionUpdates, 300, "Distance in which the own changed position is communicated to other clients")
|
||||
RULE_INT(Range, CriticalDamage, 80, "The packet range in which critical hit messages are sent")
|
||||
RULE_INT(Range, MobCloseScanDistance, 600, "Close scan distance")
|
||||
RULE_INT(Range, MaxDistanceToClickDoors, 100, "Max distance that a client can click a door from (Client says 'You can't reach that' at roughly 25-50 for most doors)")
|
||||
RULE_CATEGORY_END()
|
||||
|
||||
RULE_CATEGORY(Bots)
|
||||
@@ -626,7 +623,6 @@ RULE_BOOL(Chat, EnableVoiceMacros, true, "Enable voice macros")
|
||||
RULE_BOOL(Chat, EnableMailKeyIPVerification, true, "Setting whether the authenticity of the client should be verified via its IP address when accessing the InGame mailbox")
|
||||
RULE_BOOL(Chat, EnableAntiSpam, true, "Enable anti-spam system for chat")
|
||||
RULE_BOOL(Chat, SuppressCommandErrors, false, "Do not suppress command errors by default")
|
||||
RULE_BOOL(Chat, ChannelsIgnoreNameFilter, false, "Ignore name filtering when creating new chat channels")
|
||||
RULE_INT(Chat, MaxPermanentPlayerChannels, 0, "Maximum number of permanent chat channels a player can make. Default 0.")
|
||||
RULE_INT(Chat, MinStatusToBypassAntiSpam, 100, "Minimum status to bypass the anti-spam system")
|
||||
RULE_INT(Chat, MinimumMessagesPerInterval, 4, "Minimum number of chat messages allowed per interval. The karma value is added to this value")
|
||||
@@ -748,7 +744,6 @@ RULE_BOOL(Inventory, DeleteTransformationMold, true, "False if you want mold to
|
||||
RULE_BOOL(Inventory, AllowAnyWeaponTransformation, false, "Weapons can use any weapon transformation")
|
||||
RULE_BOOL(Inventory, TransformSummonedBags, false, "Transforms summoned bags into disenchanted ones instead of deleting")
|
||||
RULE_BOOL(Inventory, AllowMultipleOfSameAugment, false, "Allows multiple of the same augment to be placed in an item via #augmentitem or MQ2, set to true to allow")
|
||||
RULE_INT(Inventory, AlternateAugmentationSealer, 53, "Allows RoF+ clients to augment items from a special container type")
|
||||
RULE_CATEGORY_END()
|
||||
|
||||
RULE_CATEGORY(Client)
|
||||
|
||||
@@ -143,10 +143,6 @@ bool ServerEventScheduler::ValidateDatabaseConnection()
|
||||
// this helps inform decisions to tell all zones to reload their events
|
||||
bool ServerEventScheduler::CheckIfEventsChanged()
|
||||
{
|
||||
if (!m_database) {
|
||||
return false;
|
||||
}
|
||||
|
||||
auto events = ServerScheduledEventsRepository::GetWhere(*m_database, "deleted_at is null");
|
||||
|
||||
// first check if the size changed, if it did this is the easiest step
|
||||
|
||||
+2
-6
@@ -721,14 +721,10 @@ bool SharedDatabase::GetInventory(uint32 char_id, EQ::InventoryProfile *inv)
|
||||
inst->SetCharges(charges);
|
||||
|
||||
if (item->RecastDelay) {
|
||||
if (item->RecastType != RECAST_TYPE_UNLINKED_ITEM && timestamps.count(item->RecastType)) {
|
||||
if (timestamps.count(item->RecastType))
|
||||
inst->SetRecastTimestamp(timestamps.at(item->RecastType));
|
||||
} else if (item->RecastType == RECAST_TYPE_UNLINKED_ITEM && timestamps.count(item->ID)) {
|
||||
inst->SetRecastTimestamp(timestamps.at(item->ID));
|
||||
}
|
||||
else {
|
||||
else
|
||||
inst->SetRecastTimestamp(0);
|
||||
}
|
||||
}
|
||||
|
||||
if (item->IsClassCommon()) {
|
||||
|
||||
@@ -763,23 +763,3 @@ std::string Strings::Random(size_t length)
|
||||
std::generate_n(str.begin(), length, randchar);
|
||||
return str;
|
||||
}
|
||||
|
||||
// a wrapper for stoi which will return a fallback if the string
|
||||
// fails to cast to a number
|
||||
int Strings::ToInt(const std::string &s, int fallback)
|
||||
{
|
||||
return Strings::IsNumber(s) ? std::stoi(s) : fallback;
|
||||
}
|
||||
|
||||
std::string Strings::RemoveNumbers(std::string s)
|
||||
{
|
||||
int current = 0;
|
||||
for (int i = 0; i < s.length(); i++) {
|
||||
if (!isdigit(s[i])) {
|
||||
s[current] = s[i];
|
||||
current++;
|
||||
}
|
||||
}
|
||||
|
||||
return s.substr(0, current);
|
||||
}
|
||||
|
||||
@@ -86,9 +86,7 @@ class Strings {
|
||||
public:
|
||||
static bool Contains(std::vector<std::string> container, std::string element);
|
||||
static bool Contains(const std::string& subject, const std::string& search);
|
||||
static int ToInt(const std::string &s, int fallback = 0);
|
||||
static bool IsNumber(const std::string &s);
|
||||
static std::string RemoveNumbers(std::string s);
|
||||
static bool IsFloat(const std::string &s);
|
||||
static const std::string ToLower(std::string s);
|
||||
static const std::string ToUpper(std::string s);
|
||||
|
||||
+2
-2
@@ -25,7 +25,7 @@
|
||||
|
||||
// Build variables
|
||||
// these get injected during the build pipeline
|
||||
#define CURRENT_VERSION "22.3.0-dev" // always append -dev to the current version for custom-builds
|
||||
#define CURRENT_VERSION "22.1.0-dev" // always append -dev to the current version for custom-builds
|
||||
#define LOGIN_VERSION "0.8.0"
|
||||
#define COMPILE_DATE __DATE__
|
||||
#define COMPILE_TIME __TIME__
|
||||
@@ -42,7 +42,7 @@
|
||||
* Manifest: https://github.com/EQEmu/Server/blob/master/utils/sql/db_update_manifest.txt
|
||||
*/
|
||||
|
||||
#define CURRENT_BINARY_DATABASE_VERSION 9219
|
||||
#define CURRENT_BINARY_DATABASE_VERSION 9217
|
||||
#define CURRENT_BINARY_BOTS_DATABASE_VERSION 9037
|
||||
|
||||
#endif
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "eqemu-server",
|
||||
"version": "22.3.0",
|
||||
"version": "22.1.0",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/EQEmu/Server.git"
|
||||
|
||||
+1
-1
@@ -78,7 +78,7 @@ ChatChannel *ChatChannelList::CreateChannel(
|
||||
{
|
||||
uint8 max_perm_player_channels = RuleI(Chat, MaxPermanentPlayerChannels);
|
||||
|
||||
if (!RuleB(Chat, ChannelsIgnoreNameFilter) && !database.CheckChannelNameFilter(name)) {
|
||||
if (!database.CheckChannelNameFilter(name)) {
|
||||
if (!(owner == SYSTEM_OWNER)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
+2
-4
@@ -224,10 +224,8 @@ bool UCSDatabase::GetVariable(const char *varname, char *varvalue, uint16 varval
|
||||
|
||||
|
||||
bool UCSDatabase::LoadChatChannels()
|
||||
{
|
||||
if (!RuleB(Chat, ChannelsIgnoreNameFilter)) {
|
||||
LoadFilteredNamesFromDB();
|
||||
}
|
||||
{
|
||||
LoadFilteredNamesFromDB();
|
||||
LoadReservedNamesFromDB();
|
||||
LogInfo("Loading chat channels from the database");
|
||||
|
||||
|
||||
@@ -27,5 +27,5 @@ zip -j eqemu-server-linux-x64.zip ./build/bin/*
|
||||
ls -lsh | grep zip
|
||||
sudo apt-get update && sudo apt-get install -y rclone
|
||||
rclone config create remote ftp env_auth true > /dev/null
|
||||
rclone copy eqemu-server-linux-x64.zip remote: 2>&1
|
||||
rclone ls remote: 2>&1
|
||||
rclone copy eqemu-server-linux-x64.zip remote:
|
||||
rclone ls remote:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
module should-release
|
||||
|
||||
go 1.18
|
||||
go 1.19
|
||||
|
||||
require (
|
||||
github.com/google/go-github/v41 v41.0.0
|
||||
|
||||
@@ -10,7 +10,6 @@ import (
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
)
|
||||
@@ -60,29 +59,6 @@ func main() {
|
||||
}
|
||||
}
|
||||
|
||||
out, err := exec.Command("git", "rev-parse", "--abbrev-ref", "HEAD").Output()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
currentBranch := strings.TrimSpace(string(out))
|
||||
if currentBranch != "master" {
|
||||
fmt.Printf("Not on master, no need to release\n")
|
||||
fmt.Printf("Exiting code 78 to halt pipeline steps gracefully\n")
|
||||
os.Exit(78)
|
||||
}
|
||||
|
||||
if len(os.Getenv("RCLONE_FTP_PASS")) == 0 {
|
||||
fmt.Printf("Missing RCLONE_FTP_PASS no need to deploy\n")
|
||||
fmt.Printf("Exiting code 78 to halt pipeline steps gracefully\n")
|
||||
os.Exit(78)
|
||||
}
|
||||
|
||||
if len(os.Getenv("GH_RELEASE_GITHUB_API_TOKEN")) == 0 {
|
||||
fmt.Printf("Missing GH_RELEASE_GITHUB_API_TOKEN no need to deploy\n")
|
||||
fmt.Printf("Exiting code 78 to halt pipeline steps gracefully\n")
|
||||
os.Exit(78)
|
||||
}
|
||||
|
||||
if len(packageJsonFile) == 0 {
|
||||
fmt.Printf("Could not find package.json\n")
|
||||
os.Exit(1)
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -30,6 +30,7 @@ try
|
||||
del $cwd\win-build-x64\bin\RelWithDebInfo\queryserv.pdb
|
||||
del $cwd\win-build-x64\bin\RelWithDebInfo\eqlaunch.pdb
|
||||
del $cwd\win-build-x64\bin\RelWithDebInfo\cppunit.pdb
|
||||
# del $cwd\win-build-x64\bin\RelWithDebInfo\zlib-ng.pdb
|
||||
del $cwd\win-build-x64\bin\RelWithDebInfo\tests.pdb
|
||||
del $cwd\win-build-x64\bin\RelWithDebInfo\tests.exe
|
||||
|
||||
@@ -37,8 +38,8 @@ try
|
||||
|
||||
dir *.zip
|
||||
rclone config create remote ftp env_auth true
|
||||
rclone copy eqemu-server-windows-x64.zip remote: 2>&1
|
||||
rclone ls remote: 2>&1
|
||||
rclone copy eqemu-server-windows-x64.zip remote:
|
||||
rclone ls remote:
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
@@ -1199,25 +1199,6 @@ sub get_mysql_path
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($path eq "") {
|
||||
my @files;
|
||||
my $start_dir = trim(`echo %programfiles%`);
|
||||
find(
|
||||
sub {
|
||||
if ($#files > 0) {
|
||||
return;
|
||||
}
|
||||
push @files, $File::Find::name unless $File::Find::name!~/mysql.exe/i;
|
||||
},
|
||||
$start_dir
|
||||
);
|
||||
for my $file (@files) {
|
||||
if ($file=~/mysql.exe/i) {
|
||||
$path = $file;
|
||||
last;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($OS eq "Linux") {
|
||||
$path = `which mysql`;
|
||||
|
||||
@@ -471,8 +471,6 @@
|
||||
9215|2023_01_08_zone_max_level.sql|SHOW COLUMNS FROM `zone` LIKE 'max_level'|empty|
|
||||
9216|2023_01_15_merc_data.sql|SHOW TABLES LIKE 'mercs'|empty|
|
||||
9217|2023_01_15_chatchannel_reserved_names.sql|SHOW TABLES LIKE 'chatchannel_reserved_names'|empty|
|
||||
9218|2023_01_24_item_recast.sql|show columns from character_item_recast like '%recast_type%'|contains|smallint
|
||||
9219|2023_01_29_merchant_status_requirements.sql|SHOW COLUMNS FROM merchantlist LIKE 'min_status'|empty|
|
||||
|
||||
# Upgrade conditions:
|
||||
# This won't be needed after this system is implemented, but it is used database that are not
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
ALTER TABLE `character_item_recast`
|
||||
CHANGE COLUMN `recast_type` `recast_type` INT(11) UNSIGNED NOT NULL DEFAULT 0 AFTER `id`;
|
||||
@@ -1,3 +0,0 @@
|
||||
ALTER TABLE `merchantlist`
|
||||
ADD COLUMN `min_status` tinyint(3) UNSIGNED NOT NULL DEFAULT 0 AFTER `level_required`,
|
||||
ADD COLUMN `max_status` tinyint(3) UNSIGNED NOT NULL DEFAULT 255 AFTER `min_status`;
|
||||
@@ -1,6 +1,5 @@
|
||||
#include "../../common/version.h"
|
||||
#include "../../common/json/json.h"
|
||||
#include "../../common/rulesys.h"
|
||||
|
||||
void WorldserverCLI::DatabaseVersion(int argc, char **argv, argh::parser &cmd, std::string &description)
|
||||
{
|
||||
@@ -10,13 +9,13 @@ void WorldserverCLI::DatabaseVersion(int argc, char **argv, argh::parser &cmd, s
|
||||
return;
|
||||
}
|
||||
|
||||
Json::Value v;
|
||||
Json::Value database_version;
|
||||
|
||||
v["database_version"] = CURRENT_BINARY_DATABASE_VERSION;
|
||||
v["bots_database_version"] = RuleB(Bots, Enabled) ? CURRENT_BINARY_BOTS_DATABASE_VERSION : 0;
|
||||
database_version["database_version"] = CURRENT_BINARY_DATABASE_VERSION;
|
||||
database_version["bots_database_version"] = CURRENT_BINARY_BOTS_DATABASE_VERSION;
|
||||
|
||||
std::stringstream payload;
|
||||
payload << v;
|
||||
payload << database_version;
|
||||
|
||||
std::cout << payload.str() << std::endl;
|
||||
}
|
||||
|
||||
+6
-33
@@ -1778,39 +1778,12 @@ bool Client::OPCharCreate(char *name, CharCreate_Struct *cc)
|
||||
pp.binds[0].heading = pp.heading;
|
||||
}
|
||||
|
||||
if (GetZone(pp.zone_id)) {
|
||||
LogInfo(
|
||||
"Current location [{}] [{}] [{:.2f}] [{:.2f}] [{:.2f}] [{:.2f}]",
|
||||
ZoneName(pp.zone_id),
|
||||
pp.zone_id,
|
||||
pp.x,
|
||||
pp.y,
|
||||
pp.z,
|
||||
pp.heading
|
||||
);
|
||||
}
|
||||
|
||||
if (GetZone(pp.binds[0].zone_id)) {
|
||||
LogInfo(
|
||||
"Bind location [{}] [{}] [{:.2f}] [{:.2f}] [{:.2f}]",
|
||||
ZoneName(pp.binds[0].zone_id),
|
||||
pp.binds[0].zone_id,
|
||||
pp.binds[0].x,
|
||||
pp.binds[0].y,
|
||||
pp.binds[0].z
|
||||
);
|
||||
}
|
||||
|
||||
if (GetZone(pp.binds[4].zone_id)) {
|
||||
LogInfo(
|
||||
"Home location [{}] [{}] [{:.2f}] [{:.2f}] [{:.2f}]",
|
||||
ZoneName(pp.binds[4].zone_id),
|
||||
pp.binds[4].zone_id,
|
||||
pp.binds[4].x,
|
||||
pp.binds[4].y,
|
||||
pp.binds[4].z
|
||||
);
|
||||
}
|
||||
LogInfo("Current location [{}] [{}] [{}] [{}] [{}] [{}]",
|
||||
ZoneName(pp.zone_id), pp.zone_id, pp.x, pp.y, pp.z, pp.heading);
|
||||
LogInfo("Bind location [{}] [{}] [{}] [{}] [{}]",
|
||||
ZoneName(pp.binds[0].zone_id), pp.binds[0].zone_id, pp.binds[0].x, pp.binds[0].y, pp.binds[0].z);
|
||||
LogInfo("Home location [{}] [{}] [{}] [{}] [{}]",
|
||||
ZoneName(pp.binds[4].zone_id), pp.binds[4].zone_id, pp.binds[4].x, pp.binds[4].y, pp.binds[4].z);
|
||||
|
||||
/* Starting Items inventory */
|
||||
content_db.SetStartingItems(&pp, &inv, pp.race, pp.class_, pp.deity, pp.zone_id, pp.name, GetAdmin());
|
||||
|
||||
@@ -290,16 +290,16 @@ bool WorldBoot::DatabaseLoadRoutines(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
// logging system init
|
||||
auto logging = LogSys.SetDatabase(&database)
|
||||
->SetLogPath(path.GetLogPath())
|
||||
->LoadLogDatabaseSettings();
|
||||
|
||||
if (!ignore_db) {
|
||||
LogInfo("Checking Database Conversions");
|
||||
database.CheckDatabaseConversions();
|
||||
}
|
||||
|
||||
// logging system init
|
||||
auto logging = LogSys.SetDatabase(&database)
|
||||
->SetLogPath(path.GetLogPath())
|
||||
->LoadLogDatabaseSettings();
|
||||
|
||||
if (RuleB(Logging, WorldGMSayLogging)) {
|
||||
logging->SetGMSayHandler(&WorldBoot::GMSayHookCallBackProcessWorld);
|
||||
}
|
||||
|
||||
+16
-108
@@ -871,16 +871,16 @@ int Mob::ACSum(bool skip_caps)
|
||||
int ac = 0; // this should be base AC whenever shrouds come around
|
||||
ac += itembonuses.AC; // items + food + tribute
|
||||
int shield_ac = 0;
|
||||
if (HasShieldEquiped() && (IsClient() || IsBot())) {
|
||||
auto inst = (IsClient()) ? GetInv().GetItem(EQ::invslot::slotSecondary) : CastToBot()->GetBotItem(EQ::invslot::slotSecondary);
|
||||
if (HasShieldEquiped() && IsClient()) {
|
||||
auto client = CastToClient();
|
||||
auto inst = client->GetInv().GetItem(EQ::invslot::slotSecondary);
|
||||
if (inst) {
|
||||
if (inst->GetItemRecommendedLevel(true) <= GetLevel()) {
|
||||
if (inst->GetItemRecommendedLevel(true) <= GetLevel())
|
||||
shield_ac = inst->GetItemArmorClass(true);
|
||||
} else {
|
||||
shield_ac = CalcRecommendedLevelBonus(GetLevel(), inst->GetItemRecommendedLevel(true), inst->GetItemArmorClass(true));
|
||||
}
|
||||
else
|
||||
shield_ac = client->CalcRecommendedLevelBonus(GetLevel(), inst->GetItemRecommendedLevel(true), inst->GetItemArmorClass(true));
|
||||
}
|
||||
shield_ac += GetHeroicSTR() / 10;
|
||||
shield_ac += client->GetHeroicSTR() / 10;
|
||||
}
|
||||
// EQ math
|
||||
ac = (ac * 4) / 3;
|
||||
@@ -2770,7 +2770,7 @@ bool NPC::Death(Mob* killer_mob, int64 damage, uint16 spell, EQ::skills::SkillTy
|
||||
}
|
||||
}
|
||||
|
||||
if (killer_mob && killer_mob->IsBot()) {
|
||||
if (killer_mob->IsBot()) {
|
||||
parse->EventBot(EVENT_NPC_SLAY, killer_mob->CastToBot(), this, "", 0);
|
||||
killer_mob->TrySpellOnKill(killed_level, spell);
|
||||
}
|
||||
@@ -3820,98 +3820,6 @@ void Mob::CommonDamage(Mob* attacker, int64 &damage, const uint16 spell_id, cons
|
||||
//final damage has been determined.
|
||||
SetHP(int64(GetHP() - damage));
|
||||
|
||||
const auto has_bot_given_event = parse->BotHasQuestSub(EVENT_DAMAGE_GIVEN);
|
||||
|
||||
const auto has_bot_taken_event = parse->BotHasQuestSub(EVENT_DAMAGE_TAKEN);
|
||||
|
||||
const auto has_npc_given_event = (
|
||||
(
|
||||
IsNPC() &&
|
||||
parse->HasQuestSub(CastToNPC()->GetNPCTypeID(), EVENT_DAMAGE_GIVEN)
|
||||
) ||
|
||||
(
|
||||
attacker->IsNPC() &&
|
||||
parse->HasQuestSub(attacker->CastToNPC()->GetNPCTypeID(), EVENT_DAMAGE_GIVEN)
|
||||
)
|
||||
);
|
||||
|
||||
const auto has_npc_taken_event = (
|
||||
(
|
||||
IsNPC() &&
|
||||
parse->HasQuestSub(CastToNPC()->GetNPCTypeID(), EVENT_DAMAGE_TAKEN)
|
||||
) ||
|
||||
(
|
||||
attacker->IsNPC() &&
|
||||
parse->HasQuestSub(attacker->CastToNPC()->GetNPCTypeID(), EVENT_DAMAGE_TAKEN)
|
||||
)
|
||||
);
|
||||
|
||||
const auto has_player_given_event = parse->PlayerHasQuestSub(EVENT_DAMAGE_GIVEN);
|
||||
|
||||
const auto has_player_taken_event = parse->PlayerHasQuestSub(EVENT_DAMAGE_TAKEN);
|
||||
|
||||
const auto has_given_event = (
|
||||
has_bot_given_event ||
|
||||
has_npc_given_event ||
|
||||
has_player_given_event
|
||||
);
|
||||
|
||||
const auto has_taken_event = (
|
||||
has_bot_taken_event ||
|
||||
has_npc_taken_event ||
|
||||
has_player_taken_event
|
||||
);
|
||||
|
||||
std::vector<std::any> args;
|
||||
|
||||
if (has_taken_event) {
|
||||
const auto export_string = fmt::format(
|
||||
"{} {} {} {} {} {} {} {} {}",
|
||||
attacker ? attacker->GetID() : 0,
|
||||
damage,
|
||||
spell_id,
|
||||
static_cast<int>(skill_used),
|
||||
FromDamageShield ? 1 : 0,
|
||||
avoidable ? 1 : 0,
|
||||
buffslot,
|
||||
iBuffTic ? 1 : 0,
|
||||
static_cast<int>(special)
|
||||
);
|
||||
|
||||
if (IsBot() && has_bot_taken_event) {
|
||||
parse->EventBot(EVENT_DAMAGE_TAKEN, CastToBot(), attacker ? attacker : nullptr, export_string, 0);
|
||||
} else if (IsClient() && has_player_taken_event) {
|
||||
args.push_back(attacker ? attacker : nullptr);
|
||||
parse->EventPlayer(EVENT_DAMAGE_TAKEN, CastToClient(), export_string, 0, &args);
|
||||
} else if (IsNPC() && has_npc_taken_event) {
|
||||
parse->EventNPC(EVENT_DAMAGE_TAKEN, CastToNPC(), attacker ? attacker : nullptr, export_string, 0);
|
||||
}
|
||||
}
|
||||
|
||||
if (has_given_event && attacker) {
|
||||
const auto export_string = fmt::format(
|
||||
"{} {} {} {} {} {} {} {} {}",
|
||||
GetID(),
|
||||
damage,
|
||||
spell_id,
|
||||
static_cast<int>(skill_used),
|
||||
FromDamageShield ? 1 : 0,
|
||||
avoidable ? 1 : 0,
|
||||
buffslot,
|
||||
iBuffTic ? 1 : 0,
|
||||
static_cast<int>(special)
|
||||
);
|
||||
|
||||
if (attacker->IsBot() && has_bot_given_event) {
|
||||
parse->EventBot(EVENT_DAMAGE_GIVEN, attacker->CastToBot(), this, export_string, 0);
|
||||
} else if (attacker->IsClient() && has_player_given_event) {
|
||||
args.push_back(this);
|
||||
parse->EventPlayer(EVENT_DAMAGE_GIVEN, attacker->CastToClient(), export_string, 0, &args);
|
||||
} else if (attacker->IsNPC() && has_npc_given_event) {
|
||||
parse->EventNPC(EVENT_DAMAGE_GIVEN, attacker->CastToNPC(), this, export_string, 0);
|
||||
}
|
||||
}
|
||||
|
||||
if (HasDied()) {
|
||||
bool IsSaved = false;
|
||||
|
||||
@@ -5793,16 +5701,16 @@ void Mob::CommonOutgoingHitSuccess(Mob* defender, DamageHitInfo &hit, ExtraAttac
|
||||
TryCriticalHit(defender, hit, opts);
|
||||
|
||||
hit.damage_done += hit.min_damage;
|
||||
if (IsClient() || IsBot()) {
|
||||
if (IsClient()) {
|
||||
int extra = 0;
|
||||
switch (hit.skill) {
|
||||
case EQ::skills::SkillThrowing:
|
||||
case EQ::skills::SkillArchery:
|
||||
extra = GetHeroicDEX() / 10;
|
||||
break;
|
||||
default:
|
||||
extra = GetHeroicSTR() / 10;
|
||||
break;
|
||||
case EQ::skills::SkillThrowing:
|
||||
case EQ::skills::SkillArchery:
|
||||
extra = CastToClient()->GetHeroicDEX() / 10;
|
||||
break;
|
||||
default:
|
||||
extra = CastToClient()->GetHeroicSTR() / 10;
|
||||
break;
|
||||
}
|
||||
hit.damage_done += extra;
|
||||
}
|
||||
|
||||
+1
-1
@@ -128,7 +128,7 @@ void Client::CalcBonuses()
|
||||
consume_food_timer.SetTimer(timer);
|
||||
}
|
||||
|
||||
int Mob::CalcRecommendedLevelBonus(uint8 level, uint8 reclevel, int basestat)
|
||||
int Client::CalcRecommendedLevelBonus(uint8 level, uint8 reclevel, int basestat)
|
||||
{
|
||||
if( (reclevel > 0) && (level < reclevel) )
|
||||
{
|
||||
|
||||
@@ -5074,13 +5074,6 @@ void Bot::PerformTradeWithClient(int16 begin_slot_id, int16 end_slot_id, Client*
|
||||
|
||||
BotRemoveEquipItem(return_iterator.from_bot_slot);
|
||||
|
||||
const auto export_string = fmt::format(
|
||||
"{} {}",
|
||||
return_iterator.return_item_instance->IsStackable() ? return_iterator.return_item_instance->GetCharges() : 1,
|
||||
return_iterator.from_bot_slot
|
||||
);
|
||||
|
||||
parse->EventBot(EVENT_UNEQUIP_ITEM_BOT, this, nullptr, export_string , return_iterator.return_item_instance->GetID());
|
||||
if (return_instance) {
|
||||
EQ::SayLinkEngine linker;
|
||||
linker.SetLinkType(EQ::saylink::SayLinkItemInst);
|
||||
@@ -5129,15 +5122,6 @@ void Bot::PerformTradeWithClient(int16 begin_slot_id, int16 end_slot_id, Client*
|
||||
|
||||
m_inv.PutItem(trade_iterator.to_bot_slot, *trade_iterator.trade_item_instance);
|
||||
BotAddEquipItem(trade_iterator.to_bot_slot, (trade_iterator.trade_item_instance ? trade_iterator.trade_item_instance->GetID() : 0));
|
||||
|
||||
const auto export_string = fmt::format(
|
||||
"{} {}",
|
||||
trade_iterator.trade_item_instance->IsStackable() ? trade_iterator.trade_item_instance->GetCharges() : 1,
|
||||
trade_iterator.to_bot_slot
|
||||
);
|
||||
|
||||
parse->EventBot(EVENT_EQUIP_ITEM_BOT, this, nullptr, export_string , trade_iterator.trade_item_instance->GetID());
|
||||
|
||||
trade_iterator.trade_item_instance = nullptr; // actual deletion occurs in client delete below
|
||||
|
||||
client->DeleteItemInInventory(trade_iterator.from_client_slot, 0, (trade_iterator.from_client_slot == EQ::invslot::slotCursor));
|
||||
|
||||
@@ -376,11 +376,6 @@ public:
|
||||
bool IsFromSpell = false, ExtraAttackOptions *opts = nullptr) override
|
||||
{ return Mob::Attack(other, Hand, FromRiposte, IsStrikethrough, IsFromSpell, opts); }
|
||||
|
||||
[[nodiscard]] int GetMaxBuffSlots() const override { return EQ::spells::LONG_BUFFS; }
|
||||
[[nodiscard]] int GetMaxSongSlots() const override { return EQ::spells::SHORT_BUFFS; }
|
||||
[[nodiscard]] int GetMaxDiscSlots() const override { return EQ::spells::DISC_BUFFS; }
|
||||
[[nodiscard]] int GetMaxTotalSlots() const override { return EQ::spells::TOTAL_BUFFS; }
|
||||
|
||||
bool GetBotOwnerDataBuckets();
|
||||
bool GetBotDataBuckets();
|
||||
bool CheckDataBucket(std::string bucket_name, std::string bucket_value, uint8 bucket_comparison);
|
||||
@@ -472,7 +467,6 @@ public:
|
||||
bool IsBotArcher() { return m_bot_archery_setting; }
|
||||
bool IsBotCharmer() { return _botCharmer; }
|
||||
bool IsBot() const override { return true; }
|
||||
bool IsOfClientBotMerc() const override { return true; }
|
||||
bool GetRangerAutoWeaponSelect() { return _rangerAutoWeaponSelect; }
|
||||
BotRoleType GetBotRole() { return _botRole; }
|
||||
EQ::constants::StanceType GetBotStance() { return _botStance; }
|
||||
|
||||
+68
-162
@@ -122,20 +122,10 @@ public:
|
||||
}
|
||||
|
||||
for (int spell_id = 2; spell_id < SPDAT_RECORDS; ++spell_id) {
|
||||
if (!IsValidSpell(spell_id)) {
|
||||
if (spells[spell_id].player_1[0] == '\0')
|
||||
continue;
|
||||
}
|
||||
|
||||
if (spells[spell_id].player_1[0] == '\0') {
|
||||
if (spells[spell_id].target_type != ST_Target && spells[spell_id].cast_restriction != 0) // watch
|
||||
continue;
|
||||
}
|
||||
|
||||
if (
|
||||
spells[spell_id].target_type != ST_Target &&
|
||||
spells[spell_id].cast_restriction != 0
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
|
||||
auto target_type = BCEnum::TT_None;
|
||||
switch (spells[spell_id].target_type) {
|
||||
@@ -5374,54 +5364,40 @@ void bot_subcommand_bot_clone(Client *c, const Seperator *sep)
|
||||
|
||||
void bot_command_view_combos(Client *c, const Seperator *sep)
|
||||
{
|
||||
const std::string class_substrs[17] = {
|
||||
"",
|
||||
"WAR", "CLR", "PAL", "RNG",
|
||||
"SHD", "DRU", "MNK", "BRD",
|
||||
"ROG", "SHM", "NEC", "WIZ",
|
||||
"MAG", "ENC", "BST", "BER"
|
||||
const std::string class_substrs[17] = { "",
|
||||
"%u (WAR)", "%u (CLR)", "%u (PAL)", "%u (RNG)",
|
||||
"%u (SHD)", "%u (DRU)", "%u (MNK)", "%u (BRD)",
|
||||
"%u (ROG)", "%u (SHM)", "%u (NEC)", "%u (WIZ)",
|
||||
"%u (MAG)", "%u (ENC)", "%u (BST)", "%u (BER)"
|
||||
};
|
||||
|
||||
const std::string race_substrs[17] = {
|
||||
"",
|
||||
"HUM", "BAR", "ERU", "ELF",
|
||||
"HIE", "DEF", "HEF", "DWF",
|
||||
"TRL", "OGR", "HFL", "GNM",
|
||||
"IKS", "VAH", "FRG", "DRK"
|
||||
const std::string race_substrs[17] = { "",
|
||||
"%u (HUM)", "%u (BAR)", "%u (ERU)", "%u (ELF)",
|
||||
"%u (HIE)", "%u (DEF)", "%u (HEF)", "%u (DWF)",
|
||||
"%u (TRL)", "%u (OGR)", "%u (HFL)", "%u (GNM)",
|
||||
"%u (IKS)", "%u (VAH)", "%u (FRG)", "%u (DRK)"
|
||||
};
|
||||
|
||||
const uint16 race_values[17] = {
|
||||
RACE_DOUG_0,
|
||||
RACE_HUMAN_1, RACE_BARBARIAN_2, RACE_ERUDITE_3, RACE_WOOD_ELF_4,
|
||||
RACE_HIGH_ELF_5, RACE_DARK_ELF_6, RACE_HALF_ELF_7, RACE_DWARF_8,
|
||||
RACE_TROLL_9, RACE_OGRE_10, RACE_HALFLING_11, RACE_GNOME_12,
|
||||
RACE_IKSAR_128, RACE_VAH_SHIR_130, RACE_FROGLOK_330, RACE_DRAKKIN_522
|
||||
const uint16 race_values[17] = { 0,
|
||||
HUMAN, BARBARIAN, ERUDITE, WOOD_ELF,
|
||||
HIGH_ELF, DARK_ELF, HALF_ELF, DWARF,
|
||||
TROLL, OGRE, HALFLING, GNOME,
|
||||
IKSAR, VAHSHIR, FROGLOK, DRAKKIN
|
||||
};
|
||||
|
||||
if (helper_command_alias_fail(c, "bot_command_view_combos", sep->arg[0], "viewcombos")) {
|
||||
if (helper_command_alias_fail(c, "bot_command_view_combos", sep->arg[0], "viewcombos"))
|
||||
return;
|
||||
}
|
||||
|
||||
if (helper_is_help_or_usage(sep->arg[1])) {
|
||||
std::string window_title = "Bot Races";
|
||||
std::string window_text;
|
||||
std::string message_separator = " ";
|
||||
c->Message(Chat::White, fmt::format("Usage: {} [Race]", sep->arg[0]).c_str());
|
||||
|
||||
window_text.append("<c \"#FFFF\">");
|
||||
|
||||
c->Message(Chat::White, "Usage: %s [bot_race]", sep->arg[0]);
|
||||
window_text.append("<c \"#FFFFFF\">Races:<c \"#FFFF\">");
|
||||
for (int race_id = 0; race_id <= 15; ++race_id) {
|
||||
window_text.append(message_separator);
|
||||
window_text.append(
|
||||
fmt::format(
|
||||
"{} ({})",
|
||||
race_substrs[race_id + 1],
|
||||
race_values[race_id + 1]
|
||||
)
|
||||
);
|
||||
|
||||
window_text.append(StringFormat(race_substrs[race_id + 1].c_str(), race_values[race_id + 1]));
|
||||
message_separator = ", ";
|
||||
}
|
||||
c->SendPopupToClient("Bot Races", window_text.c_str());
|
||||
c->SendPopupToClient(window_title.c_str(), window_text.c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -5429,92 +5405,53 @@ void bot_command_view_combos(Client *c, const Seperator *sep)
|
||||
c->Message(Chat::White, "Invalid Race!");
|
||||
return;
|
||||
}
|
||||
|
||||
const uint16 bot_race = static_cast<uint16>(std::stoul(sep->arg[1]));
|
||||
const std::string race_name = GetRaceIDName(bot_race);
|
||||
|
||||
if (!Mob::IsPlayerRace(bot_race)) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"{} ({}) is not a race bots can use.",
|
||||
race_name,
|
||||
bot_race
|
||||
).c_str()
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
const auto classes_bitmask = database.botdb.GetRaceClassBitmask(bot_race);
|
||||
|
||||
uint16 bot_race = atoi(sep->arg[1]);
|
||||
auto classes_bitmask = database.botdb.GetRaceClassBitmask(bot_race);
|
||||
auto race_name = GetRaceIDName(bot_race);
|
||||
std::string window_title = "Bot Classes";
|
||||
std::string window_text;
|
||||
std::string message_separator = " ";
|
||||
|
||||
window_text.append("<c \"#FFFF\">");
|
||||
|
||||
const int object_max = 4;
|
||||
auto object_count = 0;
|
||||
|
||||
c->Message(Chat::White, "%s can be these classes.", race_name);
|
||||
window_text.append("<c \"#FFFFFF\">Classes:<c \"#FFFF\">");
|
||||
for (int class_id = 0; class_id <= 15; ++class_id) {
|
||||
if (classes_bitmask & GetPlayerClassBit(class_id)) {
|
||||
window_text.append(message_separator);
|
||||
|
||||
if (object_count >= object_max) {
|
||||
window_text.append(DialogueWindow::Break());
|
||||
object_count = 0;
|
||||
}
|
||||
|
||||
window_text.append(
|
||||
fmt::format(
|
||||
"{} ({})",
|
||||
class_substrs[class_id],
|
||||
class_id
|
||||
)
|
||||
);
|
||||
|
||||
++object_count;
|
||||
window_text.append(StringFormat(class_substrs[class_id].c_str(), class_id));
|
||||
message_separator = ", ";
|
||||
}
|
||||
}
|
||||
|
||||
c->SendPopupToClient(
|
||||
fmt::format(
|
||||
"Bot Classes for {} ({})",
|
||||
race_name,
|
||||
bot_race
|
||||
).c_str(),
|
||||
window_text.c_str()
|
||||
);
|
||||
c->SendPopupToClient(window_title.c_str(), window_text.c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
void bot_subcommand_bot_create(Client *c, const Seperator *sep)
|
||||
{
|
||||
const std::string class_substrs[17] = {
|
||||
"",
|
||||
"WAR", "CLR", "PAL", "RNG",
|
||||
"SHD", "DRU", "MNK", "BRD",
|
||||
"ROG", "SHM", "NEC", "WIZ",
|
||||
"MAG", "ENC", "BST", "BER"
|
||||
"{} (WAR)", "{} (CLR)", "{} (PAL)", "{} (RNG)",
|
||||
"{} (SHD)", "{} (DRU)", "{} (MNK)", "{} (BRD)",
|
||||
"{} (ROG)", "{} (SHM)", "{} (NEC)", "{} (WIZ)",
|
||||
"{} (MAG)", "{} (ENC)", "{} (BST)", "{} (BER)"
|
||||
};
|
||||
|
||||
const std::string race_substrs[17] = {
|
||||
"",
|
||||
"HUM", "BAR", "ERU", "ELF",
|
||||
"HIE", "DEF", "HEF", "DWF",
|
||||
"TRL", "OGR", "HFL", "GNM",
|
||||
"IKS", "VAH", "FRG", "DRK"
|
||||
"{} (HUM)", "{} (BAR)", "{} (ERU)", "{} (ELF)",
|
||||
"{} (HIE)", "{} (DEF)", "{} (HEF)", "{} (DWF)",
|
||||
"{} (TRL)", "{} (OGR)", "{} (HFL)", "{} (GNM)",
|
||||
"{} (IKS)", "{} (VAH)", "{} (FRG)", "{} (DRK)"
|
||||
};
|
||||
|
||||
const uint16 race_values[17] = {
|
||||
RACE_DOUG_0,
|
||||
RACE_HUMAN_1, RACE_BARBARIAN_2, RACE_ERUDITE_3, RACE_WOOD_ELF_4,
|
||||
RACE_HIGH_ELF_5, RACE_DARK_ELF_6, RACE_HALF_ELF_7, RACE_DWARF_8,
|
||||
RACE_TROLL_9, RACE_OGRE_10, RACE_HALFLING_11, RACE_GNOME_12,
|
||||
RACE_IKSAR_128, RACE_VAH_SHIR_130, RACE_FROGLOK_330, RACE_DRAKKIN_522
|
||||
0,
|
||||
HUMAN, BARBARIAN, ERUDITE, WOOD_ELF,
|
||||
HIGH_ELF, DARK_ELF, HALF_ELF, DWARF,
|
||||
TROLL, OGRE, HALFLING, GNOME,
|
||||
IKSAR, VAHSHIR, FROGLOK, DRAKKIN
|
||||
};
|
||||
|
||||
const std::string gender_substrs[2] = {
|
||||
"Male", "Female",
|
||||
"{} (M)", "{} (F)",
|
||||
};
|
||||
|
||||
if (helper_command_alias_fail(c, "bot_subcommand_bot_create", sep->arg[0], "botcreate")) {
|
||||
@@ -5525,7 +5462,7 @@ void bot_subcommand_bot_create(Client *c, const Seperator *sep)
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Usage: {} [Name] [Class] [Race] [Gender]",
|
||||
"Usage: {} [bot_name] [bot_class] [bot_race] [bot_gender]",
|
||||
sep->arg[0]
|
||||
).c_str()
|
||||
);
|
||||
@@ -5533,27 +5470,22 @@ void bot_subcommand_bot_create(Client *c, const Seperator *sep)
|
||||
std::string window_text;
|
||||
std::string message_separator;
|
||||
int object_count = 0;
|
||||
const int object_max = 4;
|
||||
const int object_max = 5;
|
||||
|
||||
window_text.append(
|
||||
fmt::format(
|
||||
"Classes{}<c \"#FFFF\">",
|
||||
DialogueWindow::Break()
|
||||
)
|
||||
);
|
||||
window_text.append("<c \"#FFFFFF\">Classes:<c \"#FFFF\">");
|
||||
|
||||
message_separator = " ";
|
||||
object_count = 0;
|
||||
object_count = 1;
|
||||
for (int i = 0; i <= 15; ++i) {
|
||||
window_text.append(message_separator);
|
||||
|
||||
if (object_count >= object_max) {
|
||||
window_text.append(DialogueWindow::Break());
|
||||
window_text.append("<br>");
|
||||
object_count = 0;
|
||||
}
|
||||
|
||||
window_text.append(
|
||||
fmt::format("{} ({})",
|
||||
fmt::format("{} {}",
|
||||
class_substrs[i + 1],
|
||||
(i + 1)
|
||||
)
|
||||
@@ -5563,27 +5495,22 @@ void bot_subcommand_bot_create(Client *c, const Seperator *sep)
|
||||
message_separator = ", ";
|
||||
}
|
||||
|
||||
window_text.append(DialogueWindow::Break(2));
|
||||
window_text.append("<br><br>");
|
||||
|
||||
window_text.append(
|
||||
fmt::format(
|
||||
"<c \"#FFFFFF\">Races{}<c \"#FFFF\">",
|
||||
DialogueWindow::Break()
|
||||
)
|
||||
);
|
||||
window_text.append("<c \"#FFFFFF\">Races:<c \"#FFFF\">");
|
||||
|
||||
message_separator = " ";
|
||||
object_count = 0;
|
||||
object_count = 1;
|
||||
for (int i = 0; i <= 15; ++i) {
|
||||
window_text.append(message_separator);
|
||||
|
||||
if (object_count >= object_max) {
|
||||
window_text.append(DialogueWindow::Break());
|
||||
window_text.append("<br>");
|
||||
object_count = 0;
|
||||
}
|
||||
|
||||
window_text.append(
|
||||
fmt::format("{} ({})",
|
||||
fmt::format("{}, {}",
|
||||
race_substrs[i + 1],
|
||||
race_values[i + 1]
|
||||
)
|
||||
@@ -5593,21 +5520,16 @@ void bot_subcommand_bot_create(Client *c, const Seperator *sep)
|
||||
message_separator = ", ";
|
||||
}
|
||||
|
||||
window_text.append(DialogueWindow::Break(2));
|
||||
window_text.append("<br><br>");
|
||||
|
||||
window_text.append(
|
||||
fmt::format(
|
||||
"<c \"#FFFFFF\">Genders{}<c \"#FFFF\">",
|
||||
DialogueWindow::Break()
|
||||
)
|
||||
);
|
||||
window_text.append("<c \"#FFFFFF\">Genders:<c \"#FFFF\">");
|
||||
|
||||
message_separator = " ";
|
||||
for (int i = 0; i <= 1; ++i) {
|
||||
window_text.append(message_separator);
|
||||
|
||||
window_text.append(
|
||||
fmt::format("{} ({})",
|
||||
fmt::format("{}, {}",
|
||||
gender_substrs[i],
|
||||
i
|
||||
)
|
||||
@@ -5616,12 +5538,13 @@ void bot_subcommand_bot_create(Client *c, const Seperator *sep)
|
||||
message_separator = ", ";
|
||||
}
|
||||
|
||||
c->SendPopupToClient("Bot Creation Options", window_text.c_str());
|
||||
c->SendPopupToClient("Bot Create Options", window_text.c_str());
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
const auto arguments = sep->argnum;
|
||||
auto arguments = sep->argnum;
|
||||
|
||||
if (!arguments || sep->IsNumber(1)) {
|
||||
c->Message(Chat::White, "You must name your bot!");
|
||||
return;
|
||||
@@ -5648,18 +5571,15 @@ void bot_subcommand_bot_create(Client *c, const Seperator *sep)
|
||||
return;
|
||||
}
|
||||
|
||||
auto bot_gender = MALE;
|
||||
auto bot_gender = 0;
|
||||
|
||||
if (sep->IsNumber(4)) {
|
||||
bot_gender = static_cast<uint8>(std::stoul(sep->arg[4]));
|
||||
if (bot_gender == NEUTER) {
|
||||
bot_gender = MALE;
|
||||
}
|
||||
} else {
|
||||
if (!strcasecmp(sep->arg[4], "m") || !strcasecmp(sep->arg[4], "male")) {
|
||||
bot_gender = MALE;
|
||||
bot_gender = 0;
|
||||
} else if (!strcasecmp(sep->arg[4], "f") || !strcasecmp(sep->arg[4], "female")) {
|
||||
bot_gender = FEMALE;
|
||||
bot_gender = 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5754,7 +5674,7 @@ void bot_subcommand_bot_dye_armor(Client *c, const Seperator *sep)
|
||||
return;
|
||||
}
|
||||
|
||||
if (helper_is_help_or_usage(sep->arg[1]) || !sep->arg[1] || (sep->arg[1] && !Strings::IsNumber(sep->arg[1]))) {
|
||||
if (helper_is_help_or_usage(sep->arg[1])) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
@@ -7272,13 +7192,7 @@ void bot_subcommand_botgroup_add_member(Client *c, const Seperator *sep)
|
||||
std::list<Bot*> sbl;
|
||||
MyBots::PopulateSBL_ByNamedBot(c, sbl, sep->arg[1]);
|
||||
if (sbl.empty()) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Usage: (<target_leader>) {} [member_name]",
|
||||
sep->arg[0]
|
||||
).c_str()
|
||||
);
|
||||
c->Message(Chat::White, "You must name a new member as a bot that you own to use this command.");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -9477,14 +9391,6 @@ void bot_subcommand_inventory_remove(Client *c, const Seperator *sep)
|
||||
slot_id
|
||||
)
|
||||
);
|
||||
|
||||
const auto export_string = fmt::format(
|
||||
"{} {}",
|
||||
inst->IsStackable() ? inst->GetCharges() : 1,
|
||||
slot_id
|
||||
);
|
||||
|
||||
parse->EventBot(EVENT_UNEQUIP_ITEM_BOT, my_bot, nullptr, export_string, inst->GetID());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2358,7 +2358,7 @@ bool BotDatabase::LoadLeaderIDByBotGroupID(const uint32 group_id, uint32& leader
|
||||
bool BotDatabase::LoadBotGroupNameByBotGroupID(const uint32 group_id, std::string& botgroup_name)
|
||||
{
|
||||
if (!group_id) {
|
||||
return false;
|
||||
false;
|
||||
}
|
||||
|
||||
query = fmt::format(
|
||||
@@ -2624,7 +2624,7 @@ bool BotDatabase::LoadBotGroupsListByOwnerID(const uint32 owner_id, std::list<st
|
||||
|
||||
|
||||
query = fmt::format(
|
||||
"SELECT DISTINCT(group_name), group_leader_id FROM "
|
||||
"SELECT group_name, group_leader_id FROM "
|
||||
"bot_groups bg INNER JOIN bot_group_members bgm "
|
||||
"ON bg.groups_index = bgm.groups_index "
|
||||
"WHERE bgm.bot_id IN "
|
||||
|
||||
+4
-139
@@ -10446,8 +10446,8 @@ int Client::CountItem(uint32 item_id)
|
||||
{ EQ::invslot::SHARED_BANK_BEGIN, EQ::invslot::SHARED_BANK_END },
|
||||
{ EQ::invbag::SHARED_BANK_BAGS_BEGIN, EQ::invbag::SHARED_BANK_BAGS_END },
|
||||
};
|
||||
const size_t slot_index_count = sizeof(slots) / sizeof(slots[0]);
|
||||
for (int slot_index = 0; slot_index < slot_index_count; ++slot_index) {
|
||||
const size_t size = sizeof(slots) / sizeof(slots[0]);
|
||||
for (int slot_index = 0; slot_index < size; ++slot_index) {
|
||||
for (int slot_id = slots[slot_index][0]; slot_id <= slots[slot_index][1]; ++slot_id) {
|
||||
item = GetInv().GetItem(slot_id);
|
||||
if (item && item->GetID() == item_id) {
|
||||
@@ -10459,133 +10459,6 @@ int Client::CountItem(uint32 item_id)
|
||||
return quantity;
|
||||
}
|
||||
|
||||
void Client::ResetItemCooldown(uint32 item_id)
|
||||
{
|
||||
EQ::ItemInstance *item = nullptr;
|
||||
const EQ::ItemData* item_d = database.GetItem(item_id);
|
||||
if (!item_d) {
|
||||
return;
|
||||
}
|
||||
int recast_type = item_d->RecastType;
|
||||
bool found_item = false;
|
||||
|
||||
static const int16 slots[][2] = {
|
||||
{ EQ::invslot::POSSESSIONS_BEGIN, EQ::invslot::POSSESSIONS_END },
|
||||
{ EQ::invbag::GENERAL_BAGS_BEGIN, EQ::invbag::GENERAL_BAGS_END },
|
||||
{ EQ::invbag::CURSOR_BAG_BEGIN, EQ::invbag::CURSOR_BAG_END},
|
||||
{ EQ::invslot::BANK_BEGIN, EQ::invslot::BANK_END },
|
||||
{ EQ::invbag::BANK_BAGS_BEGIN, EQ::invbag::BANK_BAGS_END },
|
||||
{ EQ::invslot::SHARED_BANK_BEGIN, EQ::invslot::SHARED_BANK_END },
|
||||
{ EQ::invbag::SHARED_BANK_BAGS_BEGIN, EQ::invbag::SHARED_BANK_BAGS_END },
|
||||
};
|
||||
const size_t slot_index_count = sizeof(slots) / sizeof(slots[0]);
|
||||
for (int slot_index = 0; slot_index < slot_index_count; ++slot_index) {
|
||||
for (int slot_id = slots[slot_index][0]; slot_id <= slots[slot_index][1]; ++slot_id) {
|
||||
item = GetInv().GetItem(slot_id);
|
||||
if (item) {
|
||||
item_d = item->GetItem();
|
||||
if (item_d && item->GetID() == item_id || (item_d->RecastType != RECAST_TYPE_UNLINKED_ITEM && item_d->RecastType == recast_type)) {
|
||||
item->SetRecastTimestamp(0);
|
||||
DeleteItemRecastTimer(item_d->ID);
|
||||
SendItemPacket(slot_id, item, ItemPacketCharmUpdate);
|
||||
found_item = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!found_item) {
|
||||
DeleteItemRecastTimer(item_id); //We didn't find the item but we still want to remove the timer
|
||||
}
|
||||
}
|
||||
|
||||
void Client::SetItemCooldown(uint32 item_id, bool use_saved_timer, uint32 in_seconds)
|
||||
{
|
||||
EQ::ItemInstance *item = nullptr;
|
||||
const EQ::ItemData* item_d = database.GetItem(item_id);
|
||||
if (!item_d) {
|
||||
return;
|
||||
}
|
||||
int recast_type = item_d->RecastType;
|
||||
auto timestamps = database.GetItemRecastTimestamps(CharacterID());
|
||||
uint32 total_time = 0;
|
||||
uint32 current_time = static_cast<uint32>(std::time(nullptr));
|
||||
uint32 final_time = 0;
|
||||
const auto timer_type = item_d->RecastType != RECAST_TYPE_UNLINKED_ITEM ? item_d->RecastType : item_id;
|
||||
const int timer_id = recast_type != RECAST_TYPE_UNLINKED_ITEM ? (pTimerItemStart + recast_type) : (pTimerNegativeItemReuse * item_id);
|
||||
|
||||
if (use_saved_timer) {
|
||||
if (item_d->RecastType != RECAST_TYPE_UNLINKED_ITEM) {
|
||||
total_time = timestamps.count(item_d->RecastType) ? timestamps.at(item_d->RecastType) : 0;
|
||||
} else {
|
||||
total_time = timestamps.count(item_id) ? timestamps.at(item_id) : 0;
|
||||
}
|
||||
} else {
|
||||
total_time = current_time + in_seconds;
|
||||
}
|
||||
|
||||
if (total_time > current_time) {
|
||||
final_time = total_time - current_time;
|
||||
}
|
||||
|
||||
static const int16 slots[][2] = {
|
||||
{ EQ::invslot::POSSESSIONS_BEGIN, EQ::invslot::POSSESSIONS_END },
|
||||
{ EQ::invbag::GENERAL_BAGS_BEGIN, EQ::invbag::GENERAL_BAGS_END },
|
||||
{ EQ::invbag::CURSOR_BAG_BEGIN, EQ::invbag::CURSOR_BAG_END},
|
||||
{ EQ::invslot::BANK_BEGIN, EQ::invslot::BANK_END },
|
||||
{ EQ::invbag::BANK_BAGS_BEGIN, EQ::invbag::BANK_BAGS_END },
|
||||
{ EQ::invslot::SHARED_BANK_BEGIN, EQ::invslot::SHARED_BANK_END },
|
||||
{ EQ::invbag::SHARED_BANK_BAGS_BEGIN, EQ::invbag::SHARED_BANK_BAGS_END },
|
||||
};
|
||||
const size_t slot_index_count = sizeof(slots) / sizeof(slots[0]);
|
||||
for (int slot_index = 0; slot_index < slot_index_count; ++slot_index) {
|
||||
for (int slot_id = slots[slot_index][0]; slot_id <= slots[slot_index][1]; ++slot_id) {
|
||||
item = GetInv().GetItem(slot_id);
|
||||
if (item) {
|
||||
item_d = item->GetItem();
|
||||
if (item_d && item->GetID() == item_id || (item_d->RecastType != RECAST_TYPE_UNLINKED_ITEM && item_d->RecastType == recast_type)) {
|
||||
item->SetRecastTimestamp(total_time);
|
||||
SendItemPacket(slot_id, item, ItemPacketCharmUpdate);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Start timers and update in database only when timer is changed
|
||||
if (!use_saved_timer) {
|
||||
GetPTimers().Clear(&database, timer_id);
|
||||
GetPTimers().Start((timer_id), in_seconds);
|
||||
database.UpdateItemRecast(
|
||||
CharacterID(),
|
||||
timer_type,
|
||||
GetPTimers().Get(timer_id)->GetReadyTimestamp()
|
||||
);
|
||||
}
|
||||
SendItemRecastTimer(recast_type, final_time, true);
|
||||
}
|
||||
|
||||
uint32 Client::GetItemCooldown(uint32 item_id)
|
||||
{
|
||||
const EQ::ItemData* item_d = database.GetItem(item_id);
|
||||
if (!item_d) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int recast_type = item_d->RecastType;
|
||||
auto timestamps = database.GetItemRecastTimestamps(CharacterID());
|
||||
const auto timer_type = recast_type != RECAST_TYPE_UNLINKED_ITEM ? recast_type : item_id;
|
||||
uint32 total_time = 0;
|
||||
uint32 current_time = static_cast<uint32>(std::time(nullptr));
|
||||
uint32 final_time = 0;
|
||||
|
||||
total_time = timestamps.count(timer_type) ? timestamps.at(timer_type) : 0;
|
||||
|
||||
if (total_time > current_time) {
|
||||
final_time = total_time - current_time;
|
||||
}
|
||||
|
||||
return final_time;
|
||||
}
|
||||
|
||||
void Client::RemoveItem(uint32 item_id, uint32 quantity)
|
||||
{
|
||||
EQ::ItemInstance *item = nullptr;
|
||||
@@ -10599,8 +10472,8 @@ void Client::RemoveItem(uint32 item_id, uint32 quantity)
|
||||
{ EQ::invbag::SHARED_BANK_BAGS_BEGIN, EQ::invbag::SHARED_BANK_BAGS_END },
|
||||
};
|
||||
int16 removed_count = 0;
|
||||
const size_t slot_index_count = sizeof(slots) / sizeof(slots[0]);
|
||||
for (int slot_index = 0; slot_index < slot_index_count; ++slot_index) {
|
||||
const size_t size = sizeof(slots) / sizeof(slots[0]);
|
||||
for (int slot_index = 0; slot_index < size; ++slot_index) {
|
||||
for (int slot_id = slots[slot_index][0]; slot_id <= slots[slot_index][1]; ++slot_id) {
|
||||
if (removed_count == quantity) {
|
||||
break;
|
||||
@@ -11960,11 +11833,3 @@ void Client::SendPath(Mob* target)
|
||||
|
||||
SendPathPacket(points);
|
||||
}
|
||||
|
||||
void Client::UseAugmentContainer(int container_slot) {
|
||||
auto in_augment = new AugmentItem_Struct[sizeof(AugmentItem_Struct)];
|
||||
in_augment->container_slot = container_slot;
|
||||
in_augment->augment_slot = -1;
|
||||
Object::HandleAugmentation(this, in_augment, nullptr);
|
||||
safe_delete_array(in_augment);
|
||||
}
|
||||
|
||||
+2
-8
@@ -278,7 +278,6 @@ public:
|
||||
bool KeyRingCheck(uint32 item_id);
|
||||
void KeyRingList();
|
||||
virtual bool IsClient() const { return true; }
|
||||
bool IsOfClientBotMerc() const override { return true; }
|
||||
void CompleteConnect();
|
||||
bool TryStacking(EQ::ItemInstance* item, uint8 type = ItemPacketTrade, bool try_worn = true, bool try_cursor = true);
|
||||
void SendTraderPacket(Client* trader, uint32 Unknown72 = 51);
|
||||
@@ -953,7 +952,6 @@ public:
|
||||
void MemorizeSpell(uint32 slot, uint32 spellid, uint32 scribing, uint32 reduction = 0);
|
||||
|
||||
// Item methods
|
||||
void UseAugmentContainer(int container_slot);
|
||||
void EVENT_ITEM_ScriptStopReturn();
|
||||
uint32 NukeItem(uint32 itemnum, uint8 where_to_check =
|
||||
(invWhereWorn | invWherePersonal | invWhereBank | invWhereSharedBank | invWhereTrading | invWhereCursor));
|
||||
@@ -968,9 +966,6 @@ public:
|
||||
void SendCursorBuffer();
|
||||
void DeleteItemInInventory(int16 slot_id, int16 quantity = 0, bool client_update = false, bool update_db = true);
|
||||
int CountItem(uint32 item_id);
|
||||
void ResetItemCooldown(uint32 item_id);
|
||||
void SetItemCooldown(uint32 item_id, bool use_saved_timer = false, uint32 in_seconds = 1);
|
||||
uint32 GetItemCooldown(uint32 item_id);
|
||||
void RemoveItem(uint32 item_id, uint32 quantity = 1);
|
||||
bool SwapItem(MoveItem_Struct* move_in);
|
||||
void SwapItemResync(MoveItem_Struct* move_slots);
|
||||
@@ -1521,9 +1516,8 @@ public:
|
||||
|
||||
void SendReloadCommandMessages();
|
||||
|
||||
void SendItemRecastTimer(int32 recast_type, uint32 recast_delay = 0, bool in_ignore_casting_requirement = false);
|
||||
void SendItemRecastTimer(int32 recast_type, uint32 recast_delay = 0);
|
||||
void SetItemRecastTimer(int32 spell_id, uint32 inventory_slot);
|
||||
void DeleteItemRecastTimer(uint32 item_id);
|
||||
bool HasItemRecastTimer(int32 spell_id, uint32 inventory_slot);
|
||||
|
||||
inline bool AggroMeterAvailable() const { return ((m_ClientVersionBit & EQ::versions::maskRoF2AndLater)) && RuleB(Character, EnableAggroMeter); } // RoF untested
|
||||
@@ -1683,6 +1677,7 @@ protected:
|
||||
void CalcItemBonuses(StatBonuses* newbon);
|
||||
void AddItemBonuses(const EQ::ItemInstance *inst, StatBonuses* newbon, bool isAug = false, bool isTribute = false, int rec_override = 0, bool ammo_slot_item = false);
|
||||
void AdditiveWornBonuses(const EQ::ItemInstance *inst, StatBonuses* newbon, bool isAug = false);
|
||||
int CalcRecommendedLevelBonus(uint8 level, uint8 reclevel, int basestat);
|
||||
void CalcEdibleBonuses(StatBonuses* newbon);
|
||||
void ProcessItemCaps();
|
||||
void MakeBuffFadePacket(uint16 spell_id, int slot_id, bool send_message = true);
|
||||
@@ -2084,7 +2079,6 @@ private:
|
||||
bool m_bot_precombat;
|
||||
|
||||
bool CanTradeFVNoDropItem();
|
||||
void SendMobPositions();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1031,14 +1031,14 @@ int Client::CalcHaste()
|
||||
h += spellbonuses.hastetype2 > 10 ? 10 : spellbonuses.hastetype2;
|
||||
}
|
||||
// 26+ no cap, 1-25 10
|
||||
if (level > 25 || RuleB(Character, IgnoreLevelBasedHasteCaps)) { // 26+
|
||||
if (level > 25) { // 26+
|
||||
h += itembonuses.haste;
|
||||
}
|
||||
else { // 1-25
|
||||
h += itembonuses.haste > 10 ? 10 : itembonuses.haste;
|
||||
}
|
||||
// 60+ 100, 51-59 85, 1-50 level+25
|
||||
if (level > 59 || RuleB(Character, IgnoreLevelBasedHasteCaps)) { // 60+
|
||||
if (level > 59) { // 60+
|
||||
cap = RuleI(Character, HasteCap);
|
||||
}
|
||||
else if (level > 50) { // 51-59
|
||||
@@ -1052,7 +1052,7 @@ int Client::CalcHaste()
|
||||
h = cap;
|
||||
}
|
||||
// 51+ 25 (despite there being higher spells...), 1-50 10
|
||||
if (level > 50 || RuleB(Character, IgnoreLevelBasedHasteCaps)) { // 51+
|
||||
if (level > 50) { // 51+
|
||||
cap = RuleI(Character, Hastev3Cap);
|
||||
if (spellbonuses.hastetype3 > cap) {
|
||||
h += cap;
|
||||
|
||||
+20
-146
@@ -778,12 +778,6 @@ void Client::CompleteConnect()
|
||||
|
||||
parse->EventPlayer(EVENT_ENTER_ZONE, this, "", 0);
|
||||
|
||||
// the way that the client deals with positions during the initial spawn struct
|
||||
// is subtly different from how it deals with getting a position update
|
||||
// if a mob is slightly in the wall or slightly clipping a floor they will be
|
||||
// sent to a succor point
|
||||
SendMobPositions();
|
||||
|
||||
SetLastPositionBeforeBulkUpdate(GetPosition());
|
||||
|
||||
/* This sub event is for if a player logs in for the first time since entering world. */
|
||||
@@ -4174,26 +4168,8 @@ void Client::Handle_OP_CastSpell(const EQApplicationPacket *app)
|
||||
{
|
||||
if (GetLevel() >= item->Click.Level2)
|
||||
{
|
||||
auto* p_inst = (EQ::ItemInstance*) inst;
|
||||
int i = 0;
|
||||
|
||||
if (parse->ItemHasQuestSub(p_inst, EVENT_ITEM_CLICK_CAST)) {
|
||||
i = parse->EventItem(
|
||||
EVENT_ITEM_CLICK_CAST,
|
||||
this,
|
||||
p_inst,
|
||||
nullptr,
|
||||
"",
|
||||
castspell->inventoryslot
|
||||
);
|
||||
}
|
||||
|
||||
if (parse->PlayerHasQuestSub(EVENT_ITEM_CLICK_CAST_CLIENT)) {
|
||||
std::vector<std::any> args;
|
||||
args.emplace_back(p_inst);
|
||||
i = parse->EventPlayer(EVENT_ITEM_CLICK_CAST_CLIENT, this, std::to_string(castspell->inventoryslot), 0, &args);
|
||||
}
|
||||
|
||||
EQ::ItemInstance* p_inst = (EQ::ItemInstance*)inst;
|
||||
int i = parse->EventItem(EVENT_ITEM_CLICK_CAST, this, p_inst, nullptr, "", castspell->inventoryslot);
|
||||
if (i == 0) {
|
||||
CastSpell(item->Click.Effect, castspell->target_id, slot, item->CastTime, 0, 0, castspell->inventoryslot);
|
||||
}
|
||||
@@ -4211,26 +4187,8 @@ void Client::Handle_OP_CastSpell(const EQApplicationPacket *app)
|
||||
}
|
||||
else
|
||||
{
|
||||
auto* p_inst = (EQ::ItemInstance*) inst;
|
||||
|
||||
int i = 0;
|
||||
|
||||
if (parse->ItemHasQuestSub(p_inst, EVENT_ITEM_CLICK_CAST)) {
|
||||
i = parse->EventItem(
|
||||
EVENT_ITEM_CLICK_CAST,
|
||||
this,
|
||||
p_inst,
|
||||
nullptr,
|
||||
"",
|
||||
castspell->inventoryslot
|
||||
);
|
||||
}
|
||||
|
||||
if (parse->PlayerHasQuestSub(EVENT_ITEM_CLICK_CAST_CLIENT)) {
|
||||
std::vector<std::any> args;
|
||||
args.emplace_back(p_inst);
|
||||
i = parse->EventPlayer(EVENT_ITEM_CLICK_CAST_CLIENT, this, std::to_string(castspell->inventoryslot), 0, &args);
|
||||
}
|
||||
EQ::ItemInstance* p_inst = (EQ::ItemInstance*)inst;
|
||||
int i = parse->EventItem(EVENT_ITEM_CLICK_CAST, this, p_inst, nullptr, "", castspell->inventoryslot);
|
||||
|
||||
if (i == 0) {
|
||||
CastSpell(item->Click.Effect, castspell->target_id, slot, item->CastTime, 0, 0, castspell->inventoryslot);
|
||||
@@ -4385,46 +4343,27 @@ void Client::Handle_OP_ClickDoor(const EQApplicationPacket *app)
|
||||
return;
|
||||
}
|
||||
|
||||
float distance = DistanceNoZ(GetPosition(), currentdoor->GetPosition());
|
||||
|
||||
LogDoors(
|
||||
"Door [{}] client handle, client distance from door [{:.2f}]",
|
||||
currentdoor->GetDoorID(),
|
||||
distance
|
||||
);
|
||||
|
||||
bool within_distance = distance < RuleI(Range, MaxDistanceToClickDoors);
|
||||
|
||||
// distance gate this because some doors are client controlled and the client
|
||||
// will spam door click even across the zone to force a door back into desired state
|
||||
if (IsDevToolsEnabled() && within_distance) {
|
||||
// set door selected
|
||||
if (IsDevToolsEnabled()) {
|
||||
SetDoorToolEntityId(currentdoor->GetEntityID());
|
||||
DoorManipulation::CommandHeader(this);
|
||||
Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Door ({}) [{}]",
|
||||
currentdoor->GetDoorID(),
|
||||
currentdoor->GetEntityID(),
|
||||
Saylink::Silent("#door edit")
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
|
||||
// don't spam scripts with client controlled doors if not within distance
|
||||
if (within_distance) {
|
||||
std::string export_string = fmt::format("{}", cd->doorid);
|
||||
std::vector<std::any> args;
|
||||
args.push_back(currentdoor);
|
||||
if (parse->EventPlayer(EVENT_CLICK_DOOR, this, export_string, 0, &args) == 0) {
|
||||
currentdoor->HandleClick(this, 0);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// we let this pass because client controlled doors require this to force the linked doors
|
||||
// back into state
|
||||
std::string export_string = fmt::format("{}", cd->doorid);
|
||||
std::vector<std::any> args;
|
||||
args.push_back(currentdoor);
|
||||
if (parse->EventPlayer(EVENT_CLICK_DOOR, this, export_string, 0, &args) == 0)
|
||||
{
|
||||
currentdoor->HandleClick(this, 0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void Client::Handle_OP_ClickObject(const EQApplicationPacket *app)
|
||||
@@ -8897,18 +8836,9 @@ void Client::Handle_OP_ItemVerifyRequest(const EQApplicationPacket *app)
|
||||
|
||||
if (m_inv.SupportsClickCasting(slot_id) || ((item->ItemType == EQ::item::ItemTypePotion || item->PotionBelt) && m_inv.SupportsPotionBeltCasting(slot_id))) // sanity check
|
||||
{
|
||||
auto* p_inst = (EQ::ItemInstance*) inst;
|
||||
|
||||
if (parse->ItemHasQuestSub(p_inst, EVENT_ITEM_CLICK)) {
|
||||
parse->EventItem(EVENT_ITEM_CLICK, this, p_inst, nullptr, "", slot_id);
|
||||
}
|
||||
|
||||
if (parse->PlayerHasQuestSub(EVENT_ITEM_CLICK_CLIENT)) {
|
||||
std::vector<std::any> args;
|
||||
args.emplace_back(p_inst);
|
||||
parse->EventPlayer(EVENT_ITEM_CLICK_CLIENT, this, std::to_string(slot_id), 0, &args);
|
||||
}
|
||||
EQ::ItemInstance* p_inst = (EQ::ItemInstance*)inst;
|
||||
|
||||
parse->EventItem(EVENT_ITEM_CLICK, this, p_inst, nullptr, "", slot_id);
|
||||
inst = m_inv[slot_id];
|
||||
if (!inst)
|
||||
{
|
||||
@@ -8997,38 +8927,16 @@ void Client::Handle_OP_ItemVerifyRequest(const EQApplicationPacket *app)
|
||||
{
|
||||
if (item->RecastDelay > 0)
|
||||
{
|
||||
if (item->RecastType != RECAST_TYPE_UNLINKED_ITEM && !GetPTimers().Expired(&database, (pTimerItemStart + item->RecastType), false)) {
|
||||
SetItemCooldown(item->ID, true);
|
||||
SendSpellBarEnable(item->Click.Effect);
|
||||
LogSpells("Casting of [{}] canceled: item spell reuse timer not expired", spell_id);
|
||||
return;
|
||||
} else if (item->RecastType == RECAST_TYPE_UNLINKED_ITEM && !GetPTimers().Expired(&database, (pTimerNegativeItemReuse * item->ID), false)) {
|
||||
SetItemCooldown(item->ID, true);
|
||||
if (!GetPTimers().Expired(&database, (pTimerItemStart + item->RecastType), false)) {
|
||||
SendItemRecastTimer(item->RecastType); //Problem: When you loot corpse, recast display is not present. This causes it to display again. Could not get to display when sending from looting.
|
||||
MessageString(Chat::Red, SPELL_RECAST);
|
||||
SendSpellBarEnable(item->Click.Effect);
|
||||
LogSpells("Casting of [{}] canceled: item spell reuse timer not expired", spell_id);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
int i = 0;
|
||||
|
||||
if (parse->ItemHasQuestSub(p_inst, EVENT_ITEM_CLICK_CAST)) {
|
||||
i = parse->EventItem(
|
||||
EVENT_ITEM_CLICK_CAST,
|
||||
this,
|
||||
p_inst,
|
||||
nullptr,
|
||||
"",
|
||||
slot_id
|
||||
);
|
||||
}
|
||||
|
||||
if (parse->PlayerHasQuestSub(EVENT_ITEM_CLICK_CAST_CLIENT)) {
|
||||
std::vector<std::any> args;
|
||||
args.emplace_back(p_inst);
|
||||
i = parse->EventPlayer(EVENT_ITEM_CLICK_CAST_CLIENT, this, std::to_string(slot_id), 0, &args);
|
||||
}
|
||||
|
||||
int i = parse->EventItem(EVENT_ITEM_CLICK_CAST, this, p_inst, nullptr, "", slot_id);
|
||||
inst = m_inv[slot_id];
|
||||
if (!inst)
|
||||
{
|
||||
@@ -9064,38 +8972,15 @@ void Client::Handle_OP_ItemVerifyRequest(const EQApplicationPacket *app)
|
||||
{
|
||||
if (augitem->RecastDelay > 0)
|
||||
{
|
||||
if (augitem->RecastType != RECAST_TYPE_UNLINKED_ITEM && !GetPTimers().Expired(&database, (pTimerItemStart + augitem->RecastType), false)) {
|
||||
if (!GetPTimers().Expired(&database, (pTimerItemStart + augitem->RecastType), false)) {
|
||||
LogSpells("Casting of [{}] canceled: item spell reuse timer from augment not expired", spell_id);
|
||||
MessageString(Chat::Red, SPELL_RECAST);
|
||||
SendSpellBarEnable(augitem->Click.Effect);
|
||||
return;
|
||||
} else if (augitem->RecastType == RECAST_TYPE_UNLINKED_ITEM && !GetPTimers().Expired(&database, (pTimerNegativeItemReuse * augitem->ID), false)) {
|
||||
MessageString(Chat::Red, SPELL_RECAST);
|
||||
SendSpellBarEnable(augitem->Click.Effect);
|
||||
LogSpells("Casting of [{}] canceled: item spell reuse timer not expired", spell_id);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
int i = 0;
|
||||
|
||||
if (parse->ItemHasQuestSub(p_inst, EVENT_ITEM_CLICK_CAST)) {
|
||||
i = parse->EventItem(
|
||||
EVENT_ITEM_CLICK_CAST,
|
||||
this,
|
||||
clickaug,
|
||||
nullptr,
|
||||
"",
|
||||
slot_id
|
||||
);
|
||||
}
|
||||
|
||||
if (parse->PlayerHasQuestSub(EVENT_ITEM_CLICK_CAST_CLIENT)) {
|
||||
std::vector<std::any> args;
|
||||
args.emplace_back(clickaug);
|
||||
i = parse->EventPlayer(EVENT_ITEM_CLICK_CAST_CLIENT, this, std::to_string(slot_id), 0, &args);
|
||||
}
|
||||
|
||||
int i = parse->EventItem(EVENT_ITEM_CLICK_CAST, this, clickaug, nullptr, "", slot_id);
|
||||
inst = m_inv[slot_id];
|
||||
if (!inst)
|
||||
{
|
||||
@@ -15755,14 +15640,3 @@ bool Client::CanTradeFVNoDropItem()
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void Client::SendMobPositions()
|
||||
{
|
||||
auto p = new EQApplicationPacket(OP_ClientUpdate, sizeof(PlayerPositionUpdateServer_Struct));
|
||||
auto *s = (PlayerPositionUpdateServer_Struct *) p->pBuffer;
|
||||
for (auto &m: entity_list.GetMobList()) {
|
||||
m.second->MakeSpawnUpdate(s);
|
||||
QueuePacket(p, false);
|
||||
}
|
||||
safe_delete(p);
|
||||
}
|
||||
|
||||
@@ -872,9 +872,6 @@ void Client::BulkSendMerchantInventory(int merchant_id, int npcid) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!EQ::ValueWithin(Admin(), static_cast<int16>(ml.min_status), static_cast<int16>(ml.max_status))) {
|
||||
continue;
|
||||
}
|
||||
|
||||
int32 faction_id = npc ? npc->GetPrimaryFaction() : 0;
|
||||
int32 faction_level = (
|
||||
|
||||
+4
-24
@@ -1209,13 +1209,8 @@ void Corpse::MakeLootRequestPackets(Client* client, const EQApplicationPacket* a
|
||||
auto pkinst = database.CreateItem(pkitem, pkitem->MaxCharges);
|
||||
|
||||
if (pkinst) {
|
||||
if (pkitem->RecastDelay) {
|
||||
if (pkitem->RecastType != RECAST_TYPE_UNLINKED_ITEM) {
|
||||
pkinst->SetRecastTimestamp(timestamps.count(pkitem->RecastType) ? timestamps.at(pkitem->RecastType) : 0);
|
||||
} else {
|
||||
pkinst->SetRecastTimestamp(timestamps.count(pkitem->ID) ? timestamps.at(pkitem->ID) : 0);
|
||||
}
|
||||
}
|
||||
if (pkitem->RecastDelay)
|
||||
pkinst->SetRecastTimestamp(timestamps.count(pkitem->RecastType) ? timestamps.at(pkitem->RecastType) : 0);
|
||||
|
||||
LogInventory("MakeLootRequestPackets() Slot [{}], Item [{}]", EQ::invslot::CORPSE_BEGIN, pkitem->Name);
|
||||
|
||||
@@ -1269,13 +1264,8 @@ void Corpse::MakeLootRequestPackets(Client* client, const EQApplicationPacket* a
|
||||
if (!inst)
|
||||
continue;
|
||||
|
||||
if (item->RecastDelay) {
|
||||
if (item->RecastType != RECAST_TYPE_UNLINKED_ITEM) {
|
||||
inst->SetRecastTimestamp(timestamps.count(item->RecastType) ? timestamps.at(item->RecastType) : 0);
|
||||
} else {
|
||||
inst->SetRecastTimestamp(timestamps.count(item->ID) ? timestamps.at(item->ID) : 0);
|
||||
}
|
||||
}
|
||||
if (item->RecastDelay)
|
||||
inst->SetRecastTimestamp(timestamps.count(item->RecastType) ? timestamps.at(item->RecastType) : 0);
|
||||
|
||||
LogInventory("MakeLootRequestPackets() Slot [{}], Item [{}]", loot_slot, item->Name);
|
||||
|
||||
@@ -1487,16 +1477,6 @@ void Corpse::LootItem(Client *client, const EQApplicationPacket *app)
|
||||
|
||||
// get count for task update before it's mutated by AutoPutLootInInventory
|
||||
int count = inst->IsStackable() ? inst->GetCharges() : 1;
|
||||
//Set recast on item when looting it!
|
||||
auto timestamps = database.GetItemRecastTimestamps(client->CharacterID());
|
||||
const auto* d = inst->GetItem();
|
||||
if (d->RecastDelay) {
|
||||
if (d->RecastType != RECAST_TYPE_UNLINKED_ITEM) {
|
||||
inst->SetRecastTimestamp(timestamps.count(d->RecastType) ? timestamps.at(d->RecastType) : 0);
|
||||
} else {
|
||||
inst->SetRecastTimestamp(timestamps.count(d->ID) ? timestamps.at(d->ID) : 0);
|
||||
}
|
||||
}
|
||||
|
||||
/* First add it to the looter - this will do the bag contents too */
|
||||
if (lootitem->auto_loot > 0) {
|
||||
|
||||
+13
-77
@@ -121,7 +121,6 @@ Doors::~Doors()
|
||||
bool Doors::Process()
|
||||
{
|
||||
if (m_close_timer.Enabled() && m_close_timer.Check() && IsDoorOpen()) {
|
||||
LogDoorsDetail("door open and timer triggered door_id [{}] open_type [{}]", GetDoorID(), m_open_type);
|
||||
if (m_open_type == 40 || GetTriggerType() == 1) {
|
||||
auto outapp = new EQApplicationPacket(OP_MoveDoor, sizeof(MoveDoor_Struct));
|
||||
MoveDoor_Struct *md = (MoveDoor_Struct *) outapp->pBuffer;
|
||||
@@ -628,13 +627,11 @@ void Doors::ForceOpen(Mob *sender, bool alt_mode)
|
||||
if (!alt_mode) { // original function
|
||||
if (!m_is_open) {
|
||||
if (!m_disable_timer) {
|
||||
LogDoorsDetail("door_id [{}] starting timer", md->doorid);
|
||||
m_close_timer.Start();
|
||||
}
|
||||
m_is_open = true;
|
||||
}
|
||||
else {
|
||||
LogDoorsDetail("door_id [{}] disable timer", md->doorid);
|
||||
m_close_timer.Disable();
|
||||
if (!m_disable_timer) {
|
||||
m_is_open = false;
|
||||
@@ -643,7 +640,6 @@ void Doors::ForceOpen(Mob *sender, bool alt_mode)
|
||||
}
|
||||
else { // alternative function
|
||||
if (!m_disable_timer) {
|
||||
LogDoorsDetail("door_id [{}] alt starting timer", md->doorid);
|
||||
m_close_timer.Start();
|
||||
}
|
||||
m_is_open = true;
|
||||
@@ -806,75 +802,20 @@ void Doors::CreateDatabaseEntry()
|
||||
return;
|
||||
}
|
||||
|
||||
const auto& l = DoorsRepository::GetWhere(
|
||||
content_db,
|
||||
fmt::format(
|
||||
"zone = '{}' AND doorid = {}",
|
||||
zone->GetShortName(),
|
||||
GetDoorID()
|
||||
)
|
||||
content_db.InsertDoor(
|
||||
GetDoorDBID(),
|
||||
GetDoorID(),
|
||||
GetDoorName(),
|
||||
m_position,
|
||||
GetOpenType(),
|
||||
static_cast<uint16>(GetGuildID()),
|
||||
GetLockpick(),
|
||||
GetKeyItem(),
|
||||
static_cast<uint8>(GetDoorParam()),
|
||||
static_cast<uint8>(GetInvertState()),
|
||||
GetIncline(),
|
||||
GetSize()
|
||||
);
|
||||
if (!l.empty()) {
|
||||
auto e = l[0];
|
||||
|
||||
e.name = GetDoorName();
|
||||
e.pos_x = GetX();
|
||||
e.pos_y = GetY();
|
||||
e.pos_z = GetZ();
|
||||
e.heading = GetHeading();
|
||||
e.opentype = GetOpenType();
|
||||
e.guild = static_cast<uint16>(GetGuildID());
|
||||
e.lockpick = GetLockpick();
|
||||
e.keyitem = GetKeyItem();
|
||||
e.door_param = static_cast<uint8>(GetDoorParam());
|
||||
e.invert_state = static_cast<uint8>(GetInvertState());
|
||||
e.incline = GetIncline();
|
||||
e.size = GetSize();
|
||||
|
||||
auto updated = DoorsRepository::UpdateOne(content_db, e);
|
||||
if (!updated) {
|
||||
LogError(
|
||||
"Failed to update door in Zone [{}] Version [{}] Database ID [{}] ID [{}]",
|
||||
zone->GetShortName(),
|
||||
zone->GetInstanceVersion(),
|
||||
GetDoorDBID(),
|
||||
GetDoorID()
|
||||
);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
auto e = DoorsRepository::NewEntity();
|
||||
|
||||
e.id = GetDoorDBID();
|
||||
e.doorid = GetDoorID();
|
||||
e.zone = zone->GetShortName();
|
||||
e.version = zone->GetInstanceVersion();
|
||||
e.name = GetDoorName();
|
||||
e.pos_x = GetX();
|
||||
e.pos_y = GetY();
|
||||
e.pos_z = GetZ();
|
||||
e.heading = GetHeading();
|
||||
e.opentype = GetOpenType();
|
||||
e.guild = static_cast<uint16>(GetGuildID());
|
||||
e.lockpick = GetLockpick();
|
||||
e.keyitem = GetKeyItem();
|
||||
e.door_param = static_cast<uint8>(GetDoorParam());
|
||||
e.invert_state = static_cast<uint8>(GetInvertState());
|
||||
e.incline = GetIncline();
|
||||
e.size = GetSize();
|
||||
|
||||
const auto& n = DoorsRepository::InsertOne(content_db, e);
|
||||
if (!n.id) {
|
||||
LogError(
|
||||
"Failed to create door in Zone [{}] Version [{}] Database ID [{}] ID [{}]",
|
||||
zone->GetShortName(),
|
||||
zone->GetInstanceVersion(),
|
||||
GetDoorDBID(),
|
||||
GetDoorID()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
float Doors::GetX()
|
||||
@@ -891,8 +832,3 @@ float Doors::GetZ()
|
||||
{
|
||||
return m_position.z;
|
||||
}
|
||||
|
||||
float Doors::GetHeading()
|
||||
{
|
||||
return m_position.w;
|
||||
}
|
||||
|
||||
@@ -65,7 +65,6 @@ public:
|
||||
float GetX();
|
||||
float GetY();
|
||||
float GetZ();
|
||||
float GetHeading();
|
||||
|
||||
private:
|
||||
|
||||
|
||||
+2
-1
@@ -437,7 +437,8 @@ int64 Mob::GetActSpellHealing(uint16 spell_id, int64 value, Mob* target, bool fr
|
||||
}
|
||||
}
|
||||
|
||||
value *= critical_modifier;
|
||||
if (critical_chance && zone->random.Roll(critical_chance))
|
||||
value *= critical_modifier;
|
||||
}
|
||||
|
||||
if (IsNPC() && CastToNPC()->GetHealScale()) {
|
||||
|
||||
@@ -169,12 +169,6 @@ const char *QuestEventSubroutines[_LargestEventID] = {
|
||||
"EVENT_BOT_CREATE",
|
||||
"EVENT_AUGMENT_INSERT_CLIENT",
|
||||
"EVENT_AUGMENT_REMOVE_CLIENT",
|
||||
"EVENT_EQUIP_ITEM_BOT",
|
||||
"EVENT_UNEQUIP_ITEM_BOT",
|
||||
"EVENT_DAMAGE_GIVEN",
|
||||
"EVENT_DAMAGE_TAKEN",
|
||||
"EVENT_ITEM_CLICK_CLIENT",
|
||||
"EVENT_ITEM_CLICK_CAST_CLIENT",
|
||||
// Add new events before these or Lua crashes
|
||||
"EVENT_SPELL_EFFECT_BOT",
|
||||
"EVENT_SPELL_EFFECT_BUFF_TIC_BOT"
|
||||
@@ -1715,20 +1709,6 @@ void PerlembParser::ExportEventVariables(
|
||||
break;
|
||||
}
|
||||
|
||||
case EVENT_ITEM_CLICK_CAST_CLIENT:
|
||||
case EVENT_ITEM_CLICK_CLIENT: {
|
||||
ExportVar(package_name.c_str(), "slot_id", data);
|
||||
if (extra_pointers && extra_pointers->size() == 1) {
|
||||
auto* item = std::any_cast<EQ::ItemInstance*>(extra_pointers->at(0));
|
||||
if (item) {
|
||||
ExportVar(package_name.c_str(), "item_id", item->GetID());
|
||||
ExportVar(package_name.c_str(), "item_name", item->GetItem()->Name);
|
||||
ExportVar(package_name.c_str(), "spell_id", item->GetItem()->Click.Effect);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case EVENT_GROUP_CHANGE: {
|
||||
if (mob && mob->IsClient()) {
|
||||
ExportVar(package_name.c_str(), "grouped", mob->IsGrouped());
|
||||
@@ -1921,15 +1901,6 @@ void PerlembParser::ExportEventVariables(
|
||||
break;
|
||||
}
|
||||
|
||||
case EVENT_EQUIP_ITEM_BOT:
|
||||
case EVENT_UNEQUIP_ITEM_BOT: {
|
||||
Seperator sep(data);
|
||||
ExportVar(package_name.c_str(), "item_id", extradata);
|
||||
ExportVar(package_name.c_str(), "item_quantity", sep.arg[0]);
|
||||
ExportVar(package_name.c_str(), "slot_id", sep.arg[1]);
|
||||
break;
|
||||
}
|
||||
|
||||
case EVENT_AUGMENT_INSERT_CLIENT:
|
||||
case EVENT_AUGMENT_REMOVE_CLIENT: {
|
||||
Seperator sep(data);
|
||||
@@ -2049,21 +2020,6 @@ void PerlembParser::ExportEventVariables(
|
||||
break;
|
||||
}
|
||||
|
||||
case EVENT_DAMAGE_GIVEN:
|
||||
case EVENT_DAMAGE_TAKEN:{
|
||||
Seperator sep(data);
|
||||
ExportVar(package_name.c_str(), "entity_id", sep.arg[0]);
|
||||
ExportVar(package_name.c_str(), "damage", sep.arg[1]);
|
||||
ExportVar(package_name.c_str(), "spell_id", sep.arg[2]);
|
||||
ExportVar(package_name.c_str(), "skill_id", sep.arg[3]);
|
||||
ExportVar(package_name.c_str(), "is_damage_shield", sep.arg[4]);
|
||||
ExportVar(package_name.c_str(), "is_avoidable", sep.arg[5]);
|
||||
ExportVar(package_name.c_str(), "buff_slot", sep.arg[6]);
|
||||
ExportVar(package_name.c_str(), "is_buff_tic", sep.arg[7]);
|
||||
ExportVar(package_name.c_str(), "special_attack", sep.arg[8]);
|
||||
break;
|
||||
}
|
||||
|
||||
default: {
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -3981,11 +3981,6 @@ int8 Perl__does_augment_fit(EQ::ItemInstance* inst, uint32 augment_id)
|
||||
return quest_manager.DoesAugmentFit(inst, augment_id);
|
||||
}
|
||||
|
||||
int8 Perl__does_augment_fit_slot(EQ::ItemInstance* inst, uint32 augment_id, uint8 augment_slot)
|
||||
{
|
||||
return quest_manager.DoesAugmentFit(inst, augment_id, augment_slot);
|
||||
}
|
||||
|
||||
void perl_register_quest()
|
||||
{
|
||||
perl::interpreter perl(PERL_GET_THX);
|
||||
@@ -4331,8 +4326,7 @@ void perl_register_quest()
|
||||
package.add("doanim", (void(*)(int, int, bool))&Perl__doanim);
|
||||
package.add("doanim", (void(*)(int, int, bool, int))&Perl__doanim);
|
||||
package.add("do_augment_slots_match", &Perl__do_augment_slots_match);
|
||||
package.add("does_augment_fit", (int8(*)(EQ::ItemInstance*, uint32))&Perl__does_augment_fit);
|
||||
package.add("does_augment_fit_slot", (int8(*)(EQ::ItemInstance*, uint32, uint8))&Perl__does_augment_fit_slot);
|
||||
package.add("does_augment_fit", &Perl__does_augment_fit);
|
||||
package.add("echo", &Perl__echo);
|
||||
package.add("emote", &Perl__emote);
|
||||
package.add("enable_proximity_say", &Perl__enable_proximity_say);
|
||||
|
||||
+1
-5
@@ -718,8 +718,6 @@ void EntityList::AddNPC(NPC *npc, bool send_spawn_packet, bool dont_queue)
|
||||
}
|
||||
}
|
||||
|
||||
npc->SendPositionToClients();
|
||||
|
||||
entity_list.ScanCloseMobs(npc->close_mobs, npc, true);
|
||||
|
||||
npc->DispatchZoneControllerEvent(EVENT_SPAWN_ZONE, npc, "", 0, nullptr);
|
||||
@@ -846,10 +844,8 @@ void EntityList::CheckSpawnQueue()
|
||||
NPC *pnpc = it->second;
|
||||
pnpc->SendArmorAppearance();
|
||||
pnpc->SetAppearance(pnpc->GetGuardPointAnim(), false);
|
||||
if (!pnpc->IsTargetable()) {
|
||||
if (!pnpc->IsTargetable())
|
||||
pnpc->SendTargetable(false);
|
||||
}
|
||||
pnpc->SendPositionToClients();
|
||||
}
|
||||
safe_delete(outapp);
|
||||
iterator.RemoveCurrent();
|
||||
|
||||
+14
-15
@@ -67,21 +67,20 @@ public:
|
||||
Entity();
|
||||
virtual ~Entity();
|
||||
|
||||
virtual bool IsClient() const { return false; }
|
||||
virtual bool IsNPC() const { return false; }
|
||||
virtual bool IsMob() const { return false; }
|
||||
virtual bool IsMerc() const { return false; }
|
||||
virtual bool IsCorpse() const { return false; }
|
||||
virtual bool IsPlayerCorpse() const { return false; }
|
||||
virtual bool IsNPCCorpse() const { return false; }
|
||||
virtual bool IsObject() const { return false; }
|
||||
virtual bool IsDoor() const { return false; }
|
||||
virtual bool IsTrap() const { return false; }
|
||||
virtual bool IsBeacon() const { return false; }
|
||||
virtual bool IsEncounter() const { return false; }
|
||||
virtual bool IsBot() const { return false; }
|
||||
virtual bool IsAura() const { return false; }
|
||||
virtual bool IsOfClientBotMerc() const { return false; }
|
||||
virtual bool IsClient() const { return false; }
|
||||
virtual bool IsNPC() const { return false; }
|
||||
virtual bool IsMob() const { return false; }
|
||||
virtual bool IsMerc() const { return false; }
|
||||
virtual bool IsCorpse() const { return false; }
|
||||
virtual bool IsPlayerCorpse() const { return false; }
|
||||
virtual bool IsNPCCorpse() const { return false; }
|
||||
virtual bool IsObject() const { return false; }
|
||||
virtual bool IsDoor() const { return false; }
|
||||
virtual bool IsTrap() const { return false; }
|
||||
virtual bool IsBeacon() const { return false; }
|
||||
virtual bool IsEncounter() const { return false; }
|
||||
virtual bool IsBot() const { return false; }
|
||||
virtual bool IsAura() const { return false; }
|
||||
|
||||
virtual bool Process() { return false; }
|
||||
virtual bool Save() { return true; }
|
||||
|
||||
@@ -114,12 +114,6 @@ typedef enum {
|
||||
EVENT_BOT_CREATE,
|
||||
EVENT_AUGMENT_INSERT_CLIENT,
|
||||
EVENT_AUGMENT_REMOVE_CLIENT,
|
||||
EVENT_EQUIP_ITEM_BOT,
|
||||
EVENT_UNEQUIP_ITEM_BOT,
|
||||
EVENT_DAMAGE_GIVEN,
|
||||
EVENT_DAMAGE_TAKEN,
|
||||
EVENT_ITEM_CLICK_CLIENT,
|
||||
EVENT_ITEM_CLICK_CAST_CLIENT,
|
||||
// Add new events before these or Lua crashes
|
||||
EVENT_SPELL_EFFECT_BOT,
|
||||
EVENT_SPELL_EFFECT_BUFF_TIC_BOT,
|
||||
|
||||
@@ -187,7 +187,7 @@ void DoorManipulation::CommandHandler(Client *c, const Seperator *sep)
|
||||
std::vector<std::string> set_size_options_negative;
|
||||
|
||||
std::vector<std::string> xyz_values = {
|
||||
"0.1", "1", "5", "10", "25", "50", "100"
|
||||
".1", "1", "5", "10", "25", "50", "100"
|
||||
};
|
||||
|
||||
// build positive options x/y/z
|
||||
|
||||
+37
-11
@@ -34,10 +34,12 @@ void command_list(Client *c, const Seperator *sep)
|
||||
std::string search_string;
|
||||
|
||||
if (sep->arg[2]) {
|
||||
search_string = Strings::ToLower(sep->arg[2]);
|
||||
search_string = sep->arg[2];
|
||||
}
|
||||
|
||||
// NPC
|
||||
/**
|
||||
* NPC
|
||||
*/
|
||||
if (search_type.find("npcs") != std::string::npos) {
|
||||
auto &entity_list_search = entity_list.GetMobList();
|
||||
|
||||
@@ -49,7 +51,11 @@ void command_list(Client *c, const Seperator *sep)
|
||||
|
||||
entity_count++;
|
||||
|
||||
std::string entity_name = Strings::ToLower(entity->GetName());
|
||||
std::string entity_name = entity->GetName();
|
||||
|
||||
/**
|
||||
* Filter by name
|
||||
*/
|
||||
if (search_string.length() > 0 && entity_name.find(search_string) == std::string::npos) {
|
||||
continue;
|
||||
}
|
||||
@@ -75,7 +81,9 @@ void command_list(Client *c, const Seperator *sep)
|
||||
}
|
||||
}
|
||||
|
||||
// Client
|
||||
/**
|
||||
* Client
|
||||
*/
|
||||
if (search_type.find("players") != std::string::npos) {
|
||||
auto &entity_list_search = entity_list.GetClientList();
|
||||
|
||||
@@ -84,7 +92,7 @@ void command_list(Client *c, const Seperator *sep)
|
||||
|
||||
entity_count++;
|
||||
|
||||
std::string entity_name = Strings::ToLower(entity->GetName());
|
||||
std::string entity_name = entity->GetName();
|
||||
|
||||
/**
|
||||
* Filter by name
|
||||
@@ -114,7 +122,9 @@ void command_list(Client *c, const Seperator *sep)
|
||||
}
|
||||
}
|
||||
|
||||
// Corpse
|
||||
/**
|
||||
* Corpse
|
||||
*/
|
||||
if (search_type.find("corpses") != std::string::npos) {
|
||||
auto &entity_list_search = entity_list.GetCorpseList();
|
||||
|
||||
@@ -123,7 +133,11 @@ void command_list(Client *c, const Seperator *sep)
|
||||
|
||||
entity_count++;
|
||||
|
||||
std::string entity_name = Strings::ToLower(entity->GetName());
|
||||
std::string entity_name = entity->GetName();
|
||||
|
||||
/**
|
||||
* Filter by name
|
||||
*/
|
||||
if (search_string.length() > 0 && entity_name.find(search_string) == std::string::npos) {
|
||||
continue;
|
||||
}
|
||||
@@ -149,7 +163,9 @@ void command_list(Client *c, const Seperator *sep)
|
||||
}
|
||||
}
|
||||
|
||||
// Doors
|
||||
/**
|
||||
* Doors
|
||||
*/
|
||||
if (search_type.find("doors") != std::string::npos) {
|
||||
auto &entity_list_search = entity_list.GetDoorsList();
|
||||
|
||||
@@ -158,7 +174,11 @@ void command_list(Client *c, const Seperator *sep)
|
||||
|
||||
entity_count++;
|
||||
|
||||
std::string entity_name = Strings::ToLower(entity->GetDoorName());
|
||||
std::string entity_name = entity->GetDoorName();
|
||||
|
||||
/**
|
||||
* Filter by name
|
||||
*/
|
||||
if (search_string.length() > 0 && entity_name.find(search_string) == std::string::npos) {
|
||||
continue;
|
||||
}
|
||||
@@ -185,7 +205,9 @@ void command_list(Client *c, const Seperator *sep)
|
||||
}
|
||||
}
|
||||
|
||||
// Objects
|
||||
/**
|
||||
* Objects
|
||||
*/
|
||||
if (search_type.find("objects") != std::string::npos) {
|
||||
auto &entity_list_search = entity_list.GetObjectList();
|
||||
|
||||
@@ -194,7 +216,11 @@ void command_list(Client *c, const Seperator *sep)
|
||||
|
||||
entity_count++;
|
||||
|
||||
std::string entity_name = Strings::ToLower(entity->GetModelName());
|
||||
std::string entity_name = entity->GetModelName();
|
||||
|
||||
/**
|
||||
* Filter by name
|
||||
*/
|
||||
if (search_string.length() > 0 && entity_name.find(search_string) == std::string::npos) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -29,7 +29,6 @@ void command_loc(Client *c, const Seperator *sep)
|
||||
glm::vec3 hit;
|
||||
|
||||
auto best_z = zone->zonemap->FindBestZ(tarloc, &hit);
|
||||
auto fixed_z = c->GetFixedZ(c->GetPosition());
|
||||
|
||||
if (best_z != BEST_Z_INVALID) {
|
||||
c->Message(
|
||||
@@ -40,14 +39,6 @@ void command_loc(Client *c, const Seperator *sep)
|
||||
best_z
|
||||
).c_str()
|
||||
);
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Fixed Z for {} | {:.2f}",
|
||||
c->GetTargetDescription(target, TargetDescriptionType::UCSelf),
|
||||
fixed_z
|
||||
).c_str()
|
||||
);
|
||||
} else {
|
||||
c->Message(Chat::White, "Could not find Best Z.");
|
||||
}
|
||||
|
||||
@@ -536,14 +536,14 @@ void command_npcedit(Client *c, const Seperator *sep)
|
||||
} else if (!strcasecmp(sep->arg[1], "weapon")) {
|
||||
if (sep->IsNumber(2)) {
|
||||
auto primary_model = std::stoul(sep->arg[2]);
|
||||
uint32_t secondary_model = sep->arg[3] && sep->IsNumber(3) ? std::stoul(sep->arg[3]) : 0;
|
||||
uint32_t secondary_model = sep->IsNumber(3) ? std::stoul(sep->arg[3]) : 0;
|
||||
n.d_melee_texture1 = primary_model;
|
||||
n.d_melee_texture2 = secondary_model;
|
||||
d = fmt::format(
|
||||
"{} will have Model {} set to their Primary and Model {} set to their Secondary on repop.",
|
||||
npc_id_string,
|
||||
Strings::Commify(sep->arg[2]),
|
||||
sep->arg[3] && sep->IsNumber(3) ? Strings::Commify(sep->arg[3]) : 0
|
||||
sep->IsNumber(3) ? Strings::Commify(sep->arg[3]) : 0
|
||||
);
|
||||
} else {
|
||||
c->Message(
|
||||
|
||||
@@ -22,6 +22,10 @@ void command_weather(Client *c, const Seperator *sep)
|
||||
weather_message = "Raindrops begin to fall from the sky.";
|
||||
new_weather = EQ::constants::WeatherTypes::Raining;
|
||||
new_intensity = 0x01; // This is how it's done in Fear, and you can see a decent distance with it at this value
|
||||
} else {
|
||||
c->Message(Chat::White, "Usage: #weather [0|1|2] - [Off|Rain|Snow]");
|
||||
c->Message(Chat::White, "Usage: #weather 3 [Type] [Intensity] - Manually set weather type and intensity");
|
||||
return;
|
||||
}
|
||||
|
||||
zone->zone_weather = new_weather;
|
||||
|
||||
@@ -714,15 +714,6 @@ bool Client::SummonItem(uint32 item_id, int16 charges, uint32 aug1, uint32 aug2,
|
||||
// in any other situation just use charges as passed
|
||||
|
||||
EQ::ItemInstance* inst = database.CreateItem(item, charges);
|
||||
auto timestamps = database.GetItemRecastTimestamps(CharacterID());
|
||||
const auto* d = inst->GetItem();
|
||||
if (d->RecastDelay) {
|
||||
if (d->RecastType != RECAST_TYPE_UNLINKED_ITEM) {
|
||||
inst->SetRecastTimestamp(timestamps.count(d->RecastType) ? timestamps.at(d->RecastType) : 0);
|
||||
} else {
|
||||
inst->SetRecastTimestamp(timestamps.count(d->ID) ? timestamps.at(d->ID) : 0);
|
||||
}
|
||||
}
|
||||
|
||||
if(inst == nullptr) {
|
||||
Message(Chat::Red, "An unknown server error has occurred and your item was not created.");
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
#include "lua_iteminst.h"
|
||||
#include "lua_mob.h"
|
||||
#include "lua_group.h"
|
||||
#include "lua_item.h"
|
||||
|
||||
void Lua_Bot::AddBotItem(uint16 slot_id, uint32 item_id) {
|
||||
Lua_Safe_Call_Void();
|
||||
@@ -394,66 +393,6 @@ void Lua_Bot::SendSpellAnim(uint16 target_id, uint16 spell_id)
|
||||
self->SendSpellAnim(target_id, spell_id);
|
||||
}
|
||||
|
||||
luabind::object Lua_Bot::GetAugmentIDsBySlotID(lua_State* L, int16 slot_id) const {
|
||||
auto lua_table = luabind::newtable(L);
|
||||
if (d_) {
|
||||
auto self = reinterpret_cast<NativeType*>(d_);
|
||||
auto augments = self->GetInv().GetAugmentIDsBySlotID(slot_id);
|
||||
int index = 1;
|
||||
for (auto item_id : augments) {
|
||||
lua_table[index] = item_id;
|
||||
index++;
|
||||
}
|
||||
}
|
||||
return lua_table;
|
||||
}
|
||||
|
||||
void Lua_Bot::AddItem(const luabind::object& item_table) {
|
||||
Lua_Safe_Call_Void();
|
||||
if (luabind::type(item_table) != LUA_TTABLE) {
|
||||
return;
|
||||
}
|
||||
|
||||
auto item_id = luabind::object_cast<uint32>(item_table["item_id"]);
|
||||
int16 charges = luabind::object_cast<uint32>(item_table["charges"]);
|
||||
uint32 augment_one = luabind::type(item_table["augment_one"]) != LUA_TNIL ? luabind::object_cast<uint32>(item_table["augment_one"]) : 0;
|
||||
uint32 augment_two = luabind::type(item_table["augment_two"]) != LUA_TNIL ? luabind::object_cast<uint32>(item_table["augment_two"]) : 0;
|
||||
uint32 augment_three = luabind::type(item_table["augment_three"]) != LUA_TNIL ? luabind::object_cast<uint32>(item_table["augment_three"]) : 0;
|
||||
uint32 augment_four = luabind::type(item_table["augment_four"]) != LUA_TNIL ? luabind::object_cast<uint32>(item_table["augment_four"]) : 0;
|
||||
uint32 augment_five = luabind::type(item_table["augment_five"]) != LUA_TNIL ? luabind::object_cast<uint32>(item_table["augment_five"]) : 0;
|
||||
uint32 augment_six = luabind::type(item_table["augment_six"]) != LUA_TNIL ? luabind::object_cast<uint32>(item_table["augment_six"]) : 0;
|
||||
bool attuned = luabind::type(item_table["attuned"]) != LUA_TNIL ? luabind::object_cast<bool>(item_table["attuned"]) : false;
|
||||
uint16 slot_id = luabind::type(item_table["slot_id"]) != LUA_TNIL ? luabind::object_cast<uint16>(item_table["slot_id"]) : EQ::invslot::slotCursor;
|
||||
|
||||
if (slot_id <= EQ::invslot::slotAmmo) {
|
||||
self->AddBotItem(
|
||||
slot_id,
|
||||
item_id,
|
||||
charges,
|
||||
attuned,
|
||||
augment_one,
|
||||
augment_two,
|
||||
augment_three,
|
||||
augment_four,
|
||||
augment_five,
|
||||
augment_six
|
||||
);
|
||||
} else {
|
||||
self->GetOwner()->CastToClient()->SummonItem(
|
||||
item_id,
|
||||
charges,
|
||||
augment_one,
|
||||
augment_two,
|
||||
augment_three,
|
||||
augment_four,
|
||||
augment_five,
|
||||
augment_six,
|
||||
attuned,
|
||||
slot_id
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
luabind::scope lua_register_bot() {
|
||||
return luabind::class_<Lua_Bot, Lua_Mob>("Bot")
|
||||
.def(luabind::constructor<>())
|
||||
@@ -466,7 +405,6 @@ luabind::scope lua_register_bot() {
|
||||
.def("AddBotItem", (void(Lua_Bot::*)(uint16,uint32,int16,bool,uint32,uint32,uint32,uint32))&Lua_Bot::AddBotItem)
|
||||
.def("AddBotItem", (void(Lua_Bot::*)(uint16,uint32,int16,bool,uint32,uint32,uint32,uint32,uint32))&Lua_Bot::AddBotItem)
|
||||
.def("AddBotItem", (void(Lua_Bot::*)(uint16,uint32,int16,bool,uint32,uint32,uint32,uint32,uint32,uint32))&Lua_Bot::AddBotItem)
|
||||
.def("AddItem", (void(Lua_Bot::*)(luabind::adl::object))&Lua_Bot::AddItem)
|
||||
.def("ApplySpell", (void(Lua_Bot::*)(int))&Lua_Bot::ApplySpell)
|
||||
.def("ApplySpell", (void(Lua_Bot::*)(int,int))&Lua_Bot::ApplySpell)
|
||||
.def("ApplySpell", (void(Lua_Bot::*)(int,int,bool))&Lua_Bot::ApplySpell)
|
||||
@@ -486,7 +424,6 @@ luabind::scope lua_register_bot() {
|
||||
.def("Fling", (void(Lua_Bot::*)(float,float,float,float,bool,bool))&Lua_Bot::Fling)
|
||||
.def("GetAugmentAt", (Lua_ItemInst(Lua_Bot::*)(int16,uint8))&Lua_Bot::GetAugmentAt)
|
||||
.def("GetAugmentIDAt", (int(Lua_Bot::*)(int16,uint8))&Lua_Bot::GetAugmentIDAt)
|
||||
.def("GetAugmentIDsBySlotID", (luabind::object(Lua_Bot::*)(lua_State* L,int16))&Lua_Bot::GetAugmentIDsBySlotID)
|
||||
.def("GetBaseAGI", (int(Lua_Bot::*)(void))&Lua_Bot::GetBaseAGI)
|
||||
.def("GetBaseCHA", (int(Lua_Bot::*)(void))&Lua_Bot::GetBaseCHA)
|
||||
.def("GetBaseDEX", (int(Lua_Bot::*)(void))&Lua_Bot::GetBaseDEX)
|
||||
|
||||
@@ -8,7 +8,6 @@ class Bot;
|
||||
class Lua_Bot;
|
||||
class Lua_Mob;
|
||||
class Lua_Group;
|
||||
class Lua_Inventory;
|
||||
|
||||
namespace luabind {
|
||||
struct scope;
|
||||
@@ -37,7 +36,6 @@ public:
|
||||
void AddBotItem(uint16 slot_id, uint32 item_id, int16 charges, bool attuned, uint32 augment_one, uint32 augment_two, uint32 augment_three, uint32 augment_four);
|
||||
void AddBotItem(uint16 slot_id, uint32 item_id, int16 charges, bool attuned, uint32 augment_one, uint32 augment_two, uint32 augment_three, uint32 augment_four, uint32 augment_five);
|
||||
void AddBotItem(uint16 slot_id, uint32 item_id, int16 charges, bool attuned, uint32 augment_one, uint32 augment_two, uint32 augment_three, uint32 augment_four, uint32 augment_five, uint32 augment_six);
|
||||
void AddItem(const luabind::object& item_table);
|
||||
uint32 CountBotItem(uint32 item_id);
|
||||
Lua_ItemInst GetBotItem(uint16 slot_id);
|
||||
uint32 GetBotItemIDBySlot(uint16 slot_id);
|
||||
@@ -61,7 +59,6 @@ public:
|
||||
void Camp(bool save_to_database);
|
||||
Lua_ItemInst GetAugmentAt(int16 slot_id, uint8 augment_index);
|
||||
int GetAugmentIDAt(int16 slot_id, uint8 augment_index);
|
||||
luabind::object GetAugmentIDsBySlotID(lua_State* L, int16 slot_id) const;
|
||||
Lua_ItemInst GetItemAt(int16 slot_id);
|
||||
int GetItemIDAt(int16 slot_id);
|
||||
void SendSpellAnim(uint16 target_id, uint16 spell_id);
|
||||
|
||||
@@ -3014,30 +3014,6 @@ void Lua_Client::CampAllBots(uint8 class_id)
|
||||
self->CampAllBots(class_id);
|
||||
}
|
||||
|
||||
void Lua_Client::ResetItemCooldown(uint32 item_id)
|
||||
{
|
||||
Lua_Safe_Call_Void();
|
||||
self->ResetItemCooldown(item_id);
|
||||
}
|
||||
|
||||
void Lua_Client::SetItemCooldown(uint32 item_id, uint32 in_time)
|
||||
{
|
||||
Lua_Safe_Call_Void();
|
||||
self->SetItemCooldown(item_id, false, in_time);
|
||||
}
|
||||
|
||||
uint32 Lua_Client::GetItemCooldown(uint32 item_id)
|
||||
{
|
||||
Lua_Safe_Call_Int();
|
||||
return self->GetItemCooldown(item_id);
|
||||
}
|
||||
|
||||
void Lua_Client::UseAugmentContainer(int container_slot)
|
||||
{
|
||||
Lua_Safe_Call_Void();
|
||||
self->UseAugmentContainer(container_slot);
|
||||
}
|
||||
|
||||
luabind::scope lua_register_client() {
|
||||
return luabind::class_<Lua_Client, Lua_Mob>("Client")
|
||||
.def(luabind::constructor<>())
|
||||
@@ -3228,7 +3204,6 @@ luabind::scope lua_register_client() {
|
||||
.def("GetInventory", (Lua_Inventory(Lua_Client::*)(void))&Lua_Client::GetInventory)
|
||||
.def("GetInvulnerableEnvironmentDamage", (bool(Lua_Client::*)(void))&Lua_Client::GetInvulnerableEnvironmentDamage)
|
||||
.def("GetItemIDAt", (int(Lua_Client::*)(int))&Lua_Client::GetItemIDAt)
|
||||
.def("GetItemCooldown", (uint32(Lua_Client::*)(uint32))&Lua_Client::GetItemCooldown)
|
||||
.def("GetLDoNLosses", (int(Lua_Client::*)(void))&Lua_Client::GetLDoNLosses)
|
||||
.def("GetLDoNLossesTheme", (int(Lua_Client::*)(int))&Lua_Client::GetLDoNLossesTheme)
|
||||
.def("GetLDoNPointsTheme", (int(Lua_Client::*)(int))&Lua_Client::GetLDoNPointsTheme)
|
||||
@@ -3398,7 +3373,6 @@ luabind::scope lua_register_client() {
|
||||
.def("ResetCastbarCooldownBySlot", (void(Lua_Client::*)(int))&Lua_Client::ResetCastbarCooldownBySlot)
|
||||
.def("ResetCastbarCooldownBySpellID", (void(Lua_Client::*)(uint32))&Lua_Client::ResetCastbarCooldownBySpellID)
|
||||
.def("ResetDisciplineTimer", (void(Lua_Client::*)(uint32))&Lua_Client::ResetDisciplineTimer)
|
||||
.def("ResetItemCooldown", (void(Lua_Client::*)(uint32))&Lua_Client::ResetItemCooldown)
|
||||
.def("ResetTrade", (void(Lua_Client::*)(void))&Lua_Client::ResetTrade)
|
||||
.def("RewardFaction", (void(Lua_Client::*)(int,int))&Lua_Client::RewardFaction)
|
||||
.def("Save", (void(Lua_Client::*)(int))&Lua_Client::Save)
|
||||
@@ -3473,7 +3447,6 @@ luabind::scope lua_register_client() {
|
||||
.def("SetHunger", (void(Lua_Client::*)(int))&Lua_Client::SetHunger)
|
||||
.def("SetInvulnerableEnvironmentDamage", (void(Lua_Client::*)(int))&Lua_Client::SetInvulnerableEnvironmentDamage)
|
||||
.def("SetIPExemption", (void(Lua_Client::*)(int))&Lua_Client::SetIPExemption)
|
||||
.def("SetItemCooldown", (void(Lua_Client::*)(uint32,uint32))&Lua_Client::SetItemCooldown)
|
||||
.def("SetLanguageSkill", (void(Lua_Client::*)(int,int))&Lua_Client::SetLanguageSkill)
|
||||
.def("SetMaterial", (void(Lua_Client::*)(int,uint32))&Lua_Client::SetMaterial)
|
||||
.def("SetPEQZoneFlag", (void(Lua_Client::*)(uint32))&Lua_Client::SetPEQZoneFlag)
|
||||
@@ -3559,7 +3532,6 @@ luabind::scope lua_register_client() {
|
||||
.def("UpdateLDoNPoints", (void(Lua_Client::*)(uint32,int))&Lua_Client::UpdateLDoNPoints)
|
||||
.def("UpdateTaskActivity", (void(Lua_Client::*)(int,int,int))&Lua_Client::UpdateTaskActivity)
|
||||
.def("UseDiscipline", (bool(Lua_Client::*)(int,int))&Lua_Client::UseDiscipline)
|
||||
.def("UseAugmentContainer", (void(Lua_Client::*)(int))&Lua_Client::UseAugmentContainer)
|
||||
.def("WorldKick", (void(Lua_Client::*)(void))&Lua_Client::WorldKick);
|
||||
}
|
||||
|
||||
|
||||
@@ -462,10 +462,6 @@ public:
|
||||
bool CanEnterZone(std::string zone_short_name);
|
||||
bool CanEnterZone(std::string zone_short_name, int16 instance_version);
|
||||
void SendPath(Lua_Mob target);
|
||||
void ResetItemCooldown(uint32 item_id);
|
||||
void SetItemCooldown(uint32 item_id, uint32 in_time);
|
||||
uint32 GetItemCooldown(uint32 item_id);
|
||||
void UseAugmentContainer(int container_slot);
|
||||
|
||||
void ApplySpell(int spell_id);
|
||||
void ApplySpell(int spell_id, int duration);
|
||||
|
||||
+2
-14
@@ -3700,11 +3700,6 @@ int8 lua_does_augment_fit(Lua_ItemInst inst, uint32 augment_id)
|
||||
return quest_manager.DoesAugmentFit(inst, augment_id);
|
||||
}
|
||||
|
||||
int8 lua_does_augment_fit_slot(Lua_ItemInst inst, uint32 augment_id, uint8 augment_slot)
|
||||
{
|
||||
return quest_manager.DoesAugmentFit(inst, augment_id, augment_slot);
|
||||
}
|
||||
|
||||
#define LuaCreateNPCParse(name, c_type, default_value) do { \
|
||||
cur = table[#name]; \
|
||||
if(luabind::type(cur) != LUA_TNIL) { \
|
||||
@@ -4222,8 +4217,7 @@ luabind::scope lua_register_general() {
|
||||
luabind::def("do_anim", (void(*)(int,int,bool))&lua_do_anim),
|
||||
luabind::def("do_anim", (void(*)(int,int,bool,int))&lua_do_anim),
|
||||
luabind::def("do_augment_slots_match", &lua_do_augment_slots_match),
|
||||
luabind::def("does_augment_fit", (int8(*)(Lua_ItemInst, uint32))&lua_does_augment_fit),
|
||||
luabind::def("does_augment_fit_slot", (int8(*)(Lua_ItemInst, uint32, uint8))&lua_does_augment_fit_slot),
|
||||
luabind::def("does_augment_fit", &lua_does_augment_fit),
|
||||
/*
|
||||
Cross Zone
|
||||
*/
|
||||
@@ -4631,13 +4625,7 @@ luabind::scope lua_register_events() {
|
||||
luabind::value("despawn_zone", static_cast<int>(EVENT_DESPAWN_ZONE)),
|
||||
luabind::value("bot_create", static_cast<int>(EVENT_BOT_CREATE)),
|
||||
luabind::value("augment_insert_client", static_cast<int>(EVENT_AUGMENT_INSERT_CLIENT)),
|
||||
luabind::value("augment_remove_client", static_cast<int>(EVENT_AUGMENT_REMOVE_CLIENT)),
|
||||
luabind::value("equip_item_bot", static_cast<int>(EVENT_EQUIP_ITEM_BOT)),
|
||||
luabind::value("unequip_item_bot", static_cast<int>(EVENT_UNEQUIP_ITEM_BOT)),
|
||||
luabind::value("damage_given", static_cast<int>(EVENT_DAMAGE_GIVEN)),
|
||||
luabind::value("damage_taken", static_cast<int>(EVENT_DAMAGE_TAKEN)),
|
||||
luabind::value("item_click_client", static_cast<int>(EVENT_ITEM_CLICK_CLIENT)),
|
||||
luabind::value("item_click_cast_client", static_cast<int>(EVENT_ITEM_CLICK_CAST_CLIENT))
|
||||
luabind::value("augment_remove_client", static_cast<int>(EVENT_AUGMENT_REMOVE_CLIENT))
|
||||
)];
|
||||
}
|
||||
|
||||
|
||||
+6
-85
@@ -573,6 +573,12 @@ void Lua_NPC::RecalculateSkills()
|
||||
self->RecalculateSkills();
|
||||
}
|
||||
|
||||
void Lua_NPC::ScaleNPC(uint8 npc_level)
|
||||
{
|
||||
Lua_Safe_Call_Void();
|
||||
self->ScaleNPC(npc_level);
|
||||
}
|
||||
|
||||
bool Lua_NPC::IsRaidTarget()
|
||||
{
|
||||
Lua_Safe_Call_Bool();
|
||||
@@ -695,78 +701,6 @@ void Lua_NPC::SetKeepsSoldItems(bool keeps_sold_items) {
|
||||
self->SetKeepsSoldItems(keeps_sold_items);
|
||||
}
|
||||
|
||||
bool Lua_NPC::IsLDoNTrapped() {
|
||||
Lua_Safe_Call_Bool();
|
||||
return self->IsLDoNTrapped();
|
||||
}
|
||||
|
||||
void Lua_NPC::SetLDoNTrapped(bool is_trapped) {
|
||||
Lua_Safe_Call_Void();
|
||||
self->SetLDoNTrapped(is_trapped);
|
||||
}
|
||||
|
||||
uint8 Lua_NPC::GetLDoNTrapType() {
|
||||
Lua_Safe_Call_Int();
|
||||
return self->GetLDoNTrapType();
|
||||
}
|
||||
|
||||
void Lua_NPC::SetLDoNTrapType(uint8 trap_type) {
|
||||
Lua_Safe_Call_Void();
|
||||
self->SetLDoNTrapType(trap_type);
|
||||
}
|
||||
|
||||
uint16 Lua_NPC::GetLDoNTrapSpellID() {
|
||||
Lua_Safe_Call_Int();
|
||||
return self->GetLDoNTrapSpellID();
|
||||
}
|
||||
|
||||
void Lua_NPC::SetLDoNTrapSpellID(uint16 spell_id) {
|
||||
Lua_Safe_Call_Void();
|
||||
self->SetLDoNTrapSpellID(spell_id);
|
||||
}
|
||||
|
||||
bool Lua_NPC::IsLDoNLocked() {
|
||||
Lua_Safe_Call_Bool();
|
||||
return self->IsLDoNLocked();
|
||||
}
|
||||
|
||||
void Lua_NPC::SetLDoNLocked(bool is_locked) {
|
||||
Lua_Safe_Call_Void();
|
||||
self->SetLDoNLocked(is_locked);
|
||||
}
|
||||
|
||||
uint16 Lua_NPC::GetLDoNLockedSkill() {
|
||||
Lua_Safe_Call_Int();
|
||||
return self->GetLDoNLockedSkill();
|
||||
}
|
||||
|
||||
void Lua_NPC::SetLDoNLockedSkill(uint16 skill_value) {
|
||||
Lua_Safe_Call_Void();
|
||||
self->SetLDoNLockedSkill(skill_value);
|
||||
}
|
||||
|
||||
bool Lua_NPC::IsLDoNTrapDetected() {
|
||||
Lua_Safe_Call_Bool();
|
||||
return self->IsLDoNTrapDetected();
|
||||
}
|
||||
|
||||
void Lua_NPC::SetLDoNTrapDetected(bool is_detected) {
|
||||
Lua_Safe_Call_Void();
|
||||
self->SetLDoNTrapDetected(is_detected);
|
||||
}
|
||||
|
||||
void Lua_NPC::ScaleNPC(uint8 npc_level)
|
||||
{
|
||||
Lua_Safe_Call_Void();
|
||||
self->ScaleNPC(npc_level);
|
||||
}
|
||||
|
||||
void Lua_NPC::ScaleNPC(uint8 npc_level, bool override_special_abilities)
|
||||
{
|
||||
Lua_Safe_Call_Void();
|
||||
self->ScaleNPC(npc_level, true, override_special_abilities);
|
||||
}
|
||||
|
||||
luabind::scope lua_register_npc() {
|
||||
return luabind::class_<Lua_NPC, Lua_Mob>("NPC")
|
||||
.def(luabind::constructor<>())
|
||||
@@ -819,9 +753,6 @@ luabind::scope lua_register_npc() {
|
||||
.def("GetMaxDamage", (uint32(Lua_NPC::*)(int))&Lua_NPC::GetMaxDamage)
|
||||
.def("GetMaxWp", (int(Lua_NPC::*)(void))&Lua_NPC::GetMaxWp)
|
||||
.def("GetMinDMG", (uint32(Lua_NPC::*)(void))&Lua_NPC::GetMinDMG)
|
||||
.def("GetLDoNLockedSkill", (uint16(Lua_NPC::*)(void))&Lua_NPC::GetLDoNLockedSkill)
|
||||
.def("GetLDoNTrapType", (uint8(Lua_NPC::*)(void))&Lua_NPC::GetLDoNTrapType)
|
||||
.def("GetLDoNTrapSpellID", (uint16(Lua_NPC::*)(void))&Lua_NPC::GetLDoNTrapSpellID)
|
||||
.def("GetNPCFactionID", (int(Lua_NPC::*)(void))&Lua_NPC::GetNPCFactionID)
|
||||
.def("GetNPCHate", (int64(Lua_NPC::*)(Lua_Mob))&Lua_NPC::GetNPCHate)
|
||||
.def("GetNPCSpellsID", (int(Lua_NPC::*)(void))&Lua_NPC::GetNPCSpellsID)
|
||||
@@ -853,9 +784,6 @@ luabind::scope lua_register_npc() {
|
||||
.def("HasItem", (bool(Lua_NPC::*)(uint32))&Lua_NPC::HasItem)
|
||||
.def("IsAnimal", (bool(Lua_NPC::*)(void))&Lua_NPC::IsAnimal)
|
||||
.def("IsGuarding", (bool(Lua_NPC::*)(void))&Lua_NPC::IsGuarding)
|
||||
.def("IsLDoNLocked", (bool(Lua_NPC::*)(void))&Lua_NPC::IsLDoNLocked)
|
||||
.def("IsLDoNTrapped", (bool(Lua_NPC::*)(void))&Lua_NPC::IsLDoNTrapped)
|
||||
.def("IsLDoNTrapDetected", (bool(Lua_NPC::*)(void))&Lua_NPC::IsLDoNTrapDetected)
|
||||
.def("IsOnHatelist", (bool(Lua_NPC::*)(Lua_Mob))&Lua_NPC::IsOnHatelist)
|
||||
.def("IsRaidTarget", (bool(Lua_NPC::*)(void))&Lua_NPC::IsRaidTarget)
|
||||
.def("IsRareSpawn", (bool(Lua_NPC::*)(void))&Lua_NPC::IsRareSpawn)
|
||||
@@ -880,7 +808,6 @@ luabind::scope lua_register_npc() {
|
||||
.def("SaveGuardSpot", (void(Lua_NPC::*)(bool))&Lua_NPC::SaveGuardSpot)
|
||||
.def("SaveGuardSpot", (void(Lua_NPC::*)(float,float,float,float))&Lua_NPC::SaveGuardSpot)
|
||||
.def("ScaleNPC", (void(Lua_NPC::*)(uint8))&Lua_NPC::ScaleNPC)
|
||||
.def("ScaleNPC", (void(Lua_NPC::*)(uint8,bool))&Lua_NPC::ScaleNPC)
|
||||
.def("SendPayload", (void(Lua_NPC::*)(int))&Lua_NPC::SendPayload)
|
||||
.def("SendPayload", (void(Lua_NPC::*)(int,std::string))&Lua_NPC::SendPayload)
|
||||
.def("SetCopper", (void(Lua_NPC::*)(uint32))&Lua_NPC::SetCopper)
|
||||
@@ -890,12 +817,6 @@ luabind::scope lua_register_npc() {
|
||||
.def("SetGold", (void(Lua_NPC::*)(uint32))&Lua_NPC::SetGold)
|
||||
.def("SetGrid", (void(Lua_NPC::*)(int))&Lua_NPC::SetGrid)
|
||||
.def("SetKeepsSoldItems", (void(Lua_NPC::*)(bool))&Lua_NPC::SetKeepsSoldItems)
|
||||
.def("SetLDoNLocked", (void(Lua_NPC::*)(bool))&Lua_NPC::SetLDoNLocked)
|
||||
.def("SetLDoNLockedSkill", (void(Lua_NPC::*)(uint16))&Lua_NPC::SetLDoNLockedSkill)
|
||||
.def("SetLDoNTrapped", (void(Lua_NPC::*)(bool))&Lua_NPC::SetLDoNTrapped)
|
||||
.def("SetLDoNTrapDetected", (void(Lua_NPC::*)(bool))&Lua_NPC::SetLDoNTrapDetected)
|
||||
.def("SetLDoNTrapSpellID", (void(Lua_NPC::*)(uint16))&Lua_NPC::SetLDoNTrapSpellID)
|
||||
.def("SetLDoNTrapType", (void(Lua_NPC::*)(uint8))&Lua_NPC::SetLDoNTrapType)
|
||||
.def("SetNPCFactionID", (void(Lua_NPC::*)(int))&Lua_NPC::SetNPCFactionID)
|
||||
.def("SetPetSpellID", (void(Lua_NPC::*)(int))&Lua_NPC::SetPetSpellID)
|
||||
.def("SetPlatinum", (void(Lua_NPC::*)(uint32))&Lua_NPC::SetPlatinum)
|
||||
|
||||
+1
-14
@@ -141,6 +141,7 @@ public:
|
||||
void SetSimpleRoamBox(float box_size, float move_distance, int move_delay);
|
||||
void RecalculateSkills();
|
||||
void ReloadSpells();
|
||||
void ScaleNPC(uint8 npc_level);
|
||||
bool IsRaidTarget();
|
||||
bool IsRareSpawn();
|
||||
void ChangeLastName(std::string last_name);
|
||||
@@ -160,20 +161,6 @@ public:
|
||||
void SendPayload(int payload_id, std::string payload_value);
|
||||
bool GetKeepsSoldItems();
|
||||
void SetKeepsSoldItems(bool keeps_sold_items);
|
||||
bool IsLDoNTrapped();
|
||||
void SetLDoNTrapped(bool is_trapped);
|
||||
uint8 GetLDoNTrapType();
|
||||
void SetLDoNTrapType(uint8 trap_type);
|
||||
uint16 GetLDoNTrapSpellID();
|
||||
void SetLDoNTrapSpellID(uint16 spell_id);
|
||||
bool IsLDoNLocked();
|
||||
void SetLDoNLocked(bool is_locked);
|
||||
uint16 GetLDoNLockedSkill();
|
||||
void SetLDoNLockedSkill(uint16 skill_value);
|
||||
bool IsLDoNTrapDetected();
|
||||
void SetLDoNTrapDetected(bool is_detected);
|
||||
void ScaleNPC(uint8 npc_level);
|
||||
void ScaleNPC(uint8 npc_level, bool override_special_abilities);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
+123
-140
@@ -156,12 +156,6 @@ const char *LuaEvents[_LargestEventID] = {
|
||||
"event_bot_create",
|
||||
"event_augment_insert_client",
|
||||
"event_augment_remove_client",
|
||||
"event_equip_item_bot",
|
||||
"event_unequip_item_bot",
|
||||
"event_damage_given",
|
||||
"event_damage_taken",
|
||||
"event_item_click_client",
|
||||
"event_item_click_cast_client"
|
||||
};
|
||||
|
||||
extern Zone *zone;
|
||||
@@ -177,154 +171,143 @@ std::map<std::string, bool> lua_encounters_loaded;
|
||||
std::map<std::string, Encounter *> lua_encounters;
|
||||
|
||||
LuaParser::LuaParser() {
|
||||
for (int i = 0; i < _LargestEventID; ++i) {
|
||||
NPCArgumentDispatch[i] = handle_npc_null;
|
||||
PlayerArgumentDispatch[i] = handle_player_null;
|
||||
ItemArgumentDispatch[i] = handle_item_null;
|
||||
SpellArgumentDispatch[i] = handle_spell_null;
|
||||
for(int i = 0; i < _LargestEventID; ++i) {
|
||||
NPCArgumentDispatch[i] = handle_npc_null;
|
||||
PlayerArgumentDispatch[i] = handle_player_null;
|
||||
ItemArgumentDispatch[i] = handle_item_null;
|
||||
SpellArgumentDispatch[i] = handle_spell_null;
|
||||
EncounterArgumentDispatch[i] = handle_encounter_null;
|
||||
BotArgumentDispatch[i] = handle_bot_null;
|
||||
BotArgumentDispatch[i] = handle_bot_null;
|
||||
}
|
||||
|
||||
NPCArgumentDispatch[EVENT_SAY] = handle_npc_event_say;
|
||||
NPCArgumentDispatch[EVENT_AGGRO_SAY] = handle_npc_event_say;
|
||||
NPCArgumentDispatch[EVENT_PROXIMITY_SAY] = handle_npc_event_say;
|
||||
NPCArgumentDispatch[EVENT_TRADE] = handle_npc_event_trade;
|
||||
NPCArgumentDispatch[EVENT_HP] = handle_npc_event_hp;
|
||||
NPCArgumentDispatch[EVENT_TARGET_CHANGE] = handle_npc_single_mob;
|
||||
NPCArgumentDispatch[EVENT_CAST_ON] = handle_npc_cast;
|
||||
NPCArgumentDispatch[EVENT_KILLED_MERIT] = handle_npc_single_client;
|
||||
NPCArgumentDispatch[EVENT_SLAY] = handle_npc_single_mob;
|
||||
NPCArgumentDispatch[EVENT_ENTER] = handle_npc_single_client;
|
||||
NPCArgumentDispatch[EVENT_EXIT] = handle_npc_single_client;
|
||||
NPCArgumentDispatch[EVENT_TASK_ACCEPTED] = handle_npc_task_accepted;
|
||||
NPCArgumentDispatch[EVENT_POPUP_RESPONSE] = handle_npc_popup;
|
||||
NPCArgumentDispatch[EVENT_SAY] = handle_npc_event_say;
|
||||
NPCArgumentDispatch[EVENT_AGGRO_SAY] = handle_npc_event_say;
|
||||
NPCArgumentDispatch[EVENT_PROXIMITY_SAY] = handle_npc_event_say;
|
||||
NPCArgumentDispatch[EVENT_TRADE] = handle_npc_event_trade;
|
||||
NPCArgumentDispatch[EVENT_HP] = handle_npc_event_hp;
|
||||
NPCArgumentDispatch[EVENT_TARGET_CHANGE] = handle_npc_single_mob;
|
||||
NPCArgumentDispatch[EVENT_CAST_ON] = handle_npc_cast;
|
||||
NPCArgumentDispatch[EVENT_KILLED_MERIT] = handle_npc_single_client;
|
||||
NPCArgumentDispatch[EVENT_SLAY] = handle_npc_single_mob;
|
||||
NPCArgumentDispatch[EVENT_ENTER] = handle_npc_single_client;
|
||||
NPCArgumentDispatch[EVENT_EXIT] = handle_npc_single_client;
|
||||
NPCArgumentDispatch[EVENT_TASK_ACCEPTED] = handle_npc_task_accepted;
|
||||
NPCArgumentDispatch[EVENT_POPUP_RESPONSE] = handle_npc_popup;
|
||||
NPCArgumentDispatch[EVENT_WAYPOINT_ARRIVE] = handle_npc_waypoint;
|
||||
NPCArgumentDispatch[EVENT_WAYPOINT_DEPART] = handle_npc_waypoint;
|
||||
NPCArgumentDispatch[EVENT_HATE_LIST] = handle_npc_hate;
|
||||
NPCArgumentDispatch[EVENT_COMBAT] = handle_npc_hate;
|
||||
NPCArgumentDispatch[EVENT_SIGNAL] = handle_npc_signal;
|
||||
NPCArgumentDispatch[EVENT_TIMER] = handle_npc_timer;
|
||||
NPCArgumentDispatch[EVENT_DEATH] = handle_npc_death;
|
||||
NPCArgumentDispatch[EVENT_DEATH_COMPLETE] = handle_npc_death;
|
||||
NPCArgumentDispatch[EVENT_DEATH_ZONE] = handle_npc_death;
|
||||
NPCArgumentDispatch[EVENT_CAST] = handle_npc_cast;
|
||||
NPCArgumentDispatch[EVENT_CAST_BEGIN] = handle_npc_cast;
|
||||
NPCArgumentDispatch[EVENT_FEIGN_DEATH] = handle_npc_single_client;
|
||||
NPCArgumentDispatch[EVENT_ENTER_AREA] = handle_npc_area;
|
||||
NPCArgumentDispatch[EVENT_LEAVE_AREA] = handle_npc_area;
|
||||
NPCArgumentDispatch[EVENT_LOOT_ZONE] = handle_npc_loot_zone;
|
||||
NPCArgumentDispatch[EVENT_SPAWN_ZONE] = handle_npc_spawn_zone;
|
||||
NPCArgumentDispatch[EVENT_PAYLOAD] = handle_npc_payload;
|
||||
NPCArgumentDispatch[EVENT_DESPAWN_ZONE] = handle_npc_despawn_zone;
|
||||
NPCArgumentDispatch[EVENT_DAMAGE_GIVEN] = handle_npc_damage;
|
||||
NPCArgumentDispatch[EVENT_DAMAGE_TAKEN] = handle_npc_damage;
|
||||
NPCArgumentDispatch[EVENT_HATE_LIST] = handle_npc_hate;
|
||||
NPCArgumentDispatch[EVENT_COMBAT] = handle_npc_hate;
|
||||
NPCArgumentDispatch[EVENT_SIGNAL] = handle_npc_signal;
|
||||
NPCArgumentDispatch[EVENT_TIMER] = handle_npc_timer;
|
||||
NPCArgumentDispatch[EVENT_DEATH] = handle_npc_death;
|
||||
NPCArgumentDispatch[EVENT_DEATH_COMPLETE] = handle_npc_death;
|
||||
NPCArgumentDispatch[EVENT_DEATH_ZONE] = handle_npc_death;
|
||||
NPCArgumentDispatch[EVENT_CAST] = handle_npc_cast;
|
||||
NPCArgumentDispatch[EVENT_CAST_BEGIN] = handle_npc_cast;
|
||||
NPCArgumentDispatch[EVENT_FEIGN_DEATH] = handle_npc_single_client;
|
||||
NPCArgumentDispatch[EVENT_ENTER_AREA] = handle_npc_area;
|
||||
NPCArgumentDispatch[EVENT_LEAVE_AREA] = handle_npc_area;
|
||||
NPCArgumentDispatch[EVENT_LOOT_ZONE] = handle_npc_loot_zone;
|
||||
NPCArgumentDispatch[EVENT_SPAWN_ZONE] = handle_npc_spawn_zone;
|
||||
NPCArgumentDispatch[EVENT_PAYLOAD] = handle_npc_payload;
|
||||
NPCArgumentDispatch[EVENT_DESPAWN_ZONE] = handle_npc_despawn_zone;
|
||||
|
||||
PlayerArgumentDispatch[EVENT_SAY] = handle_player_say;
|
||||
PlayerArgumentDispatch[EVENT_ENVIRONMENTAL_DAMAGE] = handle_player_environmental_damage;
|
||||
PlayerArgumentDispatch[EVENT_DEATH] = handle_player_death;
|
||||
PlayerArgumentDispatch[EVENT_DEATH_COMPLETE] = handle_player_death;
|
||||
PlayerArgumentDispatch[EVENT_TIMER] = handle_player_timer;
|
||||
PlayerArgumentDispatch[EVENT_DISCOVER_ITEM] = handle_player_discover_item;
|
||||
PlayerArgumentDispatch[EVENT_FISH_SUCCESS] = handle_player_fish_forage_success;
|
||||
PlayerArgumentDispatch[EVENT_FORAGE_SUCCESS] = handle_player_fish_forage_success;
|
||||
PlayerArgumentDispatch[EVENT_CLICK_OBJECT] = handle_player_click_object;
|
||||
PlayerArgumentDispatch[EVENT_CLICK_DOOR] = handle_player_click_door;
|
||||
PlayerArgumentDispatch[EVENT_SIGNAL] = handle_player_signal;
|
||||
PlayerArgumentDispatch[EVENT_POPUP_RESPONSE] = handle_player_popup_response;
|
||||
PlayerArgumentDispatch[EVENT_PLAYER_PICKUP] = handle_player_pick_up;
|
||||
PlayerArgumentDispatch[EVENT_CAST] = handle_player_cast;
|
||||
PlayerArgumentDispatch[EVENT_CAST_BEGIN] = handle_player_cast;
|
||||
PlayerArgumentDispatch[EVENT_CAST_ON] = handle_player_cast;
|
||||
PlayerArgumentDispatch[EVENT_TASK_FAIL] = handle_player_task_fail;
|
||||
PlayerArgumentDispatch[EVENT_ZONE] = handle_player_zone;
|
||||
PlayerArgumentDispatch[EVENT_DUEL_WIN] = handle_player_duel_win;
|
||||
PlayerArgumentDispatch[EVENT_DUEL_LOSE] = handle_player_duel_loss;
|
||||
PlayerArgumentDispatch[EVENT_LOOT] = handle_player_loot;
|
||||
PlayerArgumentDispatch[EVENT_TASK_STAGE_COMPLETE] = handle_player_task_stage_complete;
|
||||
PlayerArgumentDispatch[EVENT_TASK_ACCEPTED] = handle_player_task_accepted;
|
||||
PlayerArgumentDispatch[EVENT_TASK_COMPLETE] = handle_player_task_update;
|
||||
PlayerArgumentDispatch[EVENT_TASK_UPDATE] = handle_player_task_update;
|
||||
PlayerArgumentDispatch[EVENT_TASK_BEFORE_UPDATE] = handle_player_task_update;
|
||||
PlayerArgumentDispatch[EVENT_COMMAND] = handle_player_command;
|
||||
PlayerArgumentDispatch[EVENT_COMBINE_SUCCESS] = handle_player_combine;
|
||||
PlayerArgumentDispatch[EVENT_COMBINE_FAILURE] = handle_player_combine;
|
||||
PlayerArgumentDispatch[EVENT_FEIGN_DEATH] = handle_player_feign;
|
||||
PlayerArgumentDispatch[EVENT_ENTER_AREA] = handle_player_area;
|
||||
PlayerArgumentDispatch[EVENT_LEAVE_AREA] = handle_player_area;
|
||||
PlayerArgumentDispatch[EVENT_RESPAWN] = handle_player_respawn;
|
||||
PlayerArgumentDispatch[EVENT_UNHANDLED_OPCODE] = handle_player_packet;
|
||||
PlayerArgumentDispatch[EVENT_USE_SKILL] = handle_player_use_skill;
|
||||
PlayerArgumentDispatch[EVENT_TEST_BUFF] = handle_test_buff;
|
||||
PlayerArgumentDispatch[EVENT_COMBINE_VALIDATE] = handle_player_combine_validate;
|
||||
PlayerArgumentDispatch[EVENT_BOT_COMMAND] = handle_player_bot_command;
|
||||
PlayerArgumentDispatch[EVENT_WARP] = handle_player_warp;
|
||||
PlayerArgumentDispatch[EVENT_COMBINE] = handle_player_quest_combine;
|
||||
PlayerArgumentDispatch[EVENT_CONSIDER] = handle_player_consider;
|
||||
PlayerArgumentDispatch[EVENT_CONSIDER_CORPSE] = handle_player_consider_corpse;
|
||||
PlayerArgumentDispatch[EVENT_EQUIP_ITEM_CLIENT] = handle_player_equip_item;
|
||||
PlayerArgumentDispatch[EVENT_UNEQUIP_ITEM_CLIENT] = handle_player_equip_item;
|
||||
PlayerArgumentDispatch[EVENT_SKILL_UP] = handle_player_skill_up;
|
||||
PlayerArgumentDispatch[EVENT_LANGUAGE_SKILL_UP] = handle_player_skill_up;
|
||||
PlayerArgumentDispatch[EVENT_ALT_CURRENCY_MERCHANT_BUY] = handle_player_alt_currency_merchant;
|
||||
PlayerArgumentDispatch[EVENT_SAY] = handle_player_say;
|
||||
PlayerArgumentDispatch[EVENT_ENVIRONMENTAL_DAMAGE] = handle_player_environmental_damage;
|
||||
PlayerArgumentDispatch[EVENT_DEATH] = handle_player_death;
|
||||
PlayerArgumentDispatch[EVENT_DEATH_COMPLETE] = handle_player_death;
|
||||
PlayerArgumentDispatch[EVENT_TIMER] = handle_player_timer;
|
||||
PlayerArgumentDispatch[EVENT_DISCOVER_ITEM] = handle_player_discover_item;
|
||||
PlayerArgumentDispatch[EVENT_FISH_SUCCESS] = handle_player_fish_forage_success;
|
||||
PlayerArgumentDispatch[EVENT_FORAGE_SUCCESS] = handle_player_fish_forage_success;
|
||||
PlayerArgumentDispatch[EVENT_CLICK_OBJECT] = handle_player_click_object;
|
||||
PlayerArgumentDispatch[EVENT_CLICK_DOOR] = handle_player_click_door;
|
||||
PlayerArgumentDispatch[EVENT_SIGNAL] = handle_player_signal;
|
||||
PlayerArgumentDispatch[EVENT_POPUP_RESPONSE] = handle_player_popup_response;
|
||||
PlayerArgumentDispatch[EVENT_PLAYER_PICKUP] = handle_player_pick_up;
|
||||
PlayerArgumentDispatch[EVENT_CAST] = handle_player_cast;
|
||||
PlayerArgumentDispatch[EVENT_CAST_BEGIN] = handle_player_cast;
|
||||
PlayerArgumentDispatch[EVENT_CAST_ON] = handle_player_cast;
|
||||
PlayerArgumentDispatch[EVENT_TASK_FAIL] = handle_player_task_fail;
|
||||
PlayerArgumentDispatch[EVENT_ZONE] = handle_player_zone;
|
||||
PlayerArgumentDispatch[EVENT_DUEL_WIN] = handle_player_duel_win;
|
||||
PlayerArgumentDispatch[EVENT_DUEL_LOSE] = handle_player_duel_loss;
|
||||
PlayerArgumentDispatch[EVENT_LOOT] = handle_player_loot;
|
||||
PlayerArgumentDispatch[EVENT_TASK_STAGE_COMPLETE] = handle_player_task_stage_complete;
|
||||
PlayerArgumentDispatch[EVENT_TASK_COMPLETE] = handle_player_task_update;
|
||||
PlayerArgumentDispatch[EVENT_TASK_UPDATE] = handle_player_task_update;
|
||||
PlayerArgumentDispatch[EVENT_TASK_BEFORE_UPDATE] = handle_player_task_update;
|
||||
PlayerArgumentDispatch[EVENT_COMMAND] = handle_player_command;
|
||||
PlayerArgumentDispatch[EVENT_COMBINE_SUCCESS] = handle_player_combine;
|
||||
PlayerArgumentDispatch[EVENT_COMBINE_FAILURE] = handle_player_combine;
|
||||
PlayerArgumentDispatch[EVENT_FEIGN_DEATH] = handle_player_feign;
|
||||
PlayerArgumentDispatch[EVENT_ENTER_AREA] = handle_player_area;
|
||||
PlayerArgumentDispatch[EVENT_LEAVE_AREA] = handle_player_area;
|
||||
PlayerArgumentDispatch[EVENT_RESPAWN] = handle_player_respawn;
|
||||
PlayerArgumentDispatch[EVENT_UNHANDLED_OPCODE] = handle_player_packet;
|
||||
PlayerArgumentDispatch[EVENT_USE_SKILL] = handle_player_use_skill;
|
||||
PlayerArgumentDispatch[EVENT_TEST_BUFF] = handle_test_buff;
|
||||
PlayerArgumentDispatch[EVENT_COMBINE_VALIDATE] = handle_player_combine_validate;
|
||||
PlayerArgumentDispatch[EVENT_BOT_COMMAND] = handle_player_bot_command;
|
||||
PlayerArgumentDispatch[EVENT_WARP] = handle_player_warp;
|
||||
PlayerArgumentDispatch[EVENT_COMBINE] = handle_player_quest_combine;
|
||||
PlayerArgumentDispatch[EVENT_CONSIDER] = handle_player_consider;
|
||||
PlayerArgumentDispatch[EVENT_CONSIDER_CORPSE] = handle_player_consider_corpse;
|
||||
PlayerArgumentDispatch[EVENT_EQUIP_ITEM_CLIENT] = handle_player_equip_item;
|
||||
PlayerArgumentDispatch[EVENT_UNEQUIP_ITEM_CLIENT] = handle_player_equip_item;
|
||||
PlayerArgumentDispatch[EVENT_SKILL_UP] = handle_player_skill_up;
|
||||
PlayerArgumentDispatch[EVENT_LANGUAGE_SKILL_UP] = handle_player_skill_up;
|
||||
PlayerArgumentDispatch[EVENT_ALT_CURRENCY_MERCHANT_BUY] = handle_player_alt_currency_merchant;
|
||||
PlayerArgumentDispatch[EVENT_ALT_CURRENCY_MERCHANT_SELL] = handle_player_alt_currency_merchant;
|
||||
PlayerArgumentDispatch[EVENT_MERCHANT_BUY] = handle_player_merchant;
|
||||
PlayerArgumentDispatch[EVENT_MERCHANT_SELL] = handle_player_merchant;
|
||||
PlayerArgumentDispatch[EVENT_INSPECT] = handle_player_inspect;
|
||||
PlayerArgumentDispatch[EVENT_AA_BUY] = handle_player_aa_buy;
|
||||
PlayerArgumentDispatch[EVENT_AA_GAIN] = handle_player_aa_gain;
|
||||
PlayerArgumentDispatch[EVENT_PAYLOAD] = handle_player_payload;
|
||||
PlayerArgumentDispatch[EVENT_LEVEL_UP] = handle_player_level_up;
|
||||
PlayerArgumentDispatch[EVENT_LEVEL_DOWN] = handle_player_level_down;
|
||||
PlayerArgumentDispatch[EVENT_GM_COMMAND] = handle_player_gm_command;
|
||||
PlayerArgumentDispatch[EVENT_BOT_CREATE] = handle_player_bot_create;
|
||||
PlayerArgumentDispatch[EVENT_AUGMENT_INSERT_CLIENT] = handle_player_augment_insert;
|
||||
PlayerArgumentDispatch[EVENT_AUGMENT_REMOVE_CLIENT] = handle_player_augment_remove;
|
||||
PlayerArgumentDispatch[EVENT_DAMAGE_GIVEN] = handle_player_damage;
|
||||
PlayerArgumentDispatch[EVENT_DAMAGE_TAKEN] = handle_player_damage;
|
||||
PlayerArgumentDispatch[EVENT_ITEM_CLICK_CAST_CLIENT] = handle_player_item_click;
|
||||
PlayerArgumentDispatch[EVENT_ITEM_CLICK_CLIENT] = handle_player_item_click;
|
||||
PlayerArgumentDispatch[EVENT_MERCHANT_BUY] = handle_player_merchant;
|
||||
PlayerArgumentDispatch[EVENT_MERCHANT_SELL] = handle_player_merchant;
|
||||
PlayerArgumentDispatch[EVENT_INSPECT] = handle_player_inspect;
|
||||
PlayerArgumentDispatch[EVENT_AA_BUY] = handle_player_aa_buy;
|
||||
PlayerArgumentDispatch[EVENT_AA_GAIN] = handle_player_aa_gain;
|
||||
PlayerArgumentDispatch[EVENT_PAYLOAD] = handle_player_payload;
|
||||
PlayerArgumentDispatch[EVENT_LEVEL_UP] = handle_player_level_up;
|
||||
PlayerArgumentDispatch[EVENT_LEVEL_DOWN] = handle_player_level_down;
|
||||
PlayerArgumentDispatch[EVENT_GM_COMMAND] = handle_player_gm_command;
|
||||
PlayerArgumentDispatch[EVENT_BOT_CREATE] = handle_player_bot_create;
|
||||
PlayerArgumentDispatch[EVENT_AUGMENT_INSERT_CLIENT] = handle_player_augment_insert;
|
||||
PlayerArgumentDispatch[EVENT_AUGMENT_REMOVE_CLIENT] = handle_player_augment_remove;
|
||||
|
||||
ItemArgumentDispatch[EVENT_ITEM_CLICK] = handle_item_click;
|
||||
ItemArgumentDispatch[EVENT_ITEM_CLICK] = handle_item_click;
|
||||
ItemArgumentDispatch[EVENT_ITEM_CLICK_CAST] = handle_item_click;
|
||||
ItemArgumentDispatch[EVENT_TIMER] = handle_item_timer;
|
||||
ItemArgumentDispatch[EVENT_WEAPON_PROC] = handle_item_proc;
|
||||
ItemArgumentDispatch[EVENT_LOOT] = handle_item_loot;
|
||||
ItemArgumentDispatch[EVENT_EQUIP_ITEM] = handle_item_equip;
|
||||
ItemArgumentDispatch[EVENT_UNEQUIP_ITEM] = handle_item_equip;
|
||||
ItemArgumentDispatch[EVENT_AUGMENT_ITEM] = handle_item_augment;
|
||||
ItemArgumentDispatch[EVENT_UNAUGMENT_ITEM] = handle_item_augment;
|
||||
ItemArgumentDispatch[EVENT_AUGMENT_INSERT] = handle_item_augment_insert;
|
||||
ItemArgumentDispatch[EVENT_AUGMENT_REMOVE] = handle_item_augment_remove;
|
||||
ItemArgumentDispatch[EVENT_TIMER] = handle_item_timer;
|
||||
ItemArgumentDispatch[EVENT_WEAPON_PROC] = handle_item_proc;
|
||||
ItemArgumentDispatch[EVENT_LOOT] = handle_item_loot;
|
||||
ItemArgumentDispatch[EVENT_EQUIP_ITEM] = handle_item_equip;
|
||||
ItemArgumentDispatch[EVENT_UNEQUIP_ITEM] = handle_item_equip;
|
||||
ItemArgumentDispatch[EVENT_AUGMENT_ITEM] = handle_item_augment;
|
||||
ItemArgumentDispatch[EVENT_UNAUGMENT_ITEM] = handle_item_augment;
|
||||
ItemArgumentDispatch[EVENT_AUGMENT_INSERT] = handle_item_augment_insert;
|
||||
ItemArgumentDispatch[EVENT_AUGMENT_REMOVE] = handle_item_augment_remove;
|
||||
|
||||
SpellArgumentDispatch[EVENT_SPELL_EFFECT_CLIENT] = handle_spell_event;
|
||||
SpellArgumentDispatch[EVENT_SPELL_EFFECT_BUFF_TIC_CLIENT] = handle_spell_event;
|
||||
SpellArgumentDispatch[EVENT_SPELL_FADE] = handle_spell_event;
|
||||
SpellArgumentDispatch[EVENT_SPELL_EFFECT_CLIENT] = handle_spell_event;
|
||||
SpellArgumentDispatch[EVENT_SPELL_EFFECT_BUFF_TIC_CLIENT] = handle_spell_event;
|
||||
SpellArgumentDispatch[EVENT_SPELL_FADE] = handle_spell_event;
|
||||
SpellArgumentDispatch[EVENT_SPELL_EFFECT_TRANSLOCATE_COMPLETE] = handle_translocate_finish;
|
||||
|
||||
EncounterArgumentDispatch[EVENT_TIMER] = handle_encounter_timer;
|
||||
EncounterArgumentDispatch[EVENT_ENCOUNTER_LOAD] = handle_encounter_load;
|
||||
EncounterArgumentDispatch[EVENT_TIMER] = handle_encounter_timer;
|
||||
EncounterArgumentDispatch[EVENT_ENCOUNTER_LOAD] = handle_encounter_load;
|
||||
EncounterArgumentDispatch[EVENT_ENCOUNTER_UNLOAD] = handle_encounter_unload;
|
||||
|
||||
BotArgumentDispatch[EVENT_CAST] = handle_bot_cast;
|
||||
BotArgumentDispatch[EVENT_CAST_BEGIN] = handle_bot_cast;
|
||||
BotArgumentDispatch[EVENT_CAST_ON] = handle_bot_cast;
|
||||
BotArgumentDispatch[EVENT_COMBAT] = handle_bot_combat;
|
||||
BotArgumentDispatch[EVENT_DEATH] = handle_bot_death;
|
||||
BotArgumentDispatch[EVENT_DEATH_COMPLETE] = handle_bot_death;
|
||||
BotArgumentDispatch[EVENT_POPUP_RESPONSE] = handle_bot_popup_response;
|
||||
BotArgumentDispatch[EVENT_SAY] = handle_bot_say;
|
||||
BotArgumentDispatch[EVENT_SIGNAL] = handle_bot_signal;
|
||||
BotArgumentDispatch[EVENT_SLAY] = handle_bot_slay;
|
||||
BotArgumentDispatch[EVENT_TARGET_CHANGE] = handle_bot_target_change;
|
||||
BotArgumentDispatch[EVENT_TIMER] = handle_bot_timer;
|
||||
BotArgumentDispatch[EVENT_TRADE] = handle_bot_trade;
|
||||
BotArgumentDispatch[EVENT_USE_SKILL] = handle_bot_use_skill;
|
||||
BotArgumentDispatch[EVENT_PAYLOAD] = handle_bot_payload;
|
||||
BotArgumentDispatch[EVENT_EQUIP_ITEM_BOT] = handle_bot_equip_item;
|
||||
BotArgumentDispatch[EVENT_UNEQUIP_ITEM_BOT] = handle_bot_equip_item;
|
||||
BotArgumentDispatch[EVENT_DAMAGE_GIVEN] = handle_bot_damage;
|
||||
BotArgumentDispatch[EVENT_DAMAGE_TAKEN] = handle_bot_damage;
|
||||
BotArgumentDispatch[EVENT_CAST] = handle_bot_cast;
|
||||
BotArgumentDispatch[EVENT_CAST_BEGIN] = handle_bot_cast;
|
||||
BotArgumentDispatch[EVENT_CAST_ON] = handle_bot_cast;
|
||||
BotArgumentDispatch[EVENT_COMBAT] = handle_bot_combat;
|
||||
BotArgumentDispatch[EVENT_DEATH] = handle_bot_death;
|
||||
BotArgumentDispatch[EVENT_DEATH_COMPLETE] = handle_bot_death;
|
||||
BotArgumentDispatch[EVENT_POPUP_RESPONSE] = handle_bot_popup_response;
|
||||
BotArgumentDispatch[EVENT_SAY] = handle_bot_say;
|
||||
BotArgumentDispatch[EVENT_SIGNAL] = handle_bot_signal;
|
||||
BotArgumentDispatch[EVENT_SLAY] = handle_bot_slay;
|
||||
BotArgumentDispatch[EVENT_TARGET_CHANGE] = handle_bot_target_change;
|
||||
BotArgumentDispatch[EVENT_TIMER] = handle_bot_timer;
|
||||
BotArgumentDispatch[EVENT_TRADE] = handle_bot_trade;
|
||||
BotArgumentDispatch[EVENT_USE_SKILL] = handle_bot_use_skill;
|
||||
BotArgumentDispatch[EVENT_PAYLOAD] = handle_bot_payload;
|
||||
#endif
|
||||
|
||||
L = nullptr;
|
||||
|
||||
+94
-293
@@ -120,12 +120,12 @@ void handle_npc_event_hp(
|
||||
if(extra_data == 1) {
|
||||
lua_pushinteger(L, -1);
|
||||
lua_setfield(L, -2, "hp_event");
|
||||
lua_pushinteger(L, Strings::ToInt(data));
|
||||
lua_pushinteger(L, std::stoi(data));
|
||||
lua_setfield(L, -2, "inc_hp_event");
|
||||
}
|
||||
else
|
||||
{
|
||||
lua_pushinteger(L, Strings::ToInt(data));
|
||||
lua_pushinteger(L, std::stoi(data));
|
||||
lua_setfield(L, -2, "hp_event");
|
||||
lua_pushinteger(L, -1);
|
||||
lua_setfield(L, -2, "inc_hp_event");
|
||||
@@ -191,7 +191,7 @@ void handle_npc_task_accepted(
|
||||
l_client_o.push(L);
|
||||
lua_setfield(L, -2, "other");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(data));
|
||||
lua_pushinteger(L, std::stoi(data));
|
||||
lua_setfield(L, -2, "task_id");
|
||||
}
|
||||
|
||||
@@ -209,7 +209,7 @@ void handle_npc_popup(
|
||||
l_mob_o.push(L);
|
||||
lua_setfield(L, -2, "other");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(data));
|
||||
lua_pushinteger(L, std::stoi(data));
|
||||
lua_setfield(L, -2, "popup_id");
|
||||
}
|
||||
|
||||
@@ -227,7 +227,7 @@ void handle_npc_waypoint(
|
||||
l_mob_o.push(L);
|
||||
lua_setfield(L, -2, "other");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(data, -1));
|
||||
lua_pushinteger(L, std::stoi(data));
|
||||
lua_setfield(L, -2, "wp");
|
||||
}
|
||||
|
||||
@@ -245,7 +245,7 @@ void handle_npc_hate(
|
||||
l_mob_o.push(L);
|
||||
lua_setfield(L, -2, "other");
|
||||
|
||||
lua_pushboolean(L, Strings::ToInt(data) == 0 ? false : true);
|
||||
lua_pushboolean(L, std::stoi(data) == 0 ? false : true);
|
||||
lua_setfield(L, -2, "joined");
|
||||
}
|
||||
|
||||
@@ -259,7 +259,7 @@ void handle_npc_signal(
|
||||
uint32 extra_data,
|
||||
std::vector<std::any> *extra_pointers
|
||||
) {
|
||||
lua_pushinteger(L, Strings::ToInt(data));
|
||||
lua_pushinteger(L, std::stoi(data));
|
||||
lua_setfield(L, -2, "signal");
|
||||
}
|
||||
|
||||
@@ -274,7 +274,7 @@ void handle_npc_payload(
|
||||
) {
|
||||
Seperator sep(data.c_str());
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[0]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[0]));
|
||||
lua_setfield(L, -2, "payload_id");
|
||||
|
||||
lua_pushstring(L, sep.argplus[1]);
|
||||
@@ -309,13 +309,13 @@ void handle_npc_death(
|
||||
lua_setfield(L, -2, "other");
|
||||
|
||||
Seperator sep(data.c_str());
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[0]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[0]));
|
||||
lua_setfield(L, -2, "killer_id");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[1]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[1]));
|
||||
lua_setfield(L, -2, "damage");
|
||||
|
||||
int spell_id = Strings::ToInt(sep.arg[2]);
|
||||
int spell_id = std::stoi(sep.arg[2]);
|
||||
if(IsValidSpell(spell_id)) {
|
||||
Lua_Spell l_spell(&spells[spell_id]);
|
||||
luabind::adl::object l_spell_o = luabind::adl::object(L, l_spell);
|
||||
@@ -328,7 +328,7 @@ void handle_npc_death(
|
||||
lua_setfield(L, -2, "spell");
|
||||
}
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[3]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[3]));
|
||||
lua_setfield(L, -2, "skill_id");
|
||||
|
||||
if (extra_pointers && extra_pointers->size() >= 1)
|
||||
@@ -357,7 +357,7 @@ void handle_npc_cast(
|
||||
uint32 extra_data,
|
||||
std::vector<std::any> *extra_pointers
|
||||
) {
|
||||
int spell_id = Strings::ToInt(data);
|
||||
int spell_id = std::stoi(data);
|
||||
if(IsValidSpell(spell_id)) {
|
||||
Lua_Spell l_spell(&spells[spell_id]);
|
||||
luabind::adl::object l_spell_o = luabind::adl::object(L, l_spell);
|
||||
@@ -453,50 +453,6 @@ void handle_npc_despawn_zone(
|
||||
lua_setfield(L, -2, "other");
|
||||
}
|
||||
|
||||
void handle_npc_damage(
|
||||
QuestInterface *parse,
|
||||
lua_State* L,
|
||||
NPC* npc,
|
||||
Mob* init,
|
||||
std::string data,
|
||||
uint32 extra_data,
|
||||
std::vector<std::any> *extra_pointers
|
||||
) {
|
||||
Seperator sep(data.c_str());
|
||||
|
||||
lua_pushnumber(L, std::stoul(sep.arg[0]));
|
||||
lua_setfield(L, -2, "entity_id");
|
||||
|
||||
lua_pushnumber(L, std::stoll(sep.arg[1]));
|
||||
lua_setfield(L, -2, "damage");
|
||||
|
||||
lua_pushnumber(L, std::stoi(sep.arg[2]));
|
||||
lua_setfield(L, -2, "spell_id");
|
||||
|
||||
lua_pushnumber(L, std::stoi(sep.arg[3]));
|
||||
lua_setfield(L, -2, "skill_id");
|
||||
|
||||
lua_pushboolean(L, std::stoi(sep.arg[4]) == 0 ? false : true);
|
||||
lua_setfield(L, -2, "is_damage_shield");
|
||||
|
||||
lua_pushboolean(L, std::stoi(sep.arg[5]) == 0 ? false : true);
|
||||
lua_setfield(L, -2, "is_avoidable");
|
||||
|
||||
lua_pushnumber(L, std::stoi(sep.arg[6]));
|
||||
lua_setfield(L, -2, "buff_slot");
|
||||
|
||||
lua_pushboolean(L, std::stoi(sep.arg[7]) == 0 ? false : true);
|
||||
lua_setfield(L, -2, "is_buff_tic");
|
||||
|
||||
lua_pushnumber(L, std::stoi(sep.arg[8]));
|
||||
lua_setfield(L, -2, "special_attack");
|
||||
|
||||
Lua_Mob l_mob(init);
|
||||
luabind::adl::object l_mob_o = luabind::adl::object(L, l_mob);
|
||||
l_mob_o.push(L);
|
||||
lua_setfield(L, -2, "other");
|
||||
}
|
||||
|
||||
// Player
|
||||
void handle_player_say(
|
||||
QuestInterface *parse,
|
||||
@@ -522,13 +478,13 @@ void handle_player_environmental_damage(
|
||||
std::vector<std::any> *extra_pointers
|
||||
) {
|
||||
Seperator sep(data.c_str());
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[0]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[0]));
|
||||
lua_setfield(L, -2, "env_damage");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[1]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[1]));
|
||||
lua_setfield(L, -2, "env_damage_type");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[2]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[2]));
|
||||
lua_setfield(L, -2, "env_final_damage");
|
||||
}
|
||||
|
||||
@@ -542,19 +498,19 @@ void handle_player_death(
|
||||
) {
|
||||
Seperator sep(data.c_str());
|
||||
|
||||
Mob *o = entity_list.GetMobID(Strings::ToInt(sep.arg[0]));
|
||||
Mob *o = entity_list.GetMobID(std::stoi(sep.arg[0]));
|
||||
Lua_Mob l_mob(o);
|
||||
luabind::adl::object l_mob_o = luabind::adl::object(L, l_mob);
|
||||
l_mob_o.push(L);
|
||||
lua_setfield(L, -2, "other");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[1]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[1]));
|
||||
lua_setfield(L, -2, "killer_id");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[2]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[2]));
|
||||
lua_setfield(L, -2, "damage");
|
||||
|
||||
int spell_id = Strings::ToInt(sep.arg[3]);
|
||||
int spell_id = std::stoi(sep.arg[3]);
|
||||
if(IsValidSpell(spell_id)) {
|
||||
Lua_Spell l_spell(&spells[spell_id]);
|
||||
luabind::adl::object l_spell_o = luabind::adl::object(L, l_spell);
|
||||
@@ -567,7 +523,7 @@ void handle_player_death(
|
||||
lua_setfield(L, -2, "spell");
|
||||
}
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[4]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[4]));
|
||||
lua_setfield(L, -2, "skill");
|
||||
}
|
||||
|
||||
@@ -655,7 +611,7 @@ void handle_player_signal(
|
||||
uint32 extra_data,
|
||||
std::vector<std::any> *extra_pointers
|
||||
) {
|
||||
lua_pushinteger(L, Strings::ToInt(data));
|
||||
lua_pushinteger(L, std::stoi(data));
|
||||
lua_setfield(L, -2, "signal");
|
||||
}
|
||||
|
||||
@@ -669,7 +625,7 @@ void handle_player_payload(
|
||||
) {
|
||||
Seperator sep(data.c_str());
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[0]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[0]));
|
||||
lua_setfield(L, -2, "payload_id");
|
||||
|
||||
lua_pushstring(L, sep.argplus[1]);
|
||||
@@ -684,7 +640,7 @@ void handle_player_popup_response(
|
||||
uint32 extra_data,
|
||||
std::vector<std::any> *extra_pointers
|
||||
) {
|
||||
lua_pushinteger(L, Strings::ToInt(data));
|
||||
lua_pushinteger(L, std::stoi(data));
|
||||
lua_setfield(L, -2, "popup_id");
|
||||
}
|
||||
|
||||
@@ -712,7 +668,7 @@ void handle_player_cast(
|
||||
) {
|
||||
Seperator sep(data.c_str());
|
||||
|
||||
int spell_id = Strings::ToInt(sep.arg[0]);
|
||||
int spell_id = std::stoi(sep.arg[0]);
|
||||
if(IsValidSpell(spell_id)) {
|
||||
Lua_Spell l_spell(&spells[spell_id]);
|
||||
luabind::adl::object l_spell_o = luabind::adl::object(L, l_spell);
|
||||
@@ -725,10 +681,10 @@ void handle_player_cast(
|
||||
|
||||
lua_setfield(L, -2, "spell");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[1]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[1]));
|
||||
lua_setfield(L, -2, "caster_id");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[2]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[2]));
|
||||
lua_setfield(L, -2, "caster_level");
|
||||
}
|
||||
|
||||
@@ -740,7 +696,7 @@ void handle_player_task_fail(
|
||||
uint32 extra_data,
|
||||
std::vector<std::any> *extra_pointers
|
||||
) {
|
||||
lua_pushinteger(L, Strings::ToInt(data));
|
||||
lua_pushinteger(L, std::stoi(data));
|
||||
lua_setfield(L, -2, "task_id");
|
||||
}
|
||||
|
||||
@@ -754,22 +710,22 @@ void handle_player_zone(
|
||||
) {
|
||||
Seperator sep(data.c_str());
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[0]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[0]));
|
||||
lua_setfield(L, -2, "from_zone_id");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[1]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[1]));
|
||||
lua_setfield(L, -2, "from_instance_id");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[2]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[2]));
|
||||
lua_setfield(L, -2, "from_instance_version");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[3]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[3]));
|
||||
lua_setfield(L, -2, "zone_id");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[4]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[4]));
|
||||
lua_setfield(L, -2, "instance_id");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[5]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[5]));
|
||||
lua_setfield(L, -2, "instance_version");
|
||||
}
|
||||
|
||||
@@ -829,25 +785,13 @@ void handle_player_task_stage_complete(
|
||||
std::vector<std::any> *extra_pointers
|
||||
) {
|
||||
Seperator sep(data.c_str());
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[0]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[0]));
|
||||
lua_setfield(L, -2, "task_id");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[1]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[1]));
|
||||
lua_setfield(L, -2, "activity_id");
|
||||
}
|
||||
|
||||
void handle_player_task_accepted(
|
||||
QuestInterface* parse,
|
||||
lua_State* L,
|
||||
Client* client,
|
||||
std::string data,
|
||||
uint32 extra_data,
|
||||
std::vector<std::any>* extra_pointers
|
||||
) {
|
||||
lua_pushinteger(L, std::stoi(data));
|
||||
lua_setfield(L, -2, "task_id");
|
||||
}
|
||||
|
||||
void handle_player_task_update(
|
||||
QuestInterface *parse,
|
||||
lua_State* L,
|
||||
@@ -857,13 +801,13 @@ void handle_player_task_update(
|
||||
std::vector<std::any> *extra_pointers
|
||||
) {
|
||||
Seperator sep(data.c_str());
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[0]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[0]));
|
||||
lua_setfield(L, -2, "count");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[1]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[1]));
|
||||
lua_setfield(L, -2, "activity_id");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[2]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[2]));
|
||||
lua_setfield(L, -2, "task_id");
|
||||
}
|
||||
|
||||
@@ -944,7 +888,7 @@ void handle_player_respawn(
|
||||
uint32 extra_data,
|
||||
std::vector<std::any> *extra_pointers
|
||||
) {
|
||||
lua_pushinteger(L, Strings::ToInt(data));
|
||||
lua_pushinteger(L, std::stoi(data));
|
||||
lua_setfield(L, -2, "option");
|
||||
|
||||
lua_pushboolean(L, extra_data == 1 ? true : false);
|
||||
@@ -987,10 +931,10 @@ void handle_player_use_skill(
|
||||
std::vector<std::any> *extra_pointers
|
||||
) {
|
||||
Seperator sep(data.c_str());
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[0]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[0]));
|
||||
lua_setfield(L, -2, "skill_id");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[1]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[1]));
|
||||
lua_setfield(L, -2, "skill_level");
|
||||
}
|
||||
|
||||
@@ -1022,10 +966,10 @@ void handle_player_combine_validate(
|
||||
int zone_id = -1;
|
||||
int tradeskill_id = -1;
|
||||
if (strcmp(sep.arg[0], "check_zone") == 0) {
|
||||
zone_id = Strings::ToInt(sep.arg[1]);
|
||||
zone_id = std::stoi(sep.arg[1]);
|
||||
}
|
||||
else if (strcmp(sep.arg[0], "check_tradeskill") == 0) {
|
||||
tradeskill_id = Strings::ToInt(sep.arg[1]);
|
||||
tradeskill_id = std::stoi(sep.arg[1]);
|
||||
}
|
||||
|
||||
lua_pushinteger(L, zone_id);
|
||||
@@ -1087,7 +1031,7 @@ void handle_player_quest_combine(
|
||||
uint32 extra_data,
|
||||
std::vector<std::any> *extra_pointers
|
||||
) {
|
||||
lua_pushinteger(L, Strings::ToInt(data));
|
||||
lua_pushinteger(L, std::stoi(data));
|
||||
lua_setfield(L, -2, "container_slot");
|
||||
}
|
||||
|
||||
@@ -1099,7 +1043,7 @@ void handle_player_consider(
|
||||
uint32 extra_data,
|
||||
std::vector<std::any> *extra_pointers
|
||||
) {
|
||||
lua_pushinteger(L, Strings::ToInt(data));
|
||||
lua_pushinteger(L, std::stoi(data));
|
||||
lua_setfield(L, -2, "entity_id");
|
||||
}
|
||||
|
||||
@@ -1111,7 +1055,7 @@ void handle_player_consider_corpse(
|
||||
uint32 extra_data,
|
||||
std::vector<std::any> *extra_pointers
|
||||
) {
|
||||
lua_pushinteger(L, Strings::ToInt(data));
|
||||
lua_pushinteger(L, std::stoi(data));
|
||||
lua_setfield(L, -2, "corpse_entity_id");
|
||||
}
|
||||
|
||||
@@ -1138,16 +1082,16 @@ void handle_player_aa_buy(
|
||||
std::vector<std::any> *extra_pointers
|
||||
) {
|
||||
Seperator sep(data.c_str());
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[0]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[0]));
|
||||
lua_setfield(L, -2, "aa_cost");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[1]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[1]));
|
||||
lua_setfield(L, -2, "aa_id");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[2]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[2]));
|
||||
lua_setfield(L, -2, "aa_previous_id");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[3]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[3]));
|
||||
lua_setfield(L, -2, "aa_next_id");
|
||||
}
|
||||
|
||||
@@ -1159,7 +1103,7 @@ void handle_player_aa_gain(
|
||||
uint32 extra_data,
|
||||
std::vector<std::any> *extra_pointers
|
||||
) {
|
||||
lua_pushinteger(L, Strings::ToInt(data));
|
||||
lua_pushinteger(L, std::stoi(data));
|
||||
lua_setfield(L, -2, "aa_gained");
|
||||
}
|
||||
|
||||
@@ -1211,92 +1155,19 @@ void handle_player_bot_create(
|
||||
lua_pushstring(L, sep.arg[0]);
|
||||
lua_setfield(L, -2, "bot_name");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[1]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[1]));
|
||||
lua_setfield(L, -2, "bot_id");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[2]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[2]));
|
||||
lua_setfield(L, -2, "bot_race");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[3]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[3]));
|
||||
lua_setfield(L, -2, "bot_class");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[4]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[4]));
|
||||
lua_setfield(L, -2, "bot_gender");
|
||||
}
|
||||
|
||||
void handle_player_damage(
|
||||
QuestInterface *parse,
|
||||
lua_State* L,
|
||||
Client* client,
|
||||
std::string data,
|
||||
uint32 extra_data,
|
||||
std::vector<std::any> *extra_pointers
|
||||
) {
|
||||
Seperator sep(data.c_str());
|
||||
|
||||
lua_pushnumber(L, std::stoul(sep.arg[0]));
|
||||
lua_setfield(L, -2, "entity_id");
|
||||
|
||||
lua_pushnumber(L, std::stoll(sep.arg[1]));
|
||||
lua_setfield(L, -2, "damage");
|
||||
|
||||
lua_pushnumber(L, std::stoi(sep.arg[2]));
|
||||
lua_setfield(L, -2, "spell_id");
|
||||
|
||||
lua_pushnumber(L, std::stoi(sep.arg[3]));
|
||||
lua_setfield(L, -2, "skill_id");
|
||||
|
||||
lua_pushboolean(L, std::stoi(sep.arg[4]) == 0 ? false : true);
|
||||
lua_setfield(L, -2, "is_damage_shield");
|
||||
|
||||
lua_pushboolean(L, std::stoi(sep.arg[5]) == 0 ? false : true);
|
||||
lua_setfield(L, -2, "is_avoidable");
|
||||
|
||||
lua_pushnumber(L, std::stoi(sep.arg[6]));
|
||||
lua_setfield(L, -2, "buff_slot");
|
||||
|
||||
lua_pushboolean(L, std::stoi(sep.arg[7]) == 0 ? false : true);
|
||||
lua_setfield(L, -2, "is_buff_tic");
|
||||
|
||||
lua_pushnumber(L, std::stoi(sep.arg[8]));
|
||||
lua_setfield(L, -2, "special_attack");
|
||||
|
||||
if (extra_pointers && extra_pointers->size() >= 1) {
|
||||
Lua_Mob l_mob(std::any_cast<Mob*>(extra_pointers->at(0)));
|
||||
luabind::adl::object l_mob_o = luabind::adl::object(L, l_mob);
|
||||
l_mob_o.push(L);
|
||||
lua_setfield(L, -2, "other");
|
||||
}
|
||||
}
|
||||
|
||||
void handle_player_item_click(
|
||||
QuestInterface *parse,
|
||||
lua_State* L,
|
||||
Client* client,
|
||||
std::string data,
|
||||
uint32 extra_data,
|
||||
std::vector<std::any> *extra_pointers
|
||||
) {
|
||||
lua_pushnumber(L, std::stoi(data));
|
||||
lua_setfield(L, -2, "slot_id");
|
||||
|
||||
if (extra_pointers && extra_pointers->size() >= 1) {
|
||||
lua_pushnumber(L, std::any_cast<EQ::ItemInstance*>(extra_pointers->at(0))->GetID());
|
||||
lua_setfield(L, -2, "item_id");
|
||||
|
||||
lua_pushstring(L, std::any_cast<EQ::ItemInstance*>(extra_pointers->at(0))->GetItem()->Name);
|
||||
lua_setfield(L, -2, "item_name");
|
||||
|
||||
lua_pushnumber(L, std::any_cast<EQ::ItemInstance*>(extra_pointers->at(0))->GetItem()->Click.Effect);
|
||||
lua_setfield(L, -2, "spell_id");
|
||||
|
||||
Lua_ItemInst l_item(std::any_cast<EQ::ItemInstance*>(extra_pointers->at(0)));
|
||||
luabind::adl::object l_item_o = luabind::adl::object(L, l_item);
|
||||
l_item_o.push(L);
|
||||
lua_setfield(L, -2, "item");
|
||||
}
|
||||
}
|
||||
|
||||
// Item
|
||||
void handle_item_click(
|
||||
QuestInterface *parse,
|
||||
@@ -1495,16 +1366,16 @@ void handle_spell_event(
|
||||
|
||||
Seperator sep(data.c_str());
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[0]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[0]));
|
||||
lua_setfield(L, -2, "caster_id");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[1]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[1]));
|
||||
lua_setfield(L, -2, "tics_remaining");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[2]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[2]));
|
||||
lua_setfield(L, -2, "caster_level");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[3]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[3]));
|
||||
lua_setfield(L, -2, "buff_slot");
|
||||
|
||||
Lua_Spell l_spell(spell_id);
|
||||
@@ -1553,10 +1424,10 @@ void handle_player_equip_item(
|
||||
|
||||
Seperator sep(data.c_str());
|
||||
|
||||
lua_pushnumber(L, Strings::ToInt(sep.arg[0]));
|
||||
lua_pushnumber(L, std::stoi(sep.arg[0]));
|
||||
lua_setfield(L, -2, "item_quantity");
|
||||
|
||||
lua_pushnumber(L, Strings::ToInt(sep.arg[1]));
|
||||
lua_pushnumber(L, std::stoi(sep.arg[1]));
|
||||
lua_setfield(L, -2, "slot_id");
|
||||
|
||||
Lua_ItemInst l_item(extra_data);
|
||||
@@ -1644,16 +1515,16 @@ void handle_player_skill_up(
|
||||
std::vector<std::any> *extra_pointers
|
||||
) {
|
||||
Seperator sep(data.c_str());
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[0]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[0]));
|
||||
lua_setfield(L, -2, "skill_id");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[1]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[1]));
|
||||
lua_setfield(L, -2, "skill_value");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[2]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[2]));
|
||||
lua_setfield(L, -2, "skill_max");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[3]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[3]));
|
||||
lua_setfield(L, -2, "is_tradeskill");
|
||||
}
|
||||
|
||||
@@ -1666,13 +1537,13 @@ void handle_player_language_skill_up(
|
||||
std::vector<std::any> *extra_pointers
|
||||
) {
|
||||
Seperator sep(data.c_str());
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[0]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[0]));
|
||||
lua_setfield(L, -2, "skill_id");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[1]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[1]));
|
||||
lua_setfield(L, -2, "skill_value");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[2]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[2]));
|
||||
lua_setfield(L, -2, "skill_max");
|
||||
}
|
||||
|
||||
@@ -1685,19 +1556,19 @@ void handle_player_alt_currency_merchant(
|
||||
std::vector<std::any> *extra_pointers
|
||||
) {
|
||||
Seperator sep(data.c_str());
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[0]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[0]));
|
||||
lua_setfield(L, -2, "currency_id");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[1]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[1]));
|
||||
lua_setfield(L, -2, "npc_id");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[2]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[2]));
|
||||
lua_setfield(L, -2, "merchant_id");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[3]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[3]));
|
||||
lua_setfield(L, -2, "item_id");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[4]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[4]));
|
||||
lua_setfield(L, -2, "item_cost");
|
||||
}
|
||||
|
||||
@@ -1710,19 +1581,19 @@ void handle_player_merchant(
|
||||
std::vector<std::any> *extra_pointers
|
||||
) {
|
||||
Seperator sep(data.c_str());
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[0]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[0]));
|
||||
lua_setfield(L, -2, "npc_id");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[1]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[1]));
|
||||
lua_setfield(L, -2, "merchant_id");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[2]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[2]));
|
||||
lua_setfield(L, -2, "item_id");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[3]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[3]));
|
||||
lua_setfield(L, -2, "item_quantity");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[4]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[4]));
|
||||
lua_setfield(L, -2, "item_cost");
|
||||
}
|
||||
|
||||
@@ -1748,7 +1619,7 @@ void handle_player_augment_insert(
|
||||
lua_pushinteger(L, std::stoul(sep.arg[0]));
|
||||
lua_setfield(L, -2, "item_id");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[1]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[1]));
|
||||
lua_setfield(L, -2, "item_slot");
|
||||
|
||||
lua_pushinteger(L, std::stoul(sep.arg[2]));
|
||||
@@ -1780,7 +1651,7 @@ void handle_player_augment_remove(
|
||||
lua_pushinteger(L, std::stoul(sep.arg[0]));
|
||||
lua_setfield(L, -2, "item_id");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[1]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[1]));
|
||||
lua_setfield(L, -2, "item_slot");
|
||||
|
||||
lua_pushinteger(L, std::stoul(sep.arg[2]));
|
||||
@@ -1817,7 +1688,7 @@ void handle_bot_cast(
|
||||
) {
|
||||
Seperator sep(data.c_str());
|
||||
|
||||
int spell_id = Strings::ToInt(sep.arg[0]);
|
||||
int spell_id = std::stoi(sep.arg[0]);
|
||||
if (IsValidSpell(spell_id)) {
|
||||
Lua_Spell l_spell(&spells[spell_id]);
|
||||
luabind::adl::object l_spell_o = luabind::adl::object(L, l_spell);
|
||||
@@ -1830,10 +1701,10 @@ void handle_bot_cast(
|
||||
|
||||
lua_setfield(L, -2, "spell");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[1]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[1]));
|
||||
lua_setfield(L, -2, "caster_id");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[2]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[2]));
|
||||
lua_setfield(L, -2, "caster_level");
|
||||
}
|
||||
|
||||
@@ -1851,7 +1722,7 @@ void handle_bot_combat(
|
||||
l_mob_o.push(L);
|
||||
lua_setfield(L, -2, "other");
|
||||
|
||||
lua_pushboolean(L, Strings::ToInt(data) == 0 ? false : true);
|
||||
lua_pushboolean(L, std::stoi(data) == 0 ? false : true);
|
||||
lua_setfield(L, -2, "joined");
|
||||
}
|
||||
|
||||
@@ -1866,16 +1737,16 @@ void handle_bot_death(
|
||||
) {
|
||||
Seperator sep(data.c_str());
|
||||
|
||||
Mob *o = entity_list.GetMobID(Strings::ToInt(sep.arg[0]));
|
||||
Mob *o = entity_list.GetMobID(std::stoi(sep.arg[0]));
|
||||
Lua_Mob l_mob(o);
|
||||
luabind::adl::object l_mob_o = luabind::adl::object(L, l_mob);
|
||||
l_mob_o.push(L);
|
||||
lua_setfield(L, -2, "other");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[1]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[1]));
|
||||
lua_setfield(L, -2, "damage");
|
||||
|
||||
int spell_id = Strings::ToInt(sep.arg[2]);
|
||||
int spell_id = std::stoi(sep.arg[2]);
|
||||
if (IsValidSpell(spell_id)) {
|
||||
Lua_Spell l_spell(&spells[spell_id]);
|
||||
luabind::adl::object l_spell_o = luabind::adl::object(L, l_spell);
|
||||
@@ -1888,7 +1759,7 @@ void handle_bot_death(
|
||||
lua_setfield(L, -2, "spell");
|
||||
}
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[3]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[3]));
|
||||
lua_setfield(L, -2, "skill");
|
||||
}
|
||||
|
||||
@@ -1906,7 +1777,7 @@ void handle_bot_popup_response(
|
||||
l_mob_o.push(L);
|
||||
lua_setfield(L, -2, "other");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(data));
|
||||
lua_pushinteger(L, std::stoi(data));
|
||||
lua_setfield(L, -2, "popup_id");
|
||||
}
|
||||
|
||||
@@ -1940,7 +1811,7 @@ void handle_bot_signal(
|
||||
uint32 extra_data,
|
||||
std::vector<std::any> *extra_pointers
|
||||
) {
|
||||
lua_pushinteger(L, Strings::ToInt(data));
|
||||
lua_pushinteger(L, std::stoi(data));
|
||||
lua_setfield(L, -2, "signal");
|
||||
}
|
||||
|
||||
@@ -1955,7 +1826,7 @@ void handle_bot_payload(
|
||||
) {
|
||||
Seperator sep(data.c_str());
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[0]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[0]));
|
||||
lua_setfield(L, -2, "payload_id");
|
||||
|
||||
lua_pushstring(L, sep.argplus[1]);
|
||||
@@ -2073,81 +1944,11 @@ void handle_bot_use_skill(
|
||||
std::vector<std::any> *extra_pointers
|
||||
) {
|
||||
Seperator sep(data.c_str());
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[0]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[0]));
|
||||
lua_setfield(L, -2, "skill_id");
|
||||
|
||||
lua_pushinteger(L, Strings::ToInt(sep.arg[1]));
|
||||
lua_pushinteger(L, std::stoi(sep.arg[1]));
|
||||
lua_setfield(L, -2, "skill_level");
|
||||
}
|
||||
|
||||
void handle_bot_equip_item(
|
||||
QuestInterface *parse,
|
||||
lua_State* L,
|
||||
Bot* bot,
|
||||
Mob* init,
|
||||
std::string data,
|
||||
uint32 extra_data,
|
||||
std::vector<std::any> *extra_pointers
|
||||
) {
|
||||
lua_pushnumber(L, extra_data);
|
||||
lua_setfield(L, -2, "item_id");
|
||||
|
||||
Seperator sep(data.c_str());
|
||||
|
||||
lua_pushnumber(L, std::stoi(sep.arg[0]));
|
||||
lua_setfield(L, -2, "item_quantity");
|
||||
|
||||
lua_pushnumber(L, std::stoi(sep.arg[1]));
|
||||
lua_setfield(L, -2, "slot_id");
|
||||
|
||||
Lua_ItemInst l_item(extra_data);
|
||||
luabind::adl::object l_item_o = luabind::adl::object(L, l_item);
|
||||
l_item_o.push(L);
|
||||
lua_setfield(L, -2, "item");
|
||||
}
|
||||
|
||||
void handle_bot_damage(
|
||||
QuestInterface *parse,
|
||||
lua_State* L,
|
||||
Bot* bot,
|
||||
Mob* init,
|
||||
std::string data,
|
||||
uint32 extra_data,
|
||||
std::vector<std::any> *extra_pointers
|
||||
) {
|
||||
Seperator sep(data.c_str());
|
||||
|
||||
lua_pushnumber(L, std::stoul(sep.arg[0]));
|
||||
lua_setfield(L, -2, "entity_id");
|
||||
|
||||
lua_pushnumber(L, std::stoll(sep.arg[1]));
|
||||
lua_setfield(L, -2, "damage");
|
||||
|
||||
lua_pushnumber(L, std::stoi(sep.arg[2]));
|
||||
lua_setfield(L, -2, "spell_id");
|
||||
|
||||
lua_pushnumber(L, std::stoi(sep.arg[3]));
|
||||
lua_setfield(L, -2, "skill_id");
|
||||
|
||||
lua_pushboolean(L, std::stoi(sep.arg[4]) == 0 ? false : true);
|
||||
lua_setfield(L, -2, "is_damage_shield");
|
||||
|
||||
lua_pushboolean(L, std::stoi(sep.arg[5]) == 0 ? false : true);
|
||||
lua_setfield(L, -2, "is_avoidable");
|
||||
|
||||
lua_pushnumber(L, std::stoi(sep.arg[6]));
|
||||
lua_setfield(L, -2, "buff_slot");
|
||||
|
||||
lua_pushboolean(L, std::stoi(sep.arg[7]) == 0 ? false : true);
|
||||
lua_setfield(L, -2, "is_buff_tic");
|
||||
|
||||
lua_pushnumber(L, std::stoi(sep.arg[8]));
|
||||
lua_setfield(L, -2, "special_attack");
|
||||
|
||||
Lua_Mob l_mob(init);
|
||||
luabind::adl::object l_mob_o = luabind::adl::object(L, l_mob);
|
||||
l_mob_o.push(L);
|
||||
lua_setfield(L, -2, "other");
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -210,16 +210,6 @@ void handle_npc_despawn_zone(
|
||||
std::vector<std::any> *extra_pointers
|
||||
);
|
||||
|
||||
void handle_npc_damage(
|
||||
QuestInterface *parse,
|
||||
lua_State* L,
|
||||
NPC* npc,
|
||||
Mob *init,
|
||||
std::string data,
|
||||
uint32 extra_data,
|
||||
std::vector<std::any> *extra_pointers
|
||||
);
|
||||
|
||||
// Player
|
||||
void handle_player_say(
|
||||
QuestInterface *parse,
|
||||
@@ -383,15 +373,6 @@ void handle_player_task_stage_complete(
|
||||
std::vector<std::any> *extra_pointers
|
||||
);
|
||||
|
||||
void handle_player_task_accepted(
|
||||
QuestInterface* parse,
|
||||
lua_State* L,
|
||||
Client* client,
|
||||
std::string data,
|
||||
uint32 extra_data,
|
||||
std::vector<std::any>* extra_pointers
|
||||
);
|
||||
|
||||
void handle_player_task_update(
|
||||
QuestInterface *parse,
|
||||
lua_State* L,
|
||||
@@ -671,23 +652,6 @@ void handle_player_augment_remove(
|
||||
std::vector<std::any> *extra_pointers
|
||||
);
|
||||
|
||||
void handle_player_damage(
|
||||
QuestInterface *parse,
|
||||
lua_State* L,
|
||||
Client* client,
|
||||
std::string data,
|
||||
uint32 extra_data,
|
||||
std::vector<std::any> *extra_pointers
|
||||
);
|
||||
|
||||
void handle_player_item_click(
|
||||
QuestInterface *parse,
|
||||
lua_State* L,
|
||||
Client* client,
|
||||
std::string data,
|
||||
uint32 extra_data,
|
||||
std::vector<std::any> *extra_pointers
|
||||
);
|
||||
|
||||
// Item
|
||||
void handle_item_click(
|
||||
@@ -991,25 +955,5 @@ void handle_bot_payload(
|
||||
std::vector<std::any> *extra_pointers
|
||||
);
|
||||
|
||||
void handle_bot_equip_item(
|
||||
QuestInterface *parse,
|
||||
lua_State* L,
|
||||
Bot* bot,
|
||||
Mob* init,
|
||||
std::string data,
|
||||
uint32 extra_data,
|
||||
std::vector<std::any> *extra_pointers
|
||||
);
|
||||
|
||||
void handle_bot_damage(
|
||||
QuestInterface *parse,
|
||||
lua_State* L,
|
||||
Bot* bot,
|
||||
Mob* init,
|
||||
std::string data,
|
||||
uint32 extra_data,
|
||||
std::vector<std::any> *extra_pointers
|
||||
);
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -123,7 +123,6 @@ public:
|
||||
bool UseDiscipline(int32 spell_id, int32 target);
|
||||
|
||||
virtual bool IsMerc() const { return true; }
|
||||
bool IsOfClientBotMerc() const override { return true; }
|
||||
|
||||
virtual void FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho);
|
||||
static Merc* LoadMerc(Client *c, MercTemplate* merc_template, uint32 merchant_id, bool updateFromDB = false);
|
||||
|
||||
+1
-3
@@ -657,7 +657,7 @@ public:
|
||||
inline int32 GetHeroicStrikethrough() const { return heroic_strikethrough; }
|
||||
inline const bool GetKeepsSoldItems() const { return keeps_sold_items; }
|
||||
inline void SetKeepsSoldItems(bool in_keeps_sold_items) { keeps_sold_items = in_keeps_sold_items; }
|
||||
int CalcRecommendedLevelBonus(uint8 level, uint8 reclevel, int basestat);
|
||||
|
||||
void CopyHateList(Mob* to);
|
||||
|
||||
//Group
|
||||
@@ -1451,8 +1451,6 @@ public:
|
||||
void SetManualFollow(bool flag) { m_manual_follow = flag; }
|
||||
bool GetManualFollow() const { return m_manual_follow; }
|
||||
|
||||
void DrawDebugCoordinateNode(std::string node_name, const glm::vec4 vec);
|
||||
|
||||
protected:
|
||||
void CommonDamage(Mob* other, int64 &damage, const uint16 spell_id, const EQ::skills::SkillType attack_skill, bool &avoidable, const int8 buffslot, const bool iBuffTic, eSpecialAttacks specal = eSpecialAttacks::None);
|
||||
static uint16 GetProcID(uint16 spell_id, uint8 effect_index);
|
||||
|
||||
+1
-7
@@ -999,13 +999,7 @@ void Mob::AI_Process() {
|
||||
}
|
||||
|
||||
if (door->GetTriggerDoorID() > 0) {
|
||||
auto trigger_door = entity_list.GetDoorsByDoorID(door->GetTriggerDoorID());
|
||||
if (trigger_door) {
|
||||
if (Strings::RemoveNumbers(door->GetDoorName()) !=
|
||||
Strings::RemoveNumbers(trigger_door->GetDoorName())) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (door->GetDoorParam() > 0) {
|
||||
|
||||
@@ -138,7 +138,7 @@ public:
|
||||
return true;
|
||||
}
|
||||
|
||||
//Send a movement packet when you start moving
|
||||
//Send a movement packet when you start moving
|
||||
double current_time = static_cast<double>(Timer::GetCurrentTime()) / 1000.0;
|
||||
int current_speed = 0;
|
||||
|
||||
@@ -1053,13 +1053,6 @@ void MobMovementManager::FillCommandStruct(
|
||||
position_update->delta_z = FloatToEQ13(delta_z);
|
||||
position_update->delta_heading = FloatToEQ10(delta_heading);
|
||||
position_update->animation = (mob->IsBot() ? (int) ((float) anim / 1.785714f) : anim);
|
||||
|
||||
if (RuleB(Map, MobPathingVisualDebug)) {
|
||||
mob->DrawDebugCoordinateNode(
|
||||
fmt::format("{} position update", mob->GetCleanName()),
|
||||
mob->GetPosition()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1100,7 +1093,7 @@ void MobMovementManager::UpdatePath(Mob *who, float x, float y, float z, MobMove
|
||||
}
|
||||
// Below for npcs that can traverse land or water so they don't sink
|
||||
else if (who->GetFlyMode() == GravityBehavior::Water &&
|
||||
zone->watermap->InLiquid(who->GetPosition()) &&
|
||||
zone->watermap->InLiquid(who->GetPosition()) &&
|
||||
zone->watermap->InLiquid(glm::vec3(x, y, z)) &&
|
||||
zone->zonemap->CheckLoS(who->GetPosition(), glm::vec3(x, y, z))) {
|
||||
auto iter = _impl->Entries.find(who);
|
||||
|
||||
+60
-71
@@ -160,43 +160,42 @@ NPC::NPC(const NPCType *npc_type_data, Spawn2 *in_respawn, const glm::vec4 &posi
|
||||
size = 5;
|
||||
}
|
||||
|
||||
taunting = false;
|
||||
proximity = nullptr;
|
||||
copper = 0;
|
||||
silver = 0;
|
||||
gold = 0;
|
||||
platinum = 0;
|
||||
max_dmg = npc_type_data->max_dmg;
|
||||
min_dmg = npc_type_data->min_dmg;
|
||||
attack_count = npc_type_data->attack_count;
|
||||
grid = 0;
|
||||
wp_m = 0;
|
||||
max_wp = 0;
|
||||
save_wp = 0;
|
||||
spawn_group_id = 0;
|
||||
swarmInfoPtr = nullptr;
|
||||
spellscale = npc_type_data->spellscale;
|
||||
healscale = npc_type_data->healscale;
|
||||
pAggroRange = npc_type_data->aggroradius;
|
||||
pAssistRange = npc_type_data->assistradius;
|
||||
findable = npc_type_data->findable;
|
||||
trackable = npc_type_data->trackable;
|
||||
MR = npc_type_data->MR;
|
||||
CR = npc_type_data->CR;
|
||||
DR = npc_type_data->DR;
|
||||
FR = npc_type_data->FR;
|
||||
PR = npc_type_data->PR;
|
||||
Corrup = npc_type_data->Corrup;
|
||||
PhR = npc_type_data->PhR;
|
||||
STR = npc_type_data->STR;
|
||||
STA = npc_type_data->STA;
|
||||
AGI = npc_type_data->AGI;
|
||||
DEX = npc_type_data->DEX;
|
||||
INT = npc_type_data->INT;
|
||||
WIS = npc_type_data->WIS;
|
||||
CHA = npc_type_data->CHA;
|
||||
npc_mana = npc_type_data->Mana;
|
||||
m_is_underwater_only = npc_type_data->underwater;
|
||||
taunting = false;
|
||||
proximity = nullptr;
|
||||
copper = 0;
|
||||
silver = 0;
|
||||
gold = 0;
|
||||
platinum = 0;
|
||||
max_dmg = npc_type_data->max_dmg;
|
||||
min_dmg = npc_type_data->min_dmg;
|
||||
attack_count = npc_type_data->attack_count;
|
||||
grid = 0;
|
||||
wp_m = 0;
|
||||
max_wp = 0;
|
||||
save_wp = 0;
|
||||
spawn_group_id = 0;
|
||||
swarmInfoPtr = nullptr;
|
||||
spellscale = npc_type_data->spellscale;
|
||||
healscale = npc_type_data->healscale;
|
||||
pAggroRange = npc_type_data->aggroradius;
|
||||
pAssistRange = npc_type_data->assistradius;
|
||||
findable = npc_type_data->findable;
|
||||
trackable = npc_type_data->trackable;
|
||||
MR = npc_type_data->MR;
|
||||
CR = npc_type_data->CR;
|
||||
DR = npc_type_data->DR;
|
||||
FR = npc_type_data->FR;
|
||||
PR = npc_type_data->PR;
|
||||
Corrup = npc_type_data->Corrup;
|
||||
PhR = npc_type_data->PhR;
|
||||
STR = npc_type_data->STR;
|
||||
STA = npc_type_data->STA;
|
||||
AGI = npc_type_data->AGI;
|
||||
DEX = npc_type_data->DEX;
|
||||
INT = npc_type_data->INT;
|
||||
WIS = npc_type_data->WIS;
|
||||
CHA = npc_type_data->CHA;
|
||||
npc_mana = npc_type_data->Mana;
|
||||
|
||||
//quick fix of ordering if they screwed it up in the DB
|
||||
if (max_dmg < min_dmg) {
|
||||
@@ -372,16 +371,16 @@ NPC::NPC(const NPCType *npc_type_data, Spawn2 *in_respawn, const glm::vec4 &posi
|
||||
}
|
||||
}
|
||||
|
||||
SetLDoNTrapped(false);
|
||||
SetLDoNTrapType(0);
|
||||
SetLDoNTrapSpellID(0);
|
||||
SetLDoNLocked(false);
|
||||
SetLDoNLockedSkill(0);
|
||||
SetLDoNTrapDetected(false);
|
||||
ldon_trapped = false;
|
||||
ldon_trap_type = 0;
|
||||
ldon_spell_id = 0;
|
||||
ldon_locked = false;
|
||||
ldon_locked_skill = 0;
|
||||
ldon_trap_detected = false;
|
||||
|
||||
if (npc_type_data->trap_template > 0) {
|
||||
std::map<uint32, std::list<LDoNTrapTemplate *> >::iterator trap_ent_iter;
|
||||
std::list<LDoNTrapTemplate *> trap_list;
|
||||
std::list<LDoNTrapTemplate *> trap_list;
|
||||
|
||||
trap_ent_iter = zone->ldon_trap_entry_list.find(npc_type_data->trap_template);
|
||||
if (trap_ent_iter != zone->ldon_trap_entry_list.end()) {
|
||||
@@ -391,25 +390,26 @@ NPC::NPC(const NPCType *npc_type_data, Spawn2 *in_respawn, const glm::vec4 &posi
|
||||
std::advance(trap_list_iter, zone->random.Int(0, trap_list.size() - 1));
|
||||
LDoNTrapTemplate *trap_template = (*trap_list_iter);
|
||||
if (trap_template) {
|
||||
if (trap_template->spell_id > 0) {
|
||||
SetLDoNTrapped(true);
|
||||
SetLDoNTrapSpellID(trap_template->spell_id);
|
||||
} else {
|
||||
SetLDoNTrapped(false);
|
||||
SetLDoNTrapSpellID(0);
|
||||
if ((uint8) trap_template->spell_id > 0) {
|
||||
ldon_trapped = true;
|
||||
ldon_spell_id = trap_template->spell_id;
|
||||
}
|
||||
else {
|
||||
ldon_trapped = false;
|
||||
ldon_spell_id = 0;
|
||||
}
|
||||
|
||||
SetLDoNTrapType(static_cast<uint8>(trap_template->type));
|
||||
|
||||
ldon_trap_type = (uint8) trap_template->type;
|
||||
if (trap_template->locked > 0) {
|
||||
SetLDoNLocked(true);
|
||||
SetLDoNLockedSkill(trap_template->skill);
|
||||
} else {
|
||||
SetLDoNLocked(false);
|
||||
SetLDoNLockedSkill(0);
|
||||
ldon_locked = true;
|
||||
ldon_locked_skill = trap_template->skill;
|
||||
}
|
||||
else {
|
||||
ldon_locked = false;
|
||||
ldon_locked_skill = 0;
|
||||
}
|
||||
|
||||
SetLDoNTrapDetected(false);
|
||||
ldon_trap_detected = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3692,7 +3692,7 @@ void NPC::ReloadSpells() {
|
||||
AI_AddNPCSpellsEffects(GetNPCSpellsEffectsID());
|
||||
}
|
||||
|
||||
void NPC::ScaleNPC(uint8 npc_level, bool always_scale, bool override_special_abilities) {
|
||||
void NPC::ScaleNPC(uint8 npc_level) {
|
||||
if (GetLevel() != npc_level) {
|
||||
SetLevel(npc_level);
|
||||
RecalculateSkills();
|
||||
@@ -3700,7 +3700,7 @@ void NPC::ScaleNPC(uint8 npc_level, bool always_scale, bool override_special_abi
|
||||
}
|
||||
|
||||
npc_scale_manager->ResetNPCScaling(this);
|
||||
npc_scale_manager->ScaleNPC(this, always_scale, override_special_abilities);
|
||||
npc_scale_manager->ScaleNPC(this);
|
||||
}
|
||||
|
||||
bool NPC::IsGuard()
|
||||
@@ -3784,14 +3784,3 @@ int NPC::GetRolledItemCount(uint32 item_id)
|
||||
|
||||
return rolled_count;
|
||||
}
|
||||
|
||||
void NPC::SendPositionToClients()
|
||||
{
|
||||
auto p = new EQApplicationPacket(OP_ClientUpdate, sizeof(PlayerPositionUpdateServer_Struct));
|
||||
auto *s = (PlayerPositionUpdateServer_Struct *) p->pBuffer;
|
||||
for (auto &c: entity_list.GetClientList()) {
|
||||
MakeSpawnUpdate(s);
|
||||
c.second->QueuePacket(p, false);
|
||||
}
|
||||
safe_delete(p);
|
||||
}
|
||||
|
||||
+9
-13
@@ -119,7 +119,7 @@ public:
|
||||
virtual void Damage(Mob* from, int64 damage, uint16 spell_id, EQ::skills::SkillType attack_skill, bool avoidable = true, int8 buffslot = -1, bool iBuffTic = false, eSpecialAttacks special = eSpecialAttacks::None);
|
||||
bool Attack(Mob* other, int Hand = EQ::invslot::slotPrimary, bool FromRiposte = false, bool IsStrikethrough = false,
|
||||
bool IsFromSpell = false, ExtraAttackOptions *opts = nullptr) override;
|
||||
virtual bool HasRaid() { return false; }
|
||||
virtual bool HasRaid() { return false; }
|
||||
virtual bool HasGroup() { return false; }
|
||||
virtual Raid* GetRaid() { return 0; }
|
||||
virtual Group* GetGroup() { return 0; }
|
||||
@@ -413,22 +413,22 @@ public:
|
||||
void ModifyNPCStat(std::string stat, std::string value);
|
||||
virtual void SetLevel(uint8 in_level, bool command = false);
|
||||
|
||||
bool IsLDoNTrapped() const { return ldon_trapped; }
|
||||
bool IsLDoNTrapped() const { return (ldon_trapped); }
|
||||
void SetLDoNTrapped(bool n) { ldon_trapped = n; }
|
||||
|
||||
uint8 GetLDoNTrapType() const { return ldon_trap_type; }
|
||||
uint8 GetLDoNTrapType() const { return (ldon_trap_type); }
|
||||
void SetLDoNTrapType(uint8 n) { ldon_trap_type = n; }
|
||||
|
||||
uint16 GetLDoNTrapSpellID() const { return ldon_spell_id; }
|
||||
uint16 GetLDoNTrapSpellID() const { return (ldon_spell_id); }
|
||||
void SetLDoNTrapSpellID(uint16 n) { ldon_spell_id = n; }
|
||||
|
||||
bool IsLDoNLocked() const { return ldon_locked; }
|
||||
bool IsLDoNLocked() const { return (ldon_locked); }
|
||||
void SetLDoNLocked(bool n) { ldon_locked = n; }
|
||||
|
||||
uint16 GetLDoNLockedSkill() const { return ldon_locked_skill; }
|
||||
uint16 GetLDoNLockedSkill() const { return (ldon_locked_skill); }
|
||||
void SetLDoNLockedSkill(uint16 n) { ldon_locked_skill = n; }
|
||||
|
||||
bool IsLDoNTrapDetected() const { return ldon_trap_detected; }
|
||||
bool IsLDoNTrapDetected() const { return (ldon_trap_detected); }
|
||||
void SetLDoNTrapDetected(bool n) { ldon_trap_detected = n; }
|
||||
|
||||
const bool GetCombatEvent() const { return combat_event; }
|
||||
@@ -437,7 +437,7 @@ public:
|
||||
/* Only allows players that killed corpse to loot */
|
||||
const bool HasPrivateCorpse() const { return NPCTypedata_ours ? NPCTypedata_ours->private_corpse : NPCTypedata->private_corpse; }
|
||||
|
||||
virtual const bool IsUnderwaterOnly() const { return m_is_underwater_only; }
|
||||
virtual const bool IsUnderwaterOnly() const { return NPCTypedata_ours ? NPCTypedata_ours->underwater : NPCTypedata->underwater; }
|
||||
const char* GetRawNPCTypeName() const { return NPCTypedata_ours ? NPCTypedata_ours->name : NPCTypedata->name; }
|
||||
|
||||
virtual int GetKillExpMod() const { return NPCTypedata_ours ? NPCTypedata_ours->exp_mod : NPCTypedata->exp_mod; }
|
||||
@@ -531,13 +531,11 @@ public:
|
||||
|
||||
inline bool IsSkipAutoScale() const { return skip_auto_scale; }
|
||||
|
||||
void ScaleNPC(uint8 npc_level, bool always_scale = false, bool override_special_abilities = false);
|
||||
void ScaleNPC(uint8 npc_level);
|
||||
|
||||
void RecalculateSkills();
|
||||
void ReloadSpells();
|
||||
|
||||
void SendPositionToClients();
|
||||
|
||||
static LootDropEntries_Struct NewLootDropEntry();
|
||||
|
||||
protected:
|
||||
@@ -674,8 +672,6 @@ protected:
|
||||
QGlobalCache *qGlobals;
|
||||
uint32 adventure_template_id;
|
||||
|
||||
bool m_is_underwater_only = false;
|
||||
|
||||
//mercenary stuff
|
||||
std::list<MercType> mercTypeList;
|
||||
std::list<MercData> mercDataList;
|
||||
|
||||
+73
-103
@@ -26,11 +26,7 @@
|
||||
/**
|
||||
* @param npc
|
||||
*/
|
||||
void NpcScaleManager::ScaleNPC(
|
||||
NPC *npc,
|
||||
bool always_scale,
|
||||
bool override_special_abilities
|
||||
)
|
||||
void NpcScaleManager::ScaleNPC(NPC *npc)
|
||||
{
|
||||
if (npc->IsSkipAutoScale() || npc->GetNPCTypeID() == 0) {
|
||||
return;
|
||||
@@ -53,84 +49,65 @@ void NpcScaleManager::ScaleNPC(
|
||||
return;
|
||||
}
|
||||
|
||||
if (always_scale || (npc->GetAC() == 0 && is_auto_scaled)) {
|
||||
npc->ModifyNPCStat("ac", std::to_string(scale_data.ac));
|
||||
if (npc->GetAC() == 0 && is_auto_scaled) {
|
||||
npc->ModifyNPCStat("ac", std::to_string(scale_data.ac).c_str());
|
||||
}
|
||||
|
||||
if (always_scale || npc->GetMaxHP() == 0) {
|
||||
npc->ModifyNPCStat("max_hp", std::to_string(scale_data.hp));
|
||||
if (npc->GetMaxHP() == 0) {
|
||||
npc->ModifyNPCStat("max_hp", std::to_string(scale_data.hp).c_str());
|
||||
npc->Heal();
|
||||
}
|
||||
|
||||
if (always_scale || npc->GetAccuracyRating() == 0) {
|
||||
npc->ModifyNPCStat("accuracy", std::to_string(scale_data.accuracy));
|
||||
if (npc->GetAccuracyRating() == 0) {
|
||||
npc->ModifyNPCStat("accuracy", std::to_string(scale_data.accuracy).c_str());
|
||||
}
|
||||
|
||||
if (always_scale || npc->GetSlowMitigation() == 0) {
|
||||
npc->ModifyNPCStat("slow_mitigation", std::to_string(scale_data.slow_mitigation));
|
||||
if (npc->GetSlowMitigation() == 0) {
|
||||
npc->ModifyNPCStat("slow_mitigation", std::to_string(scale_data.slow_mitigation).c_str());
|
||||
}
|
||||
|
||||
if (always_scale || npc->GetATK() == 0) {
|
||||
npc->ModifyNPCStat("atk", std::to_string(scale_data.attack));
|
||||
if (npc->GetATK() == 0) {
|
||||
npc->ModifyNPCStat("atk", std::to_string(scale_data.attack).c_str());
|
||||
}
|
||||
|
||||
if (always_scale || npc->GetSTR() == 0) {
|
||||
npc->ModifyNPCStat("str", std::to_string(scale_data.strength));
|
||||
if (npc->GetSTR() == 0) {
|
||||
npc->ModifyNPCStat("str", std::to_string(scale_data.strength).c_str());
|
||||
}
|
||||
|
||||
if (always_scale || npc->GetSTA() == 0) {
|
||||
npc->ModifyNPCStat("sta", std::to_string(scale_data.stamina));
|
||||
if (npc->GetSTA() == 0) {
|
||||
npc->ModifyNPCStat("sta", std::to_string(scale_data.stamina).c_str());
|
||||
}
|
||||
|
||||
if (always_scale || npc->GetDEX() == 0) {
|
||||
npc->ModifyNPCStat("dex", std::to_string(scale_data.dexterity));
|
||||
if (npc->GetDEX() == 0) {
|
||||
npc->ModifyNPCStat("dex", std::to_string(scale_data.dexterity).c_str());
|
||||
}
|
||||
|
||||
if (always_scale || npc->GetAGI() == 0) {
|
||||
npc->ModifyNPCStat("agi", std::to_string(scale_data.agility));
|
||||
if (npc->GetAGI() == 0) {
|
||||
npc->ModifyNPCStat("agi", std::to_string(scale_data.agility).c_str());
|
||||
}
|
||||
|
||||
if (always_scale || npc->GetINT() == 0) {
|
||||
npc->ModifyNPCStat("int", std::to_string(scale_data.intelligence));
|
||||
if (npc->GetINT() == 0) {
|
||||
npc->ModifyNPCStat("int", std::to_string(scale_data.intelligence).c_str());
|
||||
}
|
||||
|
||||
if (always_scale || npc->GetWIS() == 0) {
|
||||
npc->ModifyNPCStat("wis", std::to_string(scale_data.wisdom));
|
||||
if (npc->GetWIS() == 0) {
|
||||
npc->ModifyNPCStat("wis", std::to_string(scale_data.wisdom).c_str());
|
||||
}
|
||||
|
||||
if (always_scale || npc->GetCHA() == 0) {
|
||||
npc->ModifyNPCStat("cha", std::to_string(scale_data.charisma));
|
||||
if (npc->GetCHA() == 0) {
|
||||
npc->ModifyNPCStat("cha", std::to_string(scale_data.charisma).c_str());
|
||||
}
|
||||
|
||||
if (always_scale || npc->GetMR() == 0) {
|
||||
npc->ModifyNPCStat("mr", std::to_string(scale_data.magic_resist));
|
||||
if (npc->GetMR() == 0) {
|
||||
npc->ModifyNPCStat("mr", std::to_string(scale_data.magic_resist).c_str());
|
||||
}
|
||||
|
||||
if (always_scale || npc->GetCR() == 0) {
|
||||
npc->ModifyNPCStat("cr", std::to_string(scale_data.cold_resist));
|
||||
if (npc->GetCR() == 0) {
|
||||
npc->ModifyNPCStat("cr", std::to_string(scale_data.cold_resist).c_str());
|
||||
}
|
||||
|
||||
if (always_scale || npc->GetFR() == 0) {
|
||||
npc->ModifyNPCStat("fr", std::to_string(scale_data.fire_resist));
|
||||
if (npc->GetFR() == 0) {
|
||||
npc->ModifyNPCStat("fr", std::to_string(scale_data.fire_resist).c_str());
|
||||
}
|
||||
|
||||
if (always_scale || npc->GetPR() == 0) {
|
||||
npc->ModifyNPCStat("pr", std::to_string(scale_data.poison_resist));
|
||||
if (npc->GetPR() == 0) {
|
||||
npc->ModifyNPCStat("pr", std::to_string(scale_data.poison_resist).c_str());
|
||||
}
|
||||
|
||||
if (always_scale || npc->GetDR() == 0) {
|
||||
npc->ModifyNPCStat("dr", std::to_string(scale_data.disease_resist));
|
||||
if (npc->GetDR() == 0) {
|
||||
npc->ModifyNPCStat("dr", std::to_string(scale_data.disease_resist).c_str());
|
||||
}
|
||||
|
||||
if (always_scale || (npc->GetCorrup() == 0 && is_auto_scaled)) {
|
||||
npc->ModifyNPCStat("cor", std::to_string(scale_data.corruption_resist));
|
||||
if (npc->GetCorrup() == 0 && is_auto_scaled) {
|
||||
npc->ModifyNPCStat("cor", std::to_string(scale_data.corruption_resist).c_str());
|
||||
}
|
||||
|
||||
if (always_scale || (npc->GetPhR() == 0 && is_auto_scaled)) {
|
||||
npc->ModifyNPCStat("phr", std::to_string(scale_data.physical_resist));
|
||||
if (npc->GetPhR() == 0 && is_auto_scaled) {
|
||||
npc->ModifyNPCStat("phr", std::to_string(scale_data.physical_resist).c_str());
|
||||
}
|
||||
|
||||
if (always_scale || npc->GetMinDMG() == 0) {
|
||||
if (npc->GetMinDMG() == 0 && npc->GetMaxDMG() == 0) {
|
||||
int min_dmg = scale_data.min_dmg;
|
||||
if (RuleB(Combat, UseNPCDamageClassLevelMods)) {
|
||||
int32 class_level_damage_mod = GetClassLevelDamageMod(npc->GetLevel(), npc->GetClass());
|
||||
@@ -139,10 +116,9 @@ void NpcScaleManager::ScaleNPC(
|
||||
LogNPCScaling("ClassLevelDamageMod::min_dmg base: [{}] calc: [{}]", scale_data.min_dmg, min_dmg);
|
||||
}
|
||||
|
||||
npc->ModifyNPCStat("min_hit", std::to_string(min_dmg));
|
||||
npc->ModifyNPCStat("min_hit", std::to_string(min_dmg).c_str());
|
||||
}
|
||||
|
||||
if (always_scale || npc->GetMaxDMG() == 0) {
|
||||
if (npc->GetMaxDMG() == 0) {
|
||||
int max_dmg = scale_data.max_dmg;
|
||||
if (RuleB(Combat, UseNPCDamageClassLevelMods)) {
|
||||
int32 class_level_damage_mod = GetClassLevelDamageMod(npc->GetLevel(), npc->GetClass());
|
||||
@@ -151,27 +127,22 @@ void NpcScaleManager::ScaleNPC(
|
||||
LogNPCScaling("ClassLevelDamageMod::max_dmg base: [{}] calc: [{}]", scale_data.max_dmg, max_dmg);
|
||||
}
|
||||
|
||||
npc->ModifyNPCStat("max_hit", std::to_string(max_dmg));
|
||||
npc->ModifyNPCStat("max_hit", std::to_string(max_dmg).c_str());
|
||||
}
|
||||
|
||||
if (always_scale || (npc->GetHPRegen() == 0 && is_auto_scaled)) {
|
||||
npc->ModifyNPCStat("hp_regen", std::to_string(scale_data.hp_regen_rate));
|
||||
if (npc->GetHPRegen() == 0 && is_auto_scaled) {
|
||||
npc->ModifyNPCStat("hp_regen", std::to_string(scale_data.hp_regen_rate).c_str());
|
||||
}
|
||||
|
||||
if (always_scale || npc->GetAttackDelay() == 0) {
|
||||
npc->ModifyNPCStat("attack_delay", std::to_string(scale_data.attack_delay));
|
||||
if (npc->GetAttackDelay() == 0) {
|
||||
npc->ModifyNPCStat("attack_delay", std::to_string(scale_data.attack_delay).c_str());
|
||||
}
|
||||
|
||||
if (always_scale || npc->GetSpellScale() == 0) {
|
||||
npc->ModifyNPCStat("spell_scale", std::to_string(scale_data.spell_scale));
|
||||
if (npc->GetSpellScale() == 0) {
|
||||
npc->ModifyNPCStat("spell_scale", std::to_string(scale_data.spell_scale).c_str());
|
||||
}
|
||||
|
||||
if (always_scale || npc->GetHealScale() == 0) {
|
||||
npc->ModifyNPCStat("heal_scale", std::to_string(scale_data.heal_scale));
|
||||
if (npc->GetHealScale() == 0) {
|
||||
npc->ModifyNPCStat("heal_scale", std::to_string(scale_data.heal_scale).c_str());
|
||||
}
|
||||
|
||||
if (override_special_abilities || (!npc->HasSpecialAbilities() && is_auto_scaled)) {
|
||||
npc->ModifyNPCStat("special_abilities", scale_data.special_abilities);
|
||||
if (!npc->HasSpecialAbilities() && is_auto_scaled) {
|
||||
npc->ModifyNPCStat("special_abilities", scale_data.special_abilities.c_str());
|
||||
}
|
||||
|
||||
if (LogSys.log_settings[Logs::NPCScaling].is_category_enabled == 1) {
|
||||
@@ -190,18 +161,18 @@ void NpcScaleManager::ScaleNPC(
|
||||
npc_level,
|
||||
npc_type,
|
||||
(is_auto_scaled ? "true" : "false"),
|
||||
scale_log
|
||||
scale_log.c_str()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
void NpcScaleManager::ResetNPCScaling(NPC* npc)
|
||||
void NpcScaleManager::ResetNPCScaling(NPC *npc)
|
||||
{
|
||||
for (const auto &scaling_stat : scaling_stats) {
|
||||
auto stat_name = fmt::format("modify_stat_{}", scaling_stat);
|
||||
auto reset_value = std::to_string(0);
|
||||
if (npc->EntityVariableExists(stat_name)) {
|
||||
npc->ModifyNPCStat(scaling_stat, reset_value);
|
||||
npc->ModifyNPCStat(scaling_stat.c_str(), reset_value.c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -459,25 +430,24 @@ std::string NpcScaleManager::GetNPCScalingTypeName(NPC *&npc)
|
||||
* @param npc
|
||||
* @return
|
||||
*/
|
||||
bool NpcScaleManager::IsAutoScaled(NPC* npc)
|
||||
bool NpcScaleManager::IsAutoScaled(NPC *npc)
|
||||
{
|
||||
return (
|
||||
npc->GetHP() == 0 &&
|
||||
npc->GetMaxDMG() == 0 &&
|
||||
npc->GetMinDMG() == 0 &&
|
||||
npc->GetSTR() == 0 &&
|
||||
npc->GetSTA() == 0 &&
|
||||
npc->GetDEX() == 0 &&
|
||||
npc->GetAGI() == 0 &&
|
||||
npc->GetINT() == 0 &&
|
||||
npc->GetWIS() == 0 &&
|
||||
npc->GetCHA() == 0 &&
|
||||
npc->GetMR() == 0 &&
|
||||
npc->GetFR() == 0 &&
|
||||
npc->GetCR() == 0 &&
|
||||
npc->GetPR() == 0 &&
|
||||
npc->GetDR() == 0
|
||||
);
|
||||
return
|
||||
(npc->GetHP() == 0 &&
|
||||
npc->GetMaxDMG() == 0 &&
|
||||
npc->GetMinDMG() == 0 &&
|
||||
npc->GetSTR() == 0 &&
|
||||
npc->GetSTA() == 0 &&
|
||||
npc->GetDEX() == 0 &&
|
||||
npc->GetAGI() == 0 &&
|
||||
npc->GetINT() == 0 &&
|
||||
npc->GetWIS() == 0 &&
|
||||
npc->GetCHA() == 0 &&
|
||||
npc->GetMR() == 0 &&
|
||||
npc->GetFR() == 0 &&
|
||||
npc->GetCR() == 0 &&
|
||||
npc->GetPR() == 0 &&
|
||||
npc->GetDR() == 0);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -86,9 +86,9 @@ public:
|
||||
"special_abilities"
|
||||
};
|
||||
|
||||
void ScaleNPC(NPC* npc, bool always_scale = false, bool override_special_abilities = false);
|
||||
void ResetNPCScaling(NPC* npc);
|
||||
bool IsAutoScaled(NPC* npc);
|
||||
void ScaleNPC(NPC * npc);
|
||||
void ResetNPCScaling(NPC * npc);
|
||||
bool IsAutoScaled(NPC * npc);
|
||||
bool LoadScaleData();
|
||||
|
||||
global_npc_scale GetGlobalScaleDataForTypeLevel(int8 npc_type, int npc_level);
|
||||
|
||||
+3
-9
@@ -507,15 +507,9 @@ bool Object::HandleClick(Client* sender, const ClickObject_Struct* click_object)
|
||||
cursordelete = true; // otherwise, we delete the new one
|
||||
}
|
||||
|
||||
if (item->RecastDelay) {
|
||||
if (item->RecastType != RECAST_TYPE_UNLINKED_ITEM) {
|
||||
m_inst->SetRecastTimestamp(
|
||||
database.GetItemRecastTimestamp(sender->CharacterID(), item->RecastType));
|
||||
} else {
|
||||
m_inst->SetRecastTimestamp(
|
||||
database.GetItemRecastTimestamp(sender->CharacterID(), item->ID));
|
||||
}
|
||||
}
|
||||
if (item->RecastDelay)
|
||||
m_inst->SetRecastTimestamp(
|
||||
database.GetItemRecastTimestamp(sender->CharacterID(), item->RecastType));
|
||||
|
||||
std::string export_string = fmt::format("{}", item->ID);
|
||||
std::vector<std::any> args;
|
||||
|
||||
@@ -385,66 +385,6 @@ void Perl_Bot_Camp(Bot* self, bool save_to_database) // @categories Script Utili
|
||||
self->Camp(save_to_database);
|
||||
}
|
||||
|
||||
perl::array Perl_Bot_GetAugmentIDsBySlotID(Bot* self, int16 slot_id)
|
||||
{
|
||||
perl::array result;
|
||||
auto augments = self->GetInv().GetAugmentIDsBySlotID(slot_id);
|
||||
|
||||
for (int i = 0; i < augments.size(); ++i) {
|
||||
result.push_back(augments[i]);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void Perl_Bot_AddItem(Bot *self, perl::reference table_ref)
|
||||
{
|
||||
perl::hash table = table_ref;
|
||||
if (!table.exists("item_id") || !table.exists("charges"))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
uint32 item_id = table["item_id"];
|
||||
int16 charges = table["charges"];
|
||||
uint32 augment_one = table.exists("augment_one") ? table["augment_one"] : 0;
|
||||
uint32 augment_two = table.exists("augment_two") ? table["augment_two"] : 0;
|
||||
uint32 augment_three = table.exists("augment_three") ? table["augment_three"] : 0;
|
||||
uint32 augment_four = table.exists("augment_four") ? table["augment_four"] : 0;
|
||||
uint32 augment_five = table.exists("augment_five") ? table["augment_five"] : 0;
|
||||
uint32 augment_six = table.exists("augment_six") ? table["augment_six"] : 0;
|
||||
bool attuned = table.exists("attuned") && table["attuned"];
|
||||
uint16 slot_id = table.exists("slot_id") ? table["slot_id"] : EQ::invslot::slotCursor;
|
||||
|
||||
if (slot_id <= EQ::invslot::slotAmmo) {
|
||||
self->AddBotItem(
|
||||
slot_id,
|
||||
item_id,
|
||||
charges,
|
||||
attuned,
|
||||
augment_one,
|
||||
augment_two,
|
||||
augment_three,
|
||||
augment_four,
|
||||
augment_five,
|
||||
augment_six
|
||||
);
|
||||
} else {
|
||||
self->GetOwner()->CastToClient()->SummonItem(
|
||||
item_id,
|
||||
charges,
|
||||
augment_one,
|
||||
augment_two,
|
||||
augment_three,
|
||||
augment_four,
|
||||
augment_five,
|
||||
augment_six,
|
||||
attuned,
|
||||
slot_id
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
void perl_register_bot()
|
||||
{
|
||||
perl::interpreter state(PERL_GET_THX);
|
||||
@@ -460,7 +400,6 @@ void perl_register_bot()
|
||||
package.add("AddBotItem", (void(*)(Bot*, uint16, uint32, uint16, bool, uint32, uint32, uint32, uint32))&Perl_Bot_AddBotItem);
|
||||
package.add("AddBotItem", (void(*)(Bot*, uint16, uint32, uint16, bool, uint32, uint32, uint32, uint32, uint32))&Perl_Bot_AddBotItem);
|
||||
package.add("AddBotItem", (void(*)(Bot*, uint16, uint32, uint16, bool, uint32, uint32, uint32, uint32, uint32, uint32))&Perl_Bot_AddBotItem);
|
||||
package.add("AddItem", &Perl_Bot_AddItem);
|
||||
package.add("ApplySpell", (void(*)(Bot*, int))&Perl_Bot_ApplySpell);
|
||||
package.add("ApplySpell", (void(*)(Bot*, int, int))&Perl_Bot_ApplySpell);
|
||||
package.add("ApplySpell", (void(*)(Bot*, int, int, bool))&Perl_Bot_ApplySpell);
|
||||
@@ -481,7 +420,6 @@ void perl_register_bot()
|
||||
package.add("Fling", (void(*)(Bot*, float, float, float, float, bool, bool))&Perl_Bot_Fling);
|
||||
package.add("GetAugmentAt", &Perl_Bot_GetAugmentAt);
|
||||
package.add("GetAugmentIDAt", &Perl_Bot_GetAugmentIDAt);
|
||||
package.add("GetAugmentIDsBySlotID", &Perl_Bot_GetAugmentIDsBySlotID);
|
||||
package.add("GetBaseAGI", &Perl_Bot_GetBaseAGI);
|
||||
package.add("GetBaseCHA", &Perl_Bot_GetBaseCHA);
|
||||
package.add("GetBaseDEX", &Perl_Bot_GetBaseDEX);
|
||||
|
||||
@@ -2872,26 +2872,6 @@ void Perl_Client_CampAllBots(Client* self, uint8 class_id)
|
||||
self->CampAllBots(class_id);
|
||||
}
|
||||
|
||||
void Perl_Client_ResetItemCooldown(Client* self, uint32 item_id)
|
||||
{
|
||||
self->ResetItemCooldown(item_id);
|
||||
}
|
||||
|
||||
void Perl_Client_SetItemCooldown(Client* self, uint32 item_id, uint32 in_time)
|
||||
{
|
||||
self->SetItemCooldown(item_id, false, in_time);
|
||||
}
|
||||
|
||||
uint32 Perl_Client_GetItemCooldown(Client* self, uint32 item_id)
|
||||
{
|
||||
return self->GetItemCooldown(item_id);
|
||||
}
|
||||
|
||||
void Perl_Client_UseAugmentContainer(Client* self, int container_slot)
|
||||
{
|
||||
self->UseAugmentContainer(container_slot);
|
||||
}
|
||||
|
||||
void perl_register_client()
|
||||
{
|
||||
perl::interpreter perl(PERL_GET_THX);
|
||||
@@ -3086,7 +3066,6 @@ void perl_register_client()
|
||||
package.add("GetInventory", &Perl_Client_GetInventory);
|
||||
package.add("GetInvulnerableEnvironmentDamage", &Perl_Client_GetInvulnerableEnvironmentDamage);
|
||||
package.add("GetItemAt", &Perl_Client_GetItemAt);
|
||||
package.add("GetItemCooldown", &Perl_Client_GetItemCooldown);
|
||||
package.add("GetItemIDAt", &Perl_Client_GetItemIDAt);
|
||||
package.add("GetItemInInventory", &Perl_Client_GetItemInInventory);
|
||||
package.add("GetLDoNLosses", &Perl_Client_GetLDoNLosses);
|
||||
@@ -3252,7 +3231,6 @@ void perl_register_client()
|
||||
package.add("ResetCastbarCooldownBySlot", &Perl_Client_ResetCastbarCooldownBySlot);
|
||||
package.add("ResetCastbarCooldownBySpellID", &Perl_Client_ResetCastbarCooldownBySpellID);
|
||||
package.add("ResetDisciplineTimer", &Perl_Client_ResetDisciplineTimer);
|
||||
package.add("ResetItemCooldown", &Perl_Client_ResetItemCooldown);
|
||||
package.add("ResetTrade", &Perl_Client_ResetTrade);
|
||||
package.add("Save", &Perl_Client_Save);
|
||||
package.add("SaveBackup", &Perl_Client_SaveBackup);
|
||||
@@ -3329,7 +3307,6 @@ void perl_register_client()
|
||||
package.add("SetHunger", &Perl_Client_SetHunger);
|
||||
package.add("SetIPExemption", &Perl_Client_SetIPExemption);
|
||||
package.add("SetInvulnerableEnvironmentDamage", &Perl_Client_SetInvulnerableEnvironmentDamage);
|
||||
package.add("SetItemCooldown", &Perl_Client_SetItemCooldown);
|
||||
package.add("SetLanguageSkill", &Perl_Client_SetLanguageSkill);
|
||||
package.add("SetMaterial", &Perl_Client_SetMaterial);
|
||||
package.add("SetPEQZoneFlag", &Perl_Client_SetPEQZoneFlag);
|
||||
@@ -3419,7 +3396,6 @@ void perl_register_client()
|
||||
package.add("UpdateWho", (void(*)(Client*))&Perl_Client_UpdateWho);
|
||||
package.add("UpdateWho", (void(*)(Client*, uint8))&Perl_Client_UpdateWho);
|
||||
package.add("UseDiscipline", &Perl_Client_UseDiscipline);
|
||||
package.add("UseAugmentContainer", &Perl_Client_UseAugmentContainer);
|
||||
package.add("WorldKick", &Perl_Client_WorldKick);
|
||||
}
|
||||
|
||||
|
||||
+6
-84
@@ -594,6 +594,11 @@ void Perl_NPC_RecalculateSkills(NPC* self) // @categories Skills and Recipes
|
||||
self->RecalculateSkills();
|
||||
}
|
||||
|
||||
void Perl_NPC_ScaleNPC(NPC* self, uint8 npc_level)
|
||||
{
|
||||
return self->ScaleNPC(npc_level);
|
||||
}
|
||||
|
||||
bool Perl_NPC_IsRaidTarget(NPC* self)
|
||||
{
|
||||
return self->IsRaidTarget();
|
||||
@@ -685,76 +690,6 @@ void Perl_NPC_SetKeepsSoldItems(NPC* self, bool keeps_sold_items)
|
||||
self->SetKeepsSoldItems(keeps_sold_items);
|
||||
}
|
||||
|
||||
bool Perl_NPC_IsLDoNTrapped(NPC* self)
|
||||
{
|
||||
return self->IsLDoNTrapped();
|
||||
}
|
||||
|
||||
void Perl_NPC_SetLDoNTrapped(NPC* self, bool is_trapped)
|
||||
{
|
||||
self->SetLDoNTrapped(is_trapped);
|
||||
}
|
||||
|
||||
uint8 Perl_NPC_GetLDoNTrapType(NPC* self)
|
||||
{
|
||||
return self->GetLDoNTrapType();
|
||||
}
|
||||
|
||||
void Perl_NPC_SetLDoNTrapType(NPC* self, uint8 trap_type)
|
||||
{
|
||||
self->SetLDoNTrapType(trap_type);
|
||||
}
|
||||
|
||||
uint16 Perl_NPC_GetLDoNTrapSpellID(NPC* self)
|
||||
{
|
||||
return self->GetLDoNTrapSpellID();
|
||||
}
|
||||
|
||||
void Perl_NPC_SetLDoNTrapSpellID(NPC* self, uint16 spell_id)
|
||||
{
|
||||
self->SetLDoNTrapSpellID(spell_id);
|
||||
}
|
||||
|
||||
bool Perl_NPC_IsLDoNLocked(NPC* self)
|
||||
{
|
||||
return self->IsLDoNLocked();
|
||||
}
|
||||
|
||||
void Perl_NPC_SetLDoNLocked(NPC* self, bool is_locked)
|
||||
{
|
||||
self->SetLDoNLocked(is_locked);
|
||||
}
|
||||
|
||||
uint16 Perl_NPC_GetLDoNLockedSkill(NPC* self)
|
||||
{
|
||||
return self->GetLDoNLockedSkill();
|
||||
}
|
||||
|
||||
void Perl_NPC_SetLDoNLockedSkill(NPC* self, uint16 skill_value)
|
||||
{
|
||||
self->SetLDoNLockedSkill(skill_value);
|
||||
}
|
||||
|
||||
bool Perl_NPC_IsLDoNTrapDetected(NPC* self)
|
||||
{
|
||||
return self->IsLDoNTrapDetected();
|
||||
}
|
||||
|
||||
void Perl_NPC_SetLDoNTrapDetected(NPC* self, bool is_detected)
|
||||
{
|
||||
self->SetLDoNTrapDetected(is_detected);
|
||||
}
|
||||
|
||||
void Perl_NPC_ScaleNPC(NPC* self, uint8 npc_level)
|
||||
{
|
||||
return self->ScaleNPC(npc_level);
|
||||
}
|
||||
|
||||
void Perl_NPC_ScaleNPC(NPC* self, uint8 npc_level, bool override_special_abilities)
|
||||
{
|
||||
return self->ScaleNPC(npc_level, override_special_abilities);
|
||||
}
|
||||
|
||||
void perl_register_npc()
|
||||
{
|
||||
perl::interpreter perl(PERL_GET_THX);
|
||||
@@ -807,9 +742,6 @@ void perl_register_npc()
|
||||
package.add("GetHealScale", &Perl_NPC_GetHealScale);
|
||||
package.add("GetItemIDBySlot", &Perl_NPC_GetItemIDBySlot);
|
||||
package.add("GetKeepsSoldItems", &Perl_NPC_GetKeepsSoldItems);
|
||||
package.add("GetLDoNLockedSkill", &Perl_NPC_GetLDoNLockedSkill);
|
||||
package.add("GetLDoNTrapType", &Perl_NPC_GetLDoNTrapType);
|
||||
package.add("GetLDoNTrapSpellID", &Perl_NPC_GetLDoNTrapSpellID);
|
||||
package.add("GetLootList", &Perl_NPC_GetLootList);
|
||||
package.add("GetLoottableID", &Perl_NPC_GetLoottableID);
|
||||
package.add("GetMaxDMG", &Perl_NPC_GetMaxDMG);
|
||||
@@ -845,9 +777,6 @@ void perl_register_npc()
|
||||
package.add("HasItem", &Perl_NPC_HasItem);
|
||||
package.add("IsAnimal", &Perl_NPC_IsAnimal);
|
||||
package.add("IsGuarding", &Perl_NPC_IsGuarding);
|
||||
package.add("IsLDoNLocked", &Perl_NPC_IsLDoNLocked);
|
||||
package.add("IsLDoNTrapped", &Perl_NPC_IsLDoNTrapped);
|
||||
package.add("IsLDoNTrapDetected", &Perl_NPC_IsLDoNTrapDetected);;
|
||||
package.add("IsOnHatelist", &Perl_NPC_IsOnHatelist);
|
||||
package.add("IsRaidTarget", &Perl_NPC_IsRaidTarget);
|
||||
package.add("IsRareSpawn", &Perl_NPC_IsRareSpawn);
|
||||
@@ -877,18 +806,11 @@ void perl_register_npc()
|
||||
package.add("SaveGuardSpot", (void(*)(NPC*))&Perl_NPC_SaveGuardSpot);
|
||||
package.add("SaveGuardSpot", (void(*)(NPC*, bool))&Perl_NPC_SaveGuardSpot);
|
||||
package.add("SaveGuardSpot", (void(*)(NPC*, float, float, float, float))&Perl_NPC_SaveGuardSpot);
|
||||
package.add("ScaleNPC", (void(*)(NPC*, uint8))&Perl_NPC_ScaleNPC);
|
||||
package.add("ScaleNPC", (void(*)(NPC*, uint8, bool))&Perl_NPC_ScaleNPC);
|
||||
package.add("ScaleNPC", &Perl_NPC_ScaleNPC);
|
||||
package.add("SendPayload", (void(*)(NPC*, int))&Perl_NPC_SendPayload);
|
||||
package.add("SendPayload", (void(*)(NPC*, int, std::string))&Perl_NPC_SendPayload);
|
||||
package.add("SetCopper", &Perl_NPC_SetCopper);
|
||||
package.add("SetKeepsSoldItems", &Perl_NPC_SetKeepsSoldItems);
|
||||
package.add("SetLDoNLocked", &Perl_NPC_SetLDoNLocked);
|
||||
package.add("SetLDoNLockedSkill", &Perl_NPC_SetLDoNLockedSkill);
|
||||
package.add("SetLDoNTrapped", &Perl_NPC_SetLDoNTrapped);
|
||||
package.add("SetLDoNTrapDetected", &Perl_NPC_SetLDoNTrapDetected);
|
||||
package.add("SetLDoNTrapSpellID", &Perl_NPC_SetLDoNTrapSpellID);
|
||||
package.add("SetLDoNTrapType", &Perl_NPC_SetLDoNTrapType);
|
||||
package.add("SetGold", &Perl_NPC_SetGold);
|
||||
package.add("SetGrid", &Perl_NPC_SetGrid);
|
||||
package.add("SetNPCFactionID", &Perl_NPC_SetNPCFactionID);
|
||||
|
||||
@@ -103,8 +103,8 @@ void QuestParserCollection::RemoveEncounter(const std::string name) {
|
||||
}
|
||||
}
|
||||
|
||||
bool QuestParserCollection::HasQuestSub(uint32 npcid, QuestEventID evt) {
|
||||
return HasQuestSubLocal(npcid, evt) || HasQuestSubGlobal(evt) || NPCHasEncounterSub(npcid, evt);
|
||||
bool QuestParserCollection::HasQuestSub(uint32 npcid, QuestEventID evt, bool check_encounters) {
|
||||
return HasQuestSubLocal(npcid, evt) || HasQuestSubGlobal(evt) || (check_encounters && NPCHasEncounterSub(npcid, evt));
|
||||
}
|
||||
|
||||
bool QuestParserCollection::NPCHasEncounterSub(uint32 npc_id, QuestEventID evt) {
|
||||
@@ -162,8 +162,8 @@ bool QuestParserCollection::HasQuestSubGlobal(QuestEventID evt) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool QuestParserCollection::PlayerHasQuestSub(QuestEventID evt) {
|
||||
return PlayerHasQuestSubLocal(evt) || PlayerHasQuestSubGlobal(evt) || PlayerHasEncounterSub(evt);
|
||||
bool QuestParserCollection::PlayerHasQuestSub(QuestEventID evt, bool check_encounters) {
|
||||
return PlayerHasQuestSubLocal(evt) || PlayerHasQuestSubGlobal(evt) || (check_encounters && PlayerHasEncounterSub(evt));
|
||||
}
|
||||
|
||||
bool QuestParserCollection::PlayerHasEncounterSub(QuestEventID evt) {
|
||||
@@ -207,8 +207,8 @@ bool QuestParserCollection::SpellHasEncounterSub(uint32 spell_id, QuestEventID e
|
||||
return HasEncounterSub(evt, package_name);
|
||||
}
|
||||
|
||||
bool QuestParserCollection::SpellHasQuestSub(uint32 spell_id, QuestEventID evt) {
|
||||
if (SpellHasEncounterSub(spell_id, evt)) {
|
||||
bool QuestParserCollection::SpellHasQuestSub(uint32 spell_id, QuestEventID evt, bool check_encounters) {
|
||||
if (check_encounters && SpellHasEncounterSub(spell_id, evt)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -241,11 +241,11 @@ bool QuestParserCollection::ItemHasEncounterSub(EQ::ItemInstance* item, QuestEve
|
||||
return false;
|
||||
}
|
||||
|
||||
bool QuestParserCollection::ItemHasQuestSub(EQ::ItemInstance *itm, QuestEventID evt) {
|
||||
bool QuestParserCollection::ItemHasQuestSub(EQ::ItemInstance *itm, QuestEventID evt, bool check_encounters) {
|
||||
if (itm == nullptr)
|
||||
return false;
|
||||
|
||||
if (ItemHasEncounterSub(itm, evt)) {
|
||||
if (check_encounters && ItemHasEncounterSub(itm, evt)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -67,10 +67,10 @@ public:
|
||||
void ReloadQuests(bool reset_timers = true);
|
||||
void RemoveEncounter(const std::string name);
|
||||
|
||||
bool HasQuestSub(uint32 npcid, QuestEventID evt);
|
||||
bool PlayerHasQuestSub(QuestEventID evt);
|
||||
bool SpellHasQuestSub(uint32 spell_id, QuestEventID evt);
|
||||
bool ItemHasQuestSub(EQ::ItemInstance *itm, QuestEventID evt);
|
||||
bool HasQuestSub(uint32 npcid, QuestEventID evt, bool check_encounters = false);
|
||||
bool PlayerHasQuestSub(QuestEventID evt, bool check_encounters = false);
|
||||
bool SpellHasQuestSub(uint32 spell_id, QuestEventID evt, bool check_encounters = false);
|
||||
bool ItemHasQuestSub(EQ::ItemInstance *itm, QuestEventID evt, bool check_encounters = false);
|
||||
bool BotHasQuestSub(QuestEventID evt);
|
||||
|
||||
int EventNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data,
|
||||
|
||||
+1
-5
@@ -3969,7 +3969,7 @@ bool QuestManager::DoAugmentSlotsMatch(uint32 item_one, uint32 item_two)
|
||||
return true;
|
||||
}
|
||||
|
||||
int8 QuestManager::DoesAugmentFit(EQ::ItemInstance* inst, uint32 augment_id, uint8 augment_slot)
|
||||
int8 QuestManager::DoesAugmentFit(EQ::ItemInstance* inst, uint32 augment_id)
|
||||
{
|
||||
if (!inst) {
|
||||
return INVALID_INDEX;
|
||||
@@ -3980,9 +3980,5 @@ int8 QuestManager::DoesAugmentFit(EQ::ItemInstance* inst, uint32 augment_id, uin
|
||||
return INVALID_INDEX;
|
||||
}
|
||||
|
||||
if (augment_slot != 255) {
|
||||
return !inst->IsAugmentSlotAvailable(aug_inst->AugType, augment_slot) ? INVALID_INDEX : augment_slot;
|
||||
}
|
||||
|
||||
return inst->AvailableAugmentSlot(aug_inst->AugType);
|
||||
}
|
||||
|
||||
+1
-1
@@ -346,7 +346,7 @@ public:
|
||||
std::string GetRecipeName(uint32 recipe_id);
|
||||
bool HasRecipeLearned(uint32 recipe_id);
|
||||
bool DoAugmentSlotsMatch(uint32 item_one, uint32 item_two);
|
||||
int8 DoesAugmentFit(EQ::ItemInstance* inst, uint32 augment_id, uint8 augment_slot = 255);
|
||||
int8 DoesAugmentFit(EQ::ItemInstance* inst, uint32 augment_id);
|
||||
|
||||
Bot *GetBot() const;
|
||||
Client *GetInitiator() const;
|
||||
|
||||
@@ -2901,16 +2901,14 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove
|
||||
since effect can potentially kill caster.
|
||||
*/
|
||||
case SE_Health_Transfer: {
|
||||
if (caster) {
|
||||
effect_value = spells[spell_id].limit_value[i];
|
||||
int64 amt = std::abs(caster->GetMaxHP() * effect_value / 1000);
|
||||
effect_value = spells[spell_id].limit_value[i];
|
||||
int64 amt = std::abs(caster->GetMaxHP() * effect_value / 1000);
|
||||
|
||||
if (effect_value < 0) {
|
||||
Damage(caster, amt, spell_id, spell.skill, false, buffslot, false);
|
||||
}
|
||||
else {
|
||||
HealDamage(amt, caster);
|
||||
}
|
||||
if (effect_value < 0) {
|
||||
Damage(caster, amt, spell_id, spell.skill, false, buffslot, false);
|
||||
}
|
||||
else {
|
||||
HealDamage(amt, caster);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
+8
-59
@@ -3205,10 +3205,8 @@ bool Mob::CheckSpellLevelRestriction(Mob *caster, uint16 spell_id)
|
||||
|
||||
// NON GM clients might be restricted by rule setting
|
||||
if (caster->IsClient()) {
|
||||
if (IsClient()) { // Only restrict client on client for this rule
|
||||
if (RuleB(Spells, BuffLevelRestrictions)) {
|
||||
check_for_restrictions = true;
|
||||
}
|
||||
if (RuleB(Spells, BuffLevelRestrictions)) {
|
||||
check_for_restrictions = true;
|
||||
}
|
||||
}
|
||||
// NPCS might be restricted by rule setting
|
||||
@@ -6344,9 +6342,9 @@ void Client::SendSpellAnim(uint16 target_id, uint16 spell_id)
|
||||
entity_list.QueueCloseClients(this, &app, false, RuleI(Range, SpellParticles));
|
||||
}
|
||||
|
||||
void Client::SendItemRecastTimer(int32 recast_type, uint32 recast_delay, bool in_ignore_casting_requirement)
|
||||
void Client::SendItemRecastTimer(int32 recast_type, uint32 recast_delay)
|
||||
{
|
||||
if (recast_type == RECAST_TYPE_UNLINKED_ITEM) {
|
||||
if (recast_type == -1) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -6359,7 +6357,6 @@ void Client::SendItemRecastTimer(int32 recast_type, uint32 recast_delay, bool in
|
||||
ItemRecastDelay_Struct *ird = (ItemRecastDelay_Struct *)outapp->pBuffer;
|
||||
ird->recast_delay = recast_delay;
|
||||
ird->recast_type = static_cast<uint32>(recast_type);
|
||||
ird->ignore_casting_requirement = in_ignore_casting_requirement; //True allows reset of item cast timers
|
||||
QueuePacket(outapp);
|
||||
safe_delete(outapp);
|
||||
}
|
||||
@@ -6372,12 +6369,10 @@ void Client::SetItemRecastTimer(int32 spell_id, uint32 inventory_slot)
|
||||
int recast_delay = 0;
|
||||
int recast_type = 0;
|
||||
bool from_augment = false;
|
||||
int item_casting = 0;
|
||||
|
||||
if (!item) {
|
||||
return;
|
||||
}
|
||||
item_casting = item->GetItem()->ID;
|
||||
|
||||
//Check primary item.
|
||||
if (item->GetItem()->RecastDelay > 0) {
|
||||
@@ -6401,7 +6396,6 @@ void Client::SetItemRecastTimer(int32 spell_id, uint32 inventory_slot)
|
||||
recast_delay = aug_i->GetItem()->RecastDelay;
|
||||
recast_type = aug_i->GetItem()->RecastType;
|
||||
from_augment = true;
|
||||
item_casting = aug_i->GetItem()->ID;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -6416,20 +6410,13 @@ void Client::SetItemRecastTimer(int32 spell_id, uint32 inventory_slot)
|
||||
|
||||
if (recast_delay > 0) {
|
||||
|
||||
if (recast_type != RECAST_TYPE_UNLINKED_ITEM) {
|
||||
GetPTimers().Start((pTimerItemStart + recast_type), static_cast<uint32>(recast_delay));
|
||||
database.UpdateItemRecast(
|
||||
GetPTimers().Start((pTimerItemStart + recast_type), static_cast<uint32>(recast_delay));
|
||||
if (recast_type != -1) {
|
||||
database.UpdateItemRecastTimestamps(
|
||||
CharacterID(),
|
||||
recast_type,
|
||||
GetPTimers().Get(pTimerItemStart + recast_type)->GetReadyTimestamp()
|
||||
);
|
||||
} else if (recast_type == RECAST_TYPE_UNLINKED_ITEM) {
|
||||
GetPTimers().Start((pTimerNegativeItemReuse * item_casting), static_cast<uint32>(recast_delay));
|
||||
database.UpdateItemRecast(
|
||||
CharacterID(),
|
||||
item_casting,
|
||||
GetPTimers().Get(pTimerNegativeItemReuse * item_casting)->GetReadyTimestamp()
|
||||
);
|
||||
}
|
||||
|
||||
if (!from_augment) {
|
||||
@@ -6438,32 +6425,12 @@ void Client::SetItemRecastTimer(int32 spell_id, uint32 inventory_slot)
|
||||
}
|
||||
}
|
||||
|
||||
void Client::DeleteItemRecastTimer(uint32 item_id)
|
||||
{
|
||||
const auto* d = database.GetItem(item_id);
|
||||
|
||||
if (!d) {
|
||||
return;
|
||||
}
|
||||
|
||||
const auto recast_type = d->RecastType != RECAST_TYPE_UNLINKED_ITEM ? d->RecastType : item_id;
|
||||
const int timer_id = d->RecastType != RECAST_TYPE_UNLINKED_ITEM ? (pTimerItemStart + recast_type) : (pTimerNegativeItemReuse * item_id);
|
||||
|
||||
database.DeleteItemRecast(CharacterID(), recast_type);
|
||||
GetPTimers().Clear(&database, timer_id);
|
||||
|
||||
if (recast_type != RECAST_TYPE_UNLINKED_ITEM) {
|
||||
SendItemRecastTimer(recast_type, 1, true);
|
||||
}
|
||||
}
|
||||
|
||||
bool Client::HasItemRecastTimer(int32 spell_id, uint32 inventory_slot)
|
||||
{
|
||||
EQ::ItemInstance *item = CastToClient()->GetInv().GetItem(inventory_slot);
|
||||
|
||||
int recast_delay = 0;
|
||||
int recast_type = 0;
|
||||
int item_id = 0;
|
||||
bool from_augment = false;
|
||||
|
||||
if (!item) {
|
||||
@@ -6478,7 +6445,6 @@ bool Client::HasItemRecastTimer(int32 spell_id, uint32 inventory_slot)
|
||||
if (item->GetItem()->RecastDelay > 0) {
|
||||
recast_type = item->GetItem()->RecastType;
|
||||
recast_delay = item->GetItem()->RecastDelay;
|
||||
item_id = item->GetItem()->ID;
|
||||
}
|
||||
//Check augmenent
|
||||
else {
|
||||
@@ -6497,7 +6463,6 @@ bool Client::HasItemRecastTimer(int32 spell_id, uint32 inventory_slot)
|
||||
if (aug_i->GetItem() && aug_i->GetItem()->RecastDelay > 0) {
|
||||
recast_delay = aug_i->GetItem()->RecastDelay;
|
||||
recast_type = aug_i->GetItem()->RecastType;
|
||||
item_id = aug_i->GetItem()->ID;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -6508,9 +6473,7 @@ bool Client::HasItemRecastTimer(int32 spell_id, uint32 inventory_slot)
|
||||
return false;
|
||||
}
|
||||
//if time is not expired, then it exists and therefore we have a recast on this item.
|
||||
if (recast_type != RECAST_TYPE_UNLINKED_ITEM && !CastToClient()->GetPTimers().Expired(&database, (pTimerItemStart + recast_type), false)) {
|
||||
return true;
|
||||
} else if (recast_type == RECAST_TYPE_UNLINKED_ITEM && !CastToClient()->GetPTimers().Expired(&database, (pTimerNegativeItemReuse * item_id), false)) {
|
||||
if (!CastToClient()->GetPTimers().Expired(&database, (pTimerItemStart + recast_type), false)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -7002,17 +6965,3 @@ void Mob::SetHP(int64 hp)
|
||||
|
||||
current_hp = hp;
|
||||
}
|
||||
|
||||
void Mob::DrawDebugCoordinateNode(std::string node_name, const glm::vec4 vec)
|
||||
{
|
||||
NPC* node = nullptr;
|
||||
for (const auto& n : entity_list.GetNPCList()) {
|
||||
if (n.second->GetCleanName() == node_name) {
|
||||
node = n.second;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!node) {
|
||||
node = NPC::SpawnNodeNPC(node_name, "", GetPosition());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1072,16 +1072,6 @@ void ClientTaskState::RewardTask(Client *c, const TaskInformation *ti, ClientTas
|
||||
c->AddCrystals(ti->reward_points, 0);
|
||||
} else if (ti->reward_point_type == static_cast<int32_t>(zone->GetCurrencyID(EBON_CRYSTAL))) {
|
||||
c->AddCrystals(0, ti->reward_points);
|
||||
} else {
|
||||
for (const auto& ac : zone->AlternateCurrencies) {
|
||||
if (ti->reward_point_type == ac.id) {
|
||||
const EQ::ItemData *item = database.GetItem(ac.item_id);
|
||||
if (item) {
|
||||
c->AddAlternateCurrencyValue(ti->reward_point_type, ti->reward_points);
|
||||
c->Message(Chat::Yellow, fmt::format("You have received ({}) {}!", ti->reward_points, item->Name).c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2135,7 +2125,6 @@ void ClientTaskState::AcceptNewTask(
|
||||
if (npc) {
|
||||
parse->EventNPC(EVENT_TASK_ACCEPTED, npc, client, export_string, 0);
|
||||
}
|
||||
parse->EventPlayer(EVENT_TASK_ACCEPTED, client, export_string, 0);
|
||||
}
|
||||
|
||||
void ClientTaskState::ProcessTaskProximities(Client *client, float x, float y, float z)
|
||||
|
||||
+12
-44
@@ -706,9 +706,9 @@ void TaskManager::SharedTaskSelector(Client* client, Mob* mob, const std::vector
|
||||
validation_failed = true;
|
||||
|
||||
auto it = std::find_if(request.members.begin(), request.members.end(),
|
||||
[&](const SharedTaskMember& member) {
|
||||
return member.character_id == shared_task_members.front().character_id;
|
||||
});
|
||||
[&](const SharedTaskMember& member) {
|
||||
return member.character_id == shared_task_members.front().character_id;
|
||||
});
|
||||
|
||||
if (it != request.members.end()) {
|
||||
if (request.group_type == SharedTaskRequestGroupType::Group) {
|
||||
@@ -761,14 +761,14 @@ bool TaskManager::CanOfferSharedTask(int task_id, const SharedTaskRequest& reque
|
||||
if (task->min_level > 0 && request.lowest_level < task->min_level)
|
||||
{
|
||||
LogTasksDetail("lowest level [{}] is below task [{}] min level [{}]",
|
||||
request.lowest_level, task_id, task->min_level);
|
||||
request.lowest_level, task_id, task->min_level);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (task->max_level > 0 && request.highest_level > task->max_level)
|
||||
{
|
||||
LogTasksDetail("highest level [{}] exceeds task [{}] max level [{}]",
|
||||
request.highest_level, task_id, task->max_level);
|
||||
request.highest_level, task_id, task->max_level);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1154,10 +1154,6 @@ void TaskManager::SendActiveTaskDescription(
|
||||
+ sizeof(TaskDescriptionData1_Struct) + t->description.length() + 1
|
||||
+ sizeof(TaskDescriptionData2_Struct) + 1 + sizeof(TaskDescriptionTrailer_Struct);
|
||||
|
||||
std::string reward = t->reward;
|
||||
bool is_don_reward = (t->reward_point_type == ALT_CURRENCY_ID_RADIANT ||
|
||||
t->reward_point_type == ALT_CURRENCY_ID_EBON);
|
||||
|
||||
// If there is an item make the reward text into a link to the item (only the first item if a list
|
||||
// is specified). I have been unable to get multiple item links to work.
|
||||
//
|
||||
@@ -1177,34 +1173,7 @@ void TaskManager::SendActiveTaskDescription(
|
||||
}
|
||||
}
|
||||
|
||||
// display alternate currency in reward window manually
|
||||
// there may be a more formal packet structure for displaying this but this is what it is for
|
||||
// now to have bare minimum support
|
||||
if (t->reward_point_type > 0 && t->reward_points > 0 && !is_don_reward) {
|
||||
for (const auto& ac : zone->AlternateCurrencies) {
|
||||
if (t->reward_point_type == ac.id) {
|
||||
const EQ::ItemData *item = database.GetItem(ac.item_id);
|
||||
if (item) {
|
||||
std::string currency_description = fmt::format(
|
||||
"{} ({})",
|
||||
item->Name,
|
||||
t->reward_points
|
||||
);
|
||||
|
||||
reward = currency_description;
|
||||
|
||||
EQ::SayLinkEngine l;
|
||||
l.SetLinkType(EQ::saylink::SayLinkItemData);
|
||||
l.SetItemData(item);
|
||||
l.SetTaskUse();
|
||||
l.SetProxyText(currency_description.c_str());
|
||||
t->item_link = l.GenerateLink();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
packet_length += reward.length() + 1 + t->item_link.length() + 1;
|
||||
packet_length += t->reward.length() + 1 + t->item_link.length() + 1;
|
||||
|
||||
char *Ptr;
|
||||
TaskDescriptionHeader_Struct *task_description_header;
|
||||
@@ -1221,7 +1190,7 @@ void TaskManager::SendActiveTaskDescription(
|
||||
task_description_header->open_window = bring_up_task_journal;
|
||||
task_description_header->task_type = static_cast<uint32>(t->type);
|
||||
|
||||
task_description_header->reward_type = is_don_reward ? t->reward_point_type : 0;
|
||||
task_description_header->reward_type = t->reward_point_type;
|
||||
|
||||
Ptr = (char *) task_description_header + sizeof(TaskDescriptionHeader_Struct);
|
||||
|
||||
@@ -1255,17 +1224,16 @@ void TaskManager::SendActiveTaskDescription(
|
||||
|
||||
// we actually have 2 strings here. One is max length 96 and not parsed for item links
|
||||
// We actually skipped past that string incorrectly before, so TODO: fix item link string
|
||||
sprintf(Ptr, "%s", reward.c_str());
|
||||
Ptr += reward.length() + 1;
|
||||
sprintf(Ptr, "%s", t->reward.c_str());
|
||||
Ptr += t->reward.length() + 1;
|
||||
|
||||
// second string is parsed for item links
|
||||
sprintf(Ptr, "%s", t->item_link.c_str());
|
||||
Ptr += t->item_link.length() + 1;
|
||||
|
||||
tdt = (TaskDescriptionTrailer_Struct *) Ptr;
|
||||
|
||||
// shared tasks show radiant/ebon crystal reward, non-shared tasks show generic points
|
||||
tdt->Points = is_don_reward ? t->reward_points : 0;
|
||||
tdt->Points = t->reward_points;
|
||||
|
||||
tdt->has_reward_selection = 0; // TODO: new rewards window
|
||||
|
||||
@@ -1752,7 +1720,7 @@ void TaskManager::SyncClientSharedTaskRemoveLocalIfNotExists(Client *c, ClientTa
|
||||
CharacterActivitiesRepository::DeleteWhere(database, delete_where);
|
||||
|
||||
c->MessageString(Chat::Yellow, TaskStr::NO_LONGER_MEMBER_TITLE,
|
||||
m_task_data[cts->m_active_shared_task.task_id].title.c_str());
|
||||
m_task_data[cts->m_active_shared_task.task_id].title.c_str());
|
||||
|
||||
// remove as active task if doesn't exist
|
||||
cts->m_active_shared_task = {};
|
||||
@@ -1862,7 +1830,7 @@ bool TaskManager::IsActiveTaskComplete(ClientTaskInformation& client_task)
|
||||
for (int i = 0; i < task_data->activity_count; ++i)
|
||||
{
|
||||
if (client_task.activity[i].activity_state != ActivityCompleted &&
|
||||
!task_data->activity_information[i].optional)
|
||||
!task_data->activity_information[i].optional)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -59,7 +59,7 @@ void Object::HandleAugmentation(Client* user, const AugmentItem_Struct* in_augme
|
||||
inst = user_inv.GetItem(in_augment->container_slot);
|
||||
if (inst) {
|
||||
const EQ::ItemData* item = inst->GetItem();
|
||||
if (item && inst->IsType(EQ::item::ItemClassBag) && (item->BagType == EQ::item::BagTypeAugmentationSealer || item->BagType == RuleI(Inventory, AlternateAugmentationSealer))) { // We have found an appropriate inventory augmentation sealer
|
||||
if (item && inst->IsType(EQ::item::ItemClassBag) && item->BagType == EQ::item::BagTypeAugmentationSealer) { // We have found an appropriate inventory augmentation sealer
|
||||
container = inst;
|
||||
|
||||
// Verify that no more than two items are in container to guarantee no inadvertant wipes.
|
||||
|
||||
+1
-1
@@ -875,7 +875,7 @@ void Client::FinishTrade(Mob* tradingWith, bool finalizer, void* event_entry, st
|
||||
}
|
||||
|
||||
bool quest_npc = false;
|
||||
if (parse->HasQuestSub(tradingWith->GetNPCTypeID(), EVENT_TRADE)) {
|
||||
if (parse->HasQuestSub(tradingWith->GetNPCTypeID(), EVENT_TRADE, true)) {
|
||||
// This is a quest NPC
|
||||
quest_npc = true;
|
||||
}
|
||||
|
||||
+10
-10
@@ -1040,16 +1040,16 @@ int64 Mob::TuneACSum(bool skip_caps, int ac_override, int add_ac)
|
||||
}
|
||||
|
||||
int shield_ac = 0;
|
||||
if (HasShieldEquiped() && (IsClient() || IsBot())) {
|
||||
auto inst = (IsClient()) ? GetInv().GetItem(EQ::invslot::slotSecondary) : CastToBot()->GetBotItem(EQ::invslot::slotSecondary);
|
||||
if (HasShieldEquiped() && IsClient()) {
|
||||
auto client = CastToClient();
|
||||
auto inst = client->GetInv().GetItem(EQ::invslot::slotSecondary);
|
||||
if (inst) {
|
||||
if (inst->GetItemRecommendedLevel(true) <= GetLevel()) {
|
||||
if (inst->GetItemRecommendedLevel(true) <= GetLevel())
|
||||
shield_ac = inst->GetItemArmorClass(true);
|
||||
} else {
|
||||
shield_ac = CalcRecommendedLevelBonus(GetLevel(), inst->GetItemRecommendedLevel(true),inst->GetItemArmorClass(true));
|
||||
}
|
||||
else
|
||||
shield_ac = client->CalcRecommendedLevelBonus(GetLevel(), inst->GetItemRecommendedLevel(true), inst->GetItemArmorClass(true));
|
||||
}
|
||||
shield_ac += GetHeroicSTR() / 10;
|
||||
shield_ac += client->GetHeroicSTR() / 10;
|
||||
}
|
||||
// EQ math
|
||||
ac = (ac * 4) / 3;
|
||||
@@ -1490,15 +1490,15 @@ void Mob::TuneCommonOutgoingHitSuccess(Mob* defender, DamageHitInfo &hit, ExtraA
|
||||
hit.damage_done = min_mod;
|
||||
|
||||
hit.damage_done += hit.min_damage;
|
||||
if (IsClient() || IsBot()) {
|
||||
if (IsClient()) {
|
||||
int extra = 0;
|
||||
switch (hit.skill) {
|
||||
case EQ::skills::SkillThrowing:
|
||||
case EQ::skills::SkillArchery:
|
||||
extra = GetHeroicDEX() / 10;
|
||||
extra = CastToClient()->GetHeroicDEX() / 10;
|
||||
break;
|
||||
default:
|
||||
extra = GetHeroicSTR() / 10;
|
||||
extra = CastToClient()->GetHeroicSTR() / 10;
|
||||
break;
|
||||
}
|
||||
hit.damage_done += extra;
|
||||
|
||||
+8
-25
@@ -771,15 +771,17 @@ float Mob::GetFixedZ(const glm::vec3 &destination, int32 z_find_offset) {
|
||||
float new_z = destination.z;
|
||||
|
||||
if (zone->HasMap()) {
|
||||
if (flymode == GravityBehavior::Flying) {
|
||||
return new_z;
|
||||
}
|
||||
|
||||
if (zone->HasWaterMap() && zone->watermap->InLiquid(glm::vec3(m_Position))) {
|
||||
if (flymode == GravityBehavior::Flying)
|
||||
return new_z;
|
||||
}
|
||||
|
||||
new_z = FindDestGroundZ(destination, (-GetZOffset() / 2));
|
||||
if (zone->HasWaterMap() && zone->watermap->InLiquid(glm::vec3(m_Position)))
|
||||
return new_z;
|
||||
|
||||
/*
|
||||
* Any more than 5 in the offset makes NPC's hop/snap to ceiling in small corridors
|
||||
*/
|
||||
new_z = FindDestGroundZ(destination, z_find_offset);
|
||||
if (new_z != BEST_Z_INVALID) {
|
||||
new_z += GetZOffset();
|
||||
|
||||
@@ -788,20 +790,6 @@ float Mob::GetFixedZ(const glm::vec3 &destination, int32 z_find_offset) {
|
||||
}
|
||||
}
|
||||
|
||||
// prevent ceiling clipping
|
||||
// if client is close in distance (not counting Z) and we clipped up into a ceiling
|
||||
// this helps us snap back down (or up) if it were to happen
|
||||
// other fixes were put in place to prevent clipping into the ceiling to begin with
|
||||
if (std::abs(new_z - m_Position.z) > 15) {
|
||||
LogFixZ("TRIGGER clipping detection");
|
||||
auto t = GetTarget();
|
||||
if (t && DistanceNoZ(GetPosition(), t->GetPosition()) < 20) {
|
||||
new_z = FindDestGroundZ(t->GetPosition(), -t->GetZOffset());
|
||||
new_z += GetZOffset();
|
||||
GMMove(t->GetPosition().x, t->GetPosition().y, new_z, t->GetPosition().w);
|
||||
}
|
||||
}
|
||||
|
||||
auto duration = timer.elapsed();
|
||||
|
||||
LogFixZ("[{}] returned [{}] at [{}] [{}] [{}] - Took [{}]",
|
||||
@@ -845,10 +833,6 @@ void Mob::FixZ(int32 z_find_offset /*= 5*/, bool fix_client_z /*= false*/) {
|
||||
}
|
||||
|
||||
m_Position.z = new_z;
|
||||
|
||||
if (RuleB(Map, MobPathingVisualDebug)) {
|
||||
DrawDebugCoordinateNode(fmt::format("{} new fixed z node", GetCleanName()), GetPosition());
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (RuleB(Map, MobZVisualDebug)) {
|
||||
@@ -944,7 +928,6 @@ float Mob::GetZOffset() const {
|
||||
case RACE_RABBIT_668:
|
||||
offset = 5.0f;
|
||||
break;
|
||||
case RACE_WURM_158:
|
||||
case RACE_BLIND_DREAMER_669:
|
||||
offset = 7.0f;
|
||||
break;
|
||||
|
||||
+27
-4
@@ -1904,7 +1904,6 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
|
||||
if (zone && zone->IsLoaded()) {
|
||||
zone->SendReloadMessage("Alternate Advancement Data");
|
||||
zone->LoadAlternateAdvancement();
|
||||
entity_list.SendAlternateAdvancementStats();
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -1939,6 +1938,16 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
|
||||
content_service.SetExpansionContext()->ReloadContentFlags();
|
||||
break;
|
||||
}
|
||||
case ServerOP_ReloadDoors:
|
||||
{
|
||||
if (zone && zone->IsLoaded()) {
|
||||
zone->SendReloadMessage("Doors");
|
||||
entity_list.RemoveAllDoors();
|
||||
zone->LoadZoneDoors();
|
||||
entity_list.RespawnAllDoors();
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ServerOP_ReloadDzTemplates:
|
||||
{
|
||||
if (zone)
|
||||
@@ -1948,6 +1957,14 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ServerOP_ReloadGroundSpawns:
|
||||
{
|
||||
if (zone && zone->IsLoaded()) {
|
||||
zone->SendReloadMessage("Ground Spawns");
|
||||
zone->LoadGroundSpawns();
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ServerOP_ReloadLevelEXPMods:
|
||||
{
|
||||
if (zone && zone->IsLoaded()) {
|
||||
@@ -1977,6 +1994,15 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ServerOP_ReloadObjects:
|
||||
{
|
||||
if (zone && zone->IsLoaded()) {
|
||||
zone->SendReloadMessage("Objects");
|
||||
entity_list.RemoveAllObjects();
|
||||
zone->LoadZoneObjects();
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ServerOP_ReloadPerlExportSettings:
|
||||
{
|
||||
zone->SendReloadMessage("Perl Event Export Settings");
|
||||
@@ -1989,9 +2015,6 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
|
||||
RuleManager::Instance()->LoadRules(&database, RuleManager::Instance()->GetActiveRuleset(), true);
|
||||
break;
|
||||
}
|
||||
case ServerOP_ReloadDoors:
|
||||
case ServerOP_ReloadGroundSpawns:
|
||||
case ServerOP_ReloadObjects:
|
||||
case ServerOP_ReloadStaticZoneData: {
|
||||
if (zone && zone->IsLoaded()) {
|
||||
zone->SendReloadMessage("Static Zone Data");
|
||||
|
||||
+46
-40
@@ -59,7 +59,6 @@
|
||||
#include "zone_reload.h"
|
||||
#include "../common/repositories/criteria/content_filter_criteria.h"
|
||||
#include "../common/repositories/content_flags_repository.h"
|
||||
#include "../common/repositories/merchantlist_repository.h"
|
||||
#include "../common/repositories/rule_sets_repository.h"
|
||||
#include "../common/repositories/zone_points_repository.h"
|
||||
#include "../common/serverinfo.h"
|
||||
@@ -612,34 +611,45 @@ void Zone::LoadNewMerchantData(uint32 merchantid) {
|
||||
|
||||
std::list<MerchantList> merchant_list;
|
||||
|
||||
const auto& l = MerchantlistRepository::GetWhere(
|
||||
content_db,
|
||||
fmt::format(
|
||||
"merchantid = {} {} ORDER BY slot",
|
||||
merchantid,
|
||||
ContentFilterCriteria::apply()
|
||||
)
|
||||
auto query = fmt::format(
|
||||
SQL(
|
||||
SELECT
|
||||
item,
|
||||
slot,
|
||||
faction_required,
|
||||
level_required,
|
||||
alt_currency_cost,
|
||||
classes_required,
|
||||
probability,
|
||||
bucket_name,
|
||||
bucket_value,
|
||||
bucket_comparison
|
||||
FROM merchantlist
|
||||
WHERE merchantid = {} {}
|
||||
ORDER BY slot
|
||||
),
|
||||
merchantid,
|
||||
ContentFilterCriteria::apply()
|
||||
);
|
||||
|
||||
if (l.empty()) {
|
||||
return;
|
||||
auto results = content_db.QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (const auto& e : l) {
|
||||
for (auto row : results) {
|
||||
MerchantList ml;
|
||||
ml.id = merchantid;
|
||||
ml.item = e.item;
|
||||
ml.slot = e.slot;
|
||||
ml.faction_required = e.faction_required;
|
||||
ml.level_required = e.level_required;
|
||||
ml.min_status = e.min_status;
|
||||
ml.max_status = e.max_status;
|
||||
ml.alt_currency_cost = e.alt_currency_cost;
|
||||
ml.classes_required = e.classes_required;
|
||||
ml.probability = e.probability;
|
||||
ml.bucket_name = e.bucket_name;
|
||||
ml.bucket_value = e.bucket_value;
|
||||
ml.bucket_comparison = e.bucket_comparison;
|
||||
ml.id = merchantid;
|
||||
ml.item = std::stoul(row[0]);
|
||||
ml.slot = std::stoul(row[1]);
|
||||
ml.faction_required = static_cast<int16>(std::stoi(row[2]));
|
||||
ml.level_required = static_cast<uint8>(std::stoul(row[3]));
|
||||
ml.alt_currency_cost = static_cast<uint16>(std::stoul(row[4]));
|
||||
ml.classes_required = std::stoul(row[5]);
|
||||
ml.probability = static_cast<uint8>(std::stoul(row[6]));
|
||||
ml.bucket_name = row[7];
|
||||
ml.bucket_value = row[8];
|
||||
ml.bucket_comparison = static_cast<uint8>(std::stoul(row[9]));
|
||||
merchant_list.push_back(ml);
|
||||
}
|
||||
|
||||
@@ -655,8 +665,6 @@ void Zone::GetMerchantDataForZoneLoad() {
|
||||
item,
|
||||
faction_required,
|
||||
level_required,
|
||||
min_status,
|
||||
max_status,
|
||||
alt_currency_cost,
|
||||
classes_required,
|
||||
probability,
|
||||
@@ -717,18 +725,16 @@ void Zone::GetMerchantDataForZoneLoad() {
|
||||
continue;
|
||||
}
|
||||
|
||||
mle.slot = std::stoul(row[1]);
|
||||
mle.item = std::stoul(row[2]);
|
||||
mle.faction_required = static_cast<int16>(std::stoi(row[3]));
|
||||
mle.level_required = static_cast<uint8>(std::stoul(row[4]));
|
||||
mle.min_status = static_cast<uint8>(std::stoul(row[5]));
|
||||
mle.max_status = static_cast<uint8>(std::stoul(row[6]));
|
||||
mle.alt_currency_cost = static_cast<uint16>(std::stoul(row[7]));
|
||||
mle.classes_required = std::stoul(row[8]);
|
||||
mle.probability = static_cast<uint8>(std::stoul(row[9]));
|
||||
mle.bucket_name = row[10];
|
||||
mle.bucket_value = row[11];
|
||||
mle.bucket_comparison = static_cast<uint8>(std::stoul(row[12]));
|
||||
mle.slot = std::stoul(row[1]);
|
||||
mle.item = std::stoul(row[2]);
|
||||
mle.faction_required = static_cast<int16>(std::stoi(row[3]));
|
||||
mle.level_required = static_cast<uint8>(std::stoul(row[4]));
|
||||
mle.alt_currency_cost = static_cast<uint16>(std::stoul(row[5]));
|
||||
mle.classes_required = std::stoul(row[6]);
|
||||
mle.probability = static_cast<uint8>(std::stoul(row[7]));
|
||||
mle.bucket_name = row[8];
|
||||
mle.bucket_value = row[9];
|
||||
mle.bucket_comparison = static_cast<uint8>(std::stoul(row[10]));
|
||||
|
||||
merchant_list->second.push_back(mle);
|
||||
}
|
||||
@@ -1231,8 +1237,6 @@ bool Zone::Init(bool is_static) {
|
||||
|
||||
void Zone::ReloadStaticData() {
|
||||
LogInfo("Reloading Zone Static Data");
|
||||
entity_list.RemoveAllObjects(); //Ground spawns are also objects we clear list then fill it
|
||||
entity_list.RemoveAllDoors(); //Some objects are also doors so clear list before filling
|
||||
|
||||
if (!content_db.LoadStaticZonePoints(&zone_point_list, GetShortName(), GetInstanceVersion())) {
|
||||
LogError("Loading static zone points failed");
|
||||
@@ -1251,12 +1255,14 @@ void Zone::ReloadStaticData() {
|
||||
LogError("Reloading ground spawns failed. continuing");
|
||||
}
|
||||
|
||||
entity_list.RemoveAllObjects();
|
||||
LogInfo("Reloading World Objects from DB");
|
||||
if (!LoadZoneObjects())
|
||||
{
|
||||
LogError("Reloading World Objects failed. continuing");
|
||||
}
|
||||
|
||||
entity_list.RemoveAllDoors();
|
||||
LoadZoneDoors();
|
||||
entity_list.RespawnAllDoors();
|
||||
|
||||
|
||||
+52
-18
@@ -2094,7 +2094,7 @@ const NPCType *ZoneDatabase::LoadNPCTypesData(uint32 npc_type_id, bool bulk_load
|
||||
}
|
||||
}
|
||||
|
||||
t->see_invis = n.see_invis;
|
||||
t->see_invis = n.see_invis != 0;
|
||||
t->see_invis_undead = n.see_invis_undead != 0; // Set see_invis_undead flag
|
||||
|
||||
if (!RuleB(NPC, DisableLastNames) && !n.lastname.empty()) {
|
||||
@@ -3075,6 +3075,53 @@ void ZoneDatabase::QGlobalPurge()
|
||||
database.QueryDatabase(query);
|
||||
}
|
||||
|
||||
void ZoneDatabase::InsertDoor(
|
||||
uint32 database_id,
|
||||
uint8 id,
|
||||
std::string name,
|
||||
const glm::vec4 &position,
|
||||
uint8 open_type,
|
||||
uint16 guild_id,
|
||||
uint32 lockpick,
|
||||
uint32 key_item_id,
|
||||
uint8 door_param,
|
||||
uint8 invert,
|
||||
int incline,
|
||||
uint16 size,
|
||||
bool disable_timer
|
||||
) {
|
||||
auto e = DoorsRepository::NewEntity();
|
||||
|
||||
e.id = database_id;
|
||||
e.doorid = id;
|
||||
e.zone = zone->GetShortName();
|
||||
e.version = zone->GetInstanceVersion();
|
||||
e.name = name;
|
||||
e.pos_x = position.x;
|
||||
e.pos_y = position.y;
|
||||
e.pos_z = position.z;
|
||||
e.opentype = open_type;
|
||||
e.guild = guild_id;
|
||||
e.lockpick = lockpick;
|
||||
e.keyitem = key_item_id;
|
||||
e.disable_timer = static_cast<int8_t>(disable_timer);
|
||||
e.door_param = door_param;
|
||||
e.invert_state = invert;
|
||||
e.incline = incline;
|
||||
e.size = size;
|
||||
|
||||
const auto& n = DoorsRepository::InsertOne(*this, e);
|
||||
if (!n.id) {
|
||||
LogError(
|
||||
"Failed to create door in Zone [{}] Version [{}] Database ID [{}] ID [{}]",
|
||||
zone->GetShortName(),
|
||||
zone->GetInstanceVersion(),
|
||||
database_id,
|
||||
id
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
void ZoneDatabase::LoadAltCurrencyValues(uint32 char_id, std::map<uint32, uint32> ¤cy) {
|
||||
|
||||
std::string query = StringFormat("SELECT currency_id, amount "
|
||||
@@ -3333,24 +3380,11 @@ void ZoneDatabase::RemoveTempFactions(Client *client) {
|
||||
QueryDatabase(query);
|
||||
}
|
||||
|
||||
void ZoneDatabase::UpdateItemRecast(uint32 character_id, uint32 recast_type, uint32 timestamp)
|
||||
void ZoneDatabase::UpdateItemRecastTimestamps(uint32 char_id, uint32 recast_type, uint32 timestamp)
|
||||
{
|
||||
const auto query = fmt::format(
|
||||
"REPLACE INTO character_item_recast (id, recast_type, timestamp) VALUES ({}, {}, {})",
|
||||
character_id,
|
||||
recast_type,
|
||||
timestamp
|
||||
);
|
||||
QueryDatabase(query);
|
||||
}
|
||||
|
||||
void ZoneDatabase::DeleteItemRecast(uint32 character_id, uint32 recast_type)
|
||||
{
|
||||
const auto query = fmt::format(
|
||||
"DELETE FROM character_item_recast WHERE id = {} AND recast_type = {}",
|
||||
character_id,
|
||||
recast_type
|
||||
);
|
||||
std::string query =
|
||||
StringFormat("REPLACE INTO character_item_recast (id, recast_type, timestamp) VALUES (%u, %u, %u)", char_id,
|
||||
recast_type, timestamp);
|
||||
QueryDatabase(query);
|
||||
}
|
||||
|
||||
|
||||
+16
-2
@@ -369,8 +369,7 @@ public:
|
||||
void LoadPetInfo(Client *c);
|
||||
void SavePetInfo(Client *c);
|
||||
void RemoveTempFactions(Client *c);
|
||||
void UpdateItemRecast(uint32 char_id, uint32 recast_type, uint32 timestamp);
|
||||
void DeleteItemRecast(uint32 char_id, uint32 recast_type);
|
||||
void UpdateItemRecastTimestamps(uint32 char_id, uint32 recast_type, uint32 timestamp);
|
||||
|
||||
bool DeleteCharacterAAs(uint32 character_id);
|
||||
bool DeleteCharacterBandolier(uint32 character_id, uint32 band_id);
|
||||
@@ -571,6 +570,21 @@ public:
|
||||
std::vector<DoorsRepository::Doors> LoadDoors(const std::string& zone_name, int16 version);
|
||||
uint32 GetDoorsCountPlusOne();
|
||||
int GetDoorsDBCountPlusOne(std::string zone_short_name, int16 version);
|
||||
void InsertDoor(
|
||||
uint32 database_id,
|
||||
uint8 id,
|
||||
std::string name,
|
||||
const glm::vec4 &position,
|
||||
uint8 open_type,
|
||||
uint16 guild_id,
|
||||
uint32 ockpick,
|
||||
uint32 key_item_id,
|
||||
uint8 door_param,
|
||||
uint8 invert,
|
||||
int incline,
|
||||
uint16 size,
|
||||
bool disable_timer = false
|
||||
);
|
||||
|
||||
/* Blocked Spells */
|
||||
int32 GetBlockedSpellsCount(uint32 zoneid);
|
||||
|
||||
Reference in New Issue
Block a user