mirror of
https://github.com/EQEmu/Server.git
synced 2026-04-26 23:52:26 +00:00
Merge branch 'EQEmu:master' into master
This commit is contained in:
commit
438096c892
81
CHANGELOG.md
81
CHANGELOG.md
@ -1,3 +1,84 @@
|
||||
## [23.10.3] 9/16/2025
|
||||
|
||||
### Hotfix
|
||||
|
||||
* Hotfix crashes occurring in #4987. @Akkadius 2025-09-17
|
||||
|
||||
## [23.10.2] 9/16/2025
|
||||
|
||||
### Hotfix
|
||||
|
||||
* Revert #4996 as it was causing critical issues with spells that needs to be further investigated. @Akkadius 2025-09-17
|
||||
|
||||
## [23.10.1] 9/16/2025
|
||||
|
||||
### Hotfix
|
||||
* Fixed Mail Key Bug ([#5015](https://github.com/EQEmu/Server/pull/5015)) @Kinglykrab 2025-09-16
|
||||
|
||||
## [23.10.0] 9/15/2025
|
||||
|
||||
### Build
|
||||
|
||||
* Fix Linking with GCC ([#4969](https://github.com/EQEmu/Server/pull/4969)) @solar984 2025-08-03
|
||||
|
||||
### Code
|
||||
|
||||
* Add #npcedit npc_tint_id Help Message ([#4982](https://github.com/EQEmu/Server/pull/4982)) @Kinglykrab 2025-08-17
|
||||
* Cleanup #show ip_lookup Message ([#5005](https://github.com/EQEmu/Server/pull/5005)) @Kinglykrab 2025-08-30
|
||||
* Fix #set race 0 Message ([#5004](https://github.com/EQEmu/Server/pull/5004)) @Kinglykrab 2025-08-30
|
||||
* Fix Issues with Strings::Commify and Mob::SendStatsWindow ([#4984](https://github.com/EQEmu/Server/pull/4984)) @Kinglykrab 2025-08-17
|
||||
* Remove Attributions ([#4988](https://github.com/EQEmu/Server/pull/4988)) @KimLS 2025-08-16
|
||||
* Remove Unused errorname Variable ([#5001](https://github.com/EQEmu/Server/pull/5001)) @Kinglykrab 2025-08-29
|
||||
|
||||
### Commands
|
||||
|
||||
* Add #find account Subcommand ([#4981](https://github.com/EQEmu/Server/pull/4981)) @Kinglykrab 2025-08-17
|
||||
* Add #show keyring Subcommand ([#4973](https://github.com/EQEmu/Server/pull/4973)) @Kinglykrab 2025-08-03
|
||||
* Add #task complete Saylink to #task show ([#4985](https://github.com/EQEmu/Server/pull/4985)) @Kinglykrab 2025-08-17
|
||||
|
||||
### Constants
|
||||
|
||||
* Change Race Changes to Race Namespace ([#5000](https://github.com/EQEmu/Server/pull/5000)) @Kinglykrab 2025-08-30
|
||||
* Convert SE Defines to SpellEffect Namespace ([#4999](https://github.com/EQEmu/Server/pull/4999)) @Kinglykrab 2025-08-30
|
||||
|
||||
### Database
|
||||
|
||||
* Add `heal_amount` to `character_stats_record` ([#4986](https://github.com/EQEmu/Server/pull/4986)) @Kinglykrab 2025-08-17
|
||||
|
||||
### Fixes
|
||||
|
||||
* Fix #show recipe uint16 Cap ([#4978](https://github.com/EQEmu/Server/pull/4978)) @Kinglykrab 2025-08-11
|
||||
* Fix Race 474 for Titanium ([#4979](https://github.com/EQEmu/Server/pull/4979)) @regneq 2025-08-11
|
||||
* Fix Recipe Inspect Bug ([#4994](https://github.com/EQEmu/Server/pull/4994)) @Kinglykrab 2025-08-30
|
||||
* Fix Several Evolving Item Bugs ([#4992](https://github.com/EQEmu/Server/pull/4992)) @neckkola 2025-09-08
|
||||
* Fix Task Reloading ([#5002](https://github.com/EQEmu/Server/pull/5002)) @Kinglykrab 2025-08-29
|
||||
|
||||
### Loginserver
|
||||
|
||||
* Fix Legacy World When Using Local DB ([#4970](https://github.com/EQEmu/Server/pull/4970)) @solar984 2025-08-03
|
||||
|
||||
### Pets
|
||||
|
||||
* Add Pet Constants and Methods ([#4987](https://github.com/EQEmu/Server/pull/4987)) @Kinglykrab 2025-08-17
|
||||
|
||||
### Quest API
|
||||
|
||||
* Add EVENT_CHARM_START and EVENT_CHARM_END ([#5013](https://github.com/EQEmu/Server/pull/5013)) @Kinglykrab 2025-09-15
|
||||
* Add GetKeyRing() to Perl/Lua ([#4980](https://github.com/EQEmu/Server/pull/4980)) @Kinglykrab 2025-08-17
|
||||
* Add GetNPCTintIndex() to Perl/Lua ([#4983](https://github.com/EQEmu/Server/pull/4983)) @Kinglykrab 2025-08-17
|
||||
* Add GetTimers() and GetPausedTimers() to Perl/Lua ([#4965](https://github.com/EQEmu/Server/pull/4965)) @Kinglykrab 2025-08-03
|
||||
* Add Identifiers to Get/Modify NPC Stat Methods ([#5012](https://github.com/EQEmu/Server/pull/5012)) @Kinglykrab 2025-09-15
|
||||
|
||||
### Repositories
|
||||
|
||||
* Convert Character Inspect Messages to Repositories ([#4997](https://github.com/EQEmu/Server/pull/4997)) @Kinglykrab 2025-08-30
|
||||
* Convert Damage Shield Types to Repositories ([#4995](https://github.com/EQEmu/Server/pull/4995)) @Kinglykrab 2025-08-30
|
||||
* Convert Item Loading to Repositories ([#4998](https://github.com/EQEmu/Server/pull/4998)) @Kinglykrab 2025-08-30
|
||||
* Convert Mail Key to Repositories ([#5007](https://github.com/EQEmu/Server/pull/5007)) @Kinglykrab 2025-09-15
|
||||
* Convert Shared Bank Platinum to Repositories ([#5006](https://github.com/EQEmu/Server/pull/5006)) @Kinglykrab 2025-09-02
|
||||
* Convert Spell Loading to Repositories ([#4996](https://github.com/EQEmu/Server/pull/4996)) @Kinglykrab 2025-08-30
|
||||
* Convert Total Time Played to Repositories ([#5008](https://github.com/EQEmu/Server/pull/5008)) @Kinglykrab 2025-09-15
|
||||
|
||||
## [23.9.1] 8/2/2025
|
||||
|
||||
### Hotfix
|
||||
|
||||
@ -603,7 +603,6 @@ SET(common_headers
|
||||
ipc_mutex.h
|
||||
ip_util.h
|
||||
item_data.h
|
||||
item_fieldlist.h
|
||||
item_instance.h
|
||||
json_config.h
|
||||
light_source.h
|
||||
|
||||
@ -7171,7 +7171,21 @@ ALTER TABLE `character_stats_record`
|
||||
ADD COLUMN `heal_amount` int(11) NULL DEFAULT 0 AFTER `spell_damage`;
|
||||
)"
|
||||
},
|
||||
ManifestEntry{
|
||||
.version = 9328,
|
||||
.description = "2025_08_22_character_parcel_updates.sql",
|
||||
.check = "SHOW COLUMNS FROM `character_parcels` LIKE 'evolve_amount'",
|
||||
.condition = "empty",
|
||||
.match = "",
|
||||
.sql = R"(
|
||||
ALTER TABLE `character_parcels`
|
||||
ADD COLUMN `evolve_amount` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `quantity`;
|
||||
|
||||
ALTER TABLE `character_parcels_containers`
|
||||
ADD COLUMN `evolve_amount` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `quantity`;
|
||||
)",
|
||||
.content_schema_update = false
|
||||
},
|
||||
// -- template; copy/paste this when you need to create a new entry
|
||||
// ManifestEntry{
|
||||
// .version = 9228,
|
||||
|
||||
@ -74,6 +74,10 @@ void EvolvingItemsManager::DoLootChecks(const uint32 char_id, const uint16 slot_
|
||||
e.item_id = inst.GetID();
|
||||
e.equipped = inst.GetEvolveEquipped();
|
||||
e.final_item_id = EvolvingItemsManager::Instance()->GetFinalItemID(inst);
|
||||
if (inst.GetEvolveCurrentAmount() > 0) {
|
||||
e.current_amount = inst.GetEvolveCurrentAmount();
|
||||
inst.CalculateEvolveProgression();
|
||||
}
|
||||
|
||||
auto r = CharacterEvolvingItemsRepository::InsertOne(*m_db, e);
|
||||
e.id = r.id;
|
||||
|
||||
@ -95,12 +95,12 @@ bool IsOfEqualRace(int r1, int r2)
|
||||
}
|
||||
// TODO: add more values
|
||||
switch (r1) {
|
||||
case DARK_ELF:
|
||||
case Race::DarkElf:
|
||||
if (r2 == Race::NeriakCitizen) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case BARBARIAN:
|
||||
case Race::Barbarian:
|
||||
if (r2 == Race::HalasCitizen) {
|
||||
return true;
|
||||
}
|
||||
@ -116,49 +116,49 @@ bool IsOfIndiffRace(int r1, int r2)
|
||||
}
|
||||
// TODO: add more values
|
||||
switch (r1) {
|
||||
case DARK_ELF:
|
||||
case OGRE:
|
||||
case TROLL:
|
||||
if (r2 == OGRE || r2 == TROLL || r2 == DARK_ELF) {
|
||||
case Race::DarkElf:
|
||||
case Race::Ogre:
|
||||
case Race::Troll:
|
||||
if (r2 == Race::Ogre || r2 == Race::Troll || r2 == Race::DarkElf) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case HUMAN:
|
||||
case BARBARIAN:
|
||||
case HALF_ELF:
|
||||
case GNOME:
|
||||
case HALFLING:
|
||||
case WOOD_ELF:
|
||||
if (r2 == HUMAN ||
|
||||
r2 == BARBARIAN ||
|
||||
r2 == ERUDITE ||
|
||||
r2 == HALF_ELF ||
|
||||
r2 == GNOME ||
|
||||
r2 == HALFLING ||
|
||||
r2 == DWARF ||
|
||||
r2 == HIGH_ELF ||
|
||||
r2 == WOOD_ELF) {
|
||||
case Race::Human:
|
||||
case Race::Barbarian:
|
||||
case Race::HalfElf:
|
||||
case Race::Gnome:
|
||||
case Race::Halfling:
|
||||
case Race::WoodElf:
|
||||
if (r2 == Race::Human ||
|
||||
r2 == Race::Barbarian ||
|
||||
r2 == Race::Erudite ||
|
||||
r2 == Race::HalfElf ||
|
||||
r2 == Race::Gnome ||
|
||||
r2 == Race::Halfling ||
|
||||
r2 == Race::Dwarf ||
|
||||
r2 == Race::HighElf ||
|
||||
r2 == Race::WoodElf) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case ERUDITE:
|
||||
if (r2 == HUMAN || r2 == HALF_ELF) {
|
||||
case Race::Erudite:
|
||||
if (r2 == Race::Human || r2 == Race::HalfElf) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case DWARF:
|
||||
if (r2 == HALFLING || r2 == GNOME) {
|
||||
case Race::Dwarf:
|
||||
if (r2 == Race::Halfling || r2 == Race::Gnome) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case HIGH_ELF:
|
||||
if (r2 == WOOD_ELF) {
|
||||
case Race::HighElf:
|
||||
if (r2 == Race::WoodElf) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case VAHSHIR:
|
||||
case Race::VahShir:
|
||||
return true;
|
||||
case IKSAR:
|
||||
case Race::Iksar:
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
|
||||
@ -438,7 +438,7 @@ namespace EQ
|
||||
//uint32 Unk054 {};
|
||||
int16 MaxCharges {}; // Maximum charges items can hold: -1 if not a chargeable item
|
||||
uint8 ItemType {}; // Item Type/Skill (itemClass* from above)
|
||||
int32 SubType {}; // Some items have sub types that can be used for other things (unbreakable fishing poles, SE_FFItemClass)
|
||||
int32 SubType {}; // Some items have sub types that can be used for other things (unbreakable fishing poles, SpellEffect::FFItemClass)
|
||||
uint8 Material {}; // Item material type
|
||||
uint32 HerosForgeModel {};// Hero's Forge Armor Model Type (2-13?)
|
||||
float SellRate {}; // Sell rate
|
||||
|
||||
@ -1,206 +0,0 @@
|
||||
/*
|
||||
|
||||
|
||||
These fields must be in the order of how they are serialized!
|
||||
|
||||
|
||||
|
||||
*/
|
||||
|
||||
F(itemclass)
|
||||
F(name)
|
||||
F(lore)
|
||||
F(idfile)
|
||||
F(id)
|
||||
F(weight)
|
||||
F(norent)
|
||||
F(nodrop)
|
||||
F(size)
|
||||
F(slots)
|
||||
F(price)
|
||||
F(icon)
|
||||
F(UNK012)
|
||||
F(UNK013)
|
||||
F(benefitflag)
|
||||
F(tradeskills)
|
||||
F(cr)
|
||||
F(dr)
|
||||
F(pr)
|
||||
F(mr)
|
||||
F(fr)
|
||||
F(astr)
|
||||
F(asta)
|
||||
F(aagi)
|
||||
F(adex)
|
||||
F(acha)
|
||||
F(aint)
|
||||
F(awis)
|
||||
F(hp)
|
||||
F(mana)
|
||||
F(ac)
|
||||
F(deity)
|
||||
F(skillmodvalue)
|
||||
F(UNK033)
|
||||
F(skillmodmax)
|
||||
F(skillmodtype)
|
||||
F(banedmgrace)
|
||||
F(banedmgamt)
|
||||
F(banedmgbody)
|
||||
F(magic)
|
||||
F(casttime_)
|
||||
F(reqlevel)
|
||||
F(bardtype)
|
||||
F(bardvalue)
|
||||
F(light)
|
||||
F(delay)
|
||||
F(reclevel)
|
||||
F(recskill)
|
||||
F(elemdmgtype)
|
||||
F(elemdmgamt)
|
||||
F(range)
|
||||
F(damage)
|
||||
F(color)
|
||||
F(classes)
|
||||
F(races)
|
||||
F(UNK054)
|
||||
F(maxcharges)
|
||||
F(itemtype)
|
||||
F(material)
|
||||
F(herosforgemodel)
|
||||
F(sellrate)
|
||||
F(UNK059)
|
||||
F(casttime)
|
||||
F(elitematerial)
|
||||
F(procrate)
|
||||
F(combateffects)
|
||||
F(shielding)
|
||||
F(stunresist)
|
||||
F(strikethrough)
|
||||
F(extradmgskill)
|
||||
F(extradmgamt)
|
||||
F(spellshield)
|
||||
F(avoidance)
|
||||
F(accuracy)
|
||||
F(charmfileid)
|
||||
F(factionmod1)
|
||||
F(factionmod2)
|
||||
F(factionmod3)
|
||||
F(factionmod4)
|
||||
F(factionamt1)
|
||||
F(factionamt2)
|
||||
F(factionamt3)
|
||||
F(factionamt4)
|
||||
F(charmfile)
|
||||
F(augtype)
|
||||
F(augslot1type)
|
||||
F(augslot1visible)
|
||||
F(augslot2type)
|
||||
F(augslot2visible)
|
||||
F(augslot3type)
|
||||
F(augslot3visible)
|
||||
F(augslot4type)
|
||||
F(augslot4visible)
|
||||
F(augslot5type)
|
||||
F(augslot5visible)
|
||||
F(augslot6type)
|
||||
F(augslot6visible)
|
||||
F(ldontheme)
|
||||
F(ldonprice)
|
||||
F(ldonsold)
|
||||
F(bagtype)
|
||||
F(bagslots)
|
||||
F(bagsize)
|
||||
F(bagwr)
|
||||
F(book)
|
||||
F(booktype)
|
||||
F(filename)
|
||||
F(banedmgraceamt)
|
||||
F(augrestrict)
|
||||
F(loregroup)
|
||||
F(pendingloreflag)
|
||||
F(artifactflag)
|
||||
F(summonedflag)
|
||||
F(favor)
|
||||
F(fvnodrop)
|
||||
F(endur)
|
||||
F(dotshielding)
|
||||
F(attack)
|
||||
F(regen)
|
||||
F(manaregen)
|
||||
F(enduranceregen)
|
||||
F(haste)
|
||||
F(damageshield)
|
||||
F(recastdelay)
|
||||
F(recasttype)
|
||||
F(guildfavor)
|
||||
F(augdistiller)
|
||||
F(UNK123)
|
||||
F(UNK124)
|
||||
F(attuneable)
|
||||
F(nopet)
|
||||
F(UNK127)
|
||||
F(pointtype)
|
||||
F(potionbelt)
|
||||
F(potionbeltslots)
|
||||
F(stacksize)
|
||||
F(notransfer)
|
||||
F(stackable)
|
||||
F(UNK134)
|
||||
F(clickeffect)
|
||||
F(clicktype)
|
||||
F(clicklevel)
|
||||
F(clicklevel2)
|
||||
F(proceffect)
|
||||
F(proctype)
|
||||
F(proclevel)
|
||||
F(proclevel2)
|
||||
F(worneffect)
|
||||
F(worntype)
|
||||
F(wornlevel)
|
||||
F(wornlevel2)
|
||||
F(focuseffect)
|
||||
F(focustype)
|
||||
F(focuslevel)
|
||||
F(focuslevel2)
|
||||
F(scrolleffect)
|
||||
F(scrolltype)
|
||||
F(scrolllevel)
|
||||
F(scrolllevel2)
|
||||
F(bardeffect)
|
||||
F(bardeffecttype)
|
||||
F(bardlevel2)
|
||||
F(bardlevel)
|
||||
F(questitemflag)
|
||||
F(svcorruption)
|
||||
F(purity)
|
||||
F(evoitem)
|
||||
F(evoid)
|
||||
F(evolvinglevel)
|
||||
F(evomax)
|
||||
F(backstabdmg)
|
||||
F(dsmitigation)
|
||||
F(heroic_str)
|
||||
F(heroic_int)
|
||||
F(heroic_wis)
|
||||
F(heroic_agi)
|
||||
F(heroic_dex)
|
||||
F(heroic_sta)
|
||||
F(heroic_cha)
|
||||
F(heroic_mr)
|
||||
F(heroic_fr)
|
||||
F(heroic_cr)
|
||||
F(heroic_dr)
|
||||
F(heroic_pr)
|
||||
F(heroic_svcorrup)
|
||||
F(healamt)
|
||||
F(spelldmg)
|
||||
F(ldonsellbackrate)
|
||||
F(scriptfileid)
|
||||
F(expendablearrow)
|
||||
F(clairvoyance)
|
||||
F(clickname)
|
||||
F(procname)
|
||||
F(wornname)
|
||||
F(focusname)
|
||||
F(scrollname)
|
||||
F(subtype)
|
||||
@ -6481,7 +6481,7 @@ namespace RoF2
|
||||
hdr.scaled_value = (inst->IsScaling() ? (inst->GetExp() / 100) : 0);
|
||||
hdr.instance_id = (inst->GetMerchantSlot() ? inst->GetMerchantSlot() : inst->GetSerialNumber());
|
||||
hdr.parcel_item_id = packet_type == ItemPacketParcel ? inst->GetID() : 0;
|
||||
if (item->EvolvingItem) {
|
||||
if (item->EvolvingItem && packet_type != ItemPacketParcel && packet_type != ItemPacketMerchant) {
|
||||
hdr.instance_id = inst->GetEvolveUniqueID() & 0xFFFFFFFF; //lower dword
|
||||
hdr.parcel_item_id = inst->GetEvolveUniqueID() >> 32; //upper dword
|
||||
}
|
||||
@ -6500,6 +6500,7 @@ namespace RoF2
|
||||
|
||||
if (item->EvolvingItem > 0) {
|
||||
RoF2::structs::EvolvingItem_Struct evotop;
|
||||
inst->CalculateEvolveProgression();
|
||||
|
||||
evotop.final_item_id = inst->GetEvolveFinalItemID();
|
||||
evotop.evolve_level = item->EvolvingLevel;
|
||||
|
||||
3779
common/races.cpp
3779
common/races.cpp
File diff suppressed because it is too large
Load Diff
202
common/races.h
202
common/races.h
@ -21,103 +21,7 @@
|
||||
#include "../common/types.h"
|
||||
#include <string>
|
||||
|
||||
namespace Gender {
|
||||
constexpr uint8 Male = 0;
|
||||
constexpr uint8 Female = 1;
|
||||
constexpr uint8 Neuter = 2;
|
||||
}
|
||||
|
||||
//theres a big list straight from the client below.
|
||||
|
||||
#define HUMAN 1
|
||||
#define BARBARIAN 2
|
||||
#define ERUDITE 3
|
||||
#define WOOD_ELF 4
|
||||
#define HIGH_ELF 5
|
||||
#define DARK_ELF 6
|
||||
#define HALF_ELF 7
|
||||
#define DWARF 8
|
||||
#define TROLL 9
|
||||
#define OGRE 10
|
||||
#define HALFLING 11
|
||||
#define GNOME 12
|
||||
#define WEREWOLF 14
|
||||
#define WOLF 42
|
||||
#define BEAR 43
|
||||
#define SKELETON 60
|
||||
#define TIGER 63
|
||||
#define ELEMENTAL 75
|
||||
#define ALLIGATOR 91
|
||||
#define OGGOK_CITIZEN 93
|
||||
#define EYE_OF_ZOMM 108
|
||||
#define WOLF_ELEMENTAL 120
|
||||
#define INVISIBLE_MAN 127
|
||||
#define IKSAR 128
|
||||
#define VAHSHIR 130
|
||||
#define CONTROLLED_BOAT 141
|
||||
#define MINOR_ILL_OBJ 142
|
||||
#define TREE 143
|
||||
#define IKSAR_SKELETON 161
|
||||
#define FROGLOK 330
|
||||
// TODO: check all clients for (BYTE) usage of '/who all' class and remove FROGLOK2, if possible (330 - 74 = 256 .. WORD->BYTE conversion loss...)
|
||||
#define FROGLOK2 74 // Not sure why /who all reports race as 74 for frogloks
|
||||
#define FAIRY 473
|
||||
#define DRAKKIN 522 // 32768
|
||||
#define EMU_RACE_NPC 131069 // was 65533
|
||||
#define EMU_RACE_PET 131070 // was 65534
|
||||
#define EMU_RACE_UNKNOWN 131071 // was 65535
|
||||
|
||||
|
||||
// player race values
|
||||
#define PLAYER_RACE_UNKNOWN 0
|
||||
#define PLAYER_RACE_HUMAN 1
|
||||
#define PLAYER_RACE_BARBARIAN 2
|
||||
#define PLAYER_RACE_ERUDITE 3
|
||||
#define PLAYER_RACE_WOOD_ELF 4
|
||||
#define PLAYER_RACE_HIGH_ELF 5
|
||||
#define PLAYER_RACE_DARK_ELF 6
|
||||
#define PLAYER_RACE_HALF_ELF 7
|
||||
#define PLAYER_RACE_DWARF 8
|
||||
#define PLAYER_RACE_TROLL 9
|
||||
#define PLAYER_RACE_OGRE 10
|
||||
#define PLAYER_RACE_HALFLING 11
|
||||
#define PLAYER_RACE_GNOME 12
|
||||
#define PLAYER_RACE_IKSAR 13
|
||||
#define PLAYER_RACE_VAHSHIR 14
|
||||
#define PLAYER_RACE_FROGLOK 15
|
||||
#define PLAYER_RACE_DRAKKIN 16
|
||||
|
||||
#define PLAYER_RACE_COUNT 16
|
||||
|
||||
|
||||
#define PLAYER_RACE_EMU_NPC 17
|
||||
#define PLAYER_RACE_EMU_PET 18
|
||||
#define PLAYER_RACE_EMU_COUNT 19
|
||||
|
||||
|
||||
// player race bits
|
||||
#define PLAYER_RACE_UNKNOWN_BIT 0
|
||||
#define PLAYER_RACE_HUMAN_BIT 1
|
||||
#define PLAYER_RACE_BARBARIAN_BIT 2
|
||||
#define PLAYER_RACE_ERUDITE_BIT 4
|
||||
#define PLAYER_RACE_WOOD_ELF_BIT 8
|
||||
#define PLAYER_RACE_HIGH_ELF_BIT 16
|
||||
#define PLAYER_RACE_DARK_ELF_BIT 32
|
||||
#define PLAYER_RACE_HALF_ELF_BIT 64
|
||||
#define PLAYER_RACE_DWARF_BIT 128
|
||||
#define PLAYER_RACE_TROLL_BIT 256
|
||||
#define PLAYER_RACE_OGRE_BIT 512
|
||||
#define PLAYER_RACE_HALFLING_BIT 1024
|
||||
#define PLAYER_RACE_GNOME_BIT 2048
|
||||
#define PLAYER_RACE_IKSAR_BIT 4096
|
||||
#define PLAYER_RACE_VAHSHIR_BIT 8192
|
||||
#define PLAYER_RACE_FROGLOK_BIT 16384
|
||||
#define PLAYER_RACE_DRAKKIN_BIT 32768
|
||||
|
||||
#define PLAYER_RACE_ALL_MASK 65535
|
||||
|
||||
const char* GetRaceIDName(uint16 race_id);
|
||||
const char* GetPlayerRaceName(uint32 player_race_value);
|
||||
const char* GetGenderName(uint32 gender_id);
|
||||
|
||||
bool IsPlayerRace(uint16 race_id);
|
||||
@ -127,25 +31,13 @@ uint32 GetPlayerRaceValue(uint16 race_id);
|
||||
uint16 GetPlayerRaceBit(uint16 race_id);
|
||||
|
||||
uint16 GetRaceIDFromPlayerRaceValue(uint32 player_race_value);
|
||||
uint16 GetRaceIDFromPlayerRaceBit(uint32 player_race_bit);
|
||||
|
||||
float GetRaceGenderDefaultHeight(int race, int gender);
|
||||
|
||||
// player race-/gender-based model feature validators
|
||||
namespace PlayerAppearance
|
||||
{
|
||||
bool IsValidBeard(uint16 race_id, uint8 gender_id, uint8 beard_value, bool use_luclin = true);
|
||||
bool IsValidBeardColor(uint16 race_id, uint8 gender_id, uint8 beard_color_value, bool use_luclin = true);
|
||||
bool IsValidDetail(uint16 race_id, uint8 gender_id, uint32 detail_value, bool use_luclin = true);
|
||||
bool IsValidEyeColor(uint16 race_id, uint8 gender_id, uint8 eye_color_value, bool use_luclin = true);
|
||||
bool IsValidFace(uint16 race_id, uint8 gender_id, uint8 face_value, bool use_luclin = true);
|
||||
bool IsValidHair(uint16 race_id, uint8 gender_id, uint8 hair_value, bool use_luclin = true);
|
||||
bool IsValidHairColor(uint16 race_id, uint8 gender_id, uint8 hair_color_value, bool use_luclin = true);
|
||||
bool IsValidHead(uint16 race_id, uint8 gender_id, uint8 head_value, bool use_luclin = true);
|
||||
bool IsValidHeritage(uint16 race_id, uint8 gender_id, uint32 heritage_value, bool use_luclin = true);
|
||||
bool IsValidTattoo(uint16 race_id, uint8 gender_id, uint32 tattoo_value, bool use_luclin = true);
|
||||
bool IsValidTexture(uint16 race_id, uint8 gender_id, uint8 texture_value, bool use_luclin = true);
|
||||
bool IsValidWoad(uint16 race_id, uint8 gender_id, uint8 woad_value, bool use_luclin = true);
|
||||
namespace Gender {
|
||||
constexpr uint8 Male = 0;
|
||||
constexpr uint8 Female = 1;
|
||||
constexpr uint8 Neuter = 2;
|
||||
}
|
||||
|
||||
namespace Race {
|
||||
@ -884,8 +776,92 @@ namespace Race {
|
||||
constexpr uint16 Pegasus3 = 732;
|
||||
constexpr uint16 InteractiveObject = 2250;
|
||||
constexpr uint16 Node = 2254;
|
||||
}
|
||||
|
||||
constexpr uint16 ALL_RACES_BITMASK = 65535;
|
||||
namespace RaceBitmask {
|
||||
constexpr uint16 Unknown = 0;
|
||||
constexpr uint16 Human = 1;
|
||||
constexpr uint16 Barbarian = 2;
|
||||
constexpr uint16 Erudite = 4;
|
||||
constexpr uint16 WoodElf = 8;
|
||||
constexpr uint16 HighElf = 16;
|
||||
constexpr uint16 DarkElf = 32;
|
||||
constexpr uint16 HalfElf = 64;
|
||||
constexpr uint16 Dwarf = 128;
|
||||
constexpr uint16 Troll = 256;
|
||||
constexpr uint16 Ogre = 512;
|
||||
constexpr uint16 Halfling = 1024;
|
||||
constexpr uint16 Gnome = 2048;
|
||||
constexpr uint16 Iksar = 4096;
|
||||
constexpr uint16 VahShir = 8192;
|
||||
constexpr uint16 Froglok = 16384;
|
||||
constexpr uint16 Drakkin = 32768;
|
||||
constexpr uint16 All = 65535;
|
||||
}
|
||||
|
||||
namespace RaceIndex {
|
||||
constexpr uint16 Human = 1;
|
||||
constexpr uint16 Barbarian = 2;
|
||||
constexpr uint16 Erudite = 3;
|
||||
constexpr uint16 WoodElf = 4;
|
||||
constexpr uint16 HighElf = 5;
|
||||
constexpr uint16 DarkElf = 6;
|
||||
constexpr uint16 HalfElf = 7;
|
||||
constexpr uint16 Dwarf = 8;
|
||||
constexpr uint16 Troll = 9;
|
||||
constexpr uint16 Ogre = 10;
|
||||
constexpr uint16 Halfling = 11;
|
||||
constexpr uint16 Gnome = 12;
|
||||
constexpr uint16 Iksar = 13;
|
||||
constexpr uint16 VahShir = 14;
|
||||
constexpr uint16 Froglok = 15;
|
||||
constexpr uint16 Drakkin = 16;
|
||||
}
|
||||
|
||||
namespace RaceAppearance {
|
||||
bool IsValidBeard(uint16 race_id, uint8 gender_id, uint8 beard_value, bool use_luclin = true);
|
||||
bool IsValidBeardColor(uint16 race_id, uint8 gender_id, uint8 beard_color_value, bool use_luclin = true);
|
||||
bool IsValidDetail(uint16 race_id, uint8 gender_id, uint32 detail_value, bool use_luclin = true);
|
||||
bool IsValidEyeColor(uint16 race_id, uint8 gender_id, uint8 eye_color_value, bool use_luclin = true);
|
||||
bool IsValidFace(uint16 race_id, uint8 gender_id, uint8 face_value, bool use_luclin = true);
|
||||
bool IsValidHair(uint16 race_id, uint8 gender_id, uint8 hair_value, bool use_luclin = true);
|
||||
bool IsValidHairColor(uint16 race_id, uint8 gender_id, uint8 hair_color_value, bool use_luclin = true);
|
||||
bool IsValidHeritage(uint16 race_id, uint8 gender_id, uint32 heritage_value, bool use_luclin = true);
|
||||
bool IsValidTattoo(uint16 race_id, uint8 gender_id, uint32 tattoo_value, bool use_luclin = true);
|
||||
bool IsValidWoad(uint16 race_id, uint8 gender_id, uint8 woad_value, bool use_luclin = true);
|
||||
|
||||
constexpr int HumanMale = (Race::Human << 8) | Gender::Male;
|
||||
constexpr int HumanFemale = (Race::Human << 8) | Gender::Female;
|
||||
constexpr int BarbarianMale = (Race::Barbarian << 8) | Gender::Male;
|
||||
constexpr int BarbarianFemale = (Race::Barbarian << 8) | Gender::Female;
|
||||
constexpr int EruditeMale = (Race::Erudite << 8) | Gender::Male;
|
||||
constexpr int EruditeFemale = (Race::Erudite << 8) | Gender::Female;
|
||||
constexpr int WoodElfMale = (Race::WoodElf << 8) | Gender::Male;
|
||||
constexpr int WoodElfFemale = (Race::WoodElf << 8) | Gender::Female;
|
||||
constexpr int HighElfMale = (Race::HighElf << 8) | Gender::Male;
|
||||
constexpr int HighElfFemale = (Race::HighElf << 8) | Gender::Female;
|
||||
constexpr int DarkElfMale = (Race::DarkElf << 8) | Gender::Male;
|
||||
constexpr int DarkElfFemale = (Race::DarkElf << 8) | Gender::Female;
|
||||
constexpr int HalfElfMale = (Race::HalfElf << 8) | Gender::Male;
|
||||
constexpr int HalfElfFemale = (Race::HalfElf << 8) | Gender::Female;
|
||||
constexpr int DwarfMale = (Race::Dwarf << 8) | Gender::Male;
|
||||
constexpr int DwarfFemale = (Race::Dwarf << 8) | Gender::Female;
|
||||
constexpr int TrollMale = (Race::Troll << 8) | Gender::Male;
|
||||
constexpr int TrollFemale = (Race::Troll << 8) | Gender::Female;
|
||||
constexpr int OgreMale = (Race::Ogre << 8) | Gender::Male;
|
||||
constexpr int OgreFemale = (Race::Ogre << 8) | Gender::Female;
|
||||
constexpr int HalflingMale = (Race::Halfling << 8) | Gender::Male;
|
||||
constexpr int HalflingFemale = (Race::Halfling << 8) | Gender::Female;
|
||||
constexpr int GnomeMale = (Race::Gnome << 8) | Gender::Male;
|
||||
constexpr int GnomeFemale = (Race::Gnome << 8) | Gender::Female;
|
||||
constexpr int IksarMale = (Race::Iksar << 8) | Gender::Male;
|
||||
constexpr int IksarFemale = (Race::Iksar << 8) | Gender::Female;
|
||||
constexpr int VahShirMale = (Race::VahShir << 8) | Gender::Male;
|
||||
constexpr int VahShirFemale = (Race::VahShir << 8) | Gender::Female;
|
||||
constexpr int FroglokMale = (Race::Froglok2 << 8) | Gender::Male;
|
||||
constexpr int FroglokFemale = (Race::Froglok2 << 8) | Gender::Female;
|
||||
constexpr int DrakkinMale = (Race::Drakkin << 8) | Gender::Male;
|
||||
constexpr int DrakkinFemale = (Race::Drakkin << 8) | Gender::Female;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@ -30,6 +30,7 @@ public:
|
||||
uint32_t aug_slot_5;
|
||||
uint32_t aug_slot_6;
|
||||
uint32_t quantity;
|
||||
uint32_t evolve_amount;
|
||||
};
|
||||
|
||||
static std::string PrimaryKey()
|
||||
@ -51,6 +52,7 @@ public:
|
||||
"aug_slot_5",
|
||||
"aug_slot_6",
|
||||
"quantity",
|
||||
"evolve_amount",
|
||||
};
|
||||
}
|
||||
|
||||
@ -68,6 +70,7 @@ public:
|
||||
"aug_slot_5",
|
||||
"aug_slot_6",
|
||||
"quantity",
|
||||
"evolve_amount",
|
||||
};
|
||||
}
|
||||
|
||||
@ -108,17 +111,18 @@ public:
|
||||
{
|
||||
CharacterParcelsContainers e{};
|
||||
|
||||
e.id = 0;
|
||||
e.parcels_id = 0;
|
||||
e.slot_id = 0;
|
||||
e.item_id = 0;
|
||||
e.aug_slot_1 = 0;
|
||||
e.aug_slot_2 = 0;
|
||||
e.aug_slot_3 = 0;
|
||||
e.aug_slot_4 = 0;
|
||||
e.aug_slot_5 = 0;
|
||||
e.aug_slot_6 = 0;
|
||||
e.quantity = 0;
|
||||
e.id = 0;
|
||||
e.parcels_id = 0;
|
||||
e.slot_id = 0;
|
||||
e.item_id = 0;
|
||||
e.aug_slot_1 = 0;
|
||||
e.aug_slot_2 = 0;
|
||||
e.aug_slot_3 = 0;
|
||||
e.aug_slot_4 = 0;
|
||||
e.aug_slot_5 = 0;
|
||||
e.aug_slot_6 = 0;
|
||||
e.quantity = 0;
|
||||
e.evolve_amount = 0;
|
||||
|
||||
return e;
|
||||
}
|
||||
@ -155,17 +159,18 @@ public:
|
||||
if (results.RowCount() == 1) {
|
||||
CharacterParcelsContainers e{};
|
||||
|
||||
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||
e.parcels_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||
e.slot_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
|
||||
e.item_id = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
|
||||
e.aug_slot_1 = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
|
||||
e.aug_slot_2 = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
|
||||
e.aug_slot_3 = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
|
||||
e.aug_slot_4 = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
|
||||
e.aug_slot_5 = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
|
||||
e.aug_slot_6 = row[9] ? static_cast<uint32_t>(strtoul(row[9], nullptr, 10)) : 0;
|
||||
e.quantity = row[10] ? static_cast<uint32_t>(strtoul(row[10], nullptr, 10)) : 0;
|
||||
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||
e.parcels_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||
e.slot_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
|
||||
e.item_id = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
|
||||
e.aug_slot_1 = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
|
||||
e.aug_slot_2 = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
|
||||
e.aug_slot_3 = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
|
||||
e.aug_slot_4 = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
|
||||
e.aug_slot_5 = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
|
||||
e.aug_slot_6 = row[9] ? static_cast<uint32_t>(strtoul(row[9], nullptr, 10)) : 0;
|
||||
e.quantity = row[10] ? static_cast<uint32_t>(strtoul(row[10], nullptr, 10)) : 0;
|
||||
e.evolve_amount = row[11] ? static_cast<uint32_t>(strtoul(row[11], nullptr, 10)) : 0;
|
||||
|
||||
return e;
|
||||
}
|
||||
@ -209,6 +214,7 @@ public:
|
||||
v.push_back(columns[8] + " = " + std::to_string(e.aug_slot_5));
|
||||
v.push_back(columns[9] + " = " + std::to_string(e.aug_slot_6));
|
||||
v.push_back(columns[10] + " = " + std::to_string(e.quantity));
|
||||
v.push_back(columns[11] + " = " + std::to_string(e.evolve_amount));
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
@ -241,6 +247,7 @@ public:
|
||||
v.push_back(std::to_string(e.aug_slot_5));
|
||||
v.push_back(std::to_string(e.aug_slot_6));
|
||||
v.push_back(std::to_string(e.quantity));
|
||||
v.push_back(std::to_string(e.evolve_amount));
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
@ -281,6 +288,7 @@ public:
|
||||
v.push_back(std::to_string(e.aug_slot_5));
|
||||
v.push_back(std::to_string(e.aug_slot_6));
|
||||
v.push_back(std::to_string(e.quantity));
|
||||
v.push_back(std::to_string(e.evolve_amount));
|
||||
|
||||
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
||||
}
|
||||
@ -314,17 +322,18 @@ public:
|
||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||
CharacterParcelsContainers e{};
|
||||
|
||||
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||
e.parcels_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||
e.slot_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
|
||||
e.item_id = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
|
||||
e.aug_slot_1 = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
|
||||
e.aug_slot_2 = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
|
||||
e.aug_slot_3 = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
|
||||
e.aug_slot_4 = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
|
||||
e.aug_slot_5 = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
|
||||
e.aug_slot_6 = row[9] ? static_cast<uint32_t>(strtoul(row[9], nullptr, 10)) : 0;
|
||||
e.quantity = row[10] ? static_cast<uint32_t>(strtoul(row[10], nullptr, 10)) : 0;
|
||||
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||
e.parcels_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||
e.slot_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
|
||||
e.item_id = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
|
||||
e.aug_slot_1 = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
|
||||
e.aug_slot_2 = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
|
||||
e.aug_slot_3 = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
|
||||
e.aug_slot_4 = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
|
||||
e.aug_slot_5 = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
|
||||
e.aug_slot_6 = row[9] ? static_cast<uint32_t>(strtoul(row[9], nullptr, 10)) : 0;
|
||||
e.quantity = row[10] ? static_cast<uint32_t>(strtoul(row[10], nullptr, 10)) : 0;
|
||||
e.evolve_amount = row[11] ? static_cast<uint32_t>(strtoul(row[11], nullptr, 10)) : 0;
|
||||
|
||||
all_entries.push_back(e);
|
||||
}
|
||||
@ -349,17 +358,18 @@ public:
|
||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||
CharacterParcelsContainers e{};
|
||||
|
||||
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||
e.parcels_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||
e.slot_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
|
||||
e.item_id = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
|
||||
e.aug_slot_1 = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
|
||||
e.aug_slot_2 = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
|
||||
e.aug_slot_3 = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
|
||||
e.aug_slot_4 = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
|
||||
e.aug_slot_5 = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
|
||||
e.aug_slot_6 = row[9] ? static_cast<uint32_t>(strtoul(row[9], nullptr, 10)) : 0;
|
||||
e.quantity = row[10] ? static_cast<uint32_t>(strtoul(row[10], nullptr, 10)) : 0;
|
||||
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||
e.parcels_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||
e.slot_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
|
||||
e.item_id = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
|
||||
e.aug_slot_1 = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
|
||||
e.aug_slot_2 = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
|
||||
e.aug_slot_3 = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
|
||||
e.aug_slot_4 = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
|
||||
e.aug_slot_5 = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
|
||||
e.aug_slot_6 = row[9] ? static_cast<uint32_t>(strtoul(row[9], nullptr, 10)) : 0;
|
||||
e.quantity = row[10] ? static_cast<uint32_t>(strtoul(row[10], nullptr, 10)) : 0;
|
||||
e.evolve_amount = row[11] ? static_cast<uint32_t>(strtoul(row[11], nullptr, 10)) : 0;
|
||||
|
||||
all_entries.push_back(e);
|
||||
}
|
||||
@ -445,6 +455,7 @@ public:
|
||||
v.push_back(std::to_string(e.aug_slot_5));
|
||||
v.push_back(std::to_string(e.aug_slot_6));
|
||||
v.push_back(std::to_string(e.quantity));
|
||||
v.push_back(std::to_string(e.evolve_amount));
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
@ -478,6 +489,7 @@ public:
|
||||
v.push_back(std::to_string(e.aug_slot_5));
|
||||
v.push_back(std::to_string(e.aug_slot_6));
|
||||
v.push_back(std::to_string(e.quantity));
|
||||
v.push_back(std::to_string(e.evolve_amount));
|
||||
|
||||
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
||||
}
|
||||
|
||||
@ -30,6 +30,7 @@ public:
|
||||
uint32_t aug_slot_6;
|
||||
uint32_t slot_id;
|
||||
uint32_t quantity;
|
||||
uint32_t evolve_amount;
|
||||
std::string from_name;
|
||||
std::string note;
|
||||
time_t sent_date;
|
||||
@ -54,6 +55,7 @@ public:
|
||||
"aug_slot_6",
|
||||
"slot_id",
|
||||
"quantity",
|
||||
"evolve_amount",
|
||||
"from_name",
|
||||
"note",
|
||||
"sent_date",
|
||||
@ -74,6 +76,7 @@ public:
|
||||
"aug_slot_6",
|
||||
"slot_id",
|
||||
"quantity",
|
||||
"evolve_amount",
|
||||
"from_name",
|
||||
"note",
|
||||
"UNIX_TIMESTAMP(sent_date)",
|
||||
@ -117,20 +120,21 @@ public:
|
||||
{
|
||||
CharacterParcels e{};
|
||||
|
||||
e.id = 0;
|
||||
e.char_id = 0;
|
||||
e.item_id = 0;
|
||||
e.aug_slot_1 = 0;
|
||||
e.aug_slot_2 = 0;
|
||||
e.aug_slot_3 = 0;
|
||||
e.aug_slot_4 = 0;
|
||||
e.aug_slot_5 = 0;
|
||||
e.aug_slot_6 = 0;
|
||||
e.slot_id = 0;
|
||||
e.quantity = 0;
|
||||
e.from_name = "";
|
||||
e.note = "";
|
||||
e.sent_date = 0;
|
||||
e.id = 0;
|
||||
e.char_id = 0;
|
||||
e.item_id = 0;
|
||||
e.aug_slot_1 = 0;
|
||||
e.aug_slot_2 = 0;
|
||||
e.aug_slot_3 = 0;
|
||||
e.aug_slot_4 = 0;
|
||||
e.aug_slot_5 = 0;
|
||||
e.aug_slot_6 = 0;
|
||||
e.slot_id = 0;
|
||||
e.quantity = 0;
|
||||
e.evolve_amount = 0;
|
||||
e.from_name = "";
|
||||
e.note = "";
|
||||
e.sent_date = 0;
|
||||
|
||||
return e;
|
||||
}
|
||||
@ -167,20 +171,21 @@ public:
|
||||
if (results.RowCount() == 1) {
|
||||
CharacterParcels e{};
|
||||
|
||||
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||
e.char_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||
e.item_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
|
||||
e.aug_slot_1 = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
|
||||
e.aug_slot_2 = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
|
||||
e.aug_slot_3 = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
|
||||
e.aug_slot_4 = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
|
||||
e.aug_slot_5 = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
|
||||
e.aug_slot_6 = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
|
||||
e.slot_id = row[9] ? static_cast<uint32_t>(strtoul(row[9], nullptr, 10)) : 0;
|
||||
e.quantity = row[10] ? static_cast<uint32_t>(strtoul(row[10], nullptr, 10)) : 0;
|
||||
e.from_name = row[11] ? row[11] : "";
|
||||
e.note = row[12] ? row[12] : "";
|
||||
e.sent_date = strtoll(row[13] ? row[13] : "-1", nullptr, 10);
|
||||
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||
e.char_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||
e.item_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
|
||||
e.aug_slot_1 = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
|
||||
e.aug_slot_2 = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
|
||||
e.aug_slot_3 = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
|
||||
e.aug_slot_4 = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
|
||||
e.aug_slot_5 = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
|
||||
e.aug_slot_6 = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
|
||||
e.slot_id = row[9] ? static_cast<uint32_t>(strtoul(row[9], nullptr, 10)) : 0;
|
||||
e.quantity = row[10] ? static_cast<uint32_t>(strtoul(row[10], nullptr, 10)) : 0;
|
||||
e.evolve_amount = row[11] ? static_cast<uint32_t>(strtoul(row[11], nullptr, 10)) : 0;
|
||||
e.from_name = row[12] ? row[12] : "";
|
||||
e.note = row[13] ? row[13] : "";
|
||||
e.sent_date = strtoll(row[14] ? row[14] : "-1", nullptr, 10);
|
||||
|
||||
return e;
|
||||
}
|
||||
@ -224,9 +229,10 @@ public:
|
||||
v.push_back(columns[8] + " = " + std::to_string(e.aug_slot_6));
|
||||
v.push_back(columns[9] + " = " + std::to_string(e.slot_id));
|
||||
v.push_back(columns[10] + " = " + std::to_string(e.quantity));
|
||||
v.push_back(columns[11] + " = '" + Strings::Escape(e.from_name) + "'");
|
||||
v.push_back(columns[12] + " = '" + Strings::Escape(e.note) + "'");
|
||||
v.push_back(columns[13] + " = FROM_UNIXTIME(" + (e.sent_date > 0 ? std::to_string(e.sent_date) : "null") + ")");
|
||||
v.push_back(columns[11] + " = " + std::to_string(e.evolve_amount));
|
||||
v.push_back(columns[12] + " = '" + Strings::Escape(e.from_name) + "'");
|
||||
v.push_back(columns[13] + " = '" + Strings::Escape(e.note) + "'");
|
||||
v.push_back(columns[14] + " = FROM_UNIXTIME(" + (e.sent_date > 0 ? std::to_string(e.sent_date) : "null") + ")");
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
@ -259,6 +265,7 @@ public:
|
||||
v.push_back(std::to_string(e.aug_slot_6));
|
||||
v.push_back(std::to_string(e.slot_id));
|
||||
v.push_back(std::to_string(e.quantity));
|
||||
v.push_back(std::to_string(e.evolve_amount));
|
||||
v.push_back("'" + Strings::Escape(e.from_name) + "'");
|
||||
v.push_back("'" + Strings::Escape(e.note) + "'");
|
||||
v.push_back("FROM_UNIXTIME(" + (e.sent_date > 0 ? std::to_string(e.sent_date) : "null") + ")");
|
||||
@ -302,6 +309,7 @@ public:
|
||||
v.push_back(std::to_string(e.aug_slot_6));
|
||||
v.push_back(std::to_string(e.slot_id));
|
||||
v.push_back(std::to_string(e.quantity));
|
||||
v.push_back(std::to_string(e.evolve_amount));
|
||||
v.push_back("'" + Strings::Escape(e.from_name) + "'");
|
||||
v.push_back("'" + Strings::Escape(e.note) + "'");
|
||||
v.push_back("FROM_UNIXTIME(" + (e.sent_date > 0 ? std::to_string(e.sent_date) : "null") + ")");
|
||||
@ -338,20 +346,21 @@ public:
|
||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||
CharacterParcels e{};
|
||||
|
||||
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||
e.char_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||
e.item_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
|
||||
e.aug_slot_1 = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
|
||||
e.aug_slot_2 = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
|
||||
e.aug_slot_3 = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
|
||||
e.aug_slot_4 = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
|
||||
e.aug_slot_5 = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
|
||||
e.aug_slot_6 = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
|
||||
e.slot_id = row[9] ? static_cast<uint32_t>(strtoul(row[9], nullptr, 10)) : 0;
|
||||
e.quantity = row[10] ? static_cast<uint32_t>(strtoul(row[10], nullptr, 10)) : 0;
|
||||
e.from_name = row[11] ? row[11] : "";
|
||||
e.note = row[12] ? row[12] : "";
|
||||
e.sent_date = strtoll(row[13] ? row[13] : "-1", nullptr, 10);
|
||||
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||
e.char_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||
e.item_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
|
||||
e.aug_slot_1 = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
|
||||
e.aug_slot_2 = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
|
||||
e.aug_slot_3 = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
|
||||
e.aug_slot_4 = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
|
||||
e.aug_slot_5 = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
|
||||
e.aug_slot_6 = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
|
||||
e.slot_id = row[9] ? static_cast<uint32_t>(strtoul(row[9], nullptr, 10)) : 0;
|
||||
e.quantity = row[10] ? static_cast<uint32_t>(strtoul(row[10], nullptr, 10)) : 0;
|
||||
e.evolve_amount = row[11] ? static_cast<uint32_t>(strtoul(row[11], nullptr, 10)) : 0;
|
||||
e.from_name = row[12] ? row[12] : "";
|
||||
e.note = row[13] ? row[13] : "";
|
||||
e.sent_date = strtoll(row[14] ? row[14] : "-1", nullptr, 10);
|
||||
|
||||
all_entries.push_back(e);
|
||||
}
|
||||
@ -376,20 +385,21 @@ public:
|
||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||
CharacterParcels e{};
|
||||
|
||||
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||
e.char_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||
e.item_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
|
||||
e.aug_slot_1 = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
|
||||
e.aug_slot_2 = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
|
||||
e.aug_slot_3 = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
|
||||
e.aug_slot_4 = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
|
||||
e.aug_slot_5 = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
|
||||
e.aug_slot_6 = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
|
||||
e.slot_id = row[9] ? static_cast<uint32_t>(strtoul(row[9], nullptr, 10)) : 0;
|
||||
e.quantity = row[10] ? static_cast<uint32_t>(strtoul(row[10], nullptr, 10)) : 0;
|
||||
e.from_name = row[11] ? row[11] : "";
|
||||
e.note = row[12] ? row[12] : "";
|
||||
e.sent_date = strtoll(row[13] ? row[13] : "-1", nullptr, 10);
|
||||
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||
e.char_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||
e.item_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
|
||||
e.aug_slot_1 = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
|
||||
e.aug_slot_2 = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
|
||||
e.aug_slot_3 = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
|
||||
e.aug_slot_4 = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
|
||||
e.aug_slot_5 = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
|
||||
e.aug_slot_6 = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
|
||||
e.slot_id = row[9] ? static_cast<uint32_t>(strtoul(row[9], nullptr, 10)) : 0;
|
||||
e.quantity = row[10] ? static_cast<uint32_t>(strtoul(row[10], nullptr, 10)) : 0;
|
||||
e.evolve_amount = row[11] ? static_cast<uint32_t>(strtoul(row[11], nullptr, 10)) : 0;
|
||||
e.from_name = row[12] ? row[12] : "";
|
||||
e.note = row[13] ? row[13] : "";
|
||||
e.sent_date = strtoll(row[14] ? row[14] : "-1", nullptr, 10);
|
||||
|
||||
all_entries.push_back(e);
|
||||
}
|
||||
@ -475,6 +485,7 @@ public:
|
||||
v.push_back(std::to_string(e.aug_slot_6));
|
||||
v.push_back(std::to_string(e.slot_id));
|
||||
v.push_back(std::to_string(e.quantity));
|
||||
v.push_back(std::to_string(e.evolve_amount));
|
||||
v.push_back("'" + Strings::Escape(e.from_name) + "'");
|
||||
v.push_back("'" + Strings::Escape(e.note) + "'");
|
||||
v.push_back("FROM_UNIXTIME(" + (e.sent_date > 0 ? std::to_string(e.sent_date) : "null") + ")");
|
||||
@ -511,6 +522,7 @@ public:
|
||||
v.push_back(std::to_string(e.aug_slot_6));
|
||||
v.push_back(std::to_string(e.slot_id));
|
||||
v.push_back(std::to_string(e.quantity));
|
||||
v.push_back(std::to_string(e.evolve_amount));
|
||||
v.push_back("'" + Strings::Escape(e.from_name) + "'");
|
||||
v.push_back("'" + Strings::Escape(e.note) + "'");
|
||||
v.push_back("FROM_UNIXTIME(" + (e.sent_date > 0 ? std::to_string(e.sent_date) : "null") + ")");
|
||||
|
||||
@ -191,6 +191,22 @@ public:
|
||||
|
||||
return character_ids;
|
||||
}
|
||||
|
||||
static uint32_t GetTotalTimePlayed(Database& db, uint32_t account_id)
|
||||
{
|
||||
auto query = fmt::format(
|
||||
"SELECT SUM(time_played) FROM `character_data` WHERE `account_id` = {}",
|
||||
account_id
|
||||
);
|
||||
|
||||
auto results = db.QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
auto row = results.begin();
|
||||
return Strings::ToUnsignedInt(row[0]);
|
||||
}
|
||||
};
|
||||
|
||||
#endif //EQEMU_CHARACTER_DATA_REPOSITORY_H
|
||||
|
||||
@ -619,7 +619,7 @@ RULE_INT(Combat, SneakPullAssistRange, 400, "Modified range of assist for sneak
|
||||
RULE_BOOL(Combat, Classic2HBAnimation, false, "2HB will use the 2 hand piercing animation instead of the overhead slashing animation")
|
||||
RULE_BOOL(Combat, ArcheryConsumesAmmo, true, "Set to false to disable Archery Ammo Consumption")
|
||||
RULE_BOOL(Combat, ThrowingConsumesAmmo, true, "Set to false to disable Throwing Ammo Consumption")
|
||||
RULE_BOOL(Combat, UseLiveRiposteMechanics, false, "Set to true to disable SPA 173 SE_RiposteChance from making those with the effect on them immune to enrage, can longer riposte from a riposte.")
|
||||
RULE_BOOL(Combat, UseLiveRiposteMechanics, false, "Set to true to disable SPA 173 SpellEffect::RiposteChance from making those with the effect on them immune to enrage, can longer riposte from a riposte.")
|
||||
RULE_INT(Combat, FrontalStunImmunityClasses, 0, "Bitmask for Classes than have frontal stun immunity, No Races (0) by default.")
|
||||
RULE_BOOL(Combat, NPCsUseFrontalStunImmunityClasses, false, "Enable or disable NPCs using frontal stun immunity Classes from Combat:FrontalStunImmunityClasses, false by default.")
|
||||
RULE_INT(Combat, FrontalStunImmunityRaces, 512, "Bitmask for Races than have frontal stun immunity, Ogre (512) only by default.")
|
||||
|
||||
@ -51,19 +51,10 @@
|
||||
#include "repositories/inventory_repository.h"
|
||||
#include "repositories/books_repository.h"
|
||||
#include "repositories/sharedbank_repository.h"
|
||||
|
||||
namespace ItemField
|
||||
{
|
||||
enum {
|
||||
source = 0,
|
||||
#define F(x) x,
|
||||
#include "item_fieldlist.h"
|
||||
#undef F
|
||||
updated,
|
||||
minstatus,
|
||||
comment,
|
||||
};
|
||||
}
|
||||
#include "repositories/character_inspect_messages_repository.h"
|
||||
#include "repositories/spells_new_repository.h"
|
||||
#include "repositories/damageshieldtypes_repository.h"
|
||||
#include "repositories/items_repository.h"
|
||||
|
||||
SharedDatabase::SharedDatabase()
|
||||
: Database()
|
||||
@ -131,66 +122,41 @@ bool SharedDatabase::SetGMFlymode(uint32 account_id, uint8 flymode)
|
||||
return a.id > 0;
|
||||
}
|
||||
|
||||
uint32 SharedDatabase::GetTotalTimeEntitledOnAccount(uint32 AccountID) {
|
||||
uint32 EntitledTime = 0;
|
||||
const std::string query = StringFormat("SELECT `time_played` FROM `character_data` WHERE `account_id` = %u", AccountID);
|
||||
auto results = QueryDatabase(query);
|
||||
for (auto& row = results.begin(); row != results.end(); ++row) {
|
||||
EntitledTime += Strings::ToUnsignedInt(row[0]);
|
||||
}
|
||||
return EntitledTime;
|
||||
}
|
||||
|
||||
void SharedDatabase::SetMailKey(int CharID, int IPAddress, int MailKey)
|
||||
void SharedDatabase::SetMailKey(uint32 character_id, uint32 ip_address, uint32 mail_key)
|
||||
{
|
||||
char mail_key[17];
|
||||
std::string full_mail_key;
|
||||
|
||||
if (RuleB(Chat, EnableMailKeyIPVerification) == true) {
|
||||
sprintf(mail_key, "%08X%08X", IPAddress, MailKey);
|
||||
}
|
||||
else {
|
||||
sprintf(mail_key, "%08X", MailKey);
|
||||
if (RuleB(Chat, EnableMailKeyIPVerification)) {
|
||||
full_mail_key = fmt::format("{:08X}{:08X}", ip_address, mail_key);
|
||||
} else {
|
||||
full_mail_key = fmt::format("{:08X}", mail_key);
|
||||
}
|
||||
|
||||
const std::string query = StringFormat(
|
||||
"UPDATE character_data SET mailkey = '%s' WHERE id = '%i'",
|
||||
mail_key, CharID
|
||||
);
|
||||
auto e = CharacterDataRepository::FindOne(*this, character_id);
|
||||
if (!e.id) {
|
||||
LogError("Failed to find character_id [{}] when setting mailkey", character_id);
|
||||
return;
|
||||
}
|
||||
|
||||
const auto results = QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
LogError("SharedDatabase::SetMailKey({}, {}) : {}", CharID, mail_key, results.ErrorMessage().c_str());
|
||||
e.mailkey = full_mail_key;
|
||||
|
||||
if (!CharacterDataRepository::UpdateOne(*this, e)) {
|
||||
LogError("Failed to set mailkey to [{}] for character_id [{}]", full_mail_key, character_id);
|
||||
}
|
||||
}
|
||||
|
||||
SharedDatabase::MailKeys SharedDatabase::GetMailKey(int character_id)
|
||||
SharedDatabase::MailKeys SharedDatabase::GetMailKey(uint32 character_id)
|
||||
{
|
||||
const std::string query = StringFormat("SELECT `mailkey` FROM `character_data` WHERE `id`='%i' LIMIT 1", character_id);
|
||||
auto results = QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
return MailKeys{};
|
||||
auto e = CharacterDataRepository::FindOne(*this, character_id);
|
||||
|
||||
if (!e.id) {
|
||||
return MailKeys{ };
|
||||
}
|
||||
|
||||
if (!results.RowCount()) {
|
||||
Log(Logs::General,
|
||||
Logs::ClientLogin,
|
||||
"Error: Mailkey for character id [%i] does not exist or could not be found",
|
||||
character_id
|
||||
);
|
||||
return MailKeys{};
|
||||
}
|
||||
|
||||
auto &row = results.begin();
|
||||
if (row != results.end()) {
|
||||
std::string mail_key = row[0];
|
||||
|
||||
return MailKeys{
|
||||
.mail_key = mail_key.substr(8),
|
||||
.mail_key_full = mail_key
|
||||
};
|
||||
}
|
||||
|
||||
return MailKeys{};
|
||||
return MailKeys{
|
||||
.mail_key = e.mailkey.substr(8),
|
||||
.mail_key_full = e.mailkey
|
||||
};
|
||||
}
|
||||
|
||||
bool SharedDatabase::SaveCursor(
|
||||
@ -457,27 +423,20 @@ bool SharedDatabase::DeleteSharedBankSlot(uint32 char_id, int16 slot_id)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
int32 SharedDatabase::GetSharedPlatinum(uint32 account_id)
|
||||
{
|
||||
const auto query = fmt::format("SELECT sharedplat FROM account WHERE id = {}", account_id);
|
||||
auto results = QueryDatabase(query);
|
||||
if (!results.Success() || !results.RowCount()) {
|
||||
return 0;
|
||||
}
|
||||
const auto& e = AccountRepository::FindOne(*this, account_id);
|
||||
|
||||
auto row = results.begin();
|
||||
return Strings::ToInt(row[0]);
|
||||
return e.sharedplat;
|
||||
}
|
||||
|
||||
bool SharedDatabase::SetSharedPlatinum(uint32 account_id, int32 amount_to_add) {
|
||||
const std::string query = StringFormat("UPDATE account SET sharedplat = sharedplat + %i WHERE id = %i", amount_to_add, account_id);
|
||||
const auto results = QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
return false;
|
||||
}
|
||||
bool SharedDatabase::AddSharedPlatinum(uint32 account_id, int amount)
|
||||
{
|
||||
auto e = AccountRepository::FindOne(*this, account_id);
|
||||
|
||||
return true;
|
||||
e.sharedplat += amount;
|
||||
|
||||
return AccountRepository::UpdateOne(*this, e);
|
||||
}
|
||||
|
||||
bool SharedDatabase::SetStartingItems(
|
||||
@ -944,27 +903,10 @@ void SharedDatabase::ClearOldRecastTimestamps(uint32 char_id)
|
||||
);
|
||||
}
|
||||
|
||||
void SharedDatabase::GetItemsCount(int32 &item_count, uint32 &max_id)
|
||||
void SharedDatabase::GetItemsCount(int32& item_count, uint32& max_id)
|
||||
{
|
||||
item_count = -1;
|
||||
max_id = 0;
|
||||
|
||||
const std::string query = "SELECT MAX(id), count(*) FROM items";
|
||||
auto results = QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (results.RowCount() == 0)
|
||||
return;
|
||||
|
||||
auto& row = results.begin();
|
||||
|
||||
if (row[0])
|
||||
max_id = Strings::ToUnsignedInt(row[0]);
|
||||
|
||||
if (row[1])
|
||||
item_count = Strings::ToUnsignedInt(row[1]);
|
||||
max_id = ItemsRepository::GetMaxId(*this);
|
||||
item_count = ItemsRepository::Count(*this);
|
||||
}
|
||||
|
||||
bool SharedDatabase::LoadItems(const std::string &prefix) {
|
||||
@ -994,14 +936,14 @@ void SharedDatabase::LoadItems(void *data, uint32 size, int32 items, uint32 max_
|
||||
|
||||
std::string variable_buffer;
|
||||
|
||||
bool disable_attuneable = RuleB(Items, DisableAttuneable);
|
||||
bool disable_bard_focus_effects = RuleB(Items, DisableBardFocusEffects);
|
||||
bool disable_lore = RuleB(Items, DisableLore);
|
||||
bool disable_no_drop = RuleB(Items, DisableNoDrop);
|
||||
bool disable_no_pet = RuleB(Items, DisableNoPet);
|
||||
bool disable_no_rent = RuleB(Items, DisableNoRent);
|
||||
bool disable_no_transfer = RuleB(Items, DisableNoTransfer);
|
||||
bool disable_potion_belt = RuleB(Items, DisablePotionBelt);
|
||||
bool disable_attuneable = RuleB(Items, DisableAttuneable);
|
||||
bool disable_bard_focus_effects = RuleB(Items, DisableBardFocusEffects);
|
||||
bool disable_lore = RuleB(Items, DisableLore);
|
||||
bool disable_no_drop = RuleB(Items, DisableNoDrop);
|
||||
bool disable_no_pet = RuleB(Items, DisableNoPet);
|
||||
bool disable_no_rent = RuleB(Items, DisableNoRent);
|
||||
bool disable_no_transfer = RuleB(Items, DisableNoTransfer);
|
||||
bool disable_potion_belt = RuleB(Items, DisablePotionBelt);
|
||||
bool disable_spell_focus_effects = RuleB(Items, DisableSpellFocusEffects);
|
||||
|
||||
// Old Variable Code
|
||||
@ -1032,206 +974,204 @@ void SharedDatabase::LoadItems(void *data, uint32 size, int32 items, uint32 max_
|
||||
|
||||
EQ::ItemData item;
|
||||
|
||||
const std::string query = "SELECT source,"
|
||||
#define F(x) "`"#x"`,"
|
||||
#include "item_fieldlist.h"
|
||||
#undef F
|
||||
"updated, minstatus, comment FROM items ORDER BY id";
|
||||
auto results = QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
const auto& l = ItemsRepository::All(*this);
|
||||
|
||||
if (l.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (auto& row = results.begin(); row != results.end(); ++row) {
|
||||
for (const auto& e : l) {
|
||||
memset(&item, 0, sizeof(EQ::ItemData));
|
||||
|
||||
// Unique Identifier
|
||||
item.ID = Strings::ToUnsignedInt(row[ItemField::id]);
|
||||
item.ID = e.id;
|
||||
|
||||
// Minimum Status
|
||||
item.MinStatus = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::minstatus]));
|
||||
item.MinStatus = static_cast<uint8>(e.minstatus);
|
||||
|
||||
// Name, Lore, and Comment
|
||||
strn0cpy(item.Name, row[ItemField::name], sizeof(item.Name));
|
||||
strn0cpy(item.Lore, row[ItemField::lore], sizeof(item.Lore));
|
||||
strn0cpy(item.Comment, row[ItemField::comment], sizeof(item.Comment));
|
||||
strn0cpy(item.Name, e.Name.c_str(), sizeof(item.Name));
|
||||
strn0cpy(item.Lore, e.lore.c_str(), sizeof(item.Lore));
|
||||
strn0cpy(item.Comment, e.comment.c_str(), sizeof(item.Comment));
|
||||
|
||||
// Flags
|
||||
item.ArtifactFlag = Strings::ToBool(row[ItemField::artifactflag]);
|
||||
item.Attuneable = !disable_attuneable && Strings::ToBool(row[ItemField::attuneable]);
|
||||
item.BenefitFlag = Strings::ToBool(row[ItemField::benefitflag]);
|
||||
item.FVNoDrop = Strings::ToBool(row[ItemField::fvnodrop]);
|
||||
item.Magic = Strings::ToBool(row[ItemField::magic]);
|
||||
item.NoDrop = disable_no_drop ? static_cast<uint8>(255) : static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::nodrop]));
|
||||
item.NoPet = !disable_no_pet && Strings::ToBool(row[ItemField::nopet]);
|
||||
item.NoRent = disable_no_rent ? static_cast<uint8>(255) : static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::norent]));
|
||||
item.NoTransfer = !disable_no_transfer && Strings::ToBool(row[ItemField::notransfer]);
|
||||
item.PendingLoreFlag = Strings::ToBool(row[ItemField::pendingloreflag]);
|
||||
item.QuestItemFlag = Strings::ToBool(row[ItemField::questitemflag]);
|
||||
item.Stackable = Strings::ToBool(row[ItemField::stackable]);
|
||||
item.Tradeskills = Strings::ToBool(row[ItemField::tradeskills]);
|
||||
item.SummonedFlag = Strings::ToBool(row[ItemField::summonedflag]);
|
||||
item.ArtifactFlag = e.artifactflag;
|
||||
item.Attuneable = !disable_attuneable && e.attuneable;
|
||||
item.BenefitFlag = e.benefitflag;
|
||||
item.FVNoDrop = e.fvnodrop;
|
||||
item.Magic = e.magic;
|
||||
item.NoDrop = disable_no_drop ? std::numeric_limits<uint8>::max() : e.nodrop;
|
||||
item.NoPet = !disable_no_pet && e.nopet;
|
||||
item.NoRent = disable_no_rent ? std::numeric_limits<uint8>::max() : e.norent;
|
||||
item.NoTransfer = !disable_no_transfer && e.notransfer;
|
||||
item.PendingLoreFlag = e.pendingloreflag;
|
||||
item.QuestItemFlag = e.questitemflag;
|
||||
item.Stackable = e.stackable;
|
||||
item.Tradeskills = e.tradeskills;
|
||||
item.SummonedFlag = e.summonedflag;
|
||||
|
||||
// Lore
|
||||
item.LoreGroup = disable_lore ? 0 : Strings::ToInt(row[ItemField::loregroup]);
|
||||
item.LoreFlag = !disable_lore && item.LoreGroup != 0;
|
||||
item.LoreGroup = disable_lore ? 0 : e.loregroup;
|
||||
item.LoreFlag = !disable_lore && item.LoreGroup != 0;
|
||||
|
||||
// Type
|
||||
item.AugType = Strings::ToUnsignedInt(row[ItemField::augtype]);
|
||||
item.ItemType = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::itemtype]));
|
||||
item.SubType = Strings::ToInt(row[ItemField::subtype]);
|
||||
item.AugType = e.augtype;
|
||||
item.ItemType = static_cast<uint8>(e.itemtype);
|
||||
item.SubType = e.subtype;
|
||||
|
||||
// Miscellaneous
|
||||
item.ExpendableArrow = static_cast<uint16>(Strings::ToUnsignedInt(row[ItemField::expendablearrow]));
|
||||
item.Light = static_cast<int8>(Strings::ToInt(row[ItemField::light]));
|
||||
item.MaxCharges = static_cast<int16>(Strings::ToInt(row[ItemField::maxcharges]));
|
||||
item.Size = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::size]));
|
||||
item.StackSize = static_cast<int16>(Strings::ToInt(row[ItemField::stacksize]));
|
||||
item.Weight = Strings::ToInt(row[ItemField::weight]);
|
||||
item.ExpendableArrow = e.expendablearrow;
|
||||
item.Light = EQ::Clamp(e.light, -128, 127);
|
||||
item.MaxCharges = e.maxcharges;
|
||||
item.Size = static_cast<uint8>(e.size);
|
||||
item.StackSize = e.stacksize;
|
||||
item.Weight = e.weight;
|
||||
|
||||
// Potion Belt
|
||||
item.PotionBelt = !disable_potion_belt && Strings::ToBool(row[ItemField::potionbelt]);
|
||||
item.PotionBeltSlots = disable_potion_belt ? 0 : static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::potionbeltslots]));
|
||||
item.PotionBelt = !disable_potion_belt && e.potionbelt;
|
||||
item.PotionBeltSlots = disable_potion_belt ? 0 : static_cast<uint8>(e.potionbeltslots);
|
||||
|
||||
// Merchant
|
||||
item.Favor = Strings::ToUnsignedInt(row[ItemField::favor]);
|
||||
item.GuildFavor = Strings::ToUnsignedInt(row[ItemField::guildfavor]);
|
||||
item.Price = Strings::ToUnsignedInt(row[ItemField::price]);
|
||||
item.SellRate = Strings::ToFloat(row[ItemField::sellrate]);
|
||||
item.Favor = e.favor;
|
||||
item.GuildFavor = e.guildfavor;
|
||||
item.Price = e.price;
|
||||
item.SellRate = e.sellrate;
|
||||
|
||||
// Display
|
||||
item.Color = Strings::ToUnsignedInt(row[ItemField::color]);
|
||||
item.EliteMaterial = Strings::ToUnsignedInt(row[ItemField::elitematerial]);
|
||||
item.HerosForgeModel = Strings::ToUnsignedInt(row[ItemField::herosforgemodel]);
|
||||
item.Icon = Strings::ToUnsignedInt(row[ItemField::icon]);
|
||||
strn0cpy(item.IDFile, row[ItemField::idfile], sizeof(item.IDFile));
|
||||
item.Material = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::material]));
|
||||
item.Color = e.color;
|
||||
item.EliteMaterial = e.elitematerial;
|
||||
item.HerosForgeModel = e.herosforgemodel;
|
||||
item.Icon = e.icon;
|
||||
strn0cpy(item.IDFile, e.idfile.c_str(), sizeof(item.IDFile));
|
||||
item.Material = e.material;
|
||||
|
||||
// Resists
|
||||
item.CR = static_cast<int8>(EQ::Clamp(Strings::ToInt(row[ItemField::cr]), -128, 127));
|
||||
item.DR = static_cast<int8>(EQ::Clamp(Strings::ToInt(row[ItemField::dr]), -128, 127));
|
||||
item.FR = static_cast<int8>(EQ::Clamp(Strings::ToInt(row[ItemField::fr]), -128, 127));
|
||||
item.MR = static_cast<int8>(EQ::Clamp(Strings::ToInt(row[ItemField::mr]), -128, 127));
|
||||
item.PR = static_cast<int8>(EQ::Clamp(Strings::ToInt(row[ItemField::pr]), -128, 127));
|
||||
item.SVCorruption = static_cast<int8>(EQ::Clamp(Strings::ToInt(row[ItemField::svcorruption]), -128, 127));
|
||||
item.CR = EQ::Clamp(e.cr, -128, 127);
|
||||
item.DR = EQ::Clamp(e.dr, -128, 127);
|
||||
item.FR = EQ::Clamp(e.fr, -128, 127);
|
||||
item.MR = EQ::Clamp(e.mr, -128, 127);
|
||||
item.PR = EQ::Clamp(e.pr, -128, 127);
|
||||
item.SVCorruption = EQ::Clamp(e.svcorruption, -128, 127);
|
||||
|
||||
// Heroic Resists
|
||||
item.HeroicCR = Strings::ToInt(row[ItemField::heroic_cr]);
|
||||
item.HeroicDR = Strings::ToInt(row[ItemField::heroic_dr]);
|
||||
item.HeroicFR = Strings::ToInt(row[ItemField::heroic_fr]);
|
||||
item.HeroicMR = Strings::ToInt(row[ItemField::heroic_mr]);
|
||||
item.HeroicPR = Strings::ToInt(row[ItemField::heroic_pr]);
|
||||
item.HeroicSVCorrup = Strings::ToInt(row[ItemField::heroic_svcorrup]);
|
||||
item.HeroicCR = e.heroic_cr;
|
||||
item.HeroicDR = e.heroic_dr;
|
||||
item.HeroicFR = e.heroic_fr;
|
||||
item.HeroicMR = e.heroic_mr;
|
||||
item.HeroicPR = e.heroic_pr;
|
||||
item.HeroicSVCorrup = e.heroic_svcorrup;
|
||||
|
||||
// Stats
|
||||
item.AAgi = static_cast<int8>(EQ::Clamp(Strings::ToInt(row[ItemField::aagi]), -128, 127));
|
||||
item.ACha = static_cast<int8>(EQ::Clamp(Strings::ToInt(row[ItemField::acha]), -128, 127));
|
||||
item.ADex = static_cast<int8>(EQ::Clamp(Strings::ToInt(row[ItemField::adex]), -128, 127));
|
||||
item.AInt = static_cast<int8>(EQ::Clamp(Strings::ToInt(row[ItemField::aint]), -128, 127));
|
||||
item.ASta = static_cast<int8>(EQ::Clamp(Strings::ToInt(row[ItemField::asta]), -128, 127));
|
||||
item.AStr = static_cast<int8>(EQ::Clamp(Strings::ToInt(row[ItemField::astr]), -128, 127));
|
||||
item.AWis = static_cast<int8>(EQ::Clamp(Strings::ToInt(row[ItemField::awis]), -128, 127));
|
||||
item.AAgi = EQ::Clamp(e.aagi, -128, 127);
|
||||
item.ACha = EQ::Clamp(e.acha, -128, 127);
|
||||
item.ADex = EQ::Clamp(e.adex, -128, 127);
|
||||
item.AInt = EQ::Clamp(e.aint, -128, 127);
|
||||
item.ASta = EQ::Clamp(e.asta, -128, 127);
|
||||
item.AStr = EQ::Clamp(e.astr, -128, 127);
|
||||
item.AWis = EQ::Clamp(e.awis, -128, 127);
|
||||
|
||||
// Heroic Stats
|
||||
item.HeroicAgi = Strings::ToInt(row[ItemField::heroic_agi]);
|
||||
item.HeroicCha = Strings::ToInt(row[ItemField::heroic_cha]);
|
||||
item.HeroicDex = Strings::ToInt(row[ItemField::heroic_dex]);
|
||||
item.HeroicInt = Strings::ToInt(row[ItemField::heroic_int]);
|
||||
item.HeroicSta = Strings::ToInt(row[ItemField::heroic_sta]);
|
||||
item.HeroicStr = Strings::ToInt(row[ItemField::heroic_str]);
|
||||
item.HeroicWis = Strings::ToInt(row[ItemField::heroic_wis]);
|
||||
item.HeroicAgi = e.heroic_agi;
|
||||
item.HeroicCha = e.heroic_cha;
|
||||
item.HeroicDex = e.heroic_dex;
|
||||
item.HeroicInt = e.heroic_int;
|
||||
item.HeroicSta = e.heroic_sta;
|
||||
item.HeroicStr = e.heroic_str;
|
||||
item.HeroicWis = e.heroic_wis;
|
||||
|
||||
// Health, Mana, and Endurance
|
||||
item.HP = Strings::ToInt(row[ItemField::hp]);
|
||||
item.Regen = Strings::ToInt(row[ItemField::regen]);
|
||||
item.Mana = Strings::ToInt(row[ItemField::mana]);
|
||||
item.ManaRegen = Strings::ToInt(row[ItemField::manaregen]);
|
||||
item.Endur = Strings::ToInt(row[ItemField::endur]);
|
||||
item.EnduranceRegen = Strings::ToInt(row[ItemField::enduranceregen]);
|
||||
item.HP = e.hp;
|
||||
item.Regen = e.regen;
|
||||
item.Mana = e.mana;
|
||||
item.ManaRegen = e.manaregen;
|
||||
item.Endur = e.endur;
|
||||
item.EnduranceRegen = e.enduranceregen;
|
||||
|
||||
// Bane Damage
|
||||
item.BaneDmgAmt = Strings::ToInt(row[ItemField::banedmgamt]);
|
||||
item.BaneDmgBody = Strings::ToUnsignedInt(row[ItemField::banedmgbody]);
|
||||
item.BaneDmgRace = Strings::ToUnsignedInt(row[ItemField::banedmgrace]);
|
||||
item.BaneDmgRaceAmt = Strings::ToUnsignedInt(row[ItemField::banedmgraceamt]);
|
||||
item.BaneDmgAmt = e.banedmgamt;
|
||||
item.BaneDmgBody = e.banedmgbody;
|
||||
item.BaneDmgRace = e.banedmgrace;
|
||||
item.BaneDmgRaceAmt = e.banedmgraceamt;
|
||||
|
||||
// Elemental Damage
|
||||
item.ElemDmgType = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::elemdmgtype]));
|
||||
item.ElemDmgAmt = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::elemdmgamt]));
|
||||
item.ElemDmgType = static_cast<uint8>(e.elemdmgtype);
|
||||
item.ElemDmgAmt = static_cast<uint8>(e.elemdmgamt);
|
||||
|
||||
// Combat
|
||||
item.BackstabDmg = Strings::ToUnsignedInt(row[ItemField::backstabdmg]);
|
||||
item.Damage = Strings::ToUnsignedInt(row[ItemField::damage]);
|
||||
item.Delay = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::delay]));
|
||||
item.Range = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::range]));
|
||||
item.BackstabDmg = e.backstabdmg;
|
||||
item.Damage = e.damage;
|
||||
item.Delay = static_cast<uint8>(e.delay);
|
||||
item.Range = static_cast<uint8>(e.range_);
|
||||
|
||||
// Combat Stats
|
||||
item.AC = Strings::ToInt(row[ItemField::ac]);
|
||||
item.Accuracy = static_cast<int8>(EQ::Clamp(Strings::ToInt(row[ItemField::accuracy]), -128, 127));
|
||||
item.Attack = Strings::ToInt(row[ItemField::attack]);
|
||||
item.Avoidance = static_cast<int8>(EQ::Clamp(Strings::ToInt(row[ItemField::avoidance]), -128, 127));
|
||||
item.Clairvoyance = Strings::ToUnsignedInt(row[ItemField::clairvoyance]);
|
||||
item.CombatEffects = Strings::IsNumber(row[ItemField::combateffects]) ? static_cast<int8>(EQ::Clamp(Strings::ToInt(row[ItemField::combateffects]), -128, 127)) : 0;
|
||||
item.DamageShield = Strings::ToInt(row[ItemField::damageshield]);
|
||||
item.DotShielding = Strings::ToInt(row[ItemField::dotshielding]);
|
||||
item.DSMitigation = Strings::ToUnsignedInt(row[ItemField::dsmitigation]);
|
||||
item.Haste = Strings::ToInt(row[ItemField::haste]);
|
||||
item.HealAmt = Strings::ToInt(row[ItemField::healamt]);
|
||||
item.Purity = Strings::ToUnsignedInt(row[ItemField::purity]);
|
||||
item.Shielding = static_cast<int8>(EQ::Clamp(Strings::ToInt(row[ItemField::shielding]), -128, 127));
|
||||
item.SpellDmg = Strings::ToInt(row[ItemField::spelldmg]);
|
||||
item.SpellShield = static_cast<int8>(EQ::Clamp(Strings::ToInt(row[ItemField::spellshield]), -128, 127));
|
||||
item.StrikeThrough = static_cast<int8>(EQ::Clamp(Strings::ToInt(row[ItemField::strikethrough]), -128, 127));
|
||||
item.StunResist = static_cast<int8>(EQ::Clamp(Strings::ToInt(row[ItemField::stunresist]), -128, 127));
|
||||
item.AC = e.ac;
|
||||
item.Accuracy = EQ::Clamp(e.accuracy, -128, 127);
|
||||
item.Attack = e.attack;
|
||||
item.Avoidance = EQ::Clamp(e.avoidance, -128, 127);
|
||||
item.Clairvoyance = e.clairvoyance;
|
||||
item.CombatEffects = Strings::IsNumber(e.combateffects) ? static_cast<int8>(EQ::Clamp(Strings::ToInt(e.combateffects), -128, 127)) : 0;
|
||||
item.DamageShield = e.damageshield;
|
||||
item.DotShielding = e.dotshielding;
|
||||
item.DSMitigation = e.dsmitigation;
|
||||
item.Haste = e.haste;
|
||||
item.HealAmt = e.healamt;
|
||||
item.Purity = e.purity;
|
||||
item.Shielding = EQ::Clamp(e.shielding, -128, 127);
|
||||
item.SpellDmg = e.spelldmg;
|
||||
item.SpellShield = EQ::Clamp(e.spellshield, -128, 127);
|
||||
item.StrikeThrough = EQ::Clamp(e.strikethrough, -128, 127);
|
||||
item.StunResist = EQ::Clamp(e.stunresist, -128, 127);
|
||||
|
||||
// Restrictions
|
||||
item.AugRestrict = Strings::ToUnsignedInt(row[ItemField::augrestrict]);
|
||||
item.Classes = Strings::ToUnsignedInt(row[ItemField::classes]);
|
||||
item.Deity = Strings::ToUnsignedInt(row[ItemField::deity]);
|
||||
item.ItemClass = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::itemclass]));
|
||||
item.Races = Strings::ToUnsignedInt(row[ItemField::races]);
|
||||
item.RecLevel = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::reclevel]));
|
||||
item.RecSkill = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::recskill]));
|
||||
item.ReqLevel = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::reqlevel]));
|
||||
item.Slots = Strings::ToUnsignedInt(row[ItemField::slots]);
|
||||
item.AugRestrict = e.augrestrict;
|
||||
item.Classes = e.classes;
|
||||
item.Deity = e.deity;
|
||||
item.ItemClass = static_cast<uint8>(e.itemclass);
|
||||
item.Races = e.races;
|
||||
item.RecLevel = static_cast<uint8>(e.reclevel);
|
||||
item.RecSkill = static_cast<uint8>(e.recskill);
|
||||
item.ReqLevel = static_cast<uint8>(e.reqlevel);
|
||||
item.Slots = e.slots;
|
||||
|
||||
// Skill Modifier
|
||||
item.SkillModValue = Strings::ToInt(row[ItemField::skillmodvalue]);
|
||||
item.SkillModMax = Strings::ToInt(row[ItemField::skillmodmax]);
|
||||
item.SkillModType = Strings::ToUnsignedInt(row[ItemField::skillmodtype]);
|
||||
item.SkillModValue = e.skillmodvalue;
|
||||
item.SkillModMax = e.skillmodmax;
|
||||
item.SkillModType = e.skillmodtype;
|
||||
|
||||
// Extra Damage Skill
|
||||
item.ExtraDmgSkill = Strings::ToInt(row[ItemField::extradmgskill]);
|
||||
item.ExtraDmgAmt = Strings::ToInt(row[ItemField::extradmgamt]);
|
||||
item.ExtraDmgSkill = e.extradmgskill;
|
||||
item.ExtraDmgAmt = e.extradmgamt;
|
||||
|
||||
// Bard
|
||||
item.BardType = Strings::ToUnsignedInt(row[ItemField::bardtype]);
|
||||
item.BardValue = Strings::ToInt(row[ItemField::bardvalue]);
|
||||
item.BardType = e.bardtype;
|
||||
item.BardValue = e.bardvalue;
|
||||
|
||||
// Faction
|
||||
item.FactionAmt1 = Strings::ToInt(row[ItemField::factionamt1]);
|
||||
item.FactionMod1 = Strings::ToInt(row[ItemField::factionmod1]);
|
||||
item.FactionAmt2 = Strings::ToInt(row[ItemField::factionamt2]);
|
||||
item.FactionMod2 = Strings::ToInt(row[ItemField::factionmod2]);
|
||||
item.FactionAmt3 = Strings::ToInt(row[ItemField::factionamt3]);
|
||||
item.FactionMod3 = Strings::ToInt(row[ItemField::factionmod3]);
|
||||
item.FactionAmt4 = Strings::ToInt(row[ItemField::factionamt4]);
|
||||
item.FactionMod4 = Strings::ToInt(row[ItemField::factionmod4]);
|
||||
item.FactionAmt1 = e.factionamt1;
|
||||
item.FactionMod1 = e.factionmod1;
|
||||
item.FactionAmt2 = e.factionamt2;
|
||||
item.FactionMod2 = e.factionmod2;
|
||||
item.FactionAmt3 = e.factionamt3;
|
||||
item.FactionMod3 = e.factionmod3;
|
||||
item.FactionAmt4 = e.factionamt4;
|
||||
item.FactionMod4 = e.factionmod4;
|
||||
|
||||
// Augment
|
||||
item.AugDistiller = Strings::ToUnsignedInt(row[ItemField::augdistiller]);
|
||||
item.AugSlotType[0] = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::augslot1type]));
|
||||
item.AugSlotVisible[0] = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::augslot1visible]));
|
||||
item.AugSlotType[1] = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::augslot2type]));
|
||||
item.AugSlotVisible[1] = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::augslot2visible]));
|
||||
item.AugSlotType[2] = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::augslot3type]));
|
||||
item.AugSlotVisible[2] = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::augslot3visible]));
|
||||
item.AugSlotType[3] = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::augslot4type]));
|
||||
item.AugSlotVisible[3] = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::augslot4visible]));
|
||||
item.AugSlotType[4] = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::augslot5type]));
|
||||
item.AugSlotVisible[4] = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::augslot5visible]));
|
||||
item.AugSlotType[5] = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::augslot6type]));
|
||||
item.AugSlotVisible[5] = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::augslot6visible]));
|
||||
// Augment Distiller
|
||||
item.AugDistiller = e.augdistiller;
|
||||
|
||||
// Augment Slots
|
||||
item.AugSlotType[0] = static_cast<uint8>(e.augslot1type);
|
||||
item.AugSlotVisible[0] = static_cast<uint8>(e.augslot1visible);
|
||||
item.AugSlotType[1] = static_cast<uint8>(e.augslot2type);
|
||||
item.AugSlotVisible[1] = static_cast<uint8>(e.augslot2visible);
|
||||
item.AugSlotType[2] = static_cast<uint8>(e.augslot3type);
|
||||
item.AugSlotVisible[2] = static_cast<uint8>(e.augslot3visible);
|
||||
item.AugSlotType[3] = static_cast<uint8>(e.augslot4type);
|
||||
item.AugSlotVisible[3] = static_cast<uint8>(e.augslot4visible);
|
||||
item.AugSlotType[4] = static_cast<uint8>(e.augslot5type);
|
||||
item.AugSlotVisible[4] = static_cast<uint8>(e.augslot5visible);
|
||||
item.AugSlotType[5] = static_cast<uint8>(e.augslot6type);
|
||||
item.AugSlotVisible[5] = static_cast<uint8>(e.augslot6visible);
|
||||
|
||||
// Augment Unknowns
|
||||
for (uint8 i = EQ::invaug::SOCKET_BEGIN; i <= EQ::invaug::SOCKET_END; i++) {
|
||||
@ -1239,79 +1179,79 @@ void SharedDatabase::LoadItems(void *data, uint32 size, int32 items, uint32 max_
|
||||
}
|
||||
|
||||
// LDoN
|
||||
item.LDoNTheme = Strings::ToUnsignedInt(row[ItemField::ldontheme]);
|
||||
item.LDoNPrice = Strings::ToUnsignedInt(row[ItemField::ldonprice]);
|
||||
item.LDoNSellBackRate = Strings::ToUnsignedInt(row[ItemField::ldonsellbackrate]);
|
||||
item.LDoNSold = Strings::ToUnsignedInt(row[ItemField::ldonsold]);
|
||||
item.PointType = Strings::ToUnsignedInt(row[ItemField::pointtype]);
|
||||
item.LDoNTheme = e.ldontheme;
|
||||
item.LDoNPrice = e.ldonprice;
|
||||
item.LDoNSellBackRate = e.ldonsellbackrate;
|
||||
item.LDoNSold = e.ldonsold;
|
||||
item.PointType = e.pointtype;
|
||||
|
||||
// Bag
|
||||
item.BagSize = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::bagsize]));
|
||||
item.BagSlots = static_cast<uint8>(EQ::Clamp(Strings::ToInt(row[ItemField::bagslots]), 0, static_cast<int>(EQ::invbag::SLOT_COUNT)));
|
||||
item.BagType = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::bagtype]));
|
||||
item.BagWR = static_cast<uint8>(EQ::Clamp(Strings::ToInt(row[ItemField::bagwr]), 0, 100));
|
||||
item.BagSize = static_cast<uint8>(e.bagsize);
|
||||
item.BagSlots = EQ::Clamp(e.bagslots, 0, static_cast<int>(EQ::invbag::SLOT_COUNT));
|
||||
item.BagType = static_cast<uint8>(e.bagtype);
|
||||
item.BagWR = EQ::Clamp(e.bagwr, 0, 100);
|
||||
|
||||
// Bard Effect
|
||||
item.Bard.Effect = disable_bard_focus_effects ? 0 : Strings::ToInt(row[ItemField::bardeffect]);
|
||||
item.Bard.Type = disable_bard_focus_effects ? 0 : static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::bardtype]));
|
||||
item.Bard.Level = disable_bard_focus_effects ? 0 : static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::bardlevel]));
|
||||
item.Bard.Level2 = disable_bard_focus_effects ? 0 : static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::bardlevel2]));
|
||||
item.Bard.Effect = disable_bard_focus_effects ? 0 : e.bardeffect;
|
||||
item.Bard.Type = disable_bard_focus_effects ? 0 : static_cast<uint8>(e.bardtype);
|
||||
item.Bard.Level = disable_bard_focus_effects ? 0 : static_cast<uint8>(e.bardlevel);
|
||||
item.Bard.Level2 = disable_bard_focus_effects ? 0 : static_cast<uint8>(e.bardlevel2);
|
||||
|
||||
// Book
|
||||
item.Book = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::book]));
|
||||
item.BookType = Strings::ToUnsignedInt(row[ItemField::booktype]);
|
||||
item.Book = static_cast<uint8>(e.book);
|
||||
item.BookType = e.booktype;
|
||||
|
||||
// Click Effect
|
||||
item.CastTime = Strings::ToUnsignedInt(row[ItemField::casttime]);
|
||||
item.CastTime_ = Strings::ToInt(row[ItemField::casttime_]);
|
||||
item.Click.Effect = Strings::ToInt(row[ItemField::clickeffect]);
|
||||
item.Click.Type = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::clicktype]));
|
||||
item.Click.Level = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::clicklevel]));
|
||||
item.Click.Level2 = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::clicklevel2]));
|
||||
strn0cpy(item.ClickName, row[ItemField::clickname], sizeof(item.ClickName));
|
||||
item.RecastDelay = Strings::ToUnsignedInt(row[ItemField::recastdelay]);
|
||||
item.RecastType = Strings::ToInt(row[ItemField::recasttype]);
|
||||
item.CastTime = e.casttime;
|
||||
item.CastTime_ = e.casttime_;
|
||||
item.Click.Effect = e.clickeffect;
|
||||
item.Click.Type = static_cast<uint8>(e.clicktype);
|
||||
item.Click.Level = static_cast<uint8>(e.clicklevel);
|
||||
item.Click.Level2 = static_cast<uint8>(e.clicklevel2);
|
||||
strn0cpy(item.ClickName, e.clickname.c_str(), sizeof(item.ClickName));
|
||||
item.RecastDelay = e.recastdelay;
|
||||
item.RecastType = e.recasttype;
|
||||
|
||||
// Focus Effect
|
||||
item.Focus.Effect = disable_spell_focus_effects ? 0 : Strings::ToInt(row[ItemField::focuseffect]);
|
||||
item.Focus.Type = disable_spell_focus_effects ? 0 : static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::focustype]));
|
||||
item.Focus.Level = disable_spell_focus_effects ? 0 : static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::focuslevel]));
|
||||
item.Focus.Level2 = disable_spell_focus_effects ? 0 : static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::focuslevel2]));
|
||||
strn0cpy(item.FocusName, disable_spell_focus_effects ? "" : row[ItemField::focusname], sizeof(item.FocusName));
|
||||
item.Focus.Effect = disable_spell_focus_effects ? 0 : e.focuseffect;
|
||||
item.Focus.Type = disable_spell_focus_effects ? 0 : static_cast<uint8>(e.focustype);
|
||||
item.Focus.Level = disable_spell_focus_effects ? 0 : static_cast<uint8>(e.focuslevel);
|
||||
item.Focus.Level2 = disable_spell_focus_effects ? 0 : static_cast<uint8>(e.focuslevel2);
|
||||
strn0cpy(item.FocusName, disable_spell_focus_effects ? "" : e.focusname.c_str(), sizeof(item.FocusName));
|
||||
|
||||
// Proc Effect
|
||||
item.Proc.Effect = Strings::ToInt(row[ItemField::proceffect]);
|
||||
item.Proc.Type = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::proctype]));
|
||||
item.Proc.Level = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::proclevel]));
|
||||
item.Proc.Level2 = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::proclevel2]));
|
||||
strn0cpy(item.ProcName, row[ItemField::procname], sizeof(item.ProcName));
|
||||
item.ProcRate = Strings::ToInt(row[ItemField::procrate]);
|
||||
item.Proc.Effect = e.proceffect;
|
||||
item.Proc.Type = static_cast<uint8>(e.proctype);
|
||||
item.Proc.Level = static_cast<uint8>(e.proclevel);
|
||||
item.Proc.Level2 = static_cast<uint8>(e.proclevel2);
|
||||
strn0cpy(item.ProcName, e.procname.c_str(), sizeof(item.ProcName));
|
||||
item.ProcRate = e.procrate;
|
||||
|
||||
// Scroll Effect
|
||||
item.Scroll.Effect = Strings::ToInt(row[ItemField::scrolleffect]);
|
||||
item.Scroll.Type = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::scrolltype]));
|
||||
item.Scroll.Level = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::scrolllevel]));
|
||||
item.Scroll.Level2 = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::scrolllevel2]));
|
||||
strn0cpy(item.ScrollName, row[ItemField::scrollname], sizeof(item.ScrollName));
|
||||
item.Scroll.Effect = e.scrolleffect;
|
||||
item.Scroll.Type = static_cast<uint8>(e.scrolltype);
|
||||
item.Scroll.Level = static_cast<uint8>(e.scrolllevel);
|
||||
item.Scroll.Level2 = static_cast<uint8>(e.scrolllevel2);
|
||||
strn0cpy(item.ScrollName, e.scrollname.c_str(), sizeof(item.ScrollName));
|
||||
|
||||
// Worn Effect
|
||||
item.Worn.Effect = Strings::ToInt(row[ItemField::worneffect]);
|
||||
item.Worn.Type = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::worntype]));
|
||||
item.Worn.Level = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::wornlevel]));
|
||||
item.Worn.Level2 = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::wornlevel2]));
|
||||
strn0cpy(item.WornName, row[ItemField::wornname], sizeof(item.WornName));
|
||||
item.Worn.Effect = e.worneffect;
|
||||
item.Worn.Type = static_cast<uint8>(e.worntype);
|
||||
item.Worn.Level = static_cast<uint8>(e.wornlevel);
|
||||
item.Worn.Level2 = static_cast<uint8>(e.wornlevel2);
|
||||
strn0cpy(item.WornName, e.wornname.c_str(), sizeof(item.WornName));
|
||||
|
||||
// Evolving Item
|
||||
item.EvolvingID = Strings::ToUnsignedInt(row[ItemField::evoid]);
|
||||
item.EvolvingItem = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::evoitem]));
|
||||
item.EvolvingLevel = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::evolvinglevel]));
|
||||
item.EvolvingMax = static_cast<uint8>(Strings::ToUnsignedInt(row[ItemField::evomax]));
|
||||
item.EvolvingID = e.evoid;
|
||||
item.EvolvingItem = static_cast<uint8>(e.evoitem);
|
||||
item.EvolvingLevel = static_cast<uint8>(e.evolvinglevel);
|
||||
item.EvolvingMax = static_cast<uint8>(e.evomax);
|
||||
|
||||
// Scripting
|
||||
item.CharmFileID = Strings::IsNumber(row[ItemField::charmfileid]) ? Strings::ToUnsignedInt(row[ItemField::charmfileid]) : 0;
|
||||
strn0cpy(item.CharmFile, row[ItemField::charmfile], sizeof(item.CharmFile));
|
||||
strn0cpy(item.Filename, row[ItemField::filename], sizeof(item.Filename));
|
||||
item.ScriptFileID = Strings::ToUnsignedInt(row[ItemField::scriptfileid]);
|
||||
item.CharmFileID = Strings::IsNumber(e.charmfileid) ? Strings::ToUnsignedInt(e.charmfileid) : 0;
|
||||
strn0cpy(item.CharmFile, e.charmfile.c_str(), sizeof(item.CharmFile));
|
||||
strn0cpy(item.Filename, e.filename.c_str(), sizeof(item.Filename));
|
||||
item.ScriptFileID = e.scriptfileid;
|
||||
|
||||
try {
|
||||
hash.insert(item.ID, item);
|
||||
@ -1673,20 +1613,17 @@ bool SharedDatabase::GetCommandSubSettings(std::vector<CommandSubsettingsReposit
|
||||
return true;
|
||||
}
|
||||
|
||||
void SharedDatabase::LoadDamageShieldTypes(SPDat_Spell_Struct* sp, int32 iMaxSpellID) {
|
||||
const std::string query = StringFormat("SELECT `spellid`, `type` FROM `damageshieldtypes` WHERE `spellid` > 0 "
|
||||
"AND `spellid` <= %i", iMaxSpellID);
|
||||
auto results = QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
return;
|
||||
}
|
||||
void SharedDatabase::LoadDamageShieldTypes(SPDat_Spell_Struct* s)
|
||||
{
|
||||
const auto& l = DamageshieldtypesRepository::All(*this);
|
||||
|
||||
for(auto& row = results.begin(); row != results.end(); ++row) {
|
||||
const int spellID = Strings::ToInt(row[0]);
|
||||
if((spellID > 0) && (spellID <= iMaxSpellID))
|
||||
sp[spellID].damage_shield_type = Strings::ToUnsignedInt(row[1]);
|
||||
}
|
||||
if (l.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (const auto& e : l) {
|
||||
s[e.spellid].damage_shield_type = e.type;
|
||||
}
|
||||
}
|
||||
|
||||
const EvolveInfo* SharedDatabase::GetEvolveInfo(uint32 loregroup) {
|
||||
@ -1903,21 +1840,32 @@ void SharedDatabase::LoadSpells(void *data, int max_spells) {
|
||||
sp[tempid].damage_shield_type = 0;
|
||||
}
|
||||
|
||||
LoadDamageShieldTypes(sp, max_spells);
|
||||
LoadDamageShieldTypes(sp);
|
||||
}
|
||||
|
||||
void SharedDatabase::LoadCharacterInspectMessage(uint32 character_id, InspectMessage_Struct* message) {
|
||||
const std::string query = StringFormat("SELECT `inspect_message` FROM `character_inspect_messages` WHERE `id` = %u LIMIT 1", character_id);
|
||||
auto results = QueryDatabase(query);
|
||||
memset(message, '\0', sizeof(InspectMessage_Struct));
|
||||
for (auto& row = results.begin(); row != results.end(); ++row) {
|
||||
memcpy(message, row[0], sizeof(InspectMessage_Struct));
|
||||
void SharedDatabase::LoadCharacterInspectMessage(uint32 character_id, InspectMessage_Struct* s)
|
||||
{
|
||||
const auto& e = CharacterInspectMessagesRepository::FindOne(*this, character_id);
|
||||
|
||||
memset(s, '\0', sizeof(InspectMessage_Struct));
|
||||
|
||||
if (!e.id) {
|
||||
return;
|
||||
}
|
||||
|
||||
memcpy(s, e.inspect_message.c_str(), sizeof(InspectMessage_Struct));
|
||||
}
|
||||
|
||||
void SharedDatabase::SaveCharacterInspectMessage(uint32 character_id, const InspectMessage_Struct* message) {
|
||||
const std::string query = StringFormat("REPLACE INTO `character_inspect_messages` (id, inspect_message) VALUES (%u, '%s')", character_id, Strings::Escape(message->text).c_str());
|
||||
auto results = QueryDatabase(query);
|
||||
void SharedDatabase::SaveCharacterInspectMessage(uint32 character_id, const InspectMessage_Struct* s)
|
||||
{
|
||||
auto e = CharacterInspectMessagesRepository::NewEntity();
|
||||
|
||||
e.id = character_id;
|
||||
e.inspect_message = s->text;
|
||||
|
||||
if (!CharacterInspectMessagesRepository::ReplaceOne(*this, e)) {
|
||||
LogError("Failed to save character inspect message of [{}] for character_id [{}]", s->text, character_id);
|
||||
}
|
||||
}
|
||||
|
||||
uint32 SharedDatabase::GetSpellsCount()
|
||||
@ -1938,18 +1886,7 @@ uint32 SharedDatabase::GetSpellsCount()
|
||||
|
||||
uint32 SharedDatabase::GetItemsCount()
|
||||
{
|
||||
auto results = QueryDatabase("SELECT count(*) FROM items");
|
||||
if (!results.Success() || !results.RowCount()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
auto& row = results.begin();
|
||||
|
||||
if (row[0]) {
|
||||
return Strings::ToUnsignedInt(row[0]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
return ItemsRepository::Count(*this);
|
||||
}
|
||||
|
||||
void SharedDatabase::SetSharedItemsCount(uint32 shared_items_count)
|
||||
|
||||
@ -76,21 +76,20 @@ public:
|
||||
uint8 GetGMSpeed(uint32 account_id);
|
||||
bool SetHideMe(uint32 account_id, uint8 hideme);
|
||||
int DeleteStalePlayerCorpses();
|
||||
void LoadCharacterInspectMessage(uint32 character_id, InspectMessage_Struct *message);
|
||||
void SaveCharacterInspectMessage(uint32 character_id, const InspectMessage_Struct *message);
|
||||
void LoadCharacterInspectMessage(uint32 character_id, InspectMessage_Struct* s);
|
||||
void SaveCharacterInspectMessage(uint32 character_id, const InspectMessage_Struct* s);
|
||||
bool GetCommandSettings(std::map<std::string, std::pair<uint8, std::vector<std::string>>> &command_settings);
|
||||
bool UpdateInjectedCommandSettings(const std::vector<std::pair<std::string, uint8>> &injected);
|
||||
bool UpdateOrphanedCommandSettings(const std::vector<std::string> &orphaned);
|
||||
bool GetCommandSubSettings(std::vector<CommandSubsettingsRepository::CommandSubsettings> &command_subsettings);
|
||||
uint32 GetTotalTimeEntitledOnAccount(uint32 AccountID);
|
||||
bool SetGMInvul(uint32 account_id, bool gminvul);
|
||||
bool SetGMFlymode(uint32 account_id, uint8 flymode);
|
||||
void SetMailKey(int CharID, int IPAddress, int MailKey);
|
||||
void SetMailKey(uint32 character_id, uint32 ip_address, uint32 mail_key);
|
||||
struct MailKeys {
|
||||
std::string mail_key;
|
||||
std::string mail_key_full;
|
||||
};
|
||||
MailKeys GetMailKey(int character_id);
|
||||
MailKeys GetMailKey(uint32 character_id);
|
||||
bool SaveCursor(
|
||||
uint32 char_id,
|
||||
std::list<EQ::ItemInstance *>::const_iterator &start,
|
||||
@ -104,7 +103,7 @@ public:
|
||||
bool VerifyInventory(uint32 account_id, int16 slot_id, const EQ::ItemInstance *inst);
|
||||
bool GetSharedBank(uint32 id, EQ::InventoryProfile *inv, bool is_charid);
|
||||
int32 GetSharedPlatinum(uint32 account_id);
|
||||
bool SetSharedPlatinum(uint32 account_id, int32 amount_to_add);
|
||||
bool AddSharedPlatinum(uint32 account_id, int amount);
|
||||
bool GetInventory(Client* c);
|
||||
bool GetInventory(uint32 account_id, char *name, EQ::InventoryProfile *inv); // deprecated
|
||||
std::map<uint32, uint32> GetItemRecastTimestamps(uint32 char_id);
|
||||
@ -158,7 +157,7 @@ public:
|
||||
);
|
||||
EQ::ItemInstance *CreateBaseItem(const EQ::ItemData *item, int16 charges = 0);
|
||||
|
||||
void GetItemsCount(int32 &item_count, uint32 &max_id);
|
||||
void GetItemsCount(int32& item_count, uint32& max_id);
|
||||
void LoadItems(void *data, uint32 size, int32 items, uint32 max_item_id);
|
||||
bool LoadItems(const std::string &prefix);
|
||||
const EQ::ItemData *IterateItems(uint32 *id) const;
|
||||
@ -173,7 +172,7 @@ public:
|
||||
int GetMaxSpellID();
|
||||
bool LoadSpells(const std::string &prefix, int32 *records, const SPDat_Spell_Struct **sp);
|
||||
void LoadSpells(void *data, int max_spells);
|
||||
void LoadDamageShieldTypes(SPDat_Spell_Struct *sp, int32 iMaxSpellID);
|
||||
void LoadDamageShieldTypes(SPDat_Spell_Struct* s);
|
||||
uint32 GetSharedSpellsCount() { return m_shared_spells_count; }
|
||||
uint32 GetSpellsCount();
|
||||
|
||||
|
||||
830
common/spdat.cpp
830
common/spdat.cpp
File diff suppressed because it is too large
Load Diff
1061
common/spdat.h
1061
common/spdat.h
File diff suppressed because it is too large
Load Diff
@ -25,7 +25,7 @@
|
||||
|
||||
// Build variables
|
||||
// these get injected during the build pipeline
|
||||
#define CURRENT_VERSION "23.9.1-dev" // always append -dev to the current version for custom-builds
|
||||
#define CURRENT_VERSION "23.10.3-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 9327
|
||||
#define CURRENT_BINARY_DATABASE_VERSION 9328
|
||||
#define CURRENT_BINARY_BOTS_DATABASE_VERSION 9054
|
||||
#define CUSTOM_BINARY_DATABASE_VERSION 0
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "eqemu-server",
|
||||
"version": "23.9.1",
|
||||
"version": "23.10.3",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/EQEmu/Server.git"
|
||||
|
||||
@ -985,7 +985,7 @@ bool Client::HandleEnterWorldPacket(const EQApplicationPacket *app) {
|
||||
safe_delete(outapp);
|
||||
|
||||
// set mailkey - used for duration of character session
|
||||
int mail_key = EQ::Random::Instance()->Int(1, INT_MAX);
|
||||
uint32 mail_key = EQ::Random::Instance()->Int(1, INT_MAX);
|
||||
|
||||
database.SetMailKey(charid, GetIP(), mail_key);
|
||||
if (UCSServerAvailable_) {
|
||||
@ -2076,10 +2076,10 @@ bool CheckCharCreateInfoTitanium(CharCreate_Struct *cc)
|
||||
classtemp = cc->class_ - 1;
|
||||
racetemp = cc->race - 1;
|
||||
// these have non sequential race numbers so they need to be mapped
|
||||
if (cc->race == FROGLOK) racetemp = 14;
|
||||
if (cc->race == VAHSHIR) racetemp = 13;
|
||||
if (cc->race == IKSAR) racetemp = 12;
|
||||
if (cc->race == DRAKKIN) racetemp = 15;
|
||||
if (cc->race == Race::Froglok2) racetemp = 14;
|
||||
if (cc->race == Race::VahShir) racetemp = 13;
|
||||
if (cc->race == Race::Iksar) racetemp = 12;
|
||||
if (cc->race == Race::Drakkin) racetemp = 15;
|
||||
|
||||
// if out of range looking it up in the table would crash stuff
|
||||
// so we return from these
|
||||
@ -2186,43 +2186,43 @@ void Client::SetRaceStartingSkills( PlayerProfile_Struct *pp )
|
||||
{
|
||||
switch( pp->race )
|
||||
{
|
||||
case BARBARIAN:
|
||||
case DWARF:
|
||||
case ERUDITE:
|
||||
case HALF_ELF:
|
||||
case HIGH_ELF:
|
||||
case HUMAN:
|
||||
case OGRE:
|
||||
case TROLL:
|
||||
case DRAKKIN: //Drakkin are supposed to get a starting AA Skill
|
||||
case Race::Barbarian:
|
||||
case Race::Dwarf:
|
||||
case Race::Erudite:
|
||||
case Race::HalfElf:
|
||||
case Race::HighElf:
|
||||
case Race::Human:
|
||||
case Race::Ogre:
|
||||
case Race::Troll:
|
||||
case Race::Drakkin: //Drakkin are supposed to get a starting AA Skill
|
||||
{
|
||||
// No Race Specific Skills
|
||||
break;
|
||||
}
|
||||
case DARK_ELF:
|
||||
case Race::DarkElf:
|
||||
{
|
||||
pp->skills[EQ::skills::SkillHide] = 50;
|
||||
break;
|
||||
}
|
||||
case FROGLOK:
|
||||
case Race::Froglok2:
|
||||
{
|
||||
if (RuleI(Skills, SwimmingStartValue) < 125) {
|
||||
pp->skills[EQ::skills::SkillSwimming] = 125;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case GNOME:
|
||||
case Race::Gnome:
|
||||
{
|
||||
pp->skills[EQ::skills::SkillTinkering] = 50;
|
||||
break;
|
||||
}
|
||||
case HALFLING:
|
||||
case Race::Halfling:
|
||||
{
|
||||
pp->skills[EQ::skills::SkillHide] = 50;
|
||||
pp->skills[EQ::skills::SkillSneak] = 50;
|
||||
break;
|
||||
}
|
||||
case IKSAR:
|
||||
case Race::Iksar:
|
||||
{
|
||||
pp->skills[EQ::skills::SkillForage] = 50;
|
||||
if (RuleI(Skills, SwimmingStartValue) < 100) {
|
||||
@ -2230,13 +2230,13 @@ void Client::SetRaceStartingSkills( PlayerProfile_Struct *pp )
|
||||
}
|
||||
break;
|
||||
}
|
||||
case WOOD_ELF:
|
||||
case Race::WoodElf:
|
||||
{
|
||||
pp->skills[EQ::skills::SkillForage] = 50;
|
||||
pp->skills[EQ::skills::SkillHide] = 50;
|
||||
break;
|
||||
}
|
||||
case VAHSHIR:
|
||||
case Race::VahShir:
|
||||
{
|
||||
pp->skills[EQ::skills::SkillSafeFall] = 50;
|
||||
pp->skills[EQ::skills::SkillSneak] = 50;
|
||||
|
||||
@ -281,62 +281,107 @@ ClientListEntry* ClientList::FindCLEByCharacterID(uint32 iCharID) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void ClientList::SendCLEList(const int16& admin, const char* to, WorldTCPConnection* connection, const char* iName) {
|
||||
void ClientList::SendCLEList(const int16& admin, const char* to, WorldTCPConnection* connection, const char* search_criteria)
|
||||
{
|
||||
LinkedListIterator<ClientListEntry*> iterator(clientlist);
|
||||
int x = 0, y = 0;
|
||||
int namestrlen = iName == 0 ? 0 : strlen(iName);
|
||||
bool addnewline = false;
|
||||
char newline[3];
|
||||
if (connection->IsConsole())
|
||||
strcpy(newline, "\r\n");
|
||||
else
|
||||
strcpy(newline, "^");
|
||||
|
||||
auto out = fmt::memory_buffer();
|
||||
int found_count = 0;
|
||||
int total_count = 0;
|
||||
int name_length = search_criteria ? strlen(search_criteria) : 0;
|
||||
|
||||
const char* new_line = connection->IsConsole() ? "\r\n" : "^";
|
||||
bool add_new_line = false;
|
||||
|
||||
std::string message;
|
||||
|
||||
iterator.Reset();
|
||||
while(iterator.MoreElements()) {
|
||||
|
||||
while (iterator.MoreElements()) {
|
||||
ClientListEntry* cle = iterator.GetData();
|
||||
if (admin >= cle->Admin() && (iName == 0 || namestrlen == 0 || strncasecmp(cle->name(), iName, namestrlen) == 0 || strncasecmp(cle->AccountName(), iName, namestrlen) == 0 || strncasecmp(cle->LSName(), iName, namestrlen) == 0)) {
|
||||
struct in_addr in;
|
||||
in.s_addr = cle->GetIP();
|
||||
if (addnewline) {
|
||||
fmt::format_to(std::back_inserter(out), fmt::runtime(newline));
|
||||
|
||||
struct in_addr in;
|
||||
in.s_addr = cle->GetIP();
|
||||
|
||||
if (
|
||||
admin >= cle->Admin() &&
|
||||
(
|
||||
!search_criteria ||
|
||||
Strings::Contains(std::string(inet_ntoa(in)), search_criteria) ||
|
||||
Strings::Contains(cle->name(), search_criteria) == 0 ||
|
||||
Strings::Contains(cle->AccountName(), search_criteria) == 0 ||
|
||||
Strings::Contains(cle->LSName(), search_criteria) == 0
|
||||
)
|
||||
) {
|
||||
if (add_new_line) {
|
||||
message += new_line;
|
||||
}
|
||||
fmt::format_to(std::back_inserter(out), "ID: {} Acc# {} AccName: {} IP: {}", cle->GetID(), cle->AccountID(), cle->AccountName(), inet_ntoa(in));
|
||||
fmt::format_to(std::back_inserter(out), "{} Stale: {} Online: {} Admin: {}", newline, cle->GetStaleCounter(), static_cast<int>(cle->Online()), cle->Admin());
|
||||
if (cle->LSID())
|
||||
fmt::format_to(std::back_inserter(out), "{} LSID: {} LSName: {} WorldAdmin: {}", newline, cle->LSID(), cle->LSName(), cle->WorldAdmin());
|
||||
if (cle->CharID())
|
||||
fmt::format_to(std::back_inserter(out), "{} CharID: {} CharName: {} Zone: {} ({})", newline, cle->CharID(), cle->name(), ZoneName(cle->zone()), cle->zone());
|
||||
if (out.size() >= 3072) {
|
||||
|
||||
message += fmt::format(
|
||||
"Account: {} ({}) | IP: {} | Admin: {}",
|
||||
cle->AccountName(),
|
||||
cle->AccountID(),
|
||||
inet_ntoa(in),
|
||||
cle->Admin()
|
||||
);
|
||||
|
||||
if (cle->CharID()) {
|
||||
message += fmt::format(
|
||||
"{}Character: {} ({}) | Zone: {} ({})",
|
||||
new_line,
|
||||
cle->name(),
|
||||
cle->CharID(),
|
||||
ZoneLongName(cle->zone()),
|
||||
cle->zone()
|
||||
);
|
||||
}
|
||||
|
||||
if (message.size() >= 3072) {
|
||||
connection->SendEmoteMessageRaw(
|
||||
to,
|
||||
0,
|
||||
AccountStatus::Player,
|
||||
Chat::NPCQuestSay,
|
||||
out.data()
|
||||
message.c_str()
|
||||
);
|
||||
addnewline = false;
|
||||
out.clear();
|
||||
message.clear();
|
||||
add_new_line = false;
|
||||
} else {
|
||||
addnewline = true;
|
||||
add_new_line = true;
|
||||
}
|
||||
y++;
|
||||
|
||||
found_count++;
|
||||
}
|
||||
|
||||
iterator.Advance();
|
||||
x++;
|
||||
total_count++;
|
||||
}
|
||||
fmt::format_to(std::back_inserter(out), "{}{} CLEs in memory. {} CLEs listed. numplayers = {}.", newline, x, y, numplayers);
|
||||
|
||||
message += fmt::format(
|
||||
"{}{}Player Count: {}",
|
||||
new_line,
|
||||
(
|
||||
found_count != total_count ?
|
||||
fmt::format(
|
||||
"Total: {} CLE{} | Found: {} CLE{} | ",
|
||||
total_count,
|
||||
(total_count != 1 ? "s" : ""),
|
||||
found_count,
|
||||
(found_count != 1 ? "s" : "")
|
||||
) :
|
||||
""
|
||||
),
|
||||
numplayers
|
||||
);
|
||||
|
||||
connection->SendEmoteMessageRaw(
|
||||
to,
|
||||
0,
|
||||
AccountStatus::Player,
|
||||
Chat::NPCQuestSay,
|
||||
out.data()
|
||||
message.c_str()
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
void ClientList::CLEAdd(
|
||||
uint32 login_server_id,
|
||||
const char *login_server_name,
|
||||
@ -598,7 +643,7 @@ void ClientList::SendWhoAll(uint32 fromid,const char* to, int16 admin, Who_All_S
|
||||
whomlen = strlen(whom->whom);
|
||||
|
||||
if (whom->wrace == 0x001A) { // 0x001A is the old Froglok race number and is sent by the client for /who all froglok
|
||||
whom->wrace = FROGLOK; // This is what EQEmu uses for the Froglok Race number.
|
||||
whom->wrace = Race::Froglok2; // This is what EQEmu uses for the Froglok Race number.
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -45,7 +45,7 @@ public:
|
||||
void SendClientVersionSummary(const char *Name);
|
||||
void SendLFGMatches(ServerLFGMatchesRequest_Struct *LFGMatchesRequest);
|
||||
void ConsoleSendWhoAll(const char* to, int16 admin, Who_All_Struct* whom, WorldTCPConnection* connection);
|
||||
void SendCLEList(const int16& admin, const char* to, WorldTCPConnection* connection, const char* iName = 0);
|
||||
void SendCLEList(const int16& admin, const char* to, WorldTCPConnection* connection, const char* search_criteria = 0);
|
||||
|
||||
bool SendPacket(const char* to, ServerPacket* pack);
|
||||
|
||||
|
||||
22
zone/aa.cpp
22
zone/aa.cpp
@ -82,7 +82,7 @@ void Mob::TemporaryPets(uint16 spell_id, Mob *targ, const char *name_override, u
|
||||
|
||||
for (int x = 0; x < MAX_SWARM_PETS; x++)
|
||||
{
|
||||
if (spells[spell_id].effect_id[x] == SE_TemporaryPets)
|
||||
if (spells[spell_id].effect_id[x] == SpellEffect::TemporaryPets)
|
||||
{
|
||||
pet.count = spells[spell_id].base_value[x];
|
||||
pet.duration = spells[spell_id].max_value[x];
|
||||
@ -1376,7 +1376,7 @@ int Mob::GetAlternateAdvancementCooldownReduction(AA::Rank *rank_in) {
|
||||
}
|
||||
|
||||
for(auto &effect : rank->effects) {
|
||||
if(effect.effect_id == SE_HastenedAASkill && effect.limit_value == ability_in->id) {
|
||||
if(effect.effect_id == SpellEffect::HastenedAASkill && effect.limit_value == ability_in->id) {
|
||||
total_reduction += effect.base_value;
|
||||
}
|
||||
}
|
||||
@ -1619,7 +1619,7 @@ bool Mob::CanUseAlternateAdvancementRank(AA::Rank *rank)
|
||||
|
||||
auto race = GetPlayerRaceValue(GetBaseRace());
|
||||
|
||||
race = race > PLAYER_RACE_COUNT ? Race::Human : race;
|
||||
race = race > RaceIndex::Drakkin ? Race::Human : race;
|
||||
|
||||
if (!(a->races & (1 << (race - 1)))) {
|
||||
return false;
|
||||
@ -1949,7 +1949,7 @@ void Client::TogglePassiveAlternativeAdvancement(const AA::Rank &rank, uint32 ab
|
||||
|
||||
Instructions for how to make the AA - assuming a basic level of knowledge of how AA's work.
|
||||
- aa_abilities table : Create new ability with a hotkey, type 3, zero charges
|
||||
- aa_ranks table : [Disabled rank] First rank, should have a cost > 0 (this is what you buy), Set hotkeys, MUST SET A SPELL CONTAINING EFFECT SE_Buy_AA_Rank(SPA 472), set a short recast timer.
|
||||
- aa_ranks table : [Disabled rank] First rank, should have a cost > 0 (this is what you buy), Set hotkeys, MUST SET A SPELL CONTAINING EFFECT SpellEffect::Buy_AA_Rank(SPA 472), set a short recast timer.
|
||||
[Enabled rank] Second rank, should have a cost = 0, Set hotkeys, Set any valid spell ID you want (it has to exist but does nothing), set a short recast timer.
|
||||
*Recommend if doing custom, just make the hotkey titled 'Toggle <Ability Name>' and use for both.
|
||||
|
||||
@ -1969,7 +1969,7 @@ void Client::TogglePassiveAlternativeAdvancement(const AA::Rank &rank, uint32 ab
|
||||
|
||||
*/
|
||||
|
||||
bool enable_next_rank = IsEffectInSpell(rank.spell, SE_Buy_AA_Rank);
|
||||
bool enable_next_rank = IsEffectInSpell(rank.spell, SpellEffect::Buy_AA_Rank);
|
||||
|
||||
if (enable_next_rank) {
|
||||
|
||||
@ -1980,7 +1980,7 @@ void Client::TogglePassiveAlternativeAdvancement(const AA::Rank &rank, uint32 ab
|
||||
AA::Rank *rank_next = zone->GetAlternateAdvancementRank(rank.next_id);
|
||||
|
||||
//Add checks for any special cases for toggle.
|
||||
if (rank_next && IsEffectinAlternateAdvancementRankEffects(*rank_next, SE_Weapon_Stance)) {
|
||||
if (rank_next && IsEffectinAlternateAdvancementRankEffects(*rank_next, SpellEffect::Weapon_Stance)) {
|
||||
weaponstance.aabonus_enabled = true;
|
||||
ApplyWeaponsStance();
|
||||
}
|
||||
@ -1994,7 +1994,7 @@ void Client::TogglePassiveAlternativeAdvancement(const AA::Rank &rank, uint32 ab
|
||||
Message(Chat::Spells, "You disable an ability."); //Message live gives you. Should come from spell.
|
||||
|
||||
//Add checks for any special cases for toggle.
|
||||
if (IsEffectinAlternateAdvancementRankEffects(rank, SE_Weapon_Stance)) {
|
||||
if (IsEffectinAlternateAdvancementRankEffects(rank, SpellEffect::Weapon_Stance)) {
|
||||
weaponstance.aabonus_enabled = false;
|
||||
BuffFadeBySpellID(weaponstance.aabonus_buff_spell_id);
|
||||
}
|
||||
@ -2005,8 +2005,8 @@ void Client::TogglePassiveAlternativeAdvancement(const AA::Rank &rank, uint32 ab
|
||||
bool Client::UseTogglePassiveHotkey(const AA::Rank &rank) {
|
||||
|
||||
/*
|
||||
Disabled rank needs a rank spell containing the SE_Buy_AA_Rank effect to return true.
|
||||
Enabled rank checks to see if the prior rank contains a rank spell with SE_Buy_AA_Rank, if so true.
|
||||
Disabled rank needs a rank spell containing the SpellEffect::Buy_AA_Rank effect to return true.
|
||||
Enabled rank checks to see if the prior rank contains a rank spell with SpellEffect::Buy_AA_Rank, if so true.
|
||||
|
||||
Note: On live the enabled rank is Expendable with Charge 1.
|
||||
|
||||
@ -2014,13 +2014,13 @@ bool Client::UseTogglePassiveHotkey(const AA::Rank &rank) {
|
||||
*/
|
||||
|
||||
|
||||
if (IsEffectInSpell(rank.spell, SE_Buy_AA_Rank)) {//Checked when is Disabled.
|
||||
if (IsEffectInSpell(rank.spell, SpellEffect::Buy_AA_Rank)) {//Checked when is Disabled.
|
||||
return true;
|
||||
}
|
||||
else if (rank.prev_id != -1) {//Check when effect is Enabled.
|
||||
AA::Rank *rank_prev = zone->GetAlternateAdvancementRank(rank.prev_id);
|
||||
|
||||
if (rank_prev && IsEffectInSpell(rank_prev->spell, SE_Buy_AA_Rank)) {
|
||||
if (rank_prev && IsEffectInSpell(rank_prev->spell, SpellEffect::Buy_AA_Rank)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
134
zone/aggro.cpp
134
zone/aggro.cpp
@ -1377,132 +1377,132 @@ int32 Mob::CheckAggroAmount(uint16 spell_id, Mob *target, bool is_proc)
|
||||
|
||||
for (int o = 0; o < EFFECT_COUNT; o++) {
|
||||
switch (spells[spell_id].effect_id[o]) {
|
||||
case SE_CurrentHPOnce:
|
||||
case SE_CurrentHP: {
|
||||
case SpellEffect::CurrentHPOnce:
|
||||
case SpellEffect::CurrentHP: {
|
||||
int64 val = CalcSpellEffectValue_formula(spells[spell_id].formula[o], spells[spell_id].base_value[o], spells[spell_id].max_value[o], mob_level, spell_id);
|
||||
if(val < 0) {
|
||||
aggro_amount -= val;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SE_MovementSpeed: {
|
||||
case SpellEffect::MovementSpeed: {
|
||||
int64 val = CalcSpellEffectValue_formula(spells[spell_id].formula[o], spells[spell_id].base_value[o], spells[spell_id].max_value[o], mob_level, spell_id);
|
||||
if (val < 0) {
|
||||
aggro_amount += default_aggro;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SE_AttackSpeed:
|
||||
case SE_AttackSpeed2:
|
||||
case SE_AttackSpeed3: {
|
||||
case SpellEffect::AttackSpeed:
|
||||
case SpellEffect::AttackSpeed2:
|
||||
case SpellEffect::AttackSpeed3: {
|
||||
int64 val = CalcSpellEffectValue_formula(spells[spell_id].formula[o], spells[spell_id].base_value[o], spells[spell_id].max_value[o], mob_level, spell_id);
|
||||
if (val < 100) {
|
||||
aggro_amount += default_aggro;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SE_Stun:
|
||||
case SE_Blind:
|
||||
case SE_Mez:
|
||||
case SE_Charm:
|
||||
case SE_Fear:
|
||||
case SE_Fearstun:
|
||||
case SpellEffect::Stun:
|
||||
case SpellEffect::Blind:
|
||||
case SpellEffect::Mez:
|
||||
case SpellEffect::Charm:
|
||||
case SpellEffect::Fear:
|
||||
case SpellEffect::Fearstun:
|
||||
aggro_amount += default_aggro;
|
||||
break;
|
||||
case SE_Root:
|
||||
case SpellEffect::Root:
|
||||
aggro_amount += 10;
|
||||
break;
|
||||
case SE_ACv2:
|
||||
case SE_ArmorClass: {
|
||||
case SpellEffect::ACv2:
|
||||
case SpellEffect::ArmorClass: {
|
||||
int64 val = CalcSpellEffectValue_formula(spells[spell_id].formula[o], spells[spell_id].base_value[o], spells[spell_id].max_value[o], mob_level, spell_id);
|
||||
if (val < 0) {
|
||||
aggro_amount += default_aggro;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SE_ATK:
|
||||
case SE_ResistMagic:
|
||||
case SE_ResistFire:
|
||||
case SE_ResistCold:
|
||||
case SE_ResistPoison:
|
||||
case SE_ResistDisease:
|
||||
case SE_STR:
|
||||
case SE_STA:
|
||||
case SE_DEX:
|
||||
case SE_AGI:
|
||||
case SE_INT:
|
||||
case SE_WIS:
|
||||
case SE_CHA: {
|
||||
case SpellEffect::ATK:
|
||||
case SpellEffect::ResistMagic:
|
||||
case SpellEffect::ResistFire:
|
||||
case SpellEffect::ResistCold:
|
||||
case SpellEffect::ResistPoison:
|
||||
case SpellEffect::ResistDisease:
|
||||
case SpellEffect::STR:
|
||||
case SpellEffect::STA:
|
||||
case SpellEffect::DEX:
|
||||
case SpellEffect::AGI:
|
||||
case SpellEffect::INT:
|
||||
case SpellEffect::WIS:
|
||||
case SpellEffect::CHA: {
|
||||
int64 val = CalcSpellEffectValue_formula(spells[spell_id].formula[o], spells[spell_id].base_value[o], spells[spell_id].max_value[o], mob_level, spell_id);
|
||||
if (val < 0) {
|
||||
aggro_amount += 10;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SE_ResistAll: {
|
||||
case SpellEffect::ResistAll: {
|
||||
int64 val = CalcSpellEffectValue_formula(spells[spell_id].formula[o], spells[spell_id].base_value[o], spells[spell_id].max_value[o], mob_level, spell_id);
|
||||
if (val < 0) {
|
||||
aggro_amount += 50;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SE_AllStats: {
|
||||
case SpellEffect::AllStats: {
|
||||
int64 val = CalcSpellEffectValue_formula(spells[spell_id].formula[o], spells[spell_id].base_value[o], spells[spell_id].max_value[o], mob_level, spell_id);
|
||||
if (val < 0) {
|
||||
aggro_amount += 70;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SE_BardAEDot:
|
||||
case SpellEffect::BardAEDot:
|
||||
aggro_amount += 10;
|
||||
break;
|
||||
case SE_SpinTarget:
|
||||
case SE_Amnesia:
|
||||
case SE_Silence:
|
||||
case SE_Destroy:
|
||||
case SpellEffect::SpinTarget:
|
||||
case SpellEffect::Amnesia:
|
||||
case SpellEffect::Silence:
|
||||
case SpellEffect::Destroy:
|
||||
aggro_amount += default_aggro;
|
||||
break;
|
||||
// unsure -- leave them this for now
|
||||
case SE_Harmony:
|
||||
case SE_CastingLevel:
|
||||
case SE_MeleeMitigation:
|
||||
case SE_CriticalHitChance:
|
||||
case SE_AvoidMeleeChance:
|
||||
case SE_RiposteChance:
|
||||
case SE_DodgeChance:
|
||||
case SE_ParryChance:
|
||||
case SE_DualWieldChance:
|
||||
case SE_DoubleAttackChance:
|
||||
case SE_MeleeSkillCheck:
|
||||
case SE_HitChance:
|
||||
case SE_DamageModifier:
|
||||
case SE_MinDamageModifier:
|
||||
case SE_IncreaseBlockChance:
|
||||
case SE_Accuracy:
|
||||
case SE_DamageShield:
|
||||
case SE_SpellDamageShield:
|
||||
case SE_ReverseDS: {
|
||||
case SpellEffect::Harmony:
|
||||
case SpellEffect::CastingLevel:
|
||||
case SpellEffect::MeleeMitigation:
|
||||
case SpellEffect::CriticalHitChance:
|
||||
case SpellEffect::AvoidMeleeChance:
|
||||
case SpellEffect::RiposteChance:
|
||||
case SpellEffect::DodgeChance:
|
||||
case SpellEffect::ParryChance:
|
||||
case SpellEffect::DualWieldChance:
|
||||
case SpellEffect::DoubleAttackChance:
|
||||
case SpellEffect::MeleeSkillCheck:
|
||||
case SpellEffect::HitChance:
|
||||
case SpellEffect::DamageModifier:
|
||||
case SpellEffect::MinDamageModifier:
|
||||
case SpellEffect::IncreaseBlockChance:
|
||||
case SpellEffect::Accuracy:
|
||||
case SpellEffect::DamageShield:
|
||||
case SpellEffect::SpellDamageShield:
|
||||
case SpellEffect::ReverseDS: {
|
||||
aggro_amount += mob_level * 2;
|
||||
break;
|
||||
}
|
||||
// unsure -- leave them this for now
|
||||
case SE_CurrentMana:
|
||||
case SE_ManaRegen_v2:
|
||||
case SE_ManaPool:
|
||||
case SE_CurrentEndurance: {
|
||||
case SpellEffect::CurrentMana:
|
||||
case SpellEffect::ManaRegen_v2:
|
||||
case SpellEffect::ManaPool:
|
||||
case SpellEffect::CurrentEndurance: {
|
||||
int64 val = CalcSpellEffectValue_formula(spells[spell_id].formula[o], spells[spell_id].base_value[o], spells[spell_id].max_value[o], mob_level, spell_id);
|
||||
if (val < 0) {
|
||||
aggro_amount -= val * 2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SE_CancelMagic:
|
||||
case SE_DispelDetrimental:
|
||||
case SE_DispelBeneficial:
|
||||
case SpellEffect::CancelMagic:
|
||||
case SpellEffect::DispelDetrimental:
|
||||
case SpellEffect::DispelBeneficial:
|
||||
dispel = true;
|
||||
break;
|
||||
case SE_ReduceHate:
|
||||
case SE_InstantHate:
|
||||
case SpellEffect::ReduceHate:
|
||||
case SpellEffect::InstantHate:
|
||||
non_modified_aggro = CalcSpellEffectValue_formula(spells[spell_id].formula[o], spells[spell_id].base_value[o], spells[spell_id].max_value[o], mob_level, spell_id);
|
||||
break;
|
||||
}
|
||||
@ -1549,8 +1549,8 @@ int32 Mob::CheckHealAggroAmount(uint16 spell_id, Mob *target, uint32 heal_possib
|
||||
|
||||
for (int o = 0; o < EFFECT_COUNT; o++) {
|
||||
switch (spells[spell_id].effect_id[o]) {
|
||||
case SE_CurrentHP:
|
||||
case SE_PercentalHeal:
|
||||
case SpellEffect::CurrentHP:
|
||||
case SpellEffect::PercentalHeal:
|
||||
{
|
||||
if (heal_possible == 0) {
|
||||
AggroAmount += 1;
|
||||
@ -1572,12 +1572,12 @@ int32 Mob::CheckHealAggroAmount(uint16 spell_id, Mob *target, uint32 heal_possib
|
||||
AggroAmount += std::max(val, (int64)1);
|
||||
break;
|
||||
}
|
||||
case SE_Rune:
|
||||
case SpellEffect::Rune:
|
||||
AggroAmount += CalcSpellEffectValue_formula(spells[spell_id].formula[o],
|
||||
spells[spell_id].base_value[o], spells[spell_id].max_value[o], GetLevel(), spell_id) * 2;
|
||||
ignore_default_buff = true;
|
||||
break;
|
||||
case SE_HealOverTime:
|
||||
case SpellEffect::HealOverTime:
|
||||
AggroAmount += 10;
|
||||
ignore_default_buff = true;
|
||||
break;
|
||||
|
||||
@ -179,7 +179,7 @@ int Mob::compute_tohit(EQ::skills::SkillType skillinuse)
|
||||
//SYNC WITH: tune.cpp, mob.h TuneGetTotalToHit
|
||||
int Mob::GetTotalToHit(EQ::skills::SkillType skill, int chance_mod)
|
||||
{
|
||||
if (chance_mod >= 10000) // override for stuff like SE_SkillAttack
|
||||
if (chance_mod >= 10000) // override for stuff like SpellEffect::SkillAttack
|
||||
return -1;
|
||||
|
||||
// calculate attacker's accuracy
|
||||
@ -209,7 +209,7 @@ int Mob::GetTotalToHit(EQ::skills::SkillType skill, int chance_mod)
|
||||
if (atkhit_bonus)
|
||||
accuracy += round(static_cast<double>(accuracy) * static_cast<double>(atkhit_bonus) * 0.0001);
|
||||
|
||||
// 216 Melee Accuracy Amt aka SE_Accuracy -- flat bonus
|
||||
// 216 Melee Accuracy Amt aka SpellEffect::Accuracy -- flat bonus
|
||||
accuracy += itembonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1] +
|
||||
aabonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1] +
|
||||
spellbonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1] +
|
||||
@ -224,7 +224,7 @@ int Mob::GetTotalToHit(EQ::skills::SkillType skill, int chance_mod)
|
||||
if (spellbonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] >= 10000)
|
||||
return -1;
|
||||
|
||||
// 184 Accuracy % aka SE_HitChance -- percentage increase
|
||||
// 184 Accuracy % aka SpellEffect::HitChance -- percentage increase
|
||||
auto hit_bonus = itembonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] +
|
||||
aabonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] +
|
||||
spellbonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] +
|
||||
@ -285,7 +285,7 @@ int Mob::compute_defense()
|
||||
}
|
||||
|
||||
|
||||
//516 SE_AC_Mitigation_Max_Percent
|
||||
//516 SpellEffect::AC_Mitigation_Max_Percent
|
||||
auto ac_bonus = itembonuses.AC_Mitigation_Max_Percent + aabonuses.AC_Mitigation_Max_Percent + spellbonuses.AC_Mitigation_Max_Percent;
|
||||
if (ac_bonus) {
|
||||
defense += round(static_cast<double>(defense) * static_cast<double>(ac_bonus) * 0.0001);
|
||||
@ -315,15 +315,15 @@ int Mob::GetTotalDefense()
|
||||
if (evasion_bonus >= 10000)
|
||||
return -1;
|
||||
|
||||
// 515 SE_AC_Avoidance_Max_Percent
|
||||
// 515 SpellEffect::AC_Avoidance_Max_Percent
|
||||
auto ac_aviodance_bonus = itembonuses.AC_Avoidance_Max_Percent + aabonuses.AC_Avoidance_Max_Percent + spellbonuses.AC_Avoidance_Max_Percent;
|
||||
if (ac_aviodance_bonus)
|
||||
avoidance += round(static_cast<double>(avoidance) * static_cast<double>(ac_aviodance_bonus) * 0.0001);
|
||||
|
||||
// 172 Evasion aka SE_AvoidMeleeChance
|
||||
// 172 Evasion aka SpellEffect::AvoidMeleeChance
|
||||
evasion_bonus += itembonuses.AvoidMeleeChanceEffect + aabonuses.AvoidMeleeChanceEffect; // item bonus here isn't mod2 avoidance
|
||||
|
||||
// 215 Pet Avoidance % aka SE_PetAvoidance
|
||||
// 215 Pet Avoidance % aka SpellEffect::PetAvoidance
|
||||
evasion_bonus += GetPetAvoidanceBonusFromOwner();
|
||||
|
||||
// Evasion is a percentage bonus according to AA descriptions
|
||||
@ -896,7 +896,7 @@ int Mob::GetClassRaceACBonus()
|
||||
ac_bonus = 16;
|
||||
}
|
||||
|
||||
if (GetRace() == IKSAR)
|
||||
if (GetRace() == Race::Iksar)
|
||||
ac_bonus += EQ::Clamp(static_cast<int>(level), 10, 35);
|
||||
|
||||
return ac_bonus;
|
||||
@ -1917,7 +1917,7 @@ bool Client::Death(Mob* killer_mob, int64 damage, uint16 spell, EQ::skills::Skil
|
||||
dead = true;
|
||||
|
||||
if (m_pet && m_pet->IsCharmed()) {
|
||||
m_pet->BuffFadeByEffect(SE_Charm);
|
||||
m_pet->BuffFadeByEffect(SpellEffect::Charm);
|
||||
}
|
||||
|
||||
if (GetMerc()) {
|
||||
@ -3545,7 +3545,7 @@ int Mob::GetHandToHandDelay(void)
|
||||
int iksar = 0;
|
||||
if (IsClient() && CastToClient()->GetItemIDAt(12) == 10652 && GetLevel() > 46)
|
||||
epic = 280;
|
||||
else if (GetRace() == IKSAR)
|
||||
else if (GetRace() == Race::Iksar)
|
||||
iksar = 1;
|
||||
// the delay bonus from the monk epic scales up to a skill of 280
|
||||
if (epic >= skill)
|
||||
@ -3586,8 +3586,8 @@ int Mob::GetHandToHandDelay(void)
|
||||
return 16;
|
||||
int level = GetLevel();
|
||||
if (level > 62)
|
||||
return GetRace() == IKSAR ? 21 : 20;
|
||||
return GetRace() == IKSAR ? mnk_iks_delay[level] : mnk_hum_delay[level];
|
||||
return GetRace() == Race::Iksar ? 21 : 20;
|
||||
return GetRace() == Race::Iksar ? mnk_iks_delay[level] : mnk_hum_delay[level];
|
||||
}
|
||||
else if (GetClass() == Class::Beastlord) {
|
||||
int level = GetLevel();
|
||||
@ -3678,7 +3678,7 @@ int64 Mob::ReduceDamage(int64 damage)
|
||||
return DMG_RUNE;
|
||||
|
||||
if (spellbonuses.MeleeRune[SBIndex::RUNE_AMOUNT] && spellbonuses.MeleeRune[SBIndex::RUNE_BUFFSLOT] >= 0)
|
||||
damage = RuneAbsorb(damage, SE_Rune);
|
||||
damage = RuneAbsorb(damage, SpellEffect::Rune);
|
||||
|
||||
if (damage < 1)
|
||||
return DMG_RUNE;
|
||||
@ -3805,10 +3805,10 @@ int64 Mob::AffectMagicalDamage(int64 damage, uint16 spell_id, const bool iBuffTi
|
||||
|
||||
//Regular runes absorb spell damage (except dots) - Confirmed on live.
|
||||
if (spellbonuses.MeleeRune[SBIndex::RUNE_AMOUNT] && spellbonuses.MeleeRune[SBIndex::RUNE_BUFFSLOT] >= 0)
|
||||
damage = RuneAbsorb(damage, SE_Rune);
|
||||
damage = RuneAbsorb(damage, SpellEffect::Rune);
|
||||
|
||||
if (spellbonuses.AbsorbMagicAtt[SBIndex::RUNE_AMOUNT] && spellbonuses.AbsorbMagicAtt[SBIndex::RUNE_BUFFSLOT] >= 0)
|
||||
damage = RuneAbsorb(damage, SE_AbsorbMagicAtt);
|
||||
damage = RuneAbsorb(damage, SpellEffect::AbsorbMagicAtt);
|
||||
|
||||
if (damage < 1)
|
||||
return 0;
|
||||
@ -4174,7 +4174,7 @@ void Mob::CommonDamage(Mob* attacker, int64 &damage, const uint16 spell_id, cons
|
||||
damage = ReduceDamage(damage);
|
||||
LogCombat("Melee Damage reduced to [{}]", damage);
|
||||
damage = ReduceAllDamage(damage);
|
||||
TryTriggerThreshHold(damage, SE_TriggerMeleeThreshold, attacker);
|
||||
TryTriggerThreshHold(damage, SpellEffect::TriggerMeleeThreshold, attacker);
|
||||
|
||||
CheckNumHitsRemaining(NumHit::IncomingHitSuccess);
|
||||
}
|
||||
@ -4199,7 +4199,7 @@ void Mob::CommonDamage(Mob* attacker, int64 &damage, const uint16 spell_id, cons
|
||||
Message(263, "%s tries to cast on YOU, but YOUR magical skin absorbs the spell.", attacker->GetCleanName());
|
||||
}
|
||||
damage = ReduceAllDamage(damage);
|
||||
TryTriggerThreshHold(damage, SE_TriggerSpellThreshold, attacker);
|
||||
TryTriggerThreshHold(damage, SpellEffect::TriggerSpellThreshold, attacker);
|
||||
}
|
||||
|
||||
if (IsClient() && CastToClient()->sneaking) {
|
||||
@ -4314,7 +4314,7 @@ void Mob::CommonDamage(Mob* attacker, int64 &damage, const uint16 spell_id, cons
|
||||
GetCleanName(), /* Message1 */
|
||||
attacker->GetCleanName() /* Message2 */
|
||||
);
|
||||
BuffFadeByEffect(SE_Mez);
|
||||
BuffFadeByEffect(SpellEffect::Mez);
|
||||
}
|
||||
|
||||
// broken up for readability
|
||||
@ -4399,12 +4399,12 @@ void Mob::CommonDamage(Mob* attacker, int64 &damage, const uint16 spell_id, cons
|
||||
int bashsave_roll = zone->random.Int(0, 100);
|
||||
if (bashsave_roll > 98 || bashsave_roll > (55 - stunbash_chance)) {
|
||||
// did stun -- roll other resists
|
||||
// SE_FrontalStunResist description says any angle now a days
|
||||
// SpellEffect::FrontalStunResist description says any angle now a days
|
||||
int stun_resist2 = spellbonuses.FrontalStunResist + itembonuses.FrontalStunResist +
|
||||
aabonuses.FrontalStunResist;
|
||||
if (zone->random.Int(1, 100) > stun_resist2) {
|
||||
// stun resist 2 failed
|
||||
// time to check SE_StunResist and mod2 stun resist
|
||||
// time to check SpellEffect::StunResist and mod2 stun resist
|
||||
int stun_resist =
|
||||
spellbonuses.StunResist + itembonuses.StunResist + aabonuses.StunResist;
|
||||
if (zone->random.Int(0, 100) >= stun_resist) {
|
||||
@ -5668,7 +5668,7 @@ void Mob::DoRiposte(Mob *defender)
|
||||
defender->itembonuses.DoubleRiposte;
|
||||
|
||||
if (DoubleRipChance && zone->random.Roll(DoubleRipChance)) {
|
||||
LogCombat("Preforming a double riposted from SE_DoubleRiposte ([{}] percent chance)", DoubleRipChance);
|
||||
LogCombat("Preforming a double riposted from SpellEffect::DoubleRiposte ([{}] percent chance)", DoubleRipChance);
|
||||
defender->Attack(this, EQ::invslot::slotPrimary, true);
|
||||
if (HasDied())
|
||||
return;
|
||||
@ -5679,7 +5679,7 @@ void Mob::DoRiposte(Mob *defender)
|
||||
|
||||
// Live AA - Double Riposte
|
||||
if (DoubleRipChance && zone->random.Roll(DoubleRipChance)) {
|
||||
LogCombat("Preforming a double riposted from SE_GiveDoubleRiposte base1 == 0 ([{}] percent chance)", DoubleRipChance);
|
||||
LogCombat("Preforming a double riposted from SpellEffect::GiveDoubleRiposte base1 == 0 ([{}] percent chance)", DoubleRipChance);
|
||||
defender->Attack(this, EQ::invslot::slotPrimary, true);
|
||||
if (HasDied())
|
||||
return;
|
||||
@ -6027,12 +6027,12 @@ void Mob::TrySkillProc(Mob *on, EQ::skills::SkillType skill, uint16 ReuseTime, b
|
||||
|
||||
for (int i = 0; i < EFFECT_COUNT; i++) {
|
||||
|
||||
if (spells[base_spell_id].effect_id[i] == SE_SkillProcAttempt || spells[base_spell_id].effect_id[i] == SE_SkillProcSuccess) {
|
||||
if (spells[base_spell_id].effect_id[i] == SpellEffect::SkillProcAttempt || spells[base_spell_id].effect_id[i] == SpellEffect::SkillProcSuccess) {
|
||||
proc_spell_id = spells[base_spell_id].base_value[i];
|
||||
ProcMod = static_cast<float>(spells[base_spell_id].limit_value[i]);
|
||||
}
|
||||
|
||||
else if (spells[base_spell_id].effect_id[i] == SE_LimitToSkill && spells[base_spell_id].base_value[i] <= EQ::skills::HIGHEST_SKILL) {
|
||||
else if (spells[base_spell_id].effect_id[i] == SpellEffect::LimitToSkill && spells[base_spell_id].base_value[i] <= EQ::skills::HIGHEST_SKILL) {
|
||||
if (CanProc && spells[base_spell_id].base_value[i] == skill && IsValidSpell(proc_spell_id)) {
|
||||
float final_chance = chance * (ProcMod / 100.0f);
|
||||
if (zone->random.Roll(final_chance)) {
|
||||
@ -6071,12 +6071,12 @@ void Mob::TrySkillProc(Mob *on, EQ::skills::SkillType skill, uint16 ReuseTime, b
|
||||
ProcMod = 0;
|
||||
|
||||
for (int i = 0; i < EFFECT_COUNT; i++) {
|
||||
if (spells[base_spell_id].effect_id[i] == SE_SkillProcAttempt || spells[base_spell_id].effect_id[i] == SE_SkillProcSuccess) {
|
||||
if (spells[base_spell_id].effect_id[i] == SpellEffect::SkillProcAttempt || spells[base_spell_id].effect_id[i] == SpellEffect::SkillProcSuccess) {
|
||||
proc_spell_id = spells[base_spell_id].base_value[i];
|
||||
ProcMod = static_cast<float>(spells[base_spell_id].limit_value[i]);
|
||||
}
|
||||
|
||||
else if (spells[base_spell_id].effect_id[i] == SE_LimitToSkill && spells[base_spell_id].base_value[i] <= EQ::skills::HIGHEST_SKILL) {
|
||||
else if (spells[base_spell_id].effect_id[i] == SpellEffect::LimitToSkill && spells[base_spell_id].base_value[i] <= EQ::skills::HIGHEST_SKILL) {
|
||||
|
||||
if (CanProc && spells[base_spell_id].base_value[i] == skill && IsValidSpell(proc_spell_id)) {
|
||||
float final_chance = chance * (ProcMod / 100.0f);
|
||||
@ -6133,11 +6133,11 @@ void Mob::TrySkillProc(Mob *on, EQ::skills::SkillType skill, uint16 ReuseTime, b
|
||||
limit_value = effect.limit_value;
|
||||
slot = effect.slot;
|
||||
|
||||
if (effect_id == SE_SkillProcAttempt || effect_id == SE_SkillProcSuccess) {
|
||||
if (effect_id == SpellEffect::SkillProcAttempt || effect_id == SpellEffect::SkillProcSuccess) {
|
||||
proc_spell_id = base_value;
|
||||
ProcMod = static_cast<float>(limit_value);
|
||||
}
|
||||
else if (effect_id == SE_LimitToSkill && base_value <= EQ::skills::HIGHEST_SKILL) {
|
||||
else if (effect_id == SpellEffect::LimitToSkill && base_value <= EQ::skills::HIGHEST_SKILL) {
|
||||
|
||||
if (CanProc && base_value == skill && IsValidSpell(proc_spell_id)) {
|
||||
float final_chance = chance * (ProcMod / 100.0f);
|
||||
@ -6300,7 +6300,7 @@ bool Mob::TryRootFadeByDamage(int buffslot, Mob* attacker) {
|
||||
int32 Mob::RuneAbsorb(int64 damage, uint16 type)
|
||||
{
|
||||
uint32 buff_max = GetMaxTotalSlots();
|
||||
if (type == SE_Rune) {
|
||||
if (type == SpellEffect::Rune) {
|
||||
for (uint32 slot = 0; slot < buff_max; slot++) {
|
||||
if (slot == spellbonuses.MeleeRune[SBIndex::RUNE_BUFFSLOT] && spellbonuses.MeleeRune[SBIndex::RUNE_AMOUNT] && buffs[slot].melee_rune && IsValidSpell(buffs[slot].spellid)) {
|
||||
int melee_rune_left = buffs[slot].melee_rune;
|
||||
@ -6544,7 +6544,7 @@ void Mob::DoShieldDamageOnShielderSpellEffect(Mob* shield_target, int64 hit_dama
|
||||
return;
|
||||
}
|
||||
/*
|
||||
SPA 463 SE_SHIELD_TARGET
|
||||
SPA 463 SpellEffect::SHIELD_TARGET
|
||||
|
||||
Live description: "Shields your target, taking a percentage of their damage".
|
||||
Only example spell on live is an NPC who uses it during a raid event "Laurion's Song" expansion. SPA 54492 'Guardian Stance' Described as 100% Melee Shielding
|
||||
@ -6596,7 +6596,7 @@ void Mob::CommonBreakInvisibleFromCombat()
|
||||
CancelSneakHide();
|
||||
|
||||
if (spellbonuses.NegateIfCombat) {
|
||||
BuffFadeByEffect(SE_NegateIfCombat);
|
||||
BuffFadeByEffect(SpellEffect::NegateIfCombat);
|
||||
}
|
||||
|
||||
hidden = false;
|
||||
|
||||
1430
zone/bonuses.cpp
1430
zone/bonuses.cpp
File diff suppressed because it is too large
Load Diff
262
zone/bot.cpp
262
zone/bot.cpp
@ -296,8 +296,8 @@ Bot::Bot(
|
||||
|
||||
for (int x1 = 0; x1 < EFFECT_COUNT; x1++) {
|
||||
switch (spell.effect_id[x1]) {
|
||||
case SE_IllusionCopy:
|
||||
case SE_Illusion: {
|
||||
case SpellEffect::IllusionCopy:
|
||||
case SpellEffect::Illusion: {
|
||||
if (GetIllusionBlock()) {
|
||||
break;
|
||||
}
|
||||
@ -317,7 +317,7 @@ Bot::Bot(
|
||||
);
|
||||
} else if (spell.base_value[x1] == -2) // WTF IS THIS
|
||||
{
|
||||
if (GetRace() == IKSAR || GetRace() == VAHSHIR || GetRace() <= GNOME) {
|
||||
if (GetRace() == Race::Iksar || GetRace() == Race::VahShir || GetRace() <= Race::Gnome) {
|
||||
SendIllusionPacket(
|
||||
AppearanceStruct{
|
||||
.gender_id = GetGender(),
|
||||
@ -346,27 +346,27 @@ Bot::Bot(
|
||||
}
|
||||
|
||||
switch (spell.base_value[x1]) {
|
||||
case OGRE:
|
||||
case Race::Ogre:
|
||||
SendAppearancePacket(AppearanceType::Size, 9);
|
||||
break;
|
||||
case TROLL:
|
||||
case Race::Troll:
|
||||
SendAppearancePacket(AppearanceType::Size, 8);
|
||||
break;
|
||||
case VAHSHIR:
|
||||
case BARBARIAN:
|
||||
case Race::VahShir:
|
||||
case Race::Barbarian:
|
||||
SendAppearancePacket(AppearanceType::Size, 7);
|
||||
break;
|
||||
case HALF_ELF:
|
||||
case WOOD_ELF:
|
||||
case DARK_ELF:
|
||||
case FROGLOK:
|
||||
case Race::HalfElf:
|
||||
case Race::WoodElf:
|
||||
case Race::DarkElf:
|
||||
case Race::Froglok2:
|
||||
SendAppearancePacket(AppearanceType::Size, 5);
|
||||
break;
|
||||
case DWARF:
|
||||
case Race::Dwarf:
|
||||
SendAppearancePacket(AppearanceType::Size, 4);
|
||||
break;
|
||||
case HALFLING:
|
||||
case GNOME:
|
||||
case Race::Halfling:
|
||||
case Race::Gnome:
|
||||
SendAppearancePacket(AppearanceType::Size, 3);
|
||||
break;
|
||||
default:
|
||||
@ -375,63 +375,63 @@ Bot::Bot(
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SE_Silence:
|
||||
case SpellEffect::Silence:
|
||||
{
|
||||
Silence(true);
|
||||
break;
|
||||
}
|
||||
case SE_Amnesia:
|
||||
case SpellEffect::Amnesia:
|
||||
{
|
||||
Amnesia(true);
|
||||
break;
|
||||
}
|
||||
case SE_DivineAura:
|
||||
case SpellEffect::DivineAura:
|
||||
{
|
||||
invulnerable = true;
|
||||
break;
|
||||
}
|
||||
case SE_Invisibility2:
|
||||
case SE_Invisibility:
|
||||
case SpellEffect::Invisibility2:
|
||||
case SpellEffect::Invisibility:
|
||||
{
|
||||
invisible = true;
|
||||
SendAppearancePacket(AppearanceType::Invisibility, 1);
|
||||
break;
|
||||
}
|
||||
case SE_Levitate:
|
||||
case SpellEffect::Levitate:
|
||||
{
|
||||
if (!zone->CanLevitate())
|
||||
{
|
||||
SendAppearancePacket(AppearanceType::FlyMode, 0);
|
||||
BuffFadeByEffect(SE_Levitate);
|
||||
BuffFadeByEffect(SpellEffect::Levitate);
|
||||
}
|
||||
else {
|
||||
SendAppearancePacket(AppearanceType::FlyMode, 2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SE_InvisVsUndead2:
|
||||
case SE_InvisVsUndead:
|
||||
case SpellEffect::InvisVsUndead2:
|
||||
case SpellEffect::InvisVsUndead:
|
||||
{
|
||||
invisible_undead = true;
|
||||
break;
|
||||
}
|
||||
case SE_InvisVsAnimals:
|
||||
case SpellEffect::InvisVsAnimals:
|
||||
{
|
||||
invisible_animals = true;
|
||||
break;
|
||||
}
|
||||
case SE_AddMeleeProc:
|
||||
case SE_WeaponProc:
|
||||
case SpellEffect::AddMeleeProc:
|
||||
case SpellEffect::WeaponProc:
|
||||
{
|
||||
AddProcToWeapon(GetProcID(buffs[j1].spellid, x1), false, 100 + spells[buffs[j1].spellid].limit_value[x1], buffs[j1].spellid, buffs[j1].casterlevel);
|
||||
break;
|
||||
}
|
||||
case SE_DefensiveProc:
|
||||
case SpellEffect::DefensiveProc:
|
||||
{
|
||||
AddDefensiveProc(GetProcID(buffs[j1].spellid, x1), 100 + spells[buffs[j1].spellid].limit_value[x1], buffs[j1].spellid);
|
||||
break;
|
||||
}
|
||||
case SE_RangedProc:
|
||||
case SpellEffect::RangedProc:
|
||||
{
|
||||
AddRangedProc(GetProcID(buffs[j1].spellid, x1), 100 + spells[buffs[j1].spellid].limit_value[x1], buffs[j1].spellid);
|
||||
break;
|
||||
@ -457,10 +457,10 @@ Bot::Bot(
|
||||
int resurrection_sickness_spell_id = (
|
||||
RuleB(Bots, OldRaceRezEffects) &&
|
||||
(
|
||||
GetRace() == BARBARIAN ||
|
||||
GetRace() == DWARF ||
|
||||
GetRace() == TROLL ||
|
||||
GetRace() == OGRE
|
||||
GetRace() == Race::Barbarian ||
|
||||
GetRace() == Race::Dwarf ||
|
||||
GetRace() == Race::Troll ||
|
||||
GetRace() == Race::Ogre
|
||||
) ?
|
||||
RuleI(Bots, OldResurrectionSicknessSpell) :
|
||||
RuleI(Bots, ResurrectionSicknessSpell)
|
||||
@ -955,9 +955,9 @@ void Bot::GenerateBaseStats()
|
||||
float BotSize = GetSize();
|
||||
|
||||
switch(GetRace()) {
|
||||
case HUMAN: // Humans have no race bonus
|
||||
case Race::Human: // Humans have no race bonus
|
||||
break;
|
||||
case BARBARIAN:
|
||||
case Race::Barbarian:
|
||||
Strength += 28;
|
||||
Stamina += 20;
|
||||
Agility += 7;
|
||||
@ -968,7 +968,7 @@ void Bot::GenerateBaseStats()
|
||||
BotSize = 7.0;
|
||||
ColdResist += 10;
|
||||
break;
|
||||
case ERUDITE:
|
||||
case Race::Erudite:
|
||||
Strength -= 15;
|
||||
Stamina -= 5;
|
||||
Agility -= 5;
|
||||
@ -979,7 +979,7 @@ void Bot::GenerateBaseStats()
|
||||
MagicResist += 5;
|
||||
DiseaseResist -= 5;
|
||||
break;
|
||||
case WOOD_ELF:
|
||||
case Race::WoodElf:
|
||||
Strength -= 10;
|
||||
Stamina -= 10;
|
||||
Agility += 20;
|
||||
@ -987,7 +987,7 @@ void Bot::GenerateBaseStats()
|
||||
Wisdom += 5;
|
||||
BotSize = 5.0;
|
||||
break;
|
||||
case HIGH_ELF:
|
||||
case Race::HighElf:
|
||||
Strength -= 20;
|
||||
Stamina -= 10;
|
||||
Agility += 10;
|
||||
@ -996,7 +996,7 @@ void Bot::GenerateBaseStats()
|
||||
Intelligence += 12;
|
||||
Charisma += 5;
|
||||
break;
|
||||
case DARK_ELF:
|
||||
case Race::DarkElf:
|
||||
Strength -= 15;
|
||||
Stamina -= 10;
|
||||
Agility += 15;
|
||||
@ -1005,7 +1005,7 @@ void Bot::GenerateBaseStats()
|
||||
Charisma -= 15;
|
||||
BotSize = 5.0;
|
||||
break;
|
||||
case HALF_ELF:
|
||||
case Race::HalfElf:
|
||||
Strength -= 5;
|
||||
Stamina -= 5;
|
||||
Agility += 15;
|
||||
@ -1013,7 +1013,7 @@ void Bot::GenerateBaseStats()
|
||||
Wisdom -= 15;
|
||||
BotSize = 5.5;
|
||||
break;
|
||||
case DWARF:
|
||||
case Race::Dwarf:
|
||||
Strength += 15;
|
||||
Stamina += 15;
|
||||
Agility -= 5;
|
||||
@ -1025,7 +1025,7 @@ void Bot::GenerateBaseStats()
|
||||
MagicResist -= 5;
|
||||
PoisonResist += 5;
|
||||
break;
|
||||
case TROLL:
|
||||
case Race::Troll:
|
||||
Strength += 33;
|
||||
Stamina += 34;
|
||||
Agility += 8;
|
||||
@ -1035,7 +1035,7 @@ void Bot::GenerateBaseStats()
|
||||
BotSize = 8.0;
|
||||
FireResist -= 20;
|
||||
break;
|
||||
case OGRE:
|
||||
case Race::Ogre:
|
||||
Strength += 55;
|
||||
Stamina += 77;
|
||||
Agility -= 5;
|
||||
@ -1045,7 +1045,7 @@ void Bot::GenerateBaseStats()
|
||||
Charisma -= 38;
|
||||
BotSize = 9.0;
|
||||
break;
|
||||
case HALFLING:
|
||||
case Race::Halfling:
|
||||
Strength -= 5;
|
||||
Agility += 20;
|
||||
Dexterity += 15;
|
||||
@ -1056,7 +1056,7 @@ void Bot::GenerateBaseStats()
|
||||
PoisonResist += 5;
|
||||
DiseaseResist += 5;
|
||||
break;
|
||||
case GNOME:
|
||||
case Race::Gnome:
|
||||
Strength -= 15;
|
||||
Stamina -= 5;
|
||||
Agility += 10;
|
||||
@ -1066,7 +1066,7 @@ void Bot::GenerateBaseStats()
|
||||
Charisma -= 15;
|
||||
BotSize = 3.0;
|
||||
break;
|
||||
case IKSAR:
|
||||
case Race::Iksar:
|
||||
Strength -= 5;
|
||||
Stamina -= 5;
|
||||
Agility += 15;
|
||||
@ -1076,7 +1076,7 @@ void Bot::GenerateBaseStats()
|
||||
MagicResist -= 5;
|
||||
FireResist -= 5;
|
||||
break;
|
||||
case VAHSHIR:
|
||||
case Race::VahShir:
|
||||
Strength += 15;
|
||||
Agility += 15;
|
||||
Dexterity -= 5;
|
||||
@ -1087,7 +1087,7 @@ void Bot::GenerateBaseStats()
|
||||
MagicResist -= 5;
|
||||
FireResist -= 5;
|
||||
break;
|
||||
case FROGLOK:
|
||||
case Race::Froglok2:
|
||||
Strength -= 5;
|
||||
Stamina += 5;
|
||||
Agility += 25;
|
||||
@ -1097,7 +1097,7 @@ void Bot::GenerateBaseStats()
|
||||
MagicResist -= 5;
|
||||
FireResist -= 5;
|
||||
break;
|
||||
case DRAKKIN:
|
||||
case Race::Drakkin:
|
||||
Strength -= 5;
|
||||
Stamina += 5;
|
||||
Agility += 10;
|
||||
@ -1140,7 +1140,7 @@ void Bot::GenerateBaseStats()
|
||||
void Bot::GenerateAppearance() {
|
||||
// Randomize facial appearance
|
||||
int iFace = 0;
|
||||
if (GetRace() == BARBARIAN) // Barbarian w/Tatoo
|
||||
if (GetRace() == Race::Barbarian) // Barbarian w/Tatoo
|
||||
{
|
||||
iFace = zone->random.Int(0, 79);
|
||||
}
|
||||
@ -1152,13 +1152,13 @@ void Bot::GenerateAppearance() {
|
||||
int iHair = 0;
|
||||
int iBeard = 0;
|
||||
int iBeardColor = 1;
|
||||
if (GetRace() == DRAKKIN) {
|
||||
if (GetRace() == Race::Drakkin) {
|
||||
iHair = zone->random.Int(0, 8);
|
||||
iBeard = zone->random.Int(0, 11);
|
||||
iBeardColor = zone->random.Int(0, 3);
|
||||
} else if (GetGender()) {
|
||||
iHair = zone->random.Int(0, 2);
|
||||
if (GetRace() == DWARF && zone->random.Int(1, 100) < 50) {
|
||||
if (GetRace() == Race::Dwarf && zone->random.Int(1, 100) < 50) {
|
||||
iFace += 10;
|
||||
}
|
||||
} else {
|
||||
@ -1168,7 +1168,7 @@ void Bot::GenerateAppearance() {
|
||||
}
|
||||
|
||||
int iHairColor = 0;
|
||||
if (GetRace() == DRAKKIN) {
|
||||
if (GetRace() == Race::Drakkin) {
|
||||
iHairColor = zone->random.Int(0, 3);
|
||||
} else {
|
||||
iHairColor = zone->random.Int(0, 19);
|
||||
@ -1176,7 +1176,7 @@ void Bot::GenerateAppearance() {
|
||||
|
||||
auto iEyeColor1 = (uint8)zone->random.Int(0, 9);
|
||||
uint8 iEyeColor2 = 0;
|
||||
if (GetRace() == DRAKKIN) {
|
||||
if (GetRace() == Race::Drakkin) {
|
||||
iEyeColor1 = iEyeColor2 = (uint8)zone->random.Int(0, 11);
|
||||
} else if (zone->random.Int(1, 100) > 96) {
|
||||
iEyeColor2 = zone->random.Int(0, 9);
|
||||
@ -1187,7 +1187,7 @@ void Bot::GenerateAppearance() {
|
||||
int iHeritage = 0;
|
||||
int iTattoo = 0;
|
||||
int iDetails = 0;
|
||||
if (GetRace() == DRAKKIN) {
|
||||
if (GetRace() == Race::Drakkin) {
|
||||
iHeritage = zone->random.Int(0, 6);
|
||||
iTattoo = zone->random.Int(0, 7);
|
||||
iDetails = zone->random.Int(0, 7);
|
||||
@ -1527,7 +1527,7 @@ bool Bot::LoadPet()
|
||||
auto my_buffs = GetBuffs();
|
||||
if (buffs_max && my_buffs) {
|
||||
for (int index = 0; index < buffs_max; ++index) {
|
||||
if (IsEffectInSpell(my_buffs[index].spellid, SE_Familiar)) {
|
||||
if (IsEffectInSpell(my_buffs[index].spellid, SpellEffect::Familiar)) {
|
||||
MakePet(my_buffs[index].spellid, spells[my_buffs[index].spellid].teleport_zone);
|
||||
return true;
|
||||
}
|
||||
@ -3578,7 +3578,7 @@ void Bot::Depop() {
|
||||
|
||||
if (bot_pet) {
|
||||
if (bot_pet->Charmed()) {
|
||||
bot_pet->BuffFadeByEffect(SE_Charm);
|
||||
bot_pet->BuffFadeByEffect(SpellEffect::Charm);
|
||||
}
|
||||
else {
|
||||
bot_pet->Depop();
|
||||
@ -5404,9 +5404,9 @@ void Bot::DoClassAttacks(Mob *target, bool IsRiposte) {
|
||||
case Class::Paladin:
|
||||
{
|
||||
bool is_large_race = (
|
||||
GetBaseRace() == OGRE ||
|
||||
GetBaseRace() == TROLL ||
|
||||
GetBaseRace() == BARBARIAN
|
||||
GetBaseRace() == Race::Ogre ||
|
||||
GetBaseRace() == Race::Troll ||
|
||||
GetBaseRace() == Race::Barbarian
|
||||
);
|
||||
bool has_bash_skill = GetSkill(EQ::skills::SkillBash) > 0;
|
||||
bool has_shield_in_secondary =
|
||||
@ -5974,7 +5974,7 @@ bool Bot::SpellOnTarget(
|
||||
|
||||
if (spelltar->IsPet()) {
|
||||
for (int i = 0; i < EFFECT_COUNT; ++i) {
|
||||
if (spells[spell_id].effect_id[i] == SE_Illusion) {
|
||||
if (spells[spell_id].effect_id[i] == SpellEffect::Illusion) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -6214,7 +6214,7 @@ bool Bot::DoFinishedSpellSingleTarget(uint16 spell_id, Mob* spellTarget, EQ::spe
|
||||
|
||||
if (!noGroupSpell) {
|
||||
for (Mob* m : GetBuffTargets(spellTarget)) {
|
||||
if (IsEffectInSpell(thespell, SE_AbsorbMagicAtt) || IsEffectInSpell(thespell, SE_Rune)) {
|
||||
if (IsEffectInSpell(thespell, SpellEffect::AbsorbMagicAtt) || IsEffectInSpell(thespell, SpellEffect::Rune)) {
|
||||
for (int i = 0; i < m->GetMaxTotalSlots(); i++) {
|
||||
uint32 buff_count = m->GetMaxTotalSlots();
|
||||
|
||||
@ -7831,7 +7831,7 @@ bool Bot::GetNeedsCured(Mob *tar) {
|
||||
bool need_cured = false;
|
||||
|
||||
if (tar) {
|
||||
if (tar->FindType(SE_PoisonCounter) || tar->FindType(SE_DiseaseCounter) || tar->FindType(SE_CurseCounter) || tar->FindType(SE_CorruptionCounter)) {
|
||||
if (tar->FindType(SpellEffect::PoisonCounter) || tar->FindType(SpellEffect::DiseaseCounter) || tar->FindType(SpellEffect::CurseCounter) || tar->FindType(SpellEffect::CorruptionCounter)) {
|
||||
uint32 buff_count = tar->GetMaxTotalSlots();
|
||||
|
||||
for (unsigned int j = 0; j < buff_count; j++) {
|
||||
@ -8616,7 +8616,7 @@ void Bot::Escape()
|
||||
}
|
||||
|
||||
void Bot::Fling(float value, float target_x, float target_y, float target_z, bool ignore_los, bool clip_through_walls, bool calculate_speed) {
|
||||
BuffFadeByEffect(SE_Levitate);
|
||||
BuffFadeByEffect(SpellEffect::Levitate);
|
||||
if (CheckLosFN(target_x, target_y, target_z, 6.0f) || ignore_los) {
|
||||
auto p = new EQApplicationPacket(OP_Fling, sizeof(fling_struct));
|
||||
auto* f = (fling_struct*) p->pBuffer;
|
||||
@ -9553,9 +9553,9 @@ bool Bot::CastChecks(uint16 spell_id, Mob* tar, uint16 spell_type, bool precheck
|
||||
|
||||
if (spells[spell_id].target_type == ST_Self && tar != this) {
|
||||
if (
|
||||
!IsEffectInSpell(spell_id, SE_SummonCorpse) ||
|
||||
!IsEffectInSpell(spell_id, SpellEffect::SummonCorpse) ||
|
||||
(
|
||||
IsEffectInSpell(spell_id, SE_SummonCorpse) &&
|
||||
IsEffectInSpell(spell_id, SpellEffect::SummonCorpse) &&
|
||||
!RuleB(Bots, AllowCommandedSummonCorpse)
|
||||
)
|
||||
) {
|
||||
@ -9667,7 +9667,7 @@ bool Bot::CastChecks(uint16 spell_id, Mob* tar, uint16 spell_type, bool precheck
|
||||
|
||||
if (
|
||||
!zone->CanLevitate() &&
|
||||
IsEffectInSpell(spell_id, SE_Levitate)
|
||||
IsEffectInSpell(spell_id, SpellEffect::Levitate)
|
||||
) {
|
||||
LogBotSpellChecksDetail("{} says, 'Cancelling cast of {} due to !CanLevitate.'", GetCleanName(), GetSpellName(spell_id));
|
||||
return false;
|
||||
@ -9907,8 +9907,8 @@ bool Bot::CanCastSpellType(uint16 spell_type, uint16 spell_id, Mob* tar) {
|
||||
spell_type != BotSpellTypes::Succor
|
||||
) &&
|
||||
(
|
||||
IsEffectInSpell(spell_id, SE_Teleport) ||
|
||||
IsEffectInSpell(spell_id, SE_Succor)
|
||||
IsEffectInSpell(spell_id, SpellEffect::Teleport) ||
|
||||
IsEffectInSpell(spell_id, SpellEffect::Succor)
|
||||
)
|
||||
) {
|
||||
LogBotSpellChecksDetail("{} says, 'Cancelling cast of {} on {} due to Teleport.'", GetCleanName(), GetSpellName(spell_id), tar->GetCleanName());
|
||||
@ -9918,7 +9918,7 @@ bool Bot::CanCastSpellType(uint16 spell_type, uint16 spell_id, Mob* tar) {
|
||||
if (
|
||||
tar->IsPet() &&
|
||||
!RuleB(Bots, CanCastIllusionsOnPets) &&
|
||||
IsEffectInSpell(spell_id, SE_Illusion)
|
||||
IsEffectInSpell(spell_id, SpellEffect::Illusion)
|
||||
) {
|
||||
LogBotSpellChecksDetail("{} says, 'Cancelling cast of {} on {} due to PetSE_Illusion.'", GetCleanName(), GetSpellName(spell_id), tar->GetCleanName());
|
||||
return false;
|
||||
@ -9962,13 +9962,13 @@ bool Bot::CanCastSpellType(uint16 spell_type, uint16 spell_id, Mob* tar) {
|
||||
tar->IsBot() &&
|
||||
(tar->GetLevel() >= tar->CastToBot()->GetStopMeleeLevel()) &&
|
||||
(
|
||||
IsEffectInSpell(spell_id, SE_AttackSpeed) ||
|
||||
IsEffectInSpell(spell_id, SE_ReverseDS)
|
||||
IsEffectInSpell(spell_id, SpellEffect::AttackSpeed) ||
|
||||
IsEffectInSpell(spell_id, SpellEffect::ReverseDS)
|
||||
) ||
|
||||
(
|
||||
SpellEffectsCount(spell_id) == 1 &&
|
||||
(
|
||||
IsEffectInSpell(spell_id, SE_ATK) || IsEffectInSpell(spell_id, SE_STR)
|
||||
IsEffectInSpell(spell_id, SpellEffect::ATK) || IsEffectInSpell(spell_id, SpellEffect::STR)
|
||||
)
|
||||
)
|
||||
) {
|
||||
@ -9978,11 +9978,11 @@ bool Bot::CanCastSpellType(uint16 spell_type, uint16 spell_id, Mob* tar) {
|
||||
break;
|
||||
case Archetype::Melee:
|
||||
if (
|
||||
IsEffectInSpell(spell_id, SE_IncreaseSpellHaste) ||
|
||||
IsEffectInSpell(spell_id, SE_ManaPool) ||
|
||||
IsEffectInSpell(spell_id, SE_CastingLevel) ||
|
||||
IsEffectInSpell(spell_id, SE_ManaRegen_v2) ||
|
||||
IsEffectInSpell(spell_id, SE_CurrentMana)
|
||||
IsEffectInSpell(spell_id, SpellEffect::IncreaseSpellHaste) ||
|
||||
IsEffectInSpell(spell_id, SpellEffect::ManaPool) ||
|
||||
IsEffectInSpell(spell_id, SpellEffect::CastingLevel) ||
|
||||
IsEffectInSpell(spell_id, SpellEffect::ManaRegen_v2) ||
|
||||
IsEffectInSpell(spell_id, SpellEffect::CurrentMana)
|
||||
) {
|
||||
LogBotSpellChecksDetail("{} says, 'Cancelling cast of {} on {} due to Archetype::Melee.'", GetCleanName(), GetSpellName(spell_id), tar->GetCleanName());
|
||||
return false;
|
||||
@ -9997,8 +9997,8 @@ bool Bot::CanCastSpellType(uint16 spell_type, uint16 spell_id, Mob* tar) {
|
||||
// Differences for each type
|
||||
if (spell_type != BotSpellTypes::InCombatBuff) {
|
||||
if (
|
||||
IsEffectInSpell(spell_id, SE_AbsorbMagicAtt) ||
|
||||
IsEffectInSpell(spell_id, SE_Rune)
|
||||
IsEffectInSpell(spell_id, SpellEffect::AbsorbMagicAtt) ||
|
||||
IsEffectInSpell(spell_id, SpellEffect::Rune)
|
||||
) {
|
||||
for (int i = 0; i < tar->GetMaxTotalSlots(); i++) {
|
||||
uint32 buff_count = tar->GetMaxTotalSlots();
|
||||
@ -10026,14 +10026,14 @@ bool Bot::CanCastSpellType(uint16 spell_type, uint16 spell_id, Mob* tar) {
|
||||
tar->IsBot() &&
|
||||
(tar->GetLevel() >= tar->CastToBot()->GetStopMeleeLevel()) &&
|
||||
(
|
||||
IsEffectInSpell(spell_id, SE_AttackSpeed) ||
|
||||
IsEffectInSpell(spell_id, SE_ReverseDS)
|
||||
IsEffectInSpell(spell_id, SpellEffect::AttackSpeed) ||
|
||||
IsEffectInSpell(spell_id, SpellEffect::ReverseDS)
|
||||
) ||
|
||||
(
|
||||
SpellEffectsCount(spell_id) == 1 &&
|
||||
(
|
||||
IsEffectInSpell(spell_id, SE_ATK) ||
|
||||
IsEffectInSpell(spell_id, SE_STR)
|
||||
IsEffectInSpell(spell_id, SpellEffect::ATK) ||
|
||||
IsEffectInSpell(spell_id, SpellEffect::STR)
|
||||
)
|
||||
)
|
||||
) {
|
||||
@ -10043,11 +10043,11 @@ bool Bot::CanCastSpellType(uint16 spell_type, uint16 spell_id, Mob* tar) {
|
||||
break;
|
||||
case Archetype::Melee:
|
||||
if (
|
||||
IsEffectInSpell(spell_id, SE_IncreaseSpellHaste) ||
|
||||
IsEffectInSpell(spell_id, SE_ManaPool) ||
|
||||
IsEffectInSpell(spell_id, SE_CastingLevel) ||
|
||||
IsEffectInSpell(spell_id, SE_ManaRegen_v2) ||
|
||||
IsEffectInSpell(spell_id, SE_CurrentMana)
|
||||
IsEffectInSpell(spell_id, SpellEffect::IncreaseSpellHaste) ||
|
||||
IsEffectInSpell(spell_id, SpellEffect::ManaPool) ||
|
||||
IsEffectInSpell(spell_id, SpellEffect::CastingLevel) ||
|
||||
IsEffectInSpell(spell_id, SpellEffect::ManaRegen_v2) ||
|
||||
IsEffectInSpell(spell_id, SpellEffect::CurrentMana)
|
||||
) {
|
||||
LogBotSpellChecksDetail("{} says, 'Cancelling cast of {} on {} due to Archetype::Melee.'", GetCleanName(), GetSpellName(spell_id), tar->GetCleanName());
|
||||
return false;
|
||||
@ -10329,7 +10329,7 @@ bool Bot::IsValidMezTarget(Mob* owner, Mob* npc, uint16 spell_id) {
|
||||
auto npc_buffs = npc->GetBuffs();
|
||||
|
||||
for (int i = 0; i < buff_count; i++) {
|
||||
if (IsDetrimentalSpell(npc_buffs[i].spellid) && IsEffectInSpell(npc_buffs[i].spellid, SE_CurrentHP)) {
|
||||
if (IsDetrimentalSpell(npc_buffs[i].spellid) && IsEffectInSpell(npc_buffs[i].spellid, SpellEffect::CurrentHP)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -11684,7 +11684,7 @@ bool Bot::IsValidSpellTypeBySpellID(uint16 spell_type, uint16 spell_id) {
|
||||
return false;
|
||||
case BotSpellTypes::Root:
|
||||
case BotSpellTypes::AERoot:
|
||||
if (IsDetrimentalSpell(spell_id) && IsEffectInSpell(spell_id, SE_Root)) {
|
||||
if (IsDetrimentalSpell(spell_id) && IsEffectInSpell(spell_id, SpellEffect::Root)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -11718,7 +11718,7 @@ bool Bot::IsValidSpellTypeBySpellID(uint16 spell_type, uint16 spell_id) {
|
||||
|
||||
return false;
|
||||
case BotSpellTypes::Pet:
|
||||
if (IsSummonPetSpell(spell_id) || IsEffectInSpell(spell_id, SE_TemporaryPets)) {
|
||||
if (IsSummonPetSpell(spell_id) || IsEffectInSpell(spell_id, SpellEffect::TemporaryPets)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -11732,7 +11732,7 @@ bool Bot::IsValidSpellTypeBySpellID(uint16 spell_type, uint16 spell_id) {
|
||||
return false;
|
||||
case BotSpellTypes::Snare:
|
||||
case BotSpellTypes::AESnare:
|
||||
if (IsDetrimentalSpell(spell_id) && IsEffectInSpell(spell_id, SE_MovementSpeed)) {
|
||||
if (IsDetrimentalSpell(spell_id) && IsEffectInSpell(spell_id, SpellEffect::MovementSpeed)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -11806,7 +11806,7 @@ bool Bot::IsValidSpellTypeBySpellID(uint16 spell_type, uint16 spell_id) {
|
||||
|
||||
return false;
|
||||
case BotSpellTypes::Resurrect:
|
||||
if (IsEffectInSpell(spell_id, SE_Revive)) {
|
||||
if (IsEffectInSpell(spell_id, SpellEffect::Revive)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -11911,14 +11911,14 @@ bool Bot::IsValidSpellTypeBySpellID(uint16 spell_type, uint16 spell_id) {
|
||||
return false;
|
||||
case BotSpellTypes::ResistBuffs:
|
||||
case BotSpellTypes::PetResistBuffs:
|
||||
if (IsResistanceBuffSpell(spell_id) && !IsEffectInSpell(spell_id, SE_DamageShield)) {
|
||||
if (IsResistanceBuffSpell(spell_id) && !IsEffectInSpell(spell_id, SpellEffect::DamageShield)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
case BotSpellTypes::DamageShields:
|
||||
case BotSpellTypes::PetDamageShields:
|
||||
if (IsBeneficialSpell(spell_id) && IsEffectInSpell(spell_id, SE_DamageShield)) {
|
||||
if (IsBeneficialSpell(spell_id) && IsEffectInSpell(spell_id, SpellEffect::DamageShield)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -11926,7 +11926,7 @@ bool Bot::IsValidSpellTypeBySpellID(uint16 spell_type, uint16 spell_id) {
|
||||
case BotSpellTypes::Teleport:
|
||||
if (
|
||||
IsBeneficialSpell(spell_id) &&
|
||||
(IsEffectInSpell(spell_id, SE_Teleport) || IsEffectInSpell(spell_id, SE_Translocate))
|
||||
(IsEffectInSpell(spell_id, SpellEffect::Teleport) || IsEffectInSpell(spell_id, SpellEffect::Translocate))
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
@ -11942,40 +11942,40 @@ bool Bot::IsValidSpellTypeBySpellID(uint16 spell_type, uint16 spell_id) {
|
||||
case BotSpellTypes::Succor:
|
||||
if (
|
||||
IsBeneficialSpell(spell_id) &&
|
||||
IsEffectInSpell(spell_id, SE_Succor)
|
||||
IsEffectInSpell(spell_id, SpellEffect::Succor)
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
case BotSpellTypes::BindAffinity:
|
||||
if (IsEffectInSpell(spell_id, SE_BindAffinity)) {
|
||||
if (IsEffectInSpell(spell_id, SpellEffect::BindAffinity)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
case BotSpellTypes::Identify:
|
||||
if (IsEffectInSpell(spell_id, SE_Identify)) {
|
||||
if (IsEffectInSpell(spell_id, SpellEffect::Identify)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
case BotSpellTypes::Levitate:
|
||||
if (IsBeneficialSpell(spell_id) && IsEffectInSpell(spell_id, SE_Levitate)) {
|
||||
if (IsBeneficialSpell(spell_id) && IsEffectInSpell(spell_id, SpellEffect::Levitate)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
case BotSpellTypes::Rune:
|
||||
if (IsBeneficialSpell(spell_id) &&
|
||||
(IsEffectInSpell(spell_id, SE_AbsorbMagicAtt) || IsEffectInSpell(spell_id, SE_Rune))
|
||||
(IsEffectInSpell(spell_id, SpellEffect::AbsorbMagicAtt) || IsEffectInSpell(spell_id, SpellEffect::Rune))
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
case BotSpellTypes::WaterBreathing:
|
||||
if (IsBeneficialSpell(spell_id) && IsEffectInSpell(spell_id, SE_WaterBreathing)) {
|
||||
if (IsBeneficialSpell(spell_id) && IsEffectInSpell(spell_id, SpellEffect::WaterBreathing)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -11983,7 +11983,7 @@ bool Bot::IsValidSpellTypeBySpellID(uint16 spell_type, uint16 spell_id) {
|
||||
case BotSpellTypes::Size:
|
||||
if (
|
||||
IsBeneficialSpell(spell_id) &&
|
||||
(IsEffectInSpell(spell_id, SE_ModelSize) || IsEffectInSpell(spell_id, SE_ChangeHeight))
|
||||
(IsEffectInSpell(spell_id, SpellEffect::ModelSize) || IsEffectInSpell(spell_id, SpellEffect::ChangeHeight))
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
@ -11991,14 +11991,14 @@ bool Bot::IsValidSpellTypeBySpellID(uint16 spell_type, uint16 spell_id) {
|
||||
return false;
|
||||
case BotSpellTypes::Invisibility:
|
||||
if (IsBeneficialSpell(spell_id) &&
|
||||
(IsEffectInSpell(spell_id, SE_SeeInvis) ||IsInvisibleSpell(spell_id))
|
||||
(IsEffectInSpell(spell_id, SpellEffect::SeeInvis) ||IsInvisibleSpell(spell_id))
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
case BotSpellTypes::MovementSpeed:
|
||||
if (IsBeneficialSpell(spell_id) && IsEffectInSpell(spell_id, SE_MovementSpeed)) {
|
||||
if (IsBeneficialSpell(spell_id) && IsEffectInSpell(spell_id, SpellEffect::MovementSpeed)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -12007,10 +12007,10 @@ bool Bot::IsValidSpellTypeBySpellID(uint16 spell_type, uint16 spell_id) {
|
||||
if (
|
||||
IsBeneficialSpell(spell_id) &&
|
||||
(
|
||||
IsEffectInSpell(spell_id, SE_GateToHomeCity) ||
|
||||
IsEffectInSpell(spell_id, SpellEffect::GateToHomeCity) ||
|
||||
(
|
||||
teleport_zone.compare("") &&
|
||||
(IsEffectInSpell(spell_id, SE_Teleport) || IsEffectInSpell(spell_id, SE_Translocate))
|
||||
(IsEffectInSpell(spell_id, SpellEffect::Teleport) || IsEffectInSpell(spell_id, SpellEffect::Translocate))
|
||||
)
|
||||
)
|
||||
) {
|
||||
@ -12019,7 +12019,7 @@ bool Bot::IsValidSpellTypeBySpellID(uint16 spell_type, uint16 spell_id) {
|
||||
|
||||
return false;
|
||||
case BotSpellTypes::SummonCorpse:
|
||||
if (IsEffectInSpell(spell_id, SE_SummonCorpse)) {
|
||||
if (IsEffectInSpell(spell_id, SpellEffect::SummonCorpse)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -12510,15 +12510,15 @@ bool Bot::IsValidSpellTypeSubType(uint16 spell_type, uint16 sub_type, uint16 spe
|
||||
|
||||
break;
|
||||
case CommandedSubTypes::SeeInvis:
|
||||
if (IsEffectInSpell(spell_id, SE_SeeInvis)) {
|
||||
if (IsEffectInSpell(spell_id, SpellEffect::SeeInvis)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
break;
|
||||
case CommandedSubTypes::Invis:
|
||||
if (
|
||||
IsEffectInSpell(spell_id, SE_Invisibility) ||
|
||||
IsEffectInSpell(spell_id, SE_Invisibility2)
|
||||
IsEffectInSpell(spell_id, SpellEffect::Invisibility) ||
|
||||
IsEffectInSpell(spell_id, SpellEffect::Invisibility2)
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
@ -12526,8 +12526,8 @@ bool Bot::IsValidSpellTypeSubType(uint16 spell_type, uint16 sub_type, uint16 spe
|
||||
break;
|
||||
case CommandedSubTypes::InvisUndead:
|
||||
if (
|
||||
IsEffectInSpell(spell_id, SE_InvisVsUndead) ||
|
||||
IsEffectInSpell(spell_id, SE_InvisVsUndead2)
|
||||
IsEffectInSpell(spell_id, SpellEffect::InvisVsUndead) ||
|
||||
IsEffectInSpell(spell_id, SpellEffect::InvisVsUndead2)
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
@ -12535,8 +12535,8 @@ bool Bot::IsValidSpellTypeSubType(uint16 spell_type, uint16 sub_type, uint16 spe
|
||||
break;
|
||||
case CommandedSubTypes::InvisAnimals:
|
||||
if (
|
||||
IsEffectInSpell(spell_id, SE_InvisVsAnimals) ||
|
||||
IsEffectInSpell(spell_id, SE_ImprovedInvisAnimals)
|
||||
IsEffectInSpell(spell_id, SpellEffect::InvisVsAnimals) ||
|
||||
IsEffectInSpell(spell_id, SpellEffect::ImprovedInvisAnimals)
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
@ -12545,13 +12545,13 @@ bool Bot::IsValidSpellTypeSubType(uint16 spell_type, uint16 sub_type, uint16 spe
|
||||
case CommandedSubTypes::Shrink:
|
||||
if (
|
||||
(
|
||||
IsEffectInSpell(spell_id, SE_ModelSize) &&
|
||||
CalcSpellEffectValue(spell_id, GetSpellEffectIndex(spell_id, SE_ModelSize), GetLevel()) < 100
|
||||
IsEffectInSpell(spell_id, SpellEffect::ModelSize) &&
|
||||
CalcSpellEffectValue(spell_id, GetSpellEffectIndex(spell_id, SpellEffect::ModelSize), GetLevel()) < 100
|
||||
)
|
||||
||
|
||||
(
|
||||
IsEffectInSpell(spell_id, SE_ChangeHeight) &&
|
||||
CalcSpellEffectValue(spell_id, GetSpellEffectIndex(spell_id, SE_ChangeHeight), GetLevel()) < 100
|
||||
IsEffectInSpell(spell_id, SpellEffect::ChangeHeight) &&
|
||||
CalcSpellEffectValue(spell_id, GetSpellEffectIndex(spell_id, SpellEffect::ChangeHeight), GetLevel()) < 100
|
||||
)
|
||||
) {
|
||||
return true;
|
||||
@ -12561,13 +12561,13 @@ bool Bot::IsValidSpellTypeSubType(uint16 spell_type, uint16 sub_type, uint16 spe
|
||||
case CommandedSubTypes::Grow:
|
||||
if (
|
||||
(
|
||||
IsEffectInSpell(spell_id, SE_ModelSize) &&
|
||||
CalcSpellEffectValue(spell_id, GetSpellEffectIndex(spell_id, SE_ModelSize), GetLevel()) > 100
|
||||
IsEffectInSpell(spell_id, SpellEffect::ModelSize) &&
|
||||
CalcSpellEffectValue(spell_id, GetSpellEffectIndex(spell_id, SpellEffect::ModelSize), GetLevel()) > 100
|
||||
)
|
||||
||
|
||||
(
|
||||
IsEffectInSpell(spell_id, SE_ChangeHeight) &&
|
||||
CalcSpellEffectValue(spell_id, GetSpellEffectIndex(spell_id, SE_ChangeHeight), GetLevel()) > 100
|
||||
IsEffectInSpell(spell_id, SpellEffect::ChangeHeight) &&
|
||||
CalcSpellEffectValue(spell_id, GetSpellEffectIndex(spell_id, SpellEffect::ChangeHeight), GetLevel()) > 100
|
||||
)
|
||||
) {
|
||||
return true;
|
||||
@ -12577,7 +12577,7 @@ bool Bot::IsValidSpellTypeSubType(uint16 spell_type, uint16 sub_type, uint16 spe
|
||||
case CommandedSubTypes::Selo:
|
||||
if (
|
||||
IsBeneficialSpell(spell_id) &&
|
||||
IsEffectInSpell(spell_id, SE_MovementSpeed) &&
|
||||
IsEffectInSpell(spell_id, SpellEffect::MovementSpeed) &&
|
||||
IsBardSong(spell_id)
|
||||
) {
|
||||
return true;
|
||||
@ -13347,7 +13347,7 @@ bool Bot::IsImmuneToBotSpell(uint16 spell_id, Mob* caster) {
|
||||
|
||||
if (!GetSpecialAbility(SpecialAbility::MesmerizeImmunity) && IsMesmerizeSpell(spell_id)) {
|
||||
// check max level for spell
|
||||
effect_index = GetSpellEffectIndex(spell_id, SE_Mez);
|
||||
effect_index = GetSpellEffectIndex(spell_id, SpellEffect::Mez);
|
||||
assert(effect_index >= 0);
|
||||
// NPCs get to ignore the max level
|
||||
if (
|
||||
@ -13359,13 +13359,13 @@ bool Bot::IsImmuneToBotSpell(uint16 spell_id, Mob* caster) {
|
||||
}
|
||||
|
||||
// slow and haste spells
|
||||
if (GetSpecialAbility(SpecialAbility::SlowImmunity) && IsEffectInSpell(spell_id, SE_AttackSpeed)) {
|
||||
if (GetSpecialAbility(SpecialAbility::SlowImmunity) && IsEffectInSpell(spell_id, SpellEffect::AttackSpeed)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// client vs client fear
|
||||
if (!GetSpecialAbility(SpecialAbility::FearImmunity) && IsEffectInSpell(spell_id, SE_Fear)) {
|
||||
effect_index = GetSpellEffectIndex(spell_id, SE_Fear);
|
||||
if (!GetSpecialAbility(SpecialAbility::FearImmunity) && IsEffectInSpell(spell_id, SpellEffect::Fear)) {
|
||||
effect_index = GetSpellEffectIndex(spell_id, SpellEffect::Fear);
|
||||
|
||||
if (IsClient() && caster->IsClient() && (caster->CastToClient()->GetGM() == false)) {
|
||||
LogSpells("Clients cannot fear eachother!");
|
||||
@ -13389,7 +13389,7 @@ bool Bot::IsImmuneToBotSpell(uint16 spell_id, Mob* caster) {
|
||||
//let npcs cast whatever charm on anyone
|
||||
if (!caster->IsNPC()) {
|
||||
// check level limit of charm spell
|
||||
effect_index = GetSpellEffectIndex(spell_id, SE_Charm);
|
||||
effect_index = GetSpellEffectIndex(spell_id, SpellEffect::Charm);
|
||||
assert(effect_index >= 0);
|
||||
if (GetLevel() > spells[spell_id].max_value[effect_index] && spells[spell_id].max_value[effect_index] != 0) {
|
||||
return true;
|
||||
@ -13400,8 +13400,8 @@ bool Bot::IsImmuneToBotSpell(uint16 spell_id, Mob* caster) {
|
||||
if (
|
||||
GetSpecialAbility(SpecialAbility::SnareImmunity) &&
|
||||
(
|
||||
IsEffectInSpell(spell_id, SE_Root) ||
|
||||
IsEffectInSpell(spell_id, SE_MovementSpeed)
|
||||
IsEffectInSpell(spell_id, SpellEffect::Root) ||
|
||||
IsEffectInSpell(spell_id, SpellEffect::MovementSpeed)
|
||||
)
|
||||
) {
|
||||
return true;
|
||||
|
||||
@ -46,9 +46,9 @@ void bot_command_beard_color(Client *c, const Seperator *sep)
|
||||
uint8 uvalue = Strings::ToInt(sep->arg[1]);
|
||||
|
||||
auto fail_type = AFT_None;
|
||||
if (my_bot->GetGender() != Gender::Male && my_bot->GetRace() != DWARF)
|
||||
if (my_bot->GetGender() != Gender::Male && my_bot->GetRace() != Race::Dwarf)
|
||||
fail_type = AFT_GenderRace;
|
||||
else if (!PlayerAppearance::IsValidBeardColor(my_bot->GetRace(), my_bot->GetGender(), uvalue))
|
||||
else if (!RaceAppearance::IsValidBeardColor(my_bot->GetRace(), my_bot->GetGender(), uvalue))
|
||||
fail_type = AFT_Value;
|
||||
else
|
||||
my_bot->SetBeardColor(uvalue);
|
||||
@ -83,9 +83,9 @@ void bot_command_beard_style(Client *c, const Seperator *sep)
|
||||
uint8 uvalue = Strings::ToInt(sep->arg[1]);
|
||||
|
||||
auto fail_type = AFT_None;
|
||||
if (my_bot->GetGender() != Gender::Male && my_bot->GetRace() != DWARF)
|
||||
if (my_bot->GetGender() != Gender::Male && my_bot->GetRace() != Race::Dwarf)
|
||||
fail_type = AFT_GenderRace;
|
||||
else if (!PlayerAppearance::IsValidBeard(my_bot->GetRace(), my_bot->GetGender(), uvalue))
|
||||
else if (!RaceAppearance::IsValidBeard(my_bot->GetRace(), my_bot->GetGender(), uvalue))
|
||||
fail_type = AFT_Value;
|
||||
else
|
||||
my_bot->SetBeard(uvalue);
|
||||
@ -122,9 +122,9 @@ void bot_command_details(Client *c, const Seperator *sep)
|
||||
uint32 uvalue = Strings::ToInt(sep->arg[1]);
|
||||
|
||||
auto fail_type = AFT_None;
|
||||
if (my_bot->GetRace() != DRAKKIN)
|
||||
if (my_bot->GetRace() != Race::Drakkin)
|
||||
fail_type = AFT_Race;
|
||||
else if (!PlayerAppearance::IsValidDetail(my_bot->GetRace(), my_bot->GetGender(), uvalue))
|
||||
else if (!RaceAppearance::IsValidDetail(my_bot->GetRace(), my_bot->GetGender(), uvalue))
|
||||
fail_type = AFT_Value;
|
||||
else
|
||||
my_bot->SetDrakkinDetails(uvalue);
|
||||
@ -281,7 +281,7 @@ void bot_command_eyes(Client *c, const Seperator *sep)
|
||||
// eye_bias = 2;
|
||||
|
||||
auto fail_type = AFT_None;
|
||||
if (!PlayerAppearance::IsValidEyeColor(my_bot->GetRace(), my_bot->GetGender(), uvalue)) {
|
||||
if (!RaceAppearance::IsValidEyeColor(my_bot->GetRace(), my_bot->GetGender(), uvalue)) {
|
||||
fail_type = AFT_Value;
|
||||
}
|
||||
else {
|
||||
@ -328,12 +328,12 @@ void bot_command_face(Client *c, const Seperator *sep)
|
||||
uint8 uvalue = Strings::ToInt(sep->arg[1]);
|
||||
|
||||
auto fail_type = AFT_None;
|
||||
if (!PlayerAppearance::IsValidFace(my_bot->GetRace(), my_bot->GetGender(), uvalue)) {
|
||||
if (!RaceAppearance::IsValidFace(my_bot->GetRace(), my_bot->GetGender(), uvalue)) {
|
||||
fail_type = AFT_Value;
|
||||
}
|
||||
else {
|
||||
uint8 old_woad = 0;
|
||||
if (my_bot->GetRace() == BARBARIAN)
|
||||
if (my_bot->GetRace() == Race::Barbarian)
|
||||
old_woad = ((my_bot->GetLuclinFace() / 10) * 10);
|
||||
my_bot->SetLuclinFace((old_woad + uvalue));
|
||||
}
|
||||
@ -368,7 +368,7 @@ void bot_command_hair_color(Client *c, const Seperator *sep)
|
||||
uint8 uvalue = Strings::ToInt(sep->arg[1]);
|
||||
|
||||
auto fail_type = AFT_None;
|
||||
if (!PlayerAppearance::IsValidHairColor(my_bot->GetRace(), my_bot->GetGender(), uvalue))
|
||||
if (!RaceAppearance::IsValidHairColor(my_bot->GetRace(), my_bot->GetGender(), uvalue))
|
||||
fail_type = AFT_Value;
|
||||
else
|
||||
my_bot->SetHairColor(uvalue);
|
||||
@ -403,7 +403,7 @@ void bot_command_hairstyle(Client *c, const Seperator *sep)
|
||||
uint8 uvalue = Strings::ToInt(sep->arg[1]);
|
||||
|
||||
auto fail_type = AFT_None;
|
||||
if (!PlayerAppearance::IsValidHair(my_bot->GetRace(), my_bot->GetGender(), uvalue))
|
||||
if (!RaceAppearance::IsValidHair(my_bot->GetRace(), my_bot->GetGender(), uvalue))
|
||||
fail_type = AFT_Value;
|
||||
else
|
||||
my_bot->SetHairStyle(uvalue);
|
||||
@ -440,9 +440,9 @@ void bot_command_heritage(Client *c, const Seperator *sep)
|
||||
uint32 uvalue = Strings::ToInt(sep->arg[1]);
|
||||
|
||||
auto fail_type = AFT_None;
|
||||
if (my_bot->GetRace() != DRAKKIN)
|
||||
if (my_bot->GetRace() != Race::Drakkin)
|
||||
fail_type = AFT_Race;
|
||||
else if (!PlayerAppearance::IsValidHeritage(my_bot->GetRace(), my_bot->GetGender(), uvalue))
|
||||
else if (!RaceAppearance::IsValidHeritage(my_bot->GetRace(), my_bot->GetGender(), uvalue))
|
||||
fail_type = AFT_Value;
|
||||
else
|
||||
my_bot->SetDrakkinHeritage(uvalue);
|
||||
@ -479,9 +479,9 @@ void bot_command_tattoo(Client *c, const Seperator *sep)
|
||||
uint32 uvalue = Strings::ToInt(sep->arg[1]);
|
||||
|
||||
auto fail_type = AFT_None;
|
||||
if (my_bot->GetRace() != DRAKKIN)
|
||||
if (my_bot->GetRace() != Race::Drakkin)
|
||||
fail_type = AFT_Race;
|
||||
else if (!PlayerAppearance::IsValidTattoo(my_bot->GetRace(), my_bot->GetGender(), uvalue))
|
||||
else if (!RaceAppearance::IsValidTattoo(my_bot->GetRace(), my_bot->GetGender(), uvalue))
|
||||
fail_type = AFT_Value;
|
||||
else
|
||||
my_bot->SetDrakkinTattoo(uvalue);
|
||||
@ -516,10 +516,10 @@ void bot_command_woad(Client *c, const Seperator *sep)
|
||||
uint8 uvalue = Strings::ToInt(sep->arg[1]);
|
||||
|
||||
auto fail_type = AFT_None;
|
||||
if (my_bot->GetRace() != BARBARIAN) {
|
||||
if (my_bot->GetRace() != Race::Barbarian) {
|
||||
fail_type = AFT_Race;
|
||||
}
|
||||
else if (!PlayerAppearance::IsValidWoad(my_bot->GetRace(), my_bot->GetGender(), uvalue)) {
|
||||
else if (!RaceAppearance::IsValidWoad(my_bot->GetRace(), my_bot->GetGender(), uvalue)) {
|
||||
fail_type = AFT_Value;
|
||||
}
|
||||
else {
|
||||
|
||||
@ -455,13 +455,13 @@ void bot_command_follow_distance(Client *c, const Seperator *sep)
|
||||
fmt::format("- You must use a value between 1 and {}.", RuleI(Bots, MaxFollowDistance))
|
||||
};
|
||||
p.example_format = { fmt::format("{} [reset]/[set [value]] [actionable]", sep->arg[0]) };
|
||||
p.examples_one = {
|
||||
"To set all bots to follow at a distance of 25:",
|
||||
fmt::format("{} set 25 spawned", sep->arg[0])
|
||||
p.examples_one = {
|
||||
"To set all bots to follow at a distance of 25:",
|
||||
fmt::format("{} set 25 spawned", sep->arg[0])
|
||||
};
|
||||
p.examples_two = {
|
||||
"To check the curret following distance of all bots:",
|
||||
fmt::format("{} current spawned", sep->arg[0])
|
||||
p.examples_two = {
|
||||
"To check the curret following distance of all bots:",
|
||||
fmt::format("{} current spawned", sep->arg[0])
|
||||
};
|
||||
p.examples_three =
|
||||
{
|
||||
@ -470,10 +470,10 @@ void bot_command_follow_distance(Client *c, const Seperator *sep)
|
||||
"{} reset byclass {}",
|
||||
sep->arg[0],
|
||||
Class::Wizard
|
||||
)
|
||||
)
|
||||
};
|
||||
p.actionables = { "target, byname, ownergroup, ownerraid, targetgroup, namesgroup, healrotationtargets, mmr, byclass, byrace, spawned" };
|
||||
|
||||
|
||||
std::string popup_text = c->SendBotCommandHelpWindow(p);
|
||||
popup_text = DialogueWindow::Table(popup_text);
|
||||
|
||||
@ -483,7 +483,7 @@ void bot_command_follow_distance(Client *c, const Seperator *sep)
|
||||
}
|
||||
|
||||
const int ab_mask = ActionableBots::ABM_Type2;
|
||||
|
||||
|
||||
uint32 bfd = RuleI(Bots, DefaultFollowDistance);
|
||||
bool set_flag = false;
|
||||
bool current_check = false;
|
||||
@ -862,7 +862,7 @@ void bot_command_report(Client *c, const Seperator *sep)
|
||||
c->Message(Chat::White, "usage: %s ([actionable: target | byname | ownergroup | ownerraid | targetgroup | namesgroup | healrotationmembers | healrotationtargets | mmr | byclass | byrace | spawned] ([actionable_name]))", sep->arg[0]);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const int ab_mask = ActionableBots::ABM_Type1;
|
||||
|
||||
std::string arg1 = sep->arg[1];
|
||||
@ -1057,7 +1057,7 @@ void bot_command_stance(Client *c, const Seperator *sep)
|
||||
BotCommandHelpParams p;
|
||||
|
||||
p.description = { "Change a bot's stance to control the way it behaves." };
|
||||
p.notes =
|
||||
p.notes =
|
||||
{
|
||||
"- Changing a stance will reset all settings to match that stance type.",
|
||||
"- Any changes made will only save to that stance for future use.",
|
||||
@ -1122,29 +1122,29 @@ void bot_command_stance(Client *c, const Seperator *sep)
|
||||
Stance::AEBurn
|
||||
)
|
||||
};
|
||||
p.example_format =
|
||||
p.example_format =
|
||||
{ fmt::format( "{} [current | value]", sep->arg[0]) };
|
||||
p.examples_one =
|
||||
{
|
||||
"To set all bots to BurnAE:",
|
||||
p.examples_one =
|
||||
{
|
||||
"To set all bots to BurnAE:",
|
||||
fmt::format("{} {} spawned {}",
|
||||
sep->arg[0],
|
||||
Stance::Aggressive,
|
||||
Class::ShadowKnight
|
||||
)
|
||||
};
|
||||
p.examples_two =
|
||||
{
|
||||
"To set all Shadowknights to Aggressive:",
|
||||
p.examples_two =
|
||||
{
|
||||
"To set all Shadowknights to Aggressive:",
|
||||
fmt::format("{} {} byclass {}",
|
||||
sep->arg[0],
|
||||
Stance::Aggressive,
|
||||
Class::ShadowKnight
|
||||
)
|
||||
};
|
||||
p.examples_three = {
|
||||
"To check the current stances of all bots:",
|
||||
fmt::format("{} current spawned", sep->arg[0])
|
||||
p.examples_three = {
|
||||
"To check the current stances of all bots:",
|
||||
fmt::format("{} current spawned", sep->arg[0])
|
||||
};
|
||||
|
||||
p.actionables = { "target, byname, ownergroup, ownerraid, targetgroup, namesgroup, healrotationtargets, mmr, byclass, byrace, spawned" };
|
||||
@ -1239,7 +1239,7 @@ void bot_command_stance(Client *c, const Seperator *sep)
|
||||
database.botdb.LoadBotSettings(bot_iter);
|
||||
|
||||
if (
|
||||
(bot_iter->GetClass() == Class::Warrior || bot_iter->GetClass() == Class::Paladin || bot_iter->GetClass() == Class::ShadowKnight) &&
|
||||
(bot_iter->GetClass() == Class::Warrior || bot_iter->GetClass() == Class::Paladin || bot_iter->GetClass() == Class::ShadowKnight) &&
|
||||
(bot_iter->GetBotStance() == Stance::Aggressive)
|
||||
) {
|
||||
bot_iter->SetTaunting(true);
|
||||
@ -1255,7 +1255,7 @@ void bot_command_stance(Client *c, const Seperator *sep)
|
||||
bot_iter->GetPet()->CastToNPC()->SetTaunting(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bot_iter->Save();
|
||||
++success_count;
|
||||
}
|
||||
@ -1431,7 +1431,7 @@ void bot_command_summon(Client *c, const Seperator *sep)
|
||||
c->Message(Chat::White, "usage: %s ([actionable: target | byname | ownergroup | ownerraid | targetgroup | namesgroup | healrotationtargets | mmr | byclass | byrace | spawned] ([actionable_name]))", sep->arg[0]);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const int ab_mask = ActionableBots::ABM_Type1;
|
||||
|
||||
std::string arg1 = sep->arg[1];
|
||||
@ -1550,7 +1550,7 @@ void bot_command_toggle_ranged(Client *c, const Seperator *sep)
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
std::string arg1 = sep->arg[1];
|
||||
|
||||
int ab_arg = 1;
|
||||
@ -1712,7 +1712,7 @@ void bot_command_toggle_helm(Client *c, const Seperator *sep)
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
std::string arg1 = sep->arg[1];
|
||||
|
||||
int ab_arg = 1;
|
||||
|
||||
@ -245,7 +245,7 @@ void bot_command_pet_set_type(Client *c, const Seperator *sep)
|
||||
|
||||
if (pet_type == 6 && RuleI(Bots, RequiredMagicianEpicPetItemID) > 0) {
|
||||
bool has_item = bot_iter->HasBotItem(RuleI(Bots, RequiredMagicianEpicPetItemID)) != INVALID_INDEX;
|
||||
|
||||
|
||||
if (!has_item) {
|
||||
c->Message(
|
||||
Chat::Say,
|
||||
@ -257,7 +257,7 @@ void bot_command_pet_set_type(Client *c, const Seperator *sep)
|
||||
);
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (current_check) {
|
||||
@ -313,7 +313,7 @@ void bot_command_pet_set_type(Client *c, const Seperator *sep)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!IsEffectInSpell(s.SpellId, SE_SummonPet)) {
|
||||
if (!IsEffectInSpell(s.SpellId, SpellEffect::SummonPet)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -401,7 +401,7 @@ void bot_command_pet_set_type(Client *c, const Seperator *sep)
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (success_count == 1 && first_found) {
|
||||
c->Message(
|
||||
Chat::Green,
|
||||
|
||||
@ -40,7 +40,7 @@ bool Bot::AICastSpell(Mob* tar, uint8 chance, uint16 spell_type, uint16 sub_targ
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if (
|
||||
!IsCommandedSpell() &&
|
||||
zone->random.Int(0, 100) > chance
|
||||
@ -240,7 +240,7 @@ bool Bot::AICastSpell(Mob* tar, uint8 chance, uint16 spell_type, uint16 sub_targ
|
||||
tar->GetCleanName()
|
||||
).c_str()
|
||||
);
|
||||
|
||||
|
||||
InterruptSpell();
|
||||
}
|
||||
|
||||
@ -297,7 +297,7 @@ bool Bot::BotCastMez(Mob* tar, uint8 bot_class, BotSpell& bot_spell, uint16 spel
|
||||
if (AIDoSpellCast(s.SpellIndex, tar, s.ManaCost)) {
|
||||
if (BotSpellTypeUsesTargetSettings(spell_type)) {
|
||||
SetCastedSpellType(UINT16_MAX);
|
||||
|
||||
|
||||
if (!IsCommandedSpell()) {
|
||||
SetBotSpellRecastTimer(spell_type, tar, true);
|
||||
}
|
||||
@ -384,7 +384,7 @@ bool Bot::BotCastPet(Mob* tar, uint8 bot_class, BotSpell& bot_spell, uint16 spel
|
||||
int familiar_buff_slot = -1;
|
||||
if (buffs_max && my_buffs) {
|
||||
for (int index = 0; index < buffs_max; ++index) {
|
||||
if (IsEffectInSpell(my_buffs[index].spellid, SE_Familiar)) {
|
||||
if (IsEffectInSpell(my_buffs[index].spellid, SpellEffect::Familiar)) {
|
||||
MakePet(my_buffs[index].spellid, spells[my_buffs[index].spellid].teleport_zone);
|
||||
familiar_buff_slot = index;
|
||||
break;
|
||||
@ -445,11 +445,11 @@ bool Bot::BotCastNuke(Mob* tar, uint8 bot_class, BotSpell& bot_spell, uint16 spe
|
||||
}
|
||||
|
||||
if (
|
||||
!tar->GetSpecialAbility(SpecialAbility::StunImmunity) &&
|
||||
!tar->GetSpecialAbility(SpecialAbility::StunImmunity) &&
|
||||
(
|
||||
IsCommandedSpell() ||
|
||||
IsCommandedSpell() ||
|
||||
(!tar->IsStunned() && (zone->random.Int(1, 100) <= stun_chance))
|
||||
)
|
||||
)
|
||||
) {
|
||||
bot_spell = GetBestBotSpellForStunByTargetType(this, ST_TargetOptional, spell_type, IsAEBotSpellType(spell_type), tar);
|
||||
}
|
||||
@ -1173,7 +1173,7 @@ BotSpell Bot::GetBestBotSpellForVeryFastHeal(Bot* caster, Mob* tar, uint16 spell
|
||||
result.ManaCost = 0;
|
||||
|
||||
if (caster) {
|
||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SE_CurrentHP);
|
||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SpellEffect::CurrentHP);
|
||||
|
||||
for (auto bot_spell_list_itr : bot_spell_list) {
|
||||
if (
|
||||
@ -1198,7 +1198,7 @@ BotSpell Bot::GetBestBotSpellForFastHeal(Bot* caster, Mob* tar, uint16 spell_typ
|
||||
result.ManaCost = 0;
|
||||
|
||||
if (caster) {
|
||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SE_CurrentHP);
|
||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SpellEffect::CurrentHP);
|
||||
|
||||
for (auto bot_spell_list_itr : bot_spell_list) {
|
||||
if (IsFastHealSpell(bot_spell_list_itr.SpellId) && caster->CastChecks(bot_spell_list_itr.SpellId, tar, spell_type)) {
|
||||
@ -1222,7 +1222,7 @@ BotSpell Bot::GetBestBotSpellForHealOverTime(Bot* caster, Mob* tar, uint16 spell
|
||||
result.ManaCost = 0;
|
||||
|
||||
if (caster) {
|
||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SE_HealOverTime);
|
||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SpellEffect::HealOverTime);
|
||||
|
||||
for (auto bot_spell_list_itr : bot_spell_list) {
|
||||
if (IsHealOverTimeSpell(bot_spell_list_itr.SpellId) && caster->CastChecks(bot_spell_list_itr.SpellId, tar, spell_type)) {
|
||||
@ -1278,7 +1278,7 @@ BotSpell Bot::GetBestBotSpellForRegularSingleTargetHeal(Bot* caster, Mob* tar, u
|
||||
result.ManaCost = 0;
|
||||
|
||||
if (caster) {
|
||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SE_CurrentHP);
|
||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SpellEffect::CurrentHP);
|
||||
|
||||
for (std::list<BotSpell>::iterator bot_spell_list_itr = bot_spell_list.begin(); bot_spell_list_itr != bot_spell_list.end(); ++bot_spell_list_itr) {
|
||||
if (IsRegularSingleTargetHealSpell(bot_spell_list_itr->SpellId) && caster->CastChecks(bot_spell_list_itr->SpellId, tar, spell_type)) {
|
||||
@ -1302,7 +1302,7 @@ BotSpell Bot::GetFirstBotSpellForSingleTargetHeal(Bot* caster, Mob* tar, uint16
|
||||
result.ManaCost = 0;
|
||||
|
||||
if (caster) {
|
||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SE_CurrentHP);
|
||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SpellEffect::CurrentHP);
|
||||
|
||||
for (std::list<BotSpell>::iterator bot_spell_list_itr = bot_spell_list.begin(); bot_spell_list_itr != bot_spell_list.end(); ++bot_spell_list_itr) {
|
||||
if (IsRegularSingleTargetHealSpell(bot_spell_list_itr->SpellId) && caster->CastChecks(bot_spell_list_itr->SpellId, tar, spell_type)) {
|
||||
@ -1329,7 +1329,7 @@ BotSpell Bot::GetBestBotSpellForGroupHeal(Bot* caster, Mob* tar, uint16 spell_ty
|
||||
return result;
|
||||
}
|
||||
|
||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SE_CurrentHP);
|
||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SpellEffect::CurrentHP);
|
||||
int target_count = 0;
|
||||
int required_count = caster->GetSpellTypeAEOrGroupTargetCount(spell_type);
|
||||
|
||||
@ -1367,7 +1367,7 @@ BotSpell Bot::GetBestBotSpellForGroupHealOverTime(Bot* caster, Mob* tar, uint16
|
||||
return result;
|
||||
}
|
||||
|
||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SE_HealOverTime);
|
||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SpellEffect::HealOverTime);
|
||||
int target_count = 0;
|
||||
int required_count = caster->GetSpellTypeAEOrGroupTargetCount(spell_type);
|
||||
|
||||
@ -1405,7 +1405,7 @@ BotSpell Bot::GetBestBotSpellForGroupCompleteHeal(Bot* caster, Mob* tar, uint16
|
||||
return result;
|
||||
}
|
||||
|
||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SE_CompleteHeal);
|
||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SpellEffect::CompleteHeal);
|
||||
int target_count = 0;
|
||||
int required_count = caster->GetSpellTypeAEOrGroupTargetCount(spell_type);
|
||||
|
||||
@ -1440,7 +1440,7 @@ BotSpell Bot::GetBestBotSpellForMez(Bot* caster, uint16 spell_type) {
|
||||
result.ManaCost = 0;
|
||||
|
||||
if (caster) {
|
||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SE_Mez);
|
||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SpellEffect::Mez);
|
||||
|
||||
for (std::list<BotSpell>::iterator bot_spell_list_itr = bot_spell_list.begin(); bot_spell_list_itr != bot_spell_list.end(); ++bot_spell_list_itr) {
|
||||
if (
|
||||
@ -1548,7 +1548,7 @@ BotSpell Bot::GetBestBotMagicianPetSpell(Bot* caster, uint16 spell_type) {
|
||||
result.ManaCost = 0;
|
||||
|
||||
if (caster) {
|
||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SE_SummonPet);
|
||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SpellEffect::SummonPet);
|
||||
std::string pet_type = GetBotMagicianPetType(caster);
|
||||
|
||||
for(std::list<BotSpell>::iterator bot_spell_list_itr = bot_spell_list.begin(); bot_spell_list_itr != bot_spell_list.end(); ++bot_spell_list_itr) {
|
||||
@ -1638,7 +1638,7 @@ std::string Bot::GetBotMagicianPetType(Bot* caster) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!IsEffectInSpell(s.SpellId, SE_SummonPet)) {
|
||||
if (!IsEffectInSpell(s.SpellId, SpellEffect::SummonPet)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -1683,7 +1683,7 @@ std::string Bot::GetBotMagicianPetType(Bot* caster) {
|
||||
if (bot_level >= water_min_level) {
|
||||
result = std::string("SumWater");
|
||||
}
|
||||
|
||||
|
||||
found = true;
|
||||
break;
|
||||
case SumFire:
|
||||
@ -1730,7 +1730,7 @@ BotSpell Bot::GetBestBotSpellForNukeByTargetType(Bot* caster, SpellTargetType ta
|
||||
}
|
||||
|
||||
if (caster) {
|
||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffectAndTargetType(caster, spell_type, SE_CurrentHP, target_type);
|
||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffectAndTargetType(caster, spell_type, SpellEffect::CurrentHP, target_type);
|
||||
|
||||
for(std::list<BotSpell>::iterator bot_spell_list_itr = bot_spell_list.begin(); bot_spell_list_itr != bot_spell_list.end(); ++bot_spell_list_itr) {
|
||||
if (IsPureNukeSpell(bot_spell_list_itr->SpellId) || IsDamageSpell(bot_spell_list_itr->SpellId)) {
|
||||
@ -1777,7 +1777,7 @@ BotSpell Bot::GetBestBotSpellForStunByTargetType(Bot* caster, SpellTargetType ta
|
||||
|
||||
if (caster)
|
||||
{
|
||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffectAndTargetType(caster, spell_type, SE_Stun, target_type);
|
||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffectAndTargetType(caster, spell_type, SpellEffect::Stun, target_type);
|
||||
|
||||
for(std::list<BotSpell>::iterator bot_spell_list_itr = bot_spell_list.begin(); bot_spell_list_itr != bot_spell_list.end(); ++bot_spell_list_itr)
|
||||
{
|
||||
@ -1835,7 +1835,7 @@ BotSpell Bot::GetBestBotWizardNukeSpellByTargetResists(Bot* caster, Mob* target,
|
||||
}
|
||||
|
||||
|
||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffectAndTargetType(caster, spell_type, SE_CurrentHP, ST_Target);
|
||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffectAndTargetType(caster, spell_type, SpellEffect::CurrentHP, ST_Target);
|
||||
|
||||
BotSpell first_wizard_magic_nuke_spell_found;
|
||||
first_wizard_magic_nuke_spell_found.SpellId = 0;
|
||||
@ -1855,32 +1855,32 @@ BotSpell Bot::GetBestBotWizardNukeSpellByTargetResists(Bot* caster, Mob* target,
|
||||
}
|
||||
else if (!select_lure_nuke && IsPureNukeSpell(bot_spell_list_itr->SpellId)) {
|
||||
if (
|
||||
((target->GetMR() < target->GetCR()) || (target->GetMR() < target->GetFR())) &&
|
||||
(GetSpellResistType(bot_spell_list_itr->SpellId) == RESIST_MAGIC) &&
|
||||
((target->GetMR() < target->GetCR()) || (target->GetMR() < target->GetFR())) &&
|
||||
(GetSpellResistType(bot_spell_list_itr->SpellId) == RESIST_MAGIC) &&
|
||||
(spells[bot_spell_list_itr->SpellId].resist_difficulty > lure_resis_value) &&
|
||||
caster->CastChecks(bot_spell_list_itr->SpellId, target, spell_type)
|
||||
) {
|
||||
spell_selected = true;
|
||||
}
|
||||
else if (
|
||||
((target->GetCR() < target->GetMR()) || (target->GetCR() < target->GetFR())) &&
|
||||
(GetSpellResistType(bot_spell_list_itr->SpellId) == RESIST_COLD) &&
|
||||
(spells[bot_spell_list_itr->SpellId].resist_difficulty > lure_resis_value) &&
|
||||
((target->GetCR() < target->GetMR()) || (target->GetCR() < target->GetFR())) &&
|
||||
(GetSpellResistType(bot_spell_list_itr->SpellId) == RESIST_COLD) &&
|
||||
(spells[bot_spell_list_itr->SpellId].resist_difficulty > lure_resis_value) &&
|
||||
caster->CastChecks(bot_spell_list_itr->SpellId, target, spell_type)
|
||||
) {
|
||||
spell_selected = true;
|
||||
}
|
||||
else if (
|
||||
((target->GetFR() < target->GetCR()) || (target->GetFR() < target->GetMR())) &&
|
||||
(GetSpellResistType(bot_spell_list_itr->SpellId) == RESIST_FIRE) &&
|
||||
(spells[bot_spell_list_itr->SpellId].resist_difficulty > lure_resis_value) &&
|
||||
((target->GetFR() < target->GetCR()) || (target->GetFR() < target->GetMR())) &&
|
||||
(GetSpellResistType(bot_spell_list_itr->SpellId) == RESIST_FIRE) &&
|
||||
(spells[bot_spell_list_itr->SpellId].resist_difficulty > lure_resis_value) &&
|
||||
caster->CastChecks(bot_spell_list_itr->SpellId, target, spell_type)
|
||||
) {
|
||||
spell_selected = true;
|
||||
}
|
||||
else if (
|
||||
(GetSpellResistType(bot_spell_list_itr->SpellId) == RESIST_MAGIC) &&
|
||||
(spells[bot_spell_list_itr->SpellId].resist_difficulty > lure_resis_value) &&
|
||||
(GetSpellResistType(bot_spell_list_itr->SpellId) == RESIST_MAGIC) &&
|
||||
(spells[bot_spell_list_itr->SpellId].resist_difficulty > lure_resis_value) &&
|
||||
caster->CastChecks(bot_spell_list_itr->SpellId, target, spell_type)
|
||||
) {
|
||||
first_wizard_magic_nuke_spell_found.SpellId = bot_spell_list_itr->SpellId;
|
||||
@ -1998,11 +1998,11 @@ BotSpell Bot::GetBestBotSpellForResistDebuff(Bot* caster, Mob *tar, uint16 spell
|
||||
if (
|
||||
(bot_spell_list[i].type == BotSpellTypes::Debuff || IsResistDebuffSpell(bot_spell_list[i].spellid)) &&
|
||||
(
|
||||
(needs_magic_resist_debuff && (IsEffectInSpell(bot_spell_list[i].spellid, SE_ResistMagic) || IsEffectInSpell(bot_spell_list[i].spellid, SE_ResistAll))) ||
|
||||
(needs_cold_resist_debuff && (IsEffectInSpell(bot_spell_list[i].spellid, SE_ResistCold) || IsEffectInSpell(bot_spell_list[i].spellid, SE_ResistAll))) ||
|
||||
(needs_fire_resist_debuff && (IsEffectInSpell(bot_spell_list[i].spellid, SE_ResistFire) || IsEffectInSpell(bot_spell_list[i].spellid, SE_ResistAll))) ||
|
||||
(needs_poison_resist_debuff && (IsEffectInSpell(bot_spell_list[i].spellid, SE_ResistPoison) || IsEffectInSpell(bot_spell_list[i].spellid, SE_ResistAll))) ||
|
||||
(needs_disease_resist_debuff && (IsEffectInSpell(bot_spell_list[i].spellid, SE_ResistDisease) || IsEffectInSpell(bot_spell_list[i].spellid, SE_ResistAll)))
|
||||
(needs_magic_resist_debuff && (IsEffectInSpell(bot_spell_list[i].spellid, SpellEffect::ResistMagic) || IsEffectInSpell(bot_spell_list[i].spellid, SpellEffect::ResistAll))) ||
|
||||
(needs_cold_resist_debuff && (IsEffectInSpell(bot_spell_list[i].spellid, SpellEffect::ResistCold) || IsEffectInSpell(bot_spell_list[i].spellid, SpellEffect::ResistAll))) ||
|
||||
(needs_fire_resist_debuff && (IsEffectInSpell(bot_spell_list[i].spellid, SpellEffect::ResistFire) || IsEffectInSpell(bot_spell_list[i].spellid, SpellEffect::ResistAll))) ||
|
||||
(needs_poison_resist_debuff && (IsEffectInSpell(bot_spell_list[i].spellid, SpellEffect::ResistPoison) || IsEffectInSpell(bot_spell_list[i].spellid, SpellEffect::ResistAll))) ||
|
||||
(needs_disease_resist_debuff && (IsEffectInSpell(bot_spell_list[i].spellid, SpellEffect::ResistDisease) || IsEffectInSpell(bot_spell_list[i].spellid, SpellEffect::ResistAll)))
|
||||
) &&
|
||||
!tar->IsImmuneToSpell(bot_spell_list[i].spellid, caster) &&
|
||||
tar->CanBuffStack(bot_spell_list[i].spellid, caster->GetLevel(), true) >= 0 &&
|
||||
@ -2033,7 +2033,7 @@ BotSpell Bot::GetBestBotSpellForCure(Bot* caster, Mob* tar, uint16 spell_type) {
|
||||
|
||||
if (caster) {
|
||||
std::vector<BotSpell_wPriority> bot_spell_list_itr = GetPrioritizedBotSpellsBySpellType(caster, spell_type, tar);
|
||||
|
||||
|
||||
if (IsGroupBotSpellType(spell_type)) {
|
||||
int count_needs_cured = 0;
|
||||
uint16 count_poisoned = 0;
|
||||
@ -2049,16 +2049,16 @@ BotSpell Bot::GetBestBotSpellForCure(Bot* caster, Mob* tar, uint16 spell_type) {
|
||||
for (Mob* m : (IsGroupBotSpellType(spell_type) ? caster->GetSpellTargetList() : caster->GetSpellTargetList(true))) {
|
||||
if (caster->GetNeedsCured(m)) {
|
||||
if (caster->CastChecks(itr->SpellId, m, spell_type, true, IsGroupBotSpellType(spell_type))) {
|
||||
if (m->FindType(SE_PoisonCounter)) {
|
||||
if (m->FindType(SpellEffect::PoisonCounter)) {
|
||||
++count_poisoned;
|
||||
}
|
||||
if (m->FindType(SE_DiseaseCounter)) {
|
||||
if (m->FindType(SpellEffect::DiseaseCounter)) {
|
||||
++count_diseased;
|
||||
}
|
||||
if (m->FindType(SE_CurseCounter)) {
|
||||
if (m->FindType(SpellEffect::CurseCounter)) {
|
||||
++count_cursed;
|
||||
}
|
||||
if (m->FindType(SE_CorruptionCounter)) {
|
||||
if (m->FindType(SpellEffect::CorruptionCounter)) {
|
||||
++count_corrupted;
|
||||
}
|
||||
}
|
||||
@ -2066,10 +2066,10 @@ BotSpell Bot::GetBestBotSpellForCure(Bot* caster, Mob* tar, uint16 spell_type) {
|
||||
}
|
||||
|
||||
if (
|
||||
(count_poisoned >= caster->GetSpellTypeAEOrGroupTargetCount(spell_type) && IsEffectInSpell(itr->SpellId, SE_PoisonCounter)) ||
|
||||
(count_diseased >= caster->GetSpellTypeAEOrGroupTargetCount(spell_type) && IsEffectInSpell(itr->SpellId, SE_DiseaseCounter)) ||
|
||||
(count_cursed >= caster->GetSpellTypeAEOrGroupTargetCount(spell_type) && IsEffectInSpell(itr->SpellId, SE_CurseCounter)) ||
|
||||
(count_corrupted >= caster->GetSpellTypeAEOrGroupTargetCount(spell_type) && IsEffectInSpell(itr->SpellId, SE_CorruptionCounter))
|
||||
(count_poisoned >= caster->GetSpellTypeAEOrGroupTargetCount(spell_type) && IsEffectInSpell(itr->SpellId, SpellEffect::PoisonCounter)) ||
|
||||
(count_diseased >= caster->GetSpellTypeAEOrGroupTargetCount(spell_type) && IsEffectInSpell(itr->SpellId, SpellEffect::DiseaseCounter)) ||
|
||||
(count_cursed >= caster->GetSpellTypeAEOrGroupTargetCount(spell_type) && IsEffectInSpell(itr->SpellId, SpellEffect::CurseCounter)) ||
|
||||
(count_corrupted >= caster->GetSpellTypeAEOrGroupTargetCount(spell_type) && IsEffectInSpell(itr->SpellId, SpellEffect::CorruptionCounter))
|
||||
) {
|
||||
result.SpellId = itr->SpellId;
|
||||
result.SpellIndex = itr->SpellIndex;
|
||||
@ -2086,10 +2086,10 @@ BotSpell Bot::GetBestBotSpellForCure(Bot* caster, Mob* tar, uint16 spell_type) {
|
||||
}
|
||||
|
||||
if (
|
||||
tar->FindType(SE_PoisonCounter) && IsEffectInSpell(itr->SpellId, SE_PoisonCounter) ||
|
||||
tar->FindType(SE_DiseaseCounter) && IsEffectInSpell(itr->SpellId, SE_DiseaseCounter) ||
|
||||
tar->FindType(SE_CurseCounter) && IsEffectInSpell(itr->SpellId, SE_CurseCounter) ||
|
||||
tar->FindType(SE_CorruptionCounter) && IsEffectInSpell(itr->SpellId, SE_CorruptionCounter)
|
||||
tar->FindType(SpellEffect::PoisonCounter) && IsEffectInSpell(itr->SpellId, SpellEffect::PoisonCounter) ||
|
||||
tar->FindType(SpellEffect::DiseaseCounter) && IsEffectInSpell(itr->SpellId, SpellEffect::DiseaseCounter) ||
|
||||
tar->FindType(SpellEffect::CurseCounter) && IsEffectInSpell(itr->SpellId, SpellEffect::CurseCounter) ||
|
||||
tar->FindType(SpellEffect::CorruptionCounter) && IsEffectInSpell(itr->SpellId, SpellEffect::CorruptionCounter)
|
||||
) {
|
||||
result.SpellId = itr->SpellId;
|
||||
result.SpellIndex = itr->SpellIndex;
|
||||
@ -2146,13 +2146,13 @@ uint8 Bot::GetChanceToCastBySpellType(uint16 spell_type)
|
||||
case BotSpellTypes::Dispel:
|
||||
return RuleI(Bots, PercentChanceToCastDispel);
|
||||
case BotSpellTypes::InCombatBuff:
|
||||
return RuleI(Bots, PercentChanceToCastInCombatBuff);
|
||||
return RuleI(Bots, PercentChanceToCastInCombatBuff);
|
||||
case BotSpellTypes::HateLine:
|
||||
return RuleI(Bots, PercentChanceToCastHateLine);
|
||||
case BotSpellTypes::Mez:
|
||||
return RuleI(Bots, PercentChanceToCastMez);
|
||||
return RuleI(Bots, PercentChanceToCastMez);
|
||||
case BotSpellTypes::Slow:
|
||||
return RuleI(Bots, PercentChanceToCastSlow);
|
||||
return RuleI(Bots, PercentChanceToCastSlow);
|
||||
case BotSpellTypes::Debuff:
|
||||
return RuleI(Bots, PercentChanceToCastDebuff);
|
||||
case BotSpellTypes::Cure:
|
||||
@ -2161,7 +2161,7 @@ uint8 Bot::GetChanceToCastBySpellType(uint16 spell_type)
|
||||
case BotSpellTypes::GroupCures:
|
||||
return RuleI(Bots, PercentChanceToCastGroupCure);
|
||||
case BotSpellTypes::HateRedux:
|
||||
return RuleI(Bots, PercentChanceToCastHateRedux);
|
||||
return RuleI(Bots, PercentChanceToCastHateRedux);
|
||||
case BotSpellTypes::Fear:
|
||||
return RuleI(Bots, PercentChanceToCastFear);
|
||||
case BotSpellTypes::RegularHeal:
|
||||
@ -2758,8 +2758,8 @@ bool Bot::IsValidSpellRange(uint16 spell_id, Mob* tar) {
|
||||
) {
|
||||
range = GetAOERange(spell_id);
|
||||
}
|
||||
|
||||
if (RuleB(Bots, EnableBotTGB) && IsTGBCompatibleSpell(spell_id) && IsGroupSpell(spell_id)) {
|
||||
|
||||
if (RuleB(Bots, EnableBotTGB) && IsTGBCompatibleSpell(spell_id) && IsGroupSpell(spell_id)) {
|
||||
range = spells[spell_id].aoe_range;
|
||||
}
|
||||
|
||||
@ -2838,7 +2838,7 @@ BotSpell Bot::GetBestBotSpellForRez(Bot* caster, Mob* target, uint16 spell_type)
|
||||
result.ManaCost = 0;
|
||||
|
||||
if (caster) {
|
||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SE_Revive);
|
||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SpellEffect::Revive);
|
||||
|
||||
for (std::list<BotSpell>::iterator bot_spell_list_itr = bot_spell_list.begin(); bot_spell_list_itr != bot_spell_list.end(); ++bot_spell_list_itr) {
|
||||
if (
|
||||
@ -2865,7 +2865,7 @@ BotSpell Bot::GetBestBotSpellForCharm(Bot* caster, Mob* target, uint16 spell_typ
|
||||
result.ManaCost = 0;
|
||||
|
||||
if (caster) {
|
||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SE_Charm);
|
||||
std::list<BotSpell> bot_spell_list = GetBotSpellsForSpellEffect(caster, spell_type, SpellEffect::Charm);
|
||||
|
||||
for (std::list<BotSpell>::iterator bot_spell_list_itr = bot_spell_list.begin(); bot_spell_list_itr != bot_spell_list.end(); ++bot_spell_list_itr) {
|
||||
if (
|
||||
|
||||
@ -1391,7 +1391,7 @@ void Client::ChannelMessageReceived(uint8 chan_num, uint8 language, uint8 lang_s
|
||||
}
|
||||
case ChatChannel_Shout: { /* Shout */
|
||||
Mob *sender = this;
|
||||
if (GetPet() && GetTarget() == GetPet() && GetPet()->FindType(SE_VoiceGraft))
|
||||
if (GetPet() && GetTarget() == GetPet() && GetPet()->FindType(SpellEffect::VoiceGraft))
|
||||
sender = GetPet();
|
||||
|
||||
entity_list.ChannelMessage(sender, chan_num, language, lang_skill, message);
|
||||
@ -1429,7 +1429,7 @@ void Client::ChannelMessageReceived(uint8 chan_num, uint8 language, uint8 lang_s
|
||||
else if(!RuleB(Chat, ServerWideAuction)) {
|
||||
Mob *sender = this;
|
||||
|
||||
if (GetPet() && GetTarget() == GetPet() && GetPet()->FindType(SE_VoiceGraft))
|
||||
if (GetPet() && GetTarget() == GetPet() && GetPet()->FindType(SpellEffect::VoiceGraft))
|
||||
sender = GetPet();
|
||||
|
||||
entity_list.ChannelMessage(sender, chan_num, language, lang_skill, message);
|
||||
@ -1476,7 +1476,7 @@ void Client::ChannelMessageReceived(uint8 chan_num, uint8 language, uint8 lang_s
|
||||
{
|
||||
Mob *sender = this;
|
||||
|
||||
if (GetPet() && GetTarget() == GetPet() && GetPet()->FindType(SE_VoiceGraft))
|
||||
if (GetPet() && GetTarget() == GetPet() && GetPet()->FindType(SpellEffect::VoiceGraft))
|
||||
sender = GetPet();
|
||||
|
||||
entity_list.ChannelMessage(sender, chan_num, language, lang_skill, message);
|
||||
@ -1606,7 +1606,7 @@ void Client::ChannelMessageReceived(uint8 chan_num, uint8 language, uint8 lang_s
|
||||
}
|
||||
|
||||
Mob* sender = this;
|
||||
if (GetPet() && GetTarget() == GetPet() && GetPet()->FindType(SE_VoiceGraft)) {
|
||||
if (GetPet() && GetTarget() == GetPet() && GetPet()->FindType(SpellEffect::VoiceGraft)) {
|
||||
sender = GetPet();
|
||||
}
|
||||
|
||||
@ -6907,7 +6907,7 @@ void Client::CheckLDoNHail(NPC* n)
|
||||
auto pet = GetPet();
|
||||
if (pet) {
|
||||
if (pet->GetPetType() == PetType::Charmed) {
|
||||
pet->BuffFadeByEffect(SE_Charm);
|
||||
pet->BuffFadeByEffect(SpellEffect::Charm);
|
||||
} else if (pet->GetPetType() == PetType::Follow) {
|
||||
pet->SetOwnerID(0);
|
||||
} else {
|
||||
@ -8445,7 +8445,7 @@ void Client::MerchantRejectMessage(Mob *merchant, int primaryfaction)
|
||||
merchant->SayString(zone->random.Int(WONT_SELL_DEEDS1, WONT_SELL_DEEDS6));
|
||||
} else if (lowestvalue == fmod.race_mod) { // race biggest
|
||||
// Non-standard race (ex. illusioned to wolf)
|
||||
if (GetRace() > PLAYER_RACE_COUNT) {
|
||||
if (!IsPlayerRace(GetRace())) {
|
||||
messageid = zone->random.Int(1, 3); // these aren't sequential StringIDs :(
|
||||
switch (messageid) {
|
||||
case 1:
|
||||
@ -10658,7 +10658,7 @@ void Client::MovePCDynamicZone(const std::string& zone_name, int zone_version, b
|
||||
}
|
||||
|
||||
void Client::Fling(float value, float target_x, float target_y, float target_z, bool ignore_los, bool clip_through_walls, bool calculate_speed) {
|
||||
BuffFadeByEffect(SE_Levitate);
|
||||
BuffFadeByEffect(SpellEffect::Levitate);
|
||||
if (CheckLosFN(target_x, target_y, target_z, 6.0f) || ignore_los) {
|
||||
auto p = new EQApplicationPacket(OP_Fling, sizeof(fling_struct));
|
||||
auto* f = (fling_struct*) p->pBuffer;
|
||||
@ -10723,7 +10723,7 @@ std::vector<int> Client::GetLearnableDisciplines(uint8 min_level, uint8 max_leve
|
||||
continue;
|
||||
}
|
||||
|
||||
if (RuleB(Spells, UseCHAScribeHack) && spells[spell_id].effect_id[EFFECT_COUNT - 1] == SE_CHA) {
|
||||
if (RuleB(Spells, UseCHAScribeHack) && spells[spell_id].effect_id[EFFECT_COUNT - 1] == SpellEffect::CHA) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -10794,7 +10794,7 @@ std::vector<int> Client::GetScribeableSpells(uint8 min_level, uint8 max_level) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (RuleB(Spells, UseCHAScribeHack) && spells[spell_id].effect_id[EFFECT_COUNT - 1] == SE_CHA) {
|
||||
if (RuleB(Spells, UseCHAScribeHack) && spells[spell_id].effect_id[EFFECT_COUNT - 1] == SpellEffect::CHA) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -11436,7 +11436,7 @@ void Client::SummonBaggedItems(uint32 bag_item_id, const std::vector<LootItem>&
|
||||
return;
|
||||
}
|
||||
|
||||
// todo: maybe some common functions for SE_SummonItem and SE_SummonItemIntoBag
|
||||
// todo: maybe some common functions for SpellEffect::SummonItem and SpellEffect::SummonItemIntoBag
|
||||
|
||||
const EQ::ItemData* bag_item = database.GetItem(bag_item_id);
|
||||
if (!bag_item)
|
||||
|
||||
@ -693,7 +693,7 @@ int64 Client::CalcManaRegen(bool bCombat)
|
||||
}
|
||||
|
||||
regen += aabonuses.ManaRegen;
|
||||
// add in + 1 bonus for SE_CompleteHeal, but we don't do anything for it yet?
|
||||
// add in + 1 bonus for SpellEffect::CompleteHeal, but we don't do anything for it yet?
|
||||
|
||||
int item_bonus = itembonuses.ManaRegen; // this is capped already
|
||||
item_bonus += itembonuses.heroic_mana_regen;
|
||||
@ -1011,52 +1011,52 @@ int32 Client::CalcMR()
|
||||
{
|
||||
//racial bases
|
||||
switch (GetBaseRace()) {
|
||||
case HUMAN:
|
||||
case Race::Human:
|
||||
MR = 25;
|
||||
break;
|
||||
case BARBARIAN:
|
||||
case Race::Barbarian:
|
||||
MR = 25;
|
||||
break;
|
||||
case ERUDITE:
|
||||
case Race::Erudite:
|
||||
MR = 30;
|
||||
break;
|
||||
case WOOD_ELF:
|
||||
case Race::WoodElf:
|
||||
MR = 25;
|
||||
break;
|
||||
case HIGH_ELF:
|
||||
case Race::HighElf:
|
||||
MR = 25;
|
||||
break;
|
||||
case DARK_ELF:
|
||||
case Race::DarkElf:
|
||||
MR = 25;
|
||||
break;
|
||||
case HALF_ELF:
|
||||
case Race::HalfElf:
|
||||
MR = 25;
|
||||
break;
|
||||
case DWARF:
|
||||
case Race::Dwarf:
|
||||
MR = 30;
|
||||
break;
|
||||
case TROLL:
|
||||
case Race::Troll:
|
||||
MR = 25;
|
||||
break;
|
||||
case OGRE:
|
||||
case Race::Ogre:
|
||||
MR = 25;
|
||||
break;
|
||||
case HALFLING:
|
||||
case Race::Halfling:
|
||||
MR = 25;
|
||||
break;
|
||||
case GNOME:
|
||||
case Race::Gnome:
|
||||
MR = 25;
|
||||
break;
|
||||
case IKSAR:
|
||||
case Race::Iksar:
|
||||
MR = 25;
|
||||
break;
|
||||
case VAHSHIR:
|
||||
case Race::VahShir:
|
||||
MR = 25;
|
||||
break;
|
||||
case FROGLOK:
|
||||
case Race::Froglok2:
|
||||
MR = 30;
|
||||
break;
|
||||
case DRAKKIN:
|
||||
case Race::Drakkin:
|
||||
{
|
||||
MR = 25;
|
||||
if (GetDrakkinHeritage() == 2)
|
||||
@ -1085,52 +1085,52 @@ int32 Client::CalcFR()
|
||||
{
|
||||
//racial bases
|
||||
switch (GetBaseRace()) {
|
||||
case HUMAN:
|
||||
case Race::Human:
|
||||
FR = 25;
|
||||
break;
|
||||
case BARBARIAN:
|
||||
case Race::Barbarian:
|
||||
FR = 25;
|
||||
break;
|
||||
case ERUDITE:
|
||||
case Race::Erudite:
|
||||
FR = 25;
|
||||
break;
|
||||
case WOOD_ELF:
|
||||
case Race::WoodElf:
|
||||
FR = 25;
|
||||
break;
|
||||
case HIGH_ELF:
|
||||
case Race::HighElf:
|
||||
FR = 25;
|
||||
break;
|
||||
case DARK_ELF:
|
||||
case Race::DarkElf:
|
||||
FR = 25;
|
||||
break;
|
||||
case HALF_ELF:
|
||||
case Race::HalfElf:
|
||||
FR = 25;
|
||||
break;
|
||||
case DWARF:
|
||||
case Race::Dwarf:
|
||||
FR = 25;
|
||||
break;
|
||||
case TROLL:
|
||||
case Race::Troll:
|
||||
FR = 5;
|
||||
break;
|
||||
case OGRE:
|
||||
case Race::Ogre:
|
||||
FR = 25;
|
||||
break;
|
||||
case HALFLING:
|
||||
case Race::Halfling:
|
||||
FR = 25;
|
||||
break;
|
||||
case GNOME:
|
||||
case Race::Gnome:
|
||||
FR = 25;
|
||||
break;
|
||||
case IKSAR:
|
||||
case Race::Iksar:
|
||||
FR = 30;
|
||||
break;
|
||||
case VAHSHIR:
|
||||
case Race::VahShir:
|
||||
FR = 25;
|
||||
break;
|
||||
case FROGLOK:
|
||||
case Race::Froglok2:
|
||||
FR = 25;
|
||||
break;
|
||||
case DRAKKIN:
|
||||
case Race::Drakkin:
|
||||
{
|
||||
FR = 25;
|
||||
if (GetDrakkinHeritage() == 0)
|
||||
@ -1171,52 +1171,52 @@ int32 Client::CalcDR()
|
||||
{
|
||||
//racial bases
|
||||
switch (GetBaseRace()) {
|
||||
case HUMAN:
|
||||
case Race::Human:
|
||||
DR = 15;
|
||||
break;
|
||||
case BARBARIAN:
|
||||
case Race::Barbarian:
|
||||
DR = 15;
|
||||
break;
|
||||
case ERUDITE:
|
||||
case Race::Erudite:
|
||||
DR = 10;
|
||||
break;
|
||||
case WOOD_ELF:
|
||||
case Race::WoodElf:
|
||||
DR = 15;
|
||||
break;
|
||||
case HIGH_ELF:
|
||||
case Race::HighElf:
|
||||
DR = 15;
|
||||
break;
|
||||
case DARK_ELF:
|
||||
case Race::DarkElf:
|
||||
DR = 15;
|
||||
break;
|
||||
case HALF_ELF:
|
||||
case Race::HalfElf:
|
||||
DR = 15;
|
||||
break;
|
||||
case DWARF:
|
||||
case Race::Dwarf:
|
||||
DR = 15;
|
||||
break;
|
||||
case TROLL:
|
||||
case Race::Troll:
|
||||
DR = 15;
|
||||
break;
|
||||
case OGRE:
|
||||
case Race::Ogre:
|
||||
DR = 15;
|
||||
break;
|
||||
case HALFLING:
|
||||
case Race::Halfling:
|
||||
DR = 20;
|
||||
break;
|
||||
case GNOME:
|
||||
case Race::Gnome:
|
||||
DR = 15;
|
||||
break;
|
||||
case IKSAR:
|
||||
case Race::Iksar:
|
||||
DR = 15;
|
||||
break;
|
||||
case VAHSHIR:
|
||||
case Race::VahShir:
|
||||
DR = 15;
|
||||
break;
|
||||
case FROGLOK:
|
||||
case Race::Froglok2:
|
||||
DR = 15;
|
||||
break;
|
||||
case DRAKKIN:
|
||||
case Race::Drakkin:
|
||||
{
|
||||
DR = 15;
|
||||
if (GetDrakkinHeritage() == 1)
|
||||
@ -1263,52 +1263,52 @@ int32 Client::CalcPR()
|
||||
{
|
||||
//racial bases
|
||||
switch (GetBaseRace()) {
|
||||
case HUMAN:
|
||||
case Race::Human:
|
||||
PR = 15;
|
||||
break;
|
||||
case BARBARIAN:
|
||||
case Race::Barbarian:
|
||||
PR = 15;
|
||||
break;
|
||||
case ERUDITE:
|
||||
case Race::Erudite:
|
||||
PR = 15;
|
||||
break;
|
||||
case WOOD_ELF:
|
||||
case Race::WoodElf:
|
||||
PR = 15;
|
||||
break;
|
||||
case HIGH_ELF:
|
||||
case Race::HighElf:
|
||||
PR = 15;
|
||||
break;
|
||||
case DARK_ELF:
|
||||
case Race::DarkElf:
|
||||
PR = 15;
|
||||
break;
|
||||
case HALF_ELF:
|
||||
case Race::HalfElf:
|
||||
PR = 15;
|
||||
break;
|
||||
case DWARF:
|
||||
case Race::Dwarf:
|
||||
PR = 20;
|
||||
break;
|
||||
case TROLL:
|
||||
case Race::Troll:
|
||||
PR = 15;
|
||||
break;
|
||||
case OGRE:
|
||||
case Race::Ogre:
|
||||
PR = 15;
|
||||
break;
|
||||
case HALFLING:
|
||||
case Race::Halfling:
|
||||
PR = 20;
|
||||
break;
|
||||
case GNOME:
|
||||
case Race::Gnome:
|
||||
PR = 15;
|
||||
break;
|
||||
case IKSAR:
|
||||
case Race::Iksar:
|
||||
PR = 15;
|
||||
break;
|
||||
case VAHSHIR:
|
||||
case Race::VahShir:
|
||||
PR = 15;
|
||||
break;
|
||||
case FROGLOK:
|
||||
case Race::Froglok2:
|
||||
PR = 30;
|
||||
break;
|
||||
case DRAKKIN:
|
||||
case Race::Drakkin:
|
||||
{
|
||||
PR = 15;
|
||||
if (GetDrakkinHeritage() == 3)
|
||||
@ -1355,52 +1355,52 @@ int32 Client::CalcCR()
|
||||
{
|
||||
//racial bases
|
||||
switch (GetBaseRace()) {
|
||||
case HUMAN:
|
||||
case Race::Human:
|
||||
CR = 25;
|
||||
break;
|
||||
case BARBARIAN:
|
||||
case Race::Barbarian:
|
||||
CR = 35;
|
||||
break;
|
||||
case ERUDITE:
|
||||
case Race::Erudite:
|
||||
CR = 25;
|
||||
break;
|
||||
case WOOD_ELF:
|
||||
case Race::WoodElf:
|
||||
CR = 25;
|
||||
break;
|
||||
case HIGH_ELF:
|
||||
case Race::HighElf:
|
||||
CR = 25;
|
||||
break;
|
||||
case DARK_ELF:
|
||||
case Race::DarkElf:
|
||||
CR = 25;
|
||||
break;
|
||||
case HALF_ELF:
|
||||
case Race::HalfElf:
|
||||
CR = 25;
|
||||
break;
|
||||
case DWARF:
|
||||
case Race::Dwarf:
|
||||
CR = 25;
|
||||
break;
|
||||
case TROLL:
|
||||
case Race::Troll:
|
||||
CR = 25;
|
||||
break;
|
||||
case OGRE:
|
||||
case Race::Ogre:
|
||||
CR = 25;
|
||||
break;
|
||||
case HALFLING:
|
||||
case Race::Halfling:
|
||||
CR = 25;
|
||||
break;
|
||||
case GNOME:
|
||||
case Race::Gnome:
|
||||
CR = 25;
|
||||
break;
|
||||
case IKSAR:
|
||||
case Race::Iksar:
|
||||
CR = 15;
|
||||
break;
|
||||
case VAHSHIR:
|
||||
case Race::VahShir:
|
||||
CR = 25;
|
||||
break;
|
||||
case FROGLOK:
|
||||
case Race::Froglok2:
|
||||
CR = 25;
|
||||
break;
|
||||
case DRAKKIN:
|
||||
case Race::Drakkin:
|
||||
{
|
||||
CR = 25;
|
||||
if (GetDrakkinHeritage() == 4)
|
||||
@ -1482,24 +1482,24 @@ uint32 Mob::GetInstrumentMod(uint16 spell_id)
|
||||
Bard Spell Effects
|
||||
|
||||
Mod uses the highest bonus from either of these for each instrument
|
||||
SPA 179 SE_AllInstrumentMod is used for instrument spellbonus.______Mod. This applies to ALL instrument mods (Puretones Discipline)
|
||||
SPA 260 SE_AddSingingMod is used for instrument spellbonus.______Mod. This applies to indiviual instrument mods. (Instrument mastery AA)
|
||||
SPA 179 SpellEffect::AllInstrumentMod is used for instrument spellbonus.______Mod. This applies to ALL instrument mods (Puretones Discipline)
|
||||
SPA 260 SpellEffect::AddSingingMod is used for instrument spellbonus.______Mod. This applies to indiviual instrument mods. (Instrument mastery AA)
|
||||
-Example usage: From AA a value of 4 = 40%
|
||||
|
||||
SPA 118 SE_Amplification is a stackable singing mod, on live it exists as both spell and AA bonus (stackable)
|
||||
SPA 118 SpellEffect::Amplification is a stackable singing mod, on live it exists as both spell and AA bonus (stackable)
|
||||
- Live Behavior: Amplifcation can be modified by singing mods and amplification itself, thus on the second cast of Amplification you will recieve
|
||||
the mod from the first cast, this continues until you reach the song mod cap.
|
||||
|
||||
SPA 261 SE_SongModCap raises song focus cap (No longer used on live)
|
||||
SPA 270 SE_BardSongRange increase range of beneficial bard songs (Sionachie's Crescendo)
|
||||
SPA 261 SpellEffect::SongModCap raises song focus cap (No longer used on live)
|
||||
SPA 270 SpellEffect::BardSongRange increase range of beneficial bard songs (Sionachie's Crescendo)
|
||||
|
||||
SPA 413 SE_FcBaseEffects focus effect that replaced item instrument mods
|
||||
SPA 413 SpellEffect::FcBaseEffects focus effect that replaced item instrument mods
|
||||
|
||||
Issues 10-15-21:
|
||||
Bonuses are not applied, unless song is stopped and restarted due to pulse keeping it continues. -> Need to recode songs to recast when duration ends.
|
||||
|
||||
Formula Live Bards:
|
||||
mod = (10 + (aabonus.____Mod [SPA 260 AA Instrument Mastery]) + (SE_FcBaseEffect[SPA 413])/10 + (spellbonus.______Mod [SPA 179 Puretone Disc]) + (Amplication [SPA 118])/10
|
||||
mod = (10 + (aabonus.____Mod [SPA 260 AA Instrument Mastery]) + (SpellEffect::FcBaseEffect[SPA 413])/10 + (spellbonus.______Mod [SPA 179 Puretone Disc]) + (Amplication [SPA 118])/10
|
||||
|
||||
TODO: Spell Table Fields that need to be implemented
|
||||
Field 225 //float base_effects_focus_slope; // -- BASE_EFFECTS_FOCUS_SLOPE
|
||||
@ -1567,7 +1567,7 @@ uint32 Mob::GetInstrumentMod(uint16 spell_id)
|
||||
else
|
||||
effectmod = spellbonuses.singingMod;
|
||||
if (IsBardSong(spell_id))
|
||||
effectmod += aabonuses.singingMod + (spellbonuses.Amplification + itembonuses.Amplification + aabonuses.Amplification); //SPA 118 SE_Amplification
|
||||
effectmod += aabonuses.singingMod + (spellbonuses.Amplification + itembonuses.Amplification + aabonuses.Amplification); //SPA 118 SpellEffect::Amplification
|
||||
break;
|
||||
default:
|
||||
effectmod = 10;
|
||||
@ -1584,7 +1584,7 @@ uint32 Mob::GetInstrumentMod(uint16 spell_id)
|
||||
|
||||
if (effectmodcap) {
|
||||
|
||||
effectmodcap += aabonuses.songModCap + spellbonuses.songModCap + itembonuses.songModCap; //SPA 261 SE_SongModCap (not used on live)
|
||||
effectmodcap += aabonuses.songModCap + spellbonuses.songModCap + itembonuses.songModCap; //SPA 261 SpellEffect::SongModCap (not used on live)
|
||||
|
||||
//Incase a negative modifier is used.
|
||||
if (effectmodcap <= 0) {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1571,7 +1571,7 @@ void Client::OPMoveCoin(const EQApplicationPacket* app)
|
||||
if (from_bucket == &m_pp.platinum_shared)
|
||||
amount_to_add = 0 - amount_to_take;
|
||||
|
||||
database.SetSharedPlatinum(AccountID(),amount_to_add);
|
||||
database.AddSharedPlatinum(AccountID(),amount_to_add);
|
||||
}
|
||||
}
|
||||
else{
|
||||
@ -1648,7 +1648,7 @@ void Client::OPGMTraining(const EQApplicationPacket *app)
|
||||
//#pragma GCC push_options
|
||||
//#pragma GCC optimize ("O0")
|
||||
for (int sk = EQ::skills::Skill1HBlunt; sk <= EQ::skills::HIGHEST_SKILL; ++sk) {
|
||||
if (sk == EQ::skills::SkillTinkering && GetRace() != GNOME) {
|
||||
if (sk == EQ::skills::SkillTinkering && GetRace() != Race::Gnome) {
|
||||
gmtrain->skills[sk] = 0; //Non gnomes can't tinker!
|
||||
} else {
|
||||
gmtrain->skills[sk] = GetMaxSkillAfterSpecializationRules((EQ::skills::SkillType)sk, MaxSkill((EQ::skills::SkillType)sk, GetClass(), RuleI(Character, MaxLevel)));
|
||||
|
||||
148
zone/common.h
148
zone/common.h
@ -53,50 +53,50 @@ namespace Archetype {
|
||||
#define SHIELD_ABILITY_RECAST_TIME 180
|
||||
|
||||
typedef enum { //focus types
|
||||
focusSpellHaste = 1, //@Fc, SPA: 127, SE_IncreaseSpellHaste, On Caster, cast time mod pct, base: pct
|
||||
focusSpellDuration, //@Fc, SPA: 128, SE_IncreaseSpellDuration, On Caster, spell duration mod pct, base: pct
|
||||
focusRange, //@Fc, SPA: 129, SE_IncreaseRange, On Caster, spell range mod pct, base: pct
|
||||
focusReagentCost, //@Fc, SPA: 131, SE_ReduceReagentCost, On Caster, do not consume reagent pct chance, base: min pct, limit: max pct
|
||||
focusManaCost, //@Fc, SPA: 132, SE_ReduceManaCost, On Caster, reduce mana cost by pct, base: min pct, limt: max pct
|
||||
focusImprovedHeal, //@Fc, SPA: 125, SE_ImprovedHeal, On Caster, spell healing mod pct, base: min pct, limit: max pct
|
||||
focusImprovedDamage, //@Fc, SPA: 124, SE_ImprovedDamage, On Caster, spell damage mod pct, base: min pct, limit: max pct
|
||||
focusImprovedDamage2, //@Fc, SPA: 461, SE_ImprovedDamage2, On Caster, spell damage mod pct, base: min pct, limit: max pct
|
||||
focusFcDamagePctCrit, //@Fc, SPA: 302, SE_FcDamagePctCrit, On Caster, spell damage mod pct, base: min pct, limit: max pct
|
||||
focusPetPower, //@Fc, SPA: 167, SE_PetPowerIncrease, On Caster, pet power mod, base: value
|
||||
focusResistRate, //@Fc, SPA: 126, SE_SpellResistReduction, On Caster, casted spell resist mod pct, base: min pct, limit: max pct
|
||||
focusSpellHateMod, //@Fc, SPA: 130, SE_SpellHateMod, On Caster, spell hate mod pct, base: min pct, limit: max pct
|
||||
focusTriggerOnCast, //@Fc, SPA: 339, SE_TriggerOnCast, On Caster, cast on spell use, base: chance pct limit: spellid
|
||||
focusSpellVulnerability, //@Fc, SPA: 296, SE_FcSpellVulnerability, On Target, spell damage taken mod pct, base: min pct, limit: max pct
|
||||
focusFcSpellDamagePctIncomingPC, //@Fc, SPA: 483, SE_Fc_Spell_Damage_Pct_IncomingPC, On Target, spell damage taken mod pct, base: min pct, limit: max pct
|
||||
focusTwincast, //@Fc, SPA: 399, SE_FcTwincast, On Caster, chance cast spell twice, base: chance pct
|
||||
focusSympatheticProc, //@Fc, SPA: 383, SE_SympatheticProc, On Caster, cast on spell use, base: variable proc chance on cast time, limit: spellid
|
||||
focusFcDamageAmt, //@Fc, SPA: 286, SE_FcDamageAmt, On Caster, spell damage mod flat amt, base: amt
|
||||
focusFcDamageAmt2, //@Fc, SPA: 462, SE_FcDamageAmt2, On Caster, spell damage mod flat amt, base: amt
|
||||
focusFcDamageAmtCrit, //@Fc, SPA: 303, SE_FFcDamageAmtCrit, On Caster, spell damage mod flat amt, base: amt
|
||||
focusSpellDurByTic, //@Fc, SPA: 287, SE_SpellDurationIncByTic, On Caster, spell buff duration mod, base: tics
|
||||
focusSwarmPetDuration, //@Fc, SPA: 398, SE_SwarmPetDuration, On Caster, swarm pet duration mod, base: milliseconds
|
||||
focusReduceRecastTime, //@Fc, SPA: 310, SE_ReduceReuseTimer, On Caster, disc reuse time mod, base: milliseconds
|
||||
focusBlockNextSpell, //@Fc, SPA: 335, SE_BlockNextSpellFocus, On Caster, chance to block next spell, base: chance
|
||||
focusFcHealPctIncoming, //@Fc, SPA: 393, SE_FcHealPctIncoming, On Target, heal received mod pct, base: pct
|
||||
focusFcDamageAmtIncoming, //@Fc, SPA: 297, SE_FcDamageAmtIncoming, On Target, damage taken flat amt, base: amt
|
||||
focusFcSpellDamageAmtIncomingPC, //@Fc, SPA: 484, SE_Fc_Spell_Damage_Amt_IncomingPC, On Target, damage taken flat amt, base: amt
|
||||
focusFcCastSpellOnLand, //@Fc, SPA: 481, SE_Fc_Cast_Spell_On_Land, On Target, cast spell if hit by spell, base: chance pct, limit: spellid
|
||||
focusFcHealAmtIncoming, //@Fc, SPA: 394, SE_FcHealAmtIncoming, On Target, heal received mod flat amt, base: amt
|
||||
focusFcBaseEffects, //@Fc, SPA: 413, SE_FcBaseEffects, On Caster, base spell effectiveness mod pct, base: pct
|
||||
focusIncreaseNumHits, //@Fc, SPA: 421, SE_FcIncreaseNumHits, On Caster, numhits mod flat amt, base: amt
|
||||
focusFcLimitUse, //@Fc, SPA: 420, SE_FcLimitUse, On Caster, numhits mod pct, base: pct
|
||||
focusFcMute, //@Fc, SPA: 357, SE_FcMute, On Caster, prevents spell casting, base: chance pct
|
||||
focusFcTimerRefresh, //@Fc, SPA: 389, SE_FcTimerRefresh, On Caster, reset spell recast timer, base: 1
|
||||
focusFcTimerLockout, //@Fc, SPA: 390, SE_FcTimerLockout, On Caster, set a spell to be on recast timer, base: recast duration milliseconds
|
||||
focusFcStunTimeMod, //@Fc, SPA: 133, SE_FcStunTimeMod, On Caster, stun time mod pct, base: chance pct
|
||||
focusFcResistIncoming, //@Fc, SPA: 510, SE_Fc_Resist_Incoming, On Target, resist modifier, base: amt
|
||||
focusFcAmplifyMod, //@Fc, SPA: 507, SE_Fc_Amplify_Mod, On Caster, damage-heal-dot mod pct, base: pct
|
||||
focusFcAmplifyAmt, //@Fc, SPA: 508, SE_Fc_Amplify_Amt, On Caster, damage-heal-dot mod flat amt, base: amt
|
||||
focusFcCastTimeMod2, //@Fc, SPA: 500, SE_Fc_CastTimeMod2, On Caster, cast time mod pct, base: pct
|
||||
focusFcCastTimeAmt, //@Fc, SPA: 501, SE_Fc_CastTimeAmt, On Caster, cast time mod flat amt, base: milliseconds
|
||||
focusFcHealPctCritIncoming, //@Fc, SPA: 395, SE_FcHealPctCritIncoming, On Target, spell healing mod pct, base: pct
|
||||
focusFcHealAmt, //@Fc, SPA: 392, SE_FcHealAmt, On Caster, spell healing mod flat amt, base: amt
|
||||
focusFcHealAmtCrit, //@Fc, SPA: 396, SE_FcHealAmtCrit, On Caster, spell healing mod flat amt, base: amt
|
||||
focusSpellHaste = 1, //@Fc, SPA: 127, SpellEffect::IncreaseSpellHaste, On Caster, cast time mod pct, base: pct
|
||||
focusSpellDuration, //@Fc, SPA: 128, SpellEffect::IncreaseSpellDuration, On Caster, spell duration mod pct, base: pct
|
||||
focusRange, //@Fc, SPA: 129, SpellEffect::IncreaseRange, On Caster, spell range mod pct, base: pct
|
||||
focusReagentCost, //@Fc, SPA: 131, SpellEffect::ReduceReagentCost, On Caster, do not consume reagent pct chance, base: min pct, limit: max pct
|
||||
focusManaCost, //@Fc, SPA: 132, SpellEffect::ReduceManaCost, On Caster, reduce mana cost by pct, base: min pct, limt: max pct
|
||||
focusImprovedHeal, //@Fc, SPA: 125, SpellEffect::ImprovedHeal, On Caster, spell healing mod pct, base: min pct, limit: max pct
|
||||
focusImprovedDamage, //@Fc, SPA: 124, SpellEffect::ImprovedDamage, On Caster, spell damage mod pct, base: min pct, limit: max pct
|
||||
focusImprovedDamage2, //@Fc, SPA: 461, SpellEffect::ImprovedDamage2, On Caster, spell damage mod pct, base: min pct, limit: max pct
|
||||
focusFcDamagePctCrit, //@Fc, SPA: 302, SpellEffect::FcDamagePctCrit, On Caster, spell damage mod pct, base: min pct, limit: max pct
|
||||
focusPetPower, //@Fc, SPA: 167, SpellEffect::PetPowerIncrease, On Caster, pet power mod, base: value
|
||||
focusResistRate, //@Fc, SPA: 126, SpellEffect::SpellResistReduction, On Caster, casted spell resist mod pct, base: min pct, limit: max pct
|
||||
focusSpellHateMod, //@Fc, SPA: 130, SpellEffect::SpellHateMod, On Caster, spell hate mod pct, base: min pct, limit: max pct
|
||||
focusTriggerOnCast, //@Fc, SPA: 339, SpellEffect::TriggerOnCast, On Caster, cast on spell use, base: chance pct limit: spellid
|
||||
focusSpellVulnerability, //@Fc, SPA: 296, SpellEffect::FcSpellVulnerability, On Target, spell damage taken mod pct, base: min pct, limit: max pct
|
||||
focusFcSpellDamagePctIncomingPC, //@Fc, SPA: 483, SpellEffect::Fc_Spell_Damage_Pct_IncomingPC, On Target, spell damage taken mod pct, base: min pct, limit: max pct
|
||||
focusTwincast, //@Fc, SPA: 399, SpellEffect::FcTwincast, On Caster, chance cast spell twice, base: chance pct
|
||||
focusSympatheticProc, //@Fc, SPA: 383, SpellEffect::SympatheticProc, On Caster, cast on spell use, base: variable proc chance on cast time, limit: spellid
|
||||
focusFcDamageAmt, //@Fc, SPA: 286, SpellEffect::FcDamageAmt, On Caster, spell damage mod flat amt, base: amt
|
||||
focusFcDamageAmt2, //@Fc, SPA: 462, SpellEffect::FcDamageAmt2, On Caster, spell damage mod flat amt, base: amt
|
||||
focusFcDamageAmtCrit, //@Fc, SPA: 303, SpellEffect::FFcDamageAmtCrit, On Caster, spell damage mod flat amt, base: amt
|
||||
focusSpellDurByTic, //@Fc, SPA: 287, SpellEffect::SpellDurationIncByTic, On Caster, spell buff duration mod, base: tics
|
||||
focusSwarmPetDuration, //@Fc, SPA: 398, SpellEffect::SwarmPetDuration, On Caster, swarm pet duration mod, base: milliseconds
|
||||
focusReduceRecastTime, //@Fc, SPA: 310, SpellEffect::ReduceReuseTimer, On Caster, disc reuse time mod, base: milliseconds
|
||||
focusBlockNextSpell, //@Fc, SPA: 335, SpellEffect::BlockNextSpellFocus, On Caster, chance to block next spell, base: chance
|
||||
focusFcHealPctIncoming, //@Fc, SPA: 393, SpellEffect::FcHealPctIncoming, On Target, heal received mod pct, base: pct
|
||||
focusFcDamageAmtIncoming, //@Fc, SPA: 297, SpellEffect::FcDamageAmtIncoming, On Target, damage taken flat amt, base: amt
|
||||
focusFcSpellDamageAmtIncomingPC, //@Fc, SPA: 484, SpellEffect::Fc_Spell_Damage_Amt_IncomingPC, On Target, damage taken flat amt, base: amt
|
||||
focusFcCastSpellOnLand, //@Fc, SPA: 481, SpellEffect::Fc_Cast_Spell_On_Land, On Target, cast spell if hit by spell, base: chance pct, limit: spellid
|
||||
focusFcHealAmtIncoming, //@Fc, SPA: 394, SpellEffect::FcHealAmtIncoming, On Target, heal received mod flat amt, base: amt
|
||||
focusFcBaseEffects, //@Fc, SPA: 413, SpellEffect::FcBaseEffects, On Caster, base spell effectiveness mod pct, base: pct
|
||||
focusIncreaseNumHits, //@Fc, SPA: 421, SpellEffect::FcIncreaseNumHits, On Caster, numhits mod flat amt, base: amt
|
||||
focusFcLimitUse, //@Fc, SPA: 420, SpellEffect::FcLimitUse, On Caster, numhits mod pct, base: pct
|
||||
focusFcMute, //@Fc, SPA: 357, SpellEffect::FcMute, On Caster, prevents spell casting, base: chance pct
|
||||
focusFcTimerRefresh, //@Fc, SPA: 389, SpellEffect::FcTimerRefresh, On Caster, reset spell recast timer, base: 1
|
||||
focusFcTimerLockout, //@Fc, SPA: 390, SpellEffect::FcTimerLockout, On Caster, set a spell to be on recast timer, base: recast duration milliseconds
|
||||
focusFcStunTimeMod, //@Fc, SPA: 133, SpellEffect::FcStunTimeMod, On Caster, stun time mod pct, base: chance pct
|
||||
focusFcResistIncoming, //@Fc, SPA: 510, SpellEffect::Fc_Resist_Incoming, On Target, resist modifier, base: amt
|
||||
focusFcAmplifyMod, //@Fc, SPA: 507, SpellEffect::Fc_Amplify_Mod, On Caster, damage-heal-dot mod pct, base: pct
|
||||
focusFcAmplifyAmt, //@Fc, SPA: 508, SpellEffect::Fc_Amplify_Amt, On Caster, damage-heal-dot mod flat amt, base: amt
|
||||
focusFcCastTimeMod2, //@Fc, SPA: 500, SpellEffect::Fc_CastTimeMod2, On Caster, cast time mod pct, base: pct
|
||||
focusFcCastTimeAmt, //@Fc, SPA: 501, SpellEffect::Fc_CastTimeAmt, On Caster, cast time mod flat amt, base: milliseconds
|
||||
focusFcHealPctCritIncoming, //@Fc, SPA: 395, SpellEffect::FcHealPctCritIncoming, On Target, spell healing mod pct, base: pct
|
||||
focusFcHealAmt, //@Fc, SPA: 392, SpellEffect::FcHealAmt, On Caster, spell healing mod flat amt, base: amt
|
||||
focusFcHealAmtCrit, //@Fc, SPA: 396, SpellEffect::FcHealAmtCrit, On Caster, spell healing mod flat amt, base: amt
|
||||
} focusType; //Any new FocusType needs to be added to the Mob::IsFocus function
|
||||
#define HIGHEST_FOCUS focusFcHealAmtCrit //Should always be last focusType in enum
|
||||
|
||||
@ -854,6 +854,66 @@ struct DataBucketCache
|
||||
uint32_t bucket_expires;
|
||||
};
|
||||
|
||||
// Defines based on the RoF2 Client
|
||||
#define PET_HEALTHREPORT 0 // 0x00 - /pet health or Pet Window
|
||||
#define PET_LEADER 1 // 0x01 - /pet leader or Pet Window
|
||||
#define PET_ATTACK 2 // 0x02 - /pet attack or Pet Window
|
||||
#define PET_QATTACK 3 // 0x03 - /pet qattack or Pet Window
|
||||
#define PET_FOLLOWME 4 // 0x04 - /pet follow or Pet Window
|
||||
#define PET_GUARDHERE 5 // 0x05 - /pet guard or Pet Window
|
||||
#define PET_SIT 6 // 0x06 - /pet sit or Pet Window
|
||||
#define PET_SITDOWN 7 // 0x07 - /pet sit on
|
||||
#define PET_STANDUP 8 // 0x08 - /pet sit off
|
||||
#define PET_STOP 9 // 0x09 - /pet stop or Pet Window - Not implemented
|
||||
#define PET_STOP_ON 10 // 0x0a - /pet stop on - Not implemented
|
||||
#define PET_STOP_OFF 11 // 0x0b - /pet stop off - Not implemented
|
||||
#define PET_TAUNT 12 // 0x0c - /pet taunt or Pet Window
|
||||
#define PET_TAUNT_ON 13 // 0x0d - /pet taunt on
|
||||
#define PET_TAUNT_OFF 14 // 0x0e - /pet taunt off
|
||||
#define PET_HOLD 15 // 0x0f - /pet hold or Pet Window, won't add to hate list unless attacking
|
||||
#define PET_HOLD_ON 16 // 0x10 - /pet hold on
|
||||
#define PET_HOLD_OFF 17 // 0x11 - /pet hold off
|
||||
#define PET_GHOLD 18 // 0x12 - /pet ghold, will never add to hate list unless told to
|
||||
#define PET_GHOLD_ON 19 // 0x13 - /pet ghold on
|
||||
#define PET_GHOLD_OFF 20 // 0x14 - /pet ghold off
|
||||
#define PET_SPELLHOLD 21 // 0x15 - /pet no cast or /pet spellhold or Pet Window
|
||||
#define PET_SPELLHOLD_ON 22 // 0x16 - /pet spellhold on
|
||||
#define PET_SPELLHOLD_OFF 23 // 0x17 - /pet spellhold off
|
||||
#define PET_FOCUS 24 // 0x18 - /pet focus or Pet Window
|
||||
#define PET_FOCUS_ON 25 // 0x19 - /pet focus on
|
||||
#define PET_FOCUS_OFF 26 // 0x1a - /pet focus off
|
||||
#define PET_FEIGN 27 // 0x1b - /pet feign
|
||||
#define PET_BACKOFF 28 // 0x1c - /pet back off
|
||||
#define PET_GETLOST 29 // 0x1d - /pet get lost
|
||||
#define PET_GUARDME 30 // 0x1e - Same as /pet follow, but different message in older clients - define not from client /pet target in modern clients but doesn't send packet
|
||||
#define PET_REGROUP 31 // 0x1f - /pet regroup, acts like classic hold. Stops attack and moves back to guard/you but doesn't clear hate list
|
||||
#define PET_REGROUP_ON 32 // 0x20 - /pet regroup on, turns on regroup
|
||||
#define PET_REGROUP_OFF 33 // 0x21 - /pet regroup off, turns off regroup
|
||||
#define PET_MAXCOMMANDS PET_REGROUP_OFF + 1
|
||||
|
||||
// can change the state of these buttons with a packet
|
||||
#define PET_BUTTON_SIT 0
|
||||
#define PET_BUTTON_STOP 1
|
||||
#define PET_BUTTON_REGROUP 2
|
||||
#define PET_BUTTON_FOLLOW 3
|
||||
#define PET_BUTTON_GUARD 4
|
||||
#define PET_BUTTON_TAUNT 5
|
||||
#define PET_BUTTON_HOLD 6
|
||||
#define PET_BUTTON_GHOLD 7
|
||||
#define PET_BUTTON_FOCUS 8
|
||||
#define PET_BUTTON_SPELLHOLD 9
|
||||
|
||||
enum eStandingPetOrder { SPO_Follow, SPO_Sit, SPO_Guard, SPO_FeignDeath };
|
||||
|
||||
typedef enum {
|
||||
petFamiliar, //only listens to /pet get lost
|
||||
petAnimation, //does not listen to any commands
|
||||
petOther,
|
||||
petCharmed,
|
||||
petNPCFollow,
|
||||
petTargetLock, //remain active as long something is on the hatelist. Don't listen to any commands
|
||||
petNone = 0xFF // not a pet
|
||||
} PetTypeOld;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@ -263,7 +263,7 @@ int64 Mob::GetActDoTDamage(uint16 spell_id, int64 value, Mob* target, bool from_
|
||||
chance += itembonuses.CriticalDoTChance + spellbonuses.CriticalDoTChance + aabonuses.CriticalDoTChance;
|
||||
|
||||
if (spellbonuses.CriticalDotDecay)
|
||||
chance += GetDecayEffectValue(spell_id, SE_CriticalDotDecay);
|
||||
chance += GetDecayEffectValue(spell_id, SpellEffect::CriticalDotDecay);
|
||||
|
||||
if (spells[spell_id].override_crit_chance > 0 && chance > spells[spell_id].override_crit_chance)
|
||||
chance = spells[spell_id].override_crit_chance;
|
||||
@ -429,14 +429,14 @@ int64 Mob::GetActSpellHealing(uint16 spell_id, int64 value, Mob* target, bool fr
|
||||
critical_chance += itembonuses.CriticalHealChance + spellbonuses.CriticalHealChance + aabonuses.CriticalHealChance;
|
||||
|
||||
if (spellbonuses.CriticalHealDecay) {
|
||||
critical_chance += GetDecayEffectValue(spell_id, SE_CriticalHealDecay);
|
||||
critical_chance += GetDecayEffectValue(spell_id, SpellEffect::CriticalHealDecay);
|
||||
}
|
||||
}
|
||||
else {
|
||||
critical_chance = itembonuses.CriticalHealOverTime + spellbonuses.CriticalHealOverTime + aabonuses.CriticalHealOverTime;
|
||||
|
||||
if (spellbonuses.CriticalRegenDecay) {
|
||||
critical_chance += GetDecayEffectValue(spell_id, SE_CriticalRegenDecay);
|
||||
critical_chance += GetDecayEffectValue(spell_id, SpellEffect::CriticalRegenDecay);
|
||||
}
|
||||
}
|
||||
|
||||
@ -596,7 +596,7 @@ int32 Mob::GetActSpellCost(uint16 spell_id, int32 cost)
|
||||
if (buffs[buffSlot].spellid == 0 || buffs[buffSlot].spellid >= SPDAT_RECORDS)
|
||||
continue;
|
||||
|
||||
if(IsEffectInSpell(buffs[buffSlot].spellid, SE_ReduceManaCost)) {
|
||||
if(IsEffectInSpell(buffs[buffSlot].spellid, SpellEffect::ReduceManaCost)) {
|
||||
if(CalcFocusEffect(focusManaCost, buffs[buffSlot].spellid, spell_id) == 100)
|
||||
cost = 1;
|
||||
}
|
||||
@ -1105,8 +1105,8 @@ void EntityList::AESpell(
|
||||
IsTargetableAESpell(spell_id) &&
|
||||
is_detrimental_spell &&
|
||||
!is_npc &&
|
||||
!IsEffectInSpell(spell_id, SE_Lull) &&
|
||||
!IsEffectInSpell(spell_id, SE_Mez)
|
||||
!IsEffectInSpell(spell_id, SpellEffect::Lull) &&
|
||||
!IsEffectInSpell(spell_id, SpellEffect::Mez)
|
||||
) {
|
||||
max_targets_allowed = RuleI(Spells, TargetedAOEMaxTargets);
|
||||
} else if (
|
||||
|
||||
@ -208,6 +208,8 @@ const char* QuestEventSubroutines[_LargestEventID] = {
|
||||
"EVENT_SPELL_BLOCKED",
|
||||
"EVENT_READ_ITEM",
|
||||
"EVENT_PET_COMMAND",
|
||||
"EVENT_CHARM_START",
|
||||
"EVENT_CHARM_END",
|
||||
|
||||
// Add new events before these or Lua crashes
|
||||
"EVENT_SPELL_EFFECT_BOT",
|
||||
|
||||
@ -56,8 +56,6 @@ extern volatile bool is_zone_loaded;
|
||||
extern WorldServer worldserver;
|
||||
extern uint32 numclients;
|
||||
|
||||
extern char errorname[32];
|
||||
|
||||
Entity::Entity()
|
||||
{
|
||||
id = 0;
|
||||
@ -1391,7 +1389,7 @@ void EntityList::SendZoneSpawnsBulk(Client *client)
|
||||
|
||||
bool is_delayed_packet = (
|
||||
DistanceSquared(client_position, spawn_position) > distance_max ||
|
||||
(spawn->IsClient() && (spawn->GetRace() == MINOR_ILL_OBJ || spawn->GetRace() == TREE))
|
||||
(spawn->IsClient() && (spawn->GetRace() == Race::MinorIllusion || spawn->GetRace() == Race::Tree))
|
||||
);
|
||||
|
||||
if (is_delayed_packet) {
|
||||
@ -1415,7 +1413,7 @@ void EntityList::SendZoneSpawnsBulk(Client *client)
|
||||
*
|
||||
* Illusion races on PCs don't work as a mass spawn
|
||||
* But they will work as an add_spawn AFTER CLIENT_CONNECTED.
|
||||
* if (spawn->IsClient() && (race == MINOR_ILL_OBJ || race == TREE)) {
|
||||
* if (spawn->IsClient() && (race == Race::MinorIllusion || race == Race::Tree)) {
|
||||
* app = new EQApplicationPacket;
|
||||
* spawn->CreateSpawnPacket(app);
|
||||
* client->QueuePacket(app, true, Client::CLIENT_CONNECTED);
|
||||
|
||||
@ -146,6 +146,8 @@ typedef enum {
|
||||
EVENT_SPELL_BLOCKED,
|
||||
EVENT_READ_ITEM,
|
||||
EVENT_PET_COMMAND,
|
||||
EVENT_CHARM_START,
|
||||
EVENT_CHARM_END,
|
||||
|
||||
// Add new events before these or Lua crashes
|
||||
EVENT_SPELL_EFFECT_BOT,
|
||||
|
||||
14
zone/exp.cpp
14
zone/exp.cpp
@ -130,7 +130,7 @@ uint64 Client::CalcEXP(uint8 consider_level, bool ignore_modifiers) {
|
||||
if (
|
||||
GetClass() == Class::Warrior ||
|
||||
GetClass() == Class::Rogue ||
|
||||
GetBaseRace() == HALFLING
|
||||
GetBaseRace() == Race::Halfling
|
||||
) {
|
||||
total_modifier *= 1.05;
|
||||
}
|
||||
@ -291,7 +291,7 @@ void Client::CalculateStandardAAExp(uint64 &add_aaxp, uint8 conlevel, bool resex
|
||||
// Shouldn't race not affect AA XP?
|
||||
if (RuleB(Character, UseRaceClassExpBonuses))
|
||||
{
|
||||
if (GetBaseRace() == HALFLING) {
|
||||
if (GetBaseRace() == Race::Halfling) {
|
||||
aatotalmod *= 1.05;
|
||||
}
|
||||
|
||||
@ -439,7 +439,7 @@ void Client::CalculateExp(uint64 in_add_exp, uint64 &add_exp, uint64 &add_aaxp,
|
||||
|
||||
if (RuleB(Character, UseRaceClassExpBonuses))
|
||||
{
|
||||
if (GetBaseRace() == HALFLING) {
|
||||
if (GetBaseRace() == Race::Halfling) {
|
||||
totalmod *= 1.05;
|
||||
}
|
||||
|
||||
@ -1057,13 +1057,13 @@ uint32 Client::GetEXPForLevel(uint16 check_level)
|
||||
if(RuleB(Character,UseOldRaceExpPenalties))
|
||||
{
|
||||
float racemod = 1.0;
|
||||
if(GetBaseRace() == TROLL || GetBaseRace() == IKSAR) {
|
||||
if(GetBaseRace() == Race::Troll || GetBaseRace() == Race::Iksar) {
|
||||
racemod = 1.2;
|
||||
} else if(GetBaseRace() == OGRE) {
|
||||
} else if(GetBaseRace() == Race::Ogre) {
|
||||
racemod = 1.15;
|
||||
} else if(GetBaseRace() == BARBARIAN) {
|
||||
} else if(GetBaseRace() == Race::Barbarian) {
|
||||
racemod = 1.05;
|
||||
} else if(GetBaseRace() == HALFLING) {
|
||||
} else if(GetBaseRace() == Race::Halfling) {
|
||||
racemod = 0.95;
|
||||
}
|
||||
|
||||
|
||||
@ -365,7 +365,7 @@ void Mob::CalculateNewFearpoint()
|
||||
// fallback logic if pathing system can't be used
|
||||
bool inliquid = zone->HasWaterMap() && zone->watermap->InLiquid(glm::vec3(GetPosition())) || zone->IsWaterZone(GetZ());
|
||||
bool stay_inliquid = (inliquid && IsNPC() && CastToNPC()->IsUnderwaterOnly());
|
||||
bool levitating = IsClient() && (FindType(SE_Levitate) || flymode != GravityBehavior::Ground);
|
||||
bool levitating = IsClient() && (FindType(SpellEffect::Levitate) || flymode != GravityBehavior::Ground);
|
||||
bool open_outdoor_zone = !zone->CanCastOutdoor() && !zone->IsCity();
|
||||
|
||||
int loop = 0;
|
||||
|
||||
@ -83,7 +83,7 @@ void command_feature(Client *c, const Seperator *sep)
|
||||
feature_changed = "Beard Color";
|
||||
value_changed = f.beardcolor;
|
||||
} else if (is_details) {
|
||||
if (t->GetRace() != DRAKKIN) {
|
||||
if (t->GetRace() != Race::Drakkin) {
|
||||
c->Message(Chat::White, "You must target a Drakkin to use this command.");
|
||||
return;
|
||||
}
|
||||
@ -116,7 +116,7 @@ void command_feature(Client *c, const Seperator *sep)
|
||||
feature_changed = "Helmet Texture";
|
||||
value_changed = helm_texture;
|
||||
} else if (is_heritage) {
|
||||
if (t->GetRace() != DRAKKIN) {
|
||||
if (t->GetRace() != Race::Drakkin) {
|
||||
c->Message(Chat::White, "You must target a Drakkin to use this command.");
|
||||
return;
|
||||
}
|
||||
@ -148,7 +148,7 @@ void command_feature(Client *c, const Seperator *sep)
|
||||
feature_changed = "Size";
|
||||
value_changed = size;
|
||||
} else if (is_tattoo) {
|
||||
if (t->GetRace() != DRAKKIN) {
|
||||
if (t->GetRace() != Race::Drakkin) {
|
||||
c->Message(Chat::White, "You must target a Drakkin to use this command.");
|
||||
return;
|
||||
}
|
||||
|
||||
@ -8,7 +8,7 @@ void command_randomfeatures(Client *c, const Seperator *sep)
|
||||
}
|
||||
|
||||
auto target = c->GetTarget();
|
||||
|
||||
|
||||
if (target->RandomizeFeatures()) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
|
||||
@ -44,6 +44,19 @@ void SetRace(Client *c, const Seperator *sep)
|
||||
}
|
||||
);
|
||||
|
||||
if (race_id == Race::Doug) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"{} {} been returned to {} base race.",
|
||||
c->GetTargetDescription(t, TargetDescriptionType::UCYou),
|
||||
c == t ? "have" : "has",
|
||||
c == t ? "your" : "their"
|
||||
).c_str()
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
|
||||
@ -9,7 +9,7 @@ void ShowIPLookup(Client *c, const Seperator *sep)
|
||||
|
||||
auto pack = new ServerPacket(
|
||||
ServerOP_IPLookup,
|
||||
sizeof(ServerGenericWorldQuery_Struct) + ip_length + 1
|
||||
sizeof(ServerGenericWorldQuery_Struct) + ip_length
|
||||
);
|
||||
|
||||
auto s = (ServerGenericWorldQuery_Struct *) pack->pBuffer;
|
||||
|
||||
@ -6992,7 +6992,9 @@ luabind::scope lua_register_events() {
|
||||
luabind::value("entity_variable_update", static_cast<int>(EVENT_ENTITY_VARIABLE_UPDATE)),
|
||||
luabind::value("aa_loss", static_cast<int>(EVENT_AA_LOSS)),
|
||||
luabind::value("read", static_cast<int>(EVENT_READ_ITEM)),
|
||||
luabind::value("pet_command", static_cast<int>(EVENT_PET_COMMAND))
|
||||
luabind::value("pet_command", static_cast<int>(EVENT_PET_COMMAND)),
|
||||
luabind::value("charm_start", static_cast<int>(EVENT_CHARM_START)),
|
||||
luabind::value("charm_end", static_cast<int>(EVENT_CHARM_END))
|
||||
)];
|
||||
}
|
||||
|
||||
|
||||
@ -189,7 +189,9 @@ const char *LuaEvents[_LargestEventID] = {
|
||||
"event_aa_loss",
|
||||
"event_spell_blocked",
|
||||
"event_read_item",
|
||||
"event_pet_command"
|
||||
"event_pet_command",
|
||||
"event_charm_start",
|
||||
"event_charm_end"
|
||||
};
|
||||
|
||||
extern Zone *zone;
|
||||
@ -266,6 +268,8 @@ LuaParser::LuaParser() {
|
||||
NPCArgumentDispatch[EVENT_ENTITY_VARIABLE_UPDATE] = handle_npc_entity_variable;
|
||||
NPCArgumentDispatch[EVENT_SPELL_BLOCKED] = handle_npc_spell_blocked;
|
||||
NPCArgumentDispatch[EVENT_PET_COMMAND] = handle_npc_pet_command;
|
||||
NPCArgumentDispatch[EVENT_CHARM_START] = handle_npc_single_mob;
|
||||
NPCArgumentDispatch[EVENT_CHARM_END] = handle_npc_single_mob;
|
||||
|
||||
PlayerArgumentDispatch[EVENT_SAY] = handle_player_say;
|
||||
PlayerArgumentDispatch[EVENT_ENVIRONMENTAL_DAMAGE] = handle_player_environmental_damage;
|
||||
|
||||
@ -118,7 +118,7 @@ void Merc::CalcBonuses()
|
||||
CalcMaxMana();
|
||||
CalcMaxEndurance();
|
||||
|
||||
rooted = FindType(SE_Root);
|
||||
rooted = FindType(SpellEffect::Root);
|
||||
}
|
||||
|
||||
float Merc::GetDefaultSize() {
|
||||
@ -1730,7 +1730,7 @@ bool Merc::AICastSpell(int8 iChance, uint32 iSpellTypes) {
|
||||
}
|
||||
else {
|
||||
//check for heal over time. if not present, try it first
|
||||
if (!tar->FindType(SE_HealOverTime)) {
|
||||
if (!tar->FindType(SpellEffect::HealOverTime)) {
|
||||
selectedMercSpell = GetBestMercSpellForHealOverTime(this);
|
||||
|
||||
//get regular heal
|
||||
@ -1779,7 +1779,7 @@ bool Merc::AICastSpell(int8 iChance, uint32 iSpellTypes) {
|
||||
if( !IsImmuneToSpell(selectedMercSpell.spellid, this)
|
||||
&& (CanBuffStack(selectedMercSpell.spellid, mercLevel, true) >= 0)) {
|
||||
|
||||
if( GetArchetype() == Archetype::Melee && IsEffectInSpell(selectedMercSpell.spellid, SE_IncreaseSpellHaste)) {
|
||||
if( GetArchetype() == Archetype::Melee && IsEffectInSpell(selectedMercSpell.spellid, SpellEffect::IncreaseSpellHaste)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -1806,7 +1806,7 @@ bool Merc::AICastSpell(int8 iChance, uint32 iSpellTypes) {
|
||||
if( !tar->IsImmuneToSpell(selectedMercSpell.spellid, this)
|
||||
&& (tar->CanBuffStack(selectedMercSpell.spellid, mercLevel, true) >= 0)) {
|
||||
|
||||
if( tar->GetArchetype() == Archetype::Melee && IsEffectInSpell(selectedMercSpell.spellid, SE_IncreaseSpellHaste)) {
|
||||
if( tar->GetArchetype() == Archetype::Melee && IsEffectInSpell(selectedMercSpell.spellid, SpellEffect::IncreaseSpellHaste)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -2292,7 +2292,7 @@ int64 Merc::GetFocusEffect(focusType type, uint16 spell_id, bool from_buff_tic)
|
||||
if(type == focusReagentCost && IsSummonPetSpell(spell_id) && GetAA(aaElementalPact))
|
||||
return 100;
|
||||
|
||||
if(type == focusReagentCost && (IsEffectInSpell(spell_id, SE_SummonItem) || IsSacrificeSpell(spell_id)))
|
||||
if(type == focusReagentCost && (IsEffectInSpell(spell_id, SpellEffect::SummonItem) || IsSacrificeSpell(spell_id)))
|
||||
return 0;
|
||||
//Summon Spells that require reagents are typically imbue type spells, enchant metal, sacrifice and shouldn't be affected
|
||||
//by reagent conservation for obvious reasons.
|
||||
@ -2620,7 +2620,7 @@ MercSpell Merc::GetBestMercSpellForVeryFastHeal(Merc* caster) {
|
||||
result.time_cancast = 0;
|
||||
|
||||
if(caster) {
|
||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SE_CurrentHP);
|
||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SpellEffect::CurrentHP);
|
||||
|
||||
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
||||
++mercSpellListItr) {
|
||||
@ -2653,7 +2653,7 @@ MercSpell Merc::GetBestMercSpellForFastHeal(Merc* caster) {
|
||||
result.time_cancast = 0;
|
||||
|
||||
if(caster) {
|
||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SE_CurrentHP);
|
||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SpellEffect::CurrentHP);
|
||||
|
||||
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
||||
++mercSpellListItr) {
|
||||
@ -2686,7 +2686,7 @@ MercSpell Merc::GetBestMercSpellForHealOverTime(Merc* caster) {
|
||||
result.time_cancast = 0;
|
||||
|
||||
if(caster) {
|
||||
std::list<MercSpell> mercHoTSpellList = GetMercSpellsForSpellEffect(caster, SE_HealOverTime);
|
||||
std::list<MercSpell> mercHoTSpellList = GetMercSpellsForSpellEffect(caster, SpellEffect::HealOverTime);
|
||||
|
||||
for (auto mercSpellListItr = mercHoTSpellList.begin(); mercSpellListItr != mercHoTSpellList.end();
|
||||
++mercSpellListItr) {
|
||||
@ -2727,7 +2727,7 @@ MercSpell Merc::GetBestMercSpellForPercentageHeal(Merc* caster) {
|
||||
result.time_cancast = 0;
|
||||
|
||||
if(caster && caster->AI_HasSpells()) {
|
||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SE_CurrentHP);
|
||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SpellEffect::CurrentHP);
|
||||
|
||||
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
||||
++mercSpellListItr) {
|
||||
@ -2760,7 +2760,7 @@ MercSpell Merc::GetBestMercSpellForRegularSingleTargetHeal(Merc* caster) {
|
||||
result.time_cancast = 0;
|
||||
|
||||
if(caster) {
|
||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SE_CurrentHP);
|
||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SpellEffect::CurrentHP);
|
||||
|
||||
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
||||
++mercSpellListItr) {
|
||||
@ -2793,7 +2793,7 @@ MercSpell Merc::GetFirstMercSpellForSingleTargetHeal(Merc* caster) {
|
||||
result.time_cancast = 0;
|
||||
|
||||
if(caster) {
|
||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SE_CurrentHP);
|
||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SpellEffect::CurrentHP);
|
||||
|
||||
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
||||
++mercSpellListItr) {
|
||||
@ -2827,7 +2827,7 @@ MercSpell Merc::GetBestMercSpellForGroupHeal(Merc* caster) {
|
||||
result.time_cancast = 0;
|
||||
|
||||
if(caster) {
|
||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SE_CurrentHP);
|
||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SpellEffect::CurrentHP);
|
||||
|
||||
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
||||
++mercSpellListItr) {
|
||||
@ -2860,7 +2860,7 @@ MercSpell Merc::GetBestMercSpellForGroupHealOverTime(Merc* caster) {
|
||||
result.time_cancast = 0;
|
||||
|
||||
if(caster) {
|
||||
std::list<MercSpell> mercHoTSpellList = GetMercSpellsForSpellEffect(caster, SE_HealOverTime);
|
||||
std::list<MercSpell> mercHoTSpellList = GetMercSpellsForSpellEffect(caster, SpellEffect::HealOverTime);
|
||||
|
||||
for (auto mercSpellListItr = mercHoTSpellList.begin(); mercSpellListItr != mercHoTSpellList.end();
|
||||
++mercSpellListItr) {
|
||||
@ -2901,7 +2901,7 @@ MercSpell Merc::GetBestMercSpellForGroupCompleteHeal(Merc* caster) {
|
||||
result.time_cancast = 0;
|
||||
|
||||
if(caster) {
|
||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SE_CompleteHeal);
|
||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SpellEffect::CompleteHeal);
|
||||
|
||||
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
||||
++mercSpellListItr) {
|
||||
@ -2934,7 +2934,7 @@ MercSpell Merc::GetBestMercSpellForAETaunt(Merc* caster) {
|
||||
result.time_cancast = 0;
|
||||
|
||||
if(caster) {
|
||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SE_Taunt);
|
||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SpellEffect::Taunt);
|
||||
|
||||
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
||||
++mercSpellListItr) {
|
||||
@ -2969,7 +2969,7 @@ MercSpell Merc::GetBestMercSpellForTaunt(Merc* caster) {
|
||||
result.time_cancast = 0;
|
||||
|
||||
if(caster) {
|
||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SE_Taunt);
|
||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SpellEffect::Taunt);
|
||||
|
||||
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
||||
++mercSpellListItr) {
|
||||
@ -3002,7 +3002,7 @@ MercSpell Merc::GetBestMercSpellForHate(Merc* caster) {
|
||||
result.time_cancast = 0;
|
||||
|
||||
if(caster) {
|
||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SE_InstantHate);
|
||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SpellEffect::InstantHate);
|
||||
|
||||
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
||||
++mercSpellListItr) {
|
||||
@ -3038,10 +3038,10 @@ MercSpell Merc::GetBestMercSpellForCure(Merc* caster, Mob *tar) {
|
||||
return result;
|
||||
|
||||
int countNeedsCured = 0;
|
||||
bool isPoisoned = tar->FindType(SE_PoisonCounter);
|
||||
bool isDiseased = tar->FindType(SE_DiseaseCounter);
|
||||
bool isCursed = tar->FindType(SE_CurseCounter);
|
||||
bool isCorrupted = tar->FindType(SE_CorruptionCounter);
|
||||
bool isPoisoned = tar->FindType(SpellEffect::PoisonCounter);
|
||||
bool isDiseased = tar->FindType(SpellEffect::DiseaseCounter);
|
||||
bool isCursed = tar->FindType(SpellEffect::CurseCounter);
|
||||
bool isCorrupted = tar->FindType(SpellEffect::CorruptionCounter);
|
||||
|
||||
if(caster && caster->AI_HasSpells()) {
|
||||
std::list<MercSpell> cureList = GetMercSpellsBySpellType(caster, SpellType_Cure);
|
||||
@ -3068,19 +3068,19 @@ MercSpell Merc::GetBestMercSpellForCure(Merc* caster, Mob *tar) {
|
||||
if(selectedMercSpell.spellid == 0)
|
||||
continue;
|
||||
|
||||
if(isPoisoned && IsEffectInSpell(itr->spellid, SE_PoisonCounter)) {
|
||||
if(isPoisoned && IsEffectInSpell(itr->spellid, SpellEffect::PoisonCounter)) {
|
||||
spellSelected = true;
|
||||
}
|
||||
else if(isDiseased && IsEffectInSpell(itr->spellid, SE_DiseaseCounter)) {
|
||||
else if(isDiseased && IsEffectInSpell(itr->spellid, SpellEffect::DiseaseCounter)) {
|
||||
spellSelected = true;
|
||||
}
|
||||
else if(isCursed && IsEffectInSpell(itr->spellid, SE_CurseCounter)) {
|
||||
else if(isCursed && IsEffectInSpell(itr->spellid, SpellEffect::CurseCounter)) {
|
||||
spellSelected = true;
|
||||
}
|
||||
else if(isCorrupted && IsEffectInSpell(itr->spellid, SE_CorruptionCounter)) {
|
||||
else if(isCorrupted && IsEffectInSpell(itr->spellid, SpellEffect::CorruptionCounter)) {
|
||||
spellSelected = true;
|
||||
}
|
||||
else if(IsEffectInSpell(itr->spellid, SE_DispelDetrimental)) {
|
||||
else if(IsEffectInSpell(itr->spellid, SpellEffect::DispelDetrimental)) {
|
||||
spellSelected = true;
|
||||
}
|
||||
|
||||
@ -3108,19 +3108,19 @@ MercSpell Merc::GetBestMercSpellForCure(Merc* caster, Mob *tar) {
|
||||
if(selectedMercSpell.spellid == 0)
|
||||
continue;
|
||||
|
||||
if(isPoisoned && IsEffectInSpell(itr->spellid, SE_PoisonCounter)) {
|
||||
if(isPoisoned && IsEffectInSpell(itr->spellid, SpellEffect::PoisonCounter)) {
|
||||
spellSelected = true;
|
||||
}
|
||||
else if(isDiseased && IsEffectInSpell(itr->spellid, SE_DiseaseCounter)) {
|
||||
else if(isDiseased && IsEffectInSpell(itr->spellid, SpellEffect::DiseaseCounter)) {
|
||||
spellSelected = true;
|
||||
}
|
||||
else if(isCursed && IsEffectInSpell(itr->spellid, SE_CurseCounter)) {
|
||||
else if(isCursed && IsEffectInSpell(itr->spellid, SpellEffect::CurseCounter)) {
|
||||
spellSelected = true;
|
||||
}
|
||||
else if(isCorrupted && IsEffectInSpell(itr->spellid, SE_CorruptionCounter)) {
|
||||
else if(isCorrupted && IsEffectInSpell(itr->spellid, SpellEffect::CorruptionCounter)) {
|
||||
spellSelected = true;
|
||||
}
|
||||
else if(IsEffectInSpell(itr->spellid, SE_DispelDetrimental)) {
|
||||
else if(IsEffectInSpell(itr->spellid, SpellEffect::DispelDetrimental)) {
|
||||
spellSelected = true;
|
||||
}
|
||||
|
||||
@ -3155,7 +3155,7 @@ MercSpell Merc::GetBestMercSpellForStun(Merc* caster) {
|
||||
result.time_cancast = 0;
|
||||
|
||||
if(caster) {
|
||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SE_Stun);
|
||||
std::list<MercSpell> mercSpellList = GetMercSpellsForSpellEffect(caster, SpellEffect::Stun);
|
||||
|
||||
for (auto mercSpellListItr = mercSpellList.begin(); mercSpellListItr != mercSpellList.end();
|
||||
++mercSpellListItr) {
|
||||
@ -3492,7 +3492,7 @@ bool Merc::GetNeedsCured(Mob *tar) {
|
||||
bool needCured = false;
|
||||
|
||||
if(tar) {
|
||||
if(tar->FindType(SE_PoisonCounter) || tar->FindType(SE_DiseaseCounter) || tar->FindType(SE_CurseCounter) || tar->FindType(SE_CorruptionCounter)) {
|
||||
if(tar->FindType(SpellEffect::PoisonCounter) || tar->FindType(SpellEffect::DiseaseCounter) || tar->FindType(SpellEffect::CurseCounter) || tar->FindType(SpellEffect::CorruptionCounter)) {
|
||||
uint32 buff_count = tar->GetMaxTotalSlots();
|
||||
int buffsWithCounters = 0;
|
||||
needCured = true;
|
||||
|
||||
82
zone/mob.cpp
82
zone/mob.cpp
@ -547,7 +547,7 @@ Mob::~Mob()
|
||||
AI_Stop();
|
||||
if (GetPet()) {
|
||||
if (GetPet()->Charmed()) {
|
||||
GetPet()->BuffFadeByEffect(SE_Charm);
|
||||
GetPet()->BuffFadeByEffect(SpellEffect::Charm);
|
||||
}
|
||||
else {
|
||||
SetPet(0);
|
||||
@ -625,7 +625,7 @@ void Mob::BreakCharmPetIfConditionsMet() {
|
||||
auto pet = GetPet();
|
||||
if (pet && pet->GetPetType() == PetType::Charmed && HasAnInvisibilityEffect()) {
|
||||
if (RuleB(Pets, LivelikeBreakCharmOnInvis) || IsInvisible(pet)) {
|
||||
pet->BuffFadeByEffect(SE_Charm);
|
||||
pet->BuffFadeByEffect(SpellEffect::Charm);
|
||||
}
|
||||
LogRules(
|
||||
"Pets:LivelikeBreakCharmOnInvis for [{}] invisible [{}] hidden [{}] improved_hidden (shroud of stealth) [{}] invisible_animals [{}] invisible_undead [{}]",
|
||||
@ -1352,7 +1352,7 @@ void Mob::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho)
|
||||
// 3 - Mobs in water do not sink. A value of 3 in this field appears to be the default setting for all mobs
|
||||
// (in water or not) according to 6.2 era packet collects.
|
||||
if(IsClient())
|
||||
ns->spawn.flymode = FindType(SE_Levitate) ? 2 : 0;
|
||||
ns->spawn.flymode = FindType(SpellEffect::Levitate) ? 2 : 0;
|
||||
else
|
||||
ns->spawn.flymode = flymode;
|
||||
|
||||
@ -3819,7 +3819,7 @@ bool Mob::RandomizeFeatures(bool send_illusion, bool set_variables)
|
||||
|
||||
// Adjust all settings based on the min and max for each feature of each race and gender
|
||||
switch (GetRace()) {
|
||||
case HUMAN:
|
||||
case Race::Human:
|
||||
new_hair_color = zone->random.Int(0, 19);
|
||||
|
||||
if (current_gender == Gender::Male) {
|
||||
@ -3831,7 +3831,7 @@ bool Mob::RandomizeFeatures(bool send_illusion, bool set_variables)
|
||||
}
|
||||
|
||||
break;
|
||||
case BARBARIAN:
|
||||
case Race::Barbarian:
|
||||
new_hair_color = zone->random.Int(0, 19);
|
||||
new_luclin_face = zone->random.Int(0, 87);
|
||||
|
||||
@ -3844,7 +3844,7 @@ bool Mob::RandomizeFeatures(bool send_illusion, bool set_variables)
|
||||
}
|
||||
|
||||
break;
|
||||
case ERUDITE:
|
||||
case Race::Erudite:
|
||||
if (current_gender == Gender::Male) {
|
||||
new_beard_color = zone->random.Int(0, 19);
|
||||
new_beard = zone->random.Int(0, 5);
|
||||
@ -3854,7 +3854,7 @@ bool Mob::RandomizeFeatures(bool send_illusion, bool set_variables)
|
||||
}
|
||||
|
||||
break;
|
||||
case WOOD_ELF:
|
||||
case Race::WoodElf:
|
||||
new_hair_color = zone->random.Int(0, 19);
|
||||
|
||||
if (current_gender == Gender::Male) {
|
||||
@ -3864,7 +3864,7 @@ bool Mob::RandomizeFeatures(bool send_illusion, bool set_variables)
|
||||
}
|
||||
|
||||
break;
|
||||
case HIGH_ELF:
|
||||
case Race::HighElf:
|
||||
new_hair_color = zone->random.Int(0, 14);
|
||||
|
||||
if (current_gender == Gender::Male) {
|
||||
@ -3876,7 +3876,7 @@ bool Mob::RandomizeFeatures(bool send_illusion, bool set_variables)
|
||||
}
|
||||
|
||||
break;
|
||||
case DARK_ELF:
|
||||
case Race::DarkElf:
|
||||
new_hair_color = zone->random.Int(13, 18);
|
||||
|
||||
if (current_gender == Gender::Male) {
|
||||
@ -3888,7 +3888,7 @@ bool Mob::RandomizeFeatures(bool send_illusion, bool set_variables)
|
||||
}
|
||||
|
||||
break;
|
||||
case HALF_ELF:
|
||||
case Race::HalfElf:
|
||||
new_hair_color = zone->random.Int(0, 19);
|
||||
|
||||
if (current_gender == Gender::Male) {
|
||||
@ -3900,7 +3900,7 @@ bool Mob::RandomizeFeatures(bool send_illusion, bool set_variables)
|
||||
}
|
||||
|
||||
break;
|
||||
case DWARF:
|
||||
case Race::Dwarf:
|
||||
new_hair_color = zone->random.Int(0, 19);
|
||||
new_beard_color = new_hair_color;
|
||||
|
||||
@ -3913,7 +3913,7 @@ bool Mob::RandomizeFeatures(bool send_illusion, bool set_variables)
|
||||
}
|
||||
|
||||
break;
|
||||
case TROLL:
|
||||
case Race::Troll:
|
||||
new_eye_color_one = zone->random.Int(0, 10);
|
||||
new_eye_color_two = zone->random.Int(0, 10);
|
||||
|
||||
@ -3923,14 +3923,14 @@ bool Mob::RandomizeFeatures(bool send_illusion, bool set_variables)
|
||||
}
|
||||
|
||||
break;
|
||||
case OGRE:
|
||||
case Race::Ogre:
|
||||
if (current_gender == Gender::Female) {
|
||||
new_hair_style = zone->random.Int(0, 3);
|
||||
new_hair_color = zone->random.Int(0, 23);
|
||||
}
|
||||
|
||||
break;
|
||||
case HALFLING:
|
||||
case Race::Halfling:
|
||||
new_hair_color = zone->random.Int(0, 19);
|
||||
|
||||
if (current_gender == Gender::Male) {
|
||||
@ -3942,7 +3942,7 @@ bool Mob::RandomizeFeatures(bool send_illusion, bool set_variables)
|
||||
}
|
||||
|
||||
break;
|
||||
case GNOME:
|
||||
case Race::Gnome:
|
||||
new_hair_color = zone->random.Int(0, 24);
|
||||
|
||||
if (current_gender == Gender::Male) {
|
||||
@ -3954,14 +3954,14 @@ bool Mob::RandomizeFeatures(bool send_illusion, bool set_variables)
|
||||
}
|
||||
|
||||
break;
|
||||
case IKSAR:
|
||||
case VAHSHIR:
|
||||
case Race::Iksar:
|
||||
case Race::VahShir:
|
||||
new_luclin_face = zone->random.Int(0, 7);
|
||||
break;
|
||||
case FROGLOK:
|
||||
case Race::Froglok2:
|
||||
new_luclin_face = zone->random.Int(0, 9);
|
||||
break;
|
||||
case DRAKKIN:
|
||||
case Race::Drakkin:
|
||||
new_hair_color = zone->random.Int(0, 3);
|
||||
new_beard_color = new_hair_color;
|
||||
new_eye_color_one = zone->random.Int(0, 11);
|
||||
@ -4023,8 +4023,8 @@ bool Mob::RandomizeFeatures(bool send_illusion, bool set_variables)
|
||||
|
||||
uint16 Mob::GetFactionRace() {
|
||||
uint16 current_race = GetRace();
|
||||
if (IsPlayerRace(current_race) || current_race == TREE ||
|
||||
current_race == MINOR_ILL_OBJ) {
|
||||
if (IsPlayerRace(current_race) || current_race == Race::Tree ||
|
||||
current_race == Race::MinorIllusion) {
|
||||
return current_race;
|
||||
}
|
||||
else {
|
||||
@ -5629,7 +5629,7 @@ int Mob::GetSnaredAmount()
|
||||
|
||||
for(int j = 0; j < EFFECT_COUNT; j++)
|
||||
{
|
||||
if (spells[buffs[i].spellid].effect_id[j] == SE_MovementSpeed)
|
||||
if (spells[buffs[i].spellid].effect_id[j] == SpellEffect::MovementSpeed)
|
||||
{
|
||||
int64 val = CalcSpellEffectValue_formula(spells[buffs[i].spellid].formula[j], spells[buffs[i].spellid].base_value[j], spells[buffs[i].spellid].max_value[j], buffs[i].casterlevel, buffs[i].spellid);
|
||||
//int effect = CalcSpellEffectValue(buffs[i].spellid, spells[buffs[i].spellid].effectid[j], buffs[i].casterlevel);
|
||||
@ -5827,7 +5827,7 @@ bool Mob::TrySpellTrigger(Mob *target, uint32 spell_id, int effect)
|
||||
if (!target || !IsValidSpell(spell_id))
|
||||
return false;
|
||||
|
||||
/*The effects SE_SpellTrigger (SPA 340) and SE_Chance_Best_in_Spell_Grp (SPA 469) work as follows, you typically will have 2-3 different spells each with their own
|
||||
/*The effects SpellEffect::SpellTrigger (SPA 340) and SpellEffect::Chance_Best_in_Spell_Grp (SPA 469) work as follows, you typically will have 2-3 different spells each with their own
|
||||
chance to be triggered with all chances equaling up to 100 pct, with only 1 spell out of the group being ultimately cast.
|
||||
(ie Effect1 trigger spellA with 30% chance, Effect2 triggers spellB with 20% chance, Effect3 triggers spellC with 50% chance).
|
||||
The following function ensures a statistically accurate chance for each spell to be cast based on their chance values. These effects are also used in spells where there
|
||||
@ -5842,7 +5842,7 @@ bool Mob::TrySpellTrigger(Mob *target, uint32 spell_id, int effect)
|
||||
|
||||
for (int i = 0; i < EFFECT_COUNT; i++)
|
||||
{
|
||||
if (spells[spell_id].effect_id[i] == SE_SpellTrigger || spells[spell_id].effect_id[i] == SE_Chance_Best_in_Spell_Grp)
|
||||
if (spells[spell_id].effect_id[i] == SpellEffect::SpellTrigger || spells[spell_id].effect_id[i] == SpellEffect::Chance_Best_in_Spell_Grp)
|
||||
total_chance += spells[spell_id].base_value[i];
|
||||
}
|
||||
|
||||
@ -5852,7 +5852,7 @@ bool Mob::TrySpellTrigger(Mob *target, uint32 spell_id, int effect)
|
||||
|
||||
for (int i = 0; i < EFFECT_COUNT; i++){
|
||||
//Find spells with SPA 340 and add the cumulative percent chances to the roll array
|
||||
if ((spells[spell_id].effect_id[i] == SE_SpellTrigger) || (spells[spell_id].effect_id[i] == SE_Chance_Best_in_Spell_Grp)){
|
||||
if ((spells[spell_id].effect_id[i] == SpellEffect::SpellTrigger) || (spells[spell_id].effect_id[i] == SpellEffect::Chance_Best_in_Spell_Grp)){
|
||||
const int cumulative_chance = current_chance + spells[spell_id].base_value[i];
|
||||
chance_array[i] = cumulative_chance;
|
||||
current_chance = cumulative_chance;
|
||||
@ -5875,11 +5875,11 @@ bool Mob::TrySpellTrigger(Mob *target, uint32 spell_id, int effect)
|
||||
}
|
||||
|
||||
if (CastSpell) {
|
||||
if (spells[spell_id].effect_id[effect_slot] == SE_SpellTrigger && IsValidSpell(spells[spell_id].limit_value[effect_slot])) {
|
||||
if (spells[spell_id].effect_id[effect_slot] == SpellEffect::SpellTrigger && IsValidSpell(spells[spell_id].limit_value[effect_slot])) {
|
||||
SpellFinished(spells[spell_id].limit_value[effect_slot], target, EQ::spells::CastingSlot::Item, 0, -1, spells[spells[spell_id].limit_value[effect_slot]].resist_difficulty);
|
||||
return true;
|
||||
}
|
||||
else if (IsClient() && spells[spell_id].effect_id[effect_slot] == SE_Chance_Best_in_Spell_Grp) {
|
||||
else if (IsClient() && spells[spell_id].effect_id[effect_slot] == SpellEffect::Chance_Best_in_Spell_Grp) {
|
||||
uint32 best_spell_id = CastToClient()->GetHighestScribedSpellinSpellGroup(spells[spell_id].limit_value[effect_slot]);
|
||||
if (IsValidSpell(best_spell_id)) {
|
||||
SpellFinished(best_spell_id, target, EQ::spells::CastingSlot::Item, 0, -1, spells[best_spell_id].resist_difficulty);
|
||||
@ -5899,7 +5899,7 @@ void Mob::TryTriggerOnCastRequirement()
|
||||
int spell_id = buffs[e].spellid;
|
||||
if (IsValidSpell(spell_id)) {
|
||||
for (int i = 0; i < EFFECT_COUNT; i++) {
|
||||
if ((spells[spell_id].effect_id[i] == SE_TriggerOnReqTarget) || (spells[spell_id].effect_id[i] == SE_TriggerOnReqCaster)) {
|
||||
if ((spells[spell_id].effect_id[i] == SpellEffect::TriggerOnReqTarget) || (spells[spell_id].effect_id[i] == SpellEffect::TriggerOnReqCaster)) {
|
||||
if (PassCastRestriction(spells[spell_id].limit_value[i])) {
|
||||
SpellFinished(spells[spell_id].base_value[i], this, EQ::spells::CastingSlot::Item, 0, -1, spells[spell_id].resist_difficulty);
|
||||
if (!TryFadeEffect(e)) {
|
||||
@ -5942,7 +5942,7 @@ void Mob::TryTwincast(Mob *caster, Mob *target, uint32 spell_id)
|
||||
int buff_count = GetMaxTotalSlots();
|
||||
for(int i = 0; i < buff_count; i++)
|
||||
{
|
||||
if(IsEffectInSpell(buffs[i].spellid, SE_FcTwincast))
|
||||
if(IsEffectInSpell(buffs[i].spellid, SpellEffect::FcTwincast))
|
||||
{
|
||||
int32 focus = CalcFocusEffect(focusTwincast, buffs[i].spellid, spell_id);
|
||||
if(focus > 0)
|
||||
@ -5968,10 +5968,10 @@ void Mob::ApplyHealthTransferDamage(Mob *caster, Mob *target, uint16 spell_id)
|
||||
This allows for the AE spells to function without repeatedly killing caster
|
||||
Damage or heal portion can be found as regular single use spell effect
|
||||
*/
|
||||
if (IsEffectInSpell(spell_id, SE_Health_Transfer)){
|
||||
if (IsEffectInSpell(spell_id, SpellEffect::Health_Transfer)){
|
||||
for (int i = 0; i < EFFECT_COUNT; i++) {
|
||||
|
||||
if (spells[spell_id].effect_id[i] == SE_Health_Transfer) {
|
||||
if (spells[spell_id].effect_id[i] == SpellEffect::Health_Transfer) {
|
||||
int64 new_hp = GetMaxHP();
|
||||
new_hp -= GetMaxHP() * spells[spell_id].base_value[i] / 1000;
|
||||
|
||||
@ -6175,8 +6175,8 @@ bool Mob::TryFadeEffect(int slot)
|
||||
if (!spells[buffs[slot].spellid].effect_id[i])
|
||||
continue;
|
||||
|
||||
if (spells[buffs[slot].spellid].effect_id[i] == SE_CastOnFadeEffectAlways ||
|
||||
spells[buffs[slot].spellid].effect_id[i] == SE_CastOnRuneFadeEffect)
|
||||
if (spells[buffs[slot].spellid].effect_id[i] == SpellEffect::CastOnFadeEffectAlways ||
|
||||
spells[buffs[slot].spellid].effect_id[i] == SpellEffect::CastOnRuneFadeEffect)
|
||||
{
|
||||
uint16 spell_id = spells[buffs[slot].spellid].base_value[i];
|
||||
BuffFadeBySlot(slot);
|
||||
@ -6560,9 +6560,9 @@ void Mob::TrySpellOnKill(uint8 level, uint16 spell_id)
|
||||
{
|
||||
if (IsValidSpell(spell_id))
|
||||
{
|
||||
if(IsEffectInSpell(spell_id, SE_ProcOnSpellKillShot)) {
|
||||
if(IsEffectInSpell(spell_id, SpellEffect::ProcOnSpellKillShot)) {
|
||||
for (int i = 0; i < EFFECT_COUNT; i++) {
|
||||
if (spells[spell_id].effect_id[i] == SE_ProcOnSpellKillShot)
|
||||
if (spells[spell_id].effect_id[i] == SpellEffect::ProcOnSpellKillShot)
|
||||
{
|
||||
if (IsValidSpell(spells[spell_id].limit_value[i]) && spells[spell_id].max_value[i] <= level)
|
||||
{
|
||||
@ -6897,11 +6897,11 @@ void Mob::DoGravityEffect()
|
||||
int buff_count = GetMaxTotalSlots();
|
||||
for (int slot = 0; slot < buff_count; slot++)
|
||||
{
|
||||
if (IsValidSpell(buffs[slot].spellid) && IsEffectInSpell(buffs[slot].spellid, SE_GravityEffect))
|
||||
if (IsValidSpell(buffs[slot].spellid) && IsEffectInSpell(buffs[slot].spellid, SpellEffect::GravityEffect))
|
||||
{
|
||||
for (int i = 0; i < EFFECT_COUNT; i++)
|
||||
{
|
||||
if(spells[buffs[slot].spellid].effect_id[i] == SE_GravityEffect) {
|
||||
if(spells[buffs[slot].spellid].effect_id[i] == SpellEffect::GravityEffect) {
|
||||
|
||||
int casterId = buffs[slot].casterid;
|
||||
if(casterId)
|
||||
@ -7108,7 +7108,7 @@ void Mob::CastOnCurer(uint32 spell_id)
|
||||
{
|
||||
for(int i = 0; i < EFFECT_COUNT; i++)
|
||||
{
|
||||
if (spells[spell_id].effect_id[i] == SE_CastOnCurer)
|
||||
if (spells[spell_id].effect_id[i] == SpellEffect::CastOnCurer)
|
||||
{
|
||||
if(IsValidSpell(spells[spell_id].base_value[i]))
|
||||
{
|
||||
@ -7122,7 +7122,7 @@ void Mob::CastOnCure(uint32 spell_id)
|
||||
{
|
||||
for(int i = 0; i < EFFECT_COUNT; i++)
|
||||
{
|
||||
if (spells[spell_id].effect_id[i] == SE_CastOnCure)
|
||||
if (spells[spell_id].effect_id[i] == SpellEffect::CastOnCure)
|
||||
{
|
||||
if(IsValidSpell(spells[spell_id].base_value[i]))
|
||||
{
|
||||
@ -7139,7 +7139,7 @@ void Mob::CastOnNumHitFade(uint32 spell_id)
|
||||
|
||||
for(int i = 0; i < EFFECT_COUNT; i++)
|
||||
{
|
||||
if (spells[spell_id].effect_id[i] == SE_CastonNumHitFade)
|
||||
if (spells[spell_id].effect_id[i] == SpellEffect::CastonNumHitFade)
|
||||
{
|
||||
if(IsValidSpell(spells[spell_id].base_value[i]))
|
||||
{
|
||||
@ -7704,7 +7704,7 @@ bool Mob::CanRaceEquipItem(uint32 item_id)
|
||||
}
|
||||
|
||||
auto item_races = itm->Races;
|
||||
if(item_races == PLAYER_RACE_ALL_MASK) {
|
||||
if(item_races == RaceBitmask::All) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@ -615,7 +615,7 @@ void Client::AI_SpellCast()
|
||||
continue;
|
||||
}
|
||||
|
||||
if(IsEffectInSpell(current_spell, SE_Charm))
|
||||
if(IsEffectInSpell(current_spell, SpellEffect::Charm))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@ -724,7 +724,7 @@ void Client::AI_Process()
|
||||
{
|
||||
if(!IsFeared() && !IsLD())
|
||||
{
|
||||
BuffFadeByEffect(SE_Charm);
|
||||
BuffFadeByEffect(SpellEffect::Charm);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
483
zone/npc.cpp
483
zone/npc.cpp
@ -2274,9 +2274,9 @@ void NPC::SetLevel(uint8 in_level, bool command)
|
||||
|
||||
void NPC::ModifyNPCStat(const std::string& stat, const std::string& value)
|
||||
{
|
||||
auto stat_lower = Strings::ToLower(stat);
|
||||
const std::string& stat_lower = Strings::ToLower(stat);
|
||||
|
||||
auto variable_key = fmt::format(
|
||||
const std::string& variable_key = fmt::format(
|
||||
"modify_stat_{}",
|
||||
stat_lower
|
||||
);
|
||||
@ -2288,40 +2288,24 @@ void NPC::ModifyNPCStat(const std::string& stat, const std::string& value)
|
||||
if (stat_lower == "ac") {
|
||||
AC = Strings::ToInt(value);
|
||||
CalcAC();
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "str") {
|
||||
} else if (stat_lower == "str") {
|
||||
STR = Strings::ToInt(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "sta") {
|
||||
} else if (stat_lower == "sta") {
|
||||
STA = Strings::ToInt(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "agi") {
|
||||
} else if (stat_lower == "agi") {
|
||||
AGI = Strings::ToInt(value);
|
||||
CalcAC();
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "dex") {
|
||||
} else if (stat_lower == "dex") {
|
||||
DEX = Strings::ToInt(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "wis") {
|
||||
} else if (stat_lower == "wis") {
|
||||
WIS = Strings::ToInt(value);
|
||||
CalcMaxMana();
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "int" || stat_lower == "_int") {
|
||||
} else if (stat_lower == "int" || stat_lower == "_int") {
|
||||
INT = Strings::ToInt(value);
|
||||
CalcMaxMana();
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "cha") {
|
||||
} else if (stat_lower == "cha") {
|
||||
CHA = Strings::ToInt(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "max_hp") {
|
||||
} else if (stat_lower == "max_hp") {
|
||||
base_hp = Strings::ToBigInt(value);
|
||||
|
||||
CalcMaxHP();
|
||||
@ -2329,45 +2313,27 @@ void NPC::ModifyNPCStat(const std::string& stat, const std::string& value)
|
||||
current_hp = max_hp;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "max_mana") {
|
||||
} else if (stat_lower == "max_mana") {
|
||||
npc_mana = Strings::ToUnsignedBigInt(value);
|
||||
CalcMaxMana();
|
||||
if (current_mana > max_mana) {
|
||||
current_mana = max_mana;
|
||||
}
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "mr") {
|
||||
} else if (stat_lower == "mr") {
|
||||
MR = Strings::ToInt(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "fr") {
|
||||
} else if (stat_lower == "fr") {
|
||||
FR = Strings::ToInt(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "cr") {
|
||||
} else if (stat_lower == "cr") {
|
||||
CR = Strings::ToInt(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "cor") {
|
||||
} else if (stat_lower == "cor") {
|
||||
Corrup = Strings::ToInt(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "pr") {
|
||||
} else if (stat_lower == "pr") {
|
||||
PR = Strings::ToInt(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "dr") {
|
||||
} else if (stat_lower == "dr") {
|
||||
DR = Strings::ToInt(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "phr") {
|
||||
} else if (stat_lower == "phr") {
|
||||
PhR = Strings::ToInt(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "runspeed") {
|
||||
} else if (stat_lower == "runspeed") {
|
||||
runspeed = Strings::ToFloat(value);
|
||||
base_runspeed = (int) (runspeed * 40.0f);
|
||||
base_walkspeed = base_runspeed * 100 / 265;
|
||||
@ -2375,297 +2341,229 @@ void NPC::ModifyNPCStat(const std::string& stat, const std::string& value)
|
||||
base_fearspeed = base_runspeed * 100 / 127;
|
||||
fearspeed = ((float) base_fearspeed) * 0.025f;
|
||||
CalcBonuses();
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "special_attacks") {
|
||||
} else if (stat_lower == "special_attacks") {
|
||||
NPCSpecialAttacks(value.c_str(), 0, true);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "special_abilities") {
|
||||
} else if (stat_lower == "special_abilities") {
|
||||
ProcessSpecialAbilities(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "attack_speed") {
|
||||
} else if (stat_lower == "attack_speed") {
|
||||
attack_speed = Strings::ToFloat(value);
|
||||
CalcBonuses();
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "attack_delay") {
|
||||
} else if (stat_lower == "attack_delay") {
|
||||
/* TODO: fix DB */
|
||||
attack_delay = Strings::ToInt(value) * 100;
|
||||
CalcBonuses();
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "atk") {
|
||||
} else if (stat_lower == "atk") {
|
||||
ATK = Strings::ToInt(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "accuracy") {
|
||||
} else if (stat_lower == "accuracy") {
|
||||
accuracy_rating = Strings::ToInt(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "avoidance") {
|
||||
} else if (stat_lower == "avoidance") {
|
||||
avoidance_rating = Strings::ToInt(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "trackable") {
|
||||
} else if (stat_lower == "trackable") {
|
||||
trackable = Strings::ToInt(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "min_hit") {
|
||||
min_dmg = Strings::ToInt(value);
|
||||
} else if (stat_lower == "min_hit") {
|
||||
min_dmg = Strings::ToInt(value);
|
||||
// Clamp max_dmg to be >= min_dmg
|
||||
max_dmg = std::max(min_dmg, max_dmg);
|
||||
max_dmg = std::max(min_dmg, max_dmg);
|
||||
base_damage = round((max_dmg - min_dmg) / 1.9);
|
||||
min_damage = min_dmg - round(base_damage / 10.0);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "max_hit") {
|
||||
max_dmg = Strings::ToInt(value);
|
||||
} else if (stat_lower == "max_hit") {
|
||||
max_dmg = Strings::ToInt(value);
|
||||
// Clamp min_dmg to be <= max_dmg
|
||||
min_dmg = std::min(min_dmg, max_dmg);
|
||||
min_dmg = std::min(min_dmg, max_dmg);
|
||||
base_damage = round((max_dmg - min_dmg) / 1.9);
|
||||
min_damage = min_dmg - round(base_damage / 10.0);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "attack_count") {
|
||||
} else if (stat_lower == "attack_count") {
|
||||
attack_count = Strings::ToInt(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "see_invis") {
|
||||
} else if (stat_lower == "see_invis") {
|
||||
see_invis = Strings::ToInt(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "see_invis_undead") {
|
||||
} else if (stat_lower == "see_invis_undead") {
|
||||
see_invis_undead = Strings::ToInt(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "see_hide") {
|
||||
} else if (stat_lower == "see_hide") {
|
||||
see_hide = Strings::ToInt(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "see_improved_hide") {
|
||||
} else if (stat_lower == "see_improved_hide") {
|
||||
see_improved_hide = Strings::ToInt(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "hp_regen") {
|
||||
} else if (stat_lower == "hp_regen") {
|
||||
hp_regen = Strings::ToBigInt(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "hp_regen_per_second") {
|
||||
} else if (stat_lower == "hp_regen_per_second") {
|
||||
hp_regen_per_second = Strings::ToBigInt(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "mana_regen") {
|
||||
} else if (stat_lower == "mana_regen") {
|
||||
mana_regen = Strings::ToBigInt(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "level") {
|
||||
} else if (stat_lower == "level") {
|
||||
SetLevel(Strings::ToInt(value));
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "aggro") {
|
||||
} else if (stat_lower == "aggro") {
|
||||
pAggroRange = Strings::ToFloat(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "assist") {
|
||||
} else if (stat_lower == "assist") {
|
||||
pAssistRange = Strings::ToFloat(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "slow_mitigation") {
|
||||
} else if (stat_lower == "slow_mitigation") {
|
||||
slow_mitigation = Strings::ToInt(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "loottable_id") {
|
||||
} else if (stat_lower == "loottable_id") {
|
||||
m_loottable_id = Strings::ToFloat(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "healscale") {
|
||||
} else if (stat_lower == "healscale") {
|
||||
healscale = Strings::ToFloat(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "spellscale") {
|
||||
} else if (stat_lower == "spellscale") {
|
||||
spellscale = Strings::ToFloat(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "npc_spells_id") {
|
||||
} else if (stat_lower == "npc_spells_id") {
|
||||
AI_AddNPCSpells(Strings::ToInt(value));
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "npc_spells_effects_id") {
|
||||
} else if (stat_lower == "npc_spells_effects_id") {
|
||||
AI_AddNPCSpellsEffects(Strings::ToInt(value));
|
||||
CalcBonuses();
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "heroic_strikethrough") {
|
||||
} else if (stat_lower == "heroic_strikethrough") {
|
||||
heroic_strikethrough = Strings::ToInt(value);
|
||||
return;
|
||||
}
|
||||
else if (stat_lower == "keeps_sold_items") {
|
||||
} else if (stat_lower == "keeps_sold_items") {
|
||||
SetKeepsSoldItems(Strings::ToBool(value));
|
||||
return;
|
||||
} else if (stat_lower == "charm_ac") {
|
||||
charm_ac = Strings::ToInt(value);
|
||||
} else if (stat_lower == "charm_min_dmg") {
|
||||
charm_min_dmg = Strings::ToInt(value);
|
||||
} else if (stat_lower == "charm_max_dmg") {
|
||||
charm_max_dmg = Strings::ToInt(value);
|
||||
} else if (stat_lower == "charm_attack_delay") {
|
||||
charm_attack_delay = Strings::ToInt(value);
|
||||
} else if (stat_lower == "charm_accuracy_rating") {
|
||||
charm_accuracy_rating = Strings::ToInt(value);
|
||||
} else if (stat_lower == "charm_avoidance_rating") {
|
||||
charm_avoidance_rating = Strings::ToInt(value);
|
||||
} else if (stat_lower == "charm_atk") {
|
||||
charm_atk = Strings::ToInt(value);
|
||||
} else if (stat_lower == "default_ac") {
|
||||
default_ac = Strings::ToInt(value);
|
||||
} else if (stat_lower == "default_min_dmg") {
|
||||
default_min_dmg = Strings::ToInt(value);
|
||||
} else if (stat_lower == "default_max_dmg") {
|
||||
default_max_dmg = Strings::ToInt(value);
|
||||
} else if (stat_lower == "default_attack_delay") {
|
||||
default_attack_delay = Strings::ToInt(value);
|
||||
} else if (stat_lower == "default_accuracy_rating") {
|
||||
default_accuracy_rating = Strings::ToInt(value);
|
||||
} else if (stat_lower == "default_avoidance_rating") {
|
||||
default_avoidance_rating = Strings::ToInt(value);
|
||||
} else if (stat_lower == "default_atk") {
|
||||
default_atk = Strings::ToInt(value);
|
||||
}
|
||||
}
|
||||
|
||||
float NPC::GetNPCStat(const std::string& stat)
|
||||
{
|
||||
const std::string& stat_lower = Strings::ToLower(stat);
|
||||
|
||||
if (auto stat_lower = Strings::ToLower(stat); stat_lower == "ac") {
|
||||
if (stat_lower == "ac") {
|
||||
return AC;
|
||||
}
|
||||
else if (stat_lower == "str") {
|
||||
} else if (stat_lower == "str") {
|
||||
return STR;
|
||||
}
|
||||
else if (stat_lower == "sta") {
|
||||
} else if (stat_lower == "sta") {
|
||||
return STA;
|
||||
}
|
||||
else if (stat_lower == "agi") {
|
||||
} else if (stat_lower == "agi") {
|
||||
return AGI;
|
||||
}
|
||||
else if (stat_lower == "dex") {
|
||||
} else if (stat_lower == "dex") {
|
||||
return DEX;
|
||||
}
|
||||
else if (stat_lower == "wis") {
|
||||
} else if (stat_lower == "wis") {
|
||||
return WIS;
|
||||
}
|
||||
else if (stat_lower == "int" || stat_lower == "_int") {
|
||||
} else if (stat_lower == "int" || stat_lower == "_int") {
|
||||
return INT;
|
||||
}
|
||||
else if (stat_lower == "cha") {
|
||||
} else if (stat_lower == "cha") {
|
||||
return CHA;
|
||||
}
|
||||
else if (stat_lower == "max_hp") {
|
||||
} else if (stat_lower == "max_hp") {
|
||||
return base_hp;
|
||||
}
|
||||
else if (stat_lower == "max_mana") {
|
||||
} else if (stat_lower == "max_mana") {
|
||||
return npc_mana;
|
||||
}
|
||||
else if (stat_lower == "mr") {
|
||||
} else if (stat_lower == "mr") {
|
||||
return MR;
|
||||
}
|
||||
else if (stat_lower == "fr") {
|
||||
} else if (stat_lower == "fr") {
|
||||
return FR;
|
||||
}
|
||||
else if (stat_lower == "cr") {
|
||||
} else if (stat_lower == "cr") {
|
||||
return CR;
|
||||
}
|
||||
else if (stat_lower == "cor") {
|
||||
} else if (stat_lower == "cor") {
|
||||
return Corrup;
|
||||
}
|
||||
else if (stat_lower == "phr") {
|
||||
} else if (stat_lower == "phr") {
|
||||
return PhR;
|
||||
}
|
||||
else if (stat_lower == "pr") {
|
||||
} else if (stat_lower == "pr") {
|
||||
return PR;
|
||||
}
|
||||
else if (stat_lower == "dr") {
|
||||
} else if (stat_lower == "dr") {
|
||||
return DR;
|
||||
}
|
||||
else if (stat_lower == "runspeed") {
|
||||
} else if (stat_lower == "runspeed") {
|
||||
return runspeed;
|
||||
}
|
||||
else if (stat_lower == "attack_speed") {
|
||||
} else if (stat_lower == "attack_speed") {
|
||||
return attack_speed;
|
||||
}
|
||||
else if (stat_lower == "attack_delay") {
|
||||
} else if (stat_lower == "attack_delay") {
|
||||
return attack_delay;
|
||||
}
|
||||
else if (stat_lower == "atk") {
|
||||
} else if (stat_lower == "atk") {
|
||||
return ATK;
|
||||
}
|
||||
else if (stat_lower == "accuracy") {
|
||||
} else if (stat_lower == "accuracy") {
|
||||
return accuracy_rating;
|
||||
}
|
||||
else if (stat_lower == "avoidance") {
|
||||
} else if (stat_lower == "avoidance") {
|
||||
return avoidance_rating;
|
||||
}
|
||||
else if (stat_lower == "trackable") {
|
||||
} else if (stat_lower == "trackable") {
|
||||
return trackable;
|
||||
}
|
||||
else if (stat_lower == "min_hit") {
|
||||
} else if (stat_lower == "min_hit") {
|
||||
return min_dmg;
|
||||
}
|
||||
else if (stat_lower == "max_hit") {
|
||||
} else if (stat_lower == "max_hit") {
|
||||
return max_dmg;
|
||||
}
|
||||
else if (stat_lower == "attack_count") {
|
||||
} else if (stat_lower == "attack_count") {
|
||||
return attack_count;
|
||||
}
|
||||
else if (stat_lower == "see_invis") {
|
||||
} else if (stat_lower == "see_invis") {
|
||||
return see_invis;
|
||||
}
|
||||
else if (stat_lower == "see_invis_undead") {
|
||||
} else if (stat_lower == "see_invis_undead") {
|
||||
return see_invis_undead;
|
||||
}
|
||||
else if (stat_lower == "see_hide") {
|
||||
} else if (stat_lower == "see_hide") {
|
||||
return see_hide;
|
||||
}
|
||||
else if (stat_lower == "see_improved_hide") {
|
||||
} else if (stat_lower == "see_improved_hide") {
|
||||
return see_improved_hide;
|
||||
}
|
||||
else if (stat_lower == "hp_regen") {
|
||||
} else if (stat_lower == "hp_regen") {
|
||||
return hp_regen;
|
||||
}
|
||||
else if (stat_lower == "hp_regen_per_second") {
|
||||
} else if (stat_lower == "hp_regen_per_second") {
|
||||
return hp_regen_per_second;
|
||||
}
|
||||
else if (stat_lower == "mana_regen") {
|
||||
} else if (stat_lower == "mana_regen") {
|
||||
return mana_regen;
|
||||
}
|
||||
else if (stat_lower == "level") {
|
||||
} else if (stat_lower == "level") {
|
||||
return GetOrigLevel();
|
||||
}
|
||||
else if (stat_lower == "aggro") {
|
||||
} else if (stat_lower == "aggro") {
|
||||
return pAggroRange;
|
||||
}
|
||||
else if (stat_lower == "assist") {
|
||||
} else if (stat_lower == "assist") {
|
||||
return pAssistRange;
|
||||
}
|
||||
else if (stat_lower == "slow_mitigation") {
|
||||
} else if (stat_lower == "slow_mitigation") {
|
||||
return slow_mitigation;
|
||||
}
|
||||
else if (stat_lower == "loottable_id") {
|
||||
} else if (stat_lower == "loottable_id") {
|
||||
return m_loottable_id;
|
||||
}
|
||||
else if (stat_lower == "healscale") {
|
||||
} else if (stat_lower == "healscale") {
|
||||
return healscale;
|
||||
}
|
||||
else if (stat_lower == "spellscale") {
|
||||
} else if (stat_lower == "spellscale") {
|
||||
return spellscale;
|
||||
}
|
||||
else if (stat_lower == "npc_spells_id") {
|
||||
} else if (stat_lower == "npc_spells_id") {
|
||||
return npc_spells_id;
|
||||
}
|
||||
else if (stat_lower == "npc_spells_effects_id") {
|
||||
} else if (stat_lower == "npc_spells_effects_id") {
|
||||
return npc_spells_effects_id;
|
||||
}
|
||||
else if (stat_lower == "heroic_strikethrough") {
|
||||
} else if (stat_lower == "heroic_strikethrough") {
|
||||
return heroic_strikethrough;
|
||||
}
|
||||
else if (stat_lower == "keeps_sold_items") {
|
||||
} else if (stat_lower == "keeps_sold_items") {
|
||||
return keeps_sold_items;
|
||||
}
|
||||
//default values
|
||||
else if (stat_lower == "default_ac") {
|
||||
} else if (stat_lower == "default_ac") {
|
||||
return default_ac;
|
||||
}
|
||||
else if (stat_lower == "default_min_hit") {
|
||||
} else if (stat_lower == "default_min_hit") {
|
||||
return default_min_dmg;
|
||||
}
|
||||
else if (stat_lower == "default_max_hit") {
|
||||
} else if (stat_lower == "default_max_hit") {
|
||||
return default_max_dmg;
|
||||
}
|
||||
else if (stat_lower == "default_attack_delay") {
|
||||
} else if (stat_lower == "default_attack_delay") {
|
||||
return default_attack_delay;
|
||||
}
|
||||
else if (stat_lower == "default_accuracy") {
|
||||
} else if (stat_lower == "default_accuracy") {
|
||||
return default_accuracy_rating;
|
||||
}
|
||||
else if (stat_lower == "default_avoidance") {
|
||||
} else if (stat_lower == "default_avoidance") {
|
||||
return default_avoidance_rating;
|
||||
}
|
||||
else if (stat_lower == "default_atk") {
|
||||
} else if (stat_lower == "default_atk") {
|
||||
return default_atk;
|
||||
} else if (stat_lower == "charm_ac") {
|
||||
return charm_ac;
|
||||
} else if (stat_lower == "charm_min_hit") {
|
||||
return charm_min_dmg;
|
||||
} else if (stat_lower == "charm_max_hit") {
|
||||
return charm_max_dmg;
|
||||
} else if (stat_lower == "charm_attack_delay") {
|
||||
return charm_attack_delay;
|
||||
} else if (stat_lower == "charm_accuracy") {
|
||||
return charm_accuracy_rating;
|
||||
} else if (stat_lower == "charm_avoidance") {
|
||||
return charm_avoidance_rating;
|
||||
} else if (stat_lower == "charm_atk") {
|
||||
return charm_atk;
|
||||
}
|
||||
|
||||
return 0.0f;
|
||||
@ -2901,7 +2799,7 @@ void NPC::DoNPCEmote(uint8 event_, uint32 emote_id, Mob* t)
|
||||
// Mob Variables
|
||||
Strings::FindReplace(processed, "$mname", GetCleanName());
|
||||
Strings::FindReplace(processed, "$mracep", GetRacePlural());
|
||||
Strings::FindReplace(processed, "$mrace", GetPlayerRaceName(GetRace()));
|
||||
Strings::FindReplace(processed, "$mrace", GetRaceIDName(GetRace()));
|
||||
Strings::FindReplace(processed, "$mclass", GetClassIDName(GetClass()));
|
||||
Strings::FindReplace(processed, "$mclassp", GetClassPlural());
|
||||
|
||||
@ -2909,7 +2807,7 @@ void NPC::DoNPCEmote(uint8 event_, uint32 emote_id, Mob* t)
|
||||
Strings::FindReplace(processed, "$name", t ? t->GetCleanName() : "foe");
|
||||
Strings::FindReplace(processed, "$class", t ? GetClassIDName(t->GetClass()) : "class");
|
||||
Strings::FindReplace(processed, "$classp", t ? t->GetClassPlural() : "classes");
|
||||
Strings::FindReplace(processed, "$race", t ? GetPlayerRaceName(t->GetRace()) : "race");
|
||||
Strings::FindReplace(processed, "$race", t ? GetRaceIDName(t->GetRace()) : "race");
|
||||
Strings::FindReplace(processed, "$racep", t ? t->GetRacePlural() : "races");
|
||||
|
||||
if (emoteid == e->emoteid) {
|
||||
@ -3387,62 +3285,55 @@ void NPC::DepopSwarmPets()
|
||||
}
|
||||
}
|
||||
|
||||
void NPC::ModifyStatsOnCharm(bool is_charm_removed)
|
||||
void NPC::ModifyStatsOnCharm(bool remove_charm, Mob* charmer)
|
||||
{
|
||||
if (is_charm_removed) {
|
||||
if (charm_ac) {
|
||||
AC = default_ac;
|
||||
}
|
||||
if (charm_attack_delay) {
|
||||
attack_delay = default_attack_delay;
|
||||
}
|
||||
if (charm_accuracy_rating) {
|
||||
accuracy_rating = default_accuracy_rating;
|
||||
}
|
||||
if (charm_avoidance_rating) {
|
||||
avoidance_rating = default_avoidance_rating;
|
||||
}
|
||||
if (charm_atk) {
|
||||
ATK = default_atk;
|
||||
}
|
||||
if (charm_min_dmg || charm_max_dmg) {
|
||||
base_damage = round((default_max_dmg - default_min_dmg) / 1.9);
|
||||
min_damage = default_min_dmg - round(base_damage / 10.0);
|
||||
}
|
||||
if (RuleB(Spells, CharmDisablesSpecialAbilities)) {
|
||||
ProcessSpecialAbilities(default_special_abilities);
|
||||
}
|
||||
|
||||
SetAttackTimer();
|
||||
CalcAC();
|
||||
|
||||
return;
|
||||
if (!remove_charm && parse->HasQuestSub(GetNPCTypeID(), EVENT_CHARM_START)) {
|
||||
parse->EventNPC(EVENT_CHARM_START, this, charmer, "", 0);
|
||||
} else if (remove_charm && parse->HasQuestSub(GetNPCTypeID(), EVENT_CHARM_END)) {
|
||||
parse->EventNPC(EVENT_CHARM_END, this, charmer, "", 0);
|
||||
}
|
||||
|
||||
if (charm_ac) {
|
||||
AC = charm_ac;
|
||||
const int new_ac = remove_charm ? default_ac : charm_ac;
|
||||
const int new_attack_delay = remove_charm ? default_attack_delay : charm_attack_delay;
|
||||
const int new_accuracy_rating = remove_charm ? default_accuracy_rating : charm_accuracy_rating;
|
||||
const int new_avoidance_rating = remove_charm ? default_avoidance_rating : charm_avoidance_rating;
|
||||
const int new_atk = remove_charm ? default_atk : charm_atk;
|
||||
const int new_min_dmg = remove_charm ? default_min_dmg : charm_min_dmg;
|
||||
const int new_max_dmg = remove_charm ? default_max_dmg : charm_max_dmg;
|
||||
|
||||
if (new_ac) {
|
||||
AC = new_ac;
|
||||
}
|
||||
if (charm_attack_delay) {
|
||||
attack_delay = charm_attack_delay;
|
||||
|
||||
if (new_attack_delay) {
|
||||
attack_delay = new_attack_delay;
|
||||
}
|
||||
if (charm_accuracy_rating) {
|
||||
accuracy_rating = charm_accuracy_rating;
|
||||
|
||||
if (new_accuracy_rating) {
|
||||
accuracy_rating = new_accuracy_rating;
|
||||
}
|
||||
if (charm_avoidance_rating) {
|
||||
avoidance_rating = charm_avoidance_rating;
|
||||
|
||||
if (new_avoidance_rating) {
|
||||
avoidance_rating = new_avoidance_rating;
|
||||
}
|
||||
if (charm_atk) {
|
||||
ATK = charm_atk;
|
||||
|
||||
if (new_atk) {
|
||||
ATK = new_atk;
|
||||
}
|
||||
if (charm_min_dmg || charm_max_dmg) {
|
||||
base_damage = round((charm_max_dmg - charm_min_dmg) / 1.9);
|
||||
min_damage = charm_min_dmg - round(base_damage / 10.0);
|
||||
|
||||
if (new_min_dmg || new_max_dmg) {
|
||||
base_damage = std::round((new_max_dmg - new_min_dmg) / 1.9);
|
||||
min_damage = new_min_dmg - std::round(base_damage / 10.0);
|
||||
}
|
||||
|
||||
if (RuleB(Spells, CharmDisablesSpecialAbilities)) {
|
||||
ClearSpecialAbilities();
|
||||
if (remove_charm) {
|
||||
ProcessSpecialAbilities(default_special_abilities);
|
||||
} else {
|
||||
ClearSpecialAbilities();
|
||||
}
|
||||
}
|
||||
|
||||
// the rest of the stats aren't cached, so lets just do these two instead of full CalcBonuses()
|
||||
SetAttackTimer();
|
||||
CalcAC();
|
||||
}
|
||||
@ -3792,7 +3683,7 @@ bool NPC::IsGuard()
|
||||
case Race::HalasCitizen:
|
||||
case Race::NeriakCitizen:
|
||||
case Race::GrobbCitizen:
|
||||
case OGGOK_CITIZEN:
|
||||
case Race::OggokCitizen:
|
||||
case Race::KaladimCitizen:
|
||||
return true;
|
||||
default:
|
||||
|
||||
@ -346,7 +346,7 @@ public:
|
||||
int64 GetNPCHPRegen() const { return hp_regen + itembonuses.HPRegen + spellbonuses.HPRegen; }
|
||||
inline const char* GetAmmoIDfile() const { return ammo_idfile; }
|
||||
|
||||
void ModifyStatsOnCharm(bool is_charm_removed);
|
||||
void ModifyStatsOnCharm(bool remove_charm, Mob* charmer);
|
||||
|
||||
//waypoint crap
|
||||
int GetMaxWp() const { return max_wp; }
|
||||
|
||||
@ -61,6 +61,7 @@ void Client::SendBulkParcels()
|
||||
inst->SetCharges(p.second.quantity);
|
||||
inst->SetMerchantCount(1);
|
||||
inst->SetMerchantSlot(p.second.slot_id);
|
||||
inst->SetEvolveCurrentAmount(p.second.evolve_amount);
|
||||
if (inst->IsStackable()) {
|
||||
inst->SetCharges(p.second.quantity);
|
||||
}
|
||||
@ -164,6 +165,7 @@ void Client::SendParcel(Parcel_Struct &parcel_in)
|
||||
inst->SetCharges(p.quantity);
|
||||
inst->SetMerchantCount(1);
|
||||
inst->SetMerchantSlot(p.slot_id);
|
||||
inst->SetEvolveCurrentAmount(p.evolve_amount);
|
||||
if (inst->IsStackable()) {
|
||||
inst->SetCharges(p.quantity);
|
||||
}
|
||||
@ -381,23 +383,23 @@ void Client::DoParcelSend(const Parcel_Struct *parcel_in)
|
||||
return;
|
||||
}
|
||||
|
||||
uint32 quantity{};
|
||||
uint32 quantity = 1;
|
||||
if (inst->IsStackable()) {
|
||||
quantity = parcel_in->quantity;
|
||||
}
|
||||
else {
|
||||
quantity = inst->GetCharges() >= 0 ? inst->GetCharges() : parcel_in->quantity;
|
||||
} else if (inst->GetItem()->MaxCharges > 0) {
|
||||
quantity = inst->GetCharges();
|
||||
}
|
||||
|
||||
CharacterParcelsRepository::CharacterParcels parcel_out{};
|
||||
parcel_out.from_name = GetName();
|
||||
parcel_out.note = parcel_in->note;
|
||||
parcel_out.sent_date = time(nullptr);
|
||||
parcel_out.quantity = quantity;
|
||||
parcel_out.item_id = inst->GetID();
|
||||
parcel_out.char_id = send_to_client.at(0).char_id;
|
||||
parcel_out.slot_id = next_slot;
|
||||
parcel_out.id = 0;
|
||||
parcel_out.from_name = GetName();
|
||||
parcel_out.note = parcel_in->note;
|
||||
parcel_out.sent_date = time(nullptr);
|
||||
parcel_out.quantity = quantity;
|
||||
parcel_out.item_id = inst->GetID();
|
||||
parcel_out.char_id = send_to_client.at(0).char_id;
|
||||
parcel_out.slot_id = next_slot;
|
||||
parcel_out.evolve_amount = inst->GetEvolveCurrentAmount();
|
||||
parcel_out.id = 0;
|
||||
|
||||
if (inst->IsAugmented()) {
|
||||
auto augs = inst->GetAugmentIDs();
|
||||
@ -445,7 +447,9 @@ void Client::DoParcelSend(const Parcel_Struct *parcel_in)
|
||||
cpc.aug_slot_5 = augs.at(4);
|
||||
cpc.aug_slot_6 = augs.at(5);
|
||||
}
|
||||
cpc.quantity = kv.second->GetCharges() >= 0 ? kv.second->GetCharges() : 1;
|
||||
|
||||
cpc.quantity = kv.second->GetCharges() >= 0 ? kv.second->GetCharges() : 1;
|
||||
cpc.evolve_amount = kv.second->GetEvolveCurrentAmount();
|
||||
all_entries.push_back(cpc);
|
||||
}
|
||||
CharacterParcelsContainersRepository::InsertMany(database, all_entries);
|
||||
@ -679,6 +683,8 @@ void Client::DoParcelRetrieve(const ParcelRetrieve_Struct &parcel_in)
|
||||
return;
|
||||
}
|
||||
|
||||
inst->SetEvolveCurrentAmount(p->second.evolve_amount);
|
||||
|
||||
if (inst->IsStackable()) {
|
||||
inst->SetCharges(item_quantity > 0 ? item_quantity : 1);
|
||||
}
|
||||
@ -715,6 +721,8 @@ void Client::DoParcelRetrieve(const ParcelRetrieve_Struct &parcel_in)
|
||||
return;
|
||||
}
|
||||
|
||||
item->SetEvolveCurrentAmount(i.evolve_amount);
|
||||
|
||||
if (CheckLoreConflict(item->GetItem())) {
|
||||
if (RuleB(Parcel, DeleteOnDuplicate)) {
|
||||
MessageString(Chat::Yellow, PARCEL_DUPLICATE_DELETE, inst->GetItem()->Name);
|
||||
|
||||
@ -547,22 +547,22 @@ void NPC::SetPetState(SpellBuff_Struct *pet_buffs, uint32 *items) {
|
||||
if (buffs[j1].spellid <= (uint32)SPDAT_RECORDS) {
|
||||
for (int x1=0; x1 < EFFECT_COUNT; x1++) {
|
||||
switch (spells[buffs[j1].spellid].effect_id[x1]) {
|
||||
case SE_AddMeleeProc:
|
||||
case SE_WeaponProc:
|
||||
case SpellEffect::AddMeleeProc:
|
||||
case SpellEffect::WeaponProc:
|
||||
// We need to reapply buff based procs
|
||||
// We need to do this here so suspended pets also regain their procs.
|
||||
AddProcToWeapon(GetProcID(buffs[j1].spellid,x1), false, 100+spells[buffs[j1].spellid].limit_value[x1], buffs[j1].spellid, buffs[j1].casterlevel, GetSpellProcLimitTimer(buffs[j1].spellid, ProcType::MELEE_PROC));
|
||||
break;
|
||||
case SE_DefensiveProc:
|
||||
case SpellEffect::DefensiveProc:
|
||||
AddDefensiveProc(GetProcID(buffs[j1].spellid, x1), 100 + spells[buffs[j1].spellid].limit_value[x1], buffs[j1].spellid, GetSpellProcLimitTimer(buffs[j1].spellid, ProcType::DEFENSIVE_PROC));
|
||||
break;
|
||||
case SE_RangedProc:
|
||||
case SpellEffect::RangedProc:
|
||||
AddRangedProc(GetProcID(buffs[j1].spellid, x1), 100 + spells[buffs[j1].spellid].limit_value[x1], buffs[j1].spellid, GetSpellProcLimitTimer(buffs[j1].spellid, ProcType::RANGED_PROC));
|
||||
break;
|
||||
case SE_Charm:
|
||||
case SE_Rune:
|
||||
case SE_NegateAttacks:
|
||||
case SE_Illusion:
|
||||
case SpellEffect::Charm:
|
||||
case SpellEffect::Rune:
|
||||
case SpellEffect::NegateAttacks:
|
||||
case SpellEffect::Illusion:
|
||||
buffs[j1].spellid = SPELL_UNKNOWN;
|
||||
pet_buffs[j1].spellid = SPELLBOOK_UNKNOWN;
|
||||
pet_buffs[j1].effect_type = 0;
|
||||
|
||||
@ -352,9 +352,9 @@ void Client::OPCombatAbility(const CombatAbility_Struct *ca_atk)
|
||||
|
||||
if (ca_atk->m_skill == EQ::skills::SkillBash) { // SLAM - Bash without a shield equipped
|
||||
switch (GetRace()) {
|
||||
case OGRE:
|
||||
case TROLL:
|
||||
case BARBARIAN:
|
||||
case Race::Ogre:
|
||||
case Race::Troll:
|
||||
case Race::Barbarian:
|
||||
bypass_skill_check = true;
|
||||
default:
|
||||
break;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
106
zone/spells.cpp
106
zone/spells.cpp
@ -218,11 +218,11 @@ bool Mob::CastSpell(uint16 spell_id, uint16 target_id, CastingSlot slot,
|
||||
|
||||
//It appears that the Sanctuary effect is removed by a check on the client side (keep this however for redundancy)
|
||||
if (spellbonuses.Sanctuary && (spells[spell_id].target_type != ST_Self && GetTarget() != this) || IsDetrimentalSpell(spell_id)) {
|
||||
BuffFadeByEffect(SE_Sanctuary);
|
||||
BuffFadeByEffect(SpellEffect::Sanctuary);
|
||||
}
|
||||
|
||||
if (spellbonuses.NegateIfCombat) {
|
||||
BuffFadeByEffect(SE_NegateIfCombat);
|
||||
BuffFadeByEffect(SpellEffect::NegateIfCombat);
|
||||
}
|
||||
|
||||
if(GetTarget() && IsManaTapSpell(spell_id)) {
|
||||
@ -696,7 +696,7 @@ bool Mob::DoCastingChecksZoneRestrictions(bool check_on_casting, int32 spell_id)
|
||||
},
|
||||
// Levitation restriction
|
||||
{
|
||||
[&]() { return !bypass_casting_restrictions && !zone->CanLevitate() && IsEffectInSpell(spell_id, SE_Levitate); },
|
||||
[&]() { return !bypass_casting_restrictions && !zone->CanLevitate() && IsEffectInSpell(spell_id, SpellEffect::Levitate); },
|
||||
[&]() {
|
||||
if (gm_bypass_message("zone levitation restrictions")) { return true; }
|
||||
Message(Chat::Red, "You have entered an area where levitation effects do not function.");
|
||||
@ -858,7 +858,7 @@ bool Mob::DoCastingChecksOnTarget(bool check_on_casting, int32 spell_id, Mob *sp
|
||||
/*
|
||||
Cannot cast shield target on self
|
||||
*/
|
||||
if (this == spell_target && IsEffectInSpell(spell_id, SE_Shield_Target)) {
|
||||
if (this == spell_target && IsEffectInSpell(spell_id, SpellEffect::Shield_Target)) {
|
||||
LogSpells("You cannot shield yourself");
|
||||
Message(Chat::SpellFailure, "You cannot shield yourself.");
|
||||
return false;
|
||||
@ -890,7 +890,7 @@ bool Mob::DoCastingChecksOnTarget(bool check_on_casting, int32 spell_id, Mob *sp
|
||||
/*
|
||||
Various charm related target restrictions
|
||||
*/
|
||||
if (IsEffectInSpell(spell_id, SE_Charm) && !PassCharmTargetRestriction(spell_target)) {
|
||||
if (IsEffectInSpell(spell_id, SpellEffect::Charm) && !PassCharmTargetRestriction(spell_target)) {
|
||||
LogSpells("Spell casting canceled [{}] : can not use charm on this target.", spell_id);
|
||||
return false;
|
||||
}
|
||||
@ -1669,7 +1669,7 @@ void Mob::CastedSpellFinished(uint16 spell_id, uint32 target_id, CastingSlot slo
|
||||
|
||||
// handle the components for traditional casters
|
||||
else {
|
||||
if (!RuleB(Character, PetsUseReagents) && (IsEffectInSpell(spell_id, SE_SummonPet) || IsEffectInSpell(spell_id, SE_NecPet)) ||
|
||||
if (!RuleB(Character, PetsUseReagents) && (IsEffectInSpell(spell_id, SpellEffect::SummonPet) || IsEffectInSpell(spell_id, SpellEffect::NecPet)) ||
|
||||
(IsBardSong(spell_id) && (slot == CastingSlot::Item|| slot == CastingSlot::PotionBelt))) {
|
||||
//bypass reagent cost
|
||||
}
|
||||
@ -1706,7 +1706,7 @@ void Mob::CastedSpellFinished(uint16 spell_id, uint32 target_id, CastingSlot slo
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (!RuleB(Character, PetsUseReagents) && (IsEffectInSpell(spell_id, SE_SummonPet) || IsEffectInSpell(spell_id, SE_NecPet))) {
|
||||
else if (!RuleB(Character, PetsUseReagents) && (IsEffectInSpell(spell_id, SpellEffect::SummonPet) || IsEffectInSpell(spell_id, SpellEffect::NecPet))) {
|
||||
//bypass reagent cost
|
||||
}
|
||||
else if (!bard_song_mode)
|
||||
@ -1922,7 +1922,7 @@ bool Mob::DetermineSpellTargets(uint16 spell_id, Mob *&spell_target, Mob *&ae_ce
|
||||
case ST_Self:
|
||||
{
|
||||
bool bot_can_summon_corpse = IsBot() &&
|
||||
IsEffectInSpell(spell_id, SE_SummonCorpse) &&
|
||||
IsEffectInSpell(spell_id, SpellEffect::SummonCorpse) &&
|
||||
RuleB(Bots, AllowCommandedSummonCorpse);
|
||||
|
||||
if (!bot_can_summon_corpse) {
|
||||
@ -2878,7 +2878,7 @@ bool Mob::SpellFinished(uint16 spell_id, Mob *spell_target, CastingSlot slot, in
|
||||
ApplyHealthTransferDamage(this, target, spell_id);
|
||||
|
||||
//This needs to be here for bind sight to update correctly on client.
|
||||
if (IsClient() && IsEffectInSpell(spell_id, SE_BindSight)) {
|
||||
if (IsClient() && IsEffectInSpell(spell_id, SpellEffect::BindSight)) {
|
||||
for (int i = 0; i < GetMaxTotalSlots(); i++) {
|
||||
if (buffs[i].spellid == spell_id) {
|
||||
CastToClient()->SendBuffNumHitPacket(buffs[i], i);//its hack, it works.
|
||||
@ -2911,7 +2911,7 @@ bool Mob::ApplyBardPulse(int32 spell_id, Mob *spell_target, CastingSlot slot) {
|
||||
Bard song charm that have no mana will continue to try and pulse on target, but will only reapply when charm fades.
|
||||
Live does not spam client with do not take hold messages. Checking here avoids that from happening. Only try to reapply if charm fades.
|
||||
*/
|
||||
if (spell_target->IsCharmed() && spells[spell_id].mana == 0 && spell_target->GetOwner() == this && IsEffectInSpell(spell_id, SE_Charm)) {
|
||||
if (spell_target->IsCharmed() && spells[spell_id].mana == 0 && spell_target->GetOwner() == this && IsEffectInSpell(spell_id, SpellEffect::Charm)) {
|
||||
if (IsClient()) {
|
||||
CastToClient()->CheckSongSkillIncrease(spell_id);
|
||||
}
|
||||
@ -2992,7 +2992,7 @@ int Mob::CalcBuffDuration(Mob *caster, Mob *target, uint16 spell_id, int32 caste
|
||||
) &&
|
||||
spell_id != SPELL_MINOR_ILLUSION &&
|
||||
spell_id != SPELL_ILLUSION_TREE &&
|
||||
IsEffectInSpell(spell_id, SE_Illusion)
|
||||
IsEffectInSpell(spell_id, SpellEffect::Illusion)
|
||||
) {
|
||||
res = 10000; // ~16h override
|
||||
}
|
||||
@ -3104,7 +3104,7 @@ int Mob::CheckStackConflict(uint16 spellid1, int caster_level1, uint16 spellid2,
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (spellbonuses.CompleteHealBuffBlocker && IsEffectInSpell(spellid2, SE_CompleteHeal)) {
|
||||
if (spellbonuses.CompleteHealBuffBlocker && IsEffectInSpell(spellid2, SpellEffect::CompleteHeal)) {
|
||||
Message(0, "You must wait before you can be affected by this spell again.");
|
||||
return -1;
|
||||
}
|
||||
@ -3116,9 +3116,9 @@ int Mob::CheckStackConflict(uint16 spellid1, int caster_level1, uint16 spellid2,
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!IsStackableDOT(spellid1) && !IsEffectInSpell(spellid1, SE_ManaBurn)) { // mana burn spells we need to use the stacking command blocks live actually checks those first, we should probably rework to that too
|
||||
if (!IsStackableDOT(spellid1) && !IsEffectInSpell(spellid1, SpellEffect::ManaBurn)) { // mana burn spells we need to use the stacking command blocks live actually checks those first, we should probably rework to that too
|
||||
if (caster_level1 > caster_level2) { // cur buff higher level than new
|
||||
if (IsEffectInSpell(spellid1, SE_ImprovedTaunt)) {
|
||||
if (IsEffectInSpell(spellid1, SpellEffect::ImprovedTaunt)) {
|
||||
LogSpells("SE_ImprovedTaunt level exception, overwriting");
|
||||
return 1;
|
||||
} else {
|
||||
@ -3162,12 +3162,12 @@ int Mob::CheckStackConflict(uint16 spellid1, int caster_level1, uint16 spellid2,
|
||||
if (spellid1 != spellid2) {
|
||||
for (i = 0; i < EFFECT_COUNT; i++) {
|
||||
// we don't want this optimization for mana burns
|
||||
if (sp1.effect_id[i] != sp2.effect_id[i] || sp1.effect_id[i] == SE_ManaBurn) {
|
||||
if (sp1.effect_id[i] != sp2.effect_id[i] || sp1.effect_id[i] == SpellEffect::ManaBurn) {
|
||||
effect_match = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if (IsEffectInSpell(spellid1, SE_ManaBurn)) {
|
||||
} else if (IsEffectInSpell(spellid1, SpellEffect::ManaBurn)) {
|
||||
LogSpells("We have a Mana Burn spell that is the same, they won't stack");
|
||||
return -1;
|
||||
}
|
||||
@ -3181,7 +3181,7 @@ int Mob::CheckStackConflict(uint16 spellid1, int caster_level1, uint16 spellid2,
|
||||
effect2 = sp2.effect_id[i];
|
||||
|
||||
if (spellbonuses.Screech == 1) {
|
||||
if (effect2 == SE_Screech && sp2.base_value[i] == -1) {
|
||||
if (effect2 == SpellEffect::Screech && sp2.base_value[i] == -1) {
|
||||
MessageString(Chat::SpellFailure, SCREECH_BUFF_BLOCK, sp2.name);
|
||||
return -1;
|
||||
}
|
||||
@ -3194,32 +3194,32 @@ int Mob::CheckStackConflict(uint16 spellid1, int caster_level1, uint16 spellid2,
|
||||
is not fully removed at the time of the trigger
|
||||
*/
|
||||
if (spellbonuses.AStacker[SBIndex::BUFFSTACKER_EXISTS]) {
|
||||
if ((effect2 == SE_AStacker) && (sp2.effect_id[i] <= spellbonuses.AStacker[SBIndex::BUFFSTACKER_VALUE]))
|
||||
if ((effect2 == SpellEffect::AStacker) && (sp2.effect_id[i] <= spellbonuses.AStacker[SBIndex::BUFFSTACKER_VALUE]))
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (spellbonuses.BStacker[SBIndex::BUFFSTACKER_EXISTS]) {
|
||||
if ((effect2 == SE_BStacker) && (sp2.effect_id[i] <= spellbonuses.BStacker[SBIndex::BUFFSTACKER_VALUE]))
|
||||
if ((effect2 == SpellEffect::BStacker) && (sp2.effect_id[i] <= spellbonuses.BStacker[SBIndex::BUFFSTACKER_VALUE]))
|
||||
return -1;
|
||||
if ((effect2 == SE_AStacker) && (!IsCastOnFadeDurationSpell(spellid1) && buffs[buffslot].ticsremaining != 1 && IsEffectInSpell(spellid1, SE_BStacker)))
|
||||
if ((effect2 == SpellEffect::AStacker) && (!IsCastOnFadeDurationSpell(spellid1) && buffs[buffslot].ticsremaining != 1 && IsEffectInSpell(spellid1, SpellEffect::BStacker)))
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (spellbonuses.CStacker[SBIndex::BUFFSTACKER_EXISTS]) {
|
||||
if ((effect2 == SE_CStacker) && (sp2.effect_id[i] <= spellbonuses.CStacker[SBIndex::BUFFSTACKER_VALUE]))
|
||||
if ((effect2 == SpellEffect::CStacker) && (sp2.effect_id[i] <= spellbonuses.CStacker[SBIndex::BUFFSTACKER_VALUE]))
|
||||
return -1;
|
||||
if ((effect2 == SE_BStacker) && (!IsCastOnFadeDurationSpell(spellid1) && buffs[buffslot].ticsremaining != 1 && IsEffectInSpell(spellid1, SE_CStacker)))
|
||||
if ((effect2 == SpellEffect::BStacker) && (!IsCastOnFadeDurationSpell(spellid1) && buffs[buffslot].ticsremaining != 1 && IsEffectInSpell(spellid1, SpellEffect::CStacker)))
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (spellbonuses.DStacker[SBIndex::BUFFSTACKER_EXISTS]) {
|
||||
if ((effect2 == SE_DStacker) && (sp2.effect_id[i] <= spellbonuses.DStacker[SBIndex::BUFFSTACKER_VALUE]))
|
||||
if ((effect2 == SpellEffect::DStacker) && (sp2.effect_id[i] <= spellbonuses.DStacker[SBIndex::BUFFSTACKER_VALUE]))
|
||||
return -1;
|
||||
if ((effect2 == SE_CStacker) && (!IsCastOnFadeDurationSpell(spellid1) && buffs[buffslot].ticsremaining != 1 && IsEffectInSpell(spellid1, SE_DStacker)))
|
||||
if ((effect2 == SpellEffect::CStacker) && (!IsCastOnFadeDurationSpell(spellid1) && buffs[buffslot].ticsremaining != 1 && IsEffectInSpell(spellid1, SpellEffect::DStacker)))
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(effect2 == SE_StackingCommand_Overwrite)
|
||||
if(effect2 == SpellEffect::StackingCommand_Overwrite)
|
||||
{
|
||||
overwrite_effect = sp2.base_value[i];
|
||||
overwrite_slot = sp2.formula[i] - 201; //they use base 1 for slots, we use base 0
|
||||
@ -3247,7 +3247,7 @@ int Mob::CheckStackConflict(uint16 spellid1, int caster_level1, uint16 spellid2,
|
||||
sp2.name, spellid2, overwrite_effect, overwrite_slot, overwrite_below_value);
|
||||
|
||||
}
|
||||
} else if (effect1 == SE_StackingCommand_Block)
|
||||
} else if (effect1 == SpellEffect::StackingCommand_Block)
|
||||
{
|
||||
blocked_effect = sp1.base_value[i];
|
||||
blocked_slot = sp1.formula[i] - 201;
|
||||
@ -3324,7 +3324,7 @@ int Mob::CheckStackConflict(uint16 spellid1, int caster_level1, uint16 spellid2,
|
||||
// negative AC affects are skipped. Ex. Sun's Corona and Glacier Breath should stack
|
||||
// There may be more SPAs we need to add here ....
|
||||
// The client does just check base rather than calculating the affect change value.
|
||||
if ((effect1 == SE_ArmorClass || effect1 == SE_ACv2) && sp2.base_value[i] < 0)
|
||||
if ((effect1 == SpellEffect::ArmorClass || effect1 == SpellEffect::ACv2) && sp2.base_value[i] < 0)
|
||||
continue;
|
||||
|
||||
/*
|
||||
@ -3332,13 +3332,13 @@ int Mob::CheckStackConflict(uint16 spellid1, int caster_level1, uint16 spellid2,
|
||||
If Caster1 isn't the same as Caster2 and the effect is a DoT then ignore it.
|
||||
*/
|
||||
if(IsNPC() && caster1 && caster2 && caster1 != caster2) {
|
||||
if(effect1 == SE_CurrentHP && sp1_detrimental && sp2_detrimental) {
|
||||
if(effect1 == SpellEffect::CurrentHP && sp1_detrimental && sp2_detrimental) {
|
||||
LogSpells("Both casters exist and are not the same, the effect is a detrimental dot, moving on");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if(effect1 == SE_CompleteHeal){ //SE_CompleteHeal never stacks or overwrites ever, always block.
|
||||
if(effect1 == SpellEffect::CompleteHeal){ //SE_CompleteHeal never stacks or overwrites ever, always block.
|
||||
LogSpells("Blocking spell because complete heal never stacks or overwries");
|
||||
return (-1);
|
||||
}
|
||||
@ -3347,7 +3347,7 @@ int Mob::CheckStackConflict(uint16 spellid1, int caster_level1, uint16 spellid2,
|
||||
If the spells aren't the same
|
||||
and the effect is a dot we can go ahead and stack it
|
||||
*/
|
||||
if(effect1 == SE_CurrentHP && spellid1 != spellid2 && sp1_detrimental && sp2_detrimental) {
|
||||
if(effect1 == SpellEffect::CurrentHP && spellid1 != spellid2 && sp1_detrimental && sp2_detrimental) {
|
||||
LogSpells("The spells are not the same and it is a detrimental dot, passing");
|
||||
continue;
|
||||
}
|
||||
@ -3356,7 +3356,7 @@ int Mob::CheckStackConflict(uint16 spellid1, int caster_level1, uint16 spellid2,
|
||||
sp2_value = CalcSpellEffectValue(spellid2, i, caster_level2);
|
||||
|
||||
// Spells like SoW won't stack if a snare effect is already in place.
|
||||
if (effect2 == SE_MovementSpeed && effect1 == SE_MovementSpeed) {
|
||||
if (effect2 == SpellEffect::MovementSpeed && effect1 == SpellEffect::MovementSpeed) {
|
||||
if (sp1_value < 0 && sp2_value > 0) {
|
||||
return -1;
|
||||
} else if (sp2_value < 0 && sp1_value > 0) {
|
||||
@ -3366,7 +3366,7 @@ int Mob::CheckStackConflict(uint16 spellid1, int caster_level1, uint16 spellid2,
|
||||
|
||||
// DoTs won't overwrite regeneration but will block regeneration spells.
|
||||
if (spells[spellid1].buff_duration > 0 && spells[spellid2].buff_duration > 0 &&
|
||||
effect1 == SE_CurrentHP && effect2 == SE_CurrentHP) {
|
||||
effect1 == SpellEffect::CurrentHP && effect2 == SpellEffect::CurrentHP) {
|
||||
if (!sp1_detrimental && sp2_detrimental) {
|
||||
continue;
|
||||
} else if (sp1_detrimental && !sp2_detrimental) {
|
||||
@ -3378,8 +3378,8 @@ int Mob::CheckStackConflict(uint16 spellid1, int caster_level1, uint16 spellid2,
|
||||
// have a value that's a percentage for instance
|
||||
if
|
||||
(
|
||||
effect1 == SE_AttackSpeed ||
|
||||
effect1 == SE_AttackSpeed2
|
||||
effect1 == SpellEffect::AttackSpeed ||
|
||||
effect1 == SpellEffect::AttackSpeed2
|
||||
)
|
||||
{
|
||||
sp1_value -= 100;
|
||||
@ -3929,7 +3929,7 @@ bool Mob::SpellOnTarget(
|
||||
IsDetrimentalSpell(spell_id) &&
|
||||
!IsAttackAllowed(spelltar, true) &&
|
||||
!IsResurrectionEffects(spell_id) &&
|
||||
!IsEffectInSpell(spell_id, SE_BindSight)
|
||||
!IsEffectInSpell(spell_id, SpellEffect::BindSight)
|
||||
) {
|
||||
if (!IsClient() || !CastToClient()->GetGM()) {
|
||||
MessageString(Chat::SpellFailure, SPELL_NO_HOLD);
|
||||
@ -3997,7 +3997,7 @@ bool Mob::SpellOnTarget(
|
||||
// select target
|
||||
uint16 target_id = 0;
|
||||
|
||||
if (IsEffectInSpell(spell_id, SE_BindSight)) {
|
||||
if (IsEffectInSpell(spell_id, SpellEffect::BindSight)) {
|
||||
action->target = GetID();
|
||||
target_id = GetID();
|
||||
} else {
|
||||
@ -4151,7 +4151,7 @@ bool Mob::SpellOnTarget(
|
||||
// Not sure if all 3 should be stacking
|
||||
//This is not live like behavior (~Kayen confirmed 2/2/22)
|
||||
if (!RuleB(Spells, AllowDoubleInvis) && !IsActiveBardSong(spell_id)) {
|
||||
if (IsEffectInSpell(spell_id, SE_Invisibility)) {
|
||||
if (IsEffectInSpell(spell_id, SpellEffect::Invisibility)) {
|
||||
if (spelltar->invisible) {
|
||||
spelltar->MessageString(Chat::SpellFailure, ALREADY_INVIS, GetCleanName());
|
||||
safe_delete(action_packet);
|
||||
@ -4159,7 +4159,7 @@ bool Mob::SpellOnTarget(
|
||||
}
|
||||
}
|
||||
|
||||
if (IsEffectInSpell(spell_id, SE_InvisVsUndead)) {
|
||||
if (IsEffectInSpell(spell_id, SpellEffect::InvisVsUndead)) {
|
||||
if (spelltar->invisible_undead) {
|
||||
spelltar->MessageString(Chat::SpellFailure, ALREADY_INVIS, GetCleanName());
|
||||
safe_delete(action_packet);
|
||||
@ -4167,7 +4167,7 @@ bool Mob::SpellOnTarget(
|
||||
}
|
||||
}
|
||||
|
||||
if (IsEffectInSpell(spell_id, SE_InvisVsAnimals)) {
|
||||
if (IsEffectInSpell(spell_id, SpellEffect::InvisVsAnimals)) {
|
||||
if (spelltar->invisible_animals) {
|
||||
spelltar->MessageString(Chat::SpellFailure, ALREADY_INVIS, GetCleanName());
|
||||
safe_delete(action_packet);
|
||||
@ -4276,7 +4276,7 @@ bool Mob::SpellOnTarget(
|
||||
} else if (
|
||||
!IsAttackAllowed(spelltar, true) &&
|
||||
!IsResurrectionEffects(spell_id) &&
|
||||
!IsEffectInSpell(spell_id, SE_BindSight)
|
||||
!IsEffectInSpell(spell_id, SpellEffect::BindSight)
|
||||
) { // Detrimental spells - PVP check
|
||||
LogSpells(
|
||||
"Detrimental spell [{}] can't take hold [{}] -> [{}]",
|
||||
@ -4334,7 +4334,7 @@ bool Mob::SpellOnTarget(
|
||||
int buff_count = GetMaxTotalSlots();
|
||||
int focus = 0;
|
||||
for (int b = 0; b < buff_count; b++) {
|
||||
if (IsEffectInSpell(buffs[b].spellid, SE_BlockNextSpellFocus)) {
|
||||
if (IsEffectInSpell(buffs[b].spellid, SpellEffect::BlockNextSpellFocus)) {
|
||||
focus = CalcFocusEffect(focusBlockNextSpell, buffs[b].spellid, spell_id);
|
||||
if (focus) {
|
||||
CheckNumHitsRemaining(NumHit::MatchingSpells, b);
|
||||
@ -4629,7 +4629,7 @@ bool Mob::SpellOnTarget(
|
||||
return false;
|
||||
}
|
||||
|
||||
//Check SE_Fc_Cast_Spell_On_Land SPA 481 on target, if hit by this spell and Conditions are Met then target will cast the specified spell.
|
||||
//Check SpellEffect::Fc_Cast_Spell_On_Land SPA 481 on target, if hit by this spell and Conditions are Met then target will cast the specified spell.
|
||||
if (spelltar) {
|
||||
spelltar->CastSpellOnLand(this, spell_id);
|
||||
}
|
||||
@ -4677,11 +4677,11 @@ bool Mob::SpellOnTarget(
|
||||
}
|
||||
}
|
||||
|
||||
if (spelltar->IsClient() && IsEffectInSpell(spell_id, SE_ShadowStep)) {
|
||||
if (spelltar->IsClient() && IsEffectInSpell(spell_id, SpellEffect::ShadowStep)) {
|
||||
spelltar->CastToClient()->cheat_manager.SetExemptStatus(ShadowStep, true);
|
||||
}
|
||||
|
||||
if (!IsEffectInSpell(spell_id, SE_BindAffinity)) {
|
||||
if (!IsEffectInSpell(spell_id, SpellEffect::BindAffinity)) {
|
||||
if (spelltar != this && spelltar->IsClient()) {// send to target
|
||||
spelltar->CastToClient()->QueuePacket(action_packet);
|
||||
}
|
||||
@ -4704,7 +4704,7 @@ bool Mob::SpellOnTarget(
|
||||
|
||||
if (
|
||||
!IsLifetapSpell(spell_id) &&
|
||||
!IsEffectInSpell(spell_id, SE_BindAffinity) &&
|
||||
!IsEffectInSpell(spell_id, SpellEffect::BindAffinity) &&
|
||||
!IsAENukeSpell(spell_id) &&
|
||||
!IsDamageSpell(spell_id)
|
||||
) {
|
||||
@ -4727,7 +4727,7 @@ bool Mob::SpellOnTarget(
|
||||
However due to server thinking your healed, you are unable to correct it by healing.
|
||||
Solution: You need to resend the HP update after buff completed and action packet resent.
|
||||
*/
|
||||
if ((IsEffectInSpell(spell_id, SE_TotalHP) || IsEffectInSpell(spell_id, SE_MaxHPChange)) && (IsEffectInSpell(spell_id, SE_CurrentHPOnce) || IsEffectInSpell(spell_id, SE_CurrentHP))) {
|
||||
if ((IsEffectInSpell(spell_id, SpellEffect::TotalHP) || IsEffectInSpell(spell_id, SpellEffect::MaxHPChange)) && (IsEffectInSpell(spell_id, SpellEffect::CurrentHPOnce) || IsEffectInSpell(spell_id, SpellEffect::CurrentHP))) {
|
||||
SendHPUpdate(true);
|
||||
}
|
||||
|
||||
@ -5096,7 +5096,7 @@ bool Mob::IsImmuneToSpell(uint16 spell_id, Mob *caster)
|
||||
}
|
||||
|
||||
// check max level for spell
|
||||
effect_index = GetSpellEffectIndex(spell_id, SE_Mez);
|
||||
effect_index = GetSpellEffectIndex(spell_id, SpellEffect::Mez);
|
||||
assert(effect_index >= 0);
|
||||
// NPCs get to ignore the max level
|
||||
if((GetLevel() > spells[spell_id].max_value[effect_index]) &&
|
||||
@ -5110,7 +5110,7 @@ bool Mob::IsImmuneToSpell(uint16 spell_id, Mob *caster)
|
||||
}
|
||||
|
||||
// slow and haste spells
|
||||
if(GetSpecialAbility(SpecialAbility::SlowImmunity) && IsEffectInSpell(spell_id, SE_AttackSpeed))
|
||||
if(GetSpecialAbility(SpecialAbility::SlowImmunity) && IsEffectInSpell(spell_id, SpellEffect::AttackSpeed))
|
||||
{
|
||||
LogSpells("We are immune to Slow spells");
|
||||
caster->MessageString(Chat::Red, IMMUNE_ATKSPEED);
|
||||
@ -5124,9 +5124,9 @@ bool Mob::IsImmuneToSpell(uint16 spell_id, Mob *caster)
|
||||
}
|
||||
|
||||
// client vs client fear
|
||||
if(IsEffectInSpell(spell_id, SE_Fear))
|
||||
if(IsEffectInSpell(spell_id, SpellEffect::Fear))
|
||||
{
|
||||
effect_index = GetSpellEffectIndex(spell_id, SE_Fear);
|
||||
effect_index = GetSpellEffectIndex(spell_id, SpellEffect::Fear);
|
||||
if(GetSpecialAbility(SpecialAbility::FearImmunity)) {
|
||||
LogSpells("We are immune to Fear spells");
|
||||
caster->MessageString(Chat::Red, IMMUNE_FEAR); // need to verify message type, not in MQ2Cast for easy look up
|
||||
@ -5190,7 +5190,7 @@ bool Mob::IsImmuneToSpell(uint16 spell_id, Mob *caster)
|
||||
if(!caster->IsNPC())
|
||||
{
|
||||
// check level limit of charm spell
|
||||
effect_index = GetSpellEffectIndex(spell_id, SE_Charm);
|
||||
effect_index = GetSpellEffectIndex(spell_id, SpellEffect::Charm);
|
||||
assert(effect_index >= 0);
|
||||
if(GetLevel() > spells[spell_id].max_value[effect_index] && spells[spell_id].max_value[effect_index] != 0)
|
||||
{
|
||||
@ -5211,8 +5211,8 @@ bool Mob::IsImmuneToSpell(uint16 spell_id, Mob *caster)
|
||||
|
||||
if
|
||||
(
|
||||
IsEffectInSpell(spell_id, SE_Root) ||
|
||||
IsEffectInSpell(spell_id, SE_MovementSpeed)
|
||||
IsEffectInSpell(spell_id, SpellEffect::Root) ||
|
||||
IsEffectInSpell(spell_id, SpellEffect::MovementSpeed)
|
||||
)
|
||||
{
|
||||
if(GetSpecialAbility(SpecialAbility::SnareImmunity)) {
|
||||
|
||||
@ -43,6 +43,8 @@ bool TaskManager::LoadTaskSets()
|
||||
|
||||
bool TaskManager::LoadTasks(int single_task)
|
||||
{
|
||||
m_task_data.clear();
|
||||
|
||||
std::string task_query_filter = fmt::format("id = {}", single_task);
|
||||
if (single_task == 0) {
|
||||
if (!LoadTaskSets()) {
|
||||
|
||||
@ -466,7 +466,7 @@ void Object::HandleCombine(Client* user, const NewCombine_Struct* in_combine, Ob
|
||||
}
|
||||
}
|
||||
else if (spec.tradeskill == EQ::skills::SkillTinkering) {
|
||||
if (user_pp.race != GNOME) {
|
||||
if (user_pp.race != Race::Gnome) {
|
||||
user->Message(Chat::Red, "Only gnomes can tinker.");
|
||||
auto outapp = new EQApplicationPacket(OP_TradeSkillCombine, 0);
|
||||
user->QueuePacket(outapp);
|
||||
@ -643,7 +643,7 @@ void Object::HandleAutoCombine(Client* user, const RecipeAutoCombine_Struct* rac
|
||||
}
|
||||
}
|
||||
else if (spec.tradeskill == EQ::skills::SkillTinkering) {
|
||||
if (user->GetRace() != GNOME) {
|
||||
if (user->GetRace() != Race::Gnome) {
|
||||
user->Message(Chat::Red, "Only gnomes can tinker.");
|
||||
auto outapp = new EQApplicationPacket(OP_TradeSkillCombine, 0);
|
||||
user->QueuePacket(outapp);
|
||||
|
||||
@ -466,12 +466,12 @@ void Mob::TuneGetAvoidanceByHitChance(Mob* defender, Mob *attacker, float hit_ch
|
||||
|
||||
if (loop_add_avoid >= 0) {
|
||||
Message(0, "[#Tune] OPTION1: MODIFY Client Heroic AGI or Avoidance Mod2 stat by [+ %i ]", loop_add_avoid);
|
||||
Message(0, "[#Tune] OPTION2: Give CLIENT an evasion bonus using SPA 172 Evasion SE_AvoidMeleeChance from (spells/items/aa) of [+ %i pct ]", evasion_bonus);
|
||||
Message(0, "[#Tune] OPTION2: Give CLIENT an evasion bonus using SPA 172 Evasion SpellEffect::AvoidMeleeChance from (spells/items/aa) of [+ %i pct ]", evasion_bonus);
|
||||
|
||||
}
|
||||
else {
|
||||
Message(0, "[#Tune] OPTION1: MODIFY Client Heroic AGI or Avoidance Mod2 stat by [ %i ]", loop_add_avoid);
|
||||
Message(0, "[#Tune] OPTION2: Give CLIENT an evasion bonus using SPA 172 Evasion SE_AvoidMeleeChance from (spells/items/aa) of [ %i pct ]", evasion_bonus);
|
||||
Message(0, "[#Tune] OPTION2: Give CLIENT an evasion bonus using SPA 172 Evasion SpellEffect::AvoidMeleeChance from (spells/items/aa) of [ %i pct ]", evasion_bonus);
|
||||
}
|
||||
|
||||
Message(0, "###################COMPLETE###################");
|
||||
@ -1283,7 +1283,7 @@ int64 Mob::Tunecompute_tohit(EQ::skills::SkillType skillinuse, int accuracy_over
|
||||
// return -1 in cases that always hit
|
||||
int64 Mob::TuneGetTotalToHit(EQ::skills::SkillType skill, int chance_mod, int accuracy_override, int add_accuracy)
|
||||
{
|
||||
if (chance_mod >= 10000) // override for stuff like SE_SkillAttack
|
||||
if (chance_mod >= 10000) // override for stuff like SpellEffect::SkillAttack
|
||||
return -1;
|
||||
|
||||
// calculate attacker's accuracy
|
||||
@ -1313,7 +1313,7 @@ int64 Mob::TuneGetTotalToHit(EQ::skills::SkillType skill, int chance_mod, int ac
|
||||
if (atkhit_bonus)
|
||||
accuracy += round(static_cast<double>(accuracy) * static_cast<double>(atkhit_bonus) * 0.0001);
|
||||
|
||||
// 216 Melee Accuracy Amt aka SE_Accuracy -- flat bonus
|
||||
// 216 Melee Accuracy Amt aka SpellEffect::Accuracy -- flat bonus
|
||||
accuracy += itembonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1] +
|
||||
aabonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1] +
|
||||
spellbonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1] +
|
||||
@ -1335,7 +1335,7 @@ int64 Mob::TuneGetTotalToHit(EQ::skills::SkillType skill, int chance_mod, int ac
|
||||
if (spellbonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] >= 10000)
|
||||
return -1;
|
||||
|
||||
// 184 Accuracy % aka SE_HitChance -- percentage increase
|
||||
// 184 Accuracy % aka SpellEffect::HitChance -- percentage increase
|
||||
auto hit_bonus = itembonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] +
|
||||
aabonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] +
|
||||
spellbonuses.HitChanceEffect[EQ::skills::HIGHEST_SKILL + 1] +
|
||||
@ -1360,15 +1360,15 @@ int64 Mob::TuneGetTotalDefense(int avoidance_override, int add_avoidance)
|
||||
if (evasion_bonus >= 10000)
|
||||
return -1;
|
||||
|
||||
// 515 SE_AC_Avoidance_Max_Percent
|
||||
// 515 SpellEffect::AC_Avoidance_Max_Percent
|
||||
auto ac_aviodance_bonus = itembonuses.AC_Avoidance_Max_Percent + aabonuses.AC_Avoidance_Max_Percent + spellbonuses.AC_Avoidance_Max_Percent;
|
||||
if (ac_aviodance_bonus)
|
||||
avoidance += round(static_cast<double>(avoidance) * static_cast<double>(ac_aviodance_bonus) * 0.0001);
|
||||
|
||||
// 172 Evasion aka SE_AvoidMeleeChance
|
||||
// 172 Evasion aka SpellEffect::AvoidMeleeChance
|
||||
evasion_bonus += itembonuses.AvoidMeleeChanceEffect + aabonuses.AvoidMeleeChanceEffect; // item bonus here isn't mod2 avoidance
|
||||
|
||||
// 215 Pet Avoidance % aka SE_PetAvoidance
|
||||
// 215 Pet Avoidance % aka SpellEffect::PetAvoidance
|
||||
evasion_bonus += GetPetAvoidanceBonusFromOwner();
|
||||
|
||||
// Evasion is a percentage bonus according to AA descriptions
|
||||
@ -1410,7 +1410,7 @@ int64 Mob::Tunecompute_defense(int avoidance_override, int add_avoidance)
|
||||
}
|
||||
|
||||
|
||||
//516 SE_AC_Mitigation_Max_Percent
|
||||
//516 SpellEffect::AC_Mitigation_Max_Percent
|
||||
auto ac_bonus = itembonuses.AC_Mitigation_Max_Percent + aabonuses.AC_Mitigation_Max_Percent + spellbonuses.AC_Mitigation_Max_Percent;
|
||||
if (ac_bonus) {
|
||||
defense += round(static_cast<double>(defense) * static_cast<double>(ac_bonus) * 0.0001);
|
||||
|
||||
@ -957,7 +957,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
|
||||
|
||||
LogSpells("[WorldServer::HandleMessage] Found corpse. Marking corpse as rezzed if needed");
|
||||
// I don't know why Rezzed is not set to true in CompleteRezz().
|
||||
if (!IsEffectInSpell(srs->rez.spellid, SE_SummonToCorpse)) {
|
||||
if (!IsEffectInSpell(srs->rez.spellid, SpellEffect::SummonToCorpse)) {
|
||||
corpse->IsRezzed(true);
|
||||
corpse->CompleteResurrection();
|
||||
}
|
||||
@ -4276,7 +4276,7 @@ bool WorldServer::SendVoiceMacro(Client* From, uint32 Type, char* Target, uint32
|
||||
|
||||
uint16 player_race = GetPlayerRaceValue(From->GetRace());
|
||||
|
||||
if (player_race == PLAYER_RACE_UNKNOWN) {
|
||||
if (player_race == Race::Doug) {
|
||||
player_race = From->GetBaseRace();
|
||||
}
|
||||
|
||||
|
||||
@ -3009,12 +3009,12 @@ void ZoneDatabase::LoadBuffs(Client *client)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (IsEffectInSpell(buffs[slot_id].spellid, SE_Charm)) {
|
||||
if (IsEffectInSpell(buffs[slot_id].spellid, SpellEffect::Charm)) {
|
||||
buffs[slot_id].spellid = SPELL_UNKNOWN;
|
||||
break;
|
||||
}
|
||||
|
||||
if (IsEffectInSpell(buffs[slot_id].spellid, SE_Illusion)) {
|
||||
if (IsEffectInSpell(buffs[slot_id].spellid, SpellEffect::Illusion)) {
|
||||
if (buffs[slot_id].persistant_buff) {
|
||||
break;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user