Compare commits

..

141 Commits

Author SHA1 Message Date
Chris Miles 508b37dc93 [Release] 22.44.2 (#4068) 2024-02-12 13:43:38 -06:00
Alex King 0adca46a73 [Bots] Remove Alt Combat Functionality (#4067)
* [Bots] Remove Alt Combat Functionality

# Notes
- This functionality needlessly complicates bot targeting logic and causes crashes and unintended behavior for players when accidentally enabled or enabled by default.

* Cleanup
2024-02-12 03:00:11 -06:00
hg e920e35a5c [Cleanup] Use explicit conversions for enum formatting (#4064)
This is prep for updating to fmt 10 which removed implicit conversions
for enums.
2024-02-12 02:58:48 -06:00
Mitch Freeman 20c01ef343 [Fix] Guard against crash condition (#4062) 2024-02-11 18:32:59 -05:00
JJ 1567141c19 [Database] Fix table name in manifest (#4063) 2024-02-11 18:29:05 -05:00
JJ 6bc9bcf15a [Database] Proper default for droptime from object_contents (#4061) 2024-02-11 17:59:48 -05:00
JJ 86a2a86ba8 [Database] Fix default value for time_of_death in character_corpses (#4060)
* [Database] Fix default value for `time_of_death` in `character_corpses`

* Extra `NULL`

* Update repository

* Repositories with updated structure this time
2024-02-11 16:12:07 -05:00
JJ 3e6924d10e [Guilds] Clean up GUILD_RANK_NONE references (#4059)
Should be exhaustive for guild rank values
Cleans up redefinition of `GUILD_RANK_NONE` by including `GUILD_RANK_NONE_TI`
Fixes #4057
2024-02-11 11:58:19 -05:00
Akkadius a27a8adf1e [Release] 22.44.1 2024-02-11 02:46:47 -06:00
Chris Miles 13994fb3e4 [File] Fix File::Exists(file_name) to be resilient to Chinese characters (#4058)
* Update file.cpp

* Update file.cpp

* Update file.cpp

* Update file.cpp

* Update file.cpp

* Update file.cpp

* Update file.cpp

* Update file.cpp

* Final fix
2024-02-11 02:42:25 -06:00
Chris Miles 78aa527bc7 [Release] 22.44.0 (#4056)
* [Release] 22.44.0

* Update CHANGELOG.md
2024-02-10 05:02:33 -06:00
Chris Miles 58287b6539 [Crash Reporting] Update Spire to use SSL (#4055) 2024-02-10 04:43:37 -06:00
Akkadius 718a157c06 Revert "[Hotfix] fs::exists(fs::path{name}) does not work for Chinese characters in windows"
This reverts commit 801025c166.
2024-02-10 04:01:00 -06:00
Akkadius 801025c166 [Hotfix] fs::exists(fs::path{name}) does not work for Chinese characters in windows 2024-02-10 03:57:50 -06:00
Mitch Freeman 91f5932c6d [Feature] Add RoF2 Guild features (#3699)
* [Feature] Add additional Guild Features

This adds the following guild features and design pattern
- the existing guild system was used
- guild features are based on RoF2 within source with translaters used to converted between client differences
- backward compatible with Ti and UF, and allows for mixed client servers
- Guild Back for Ti and UF is based on RoF2 Permissions for banking if Guild Leader does not use Ti/UF
- Guild Ranks and Permissions are enabled.
- Guild Tributes are enabled.
- Event logging via rules for donating tribute items and plat
- Rules to limit Guild Tributes based on max level of server
- Rewrote guild communications to client using specific opcodes
-- Server no longer sends a guild member list on each zone
-- Guild window is updated when a member levels, rank changes, zone changes, banker/alt status using individual opcodes
-- When a member is removed or added to a guild, a single opcode is sent to each guild member
-- This reduces network traffic considerably

Known issues:
- Visual bug only. Guild Tributes window will display a 0 for level if tribute is above max level rule setting.
- Visual bug only. Guild Mgmt Window will not display an online member if the player has 'show offline' unchecked and a guild member zones within the Notes/Tribute tab.  This is resolved by selecting and de-selecting the 'Show Offline' checkbox.

* Updated RoF2 Guild Comms

Updated RoF2 Guild Comms
Update RoF2 Opcodes
Rewrote RoF2 Guild Communications using specific opcodes.
Added database changes - they are irreversible

* Formatting

* Update base_guild_members_repository.h

* Format GuildInfo

* Format GuildAction enum

* Formatting in clientlist

* quantity vs quantity

* desc vs description

* Format structs

* Inline struct values

* Formatting

* Formatting

* Formatting fixes

* Formatting items

* Formatting

* Formatting

* struct formatting updates

* Updated formatting

* Updated
- std:string items
- naming conventions
- magic numbers

* Repo refactors
Other formatting updates

* Remove test guild commands

* Updated #guild info command

* Add new repo methods for Neckolla ReplaceOne and ReplaceMany

* Fix guild_tributes repo

* Update database_update_manifest.cpp

* Phase 1 of final testing with RoF2 -> RoF2.
Next phase will be inter compatibility review

* Remove #guild testing commands

* Fix uf translator error
Rewrite LoadGuilds

* Use extended repository

* FIx guild window on member add

* LoadGuild Changes

* Update guild_base.cpp

* Few small fixes for display issue with UF

* Update guild_base.cpp

* Update guild_members_repository.h

* Update zoneserver.cpp

* Update guild.cpp

* Update entity.h

* Switch formatting

* Formatting

* Update worldserver.cpp

* Switch formatting

* Formatting switch statement

* Update guild.cpp

* Formatting in guild_base

* We don't need to validate m_db everywhere

* More formatting / spacing issues

* Switch format

* Update guild_base.cpp

* Fix an UF issue displaying incorrect guildtag as <>

* Updated several constants, fixed a few issues with Ti/UF and guild tributes not being removed or sent when a member is removed/disbands from a guild.

* Formatting and logging updates

* Fix for Loadguilds and permissions after repo updates.

* Cleanup unnecessary m_db checks

* Updated logging to use player_event_logs

* Updated to use the single opcodes for guild traffic for Ti/UF/RoF2.  Several enhancements for guild functionality for more reusable code and readability.

* Update to fix Demote Self and guild invites declining when option set to not accept guild invites

* Potential fix for guild notes/tribute display issues when client has 'Show Offline' unchecked.

* Updates to fox recent master changes

Updates to fix recent master changes

* Updates in response to comments

* Further Updates in response to comments

* Comment updates and refactor for SendAppearance functions

* Comment updates

* Update client spawn process for show guild name

Add show guild tag to default spawn process

* Update to use zone spawn packets for RoF2
Removed several unused functions as a result
Updated MemberRankUpdate to properly update guild_show on rank change.
Updated OP_GuildURLAndChannel opcode for UF/RoF2

* Cleanup of world changes
Created function for repetitive zonelist sendpackets to only booted zones
Re-Inserted accidental delete of scanclosemobs

* Fixes

* Further world cleanup

* Fix a few test guild bank cases for backward compat
Removed a duplicate db call
Fixed a fallthrough issue

* Update guild_mgr.cpp

* Cleanup

---------

Co-authored-by: Akkadius <akkadius1@gmail.com>
2024-02-10 03:27:58 -06:00
Alex King dacebca9dd [Cleanup] Convert Quest Ornament Methods to Repositories (#4048)
# Notes
- Convert `Client::SetPrimaryWeaponOrnamentation` and `Client::SetSecondaryWeaponOrnamentation` to repositories.
2024-02-10 03:27:47 -06:00
hg 75539b4f89 [Tasks] Avoid removing client tasks from memory on load (#4052)
If a task was deleted or had new elements added to it without updating
character states to match changes, client state for the task was not
loaded into memory and a "contact a GM" warning was sent to the client.

This caused an issue if a client later accepted a new task because it
could be placed in the same client state slot as a non-loaded task. The
table does not have constraints so this was also inserted into the db.

The next time client task state was reloaded after zoning, the new task
would not be loaded since it occupied a used slot, even though that used
slot was also not being loaded. The client could not remove or reacquire
the original task without GM intervention and an entry was left in the
db for the new task.

This makes the following changes to client task state loading:

 - If a task id no longer exists it is deleted from client state tables
   instead of only being removed from memory.

 - If a task occupies the same client state slot as another task, it is
   deleted from client state tables instead of being ignored.

 - If new elements have been added to a task, client state will keep the
   task in memory. The new activity states will be inserted into the db
   when necessary for updates (may not be immediate).

These changes also fix two smaller bugs as a consequence:

 - If a character was at the 20 quest limit the last quest wasn't being
   processed for activity count changes. The task would continue to show
   to clients but any added new elements couldn't be completed.

 - Deleted tasks that occupied slot 0 in client state would fallback to
   loading it as a solo task of type 0. This prevented a client's real
   solo task from being loaded if the deleted task was processed first.

Note clients may receive or lose credit for completed elements if new
ones are added in the middle of tasks. Server ops will still need to
update character state tables manually on task changes to prevent this.
2024-02-10 03:25:03 -06:00
hg 804b798068 [Tasks] Send active elements in task select packet (#4051)
Only the first element was being serialized to show the start zone of
tasks. This was resulting in a blank description for tasks that only
have element descriptions.

Live sends all initial active elements for the task when sending this
packet. Any bracket text with these elements as a requirement will be
appended to the description.
2024-02-10 03:23:24 -06:00
Chris Miles b280f50c99 [Deprecation] Remove eqemu_server.pl script and ties to server (#4049) 2024-02-10 03:22:18 -06:00
Fryguy 14d4a2610f [Feature] Classic Taunt (Pre 2006) style of taunt (#3942)
* DRAFT - Classic Taunt (Pre 2006) style of taunt

RULE: ClassicTauntSystem

Completely seperate logic for each system. Could potentially be re-writte to be more inline but there are a good bit of minor differences.

* Consolidate Logic

Still needs in-game testing

* Feedback Request

* Updates per feedback
2024-02-10 03:22:08 -06:00
Alex King 26693992b6 [Bug Fix] Fix Froglok Starting Languages (#4050)
# Notes
- Switch was using the wrong race ID.
2024-02-09 13:30:14 -06:00
Fryguy 772fed5e30 [Feature] Corpse Overhaul (#3938)
# Corpse Overhaul

Changelog:

- Player corpses now have two timers, one specific to the rezability of the corpse and the other to cover the overall rot timer of the player corpse.
- The rezability timer is based on the online presence of the player/account and is not affected by being offline.
- The rot timer is not affected by offline/online status and will count to the rot status of the corpse.
- Corpses can be rezzed multiple times, however only the first rez that yeilds returned xp will be counted. Not other rez will return any xp. This allows for a "Poor mans COTH" as was used many times in the early eras.
- All Corpse class private/protected member variables are all now prefixed with m_
- Added Corpses logging category along with many debug logs
- Removed LoadCharacterCorpseData
- Removed LoadCharacterCorpseEntity
- Added LoadCharacterCorpse(const CharacterCorpsesRepository::CharacterCorpses, const glm::vec4 &position) which simplifies areas of consumption and reduces double queries from removing LoadCharacterCorpseData and replacing LoadCharacterCorpseEntity
- All parameters that were prefixed with in_ have been dropped
- Removed two queries from CheckIsOwnerOnline and have it query the world's CLE by account_id since that is how live works
- Regenerated repository character_corpses
- Cleaned up many list iterators to use range based for loops
- Rate limit Corpse::Process m_is_rezzable with a 1 second check timer
- General code cleanup
- Added a Server Up check to bury all corpses in instances to prevent lost corpses if an instance is released during server down. This facilitates player recovery via shadowrest or priests of luclin.


This PR also now fixes a long standing issue with HasItem performance in our script plugins. It is significantly faster, we will need to coordinate quest changes and comms with operators.

```lua
    if ($client->HasItemOnCorpse($item_id)) {
        return 1;
    }
```

```lua
    --corpse
    if self:HasItemOnCorpse(itemid) then
        return true
    end
```


Testing Completed:

- Create a Corpse
- Standard rezzing
- Ghetto Coth (No Extra XP)
- Rezzing after graveyard move
- Divine Rez works as intended
- No XP Rez (Corpse Call) does not give XP
- Corpse Burying
- Cross Instance Graveyard Corpse movement/Rezzing
- DZ End/Quit Corpse Movement/Rezzing
- Server Shutdown/Reinit DZ Corpse Movement/Rezzing


---------

Co-authored-by: Akkadius <akkadius1@gmail.com>
2024-02-07 23:02:30 -05:00
Alex King 331e04fbf8 [Quests] Cleanup Quest Parser Logic (#4025)
* [Quests] Cleanup Quest Parser Logic

# Notes
- Consolidate duplicated code into loops to make it easier to read and easier to add on to.

# Images

* Update quest_parser_collection.cpp

* Push

* Push

* Update embperl.cpp

* Push

* Additional cleanup, use File::Exists utility

* Range based loops

* Update embparser.cpp

* Cleanup

* Update embparser.cpp

---------

Co-authored-by: Akkadius <akkadius1@gmail.com>
2024-02-05 19:53:16 -05:00
Chris Miles 9e2afd5571 [Database] Correct manifest migration entries that should be content (#4047) 2024-02-05 17:37:15 -06:00
Alex King 8edf7a07e3 [Base Data] Remove from shared memory and simplify (#4045)
* [Base Data] Remove from shared memory and simplify

- Removes Base Data loading from shared memory and puts it into zone.
- Changes type of `level` and `class` to `uint8_t` from `uint32_t` for consistency since we're renaming fields here anyway.
- Renames `unk1` to `hp_regen` in `base_data` table.
- Renames `unk2` to `end_regen` in `base_data` table.
- These changed fields were already mapped, we just hadn't renamed them for whatever reason.
- Regenerates Base Data repository.
- Adds `#reload base_data` to reload base data in real time.

* Cleanup

* Update shareddb.h

* Cleanup.

* Update shareddb.cpp

* Update main.cpp
2024-02-05 17:11:20 -06:00
Alex King b6b779723e [Feature] Add optional is_forced parameter to Zone::Repop (#4046)
* [Feature] Add optional `is_force` parameter to Zone::Repop

# Perl
- Add `quest::repopzone(is_force)`.

# Lua
- Add `eq.repop_zone(is_force)`.

# Commands
- Cleanup `#repop` to use new parameter in `Zone::Repop`.

# Notes
- Allows operators to forcefully repop a zone without using a second method to clear the respawn timers.

* is_forced

* Update repop.cpp

* Update repop.cpp
2024-02-05 16:10:56 -06:00
Chris Miles c654c1d674 [Loot] Remove from shared memory, simplification (#3988)
* First pass of pulling loot out of shared memory, functional

* More code cleanup

* More cleanup

* More cleanup

* More cleanup

* Add loot reload type

* Reload, logging

* Update npc.h

* Cleanup

* Logging, don't load attempt to load loottable id 0

* Update worldserver.cpp

* Update client.cpp

* Update zone_loot.cpp

* PR feedback

* Update zone.cpp

* Memory leak suggestion

* Update CMakeLists.txt

* Post rebase issues
2024-02-05 15:17:53 -06:00
Alex King fcbf5cae47 [Commands] Add #show special_abilities (#4043)
* [Commands] Add #show special_abilities

# Notes
- Allows operators to see what special abilities an NPC has.
- Move special ability values to `common/emu_constants.h`.
- Add `EQ::constants::GetSpecialAbilityMap()` and `EQ::constants::GetSpecialAbilityName()`.
- Add `NPC::DescribeSpecialAbilities(client)` to describe special abilities to a specified client.

# Images

* Update npc.cpp
2024-02-05 14:34:10 -06:00
Alex King 0ffea36905 [Quest API] Add GetAAEXPPercentage() and GetEXPPercentage() to Perl/Lua (#4044)
* Initial Push

* Push

* Push.
2024-02-04 18:16:28 -05:00
Paul Coene 3f9a604c5c [GM Commands] Fix typo in #rules help. (#4042) 2024-02-04 15:00:43 -05:00
Alex King 297e358c02 [Factions] Remove from shared memory and simplify (#3999)
* [Factions] Remove from shared memory and simplify

- Removes factions from shared memory and moves to zone based storage of repositories and changes the NPC `faction_list` to also use repositories.
- This affects NPC Factions and Faction Associations.

* Bug fixes.

* Update client.cpp

* Update client.cpp

* Update client.cpp

* Cleanup

* Update client.cpp

* Update client.cpp

* Update client.cpp

* Final push

* Update CMakeLists.txt

* Consolidate reloading.

* [Cleanup] PR # 3999 (#4039)

* [Fixes for PR # 3999

* [Reload actual in game factions, not just the umbrella data.

* syntax

* Fix typo

* Foix bug where primary_faction not filled in when no hits

* Fix typos

* Fix splash factions for kills.

* Fix typo

* Fix more variable names to be accurate

* Fix Loads to load new ones as they come in.

* Load npc_factions without primary (tasks) and support old task faction

* Rename to make way for new LoadFactionAssocition (by faction_id)

* Fix some review comments

* Add code to load factions for splash tasks and quests.

* Fix issue with sign and RewardFaction, fix Log Message

---------

Co-authored-by: Paul Coene <noudess@gmail.com>
2024-02-04 10:38:38 -05:00
JJ 029581772d [Cleanup] Remove redundant check in Object::HandleCombine (#4041)
Some minor formatting updates.
2024-02-03 17:07:43 -05:00
nytmyr 175f2b16f5 [Bug Fix] Fix for potential crash of DS damage on death (#4040)
On the unfortunate timing of a bot or owner dying when the bot deals damage due to a DS and the owner pointer is no longer valid.
2024-02-03 08:54:34 -05:00
Alex King 71f47dbcef [Objects] Add fix_z column to ground spawns (#3992)
* [Objects] Add is_floating column to objects/ground spawns

# Notes
- Allows ground spawns/objects to float without having `FixZ()` called.

* Remove from object.

* Database version

* Fix

* Change to fix_z
2024-02-01 04:42:51 -06:00
Alex King 6297c56db2 [Bot Commands] Separate Bot Commands into Individual Files (#4035)
# Notes
- Separate all bot commands into individual files like regular commands.

# Images
2024-02-01 04:35:33 -06:00
Alex King 6efd7c5177 [Feature] Add support to crosszone/worldwide spells to affect bot pets (#4036)
* [Bug Fix] Move break in ServerOP_WWSpell handler

# Notes
- This break was cancelling loop early, m

* [Feature] Add support to crosszone/worldwide spells to affect bot pets
2024-02-01 04:27:00 -06:00
Alex King 24578f6c1e [Bug Fix] Fix Bot Non-Melee Damage Messages (#4038)
# Notes
- These were not displaying because bots pass the `attacker && attacker->GetOwner()` check which assumes they're a pet because we weren't confirming it wasn't a bot.

# Image
2024-02-01 04:26:38 -06:00
Alex King 490ed50c9f [Bug Fix] Fix Issue with Bot Dual wield (#4037)
# Notes
- Bots were using primary weapons even for dual wield attacks so they were never attacking with their secondary even when they should be.
2024-02-01 04:26:25 -06:00
Alex King 7c982df0e3 [Release] 22.43.3 (#4034)
### API

* Add lock_status method to world API ([#4028](https://github.com/EQEmu/Server/pull/4028)) @Akkadius 2024-01-29

### Alternate Currency

* Convert Load of Alternate Currencies to Repositories ([#3993](https://github.com/EQEmu/Server/pull/3993)) @Kinglykrab 2024-01-29

### Beacon

* Cleanup Beacons Code ([#4024](https://github.com/EQEmu/Server/pull/4024)) @Kinglykrab 2024-01-29

### Bots

* Convert Bot Database Methods to Repositories ([#4023](https://github.com/EQEmu/Server/pull/4023)) @Kinglykrab 2024-01-29
* Missing boolean returns on DeletePetStats and SaveInspectMessage ([#4031](https://github.com/EQEmu/Server/pull/4031)) @joligario 2024-01-30

### Code

* Add Raid Loot Type Constants ([#4022](https://github.com/EQEmu/Server/pull/4022)) @Kinglykrab 2024-01-29
* Cleanup cross-zone/world-wide OPCode handling ([#4003](https://github.com/EQEmu/Server/pull/4003)) @Kinglykrab 2024-01-29

### Commands

* Cleanup #petitems Command ([#4005](https://github.com/EQEmu/Server/pull/4005)) @Kinglykrab 2024-01-29

### Crash Fix

* Fix Possible Crash in HateList::Find ([#4027](https://github.com/EQEmu/Server/pull/4027)) @Kinglykrab 2024-01-28

### Fixes

* Fix NPC After Death Emotes ([#4021](https://github.com/EQEmu/Server/pull/4021)) @Kinglykrab 2024-01-29
* Fix database loading routines ([#4030](https://github.com/EQEmu/Server/pull/4030)) @Akkadius 2024-01-29
* Fix issue in character_corpses Repository Query ([#4029](https://github.com/EQEmu/Server/pull/4029)) @Kinglykrab 2024-01-29
* Limit Pet Taunt Distance ([#4018](https://github.com/EQEmu/Server/pull/4018)) @fryguy503 2024-01-26
* Limit Player Taunt Distance ([#4019](https://github.com/EQEmu/Server/pull/4019)) @fryguy503 2024-01-26
* Patch for recent change to DEATH ([#4032](https://github.com/EQEmu/Server/pull/4032)) @noudess 2024-01-30
* spawn_conditions map was being emptied by mistake ([#4033](https://github.com/EQEmu/Server/pull/4033)) @noudess 2024-01-30

### Grids

* Convert Grid/Grid Entries to Repositories ([#4011](https://github.com/EQEmu/Server/pull/4011)) @Kinglykrab 2024-01-29

### Mercenaries

* Add expansion settings update to Mercs:Enable ([#4001](https://github.com/EQEmu/Server/pull/4001)) @Kinglykrab 2024-01-29

### Merchants

* Convert Merchant Load to Repositories ([#4007](https://github.com/EQEmu/Server/pull/4007)) @Kinglykrab 2024-01-29

### Pets

* Convert Load of Pets Beastlord Data to Repositories ([#3995](https://github.com/EQEmu/Server/pull/3995)) @Kinglykrab 2024-01-29

### Quests

* Use separate variable for quest idle override. ([#4026](https://github.com/EQEmu/Server/pull/4026)) @noudess 2024-01-27

### Rules

* Add rules for cross-zone/world-wide casts to affect Bots/Mercenaries/Pets ([#4002](https://github.com/EQEmu/Server/pull/4002)) @Kinglykrab 2024-01-29

### Spawn2

* Convert Spawn2 Methods to Repositories ([#4014](https://github.com/EQEmu/Server/pull/4014)) @Kinglykrab 2024-01-29

### Traps

* Convert Load/Set of Traps to Repositories ([#3994](https://github.com/EQEmu/Server/pull/3994)) @Kinglykrab 2024-01-29

### Zone

* Convert Fishing/Foraging to Repositories ([#4008](https://github.com/EQEmu/Server/pull/4008)) @Kinglykrab 2024-01-30
2024-01-30 19:26:50 -05:00
Paul Coene fa783c3c6b [Bug Fix] spawn_conditions map was being emptied by mistake (#4033) 2024-01-30 18:48:28 -05:00
Paul Coene 5377bb3f49 [Bug Fix] Patch for recent change to DEATH (#4032) 2024-01-30 17:10:45 -05:00
JJ f98c79fdba [Bots] Missing boolean returns on DeletePetStats and SaveInspectMessage (#4031) 2024-01-30 12:07:02 -05:00
Alex King ae79022e06 [Zone] Convert Fishing/Foraging to Repositories (#4008)
* [Zone] Convert Fishing/Foraging to Repositories

# Notes
- Convert `LoadFishing()` and `LoadForage()` to repositories.

* Update forage.cpp

* Cleanup
2024-01-30 05:55:09 -05:00
Chris Miles bc59882a65 [Hotfix] Fix database loading routines (#4030) 2024-01-29 00:14:33 -06:00
Alex King 2e0ed82986 [Grids] Convert Grid/Grid Entries to Repositories (#4011)
* [Grids] Convert Grid/Grid Entries to Repositories

- Convert `AddWaypoint()`, `AddWaypointForSpawn()`, `DeleteWaypoint()`, `GetHighestWaypoint()`, `GetRandomWaypointFromGrid()`, `GridExistsInZone()`, and `ModifyGrid()` to repositories.

* Update grid.cpp

* Update questmgr.cpp

* Update waypoints.cpp

* Update waypoints.cpp
2024-01-28 23:37:34 -06:00
Alex King 8e3218aaf7 [Cleanup] Cleanup cross-zone/world-wide OPCode handling (#4003)
* [Cleanup] Cleanup cross-zone/world-wide OPCode handling

# Notes
- Cleans up the logic greatly for cross-zone/world-wide methods since we were doing extraneous status checks and needlessly allocating memory for variables.

* Update worldserver.cpp
2024-01-28 23:07:27 -06:00
Alex King 9276966418 [Rules] Add rules for cross-zone/world-wide casts to affect Bots/Mercenaries/Pets (#4002)
* [Rules] Add rules for cross-zone/world-wide casts to affect bots/mercenaries/pets

# Notes
- These rules allow operators to have cross-zone/world-wide casts/removals of spells affect bots, mercenaries, and/or pets.
- Adds `World:AllowWorldWideSpellsOnBots`.
- Adds `World:AllowWorldWideSpellsOnMercs`.
- Adds `World:AllowWorldWideSpellsOnPets`.
- Adds `Zone:AllowCrossZoneSpellsOnBots`.
- Adds `Zone:AllowCrossZoneSpellsOnMercs`.
- Adds `Zone:AllowCrossZoneSpellsOnPets`.

* Consolidate to 3 rules
2024-01-28 23:06:21 -06:00
Alex King b89772ca91 [Pets] Convert Load of Pets Beastlord Data to Repositories (#3995)
* [Pets] Convert Load of Pets Beastlord Data to Repositories

# Notes
- Convert `GetBeastlordPetData()` to repositories.
- Add support for `unsigned` versions of `float`, `double`, and `decimal`, without this we defaulted to `std::string`, such as with `pets_beastlord_data`.

* Update repository-generator.pl

---------

Co-authored-by: Chris Miles <akkadius1@gmail.com>
2024-01-28 23:05:43 -06:00
Alex King a1f2a21c99 [Bug Fix] Fix NPC After Death Emotes (#4021)
* [Bug Fix] Fix NPC After Death Emotes

- `DoNPCEmote` was being called on the corpse, not the NPC, so it wasn't working for some reason despite it working for years.
- Cleaned up some other logic and variable names in `NPC::Death` while I was in there.

* Update attack.cpp

* Update npc.cpp

* Update attack.cpp

* Update attack.cpp
2024-01-29 00:03:34 -05:00
Alex King 1cb72642ac [Traps] Convert Load/Set of Traps to Repositories (#3994)
# Notes
- Convert `LoadTraps()` and `SetTrapData()` to repositories.
2024-01-28 22:38:21 -06:00
Alex King a38fd8f986 [Alternate Currency] Convert Load of Alternate Currencies to Repositories (#3993)
# Notes
- Convert `LoadAlternateCurrencies()` to repositories.
2024-01-28 22:36:26 -06:00
Alex King 337b6f38e0 [Mercenaries] Add expansion settings update to Mercs:Enable (#4001)
# Notes
- Adds an expansion settings update to the `Mercs:Enable` command, only updates if the expansion setting isn't already `-1` or doesn't already contain the bitmask for Seeds of Destruction (16384).
- This will enable Mercenary Liaisons spawning properly in Plane of Knowledge for the hiring of mercenaries.
2024-01-28 21:58:58 -06:00
Alex King b4414d3052 [Merchants] Convert Merchant Load to Repositories (#4007)
* [Merchants] Convert Merchant Load to Repositories

# Notes
- Convert `GetMerchantDataForZoneLoad()` to repositories.

# Images
## Load

* Change to LoadMerchants()
2024-01-28 21:55:59 -06:00
Alex King bfeeb0ce05 [Commands] Cleanup #petitems Command (#4005)
- Adds support to `#petitems` to allow you to target bot's pets to view their items, defaults to your pet if you have one.
- If you have no pet or no bot pet targeted it won't function.
2024-01-28 21:55:35 -06:00
Alex King e640e3cad3 [Cleanup] Add Raid Loot Type Constants (#4022)
* [Cleanup] Add Raid Loot Type Constants

# Notes
- Add constants for Raid loot types.

* [Cleanup] Add Raid Loot Type Constants

# Notes
- Add constants for Raid loot types.
2024-01-28 21:45:32 -06:00
Alex King c09a3a5bba [Spawn2] Convert Spawn2 Methods to Repositories (#4014)
* [Spawn2] Convert Spawn2 Methods to Repositories

# Notes
- Convert `CreateSpawn2()`, `GetCondition()`, `LoadSpawnConditions()`, `LoadSpawnEvent()`, `UpdateSpawnCondition()`, and `UpdateSpawnEvent()` to repositories.

# Images

* Update spawn2.cpp
2024-01-28 20:24:33 -06:00
Alex King ce907c9519 [Bots] Convert Bot Database Methods to Repositories (#4023)
* [Bots] Convert Bot Database Methods to Repositories

* Final push.

* Cleanup.

* Cleanup.

* Update bot_database.cpp

* Update bot_database.cpp

* Update bot_database.cpp

* Update bot_database.cpp

* Update bot_database.cpp
2024-01-28 20:23:31 -06:00
Alex King 7a770e0e08 [Beacon] Cleanup Beacons Code (#4024)
# Notes
- Use constants where possible.
- Change `resist_adjust` parameter in `Beacon::AELocationSpell` from `resist_adjust` to `in_resist_adjust` so we're not possibly causing parameter shadowing.
2024-01-28 20:20:09 -06:00
Chris Miles 97c3205657 [API] Add lock_status method to world API (#4028) 2024-01-28 20:18:32 -06:00
Alex King ff2e56abc7 [Bug Fix] Fix issue in character_corpses Repository Query (#4029)
* [Bug Fix] Fix issue in character_corpses Repository Query

# Notes
- Query had an extra ` inside of it, causing it to fail.

* Update character_corpses_repository.h
2024-01-28 20:18:24 -06:00
Alex King 9ee16f8bf7 [Crash Fix] Fix Possible Crash in HateList::Find (#4027)
# Notes
- We were not doing any pointer validation, so we were causing crashes in some cases.
- Example: http://spire.akkadius.com/dev/release/22.43.2?id=19163
2024-01-28 02:44:04 -06:00
Paul Coene 5b43bf4a5e [Quests] Use separate variable for quest idle override. (#4026)
* [Quests] Use separate variable for quest idle override.

* Fix missing zone->
2024-01-27 14:09:00 -05:00
Fryguy 4c769c46b3 [Bug Fix] Limit Player Taunt Distance (#4019)
* [Bug Fix] Player Taunt Distance

Previously this was not regulated on the server side and allowed players to exploit situations where the client did not enforce Z distance checks.

Rule Name: MaximumTauntDistance
Rule Default: 150

Calculation is Rule Squared

* remove `this`
2024-01-26 15:44:05 -05:00
Fryguy 8a87e00b66 [Bug Fix] Limit Pet Taunt Distance (#4018)
* [Bug Fix] Limit pet taunt distance

Previously this was not regulated and allowed players to exploit unlimited taunt distance.

Rule Name: PetTauntRange
Rule Default: 150

Calculation is Rule Squared.

* Remove `this`
2024-01-26 15:43:20 -05:00
Alex King 0ebc7f9bb6 [Release] 22.43.2 (#4017)
### Bots

* ^mez command spell list fix ([#3998](https://github.com/EQEmu/Server/pull/3998)) @dariusuknuis 2024-01-19

### Code

* Cleanup position methods ([#4015](https://github.com/EQEmu/Server/pull/4015)) @Kinglykrab 2024-01-25

### Commands

* Add `#npcedit set_grid [Grid ID]` to `#npcedit` ([#4004](https://github.com/EQEmu/Server/pull/4004)) @Kinglykrab 2024-01-22

### Crash Fix

* Fix crash when creating Frogloks/Drakkin ([#4016](https://github.com/EQEmu/Server/pull/4016)) @Kinglykrab 2024-01-25
* Reverting PR #3877 ([#3997](https://github.com/EQEmu/Server/pull/3997)) @fryguy503 2024-01-17

### Database

* Drop deprecated item_tick table ([#3977](https://github.com/EQEmu/Server/pull/3977)) @Akkadius 2024-01-14
* Drop item_tick if exists tweak in manifest ([#3985](https://github.com/EQEmu/Server/pull/3985)) @Akkadius 2024-01-15
* Increase max spawngroup name from 50 to 200 ([#3991](https://github.com/EQEmu/Server/pull/3991)) @Akkadius 2024-01-22

### Fixes

* Fix Mercenaries Buffs/Zoning Issues ([#4000](https://github.com/EQEmu/Server/pull/4000)) @Kinglykrab 2024-01-22
* Fix zone database update manifest ([#3972](https://github.com/EQEmu/Server/pull/3972)) @Kinglykrab 2024-01-13
* Fixes to zone idle while empty changes. ([#4006](https://github.com/EQEmu/Server/pull/4006)) @noudess 2024-01-23
* Reversed logic on InLiquid ([#3979](https://github.com/EQEmu/Server/pull/3979)) @fryguy503 2024-01-14

### Instances

* Convert Instance Quest Methods to Repositories ([#4012](https://github.com/EQEmu/Server/pull/4012)) @Kinglykrab 2024-01-25

### Logging

* Force Info category to be always on in file/console logs ([#3990](https://github.com/EQEmu/Server/pull/3990)) @Akkadius 2024-01-22

### Merchants

* Change database structure for merchant slots ([#3974](https://github.com/EQEmu/Server/pull/3974)) @joligario 2024-01-14

### Messages

* Fix disciple message added by previous patch. ([#3986](https://github.com/EQEmu/Server/pull/3986)) @noudess 2024-01-15

### Quest API

* QuestReward should now summon item to the inventory instead of the cursor. ([#3996](https://github.com/EQEmu/Server/pull/3996)) @regneq 2024-01-22

### Repositories

* Add `rank` to reserved words ([#3982](https://github.com/EQEmu/Server/pull/3982)) @Akkadius 2024-01-15
* Fix datetime zero-value save behavior ([#3976](https://github.com/EQEmu/Server/pull/3976)) @Akkadius 2024-01-14

### Spawn2

* Spawn condition value should default spawn_conditions value ([#3980](https://github.com/EQEmu/Server/pull/3980)) @noudess 2024-01-14

### Zoning

* Additional logs for zoning under instance checks ([#3989](https://github.com/EQEmu/Server/pull/3989)) @Akkadius 2024-01-22
2024-01-25 16:30:50 -06:00
Alex King 9ac25338bb [Crash Fix] Fix crash when creating Frogloks/Drakkin (#4016)
* [Crash Fix] Fix crash when creating Frogloks/Drakkin

# Notes
- https://github.com/EQEmu/Server/pull/3920 introduced an issue where we were using `uchar` for `race_selection` and `class_selection` which was not functioning properly within `IsPlayerRace()`.

* Update client.cpp
2024-01-25 06:19:59 -05:00
Alex King e9285fd2ca [Instances] Convert Instance Quest Methods to Repositories (#4012)
* [Instances] Convert Instance Quest Methods to Repositories

# Notes
- Convert `UpdateInstanceTimer()` and `GetInstanceTimerByID()` to repositories.
- Cleanup other instance methods.

* Update questmgr.cpp
2024-01-25 05:50:10 -05:00
Alex King 5b85f89c21 [Cleanup] Cleanup position methods (#4015)
# Notes
- Cleanup logic.
2024-01-24 22:47:24 -06:00
Paul Coene 7fed8fc8c8 [Bug Fix] Fixes to zone idle while empty changes. (#4006) 2024-01-22 19:33:00 -05:00
Alex King 26769f40d9 [Commands] Add #npcedit set_grid [Grid ID] to #npcedit (#4004)
* [Commands] Add #npcedit grid_id to #npcedit

# Notes
- Adds `#npcedit grid_id [Grid ID]` to `#npcedit`.

* set_grid
2024-01-22 17:49:18 -05:00
regneq f6148b9b8d [Quest] QuestReward should now summon item to the inventory instead of the cursor. (#3996)
* [forage rule feature] add a rule to disabled using common_food_ids from the list in forage.cpp.  currently set to enabled.

* [Quest] change QuestReward summonitem to SummonItemToInventory.

* add closing brackets in QuestReward functions.
2024-01-22 17:35:15 -05:00
Chris Miles ca1299bf1d [Database] Increase max spawngroup name from 50 to 200 (#3991) 2024-01-22 17:34:54 -05:00
Chris Miles 3fb24dc0a3 [Logging] Force Info category to be always on in file/console logs (#3990) 2024-01-22 17:34:48 -05:00
Chris Miles dcd7bffa54 [Zoning] Additional logs for zoning under instance checks (#3989) 2024-01-22 17:34:41 -05:00
Alex King 5298abe6bc [Bug Fix] Fix Mercenaries Buffs/Zoning Issues (#4000)
# Notes
- Mercenaries were disappearing on zoning because they were saving to slot `1` and being loaded from slot `0`.
- Mercenaries were not displaying properly in group window because of this as well.
- Mercenary buffs were saving even when they did not have any buffs.
2024-01-22 17:34:28 -05:00
dariusuknuis fbc2b7c152 [Bot] ^mez command spell list fix (#3998)
This change will allow necros to cast mez spells when ^mez command is used.
2024-01-19 16:39:14 -05:00
Paul Coene 86705000b0 Push discpline messages under melee->disciplines (#3987)
* Push discpline messages under melee->disciplines

* Added safe_delete()

* Remove fryguy's new message code and fix existing instead
2024-01-19 08:55:26 -05:00
Fryguy 748e37dbdf [Crash Fix] Reverting PR #3877 (#3997)
Reports of #3877 causing crashes on windows. No reports on Linux, but reverting for safety.
2024-01-17 18:22:11 -05:00
Paul Coene 27256215b8 [Messages] Fix disciple message added by previous patch. (#3986) 2024-01-15 14:01:24 -05:00
Chris Miles 59cbe1a152 [Database] Drop item_tick if exists tweak in manifest (#3985) 2024-01-14 23:14:15 -05:00
Chris Miles 3e50427bb7 [Repositories] Add rank to reserved words (#3982)
* [Repositories] Add `rank` to reserved words

* Update zonedb.cpp

* Guild Ranks

---------

Co-authored-by: Kinglykrab <kinglykrab@gmail.com>
2024-01-14 20:58:03 -05:00
Paul Coene 883b3b5826 [Spawn2] Spawn condition value should default spawn_conditions value (#3980)
* [Spawn2] Spawn condition value should default to value in spawn_conditions table

* Formatting changes and {}
2024-01-14 13:50:05 -05:00
Fryguy 135ee6b2b7 [Bug Fix] Reversed logic on InLiquid (#3979)
Thank you @noudness for catching this. Reversed logic on InLiquid check for falling damage.
2024-01-14 11:22:48 -05:00
Akkadius 906879ce2e [Repositories] Revert #3976 - fix character corpses 2024-01-14 03:30:00 -06:00
Chris Miles 8b7aba2769 [Release] 22.43.0 (#3978) 2024-01-14 00:12:26 -06:00
Chris Miles 9303255caa [Database] Drop deprecated item_tick table (#3977) 2024-01-14 00:10:21 -06:00
Chris Miles 14509fcc4e [Repositories] Fix datetime zero-value save behavior (#3976) 2024-01-14 00:10:13 -06:00
JJ e40267b9b8 [Merchants] Change database structure for merchant slots (#3974)
* [Merchants] Change database structure for merchant slots
The `slot` field should be unsigned int. The temp slot is currently limited to 127. The client will limit the visible slots.

* Update version.h
2024-01-13 20:58:46 -05:00
Alex King f3073b463f [Release] 22.42.1 (#3973)
### Fixes

* Fix zone database update manifest ([#3972](https://github.com/EQEmu/Server/pull/3972)) @Kinglykrab 2024-01-13
* quest::processmobswhilezoneempty() fix. ([#3971](https://github.com/EQEmu/Server/pull/3971)) @noudess 2024-01-13
2024-01-13 20:09:01 -05:00
Alex King 5ad4129312 [Bug Fix] Fix zone database update manifest (#3972)
* [Bug Fix] Fix zone database update manifest

# Notes
- Missing comma.

* Update database_update_manifest.cpp
2024-01-13 18:15:01 -05:00
Paul Coene 4b5b29b165 [Bug Fix] quest::processmobswhilezoneempty() fix. (#3971) 2024-01-13 09:37:22 -05:00
Alex King 3b7a138de4 [Release] 22.42.0 (#3970)
### AAs

* Convert Loading of AAs to Repositories ([#3963](https://github.com/EQEmu/Server/pull/3963)) @Kinglykrab 2024-01-13

### Auras

* Convert Get of Auras to Repositories ([#3964](https://github.com/EQEmu/Server/pull/3964)) @Kinglykrab 2024-01-13

### Character

* Character EXP Modifiers in Memory ([#3934](https://github.com/EQEmu/Server/pull/3934)) @Kinglykrab 2024-01-13
* Convert Character Corpses to Repositories ([#3941](https://github.com/EQEmu/Server/pull/3941)) @Kinglykrab 2024-01-13
* Convert Save of Character Languages to Repositories ([#3948](https://github.com/EQEmu/Server/pull/3948)) @Kinglykrab 2024-01-12

### Code

* Cleanup AddCash() and RemoveCash() NPC Methods ([#3957](https://github.com/EQEmu/Server/pull/3957)) @Kinglykrab 2024-01-12
* Cleanup ChangeSize() ([#3959](https://github.com/EQEmu/Server/pull/3959)) @Kinglykrab 2024-01-12
* Cleanup Owner Related Mob Methods ([#3960](https://github.com/EQEmu/Server/pull/3960)) @Kinglykrab 2024-01-13
* Cleanup RandomizeFeatures() ([#3958](https://github.com/EQEmu/Server/pull/3958)) @Kinglykrab 2024-01-12
* Remove GroupCount() and RaidGroupCount() ([#3943](https://github.com/EQEmu/Server/pull/3943)) @Kinglykrab 2024-01-13
* Remove unused Grid methods ([#3944](https://github.com/EQEmu/Server/pull/3944)) @Kinglykrab 2024-01-13

### Commands

* Convert NPC Spawn Methods to Repositories ([#3956](https://github.com/EQEmu/Server/pull/3956)) @Kinglykrab 2024-01-13

### Crash Fix

* Character Creation Class/Race out of Range. ([#3920](https://github.com/EQEmu/Server/pull/3920)) @fryguy503 2024-01-09

### Feat

* Alt Sinister Strike Formula ([#3921](https://github.com/EQEmu/Server/pull/3921)) @fryguy503 2024-01-09

### Feature

* Add Lore Item Trade Error ([#3932](https://github.com/EQEmu/Server/pull/3932)) @fryguy503 2024-01-13
* Rule: UseLiveBlockedMessage Bard Spam ([#3933](https://github.com/EQEmu/Server/pull/3933)) @fryguy503 2024-01-09

### Fixes

* Attack Corpse Skill Up Fix ([#3924](https://github.com/EQEmu/Server/pull/3924)) @fryguy503 2024-01-09
* Fix Issue with SetFlyMode() ([#3961](https://github.com/EQEmu/Server/pull/3961)) @Kinglykrab 2024-01-12
* Harm Touch Critical Ratio ([#3915](https://github.com/EQEmu/Server/pull/3915)) @fryguy503 2024-01-09
* Increase Precision in CheckDoubleAttack ([#3928](https://github.com/EQEmu/Server/pull/3928)) @fryguy503 2024-01-09
* IsOfClientBotMerc() for Discipline Messages ([#3940](https://github.com/EQEmu/Server/pull/3940)) @fryguy503 2024-01-09
* Limit MeleeMitigationEffect to defender if only client. ([#3918](https://github.com/EQEmu/Server/pull/3918)) @fryguy503 2024-01-09
* Rampage Number of Hits Limit ([#3929](https://github.com/EQEmu/Server/pull/3929)) @fryguy503 2024-01-09
* Remove duplicate character_data repository in zonedb.cpp ([#3935](https://github.com/EQEmu/Server/pull/3935)) @Kinglykrab 2024-01-09
* Undead Should Never Flee ([#3926](https://github.com/EQEmu/Server/pull/3926)) @fryguy503 2024-01-09

### Global Loot

* Convert Global Loot to Repositories ([#3962](https://github.com/EQEmu/Server/pull/3962)) @Kinglykrab 2024-01-13

### Ground Spawns

* Convert Ground Spawns to Repositories ([#3967](https://github.com/EQEmu/Server/pull/3967)) @Kinglykrab 2024-01-13

### Horses

* Convert Horses to Repositories ([#3965](https://github.com/EQEmu/Server/pull/3965)) @Kinglykrab 2024-01-13

### Item Ticks

* Remove Item Ticks Code ([#3955](https://github.com/EQEmu/Server/pull/3955)) @Kinglykrab 2024-01-13

### Mercenaries

* Convert Mercenaries to Repositories ([#3947](https://github.com/EQEmu/Server/pull/3947)) @Kinglykrab 2024-01-13

### Merchants

* Convert Clear/Delete/Save of Temporary Merchant Lists to Repositories ([#3945](https://github.com/EQEmu/Server/pull/3945)) @Kinglykrab 2024-01-13

### NPCs

* Convert Load of NPC Emotes to Repositories ([#3954](https://github.com/EQEmu/Server/pull/3954)) @Kinglykrab 2024-01-13

### Objects

* Convert Add/Delete/Update of Objects to Repositories ([#3966](https://github.com/EQEmu/Server/pull/3966)) @Kinglykrab 2024-01-13
* Convert World Containers to Repositories ([#3951](https://github.com/EQEmu/Server/pull/3951)) @Kinglykrab 2024-01-13

### Pets

* Convert Pets to Repositories ([#3968](https://github.com/EQEmu/Server/pull/3968)) @Kinglykrab 2024-01-13

### Repositories

* Add null integer column support, instance_list notes migration, regenerate repositories ([#3969](https://github.com/EQEmu/Server/pull/3969)) @Akkadius 2024-01-13

### Respawns

* Convert Respawn Times to Repositories ([#3949](https://github.com/EQEmu/Server/pull/3949)) @Kinglykrab 2024-01-13

### Rules

* Add rule for bard aggro cap ([#3909](https://github.com/EQEmu/Server/pull/3909)) @fryguy503 2024-01-09
* Allow GMs to silently summon ([#3910](https://github.com/EQEmu/Server/pull/3910)) @fryguy503 2024-01-09
* Bash Two Hander use Shoulders ([#3925](https://github.com/EQEmu/Server/pull/3925)) @fryguy503 2024-01-09
* Classic Spell Data SPA Calc variability ([#3931](https://github.com/EQEmu/Server/pull/3931)) @fryguy503 2024-01-09
* Classic Tracking Skillups ([#3923](https://github.com/EQEmu/Server/pull/3923)) @fryguy503 2024-01-09
* Separate Tradeskill Max Train from Research. ([#3916](https://github.com/EQEmu/Server/pull/3916)) @fryguy503 2024-01-09

### Tasks

* Add Support for Task Window Element Groups ([#3902](https://github.com/EQEmu/Server/pull/3902)) @hgtw 2024-01-09

### Traps

* Convert Load of LDoN Traps/Trap Entries to Repositories ([#3953](https://github.com/EQEmu/Server/pull/3953)) @Kinglykrab 2024-01-13

### Zones

* Convert Get/Set of Zone Timezone to Repositories ([#3946](https://github.com/EQEmu/Server/pull/3946)) @Kinglykrab 2024-01-13
* Convert IDLE_WHEN_EMPTY to a Zone Column ([#3891](https://github.com/EQEmu/Server/pull/3891)) @Kinglykrab 2024-01-13
* Convert SaveZoneCFG to Repositories ([#3950](https://github.com/EQEmu/Server/pull/3950)) @Kinglykrab 2024-01-13
2024-01-13 01:31:56 -06:00
Alex King 742b437f2c [Zones] Convert IDLE_WHEN_EMPTY to a Zone Column (#3891)
* [Rules] Convert IDLE_WHEN_EMPTY to a rule

# Notes
- Converts `IDLE_WHEN_EMPTY` to `Zone:ZonesIdleWhenEmpty` so that we can change this on the fly or on a zone-by-zone basis instead of having to recompile to do this.
- Especially helpful for those using release binaries that do not compile their own source.

* Convert to zone column.

* Update ruletypes.h

* Update ruletypes.h

* Update entity.cpp

* Update entity.cpp

* Rename.

* Update database_update_manifest.cpp

* Update base_zone_repository.h

* Update zone.cpp

* seconds_before_idle

* Update database_update_manifest.cpp

* Getter/Setters/Private

* Update base_zone_repository.h

* IsIdle()/SetIsIdle()

* Update entity.cpp
2024-01-13 01:21:40 -06:00
Alex King d41bd8f963 [Zones] Convert Get/Set of Zone Timezone to Repositories (#3946)
* [Zones] Convert Get/Set of Zone Timezone to Repositories

- Convert `GetZoneTimezone()` and `SetZoneTimeZone()` to repositories.

* Update time_zone.cpp
2024-01-13 00:10:14 -06:00
Alex King 73a099c5ea [Character] Character EXP Modifiers in Memory (#3934)
* Cleanup

* Final push.

* Update zonedb.cpp

* Update zone.h

* Update exp.cpp

* Update zonedb.cpp

---------

Co-authored-by: Chris Miles <akkadius1@gmail.com>
2024-01-13 00:03:36 -06:00
Alex King 77c0eb3998 [Character] Convert Character Corpses to Repositories (#3941)
* asdsa

* Final push

* Update character_corpses_repository.h

* Update character_corpses_repository.h

* Update zonedb.cpp

* Update zonedb.cpp

* Final push

* Update character_corpses_repository.h
2024-01-13 00:02:44 -06:00
Alex King 5d1c59c95f [Merchants] Convert Clear/Delete/Save of Temporary Merchant Lists to Repositories (#3945)
* [Merchants] Convert Clear/Delete/Save of Temporary Merchant Lists to Repositories

- Convert `ClearMerchantTemp()`, `DeleteMerchantTemp()`, and `SaveMerchantTemp()` to repositories.

* Update merchantlist_temp_repository.h
2024-01-12 23:47:25 -06:00
Fryguy 1d7f39c13b [Feature] Add Lore Item Trade Error (#3932)
* DRAFT: [Feature] Add Lore Item Trade Error

I had lots of feedback from players to add feedback when doing player to player trades to include what items were causing the trade block.

I quickly added this check, however if multiple lore items are being traded, this will only output the first. So far it has worked well, but not sure if we want to:

- Expand this to list all lore items in the trade.
- Enable this by default and do not provide a rule?

* Credit to @KinglyKrab for the assist on making this output a list.

Ruled this off but enabled by default.
2024-01-12 23:43:57 -06:00
Alex King 1bb8678abe [Cleanup] Remove GroupCount() and RaidGroupCount() (#3943)
# Notes
- These are unused.
2024-01-12 23:41:21 -06:00
Alex King 47968774d9 [Cleanup] Remove unused Grid methods (#3944)
# Notes
- Remove `AssignGrid()`, `GetGridType()`, `GetGridType2()`, and `GetWaypoints()` as they are unused.
2024-01-12 23:41:06 -06:00
Alex King d7dc717249 [Mercenaries] Convert Mercenaries to Repositories (#3947)
* [Mercenaries] Convert Mercenaries to Repositories

- Convert all Mercenary methods to repositories aside from inner join queries that cannot be converted.

* Update base_merc_subtypes_repository.h

* Update base_merc_subtypes_repository.h

* Regenerate repositories
2024-01-12 23:40:26 -06:00
Alex King 32659426ba [AAs] Convert Loading of AAs to Repositories (#3963)
* [AAs] Convert Loading of AAs to Repositories

- Convert `LoadAlternateAdvancementAbilities()` to repositories.
- Regenerate repositories since a column was added to `aa_ability`.

* Update aa.cpp

* Update aa.cpp
2024-01-12 23:38:13 -06:00
Alex King 238c9fe667 [Global Loot] Convert Global Loot to Repositories (#3962)
* [Global Loot] Convert Global Loot to Repositories

# Notes
- Convert `LoadGlobalLoot()` to repositories.

* Update repository-generator.pl

* Final push.

* Update loottables.cpp

---------

Co-authored-by: Akkadius <akkadius1@gmail.com>
2024-01-12 23:37:26 -06:00
Alex King b9f997015a [Horses] Convert Horses to Repositories (#3965)
* [Horses] Convert Horses to Repositories

# Notes
- Convert `BuildHorseType()` to repositories.
- Removed unused code, parameters, and member variables in horses.

* Update horse.cpp
2024-01-12 23:33:52 -06:00
Alex King 11e2a252e5 [Objects] Convert World Containers to Repositories (#3951)
* [Objects] Convert World Containers to Repositories

- Convert world containers to repositories.

* Update zonedb.cpp
2024-01-12 23:33:37 -06:00
Alex King fc627ed52d [NPCs] Convert Load of NPC Emotes to Repositories (#3954)
* [NPCs] Convert Load of NPC Emotes to Repositories

- Convert `LoadNPCEmotes()` to repositories.

* Cleanup
2024-01-12 23:33:11 -06:00
Alex King 4c028b85f0 [Auras] Convert Get of Auras to Repositories (#3964)
* [Auras] Convert Get of Auras to Repositories

# Notes
- Convert `GetAuraEntry()` to repositories.

* Update aura.cpp
2024-01-12 23:29:43 -06:00
Alex King f1d5e3eedf [Zones] Convert SaveZoneCFG to Repositories (#3950)
* [Zones] Convert SaveZoneCFG to Repositories

# Notes
- Convert `SaveZoneCFG()` to repositories.

* Comment

* safe_heading

* Update zone_data.cpp
2024-01-12 23:28:16 -06:00
Alex King d59531b16f [Item Ticks] Remove Item Ticks Code (#3955)
* [Items] Convert Load of Item Ticks to Repositories

- Convert `LoadItemTicks()` to repositories.

* Remove item tick code.

* Remove repository references.

* Update zone.h
2024-01-12 23:17:00 -06:00
Alex King e182d685d3 [Commands] Convert NPC Spawn Methods to Repositories (#3956)
* [Commands] Convert NPC Spawn Methods to Repositories

# Notes
- Convert `AddNewNPCSpawnGroupCommand()`, `AddNPCTypes()`, `AddSpawnFromSpawnGroup()`, `CreateNewNPCCommand()`, `DeleteSpawnLeaveInNPCTypeTable()`, `DeleteSpawnRemoveFromNPCTypeTable()`, `NPCSpawnDB()`, and `UpdateNPCTypeAppearance()`.

* Regenerate.

* Cleanup.
2024-01-12 23:02:19 -06:00
Alex King 6968a70310 [Cleanup] Cleanup Owner Related Mob Methods (#3960)
* [Cleanup] Cleanup Owner Related Mob Methods

# Notes
- Cleanup `GetOwner()`, `GetOwnerOrSelf()`, `GetUltimateOwner()`, `HasOwner()`, and `IsPet()` methods.

* Update mob.cpp
2024-01-12 22:59:30 -06:00
Alex King 06e8d258e4 [Objects] Convert Add/Delete/Update of Objects to Repositories (#3966)
* [Objects] Convert Add/Delete/Update of Objects to Repositories

- Convert `AddObject()`, `DeleteObject()`, and `UpdateObject()` to repositories.

* Update object_manipulation.cpp

* Update object_manipulation.cpp

* Update object_manipulation.cpp
2024-01-12 22:55:46 -06:00
Alex King 8cb15f9357 [Pets] Convert Pets to Repositories (#3968)
* [Pets] Convert Pets to Repositories

# Notes
- Convert `GetPoweredPetEntry()` to repositories.

* Update pets.cpp
2024-01-12 22:41:56 -06:00
Alex King eb33e5a064 [Ground Spawns] Convert Ground Spawns to Repositories (#3967)
# Notes
- Convert `LoadGroundSpawns()` to repositories.
2024-01-12 22:41:08 -06:00
Alex King 71f78b757e [Respawns] Convert Respawn Times to Repositories (#3949)
* [Respawns] Convert Respawn Times to Repositories

- Convert `respawn_times` based methods to repositories.

* Missed some.

* Comments
2024-01-12 22:38:31 -06:00
Chris Miles 818f833d04 [Repository] Add null integer column support, instance_list notes migration, regenerate repositories (#3969) 2024-01-12 22:23:55 -06:00
Alex King 1238a6ca68 [Traps] Convert Load of LDoN Traps/Trap Entries to Repositories (#3953)
- Convert `LoadLDoNTraps()` and `LoadLDoNTrapEntries()` to repositories.
2024-01-12 20:05:00 -05:00
Alex King 4afc1efb38 [Character] Convert Save of Character Languages to Repositories (#3948)
# Notes
- Convert `SaveCharacterLanguage()` to repositories.
- Was missed in the other languages changes.
2024-01-12 03:30:42 -06:00
Alex King 24eb40d231 [Experience Modifiers] Convert Load of Level Experience Modifiers to Repositories (#3952)
# Notes
- Convert `LoadLevelEXPMods()` to repositories.
2024-01-12 02:46:33 -06:00
Alex King 2475092ed9 [Cleanup] Cleanup AddCash() and RemoveCash() NPC Methods (#3957)
# Notes
- `AddCash()` was `uint16` in C++/Perl and `int` in Lua, fix these to `uint32`.
- Consolidate logic in `AddCash()`.
2024-01-12 01:53:01 -06:00
Alex King 53d6e449c2 [Cleanup] Cleanup ChangeSize() (#3959)
# Notes
- Use `EQ::Clamp()` for logic instead of basic comparsions.
- Rename restriction parameter to `unrestricted`.
2024-01-12 01:51:02 -06:00
Alex King b61649a2a0 [Cleanup] Cleanup RandomizeFeatures() (#3958)
# Notes
- Uses pre-defined constants and cleanup code.
- Move `IsPlayerRace()` check so it's an early return instead of using an `else`.
2024-01-12 01:50:06 -06:00
Alex King ef635cb257 [Bug Fix] Fix Issue with SetFlyMode() (#3961)
# Notes
- Variable and parameter had the same name, meaning this could fail.
2024-01-12 01:35:30 -06:00
Fryguy 62b5f8a488 [Rules] Classic Spell Data SPA Calc variability (#3931)
* [Rules] Classic Spell Data SPA Calc variability

When  using lucy imports of older more classic data, they lack the limit values which provides Focus Random Effectiveness.

Example:

Bazu Plauge (6472) went from a 40 limit to 0 limit on the 2006 lucy import.

Lucy does have limit value data, but it appears the affected SPAs sony handled in source vs in spell data.

* Requested Changes
2024-01-09 05:49:10 -05:00
Fryguy d0e069f4f8 [Bug Fix] Rampage Number of Hits Limit (#3929)
* [Bug Fix] Rampage Number of Hits Limit

Rampage should Hit 1-2 times (Primary / Secondary) should not be Triple/Quadable

* requested name convention changes
2024-01-09 05:48:45 -05:00
Fryguy 1b5b22eeca [Rule] Classic Tracking Skillups (#3923)
* [Rule] Classic Tracking Skillups

Rule: TrackingAutoRefreshSkillUps
Default: True

Disable rule to prevent skillups from happening on auto refresh of tracking window.

* typo
2024-01-09 05:48:35 -05:00
Fryguy 66d9371714 [Bug Fix] Increase Precision in CheckDoubleAttack (#3928)
* [Bug Fix] Increase percision on CheckDoubleAttack.

On DA Checks where class was a non skill based DA Attacker (Bard or BST with granted DA) The DA check was too steep and should not have been dividing by 500 but rather 100. Also adjusted logic percision to use floats so loss of data does not occur.

* logging var names update

* Update attack.cpp

---------

Co-authored-by: Alex King <89047260+Kinglykrab@users.noreply.github.com>
2024-01-08 22:34:41 -06:00
Fryguy 0418dc4aa3 [Bug Fix] Attack Corpse Skill Up Fix (#3924)
* [Bug] Attack Corpse Skillup Fix

Occasions where a corpse will allow skillups from attacks being turned on (even if no damage)

* requested changes
2024-01-08 22:32:18 -06:00
Fryguy f12c87a04a [Feat] Alt Sinister Strike Formula (#3921)
I have been informed that this was proven to be false, but the AA is pretty useless without some adjustment.

Adding this as a rule to allow server owners to adjust as needed.

Update Sinister Strikes
tapatalk.com/groups/monklybusiness43508/leksikon-s-half-assed-guide-to-monkly-aas-oow-incl-t510-s20.html?sid=a9c7745f287f3e89301c960c20f33248

Sinister Strikes:
19 Delay weapon -- Gives a 5 damage bonus to all hits
20 Delay weapon -- Gives a 6 damage bonus to all hits
24 Delay weapon -- Gives a 7 damage bonus to all hits
Given Quarm hammer with maxed non-GoD AAs:
0.7 HPS offhand = 4.9 DPS increase.
2024-01-08 22:31:04 -06:00
Fryguy 97dbf85a4c [Bug Fix] Limit MeleeMitigationEffect to defender if only client. (#3918)
* [Bug] Limit MeleeMitigationEffect to defender if only client.

* Fix MeleeMitigation to properly Add (Substract due to negative values).

* defender fix
2024-01-08 22:30:29 -06:00
Fryguy 46a0cf6b02 [Rule] Separate Tradeskill Max Train from Research. (#3916)
* [Rule] Seperate Tradeskill Max Train from Research.

Different eras had different rules on the max gm trainable skill for Research.

* Phrasing
2024-01-08 22:29:57 -06:00
Fryguy 8f34bd998f [Rule] Add rule for bard aggro cap (#3909)
BardAggroCap - Default 40

Allows adjustment of per song bard aggro cap.
2024-01-08 22:29:24 -06:00
Fryguy 98928aee74 [Rule] Allow GMs to silently summon (#3910)
* [Rule] Allow GMs to silently summon

Disable to silently summon players with #summon.

Converted SummonPC to a MessageString

* Implementing an automatic detection of gm hidden mode and silent summoning.
2024-01-08 22:28:50 -06:00
Fryguy e6dc980315 [Bug Fix] Harm Touch Critical Ratio (#3915)
* [Bug] HT Crit Ratio

This is used to tune and bring HT Crits more in line with the correct values as proven in screenshots.

* requested changes

* mistakenly kept mob::
2024-01-08 22:27:56 -06:00
Fryguy ec465616b4 [Feature] Rule: UseLiveBlockedMessage Bard Spam (#3933)
When using `UseLiveBlockedMessage` rule, bard will get massively spammed when doing aoe songs that are blocked. Not sure it is resonable to try and filter out all stacking messages from songs, but rather just block bards as a whole. I can not think of many cases where bards care of songs land or not when using this rule.
2024-01-08 22:26:10 -06:00
Fryguy 23de0119ff [Bug Fix] Undead Should Never Flee (#3926)
* [Bug Fix] Undead Should Never Flee

Added a hard return on Undead Body Types. They should never flee under any circumstance.

* space
2024-01-08 22:24:57 -06:00
hg f59b4feb94 [Tasks] Add Support for Task Window Element Groups (#3902)
Elements that share a group are placed in the same list section and
separated from other groups with a divider.

Live appears to only use this for optional elements in some tasks and
when used each optional always gets its own group. This might indicate
it's done automatically under certain criteria to ensure optionals are
never grouped with non-optionals regardless of index.

Since groups are available in captures and there's very few tasks that
use this, we don't need to worry about trying to replicate any automatic
behavior since this allows more customization.
2024-01-08 23:24:41 -05:00
Fryguy e035660150 [Crash Fix] Character Creation Class/Race out of Range. (#3920)
* [Crash Fix] Character Creation Class/Race out of Range.

Known bug to crash the world server from character creation.

You can send a packet with a manual race or class entry below 0 or above 255 will cause world crash.

* Requested changes

* Compile fixes and logging change

* Fixed compile issues
2024-01-08 23:24:15 -05:00
Fryguy 472dd71d7f [Rules] Bash Two Hander use Shoulders (#3925)
Rule: BashTwoHanderUseShoulderAC
Default: False

Allows server operators to choose if they want two handed bash to utilize the shoulder armor or not.

Rule: BashACBonusDivisor
Default: 25.0

Allows adjustment for bash AC value contributions. Lower to increase damage.
2024-01-08 23:23:51 -05:00
Fryguy 409b6bf424 [Bug Fix] IsOfClientBotMerc() for Discipline Messages (#3940) 2024-01-08 23:23:09 -05:00
Alex King 9da713a830 [Bug Fix] Remove duplicate character_data repository in zonedb.cpp (#3935)
# Notes
- Must have been a typo from one of my commits where they overlapped in functionality.
2024-01-08 23:22:42 -05:00
537 changed files with 57331 additions and 35305 deletions
+397
View File
@@ -1,3 +1,400 @@
## [22.44.2] - 2/12/2024
### Bots
* Remove Alt Combat Functionality ([#4067](https://github.com/EQEmu/Server/pull/4067)) @Kinglykrab 2024-02-12
### Code
* Use explicit conversions for enum formatting ([#4064](https://github.com/EQEmu/Server/pull/4064)) @hgtw 2024-02-12
### Database
* Fix default value for `time_of_death` in `character_corpses` ([#4060](https://github.com/EQEmu/Server/pull/4060)) @joligario 2024-02-11
* Fix table name in manifest ([#4063](https://github.com/EQEmu/Server/pull/4063)) @joligario 2024-02-11
* Proper default for `droptime` from `object_contents` ([#4061](https://github.com/EQEmu/Server/pull/4061)) @joligario 2024-02-11
### Fixes
* Guard against crash condition ([#4062](https://github.com/EQEmu/Server/pull/4062)) @neckkola 2024-02-11
### Guilds
* Clean up `GUILD_RANK_NONE` references ([#4059](https://github.com/EQEmu/Server/pull/4059)) @joligario 2024-02-11
## [22.44.1] - 2/11/2024
### Fixes
* Fix File::Exists(file_name) to be resilient to Chinese characters ([#4058](https://github.com/EQEmu/Server/pull/4058)) @Akkadius 2024-02-11
## [22.44.0] - 2/10/2024
### Base Data
* Remove from shared memory and simplify ([#4045](https://github.com/EQEmu/Server/pull/4045)) @Kinglykrab 2024-02-05
### Bot Commands
* Separate Bot Commands into Individual Files ([#4035](https://github.com/EQEmu/Server/pull/4035)) @Kinglykrab 2024-02-01
### Code
* Convert Quest Ornament Methods to Repositories ([#4048](https://github.com/EQEmu/Server/pull/4048)) @Kinglykrab 2024-02-10
* Remove redundant check in Object::HandleCombine ([#4041](https://github.com/EQEmu/Server/pull/4041)) @joligario 2024-02-03
### Commands
* Add #show special_abilities ([#4043](https://github.com/EQEmu/Server/pull/4043)) @Kinglykrab 2024-02-05
### Crash Reporting
* Update Spire to use SSL ([#4055](https://github.com/EQEmu/Server/pull/4055)) @Akkadius 2024-02-10
### Database
* Correct manifest migration entries that should be content ([#4047](https://github.com/EQEmu/Server/pull/4047)) @Akkadius 2024-02-05
### Deprecation
* Remove eqemu_server.pl script and ties to server ([#4049](https://github.com/EQEmu/Server/pull/4049)) @Akkadius 2024-02-10
### Feature
* Add RoF2 Guild features ([#3699](https://github.com/EQEmu/Server/pull/3699)) @neckkola 2024-02-10
* Add optional `is_forced` parameter to Zone::Repop ([#4046](https://github.com/EQEmu/Server/pull/4046)) @Kinglykrab 2024-02-05
* Add support to crosszone/worldwide spells to affect bot pets ([#4036](https://github.com/EQEmu/Server/pull/4036)) @Kinglykrab 2024-02-01
* Classic Taunt (Pre 2006) style of taunt ([#3942](https://github.com/EQEmu/Server/pull/3942)) @fryguy503 2024-02-10
* Corpse Overhaul ([#3938](https://github.com/EQEmu/Server/pull/3938)) @fryguy503 2024-02-08
### Fixes
* Fix Bot Non-Melee Damage Messages ([#4038](https://github.com/EQEmu/Server/pull/4038)) @Kinglykrab 2024-02-01
* Fix Froglok Starting Languages ([#4050](https://github.com/EQEmu/Server/pull/4050)) @Kinglykrab 2024-02-09
* Fix Issue with Bot Dual wield ([#4037](https://github.com/EQEmu/Server/pull/4037)) @Kinglykrab 2024-02-01
* Fix for potential crash of DS damage on death ([#4040](https://github.com/EQEmu/Server/pull/4040)) @nytmyr 2024-02-03
### GM Commands
* Fix typo in #rules help. ([#4042](https://github.com/EQEmu/Server/pull/4042)) @noudess 2024-02-04
### Loot
* Remove from shared memory, simplification ([#3988](https://github.com/EQEmu/Server/pull/3988)) @Akkadius 2024-02-05
### Objects
* Add `fix_z` column to ground spawns ([#3992](https://github.com/EQEmu/Server/pull/3992)) @Kinglykrab 2024-02-01
### Quest API
* Add GetAAEXPPercentage() and GetEXPPercentage() to Perl/Lua ([#4044](https://github.com/EQEmu/Server/pull/4044)) @Kinglykrab 2024-02-04
### Quests
* Cleanup Quest Parser Logic ([#4025](https://github.com/EQEmu/Server/pull/4025)) @Kinglykrab 2024-02-06
### Tasks
* Avoid removing client tasks from memory on load ([#4052](https://github.com/EQEmu/Server/pull/4052)) @hgtw 2024-02-10
* Send active elements in task select packet ([#4051](https://github.com/EQEmu/Server/pull/4051)) @hgtw 2024-02-10
## [22.43.3] - 1/30/2024
### API
* Add lock_status method to world API ([#4028](https://github.com/EQEmu/Server/pull/4028)) @Akkadius 2024-01-29
### Alternate Currency
* Convert Load of Alternate Currencies to Repositories ([#3993](https://github.com/EQEmu/Server/pull/3993)) @Kinglykrab 2024-01-29
### Beacon
* Cleanup Beacons Code ([#4024](https://github.com/EQEmu/Server/pull/4024)) @Kinglykrab 2024-01-29
### Bots
* Convert Bot Database Methods to Repositories ([#4023](https://github.com/EQEmu/Server/pull/4023)) @Kinglykrab 2024-01-29
* Missing boolean returns on DeletePetStats and SaveInspectMessage ([#4031](https://github.com/EQEmu/Server/pull/4031)) @joligario 2024-01-30
### Code
* Add Raid Loot Type Constants ([#4022](https://github.com/EQEmu/Server/pull/4022)) @Kinglykrab 2024-01-29
* Cleanup cross-zone/world-wide OPCode handling ([#4003](https://github.com/EQEmu/Server/pull/4003)) @Kinglykrab 2024-01-29
### Commands
* Cleanup #petitems Command ([#4005](https://github.com/EQEmu/Server/pull/4005)) @Kinglykrab 2024-01-29
### Crash Fix
* Fix Possible Crash in HateList::Find ([#4027](https://github.com/EQEmu/Server/pull/4027)) @Kinglykrab 2024-01-28
### Fixes
* Fix NPC After Death Emotes ([#4021](https://github.com/EQEmu/Server/pull/4021)) @Kinglykrab 2024-01-29
* Fix database loading routines ([#4030](https://github.com/EQEmu/Server/pull/4030)) @Akkadius 2024-01-29
* Fix issue in character_corpses Repository Query ([#4029](https://github.com/EQEmu/Server/pull/4029)) @Kinglykrab 2024-01-29
* Limit Pet Taunt Distance ([#4018](https://github.com/EQEmu/Server/pull/4018)) @fryguy503 2024-01-26
* Limit Player Taunt Distance ([#4019](https://github.com/EQEmu/Server/pull/4019)) @fryguy503 2024-01-26
* Patch for recent change to DEATH ([#4032](https://github.com/EQEmu/Server/pull/4032)) @noudess 2024-01-30
* spawn_conditions map was being emptied by mistake ([#4033](https://github.com/EQEmu/Server/pull/4033)) @noudess 2024-01-30
### Grids
* Convert Grid/Grid Entries to Repositories ([#4011](https://github.com/EQEmu/Server/pull/4011)) @Kinglykrab 2024-01-29
### Mercenaries
* Add expansion settings update to Mercs:Enable ([#4001](https://github.com/EQEmu/Server/pull/4001)) @Kinglykrab 2024-01-29
### Merchants
* Convert Merchant Load to Repositories ([#4007](https://github.com/EQEmu/Server/pull/4007)) @Kinglykrab 2024-01-29
### Pets
* Convert Load of Pets Beastlord Data to Repositories ([#3995](https://github.com/EQEmu/Server/pull/3995)) @Kinglykrab 2024-01-29
### Quests
* Use separate variable for quest idle override. ([#4026](https://github.com/EQEmu/Server/pull/4026)) @noudess 2024-01-27
### Rules
* Add rules for cross-zone/world-wide casts to affect Bots/Mercenaries/Pets ([#4002](https://github.com/EQEmu/Server/pull/4002)) @Kinglykrab 2024-01-29
### Spawn2
* Convert Spawn2 Methods to Repositories ([#4014](https://github.com/EQEmu/Server/pull/4014)) @Kinglykrab 2024-01-29
### Traps
* Convert Load/Set of Traps to Repositories ([#3994](https://github.com/EQEmu/Server/pull/3994)) @Kinglykrab 2024-01-29
### Zone
* Convert Fishing/Foraging to Repositories ([#4008](https://github.com/EQEmu/Server/pull/4008)) @Kinglykrab 2024-01-30
## [22.43.2] - 1/25/2024
### Bots
* ^mez command spell list fix ([#3998](https://github.com/EQEmu/Server/pull/3998)) @dariusuknuis 2024-01-19
### Code
* Cleanup position methods ([#4015](https://github.com/EQEmu/Server/pull/4015)) @Kinglykrab 2024-01-25
### Commands
* Add `#npcedit set_grid [Grid ID]` to `#npcedit` ([#4004](https://github.com/EQEmu/Server/pull/4004)) @Kinglykrab 2024-01-22
### Crash Fix
* Fix crash when creating Frogloks/Drakkin ([#4016](https://github.com/EQEmu/Server/pull/4016)) @Kinglykrab 2024-01-25
* Reverting PR #3877 ([#3997](https://github.com/EQEmu/Server/pull/3997)) @fryguy503 2024-01-17
### Database
* Drop deprecated item_tick table ([#3977](https://github.com/EQEmu/Server/pull/3977)) @Akkadius 2024-01-14
* Drop item_tick if exists tweak in manifest ([#3985](https://github.com/EQEmu/Server/pull/3985)) @Akkadius 2024-01-15
* Increase max spawngroup name from 50 to 200 ([#3991](https://github.com/EQEmu/Server/pull/3991)) @Akkadius 2024-01-22
### Fixes
* Fix Mercenaries Buffs/Zoning Issues ([#4000](https://github.com/EQEmu/Server/pull/4000)) @Kinglykrab 2024-01-22
* Fix zone database update manifest ([#3972](https://github.com/EQEmu/Server/pull/3972)) @Kinglykrab 2024-01-13
* Fixes to zone idle while empty changes. ([#4006](https://github.com/EQEmu/Server/pull/4006)) @noudess 2024-01-23
* Reversed logic on InLiquid ([#3979](https://github.com/EQEmu/Server/pull/3979)) @fryguy503 2024-01-14
### Instances
* Convert Instance Quest Methods to Repositories ([#4012](https://github.com/EQEmu/Server/pull/4012)) @Kinglykrab 2024-01-25
### Logging
* Force Info category to be always on in file/console logs ([#3990](https://github.com/EQEmu/Server/pull/3990)) @Akkadius 2024-01-22
### Merchants
* Change database structure for merchant slots ([#3974](https://github.com/EQEmu/Server/pull/3974)) @joligario 2024-01-14
### Messages
* Fix disciple message added by previous patch. ([#3986](https://github.com/EQEmu/Server/pull/3986)) @noudess 2024-01-15
### Quest API
* QuestReward should now summon item to the inventory instead of the cursor. ([#3996](https://github.com/EQEmu/Server/pull/3996)) @regneq 2024-01-22
### Repositories
* Add `rank` to reserved words ([#3982](https://github.com/EQEmu/Server/pull/3982)) @Akkadius 2024-01-15
* Fix datetime zero-value save behavior ([#3976](https://github.com/EQEmu/Server/pull/3976)) @Akkadius 2024-01-14
### Spawn2
* Spawn condition value should default spawn_conditions value ([#3980](https://github.com/EQEmu/Server/pull/3980)) @noudess 2024-01-14
### Zoning
* Additional logs for zoning under instance checks ([#3989](https://github.com/EQEmu/Server/pull/3989)) @Akkadius 2024-01-22
## [22.43.1] - 1/14/2024
### Repositories
* Revert #3976 - fix character corpses @Akkadius 2024-01-14
## [22.43.0] - 1/14/2024
### Database
* Drop deprecated item_tick table ([#3977](https://github.com/EQEmu/Server/pull/3977)) @Akkadius 2024-01-14
### Merchants
* Change database structure for merchant slots ([#3974](https://github.com/EQEmu/Server/pull/3974)) @joligario 2024-01-14
### Repositories
* Fix datetime zero-value save behavior ([#3976](https://github.com/EQEmu/Server/pull/3976)) @Akkadius 2024-01-14
### Zones
* Convert IDLE_WHEN_EMPTY to a Zone Column ([#3891](https://github.com/EQEmu/Server/pull/3891)) @Kinglykrab 2024-01-13
## [22.42.1] - 1/13/2024
### Fixes
* Fix zone database update manifest ([#3972](https://github.com/EQEmu/Server/pull/3972)) @Kinglykrab 2024-01-13
* quest::processmobswhilezoneempty() fix. ([#3971](https://github.com/EQEmu/Server/pull/3971)) @noudess 2024-01-13
## [22.42.0] - 1/13/2024
### AAs
* Convert Loading of AAs to Repositories ([#3963](https://github.com/EQEmu/Server/pull/3963)) @Kinglykrab 2024-01-13
### Auras
* Convert Get of Auras to Repositories ([#3964](https://github.com/EQEmu/Server/pull/3964)) @Kinglykrab 2024-01-13
### Character
* Character EXP Modifiers in Memory ([#3934](https://github.com/EQEmu/Server/pull/3934)) @Kinglykrab 2024-01-13
* Convert Character Corpses to Repositories ([#3941](https://github.com/EQEmu/Server/pull/3941)) @Kinglykrab 2024-01-13
* Convert Save of Character Languages to Repositories ([#3948](https://github.com/EQEmu/Server/pull/3948)) @Kinglykrab 2024-01-12
### Code
* Cleanup AddCash() and RemoveCash() NPC Methods ([#3957](https://github.com/EQEmu/Server/pull/3957)) @Kinglykrab 2024-01-12
* Cleanup ChangeSize() ([#3959](https://github.com/EQEmu/Server/pull/3959)) @Kinglykrab 2024-01-12
* Cleanup Owner Related Mob Methods ([#3960](https://github.com/EQEmu/Server/pull/3960)) @Kinglykrab 2024-01-13
* Cleanup RandomizeFeatures() ([#3958](https://github.com/EQEmu/Server/pull/3958)) @Kinglykrab 2024-01-12
* Remove GroupCount() and RaidGroupCount() ([#3943](https://github.com/EQEmu/Server/pull/3943)) @Kinglykrab 2024-01-13
* Remove unused Grid methods ([#3944](https://github.com/EQEmu/Server/pull/3944)) @Kinglykrab 2024-01-13
### Commands
* Convert NPC Spawn Methods to Repositories ([#3956](https://github.com/EQEmu/Server/pull/3956)) @Kinglykrab 2024-01-13
### Crash Fix
* Character Creation Class/Race out of Range. ([#3920](https://github.com/EQEmu/Server/pull/3920)) @fryguy503 2024-01-09
### Feat
* Alt Sinister Strike Formula ([#3921](https://github.com/EQEmu/Server/pull/3921)) @fryguy503 2024-01-09
### Feature
* Add Lore Item Trade Error ([#3932](https://github.com/EQEmu/Server/pull/3932)) @fryguy503 2024-01-13
* Rule: UseLiveBlockedMessage Bard Spam ([#3933](https://github.com/EQEmu/Server/pull/3933)) @fryguy503 2024-01-09
### Fixes
* Attack Corpse Skill Up Fix ([#3924](https://github.com/EQEmu/Server/pull/3924)) @fryguy503 2024-01-09
* Fix Issue with SetFlyMode() ([#3961](https://github.com/EQEmu/Server/pull/3961)) @Kinglykrab 2024-01-12
* Harm Touch Critical Ratio ([#3915](https://github.com/EQEmu/Server/pull/3915)) @fryguy503 2024-01-09
* Increase Precision in CheckDoubleAttack ([#3928](https://github.com/EQEmu/Server/pull/3928)) @fryguy503 2024-01-09
* IsOfClientBotMerc() for Discipline Messages ([#3940](https://github.com/EQEmu/Server/pull/3940)) @fryguy503 2024-01-09
* Limit MeleeMitigationEffect to defender if only client. ([#3918](https://github.com/EQEmu/Server/pull/3918)) @fryguy503 2024-01-09
* Rampage Number of Hits Limit ([#3929](https://github.com/EQEmu/Server/pull/3929)) @fryguy503 2024-01-09
* Remove duplicate character_data repository in zonedb.cpp ([#3935](https://github.com/EQEmu/Server/pull/3935)) @Kinglykrab 2024-01-09
* Undead Should Never Flee ([#3926](https://github.com/EQEmu/Server/pull/3926)) @fryguy503 2024-01-09
### Global Loot
* Convert Global Loot to Repositories ([#3962](https://github.com/EQEmu/Server/pull/3962)) @Kinglykrab 2024-01-13
### Ground Spawns
* Convert Ground Spawns to Repositories ([#3967](https://github.com/EQEmu/Server/pull/3967)) @Kinglykrab 2024-01-13
### Horses
* Convert Horses to Repositories ([#3965](https://github.com/EQEmu/Server/pull/3965)) @Kinglykrab 2024-01-13
### Item Ticks
* Remove Item Ticks Code ([#3955](https://github.com/EQEmu/Server/pull/3955)) @Kinglykrab 2024-01-13
### Mercenaries
* Convert Mercenaries to Repositories ([#3947](https://github.com/EQEmu/Server/pull/3947)) @Kinglykrab 2024-01-13
### Merchants
* Convert Clear/Delete/Save of Temporary Merchant Lists to Repositories ([#3945](https://github.com/EQEmu/Server/pull/3945)) @Kinglykrab 2024-01-13
### NPCs
* Convert Load of NPC Emotes to Repositories ([#3954](https://github.com/EQEmu/Server/pull/3954)) @Kinglykrab 2024-01-13
### Objects
* Convert Add/Delete/Update of Objects to Repositories ([#3966](https://github.com/EQEmu/Server/pull/3966)) @Kinglykrab 2024-01-13
* Convert World Containers to Repositories ([#3951](https://github.com/EQEmu/Server/pull/3951)) @Kinglykrab 2024-01-13
### Pets
* Convert Pets to Repositories ([#3968](https://github.com/EQEmu/Server/pull/3968)) @Kinglykrab 2024-01-13
### Repositories
* Add null integer column support, instance_list notes migration, regenerate repositories ([#3969](https://github.com/EQEmu/Server/pull/3969)) @Akkadius 2024-01-13
### Respawns
* Convert Respawn Times to Repositories ([#3949](https://github.com/EQEmu/Server/pull/3949)) @Kinglykrab 2024-01-13
### Rules
* Add rule for bard aggro cap ([#3909](https://github.com/EQEmu/Server/pull/3909)) @fryguy503 2024-01-09
* Allow GMs to silently summon ([#3910](https://github.com/EQEmu/Server/pull/3910)) @fryguy503 2024-01-09
* Bash Two Hander use Shoulders ([#3925](https://github.com/EQEmu/Server/pull/3925)) @fryguy503 2024-01-09
* Classic Spell Data SPA Calc variability ([#3931](https://github.com/EQEmu/Server/pull/3931)) @fryguy503 2024-01-09
* Classic Tracking Skillups ([#3923](https://github.com/EQEmu/Server/pull/3923)) @fryguy503 2024-01-09
* Separate Tradeskill Max Train from Research. ([#3916](https://github.com/EQEmu/Server/pull/3916)) @fryguy503 2024-01-09
### Tasks
* Add Support for Task Window Element Groups ([#3902](https://github.com/EQEmu/Server/pull/3902)) @hgtw 2024-01-09
### Traps
* Convert Load of LDoN Traps/Trap Entries to Repositories ([#3953](https://github.com/EQEmu/Server/pull/3953)) @Kinglykrab 2024-01-13
### Zones
* Convert Get/Set of Zone Timezone to Repositories ([#3946](https://github.com/EQEmu/Server/pull/3946)) @Kinglykrab 2024-01-13
* Convert IDLE_WHEN_EMPTY to a Zone Column ([#3891](https://github.com/EQEmu/Server/pull/3891)) @Kinglykrab 2024-01-13
* Convert SaveZoneCFG to Repositories ([#3950](https://github.com/EQEmu/Server/pull/3950)) @Kinglykrab 2024-01-13
## [22.41.0] - 1/8/2024
### Bug
+29 -32
View File
@@ -27,6 +27,8 @@
#include "../../common/content/world_content_service.h"
#include "../../common/zone_store.h"
#include "../../common/path_manager.h"
#include "../../common/repositories/base_data_repository.h"
#include "../../common/file.h"
EQEmuLogSys LogSys;
WorldContentService content_service;
@@ -255,50 +257,45 @@ void ImportSkillCaps(SharedDatabase *db) {
fclose(f);
}
void ImportBaseData(SharedDatabase *db) {
void ImportBaseData(SharedDatabase *db)
{
LogInfo("Importing Base Data");
std::string file = fmt::format("{}/import/BaseData.txt", path.GetServerPath());
FILE *f = fopen(file.c_str(), "r");
if(!f) {
LogError("Unable to open {} to read, skipping.", file);
return;
const std::string& file_name = fmt::format("{}/import/BaseData.txt", path.GetServerPath());
const auto& file_contents = File::GetContents(file_name);
if (!file_contents.error.empty()) {
LogError("{}", file_contents.error);
}
std::string delete_sql = "DELETE FROM base_data";
db->QueryDatabase(delete_sql);
db->QueryDatabase("DELETE FROM base_data");
char buffer[2048];
while(fgets(buffer, 2048, f)) {
auto split = Strings::Split(buffer, '^');
std::vector<BaseDataRepository::BaseData> v;
if(split.size() < 10) {
auto e = BaseDataRepository::NewEntity();
for (const auto& line: Strings::Split(file_contents.contents, "\n")) {
const auto& line_data = Strings::Split(line, '^');
if (line_data.size() < 10) {
continue;
}
std::string sql;
int level, class_id;
double hp, mana, end, unk1, unk2, hp_fac, mana_fac, end_fac;
e.level = static_cast<uint8_t>(Strings::ToUnsignedInt(line_data[0]));
e.class_ = static_cast<uint8_t>(Strings::ToUnsignedInt(line_data[1]));
e.hp = Strings::ToFloat(line_data[2]);
e.mana = Strings::ToFloat(line_data[3]);
e.end = Strings::ToFloat(line_data[4]);
e.hp_regen = Strings::ToFloat(line_data[5]);
e.end_regen = Strings::ToFloat(line_data[6]);
e.hp_fac = Strings::ToFloat(line_data[7]);
e.mana_fac = Strings::ToFloat(line_data[8]);
e.end_fac = Strings::ToFloat(line_data[9]);
level = Strings::ToInt(split[0].c_str());
class_id = Strings::ToInt(split[1].c_str());
hp = Strings::ToFloat(split[2].c_str());
mana = Strings::ToFloat(split[3].c_str());
end = Strings::ToFloat(split[4].c_str());
unk1 = Strings::ToFloat(split[5].c_str());
unk2 = Strings::ToFloat(split[6].c_str());
hp_fac = Strings::ToFloat(split[7].c_str());
mana_fac = Strings::ToFloat(split[8].c_str());
end_fac = Strings::ToFloat(split[9].c_str());
sql = StringFormat("INSERT INTO base_data(level, class, hp, mana, end, unk1, unk2, hp_fac, "
"mana_fac, end_fac) VALUES(%d, %d, %f, %f, %f, %f, %f, %f, %f, %f)",
level, class_id, hp, mana, end, unk1, unk2, hp_fac, mana_fac, end_fac);
db->QueryDatabase(sql);
v.emplace_back(e);
}
fclose(f);
BaseDataRepository::InsertMany(*db, v);
}
void ImportDBStrings(SharedDatabase *db) {
+7 -4
View File
@@ -222,6 +222,9 @@ SET(repositories
repositories/base/base_group_leaders_repository.h
repositories/base/base_guilds_repository.h
repositories/base/base_guild_ranks_repository.h
repositories/base/base_guild_permissions_repository.h
repositories/base/base_guild_members_repository.h
repositories/base/base_guild_bank_repository.h
repositories/base/base_guild_relations_repository.h
repositories/base/base_horses_repository.h
repositories/base/base_instance_list_repository.h
@@ -230,7 +233,6 @@ SET(repositories
repositories/base/base_inventory_snapshots_repository.h
repositories/base/base_ip_exemptions_repository.h
repositories/base/base_items_repository.h
repositories/base/base_item_tick_repository.h
repositories/base/base_ldon_trap_entries_repository.h
repositories/base/base_ldon_trap_templates_repository.h
repositories/base/base_level_exp_mods_repository.h
@@ -400,6 +402,9 @@ SET(repositories
repositories/group_leaders_repository.h
repositories/guilds_repository.h
repositories/guild_ranks_repository.h
repositories/guild_permissions_repository.h
repositories/guild_members_repository.h
repositories/guild_bank_repository.h
repositories/guild_relations_repository.h
repositories/horses_repository.h
repositories/instance_list_repository.h
@@ -408,7 +413,6 @@ SET(repositories
repositories/inventory_snapshots_repository.h
repositories/ip_exemptions_repository.h
repositories/items_repository.h
repositories/item_tick_repository.h
repositories/ldon_trap_entries_repository.h
repositories/ldon_trap_templates_repository.h
repositories/level_exp_mods_repository.h
@@ -493,7 +497,6 @@ SET(repositories
SET(common_headers
additive_lagged_fibonacci_engine.h
base_packet.h
base_data.h
bodytypes.h
classes.h
compression.h
@@ -563,7 +566,7 @@ SET(common_headers
json_config.h
light_source.h
linked_list.h
loottable.h
loot.h
mail_oplist.h
md5.h
memory_buffer.h
-34
View File
@@ -1,34 +0,0 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2013 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef __EQEMU_COMMON_BASE_DATA_H
#define __EQEMU_COMMON_BASE_DATA_H
struct BaseDataStruct
{
double base_hp;
double base_mana;
double base_end;
double hp_regen;
double end_regen;
double hp_factor;
double mana_factor;
double endurance_factor;
};
#endif
+2
View File
@@ -64,4 +64,6 @@ typedef enum {
} bodyType;
/* bodytypes above 64 make the mob not show up */
constexpr int format_as(bodyType type) { return static_cast<int>(type); }
#endif
-1
View File
@@ -22,7 +22,6 @@
#include "../database.h"
#include "../rulesys.h"
#include "../eqemu_logsys.h"
#include "../loottable.h"
#include "../repositories/content_flags_repository.h"
+7 -1
View File
@@ -23,11 +23,17 @@
#include <string>
#include <vector>
#include "../loottable.h"
#include "../repositories/content_flags_repository.h"
class Database;
struct ContentFlags {
int16 min_expansion;
int16 max_expansion;
std::string content_flags;
std::string content_flags_disabled;
};
namespace Expansion {
static const int EXPANSION_ALL = -1;
static const int EXPANSION_FILTER_MAX = 99;
+1 -1
View File
@@ -23,7 +23,7 @@ void SendCrashReport(const std::string &crash_report)
{
// can configure multiple endpoints if need be
std::vector<std::string> endpoints = {
"http://spire.akkadius.com/api/v1/analytics/server-crash-report",
"https://spire.akkadius.com/api/v1/analytics/server-crash-report",
// "http://localhost:3010/api/v1/analytics/server-crash-report", // development
};
+4 -2
View File
@@ -54,6 +54,7 @@
#include "repositories/zone_repository.h"
#include "zone_store.h"
#include "repositories/merchantlist_temp_repository.h"
extern Client client;
@@ -1221,8 +1222,9 @@ void Database::GetAccountFromID(uint32 id, char* oAccountName, int16* oStatus) {
*oStatus = Strings::ToInt(row[1]);
}
void Database::ClearMerchantTemp(){
QueryDatabase("DELETE FROM merchantlist_temp");
void Database::ClearMerchantTemp()
{
MerchantlistTempRepository::ClearTemporaryMerchantLists(*this);
}
bool Database::UpdateName(const char* oldname, const char* newname) {
+1
View File
@@ -166,6 +166,7 @@ public:
void GetCharactersInInstance(uint16 instance_id, std::list<uint32> &character_ids);
void PurgeExpiredInstances();
void SetInstanceDuration(uint16 instance_id, uint32 new_duration);
void CleanupInstanceCorpses();
/* Adventure related. */
+204 -2
View File
@@ -4844,7 +4844,7 @@ UPDATE data_buckets SET bot_id = SUBSTRING_INDEX(SUBSTRING_INDEX( `key`, '-', 2
ADD COLUMN `marked_npc_3_zone_id` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `marked_npc_3_entity_id`,
ADD COLUMN `marked_npc_3_instance_id` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `marked_npc_3_zone_id`;
)"
},
},
ManifestEntry{
.version = 9235,
.description = "2023_07_31_character_stats_record.sql",
@@ -5162,8 +5162,210 @@ ALTER TABLE `tasks`
ADD COLUMN `enabled` smallint NULL DEFAULT 1 AFTER `faction_amount`
)",
.content_schema_update = true
}
},
ManifestEntry{
.version = 9250,
.description = "2023_01_06_task_activities_list_group.sql",
.check = "SHOW COLUMNS FROM `task_activities` LIKE 'list_group'",
.condition = "empty",
.match = "",
.sql = R"(
ALTER TABLE `task_activities`
ADD COLUMN `list_group` TINYINT UNSIGNED NOT NULL DEFAULT '0' AFTER `optional`;
)",
.content_schema_update = true
},
ManifestEntry{
.version = 9251,
.description = "2023_01_12_instance_list_notes.sql",
.check = "SHOW COLUMNS FROM `instance_list` LIKE 'notes'",
.condition = "empty",
.match = "",
.sql = R"(
ALTER TABLE `instance_list`
ADD COLUMN `notes` varchar(50) NOT NULL DEFAULT '' AFTER `never_expires`;
)",
},
ManifestEntry{
.version = 9252,
.description = "2024_01_07_zone_idle_when_empty.sql",
.check = "SHOW COLUMNS FROM `zone` LIKE 'idle_when_empty'",
.condition = "empty",
.match = "",
.sql = R"(
ALTER TABLE `zone`
ADD COLUMN `idle_when_empty` tinyint(1) UNSIGNED NOT NULL DEFAULT 1 AFTER `min_lava_damage`,
ADD COLUMN `seconds_before_idle` int(11) UNSIGNED NOT NULL DEFAULT 60 AFTER `idle_when_empty`;
)",
.content_schema_update = true
},
ManifestEntry{
.version = 9253,
.description = "2024_01_13_merchantlist_slot.sql",
.check = "SHOW COLUMNS FROM `merchantlist` LIKE 'slot'",
.condition = "missing",
.match = "unsigned",
.sql = R"(
ALTER TABLE `merchantlist`
MODIFY COLUMN `slot` int(11) UNSIGNED NOT NULL DEFAULT 0
)",
.content_schema_update = true
},
ManifestEntry{
.version = 9254,
.description = "2024_01_13_merchantlist_temp_slot.sql",
.check = "SHOW COLUMNS FROM `merchantlist_temp` LIKE 'slot'",
.condition = "contains",
.match = "tinyint",
.sql = R"(
ALTER TABLE `merchantlist_temp`
MODIFY COLUMN `slot` int(11) UNSIGNED NOT NULL DEFAULT 0
)"
},
ManifestEntry{
.version = 9255,
.description = "2024_01_13_drop_item_tick_deprecated.sql",
.check = "show tables like 'item_tick'",
.condition = "not_empty",
.match = "",
.sql = R"(
DROP TABLE IF EXISTS item_tick
)"
},
ManifestEntry{
.version = 9256,
.description = "2024_01_16_increase_spawngroup_size.sql",
.check = "SHOW COLUMNS FROM `spawngroup` LIKE 'name'",
.condition = "contains",
.match = "varchar(50)",
.sql = R"(
ALTER TABLE `spawngroup`
MODIFY COLUMN `name` varchar(200) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL DEFAULT '' AFTER `id`;
)",
.content_schema_update = true
},
ManifestEntry{
.version = 9257,
.description = "2024_01_16_ground_spawns_fix_z.sql",
.check = "SHOW COLUMNS FROM `ground_spawns` LIKE `fix_z`",
.condition = "empty",
.match = "",
.sql = R"(
ALTER TABLE `ground_spawns`
ADD COLUMN `fix_z` tinyint(1) UNSIGNED NOT NULL DEFAULT 1 AFTER `respawn_timer`;
)",
.content_schema_update = true
},
ManifestEntry{
.version = 9258,
.description = "2024_02_04_base_data.sql",
.check = "SHOW COLUMNS FROM `base_data` LIKE `hp_regen`",
.condition = "empty",
.match = "",
.sql = R"(
ALTER TABLE `base_data`
CHANGE COLUMN `unk1` `hp_regen` double NOT NULL AFTER `end`,
CHANGE COLUMN `unk2` `end_regen` double NOT NULL AFTER `hp_regen`,
MODIFY COLUMN `level` tinyint(3) UNSIGNED NOT NULL FIRST,
MODIFY COLUMN `class` tinyint(2) UNSIGNED NOT NULL AFTER `level`;
)",
.content_schema_update = true
},
ManifestEntry{
.version = 9259,
.description = "2024_01_13_corpse_rez_overhaul.sql",
.check = "SHOW COLUMNS FROM `character_corpses` LIKE 'rez_time'",
.condition = "empty",
.match = "",
.sql = R"(
ALTER TABLE `character_corpses`
ADD COLUMN `rez_time` int(11) UNSIGNED NOT NULL DEFAULT 0 AFTER `wc_9`,
ADD COLUMN `gm_exp` int(11) UNSIGNED NOT NULL DEFAULT 0 AFTER `rez_time`,
ADD COLUMN `killed_by` int(11) UNSIGNED NOT NULL DEFAULT 0 AFTER `gm_exp`,
ADD COLUMN `rezzable` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 AFTER `killed_by`;
)"
},
ManifestEntry{
.version = 9260,
.description = "2023_11_11_guild_features.sql",
.check = "SHOW TABLES LIKE 'guild_permissions'",
.condition = "empty",
.match = "",
.sql = R"(
CREATE TABLE `guild_permissions` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`perm_id` INT(11) NOT NULL DEFAULT '0',
`guild_id` INT(11) NOT NULL DEFAULT '0',
`permission` INT(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `perm_id_guild_id` (`perm_id`, `guild_id`) USING BTREE
)
ENGINE=InnoDB
AUTO_INCREMENT=1;
UPDATE guild_ranks SET title = 'Leader' WHERE `rank` = '1';
UPDATE guild_ranks SET title = 'Senior Officer' WHERE `rank` = '2';
UPDATE guild_ranks SET title = 'Officer' WHERE `rank` = '3';
UPDATE guild_ranks SET title = 'Senior Member' WHERE `rank` = '4';
UPDATE guild_ranks SET title = 'Member' WHERE `rank` = '5';
UPDATE guild_ranks SET title = 'Junior Member' WHERE `rank` = '6';
UPDATE guild_ranks SET title = 'Initiate' WHERE `rank` = '7';
UPDATE guild_ranks SET title = 'Recruit' WHERE `rank` = '8';
DELETE FROM guild_ranks WHERE `rank` = 0;
ALTER TABLE `guild_ranks`
DROP COLUMN `can_hear`,
DROP COLUMN `can_speak`,
DROP COLUMN `can_invite`,
DROP COLUMN `can_remove`,
DROP COLUMN `can_promote`,
DROP COLUMN `can_demote`,
DROP COLUMN `can_motd`,
DROP COLUMN `can_warpeace`;
UPDATE guild_members SET `rank` = '5' WHERE `rank` = '0';
UPDATE guild_members SET `rank` = '3' WHERE `rank` = '1';
UPDATE guild_members SET `rank` = '1' WHERE `rank` = '2';
ALTER TABLE `guild_members`
ADD COLUMN `online` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `alt`;
ALTER TABLE `guilds`
ADD COLUMN `favor` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `url`;
CREATE TABLE guild_tributes (
guild_id int(11) unsigned NOT NULL DEFAULT 0,
tribute_id_1 int(11) unsigned NOT NULL DEFAULT 0,
tribute_id_1_tier int(11) unsigned NOT NULL DEFAULT 0,
tribute_id_2 int(11) unsigned NOT NULL DEFAULT 0,
tribute_id_2_tier int(11) unsigned NOT NULL DEFAULT 0,
time_remaining int(11) unsigned NOT NULL DEFAULT 0,
enabled int(11) unsigned NOT NULL DEFAULT 0,
PRIMARY KEY (guild_id) USING BTREE
) ENGINE=InnoDB;
)"
},
ManifestEntry{
.version = 9261,
.description = "2024_02_11_character_corpses.sql",
.check = "SHOW COLUMNS FROM `character_corpses` LIKE 'time_of_death'",
.condition = "contains",
.match = "0000-00-00 00:00:00",
.sql = R"(
ALTER TABLE `character_corpses` MODIFY COLUMN `time_of_death` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP;
)"
},
ManifestEntry{
.version = 9262,
.description = "2024_02_11_object_contents.sql",
.check = "SHOW COLUMNS FROM `object_contents` LIKE 'droptime'",
.condition = "contains",
.match = "0000-00-00 00:00:00",
.sql = R"(
ALTER TABLE `object_contents` MODIFY COLUMN `droptime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP;
)"
}
// -- template; copy/paste this when you need to create a new entry
// ManifestEntry{
// .version = 9228,
@@ -104,6 +104,25 @@ ALTER TABLE `bot_timers`
DROP PRIMARY KEY;
ALTER TABLE `bot_timers`
ADD PRIMARY KEY (`bot_id`, `timer_id`, `spell_id`, `item_id`);
)"
},
ManifestEntry{
.version = 9042,
.description = "2024_01_27_delete_bot_foreign_keys.sql",
.check = "SHOW CREATE TABLE `bot_stances`",
.condition = "contains",
.match = "FOREIGN",
.sql = R"(
ALTER TABLE `bot_buffs` DROP FOREIGN KEY `FK_bot_buffs_1`;
ALTER TABLE `bot_heal_rotations` DROP FOREIGN KEY `FK_bot_heal_rotations`;
ALTER TABLE `bot_heal_rotation_members` DROP FOREIGN KEY `FK_bot_heal_rotation_members_1`;
ALTER TABLE `bot_heal_rotation_members` DROP FOREIGN KEY `FK_bot_heal_rotation_members_2`;
ALTER TABLE `bot_heal_rotation_targets` DROP FOREIGN KEY `FK_bot_heal_rotation_targets`;
ALTER TABLE `bot_inventories` DROP FOREIGN KEY `FK_bot_inventories_1`;
ALTER TABLE `bot_pets` DROP FOREIGN KEY `FK_bot_pets_1`;
ALTER TABLE `bot_pet_buffs` DROP FOREIGN KEY `FK_bot_pet_buffs_1`;
ALTER TABLE `bot_pet_inventories` DROP FOREIGN KEY `FK_bot_pet_inventories_1`;
ALTER TABLE `bot_stances` DROP FOREIGN KEY `FK_bot_stances_1`;
)"
}
// -- template; copy/paste this when you need to create a new entry
+20
View File
@@ -570,3 +570,23 @@ void Database::SetInstanceDuration(uint16 instance_id, uint32 new_duration)
InstanceListRepository::UpdateOne(*this, i);
}
void Database::CleanupInstanceCorpses() {
auto l = InstanceListRepository::GetWhere(
*this,
"never_expires = 0"
);
if (l.empty()) {
return;
}
std::vector<std::string> instance_ids;
for (const auto& e : l) {
instance_ids.emplace_back(std::to_string(e.id));
}
const auto imploded_instance_ids = Strings::Implode(",", instance_ids);
CharacterCorpsesRepository::BuryInstances(*this, imploded_instance_ids);
}
+1
View File
@@ -148,6 +148,7 @@ namespace DatabaseSchema {
"guild_members",
"guild_ranks",
"guild_relations",
"guild_tributes",
"guilds",
"instance_list_player",
"inventory",
+2
View File
@@ -71,6 +71,8 @@ namespace EQ
bit_DeityAll = UINT32_MAX
};
constexpr int format_as(DeityType type) { return static_cast<int>(type); }
extern DeityTypeBit GetDeityBitmask(DeityType deity_type);
extern std::string GetDeityName(DeityType deity_type);
extern const std::map<DeityType, std::string>& GetDeityMap();
+75 -1
View File
@@ -562,6 +562,7 @@ std::string EQ::constants::GetEmoteEventTypeName(uint8 emote_event_type)
const std::map<uint8, std::string> &EQ::constants::GetEmoteTypeMap()
{
static const std::map<uint8, std::string> emote_type_map = {
{ EmoteTypes::Say, "Say" },
{ EmoteTypes::Emote, "Emote" },
{ EmoteTypes::Shout, "Shout" },
{ EmoteTypes::Proximity, "Proximity" }
@@ -572,7 +573,7 @@ const std::map<uint8, std::string> &EQ::constants::GetEmoteTypeMap()
std::string EQ::constants::GetEmoteTypeName(uint8 emote_type)
{
if (!EQ::ValueWithin(emote_type, EmoteTypes::Emote, EmoteTypes::Proximity)) {
if (!EQ::ValueWithin(emote_type, EmoteTypes::Say, EmoteTypes::Proximity)) {
return std::string();
}
@@ -638,3 +639,76 @@ std::string EQ::constants::GetAppearanceTypeName(uint32 appearance_type)
return std::string();
}
const std::map<uint32, std::string>& EQ::constants::GetSpecialAbilityMap()
{
static const std::map<uint32, std::string> special_ability_map = {
{ SPECATK_SUMMON, "Summon" },
{ SPECATK_ENRAGE, "Enrage" },
{ SPECATK_RAMPAGE, "Rampage" },
{ SPECATK_AREA_RAMPAGE, "Area Rampage" },
{ SPECATK_FLURRY, "Flurry" },
{ SPECATK_TRIPLE, "Triple Attack" },
{ SPECATK_QUAD, "Quadruple Attack" },
{ SPECATK_INNATE_DW, "Dual Wield" },
{ SPECATK_BANE, "Bane Attack" },
{ SPECATK_MAGICAL, "Magical Attack" },
{ SPECATK_RANGED_ATK, "Ranged Attack" },
{ UNSLOWABLE, "Immune to Slow" },
{ UNMEZABLE, "Immune to Mesmerize" },
{ UNCHARMABLE, "Immune to Charm" },
{ UNSTUNABLE, "Immune to Stun" },
{ UNSNAREABLE, "Immune to Snare" },
{ UNFEARABLE, "Immune to Fear" },
{ UNDISPELLABLE, "Immune to Dispell" },
{ IMMUNE_MELEE, "Immune to Melee" },
{ IMMUNE_MAGIC, "Immune to Magic" },
{ IMMUNE_FLEEING, "Immune to Fleeing" },
{ IMMUNE_MELEE_EXCEPT_BANE, "Immune to Melee except Bane" },
{ IMMUNE_MELEE_NONMAGICAL, "Immune to Non-Magical Melee" },
{ IMMUNE_AGGRO, "Immune to Aggro" },
{ IMMUNE_AGGRO_ON, "Immune to Being Aggro" },
{ IMMUNE_CASTING_FROM_RANGE, "Immune to Ranged Spells" },
{ IMMUNE_FEIGN_DEATH, "Immune to Feign Death" },
{ IMMUNE_TAUNT, "Immune to Taunt" },
{ NPC_TUNNELVISION, "Tunnel Vision" },
{ NPC_NO_BUFFHEAL_FRIENDS, "Does Not Heal of Buff Allies" },
{ IMMUNE_PACIFY, "Immune to Pacify" },
{ LEASH, "Leashed" },
{ TETHER, "Tethered" },
{ DESTRUCTIBLE_OBJECT, "Destructible Object" },
{ NO_HARM_FROM_CLIENT, "Immune to Harm from Client" },
{ ALWAYS_FLEE, "Always Flees" },
{ FLEE_PERCENT, "Flee Percentage" },
{ ALLOW_BENEFICIAL, "Allows Beneficial Spells" },
{ DISABLE_MELEE, "Melee is Disabled" },
{ NPC_CHASE_DISTANCE, "Chase Distance" },
{ ALLOW_TO_TANK, "Allowed to Tank" },
{ IGNORE_ROOT_AGGRO_RULES, "Ignores Root Aggro" },
{ CASTING_RESIST_DIFF, "Casting Resist Difficulty" },
{ COUNTER_AVOID_DAMAGE, "Counter Damage Avoidance" },
{ PROX_AGGRO, "Proximity Aggro" },
{ IMMUNE_RANGED_ATTACKS, "Immune to Ranged Attacks" },
{ IMMUNE_DAMAGE_CLIENT, "Immune to Client Damage" },
{ IMMUNE_DAMAGE_NPC, "Immune to NPC Damage" },
{ IMMUNE_AGGRO_CLIENT, "Immune to Client Aggro" },
{ IMMUNE_AGGRO_NPC, "Immune to NPC Aggro" },
{ MODIFY_AVOID_DAMAGE, "Modify Damage Avoidance" },
{ IMMUNE_FADING_MEMORIES, "Immune to Memory Fades" },
{ IMMUNE_OPEN, "Immune to Open" },
{ IMMUNE_ASSASSINATE, "Immune to Assassinate" },
{ IMMUNE_HEADSHOT, "Immune to Headshot" },
};
return special_ability_map;
}
std::string EQ::constants::GetSpecialAbilityName(uint32 ability_id)
{
const auto& a = EQ::constants::GetSpecialAbilityMap().find(ability_id);
if (a != EQ::constants::GetSpecialAbilityMap().end()) {
return a->second;
}
return std::string();
}
+63
View File
@@ -350,6 +350,7 @@ namespace EQ
};
enum EmoteTypes : uint8 {
Say,
Emote,
Shout,
Proximity
@@ -400,6 +401,9 @@ namespace EQ
extern const std::map<uint32, std::string>& GetAppearanceTypeMap();
std::string GetAppearanceTypeName(uint32 animation_type);
extern const std::map<uint32, std::string>& GetSpecialAbilityMap();
std::string GetSpecialAbilityName(uint32 ability_id);
const int STANCE_TYPE_FIRST = stancePassive;
const int STANCE_TYPE_LAST = stanceBurnAE;
const int STANCE_TYPE_COUNT = stanceBurnAE;
@@ -596,6 +600,65 @@ enum class ApplySpellType {
Raid
};
enum {
SPECATK_SUMMON = 1,
SPECATK_ENRAGE = 2,
SPECATK_RAMPAGE = 3,
SPECATK_AREA_RAMPAGE = 4,
SPECATK_FLURRY = 5,
SPECATK_TRIPLE = 6,
SPECATK_QUAD = 7,
SPECATK_INNATE_DW = 8,
SPECATK_BANE = 9,
SPECATK_MAGICAL = 10,
SPECATK_RANGED_ATK = 11,
UNSLOWABLE = 12,
UNMEZABLE = 13,
UNCHARMABLE = 14,
UNSTUNABLE = 15,
UNSNAREABLE = 16,
UNFEARABLE = 17,
UNDISPELLABLE = 18,
IMMUNE_MELEE = 19,
IMMUNE_MAGIC = 20,
IMMUNE_FLEEING = 21,
IMMUNE_MELEE_EXCEPT_BANE = 22,
IMMUNE_MELEE_NONMAGICAL = 23,
IMMUNE_AGGRO = 24,
IMMUNE_AGGRO_ON = 25,
IMMUNE_CASTING_FROM_RANGE = 26,
IMMUNE_FEIGN_DEATH = 27,
IMMUNE_TAUNT = 28,
NPC_TUNNELVISION = 29,
NPC_NO_BUFFHEAL_FRIENDS = 30,
IMMUNE_PACIFY = 31,
LEASH = 32,
TETHER = 33,
DESTRUCTIBLE_OBJECT = 34,
NO_HARM_FROM_CLIENT = 35,
ALWAYS_FLEE = 36,
FLEE_PERCENT = 37,
ALLOW_BENEFICIAL = 38,
DISABLE_MELEE = 39,
NPC_CHASE_DISTANCE = 40,
ALLOW_TO_TANK = 41,
IGNORE_ROOT_AGGRO_RULES = 42,
CASTING_RESIST_DIFF = 43,
COUNTER_AVOID_DAMAGE = 44, // Modify by percent NPC's opponents chance to riposte, block, parry or dodge individually, or for all skills
PROX_AGGRO = 45,
IMMUNE_RANGED_ATTACKS = 46,
IMMUNE_DAMAGE_CLIENT = 47,
IMMUNE_DAMAGE_NPC = 48,
IMMUNE_AGGRO_CLIENT = 49,
IMMUNE_AGGRO_NPC = 50,
MODIFY_AVOID_DAMAGE = 51, // Modify by percent the NPCs chance to riposte, block, parry or dodge individually, or for all skills
IMMUNE_FADING_MEMORIES = 52,
IMMUNE_OPEN = 53,
IMMUNE_ASSASSINATE = 54,
IMMUNE_HEADSHOT = 55,
MAX_SPECIAL_ATTACK = 56
};
namespace HeroicBonusBucket
{
+1
View File
@@ -45,6 +45,7 @@ typedef enum { //EQEmu internal opcodes list
_maxEmuOpcode
} EmuOpcode;
constexpr int format_as(EmuOpcode opcode) { return static_cast<int>(opcode); }
extern const char *OpcodeNames[_maxEmuOpcode+1];
#endif
+21 -1
View File
@@ -228,6 +228,7 @@ N(OP_GuildBank),
N(OP_GuildBankItemList),
N(OP_GuildCreate),
N(OP_GuildDelete),
N(OP_GuildDeleteGuild),
N(OP_GuildDemote),
N(OP_GuildInvite),
N(OP_GuildInviteAccept),
@@ -239,15 +240,33 @@ N(OP_GuildManageStatus),
N(OP_GuildMemberLevelUpdate),
N(OP_GuildMemberList),
N(OP_GuildMemberUpdate),
N(OP_GuildMemberLevel),
N(OP_GuildMemberRankAltBanker),
N(OP_GuildMemberPublicNote),
N(OP_GuildMemberAdd),
N(OP_GuildMemberRename),
N(OP_GuildMemberDelete),
N(OP_GuildMemberDetails),
N(OP_GuildRenameGuild),
N(OP_GuildMOTD),
N(OP_GuildPeace),
N(OP_GuildPromote),
N(OP_GuildPublicNote),
N(OP_GuildRemove),
N(OP_GuildSelectTribute),
N(OP_GuildModifyBenefits),
N(OP_GuildTributeToggleReq),
N(OP_GuildTributeToggleReply),
N(OP_GuildOptInOut),
N(OP_GuildSaveActiveTributes),
N(OP_GuildSendActiveTributes),
N(OP_GuildTributeFavorAndTimer),
N(OP_GuildsList),
N(OP_GuildStatus),
N(OP_GuildTributeInfo),
N(OP_GuildUpdateURLAndChannel),
N(OP_GuildUpdate),
N(OP_GuildTributeDonateItem),
N(OP_GuildTributeDonatePlat),
N(OP_GuildWar),
N(OP_Heartbeat),
N(OP_Hide),
@@ -425,6 +444,7 @@ N(OP_ReqClientSpawn),
N(OP_ReqNewZone),
N(OP_RequestClientZoneChange),
N(OP_RequestDuel),
N(OP_RequestGuildTributes),
N(OP_RequestKnowledgeBase),
N(OP_RequestTitles),
N(OP_RespawnWindow),
+7
View File
@@ -1120,4 +1120,11 @@ enum MoneySubtypes
SharedBank // Platinum Only
};
namespace RaidLootType {
constexpr uint32 LeaderOnly = 1;
constexpr uint32 LeaderAndGroupLeadersOnly = 2;
constexpr uint32 LeaderSelected = 3;
constexpr uint32 EntireRaid = 4;
}
#endif /*COMMON_EQ_CONSTANTS_H*/
+304 -85
View File
@@ -314,6 +314,7 @@ union
uint32 DestructibleUnk9;
bool targetable_with_hotkey;
bool show_name;
bool guild_show;
};
struct PlayerState_Struct {
@@ -392,7 +393,7 @@ struct NewZone_Struct {
/*0724*/ uint32 underworld_teleport_index; // > 0 teleports w/ zone point index, invalid succors, if this value is 0, it prevents you from running off edges that would end up underworld
/*0728*/ uint32 lava_damage; // Seen 50
/*0732*/ uint32 min_lava_damage; // Seen 10
/*0736*/
/*0736*/ float safe_heading;
};
/*
@@ -631,6 +632,12 @@ struct ConsentResponse_Struct {
char zonename[32];
};
struct NameApproval_Struct {
char name[64];
uint32 race_id;
uint32 class_id;
};
/*
** Name Generator Struct
** Length: 72 bytes
@@ -1671,6 +1678,68 @@ struct GuildUpdate_Struct {
GuildsListEntry_Struct entry;
};
struct GuildMemberAdd_Struct {
/*000*/ uint32 guild_id;
/*004*/ uint32 unknown04;
/*008*/ uint32 unknown08;
/*012*/ uint32 unknown12;
/*016*/ uint32 level;
/*020*/ uint32 class_;
/*024*/ uint32 rank_;
/*028*/ uint32 guild_show;
/*032*/ uint32 zone_id;
/*036*/ uint32 last_on;
/*040*/ char player_name[64];
};
struct GuildMemberLevel_Struct {
/*000*/ uint32 guild_id;
/*004*/ char player_name[64];
/*068*/ uint32 level;
};
struct GuildMemberRank_Struct {
/*000*/ uint32 guild_id;
/*004*/ uint32 rank_;
/*008*/ char player_name[64];
/*072*/ uint32 alt_banker; //Banker/Alt bit 00 - none 10 - Alt 11 - Alt and Banker 01 - Banker. Banker not functional for RoF2+
/*076*/ uint32 offline;
};
struct GuildMemberPublicNote_Struct {
/*000*/ uint32 guild_id;
/*004*/ char player_name[64];
/*068*/ char public_note[256]; //RoF2 256
};
struct GuildDelete_Struct {
/*000*/ uint32 guild_id;
};
struct GuildRenameGuild_Struct {
/*000*/ uint32 guild_id;
/*004*/ char new_guild_name[64];
};
struct GuildRenameMember_Struct {
/*000*/ uint32 guild_id;
/*004*/ char player_name[64];
/*068*/ char new_player_name[64];
};
struct GuildMemberDetails_Struct {
/*000*/ uint32 guild_id;
/*004*/ char player_name[64];
/*068*/ uint32 zone_id;
/*072*/ uint32 last_on;
/*076*/ uint32 offline_mode; //1 Offline
};
struct GuildMemberDelete_Struct {
/*000*/ uint32 guild_id;
/*004*/ char player_name[64];
};
/*
** Money Loot
** Length: 22 Bytes
@@ -1719,10 +1788,10 @@ struct GuildJoin_Struct{
/*092*/
};
struct GuildInviteAccept_Struct {
char inviter[64];
char newmember[64];
char inviter[64];
char new_member[64];
uint32 response;
uint32 guildeqid;
uint32 guild_id;
};
struct GuildManageRemove_Struct {
uint32 guildeqid;
@@ -1754,6 +1823,14 @@ struct PopupResponse_Struct {
/*0004*/ uint32 popupid;
};
enum GuildInformationActions
{
GuildUpdateURL = 0,
GuildUpdateChannel = 1,
GuildUpdateRanks = 4,
GuildUpdatePermissions = 5
};
struct GuildManageBanker_Struct {
uint32 unknown0;
char myname[64];
@@ -1767,9 +1844,9 @@ struct GuildSetRank_Struct
{
/*00*/ uint32 Unknown00;
/*04*/ uint32 Unknown04;
/*08*/ uint32 Rank;
/*12*/ char MemberName[64];
/*76*/ uint32 Banker;
/*08*/ uint32 rank;
/*12*/ char member_name[64];
/*76*/ uint32 banker;
/*80*/
};
@@ -3327,6 +3404,7 @@ struct Internal_GuildMemberEntry_Struct {
// char public_note[1]; //variable length.
uint16 zoneinstance; //network byte order
uint16 zone_id; //network byte order
uint32 online;
};
struct Internal_GuildMembers_Struct { //just for display purposes, this is not actually used in the message encoding.
@@ -3353,7 +3431,42 @@ struct GuildUpdate_PublicNote{
uint32 unknown0;
char name[64];
char target[64];
char note[1]; //variable length.
char note[256];
};
struct GuildUpdateURLAndChannelStruct {
char text[512];
};
struct GuildUpdatePermissionsStruct {
uint32 rank; // the rank that is being changed
uint32 function_id; // the id of the guild function
uint32 value; // 1 is on, 0 is off
};
struct GuildUpdateRankNamesStruct {
uint32 rank; // the rank that is being updated
char rank_name[76]; // the rank name
};
struct GuildUpdateUCPStruct {
uint32 action; // 0 and 1 use url and channel payload. 5 uses permissions payload
char unknown[76];
union {
GuildUpdateURLAndChannelStruct url_channel;
GuildUpdatePermissionsStruct permissions;
GuildUpdateRankNamesStruct rank_name;
}payload;
};
struct GuildPermission_Struct
{
uint32 Action; // 5 = Update function permission
char Unknown0004[76]; // not used
uint32 rank; // the rank that is being changed
uint32 function_id; // the id of the guild function
uint32 value; // 1 is on, 0 is off
};
struct GuildUpdateURLAndChannel_Struct
@@ -3372,7 +3485,7 @@ struct GuildUpdateURLAndChannel_Struct
//The client sends this struct on changing a guild rank. The server sends each rank in 32 or less packets upon zonein if you are in a guild.
struct GuildUpdateRanks_Struct
{
/*0000*/ uint32 Action; // 0 = Update URL, 1 = Update Channel, 5 = RoF Ranks
/*0000*/ uint32 Action; // 0 = Update URL, 1 = Update Channel, 4 = Ranks 5 = Permissions
/*0004*/ uint32 Unknown0004; //Seen 00 00 00 00
/*0008*/ uint32 Unknown0008; //Seen 96 29 00 00
/*0008*/ char Unknown0012[64]; //Seen "CharacterName"
@@ -3394,6 +3507,7 @@ struct GuildStatus_Struct
struct GuildDemoteStruct{
char name[64];
char target[64];
uint32 rank;
};
struct GuildRemoveStruct{
@@ -3403,9 +3517,9 @@ struct GuildRemoveStruct{
uint32 leaderstatus; //?
};
struct GuildMakeLeader{
char name[64];
char target[64];
struct GuildMakeLeader_Struct{
char requestor[64];
char new_leader[64];
};
struct BugReport_Struct {
@@ -3445,20 +3559,23 @@ struct Make_Pet_Struct { //Simple struct for getting pet info
uint32 min_dmg;
uint32 max_dmg;
};
struct Ground_Spawn{
float max_x;
float max_y;
float min_x;
float min_y;
float max_z;
float heading;
char name[20];
uint32 item;
uint32 max_allowed;
uint32 respawntimer;
struct GroundSpawn {
float max_x = 0.0f;
float max_y = 0.0f;
float min_x = 0.0f;
float min_y = 0.0f;
float max_z = 0.0f;
float heading = 0.0f;
std::string name = std::string();
uint32 item_id = 0;
uint32 max_allowed = 1;
uint32 respawn_timer = 1;
bool fix_z = true;
};
struct Ground_Spawns {
struct Ground_Spawn spawn[50]; //Assigned max number to allow
struct GroundSpawns {
struct GroundSpawn spawn[50]; //Assigned max number to allow
};
//struct PetitionBug_Struct{
@@ -3496,66 +3613,193 @@ struct ZoneInSendName_Struct2 {
static const uint32 MAX_TRIBUTE_TIERS = 10;
struct StartTribute_Struct {
uint32 client_id;
uint32 tribute_master_id;
uint32 response;
uint32 client_id;
uint32 tribute_master_id;
uint32 response;
};
struct TributeLevel_Struct {
uint32 level; //backwards byte order!
uint32 tribute_item_id; //backwards byte order!
uint32 cost; //backwards byte order!
uint32 level; //backwards byte order!
uint32 tribute_item_id; //backwards byte order!
uint32 cost; //backwards byte order!
};
struct TributeAbility_Struct {
uint32 tribute_id; //backwards byte order!
uint32 tier_count; //backwards byte order!
uint32 tribute_id; //backwards byte order!
uint32 tier_count; //backwards byte order!
TributeLevel_Struct tiers[MAX_TRIBUTE_TIERS];
char name[0];
};
struct GuildTributeAbility_Struct {
uint32 guild_id;
TributeAbility_Struct ability;
char name[0];
};
struct SelectTributeReq_Struct {
uint32 client_id; //? maybe action ID?
uint32 tribute_id;
uint32 unknown8; //seen E3 00 00 00
uint32 client_id; //? maybe action ID?
uint32 tribute_id;
uint32 unknown8; //seen E3 00 00 00
};
struct GuildTributeAbilityDetail_Struct {
uint32 tribute_id; //backwards byte order!
uint32 tier_count; //backwards byte order!
TributeLevel_Struct tiers[MAX_TRIBUTE_TIERS];
uint32 unknown132;
char name[0];
};
struct GuildTributeAbility_Struct {
uint32 guild_id;
GuildTributeAbilityDetail_Struct ability;
};
struct GuildTributeSelectReq_Struct {
uint32 tribute_id;
uint32 tier;
uint32 tribute_id2;
uint32 unknown12; //seen A7 01 00 00
};
struct GuildTributeSelectReply_Struct {
uint32 tribute_id;
uint32 tier;
uint32 tribute_id2;
char description;
};
struct GuildTributeModifyBenefits_Struct {
/*000*/uint32 command;
/*004*/uint32 data;
/*008*/char unknown8[12];
/*020*/uint32 tribute_master_id;
/*024*/uint32 tribute_id_1;
/*028*/uint32 tribute_id_2;
/*032*/uint32 tribute_id_1_tier;
/*036*/uint32 tribute_id_2_tier;
/*040*/char unknown[40];
};
struct GuildTributeOptInOutReq_Struct {
/*000*/uint32 guild_id;
/*004*/uint32 tribute_toggle;
/*008*/char player[64];
/*072*/uint32 command;
/*076*/uint32 tribute_master_id;
};
struct GuildTributeOptInOutReply_Struct {
/*000*/uint32 guild_id;
/*004*/char player_name[64];
/*068*/uint32 tribute_toggle;// 0 off 1 on
/*072*/uint32 tribute_trophy_toggle;// 0 off 1 on not yet implemented
/*076*/uint32 no_donations;
/*080*/uint32 time;
/*084*/uint32 command;
};
struct GuildTributeSaveActive_Struct {
/*000*/ uint32 command;
/*004*/ char unknown04[16];
/*020*/ uint32 master_tribute_id;
/*024*/ uint32 tribute_id_1;
/*028*/ uint32 tribute_id_2;
/*032*/ uint32 tribute_1_tier;
/*036*/ uint32 tribute_2_tier;
/*040*/ char unknown40[8];
};
struct GuildTributeFavorTimer_Struct {
/*000*/ uint32 guild_id;
/*004*/ uint32 guild_favor;
/*008*/ uint32 tribute_timer;
/*012*/ uint32 trophy_timer;
};
struct GuildTributeSendActive_Struct {
/*000*/ uint32 not_used;
/*004*/ uint32 guild_favor;
/*008*/ uint32 tribute_timer;
/*012*/ uint32 tribute_enabled;
/*016*/ char unknown16[8];
/*024*/ uint32 tribute_id_1;
/*028*/ uint32 tribute_id_2;
/*032*/ uint32 tribute_id_1_tier;
/*036*/ uint32 tribute_id_2_tier;
};
struct GuildTributeToggleReq_Struct {
/*000*/ uint32 command;
/*004*/ uint32 unknown4;
/*008*/ uint32 unknown8;
};
struct GuildTributeDonateItemRequest_Struct {
/*000*/ uint32 type;
/*004*/ uint16 slot;
/*006*/ uint16 sub_index;
/*008*/ uint16 aug_index;
/*010*/ uint16 unknown10;
/*012*/ uint32 quantity;
/*016*/ uint32 tribute_master_id;
/*020*/ uint32 unknown20;
/*024*/ uint32 guild_id;
/*028*/ uint32 unknown28;
/*032*/ uint32 unknown32;
};
struct GuildTributeDonateItemReply_Struct {
/*000*/ uint32 type;
/*004*/ uint16 slot;
/*006*/ uint16 sub_index;
/*008*/ uint16 aug_index;
/*010*/ uint16 unknown10;
/*012*/ uint32 quantity;
/*016*/ uint32 unknown20;
/*020*/ uint32 favor;
};
struct GuildTributeDonatePlatRequest_Struct {
/*000*/ uint32 quantity;
/*004*/ uint32 tribute_master_id;
/*008*/ uint32 unknown08;
/*012*/ uint32 guild_id;
/*016*/ uint32 unknown16;
};
struct GuildTributeDonatePlatReply_Struct {
/*000*/ uint32 quantity;
/*004*/ uint32 unknown4;
/*008*/ uint32 favor;
};
struct SelectTributeReply_Struct {
uint32 client_id; //echoed from request.
uint32 tribute_id;
char desc[0];
uint32 client_id; //echoed from request.
uint32 tribute_id;
char description[0];
};
struct TributeInfo_Struct {
uint32 active; //0 == inactive, 1 == active
uint32 tributes[EQ::invtype::TRIBUTE_SIZE]; //-1 == NONE
uint32 tiers[EQ::invtype::TRIBUTE_SIZE]; //all 00's
uint32 tribute_master_id;
uint32 active; //0 == inactive, 1 == active
uint32 tributes[EQ::invtype::TRIBUTE_SIZE]; //-1 == NONE
uint32 tiers[EQ::invtype::TRIBUTE_SIZE]; //all 00's
uint32 tribute_master_id;
};
struct TributeItem_Struct {
uint32 slot;
uint32 quantity;
uint32 tribute_master_id;
int32 tribute_points;
uint32 slot;
uint32 quantity;
uint32 tribute_master_id;
int32 tribute_points;
};
struct TributePoint_Struct {
int32 tribute_points;
uint32 unknown04;
int32 career_tribute_points;
uint32 unknown12;
int32 tribute_points;
uint32 unknown04;
int32 career_tribute_points;
uint32 unknown12;
};
struct TributeMoney_Struct {
uint32 platinum;
uint32 tribute_master_id;
int32 tribute_points;
uint32 platinum;
uint32 tribute_master_id;
int32 tribute_points;
};
@@ -5544,28 +5788,6 @@ struct MercenaryMerchantResponse_Struct {
/*0004*/
};
struct ServerLootItem_Struct {
uint32 item_id; // uint32 item_id;
int16 equip_slot; // int16 equip_slot;
uint16 charges; // uint8 charges;
uint16 lootslot; // uint16 lootslot;
uint32 aug_1; // uint32 aug_1;
uint32 aug_2; // uint32 aug_2;
uint32 aug_3; // uint32 aug_3;
uint32 aug_4; // uint32 aug_4;
uint32 aug_5; // uint32 aug_5;
uint32 aug_6; // uint32 aug_5;
bool attuned;
std::string custom_data;
uint32 ornamenticon {};
uint32 ornamentidfile {};
uint32 ornament_hero_model {};
uint16 trivial_min_level;
uint16 trivial_max_level;
uint16 npc_min_level;
uint16 npc_max_level;
};
//Found in client near a ref to the string:
//"Got a broadcast message for ... %s ...\n"
struct ClientMarqueeMessage_Struct {
@@ -5584,9 +5806,6 @@ struct ClientMarqueeMessage_Struct {
};
typedef std::list<ServerLootItem_Struct*> ItemList;
struct fling_struct {
/* 00 */ uint32 collision; // 0 collision is off, anything else it's on
/* 04 */ int32 travel_time; // ms -- UF we need to calc this, RoF+ -1 auto calcs
+2
View File
@@ -701,6 +701,8 @@ EQEmuLogSys *EQEmuLogSys::LoadLogDatabaseSettings()
log_settings[Logs::Crash].log_to_console = static_cast<uint8>(Logs::General);
log_settings[Logs::Crash].log_to_gmsay = static_cast<uint8>(Logs::General);
log_settings[Logs::Crash].log_to_file = static_cast<uint8>(Logs::General);
log_settings[Logs::Info].log_to_file = static_cast<uint8>(Logs::General);
log_settings[Logs::Info].log_to_console = static_cast<uint8>(Logs::General);
return this;
}
+2
View File
@@ -140,6 +140,7 @@ namespace Logs {
DataBuckets,
Zoning,
EqTime,
Corpses,
MaxCategoryID /* Don't Remove this */
};
@@ -239,6 +240,7 @@ namespace Logs {
"DataBuckets",
"Zoning",
"EqTime",
"Corpses",
};
}
+10
View File
@@ -824,6 +824,16 @@
OutF(LogSys, Logs::Detail, Logs::EqTime, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
} while (0)
#define LogCorpses(message, ...) do {\
if (LogSys.IsLogEnabled(Logs::General, Logs::Corpses))\
OutF(LogSys, Logs::General, Logs::Corpses, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
} while (0)
#define LogCorpsesDetail(message, ...) do {\
if (LogSys.IsLogEnabled(Logs::Detail, Logs::Corpses))\
OutF(LogSys, Logs::Detail, Logs::Corpses, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
} while (0)
#define Log(debug_level, log_category, message, ...) do {\
if (LogSys.IsLogEnabled(debug_level, log_category))\
LogSys.Out(debug_level, log_category, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
+2
View File
@@ -697,6 +697,8 @@ void PlayerEventLogs::SetSettingsDefaults()
m_settings[PlayerEvent::KILLED_NAMED_NPC].event_enabled = 1;
m_settings[PlayerEvent::KILLED_RAID_NPC].event_enabled = 1;
m_settings[PlayerEvent::ITEM_CREATION].event_enabled = 1;
m_settings[PlayerEvent::GUILD_TRIBUTE_DONATE_ITEM].event_enabled = 1;
m_settings[PlayerEvent::GUILD_TRIBUTE_DONATE_PLAT].event_enabled = 1;
for (int i = PlayerEvent::GM_COMMAND; i != PlayerEvent::MAX; i++) {
m_settings[i].retention_days = RETENTION_DAYS_DEFAULT;
+35 -1
View File
@@ -56,6 +56,8 @@ namespace PlayerEvent {
KILLED_NAMED_NPC,
KILLED_RAID_NPC,
ITEM_CREATION,
GUILD_TRIBUTE_DONATE_ITEM,
GUILD_TRIBUTE_DONATE_PLAT,
MAX // dont remove
};
@@ -112,7 +114,9 @@ namespace PlayerEvent {
"Killed NPC",
"Killed Named NPC",
"Killed Raid NPC",
"Item Creation"
"Item Creation",
"Guild Tribute Donate Item",
"Guild Tribute Donate Platinum"
};
// Generic struct used by all events
@@ -942,6 +946,36 @@ namespace PlayerEvent {
);
}
};
struct GuildTributeDonateItem {
uint32 item_id;
uint32 guild_favor;
// cereal
template<class Archive>
void serialize(Archive &ar)
{
ar(
CEREAL_NVP(item_id),
CEREAL_NVP(guild_favor)
);
}
};
struct GuildTributeDonatePlat {
uint32 plat;
uint32 guild_favor;
// cereal
template<class Archive>
void serialize(Archive &ar)
{
ar(
CEREAL_NVP(plat),
CEREAL_NVP(guild_favor)
);
}
};
}
#endif //EQEMU_PLAYER_EVENTS_H
+8 -27
View File
@@ -24,17 +24,15 @@
#include <string>
enum FACTION_VALUE {
FACTION_ALLY = 1,
FACTION_WARMLY = 2,
FACTION_KINDLY = 3,
FACTION_AMIABLY = 4,
FACTION_INDIFFERENTLY = 5,
FACTION_ALLY = 1,
FACTION_WARMLY = 2,
FACTION_KINDLY = 3,
FACTION_AMIABLY = 4,
FACTION_INDIFFERENTLY = 5,
FACTION_APPREHENSIVELY = 6,
FACTION_DUBIOUSLY = 7,
FACTION_THREATENINGLY = 8,
FACTION_SCOWLS = 9
FACTION_DUBIOUSLY = 7,
FACTION_THREATENINGLY = 8,
FACTION_SCOWLS = 9
};
struct NPCFactionList {
@@ -75,23 +73,6 @@ struct NPCFaction
uint8 temp;
};
// Faction Associations give a much more live like faction system
// Basically the primary faction and magnitude of a faction hit will generate the rest of them
// Largest faction I could find quickly was Lord Inquisitor Seru with 9 total hits (8 associations) so 8 + 2 for max for now
#define MAX_FACTION_ASSOC 10
// this is the ID of a faction association and it's multiplier
struct FactionAssociationHit {
int id;
float multiplier;
};
struct FactionAssociations {
// maybe there should be more data here, fine for now
FactionAssociationHit hits[MAX_FACTION_ASSOC];
};
const char *FactionValueToString(FACTION_VALUE faction_value);
FACTION_VALUE CalculateFaction(FactionMods* fm, int32 tmpCharacter_value);
#endif
-5
View File
@@ -35,11 +35,6 @@ Core Zone features
*/
//Uncomment this to cause a zone to basically idle
//when there are no players in it, mobs stop wandering, etc..
#define IDLE_WHEN_EMPTY
#ifdef EMBPERL
//Enable the new XS based perl parser
#define EMBPERL_XS
+8 -8
View File
@@ -38,21 +38,21 @@
#include <fmt/format.h>
#include <filesystem>
#include <iostream>
#include <sys/stat.h>
namespace fs = std::filesystem;
/**
* @param name
* @return
*/
bool File::Exists(const std::string &name)
{
return fs::exists(fs::path{name});
struct stat sb{};
if (stat(name.c_str(), &sb) == 0) {
return true;
}
return false;
}
/**
* @param directory_name
*/
void File::Makedir(const std::string &directory_name)
{
try {
+1007 -801
View File
File diff suppressed because it is too large Load Diff
+123 -79
View File
@@ -5,6 +5,42 @@
#include <map>
#include <string>
#include <vector>
#include "timer.h"
#include "../common/repositories/guild_members_repository.h"
#include "../common/repositories/guilds_repository.h"
struct DefaultPermissionStruct {
GuildAction id;
uint32 value;
};
struct DefaultRankNamesStruct {
uint32 id;
std::string name;
};
struct GuildTributeStruct {
Timer timer;
uint32 id_1;
uint32 id_2;
uint32 id_1_tier;
uint32 id_2_tier;
uint32 favor;
uint32 time_remaining;
uint32 enabled;
bool send_timer;
};
class TributeData {
public:
//this level data stored in regular byte order and must be flipped before sending
TributeLevel_Struct tiers[MAX_TRIBUTE_TIERS];
uint8 tier_count;
uint32 unknown;
std::string name;
std::string description;
bool is_guild; //is a guild tribute item
};
class Database;
@@ -12,22 +48,23 @@ class CharGuildInfo
{
public:
//fields from `characer_`
uint32 char_id;
uint32 char_id;
std::string char_name;
uint8 class_;
uint16 level;
uint32 time_last_on;
uint32 zone_id;
uint8 class_;
uint16 level;
uint32 time_last_on;
uint32 zone_id;
//fields from `guild_members`
uint32 guild_id;
uint8 rank;
bool tribute_enable;
uint32 total_tribute;
uint32 last_tribute; //timestamp
bool banker;
bool alt;
uint32 guild_id;
uint8 rank;
bool tribute_enable;
uint32 total_tribute;
uint32 last_tribute; //timestamp
bool banker;
bool alt;
std::string public_note;
bool online;
};
//this object holds guild functionality shared between world and zone.
@@ -44,15 +81,16 @@ class BaseGuildManager
}
bool LoadGuilds();
bool RefreshGuild(uint32 guild_id);
virtual bool RefreshGuild(uint32 guild_id);
//guild edit actions.
uint32 CreateGuild(const char* name, uint32 leader_char_id);
uint32 CreateGuild(std::string name, uint32 leader_char_id);
bool StoreGuildDB(uint32 guild_id);
bool DeleteGuild(uint32 guild_id);
bool RenameGuild(uint32 guild_id, const char* name);
bool SetGuildMOTD(uint32 guild_id, const char* motd, const char *setter);
bool SetGuildURL(uint32 GuildID, const char* URL);
bool SetGuildChannel(uint32 GuildID, const char* Channel);
bool RenameGuild(uint32 guild_id, std::string name);
bool SetGuildMOTD(uint32 guild_id, std::string motd, std::string setter);
bool SetGuildURL(uint32 guild_id, std::string URL);
bool SetGuildChannel(uint32 guild_id, std::string Channel);
//character edit actions
bool SetGuildLeader(uint32 guild_id, uint32 leader_char_id);
@@ -62,9 +100,16 @@ class BaseGuildManager
bool ForceRankUpdate(uint32 charid);
bool GetAltFlag(uint32 CharID);
bool SetAltFlag(uint32 charid, bool is_alt);
bool GetBankerFlag(uint32 CharID);
bool GetBankerFlag(uint32 CharID, bool compat_mode = false);
bool GetGuildBankerStatus(uint32 guild_id, uint32 guild_rank);
bool SetTributeFlag(uint32 charid, bool enabled);
bool SetPublicNote(uint32 charid, const char *note);
bool SetPublicNote(uint32 charid, std::string public_note);
uint32 UpdateDbGuildFavor(uint32 guild_id, uint32 enabled);
bool UpdateDbGuildTributeEnabled(uint32 guild_id, uint32 enabled);
bool UpdateDbMemberTributeEnabled(uint32 guild_id, uint32 char_id, uint32 enabled);
bool UpdateDbTributeTimeRemaining(uint32 guild_id, uint32 enabled);
uint32 UpdateDbMemberFavor(uint32 guild_id, uint32 char_id, uint32 favor);
bool UpdateDbMemberOnline(uint32 char_id, bool status);
//queries
bool GetCharInfo(const char *char_name, CharGuildInfo &into);
@@ -74,29 +119,24 @@ class BaseGuildManager
bool GetGuildMOTD(uint32 guild_id, char *motd_buffer, char *setter_buffer) const;
bool GetGuildURL(uint32 GuildID, char *URLBuffer) const;
bool GetGuildChannel(uint32 GuildID, char *ChannelBuffer) const;
const char *GetRankName(uint32 guild_id, uint8 rank) const;
const char *GetGuildName(uint32 guild_id) const;
std::string GetGuildNameByID(uint32 guild_id) const;
std::string GetGuildRankName(uint32 guild_id, uint8 rank) const;
bool IsCharacterInGuild(uint32 character_id, uint32 guild_id = 0);
bool GetGuildNameByID(uint32 guild_id, std::string &into) const;
uint32 GetGuildIDByName(const char *GuildName);
uint32 GetGuildIDByCharacterID(uint32 character_id);
bool IsGuildLeader(uint32 guild_id, uint32 char_id) const;
uint8 GetDisplayedRank(uint32 guild_id, uint8 rank, uint32 char_id) const;
bool CheckGMStatus(uint32 guild_id, uint8 status) const;
bool CheckPermission(uint32 guild_id, uint8 rank, GuildAction act) const;
// uint32 Getguild_id(uint32 eqid);
uint32 FindGuildByLeader(uint32 leader) const;
// void GetGuildMembers(uint32 guild_id,GuildMember_Struct* gms);
uint32 NumberInGuild(uint32 guild_id);
// bool GetGuildRanks(uint32 guildeqid, GuildRanks_Struct* gr);
// bool EditGuild(uint32 guild_id, uint8 ranknum, GuildRankLevel_Struct* grl);
uint8 *MakeGuildList(const char *head_name, uint32 &length) const; //make a guild list packet, returns ownership of the buffer.
static const char *const GuildActionNames[_MaxGuildAction];
uint32 DoesAccountContainAGuildLeader(uint32 AccountID);
bool IsCharacterInGuild(uint32 character_id, uint32 guild_id = 0);
bool GetGuildNameByID(uint32 guild_id, std::string& into) const;
bool IsGuildLeader(uint32 guild_id, uint32 char_id) const;
bool CheckGMStatus(uint32 guild_id, uint8 status) const;
bool CheckPermission(uint32 guild_id, uint8 rank, GuildAction act) const;
bool UpdateDbBankerFlag(uint32 charid, bool is_banker);
uint8* MakeGuildList(const char* head_name, uint32& length) const; //make a guild list packet, returns ownership of the buffer.
uint8 GetDisplayedRank(uint32 guild_id, uint8 rank, uint32 char_id) const;
uint32 GetGuildIDByName(const char *GuildName);
uint32 GetGuildIDByCharacterID(uint32 character_id);
uint32 FindGuildByLeader(uint32 leader) const;
uint32 NumberInGuild(uint32 guild_id);
uint32 DoesAccountContainAGuildLeader(uint32 AccountID);
const char* GetRankName(uint32 guild_id, uint8 rank) const;
const char* GetGuildName(uint32 guild_id) const;
std::string GetGuildNameByID(uint32 guild_id) const;
std::string GetGuildRankName(uint32 guild_id, uint8 rank) const;
std::vector<GuildMembersRepository::GuildMembers> GetGuildMembers(uint32 guild_id);
protected:
//the methods which must be defined by base classes.
@@ -105,58 +145,62 @@ class BaseGuildManager
virtual void SendRankUpdate(uint32 CharID) = 0;
virtual void SendGuildDelete(uint32 guild_id) = 0;
uint32 DBCreateGuild(const char* name, uint32 leader_char_id);
bool DBDeleteGuild(uint32 guild_id);
bool DBRenameGuild(uint32 guild_id, const char* name);
bool DBSetGuildLeader(uint32 guild_id, uint32 leader_char_id);
bool DBSetGuildMOTD(uint32 guild_id, const char* motd, const char *setter);
bool DBSetGuildURL(uint32 GuildID, const char* URL);
bool DBSetGuildChannel(uint32 GuildID, const char* Channel);
bool DBSetGuild(uint32 charid, uint32 guild_id, uint8 rank);
bool DBSetGuildRank(uint32 charid, uint8 rank);
bool DBSetBankerFlag(uint32 charid, bool is_banker);
bool DBSetAltFlag(uint32 charid, bool is_alt);
bool DBSetTributeFlag(uint32 charid, bool enabled);
bool DBSetPublicNote(uint32 charid, const char *note);
uint32 UpdateDbCreateGuild(std::string name, uint32 leader_char_id);
bool UpdateDbDeleteGuild(uint32 guild_id, bool local_delete = true, bool db_delete = true);
bool UpdateDbRenameGuild(uint32 guild_id, std::string name);
bool UpdateDbGuildLeader(uint32 guild_id, uint32 leader_char_id);
bool UpdateDbGuildMOTD(uint32 guild_id, std::string motd, std::string setter);
bool UpdateDbGuildURL(uint32 GuildID, std::string URL);
bool UpdateDbGuildChannel(uint32 GuildID, std::string Channel);
bool UpdateDbGuild(uint32 charid, uint32 guild_id, uint8 rank);
bool UpdateDbGuildRank(uint32 charid, uint8 rank);
bool UpdateDbAltFlag(uint32 charid, bool is_alt);
bool UpdateDbTributeFlag(uint32 charid, bool enabled);
bool UpdateDbPublicNote(uint32 charid, std::string public_note);
bool QueryWithLogging(std::string query, const char *errmsg);
// void DBSetPublicNote(uint32 guild_id,char* charname, char* note);
bool LocalDeleteGuild(uint32 guild_id);
class RankInfo
struct RankInfo
{
public:
RankInfo();
std::string name;
bool permissions[_MaxGuildAction];
RankInfo();
std::string rank_name;
};
class GuildInfo
struct Functions
{
public:
GuildInfo();
std::string name;
std::string motd;
std::string motd_setter;
std::string url;
std::string channel;
uint32 leader_char_id;
uint8 minstatus;
//tribute is not in here on purpose, since it is only valid in world!
RankInfo ranks[GUILD_MAX_RANK + 1];
uint32 id;
uint32 perm_id;
uint32 guild_id;
uint32 perm_value;
};
public:
class GuildInfo {
public:
GuildInfo();
std::string name;
std::string motd;
std::string motd_setter;
std::string url;
std::string channel;
uint32 leader;
uint8 minstatus;
std::string rank_names[GUILD_MAX_RANK + 1];
Functions functions[GUILD_MAX_FUNCTIONS + 1];
GuildTributeStruct tribute;
};
virtual BaseGuildManager::GuildInfo* GetGuildByGuildID(uint32 guild_id);
uint32 GetGuildTributeTimeRemaining(uint32 guild_id);
protected:
std::map<uint32, GuildInfo *> m_guilds; //we own the pointers in this map
void ClearGuilds(); //clears internal structure
Database *m_db; //we do not own this
bool _StoreGuildDB(uint32 guild_id);
GuildInfo *_CreateGuild(uint32 guild_id, const char *guild_name, uint32 account_id, uint8 minstatus, const char *guild_motd, const char *motd_setter, const char *Channel, const char *URL);
GuildInfo* _CreateGuild(uint32 guild_id, std::string guild_name, uint32 leader_char_id, uint8 minstatus, std::string guild_motd, std::string motd_setter, std::string Channel, std::string URL, uint32 favour);
uint32 _GetFreeGuildID();
GuildsRepository::Guilds CreateGuildRepoFromGuildInfo(uint32 guild_id, BaseGuildManager::GuildInfo& in);
};
#endif /*GUILD_BASE_H_*/
+56 -16
View File
@@ -16,31 +16,71 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef GUILD_H
#define GUILD_H
#ifndef GUILDS_H
#define GUILDS_H
#include "types.h"
#define GUILD_NONE 0xFFFFFFFF // user has no guild
#define GUILD_MAX_RANK 8 // 0-2 - some places in the code assume a single digit, dont go above 9
#define GUILD_MAX_RANK 8 // 0-2 - some places in the code assume a single digit, dont go above 9
#define GUILD_MAX_FUNCTIONS 30
#define GUILD_TRIBUTES_MODIFY 1
#define GUILD_TRIBUTES_SAVE 0
#define GUILD_TRIBUTES_OFF 0
#define GUILD_TRIBUTES_ON 1
#define GUILD_INVITE_DECLINE 9
//defines for standard ranks
#define GUILD_MEMBER 0
#define GUILD_OFFICER 1
#define GUILD_LEADER 2
#define GUILD_RANK_NONE (GUILD_MAX_RANK+1)
#define GUILD_MEMBER_TI 0
#define GUILD_OFFICER_TI 1
#define GUILD_LEADER_TI 2
#define GUILD_RANK_NONE_TI (GUILD_MAX_RANK + 1)
//defines for standard ranks base on RoF2 definitions
#define GUILD_RANK_NONE 0
#define GUILD_LEADER 1
#define GUILD_SENIOR_OFFICER 2
#define GUILD_OFFICER 3
#define GUILD_SENIOR_MEMBER 4
#define GUILD_MEMBER 5
#define GUILD_JUNIOR_MEMBER 6
#define GUILD_INITIATE 7
#define GUILD_RECRUIT 8
typedef enum {
GUILD_HEAR = 0,
GUILD_SPEAK = 1,
GUILD_INVITE = 2,
GUILD_REMOVE = 3,
GUILD_PROMOTE = 4,
GUILD_DEMOTE = 5,
GUILD_MOTD = 6,
GUILD_WARPEACE = 7,
_MaxGuildAction
GUILD_ACTION_BANNER_CHANGE = 1,
GUILD_ACTION_BANNER_PLANT = 2,
GUILD_ACTION_BANNER_REMOVE = 3,
GUILD_ACTION_DISPLAY_GUILD_NAME = 4,
GUILD_ACTION_RANKS_CHANGE_PERMISSIONS = 5,
GUILD_ACTION_RANKS_CHANGE_RANK_NAMES = 6,
GUILD_ACTION_MEMBERS_INVITE = 7,
GUILD_ACTION_MEMBERS_PROMOTE = 8,
GUILD_ACTION_MEMBERS_DEMOTE = 9,
GUILD_ACTION_MEMBERS_REMOVE = 10,
GUILD_ACTION_EDIT_RECRUITING_SETTINGS = 11,
GUILD_ACTION_EDIT_PUBLIC_NOTES = 12,
GUILD_ACTION_BANK_DEPOSIT_ITEMS = 13,
GUILD_ACTION_BANK_WITHDRAW_ITEMS = 14,
GUILD_ACTION_BANK_VIEW_ITEMS = 15,
GUILD_ACTION_BANK_PROMOTE_ITEMS = 16,
GUILD_ACTION_BANK_CHANGE_ITEM_PERMISSIONS = 17,
GUILD_ACTION_CHANGE_THE_MOTD = 18,
GUILD_ACTION_GUILD_CHAT_SEE = 19,
GUILD_ACTION_GUILD_CHAT_SPEAK_IN = 20,
GUILD_ACTION_SEND_THE_WHOLE_GUILD_E_MAIL = 21,
GUILD_ACTION_TRIBUTE_CHANGE_FOR_OTHERS = 22,
GUILD_ACTION_TRIBUTE_CHANGE_ACTIVE_BENEFIT = 23,
GUILD_ACTION_TROPHY_TRIBUTE_CHANGE_FOR_OTHERS = 24,
GUILD_ACTION_TROPHY_TRIBUTE_CHANGE_ACTIVE_BENEFIT = 25,
GUILD_ACTION_MEMBERS_CHANGE_ALT_FLAG_FOR_OTHER = 26,
GUILD_ACTION_REAL_ESTATE_GUILD_PLOT_BUY = 27,
GUILD_ACTION_REAL_ESTATE_GUILD_PLOT_SELL = 28,
GUILD_ACTION_REAL_ESTATE_MODIFY_TROPHIES = 29,
GUILD_ACTION_MEMBERS_DEMOTE_SELF = 30,
} GuildAction;
constexpr int format_as(GuildAction action) { return static_cast<int>(action); }
#endif
+10 -1
View File
@@ -173,7 +173,8 @@ EQ::ItemInstance* EQ::InventoryProfile::GetItem(int16 slot_id) const
result = _GetItem(m_inv, slot_id);
}
else if ((slot_id >= invslot::EQUIPMENT_BEGIN && slot_id <= invslot::EQUIPMENT_END) ||
(slot_id >= invslot::TRIBUTE_BEGIN && slot_id <= invslot::TRIBUTE_END)) {
(slot_id >= invslot::TRIBUTE_BEGIN && slot_id <= invslot::TRIBUTE_END) ||
(slot_id >= invslot::GUILD_TRIBUTE_BEGIN && slot_id <= invslot::GUILD_TRIBUTE_END)) {
// Equippable slots (on body)
result = _GetItem(m_worn, slot_id);
}
@@ -465,6 +466,10 @@ EQ::ItemInstance* EQ::InventoryProfile::PopItem(int16 slot_id)
p = m_worn[slot_id];
m_worn.erase(slot_id);
}
else if (slot_id >= invslot::GUILD_TRIBUTE_BEGIN && slot_id <= invslot::GUILD_TRIBUTE_END) {
p = m_worn[slot_id];
m_worn.erase(slot_id);
}
else if (slot_id >= invslot::BANK_BEGIN && slot_id <= invslot::BANK_END) {
p = m_bank[slot_id];
m_bank.erase(slot_id);
@@ -1419,6 +1424,10 @@ int16 EQ::InventoryProfile::_PutItem(int16 slot_id, ItemInstance* inst)
m_worn[slot_id] = inst;
result = slot_id;
}
else if (slot_id >= invslot::GUILD_TRIBUTE_BEGIN && slot_id <= invslot::GUILD_TRIBUTE_END) {
m_worn[slot_id] = inst;
result = slot_id;
}
else if (slot_id >= invslot::BANK_BEGIN && slot_id <= invslot::BANK_END) {
if (slot_id - EQ::invslot::BANK_BEGIN < m_lookup->InventoryTypeSize.Bank) {
m_bank[slot_id] = inst;
+10
View File
@@ -1791,6 +1791,16 @@ int EQ::ItemInstance::RemoveTaskDeliveredItems()
return count;
}
uint32 EQ::ItemInstance::GetItemGuildFavor() const
{
uint32 total = 0;
const auto item = GetItem();
if (item) {
return total = item->GuildFavor;
}
return 0;
}
//
// class EvolveInfo
//
+1
View File
@@ -299,6 +299,7 @@ namespace EQ
int GetItemHeroicDR(bool augments = false) const;
int GetItemHeroicCorrup(bool augments = false) const;
int GetItemHaste(bool augments = false) const;
uint32 GetItemGuildFavor() const;
protected:
//////////////////////////
+33
View File
@@ -0,0 +1,33 @@
#ifndef CODE_LOOT_H
#define CODE_LOOT_H
#include <list>
#include <string>
#include "../common/types.h"
struct LootItem {
uint32 item_id;
int16 equip_slot;
uint16 charges;
uint16 lootslot;
uint32 aug_1;
uint32 aug_2;
uint32 aug_3;
uint32 aug_4;
uint32 aug_5;
uint32 aug_6;
bool attuned;
std::string custom_data;
uint32 ornamenticon{};
uint32 ornamentidfile{};
uint32 ornament_hero_model{};
uint16 trivial_min_level;
uint16 trivial_max_level;
uint16 npc_min_level;
uint16 npc_max_level;
};
typedef std::list<LootItem*> LootItems;
#endif //CODE_LOOT_H
-68
View File
@@ -1,68 +0,0 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2013 EQEMu Development Team (http://eqemu.org)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef _EQEMU_LOOTTABLE_H
#define _EQEMU_LOOTTABLE_H
#include "types.h"
#pragma pack(1)
struct LootTableEntries_Struct {
uint32 lootdrop_id;
uint8 droplimit;
uint8 mindrop;
uint8 multiplier;
float probability;
};
struct ContentFlags {
int16 min_expansion;
int16 max_expansion;
char content_flags[100];
char content_flags_disabled[100];
};
struct LootTable_Struct {
uint32 mincash;
uint32 maxcash;
uint32 avgcoin;
uint32 NumEntries;
ContentFlags content_flags;
LootTableEntries_Struct Entries[0];
};
struct LootDropEntries_Struct {
uint32 item_id;
int8 item_charges;
uint8 equip_item;
float chance;
uint16 trivial_min_level;
uint16 trivial_max_level;
uint16 npc_min_level;
uint16 npc_max_level;
uint8 multiplier;
};
struct LootDrop_Struct {
uint32 NumEntries;
ContentFlags content_flags;
LootDropEntries_Struct Entries[0];
};
#pragma pack()
#endif
+28 -23
View File
@@ -1308,13 +1308,13 @@ namespace RoF
PutFieldN(class_);
/* Translate older ranks to new values */
switch (emu_e->rank) {
case 0: { e->rank = htonl(5); break; } // GUILD_MEMBER 0
case 1: { e->rank = htonl(3); break; } // GUILD_OFFICER 1
case 2: { e->rank = htonl(1); break; } // GUILD_LEADER 2
default: { e->rank = htonl(emu_e->rank); break; } // GUILD_NONE
}
//switch (emu_e->rank) {
//case 0: { e->rank = htonl(5); break; } // GUILD_MEMBER 0
//case 1: { e->rank = htonl(3); break; } // GUILD_OFFICER 1
//case 2: { e->rank = htonl(1); break; } // GUILD_LEADER 2
//default: { e->rank = htonl(emu_e->rank); break; } // GUILD_NONE
//}
PutFieldN(rank);
PutFieldN(time_last_on);
PutFieldN(tribute_enable);
e->unknown01 = 0;
@@ -3051,19 +3051,12 @@ namespace RoF
ENCODE_LENGTH_EXACT(GuildSetRank_Struct);
SETUP_DIRECT_ENCODE(GuildSetRank_Struct, structs::GuildSetRank_Struct);
eq->GuildID = emu->Unknown00;
eq->guild_id = emu->Unknown00;
eq->rank = emu->rank;
/* Translate older ranks to new values */
switch (emu->Rank) {
case 0: { eq->Rank = 5; break; } // GUILD_MEMBER 0
case 1: { eq->Rank = 3; break; } // GUILD_OFFICER 1
case 2: { eq->Rank = 1; break; } // GUILD_LEADER 2
default: { eq->Rank = emu->Rank; break; }
}
memcpy(eq->MemberName, emu->MemberName, sizeof(eq->MemberName));
OUT(Banker);
eq->Unknown76 = 1;
memcpy(eq->member_name, emu->member_name, sizeof(eq->member_name));
OUT(banker);
eq->unknown76 = 1;
FINISH_ENCODE();
}
@@ -3973,10 +3966,22 @@ namespace RoF
/* Translate older ranks to new values */
switch (emu->guildrank) {
case 0: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 5); break; } // GUILD_MEMBER 0
case 1: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 3); break; } // GUILD_OFFICER 1
case 2: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 1); break; } // GUILD_LEADER 2
default: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildrank); break; } //
case 0: {
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 5);
break;
} // GUILD_MEMBER 0
case 1: {
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 3);
break;
} // GUILD_OFFICER 1
case 2: {
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 1);
break;
} // GUILD_LEADER 2
default: {
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildrank);
break;
} //
}
}
+79 -32
View File
@@ -1319,6 +1319,7 @@ namespace RoF2
buffer++;
// Guild ID
//*((uint32*)buffer) = htonl(2);
buffer += sizeof(uint32);
//add member count.
@@ -1357,15 +1358,7 @@ namespace RoF2
PutFieldN(level);
PutFieldN(banker);
PutFieldN(class_);
/* Translate older ranks to new values */
switch (emu_e->rank) {
case 0: { e->rank = htonl(5); break; } // GUILD_MEMBER 0
case 1: { e->rank = htonl(3); break; } // GUILD_OFFICER 1
case 2: { e->rank = htonl(1); break; } // GUILD_LEADER 2
default: { e->rank = htonl(emu_e->rank); break; } // GUILD_NONE
}
PutFieldN(rank);
PutFieldN(time_last_on);
PutFieldN(tribute_enable);
e->unknown01 = 0;
@@ -1395,8 +1388,10 @@ namespace RoF2
OUT(GuildID);
memcpy(eq->MemberName, emu->MemberName, sizeof(eq->MemberName));
OUT(ZoneID);
OUT(InstanceID);
//OUT(ZoneID);
//OUT(InstanceID);
eq->InstanceID = emu->InstanceID;
eq->ZoneID = emu->ZoneID;
OUT(LastSeen);
eq->Unknown76 = 0;
@@ -1422,7 +1417,7 @@ namespace RoF2
if (InBuffer[0])
{
PacketSize += (5 + strlen(InBuffer));
HighestGuildID = i - 1;
HighestGuildID += 1;
}
InBuffer += 64;
}
@@ -1460,6 +1455,30 @@ namespace RoF2
dest->FastQueuePacket(&in, ack_req);
}
ENCODE(OP_GuildTributeDonateItem)
{
SETUP_DIRECT_ENCODE(GuildTributeDonateItemReply_Struct, structs::GuildTributeDonateItemReply_Struct);
Log(Logs::Detail, Logs::Netcode, "RoF2::ENCODE(OP_GuildTributeDonateItem)");
OUT(type);
OUT(sub_index);
OUT(aug_index);
OUT(quantity);
OUT(unknown10);
OUT(unknown20);
OUT(favor);
structs::InventorySlot_Struct iss;
iss = ServerToRoF2Slot(emu->slot);
eq->slot = iss.Slot;
eq->sub_index = iss.SubIndex;
FINISH_ENCODE();
}
ENCODE(OP_HPUpdate)
{
SETUP_DIRECT_ENCODE(SpawnHPUpdate_Struct, structs::SpawnHPUpdate_Struct);
@@ -2466,6 +2485,8 @@ namespace RoF2
{
outapp->WriteUInt32(0xffffffff);
outapp->WriteUInt32(0);
// outapp->WriteUInt32(60);
// outapp->WriteUInt32(1);
}
outapp->WriteUInt32(0); // Unknown
@@ -3104,19 +3125,12 @@ namespace RoF2
ENCODE_LENGTH_EXACT(GuildSetRank_Struct);
SETUP_DIRECT_ENCODE(GuildSetRank_Struct, structs::GuildSetRank_Struct);
eq->GuildID = emu->Unknown00;
eq->guild_id= emu->Unknown00;
eq->rank = emu->rank;
/* Translate older ranks to new values */
switch (emu->Rank) {
case 0: { eq->Rank = 5; break; } // GUILD_MEMBER 0
case 1: { eq->Rank = 3; break; } // GUILD_OFFICER 1
case 2: { eq->Rank = 1; break; } // GUILD_LEADER 2
default: { eq->Rank = emu->Rank; break; }
}
memcpy(eq->MemberName, emu->MemberName, sizeof(eq->MemberName));
OUT(Banker);
eq->Unknown76 = 1;
memcpy(eq->member_name, emu->member_name, sizeof(eq->member_name));
OUT(banker);
eq->unknown76 = 1;
FINISH_ENCODE();
}
@@ -4178,12 +4192,13 @@ namespace RoF2
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildID);
/* Translate older ranks to new values */
switch (emu->guildrank) {
case 0: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 5); break; } // GUILD_MEMBER 0
case 1: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 3); break; } // GUILD_OFFICER 1
case 2: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 1); break; } // GUILD_LEADER 2
default: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildrank); break; } //
}
//switch (emu->guildrank) {
//case 0: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 5); break; } // GUILD_MEMBER 0
//case 1: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 3); break; } // GUILD_OFFICER 1
//case 2: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 1); break; } // GUILD_LEADER 2
//default: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildrank); break; } //
//}
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildrank);
}
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->class_);
@@ -4199,7 +4214,7 @@ namespace RoF2
VARSTRUCT_ENCODE_STRING(Buffer, emu->lastName);
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); // aatitle
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->NPC ? 0 : 1); // unknown - Must be 1 for guild name to be shown abover players head.
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->guild_show);
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 0); // TempPet
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->petOwnerId);
@@ -4955,7 +4970,7 @@ namespace RoF2
strn0cpy(emu->target, eq->target, sizeof(emu->target));
strn0cpy(emu->name, eq->name, sizeof(emu->name));
// IN(rank);
IN(rank);
FINISH_DIRECT_DECODE();
}
@@ -4983,6 +4998,38 @@ namespace RoF2
FINISH_DIRECT_DECODE();
}
DECODE(OP_GuildTributeDonateItem)
{
DECODE_LENGTH_EXACT(structs::GuildTributeDonateItemRequest_Struct);
SETUP_DIRECT_DECODE(GuildTributeDonateItemRequest_Struct, structs::GuildTributeDonateItemRequest_Struct);
Log(Logs::Detail, Logs::Netcode, "RoF2::DECODE(OP_GuildTributeDonateItem)");
IN(type);
IN(slot);
IN(sub_index);
IN(aug_index);
IN(unknown10);
IN(quantity);
IN(tribute_master_id);
IN(unknown20);
IN(guild_id);
IN(unknown28);
IN(unknown32);
structs::InventorySlot_Struct iss;
iss.Slot = eq->slot;
iss.SubIndex = eq->sub_index;
iss.AugIndex = eq->aug_index;
iss.Type = eq->type;
iss.Unknown01 = 0;
iss.Unknown02 = 0;
emu->slot = RoF2ToServerSlot(iss);
FINISH_DIRECT_DECODE();
}
/*DECODE(OP_InspectAnswer)
{
DECODE_LENGTH_EXACT(structs::InspectResponse_Struct);
+1
View File
@@ -158,6 +158,7 @@ namespace RoF2
slotCursor
};
constexpr int16 format_as(InventorySlots slot) { return static_cast<int16>(slot); }
} // namespace enum_
using namespace enum_;
+2
View File
@@ -82,6 +82,7 @@ E(OP_GuildBank)
E(OP_GuildMemberList)
E(OP_GuildMemberUpdate)
E(OP_GuildsList)
E(OP_GuildTributeDonateItem)
E(OP_HPUpdate)
E(OP_Illusion)
E(OP_InspectBuffs)
@@ -182,6 +183,7 @@ D(OP_GuildBank)
D(OP_GuildDemote)
D(OP_GuildRemove)
D(OP_GuildStatus)
D(OP_GuildTributeDonateItem)
D(OP_InspectRequest)
D(OP_ItemLinkClick)
D(OP_ItemVerifyRequest)
+36 -11
View File
@@ -2011,6 +2011,31 @@ struct GuildBankClear_Struct
/*16*/ uint32 MainAreaCount;
};
struct GuildTributeDonateItemRequest_Struct {
/*000*/ uint32 type;
/*004*/ uint16 slot;
/*006*/ uint16 sub_index;
/*008*/ uint16 aug_index;
/*010*/ uint16 unknown10;
/*012*/ uint32 quantity;
/*016*/ uint32 tribute_master_id;
/*020*/ uint32 unknown20;
/*024*/ uint32 guild_id;
/*028*/ uint32 unknown28;
/*032*/ uint32 unknown32;
};
struct GuildTributeDonateItemReply_Struct {
/*000*/ uint32 type;
/*004*/ uint16 slot;
/*006*/ uint16 sub_index;
/*008*/ uint16 aug_index;
/*010*/ uint16 unknown10;
/*012*/ uint32 quantity;
/*016*/ uint32 unknown20;
/*020*/ uint32 favor;
};
/*
** Money Loot
** Length: 22 Bytes
@@ -3600,11 +3625,11 @@ struct GuildMakeLeader {
// Update a guild members rank and banker status
struct GuildSetRank_Struct
{
/*00*/ uint32 GuildID; // Was Unknown00
/*04*/ uint32 Rank;
/*08*/ char MemberName[64];
/*72*/ uint32 Banker;
/*76*/ uint32 Unknown76; // Seen 1 - Maybe Banker?
/*00*/ uint32 guild_id; // Was Unknown00
/*04*/ uint32 rank;
/*08*/ char member_name[64];
/*72*/ uint32 banker;
/*76*/ uint32 unknown76; // Seen 1 - Maybe Banker?
/*80*/
};
@@ -3619,7 +3644,7 @@ struct Make_Pet_Struct { //Simple struct for getting pet info
uint32 min_dmg;
uint32 max_dmg;
};
struct Ground_Spawn{
struct GroundSpawn{
float max_x;
float max_y;
float min_x;
@@ -3631,8 +3656,8 @@ struct Ground_Spawn{
uint32 max_allowed;
uint32 respawntimer;
};
struct Ground_Spawns {
struct Ground_Spawn spawn[50]; //Assigned max number to allow
struct GroundSpawns {
struct GroundSpawn spawn[50]; //Assigned max number to allow
};
//struct PetitionBug_Struct{
@@ -3722,15 +3747,15 @@ struct TributeItem_Struct
struct TributePoint_Struct {
int32 tribute_points;
uint32 unknown04;
uint32 unknown04;
int32 career_tribute_points;
uint32 unknown12;
uint32 unknown12;
};
struct TributeMoney_Struct {
uint32 platinum;
uint32 tribute_master_id;
int32 tribute_points;
int32 tribute_points;
};
+8 -8
View File
@@ -3537,11 +3537,11 @@ struct GuildMakeLeader {
// Update a guild members rank and banker status
struct GuildSetRank_Struct
{
/*00*/ uint32 GuildID; // Was Unknown00
/*04*/ uint32 Rank;
/*08*/ char MemberName[64];
/*72*/ uint32 Banker;
/*76*/ uint32 Unknown76; // Seen 1 - Maybe Banker?
/*00*/ uint32 guild_id; // Was Unknown00
/*04*/ uint32 rank;
/*08*/ char member_name[64];
/*72*/ uint32 banker;
/*76*/ uint32 unknown76; // Seen 1 - Maybe Banker?
/*80*/
};
@@ -3556,7 +3556,7 @@ struct Make_Pet_Struct { //Simple struct for getting pet info
uint32 min_dmg;
uint32 max_dmg;
};
struct Ground_Spawn{
struct GroundSpawn{
float max_x;
float max_y;
float min_x;
@@ -3568,8 +3568,8 @@ struct Ground_Spawn{
uint32 max_allowed;
uint32 respawntimer;
};
struct Ground_Spawns {
struct Ground_Spawn spawn[50]; //Assigned max number to allow
struct GroundSpawns {
struct GroundSpawn spawn[50]; //Assigned max number to allow
};
//struct PetitionBug_Struct{
+3 -3
View File
@@ -3026,7 +3026,7 @@ struct Make_Pet_Struct { //Simple struct for getting pet info
uint32 min_dmg;
uint32 max_dmg;
};
struct Ground_Spawn{
struct GroundSpawn{
float max_x;
float max_y;
float min_x;
@@ -3038,8 +3038,8 @@ struct Ground_Spawn{
uint32 max_allowed;
uint32 respawntimer;
};
struct Ground_Spawns {
struct Ground_Spawn spawn[50]; //Assigned max number to allow
struct GroundSpawns {
struct GroundSpawn spawn[50]; //Assigned max number to allow
};
//struct PetitionBug_Struct{
+3 -3
View File
@@ -2951,7 +2951,7 @@ struct Make_Pet_Struct { //Simple struct for getting pet info
uint32 min_dmg;
uint32 max_dmg;
};
struct Ground_Spawn{
struct GroundSpawn{
float max_x;
float max_y;
float min_x;
@@ -2963,8 +2963,8 @@ struct Ground_Spawn{
uint32 max_allowed;
uint32 respawntimer;
};
struct Ground_Spawns {
struct Ground_Spawn spawn[50]; //Assigned max number to allow
struct GroundSpawns {
struct GroundSpawn spawn[50]; //Assigned max number to allow
};
//struct PetitionBug_Struct{
+406 -13
View File
@@ -34,6 +34,7 @@
#include "titanium_structs.h"
#include "../path_manager.h"
#include "../raid.h"
#include "../guilds.h"
#include <sstream>
@@ -664,6 +665,155 @@ namespace Titanium
dest->FastQueuePacket(&in, ack_req);
}
ENCODE(OP_SetGuildRank)
{
ENCODE_LENGTH_EXACT(GuildSetRank_Struct);
SETUP_DIRECT_ENCODE(GuildSetRank_Struct, structs::GuildSetRank_Struct);
eq->unknown00 = 0;
eq->unknown04 = 0;
//Translate older ranks to new values* /
switch (emu->rank) {
case GUILD_SENIOR_MEMBER:
case GUILD_MEMBER:
case GUILD_JUNIOR_MEMBER:
case GUILD_INITIATE:
case GUILD_RECRUIT: {
eq->rank = GUILD_MEMBER_TI;
break;
}
case GUILD_OFFICER:
case GUILD_SENIOR_OFFICER: {
eq->rank = GUILD_OFFICER_TI;
break;
}
case GUILD_LEADER: {
eq->rank = GUILD_LEADER_TI;
break;
}
default: {
eq->rank = GUILD_RANK_NONE_TI;
break;
}
}
memcpy(eq->member_name, emu->member_name, sizeof(eq->member_name));
OUT(banker);
FINISH_ENCODE();
}
ENCODE(OP_SpawnAppearance)
{
ENCODE_LENGTH_EXACT(SpawnAppearance_Struct);
SETUP_DIRECT_ENCODE(SpawnAppearance_Struct, structs::SpawnAppearance_Struct);
OUT(spawn_id);
OUT(type);
OUT(parameter);
switch (emu->type) {
case AppearanceType::GuildRank: {
//Translate new ranks to old values* /
switch (emu->parameter) {
case GUILD_SENIOR_MEMBER:
case GUILD_MEMBER:
case GUILD_JUNIOR_MEMBER:
case GUILD_INITIATE:
case GUILD_RECRUIT: {
eq->parameter = GUILD_MEMBER_TI;
break;
}
case GUILD_OFFICER:
case GUILD_SENIOR_OFFICER: {
eq->parameter = GUILD_OFFICER_TI;
break;
}
case GUILD_LEADER: {
eq->parameter = GUILD_LEADER_TI;
break;
}
}
break;
}
case AppearanceType::GuildShow: {
FAIL_ENCODE();
return;
}
default: {
break;
}
}
FINISH_ENCODE();
}
ENCODE(OP_GuildMemberAdd)
{
ENCODE_LENGTH_EXACT(GuildMemberAdd_Struct)
SETUP_DIRECT_ENCODE(GuildMemberAdd_Struct, structs::GuildMemberAdd_Struct)
OUT(guild_id)
OUT(level)
OUT(class_)
switch (emu->rank_) {
case GUILD_SENIOR_MEMBER:
case GUILD_MEMBER:
case GUILD_JUNIOR_MEMBER:
case GUILD_INITIATE:
case GUILD_RECRUIT: {
eq->rank_ = GUILD_MEMBER_TI;
break;
}
case GUILD_OFFICER:
case GUILD_SENIOR_OFFICER: {
eq->rank_ = GUILD_OFFICER_TI;
break;
}
case GUILD_LEADER: {
eq->rank_ = GUILD_LEADER_TI;
break;
}
}
OUT(zone_id)
OUT(last_on)
OUT_str(player_name)
FINISH_ENCODE()
}
ENCODE(OP_GuildMemberRankAltBanker)
{
ENCODE_LENGTH_EXACT(GuildMemberRank_Struct)
SETUP_DIRECT_ENCODE(GuildMemberRank_Struct, structs::GuildMemberRank_Struct)
OUT(guild_id)
OUT(alt_banker)
OUT_str(player_name)
switch (emu->rank_) {
case GUILD_SENIOR_MEMBER:
case GUILD_MEMBER:
case GUILD_JUNIOR_MEMBER:
case GUILD_INITIATE:
case GUILD_RECRUIT: {
eq->rank_ = GUILD_MEMBER_TI;
break;
}
case GUILD_OFFICER:
case GUILD_SENIOR_OFFICER: {
eq->rank_ = GUILD_OFFICER_TI;
break;
}
case GUILD_LEADER: {
eq->rank_ = GUILD_LEADER_TI;
break;
}
}
FINISH_ENCODE()
}
ENCODE(OP_GuildMemberList)
{
//consume the packet
@@ -727,12 +877,34 @@ namespace Titanium
str += sl + 1; \
}
#define PutFieldN(field) e->field = htonl(emu_e->field)
/* Translate new ranks to older values */
SlideStructString(name, emu_name);
PutFieldN(level);
PutFieldN(banker);
PutFieldN(class_);
PutFieldN(rank);
switch (emu_e->rank) {
case GUILD_SENIOR_MEMBER:
case GUILD_MEMBER:
case GUILD_JUNIOR_MEMBER:
case GUILD_INITIATE:
case GUILD_RECRUIT: {
e->rank = htonl(GUILD_MEMBER_TI);
break;
}
case GUILD_OFFICER:
case GUILD_SENIOR_OFFICER: {
e->rank = htonl(GUILD_OFFICER_TI);
break;
}
case GUILD_LEADER: {
e->rank = htonl(GUILD_LEADER_TI);
break;
}
default: {
e->rank = htonl(GUILD_MEMBER_TI);
break;
}
}
PutFieldN(time_last_on);
PutFieldN(tribute_enable);
PutFieldN(total_tribute);
@@ -753,6 +925,38 @@ namespace Titanium
dest->FastQueuePacket(&in, ack_req);
}
ENCODE(OP_SendGuildTributes)
{
ENCODE_LENGTH_ATLEAST(structs::GuildTributeAbility_Struct);
SETUP_VAR_ENCODE(GuildTributeAbility_Struct);
ALLOC_VAR_ENCODE(structs::GuildTributeAbility_Struct, sizeof(GuildTributeAbility_Struct) + strlen(emu->ability.name));
eq->guild_id = emu->guild_id;;
strncpy(eq->ability.name, emu->ability.name, strlen(emu->ability.name));
eq->ability.tribute_id = emu->ability.tribute_id;
eq->ability.tier_count = emu->ability.tier_count;
for (int i = 0; i < ntohl(emu->ability.tier_count); i++) {
eq->ability.tiers[i].cost = emu->ability.tiers[i].cost;
eq->ability.tiers[i].level = emu->ability.tiers[i].level;
eq->ability.tiers[i].tribute_item_id = emu->ability.tiers[i].tribute_item_id;
}
FINISH_ENCODE();
}
ENCODE(OP_GuildTributeDonateItem)
{
SETUP_DIRECT_ENCODE(GuildTributeDonateItemReply_Struct, structs::GuildTributeDonateItemReply_Struct);
Log(Logs::Detail, Logs::Netcode, "UF::ENCODE(OP_GuildTributeDonateItem)");
OUT(quantity);
OUT(favor);
eq->unknown8 = 0;
eq->slot = ServerToTitaniumSlot(emu->slot);
FINISH_ENCODE();
}
ENCODE(OP_Illusion)
{
ENCODE_LENGTH_EXACT(Illusion_Struct);
@@ -867,11 +1071,60 @@ namespace Titanium
ENCODE(OP_LFGuild)
{
struct bit_mask_conversion {
uint32 titanium_mask;
uint32 rof2_mask;
};
std::vector<bit_mask_conversion> bit_mask = {
{.titanium_mask = 2, .rof2_mask = 256},
{.titanium_mask = 4, .rof2_mask = 32768},
{.titanium_mask = 8, .rof2_mask = 65536},
{.titanium_mask = 16, .rof2_mask = 4},
{.titanium_mask = 32, .rof2_mask = 64},
{.titanium_mask = 64, .rof2_mask = 16384},
{.titanium_mask = 128, .rof2_mask = 8192},
{.titanium_mask = 256, .rof2_mask = 128},
{.titanium_mask = 512, .rof2_mask = 2048},
{.titanium_mask = 1024, .rof2_mask = 8},
{.titanium_mask = 2048, .rof2_mask = 16},
{.titanium_mask = 4096, .rof2_mask = 512},
{.titanium_mask = 8192, .rof2_mask = 32},
{.titanium_mask = 16384, .rof2_mask = 1024},
{.titanium_mask = 32768, .rof2_mask = 2},
{.titanium_mask = 65536, .rof2_mask = 4096},
};
EQApplicationPacket *in = *p;
*p = nullptr;
uint32 Command = in->ReadUInt32();
if (Command == 1) {
ENCODE_LENGTH_EXACT(LFGuild_GuildToggle_Struct);
SETUP_DIRECT_ENCODE(LFGuild_GuildToggle_Struct, structs::LFGuild_GuildToggle_Struct);
OUT(Command);
OUT_str(Comment);
OUT(FromLevel);
OUT(ToLevel);
OUT(AACount);
OUT(TimeZone);
OUT(Toggle);
OUT(TimePosted);
OUT_str(Name);
uint32 emu_bitmask = emu->Classes;
uint32 ti_bitmask = 0;
for (auto const& b : bit_mask) {
(emu_bitmask & b.rof2_mask) != 0 ? ti_bitmask |= b.titanium_mask : ti_bitmask &= ~b.titanium_mask;
}
eq->Classes = ti_bitmask;
FINISH_ENCODE();
return;
}
*p = nullptr;
if (Command != 0)
{
dest->FastQueuePacket(&in, ack_req);
@@ -1149,7 +1402,29 @@ namespace Titanium
OUT(pvp);
OUT(anon);
OUT(gm);
OUT(guildrank);
switch (emu->guildrank) {
case GUILD_SENIOR_MEMBER:
case GUILD_MEMBER:
case GUILD_JUNIOR_MEMBER:
case GUILD_INITIATE:
case GUILD_RECRUIT: {
eq->guildrank = GUILD_MEMBER_TI;
break;
}
case GUILD_OFFICER:
case GUILD_SENIOR_OFFICER: {
eq->guildrank = GUILD_OFFICER_TI;
break;
}
case GUILD_LEADER: {
eq->guildrank = GUILD_LEADER_TI;
break;
}
default: {
eq->guildrank = GUILD_RANK_NONE_TI;
break;
}
}
OUT(guildbanker);
// OUT(unknown13054[8]);
OUT(exp);
@@ -1250,7 +1525,7 @@ namespace Titanium
{
ENCODE_LENGTH_EXACT(MarkNPC_Struct);
SETUP_DIRECT_ENCODE(MarkNPC_Struct, MarkNPC_Struct);
EQApplicationPacket* outapp = new EQApplicationPacket(OP_MarkNPC, sizeof(MarkNPC_Struct));
MarkNPC_Struct* mnpcs = (MarkNPC_Struct*)outapp->pBuffer;
mnpcs->TargetID = emu->TargetID;
@@ -1267,10 +1542,10 @@ namespace Titanium
*p = nullptr;
unsigned char* __emu_buffer = inapp->pBuffer;
RaidGeneral_Struct* raid_gen = (RaidGeneral_Struct*)__emu_buffer;
switch (raid_gen->action)
{
case raidAdd:
case raidAdd:
{
RaidAddMember_Struct* emu = (RaidAddMember_Struct*)__emu_buffer;
@@ -1340,7 +1615,7 @@ namespace Titanium
dest->QueuePacket(inapp);
break;
}
default:
default:
{
RaidGeneral_Struct* emu = (RaidGeneral_Struct*)__emu_buffer;
@@ -1864,7 +2139,28 @@ namespace Titanium
eq->beard = emu->beard;
strcpy(eq->suffix, emu->suffix);
eq->petOwnerId = emu->petOwnerId;
eq->guildrank = emu->guildrank;
switch (emu->guildrank) {
case GUILD_SENIOR_MEMBER:
case GUILD_MEMBER:
case GUILD_JUNIOR_MEMBER:
case GUILD_INITIATE:
case GUILD_RECRUIT: {
eq->guildrank = GUILD_MEMBER_TI;
break;
}
case GUILD_OFFICER:
case GUILD_SENIOR_OFFICER: {
eq->guildrank = GUILD_OFFICER_TI;
break;
}
case GUILD_LEADER: {
eq->guildrank = GUILD_LEADER_TI;
break;
}
default: {
break;
}
}
// eq->unknown0194[3] = emu->unknown0194[3];
for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; k++) {
eq->equipment.Slot[k].Material = emu->equipment.Slot[k].Material;
@@ -2205,6 +2501,34 @@ namespace Titanium
FINISH_DIRECT_DECODE();
}
DECODE(OP_GuildDemote)
{
DECODE_LENGTH_EXACT(structs::GuildDemoteStruct);
SETUP_DIRECT_DECODE(GuildDemoteStruct, structs::GuildDemoteStruct);
memcpy(emu->name, eq->name, sizeof(emu->name));
memcpy(emu->target, eq->target, sizeof(emu->target));
emu->rank = GUILD_MEMBER;
FINISH_DIRECT_DECODE();
}
DECODE(OP_GuildTributeDonateItem)
{
DECODE_LENGTH_EXACT(structs::GuildTributeDonateItemRequest_Struct);
SETUP_DIRECT_DECODE(GuildTributeDonateItemRequest_Struct, structs::GuildTributeDonateItemRequest_Struct);
Log(Logs::Detail, Logs::Netcode, "UF::DECODE(OP_GuildTributeDonateItem)");
IN(quantity);
IN(tribute_master_id);
IN(guild_id);
emu->slot = TitaniumToServerSlot(eq->slot);
FINISH_DIRECT_DECODE();
}
DECODE(OP_InspectAnswer)
{
DECODE_LENGTH_EXACT(structs::InspectResponse_Struct);
@@ -2260,8 +2584,77 @@ namespace Titanium
DECODE(OP_LFGuild)
{
struct bit_mask_conversion {
uint32 titanium_mask;
uint32 rof2_mask;
};
std::vector<bit_mask_conversion> bit_mask = {
{.titanium_mask = 2, .rof2_mask = 256},
{.titanium_mask = 4, .rof2_mask = 32768},
{.titanium_mask = 8, .rof2_mask = 65536},
{.titanium_mask = 16, .rof2_mask = 4},
{.titanium_mask = 32, .rof2_mask = 64},
{.titanium_mask = 64, .rof2_mask = 16384},
{.titanium_mask = 128, .rof2_mask = 8192},
{.titanium_mask = 256, .rof2_mask = 128},
{.titanium_mask = 512, .rof2_mask = 2048},
{.titanium_mask = 1024, .rof2_mask = 8},
{.titanium_mask = 2048, .rof2_mask = 16},
{.titanium_mask = 4096, .rof2_mask = 512},
{.titanium_mask = 8192, .rof2_mask = 32},
{.titanium_mask = 16384, .rof2_mask = 1024},
{.titanium_mask = 32768, .rof2_mask = 2},
{.titanium_mask = 65536, .rof2_mask = 4096},
};
uint32 Command = __packet->ReadUInt32();
if (Command == 3) {
DECODE_LENGTH_EXACT(structs::LFGuild_SearchPlayer_Struct);
SETUP_DIRECT_DECODE(LFGuild_SearchPlayer_Struct, structs::LFGuild_SearchPlayer_Struct);
IN(Command);
IN(Unknown04);
IN(FromLevel);
IN(ToLevel);
IN(MinAA);
IN(TimeZone);
uint32 new_bitmask = 0;
uint32 ti_bitmask = eq->Classes;
for (auto const& b : bit_mask) {
(ti_bitmask & b.titanium_mask) != 0 ? new_bitmask |= b.rof2_mask : new_bitmask &= ~b.rof2_mask;
}
emu->Classes = new_bitmask;
FINISH_DIRECT_DECODE();
return;
}
if (Command == 1) {
DECODE_LENGTH_EXACT(structs::LFGuild_GuildToggle_Struct);
SETUP_DIRECT_DECODE(LFGuild_GuildToggle_Struct, structs::LFGuild_GuildToggle_Struct);
IN(Command);
IN_str(Comment);
IN(FromLevel);
IN(ToLevel);
IN(AACount);
IN(TimeZone);
IN(Toggle);
IN(TimePosted);
IN_str(Name);
uint32 new_bitmask = 0;
uint32 ti_bitmask = eq->Classes;
for (auto const& b : bit_mask) {
(ti_bitmask & b.titanium_mask) != 0 ? new_bitmask |= b.rof2_mask : new_bitmask &= ~b.rof2_mask;
}
emu->Classes = new_bitmask;
FINISH_DIRECT_DECODE();
return;
}
if (Command != 0)
return;
@@ -2401,7 +2794,7 @@ namespace Titanium
IN(general.parameter);
IN_str(general.leader_name);
IN_str(general.player_name);
auto len = 0;
if (__packet->size < sizeof(structs::RaidMOTD_Struct)) {
len = __packet->size - sizeof(structs::RaidGeneral_Struct);
@@ -2409,8 +2802,8 @@ namespace Titanium
else {
len = sizeof(eq->motd);
}
strn0cpy(emu->motd, eq->motd, len > 1024 ? 1024 : len);
strn0cpy(emu->motd, eq->motd, len > 1024 ? 1024 : len);
emu->motd[len - 1] = '\0';
FINISH_VAR_DECODE();
@@ -2428,7 +2821,7 @@ namespace Titanium
FINISH_VAR_DECODE();
break;
}
}
default:
{
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
+8
View File
@@ -44,8 +44,13 @@ E(OP_DzSetLeaderName)
E(OP_Emote)
E(OP_FormattedMessage)
E(OP_GroundSpawn)
E(OP_SetGuildRank)
E(OP_GuildMemberLevelUpdate)
E(OP_GuildMemberList)
E(OP_GuildMemberAdd)
E(OP_GuildMemberRankAltBanker)
E(OP_SendGuildTributes)
E(OP_GuildTributeDonateItem)
E(OP_Illusion)
E(OP_InspectAnswer)
E(OP_InspectRequest)
@@ -69,6 +74,7 @@ E(OP_SendCharInfo)
E(OP_SendAATable)
E(OP_SetFace)
E(OP_ShopPlayerSell)
E(OP_SpawnAppearance)
E(OP_SpecialMesg)
E(OP_TaskDescription)
E(OP_Track)
@@ -100,9 +106,11 @@ D(OP_DzRemovePlayer)
D(OP_DzSwapPlayer)
D(OP_Emote)
D(OP_FaceChange)
D(OP_GuildDemote)
D(OP_InspectAnswer)
D(OP_InspectRequest)
D(OP_ItemLinkClick)
D(OP_GuildTributeDonateItem)
D(OP_LFGuild)
D(OP_LoadSpellSet)
D(OP_LootItem)
+50 -5
View File
@@ -1,5 +1,5 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2016 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
@@ -1423,6 +1423,23 @@ struct GuildUpdate_Struct {
GuildsListEntry_Struct entry;
};
struct GuildTributeDonateItemRequest_Struct {
/*000*/ uint32 slot;
/*004*/ uint32 quantity;
/*008*/ uint32 tribute_master_id;
/*012*/ uint32 unknown12;
/*016*/ uint32 guild_id;
/*020*/ uint32 unknown20;
/*024*/ uint32 unknown24;
};
struct GuildTributeDonateItemReply_Struct {
/*000*/ uint32 slot;
/*004*/ uint32 quantity;
/*008*/ uint32 unknown8;
/*012*/ uint32 favor;
};
/*
** Money Loot
** Length: 22 Bytes
@@ -2604,7 +2621,7 @@ struct Make_Pet_Struct { //Simple struct for getting pet info
uint32 min_dmg;
uint32 max_dmg;
};
struct Ground_Spawn{
struct GroundSpawn{
float max_x;
float max_y;
float min_x;
@@ -2616,8 +2633,8 @@ struct Ground_Spawn{
uint32 max_allowed;
uint32 respawntimer;
};
struct Ground_Spawns {
struct Ground_Spawn spawn[50]; //Assigned max number to allow
struct GroundSpawns {
struct GroundSpawn spawn[50]; //Assigned max number to allow
};
//struct PetitionBug_Struct{
@@ -3508,7 +3525,7 @@ struct LFGuild_GuildToggle_Struct
/*540*/ uint32 TimeZone;
/*544*/ uint8 Toggle;
/*545*/ uint8 Unknown545[3];
/*548*/ uint32 Expires;
/*548*/ uint32 TimePosted;
/*552*/ char Name[64];
/*616*/
};
@@ -3699,6 +3716,34 @@ struct SayLinkBodyFrame_Struct {
/*045*/
};
struct GuildSetRank_Struct
{
/*00*/ uint32 unknown00;
/*04*/ uint32 unknown04;
/*08*/ uint32 rank;
/*72*/ char member_name[64];
/*76*/ uint32 banker;
};
struct GuildMemberAdd_Struct {
/*000*/ uint32 guild_id;
/*004*/ uint32 unknown04;
/*008*/ uint32 level;
/*012*/ uint32 class_;
/*016*/ uint32 rank_;
/*020*/ uint32 zone_id;
/*024*/ uint32 last_on;
/*028*/ char player_name[64];
};
struct GuildMemberRank_Struct {
/*000*/ uint32 guild_id;
/*004*/ uint32 unknown_004;
/*008*/ uint32 rank_;
/*012*/ char player_name[64];
/*076*/ uint32 alt_banker; //Banker/Alt bit 00 - none 10 - Alt 11 - Alt and Banker 01 - Banker. Banker not functional for RoF2+
};
}; /*structs*/
}; /*Titanium*/
+286 -21
View File
@@ -36,6 +36,7 @@
#include "../classes.h"
#include "../races.h"
#include "../raid.h"
#include "../guilds.h"
#include <iostream>
#include <sstream>
@@ -1134,6 +1135,30 @@ namespace UF
PutFieldN(level);
PutFieldN(banker);
PutFieldN(class_);
//Translate older ranks to new values* /
switch (emu_e->rank) {
case GUILD_SENIOR_MEMBER:
case GUILD_MEMBER:
case GUILD_JUNIOR_MEMBER:
case GUILD_INITIATE:
case GUILD_RECRUIT: {
emu_e->rank = GUILD_MEMBER_TI;
break;
}
case GUILD_OFFICER:
case GUILD_SENIOR_OFFICER: {
emu_e->rank = GUILD_OFFICER_TI;
break;
}
case GUILD_LEADER: {
emu_e->rank = GUILD_LEADER_TI;
break;
}
default: {
emu_e->rank = GUILD_RANK_NONE_TI;
break;
}
}
PutFieldN(rank);
PutFieldN(time_last_on);
PutFieldN(tribute_enable);
@@ -1165,14 +1190,14 @@ namespace UF
unsigned char *__emu_buffer = in->pBuffer;
char *InBuffer = (char *)__emu_buffer;
uint32 HighestGuildID = 0;
uint32 actual_no_guilds = 0;
for (unsigned int i = 0; i < NumberOfGuilds; ++i)
{
if (InBuffer[0])
{
PacketSize += (5 + strlen(InBuffer));
HighestGuildID = i - 1;
actual_no_guilds++;
}
InBuffer += 64;
}
@@ -1188,7 +1213,7 @@ namespace UF
memset(OutBuffer, 0, 64);
OutBuffer += 64;
VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, HighestGuildID);
VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, actual_no_guilds);
for (unsigned int i = 0; i < NumberOfGuilds; ++i)
{
@@ -1206,6 +1231,111 @@ namespace UF
dest->FastQueuePacket(&in, ack_req);
}
ENCODE(OP_GuildMemberAdd)
{
ENCODE_LENGTH_EXACT(GuildMemberAdd_Struct)
SETUP_DIRECT_ENCODE(GuildMemberAdd_Struct, structs::GuildMemberAdd_Struct)
OUT(guild_id)
OUT(level)
OUT(class_)
switch (emu->rank_) {
case GUILD_SENIOR_MEMBER:
case GUILD_MEMBER:
case GUILD_JUNIOR_MEMBER:
case GUILD_INITIATE:
case GUILD_RECRUIT: {
eq->rank_ = GUILD_MEMBER_TI;
break;
}
case GUILD_OFFICER:
case GUILD_SENIOR_OFFICER: {
eq->rank_ = GUILD_OFFICER_TI;
break;
}
case GUILD_LEADER: {
eq->rank_ = GUILD_LEADER_TI;
break;
}
default: {
eq->rank_ = GUILD_RANK_NONE_TI;
break;
}
}
OUT(zone_id)
OUT(last_on)
OUT_str(player_name)
FINISH_ENCODE()
}
ENCODE(OP_GuildMemberRankAltBanker)
{
ENCODE_LENGTH_EXACT(GuildMemberRank_Struct)
SETUP_DIRECT_ENCODE(GuildMemberRank_Struct, structs::GuildMemberRank_Struct)
OUT(guild_id)
OUT(alt_banker)
OUT_str(player_name)
switch (emu->rank_) {
case GUILD_SENIOR_MEMBER:
case GUILD_MEMBER:
case GUILD_JUNIOR_MEMBER:
case GUILD_INITIATE:
case GUILD_RECRUIT: {
eq->rank_ = GUILD_MEMBER_TI;
break;
}
case GUILD_OFFICER:
case GUILD_SENIOR_OFFICER: {
eq->rank_ = GUILD_OFFICER_TI;
break;
}
case GUILD_LEADER: {
eq->rank_ = GUILD_LEADER_TI;
break;
}
default: {
eq->rank_ = GUILD_RANK_NONE_TI;
break;
}
}
FINISH_ENCODE()
}
ENCODE(OP_SendGuildTributes)
{
ENCODE_LENGTH_ATLEAST(structs::GuildTributeAbility_Struct)
SETUP_VAR_ENCODE(GuildTributeAbility_Struct)
ALLOC_VAR_ENCODE(structs::GuildTributeAbility_Struct, sizeof(GuildTributeAbility_Struct) + strlen(emu->ability.name))
eq->guild_id = emu->guild_id;
eq->ability.tribute_id = emu->ability.tribute_id;
eq->ability.tier_count = emu->ability.tier_count;
strncpy(eq->ability.name, emu->ability.name, strlen(emu->ability.name));
for (int i = 0; i < ntohl(emu->ability.tier_count); i++) {
eq->ability.tiers[i].cost = emu->ability.tiers[i].cost;
eq->ability.tiers[i].level = emu->ability.tiers[i].level;
eq->ability.tiers[i].tribute_item_id = emu->ability.tiers[i].tribute_item_id;
}
FINISH_ENCODE()
}
ENCODE(OP_GuildTributeDonateItem)
{
SETUP_DIRECT_ENCODE(GuildTributeDonateItemReply_Struct, structs::GuildTributeDonateItemReply_Struct);
Log(Logs::Detail, Logs::Netcode, "UF::ENCODE(OP_GuildTributeDonateItem)");
OUT(quantity)
OUT(favor)
eq->unknown8 = 0;
eq->slot = ServerToUFSlot(emu->slot);
FINISH_ENCODE()
}
ENCODE(OP_Illusion)
{
ENCODE_LENGTH_EXACT(Illusion_Struct);
@@ -1829,6 +1959,30 @@ namespace UF
OUT(pvp);
OUT(anon);
OUT(gm);
//Translate older ranks to new values* /
switch (emu->guildrank) {
case GUILD_SENIOR_MEMBER:
case GUILD_MEMBER:
case GUILD_JUNIOR_MEMBER:
case GUILD_INITIATE:
case GUILD_RECRUIT: {
emu->guildrank = GUILD_MEMBER_TI;
break;
}
case GUILD_OFFICER:
case GUILD_SENIOR_OFFICER: {
emu->guildrank = GUILD_OFFICER_TI;
break;
}
case GUILD_LEADER: {
emu->guildrank = GUILD_LEADER_TI;
break;
}
default: {
emu->guildrank = GUILD_RANK_NONE_TI;
break;
}
}
OUT(guildrank);
OUT(guildbanker);
// OUT(unknown13054[12]);
@@ -2332,29 +2486,88 @@ namespace UF
ENCODE(OP_SpawnAppearance)
{
EQApplicationPacket *in = *p;
*p = nullptr;
ENCODE_LENGTH_EXACT(SpawnAppearance_Struct);
SETUP_DIRECT_ENCODE(SpawnAppearance_Struct, structs::SpawnAppearance_Struct);
unsigned char *emu_buffer = in->pBuffer;
SpawnAppearance_Struct *sas = (SpawnAppearance_Struct *)emu_buffer;
if (sas->type != AppearanceType::Size)
{
dest->FastQueuePacket(&in, ack_req);
return;
OUT(spawn_id);
OUT(type);
OUT(parameter);
switch (emu->type) {
case AppearanceType::GuildRank: {
//Translate new ranks to old values* /
switch (emu->parameter) {
case GUILD_SENIOR_MEMBER:
case GUILD_MEMBER:
case GUILD_JUNIOR_MEMBER:
case GUILD_INITIATE:
case GUILD_RECRUIT: {
eq->parameter = GUILD_MEMBER_TI;
break;
}
case GUILD_OFFICER:
case GUILD_SENIOR_OFFICER: {
eq->parameter = GUILD_OFFICER_TI;
break;
}
case GUILD_LEADER: {
eq->parameter = GUILD_LEADER_TI;
break;
}
default: {
eq->parameter = GUILD_RANK_NONE_TI;
break;
}
}
break;
}
case AppearanceType::GuildShow: {
FAIL_ENCODE();
return;
}
default: {
break;
}
}
auto outapp = new EQApplicationPacket(OP_ChangeSize, sizeof(ChangeSize_Struct));
ChangeSize_Struct *css = (ChangeSize_Struct *)outapp->pBuffer;
FINISH_ENCODE();
}
css->EntityID = sas->spawn_id;
css->Size = (float)sas->parameter;
css->Unknown08 = 0;
css->Unknown12 = 1.0f;
ENCODE(OP_SetGuildRank)
{
ENCODE_LENGTH_EXACT(GuildSetRank_Struct);
SETUP_DIRECT_ENCODE(GuildSetRank_Struct, structs::GuildSetRank_Struct);
dest->FastQueuePacket(&outapp, ack_req);
delete in;
eq->unknown00 = 0;
eq->unknown04 = 0;
switch (emu->rank) {
case GUILD_SENIOR_MEMBER:
case GUILD_MEMBER:
case GUILD_JUNIOR_MEMBER:
case GUILD_INITIATE:
case GUILD_RECRUIT: {
emu->rank = GUILD_MEMBER_TI;
break;
}
case GUILD_OFFICER:
case GUILD_SENIOR_OFFICER: {
emu->rank = GUILD_OFFICER_TI;
break;
}
case GUILD_LEADER: {
emu->rank = GUILD_LEADER_TI;
break;
}
default: {
emu->rank = GUILD_RANK_NONE_TI;
break;
}
}
memcpy(eq->member_name, emu->member_name, sizeof(eq->member_name));
OUT(banker);
FINISH_ENCODE();
}
ENCODE(OP_SpawnDoor)
@@ -2945,6 +3158,30 @@ namespace UF
else
{
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildID);
//Translate older ranks to new values* /
switch (emu->guildrank) {
case GUILD_SENIOR_MEMBER:
case GUILD_MEMBER:
case GUILD_JUNIOR_MEMBER:
case GUILD_INITIATE:
case GUILD_RECRUIT: {
emu->guildrank = GUILD_MEMBER_TI;
break;
}
case GUILD_OFFICER:
case GUILD_SENIOR_OFFICER: {
emu->guildrank = GUILD_OFFICER_TI;
break;
}
case GUILD_LEADER: {
emu->guildrank = GUILD_LEADER_TI;
break;
}
default: {
emu->guildrank = GUILD_RANK_NONE_TI;
break;
}
}
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildrank);
}
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->class_);
@@ -3577,6 +3814,34 @@ namespace UF
DECODE_FORWARD(OP_GroupInvite);
}
DECODE(OP_GuildDemote)
{
DECODE_LENGTH_EXACT(structs::GuildDemoteStruct);
SETUP_DIRECT_DECODE(GuildDemoteStruct, structs::GuildDemoteStruct);
memcpy(emu->name, eq->name, sizeof(emu->name));
memcpy(emu->target, eq->target, sizeof(emu->target));
emu->rank = GUILD_MEMBER;
FINISH_DIRECT_DECODE();
}
DECODE(OP_GuildTributeDonateItem)
{
DECODE_LENGTH_EXACT(structs::GuildTributeDonateItemRequest_Struct);
SETUP_DIRECT_DECODE(GuildTributeDonateItemRequest_Struct, structs::GuildTributeDonateItemRequest_Struct);
Log(Logs::Detail, Logs::Netcode, "UF::DECODE(OP_GuildTributeDonateItem)");
IN(quantity);
IN(tribute_master_id);
IN(guild_id);
emu->slot = UFToServerSlot(eq->slot);
FINISH_DIRECT_DECODE();
}
DECODE(OP_InspectRequest)
{
DECODE_LENGTH_EXACT(structs::Inspect_Struct);
+7
View File
@@ -58,6 +58,10 @@ E(OP_GroupInvite)
E(OP_GroupUpdate)
E(OP_GuildMemberList)
E(OP_GuildsList)
E(OP_GuildMemberAdd)
E(OP_SendGuildTributes)
E(OP_GuildMemberRankAltBanker)
E(OP_GuildTributeDonateItem)
E(OP_Illusion)
E(OP_InspectBuffs)
E(OP_InspectRequest)
@@ -82,6 +86,7 @@ E(OP_RespondAA)
E(OP_SendAATable)
E(OP_SendCharInfo)
E(OP_SendZonepoints)
E(OP_SetGuildRank)
E(OP_ShopPlayerBuy)
E(OP_ShopPlayerSell)
E(OP_SomeItemPacketMaybe)
@@ -138,6 +143,8 @@ D(OP_GroupFollow)
D(OP_GroupFollow2)
D(OP_GroupInvite)
D(OP_GroupInvite2)
D(OP_GuildDemote)
D(OP_GuildTributeDonateItem)
D(OP_InspectRequest)
D(OP_ItemLinkClick)
D(OP_ItemVerifyRequest)
+50 -3
View File
@@ -1670,6 +1670,15 @@ struct Surname_Struct
/*0100*/
};
struct GuildSetRank_Struct
{
/*00*/ uint32 unknown00;
/*04*/ uint32 unknown04;
/*08*/ uint32 rank;
/*72*/ char member_name[64];
/*76*/ uint32 banker;
};
struct GuildsListEntry_Struct {
char name[64];
};
@@ -1685,6 +1694,27 @@ struct GuildUpdate_Struct {
GuildsListEntry_Struct entry;
};
struct GuildMemberAdd_Struct {
/*000*/ uint32 guild_id;
/*004*/ uint32 unknown04;
/*008*/ uint32 unknown08;
/*012*/ uint32 unknown12;
/*016*/ uint32 level;
/*020*/ uint32 class_;
/*024*/ uint32 rank_;
/*028*/ uint32 zone_id;
/*032*/ uint32 last_on;
/*036*/ char player_name[64];
};
struct GuildMemberRank_Struct {
/*000*/ uint32 guild_id;
/*004*/ uint32 unknown_004;
/*008*/ uint32 rank_;
/*012*/ char player_name[64];
/*076*/ uint32 alt_banker; //Banker/Alt bit 00 - none 10 - Alt 11 - Alt and Banker 01 - Banker. Banker not functional for RoF2+
};
/*
** Money Loot
** Length: 22 Bytes
@@ -3067,6 +3097,23 @@ struct GuildMakeLeader{
char target[64];
};
struct GuildTributeDonateItemRequest_Struct {
/*000*/ uint32 slot;
/*004*/ uint32 quantity;
/*008*/ uint32 tribute_master_id;
/*012*/ uint32 unknown12;
/*016*/ uint32 guild_id;
/*020*/ uint32 unknown20;
/*024*/ uint32 unknown24;
};
struct GuildTributeDonateItemReply_Struct {
/*000*/ uint32 slot;
/*004*/ uint32 quantity;
/*008*/ uint32 unknown8;
/*012*/ uint32 favor;
};
struct Make_Pet_Struct { //Simple struct for getting pet info
uint8 level;
uint8 class_;
@@ -3078,7 +3125,7 @@ struct Make_Pet_Struct { //Simple struct for getting pet info
uint32 min_dmg;
uint32 max_dmg;
};
struct Ground_Spawn{
struct GroundSpawn{
float max_x;
float max_y;
float min_x;
@@ -3090,8 +3137,8 @@ struct Ground_Spawn{
uint32 max_allowed;
uint32 respawntimer;
};
struct Ground_Spawns {
struct Ground_Spawn spawn[50]; //Assigned max number to allow
struct GroundSpawns {
struct GroundSpawn spawn[50]; //Assigned max number to allow
};
//struct PetitionBug_Struct{
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_AA_ABILITY_REPOSITORY_H
@@ -33,6 +33,7 @@ public:
int32_t first_rank_id;
uint8_t enabled;
int8_t reset_on_death;
int8_t auto_grant_enabled;
};
static std::string PrimaryKey()
@@ -57,6 +58,7 @@ public:
"first_rank_id",
"enabled",
"reset_on_death",
"auto_grant_enabled",
};
}
@@ -77,6 +79,7 @@ public:
"first_rank_id",
"enabled",
"reset_on_death",
"auto_grant_enabled",
};
}
@@ -117,20 +120,21 @@ public:
{
AaAbility e{};
e.id = 0;
e.name = "";
e.category = -1;
e.classes = 131070;
e.races = 65535;
e.drakkin_heritage = 127;
e.deities = 131071;
e.status = 0;
e.type = 0;
e.charges = 0;
e.grant_only = 0;
e.first_rank_id = -1;
e.enabled = 1;
e.reset_on_death = 0;
e.id = 0;
e.name = "";
e.category = -1;
e.classes = 131070;
e.races = 65535;
e.drakkin_heritage = 127;
e.deities = 131071;
e.status = 0;
e.type = 0;
e.charges = 0;
e.grant_only = 0;
e.first_rank_id = -1;
e.enabled = 1;
e.reset_on_death = 0;
e.auto_grant_enabled = 0;
return e;
}
@@ -156,8 +160,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
aa_ability_id
)
);
@@ -166,20 +171,21 @@ public:
if (results.RowCount() == 1) {
AaAbility e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.name = row[1] ? row[1] : "";
e.category = static_cast<int32_t>(atoi(row[2]));
e.classes = static_cast<int32_t>(atoi(row[3]));
e.races = static_cast<int32_t>(atoi(row[4]));
e.drakkin_heritage = static_cast<int32_t>(atoi(row[5]));
e.deities = static_cast<int32_t>(atoi(row[6]));
e.status = static_cast<int32_t>(atoi(row[7]));
e.type = static_cast<int32_t>(atoi(row[8]));
e.charges = static_cast<int32_t>(atoi(row[9]));
e.grant_only = static_cast<int8_t>(atoi(row[10]));
e.first_rank_id = static_cast<int32_t>(atoi(row[11]));
e.enabled = static_cast<uint8_t>(strtoul(row[12], nullptr, 10));
e.reset_on_death = static_cast<int8_t>(atoi(row[13]));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.name = row[1] ? row[1] : "";
e.category = row[2] ? static_cast<int32_t>(atoi(row[2])) : -1;
e.classes = row[3] ? static_cast<int32_t>(atoi(row[3])) : 131070;
e.races = row[4] ? static_cast<int32_t>(atoi(row[4])) : 65535;
e.drakkin_heritage = row[5] ? static_cast<int32_t>(atoi(row[5])) : 127;
e.deities = row[6] ? static_cast<int32_t>(atoi(row[6])) : 131071;
e.status = row[7] ? static_cast<int32_t>(atoi(row[7])) : 0;
e.type = row[8] ? static_cast<int32_t>(atoi(row[8])) : 0;
e.charges = row[9] ? static_cast<int32_t>(atoi(row[9])) : 0;
e.grant_only = row[10] ? static_cast<int8_t>(atoi(row[10])) : 0;
e.first_rank_id = row[11] ? static_cast<int32_t>(atoi(row[11])) : -1;
e.enabled = row[12] ? static_cast<uint8_t>(strtoul(row[12], nullptr, 10)) : 1;
e.reset_on_death = row[13] ? static_cast<int8_t>(atoi(row[13])) : 0;
e.auto_grant_enabled = row[14] ? static_cast<int8_t>(atoi(row[14])) : 0;
return e;
}
@@ -227,6 +233,7 @@ public:
v.push_back(columns[11] + " = " + std::to_string(e.first_rank_id));
v.push_back(columns[12] + " = " + std::to_string(e.enabled));
v.push_back(columns[13] + " = " + std::to_string(e.reset_on_death));
v.push_back(columns[14] + " = " + std::to_string(e.auto_grant_enabled));
auto results = db.QueryDatabase(
fmt::format(
@@ -262,6 +269,7 @@ public:
v.push_back(std::to_string(e.first_rank_id));
v.push_back(std::to_string(e.enabled));
v.push_back(std::to_string(e.reset_on_death));
v.push_back(std::to_string(e.auto_grant_enabled));
auto results = db.QueryDatabase(
fmt::format(
@@ -305,6 +313,7 @@ public:
v.push_back(std::to_string(e.first_rank_id));
v.push_back(std::to_string(e.enabled));
v.push_back(std::to_string(e.reset_on_death));
v.push_back(std::to_string(e.auto_grant_enabled));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
@@ -338,20 +347,21 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
AaAbility e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.name = row[1] ? row[1] : "";
e.category = static_cast<int32_t>(atoi(row[2]));
e.classes = static_cast<int32_t>(atoi(row[3]));
e.races = static_cast<int32_t>(atoi(row[4]));
e.drakkin_heritage = static_cast<int32_t>(atoi(row[5]));
e.deities = static_cast<int32_t>(atoi(row[6]));
e.status = static_cast<int32_t>(atoi(row[7]));
e.type = static_cast<int32_t>(atoi(row[8]));
e.charges = static_cast<int32_t>(atoi(row[9]));
e.grant_only = static_cast<int8_t>(atoi(row[10]));
e.first_rank_id = static_cast<int32_t>(atoi(row[11]));
e.enabled = static_cast<uint8_t>(strtoul(row[12], nullptr, 10));
e.reset_on_death = static_cast<int8_t>(atoi(row[13]));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.name = row[1] ? row[1] : "";
e.category = row[2] ? static_cast<int32_t>(atoi(row[2])) : -1;
e.classes = row[3] ? static_cast<int32_t>(atoi(row[3])) : 131070;
e.races = row[4] ? static_cast<int32_t>(atoi(row[4])) : 65535;
e.drakkin_heritage = row[5] ? static_cast<int32_t>(atoi(row[5])) : 127;
e.deities = row[6] ? static_cast<int32_t>(atoi(row[6])) : 131071;
e.status = row[7] ? static_cast<int32_t>(atoi(row[7])) : 0;
e.type = row[8] ? static_cast<int32_t>(atoi(row[8])) : 0;
e.charges = row[9] ? static_cast<int32_t>(atoi(row[9])) : 0;
e.grant_only = row[10] ? static_cast<int8_t>(atoi(row[10])) : 0;
e.first_rank_id = row[11] ? static_cast<int32_t>(atoi(row[11])) : -1;
e.enabled = row[12] ? static_cast<uint8_t>(strtoul(row[12], nullptr, 10)) : 1;
e.reset_on_death = row[13] ? static_cast<int8_t>(atoi(row[13])) : 0;
e.auto_grant_enabled = row[14] ? static_cast<int8_t>(atoi(row[14])) : 0;
all_entries.push_back(e);
}
@@ -376,20 +386,21 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
AaAbility e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.name = row[1] ? row[1] : "";
e.category = static_cast<int32_t>(atoi(row[2]));
e.classes = static_cast<int32_t>(atoi(row[3]));
e.races = static_cast<int32_t>(atoi(row[4]));
e.drakkin_heritage = static_cast<int32_t>(atoi(row[5]));
e.deities = static_cast<int32_t>(atoi(row[6]));
e.status = static_cast<int32_t>(atoi(row[7]));
e.type = static_cast<int32_t>(atoi(row[8]));
e.charges = static_cast<int32_t>(atoi(row[9]));
e.grant_only = static_cast<int8_t>(atoi(row[10]));
e.first_rank_id = static_cast<int32_t>(atoi(row[11]));
e.enabled = static_cast<uint8_t>(strtoul(row[12], nullptr, 10));
e.reset_on_death = static_cast<int8_t>(atoi(row[13]));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.name = row[1] ? row[1] : "";
e.category = row[2] ? static_cast<int32_t>(atoi(row[2])) : -1;
e.classes = row[3] ? static_cast<int32_t>(atoi(row[3])) : 131070;
e.races = row[4] ? static_cast<int32_t>(atoi(row[4])) : 65535;
e.drakkin_heritage = row[5] ? static_cast<int32_t>(atoi(row[5])) : 127;
e.deities = row[6] ? static_cast<int32_t>(atoi(row[6])) : 131071;
e.status = row[7] ? static_cast<int32_t>(atoi(row[7])) : 0;
e.type = row[8] ? static_cast<int32_t>(atoi(row[8])) : 0;
e.charges = row[9] ? static_cast<int32_t>(atoi(row[9])) : 0;
e.grant_only = row[10] ? static_cast<int8_t>(atoi(row[10])) : 0;
e.first_rank_id = row[11] ? static_cast<int32_t>(atoi(row[11])) : -1;
e.enabled = row[12] ? static_cast<uint8_t>(strtoul(row[12], nullptr, 10)) : 1;
e.reset_on_death = row[13] ? static_cast<int8_t>(atoi(row[13])) : 0;
e.auto_grant_enabled = row[14] ? static_cast<int8_t>(atoi(row[14])) : 0;
all_entries.push_back(e);
}
@@ -448,6 +459,90 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const AaAbility &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back("'" + Strings::Escape(e.name) + "'");
v.push_back(std::to_string(e.category));
v.push_back(std::to_string(e.classes));
v.push_back(std::to_string(e.races));
v.push_back(std::to_string(e.drakkin_heritage));
v.push_back(std::to_string(e.deities));
v.push_back(std::to_string(e.status));
v.push_back(std::to_string(e.type));
v.push_back(std::to_string(e.charges));
v.push_back(std::to_string(e.grant_only));
v.push_back(std::to_string(e.first_rank_id));
v.push_back(std::to_string(e.enabled));
v.push_back(std::to_string(e.reset_on_death));
v.push_back(std::to_string(e.auto_grant_enabled));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<AaAbility> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back("'" + Strings::Escape(e.name) + "'");
v.push_back(std::to_string(e.category));
v.push_back(std::to_string(e.classes));
v.push_back(std::to_string(e.races));
v.push_back(std::to_string(e.drakkin_heritage));
v.push_back(std::to_string(e.deities));
v.push_back(std::to_string(e.status));
v.push_back(std::to_string(e.type));
v.push_back(std::to_string(e.charges));
v.push_back(std::to_string(e.grant_only));
v.push_back(std::to_string(e.first_rank_id));
v.push_back(std::to_string(e.enabled));
v.push_back(std::to_string(e.reset_on_death));
v.push_back(std::to_string(e.auto_grant_enabled));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_AA_ABILITY_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_AA_RANK_EFFECTS_REPOSITORY_H
@@ -120,8 +120,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
aa_rank_effects_id
)
);
@@ -130,11 +131,11 @@ public:
if (results.RowCount() == 1) {
AaRankEffects e{};
e.rank_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.slot = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.effect_id = static_cast<int32_t>(atoi(row[2]));
e.base1 = static_cast<int32_t>(atoi(row[3]));
e.base2 = static_cast<int32_t>(atoi(row[4]));
e.rank_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.slot = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 1;
e.effect_id = row[2] ? static_cast<int32_t>(atoi(row[2])) : 0;
e.base1 = row[3] ? static_cast<int32_t>(atoi(row[3])) : 0;
e.base2 = row[4] ? static_cast<int32_t>(atoi(row[4])) : 0;
return e;
}
@@ -266,11 +267,11 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
AaRankEffects e{};
e.rank_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.slot = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.effect_id = static_cast<int32_t>(atoi(row[2]));
e.base1 = static_cast<int32_t>(atoi(row[3]));
e.base2 = static_cast<int32_t>(atoi(row[4]));
e.rank_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.slot = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 1;
e.effect_id = row[2] ? static_cast<int32_t>(atoi(row[2])) : 0;
e.base1 = row[3] ? static_cast<int32_t>(atoi(row[3])) : 0;
e.base2 = row[4] ? static_cast<int32_t>(atoi(row[4])) : 0;
all_entries.push_back(e);
}
@@ -295,11 +296,11 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
AaRankEffects e{};
e.rank_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.slot = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.effect_id = static_cast<int32_t>(atoi(row[2]));
e.base1 = static_cast<int32_t>(atoi(row[3]));
e.base2 = static_cast<int32_t>(atoi(row[4]));
e.rank_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.slot = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 1;
e.effect_id = row[2] ? static_cast<int32_t>(atoi(row[2])) : 0;
e.base1 = row[3] ? static_cast<int32_t>(atoi(row[3])) : 0;
e.base2 = row[4] ? static_cast<int32_t>(atoi(row[4])) : 0;
all_entries.push_back(e);
}
@@ -358,6 +359,70 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const AaRankEffects &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.rank_id));
v.push_back(std::to_string(e.slot));
v.push_back(std::to_string(e.effect_id));
v.push_back(std::to_string(e.base1));
v.push_back(std::to_string(e.base2));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<AaRankEffects> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.rank_id));
v.push_back(std::to_string(e.slot));
v.push_back(std::to_string(e.effect_id));
v.push_back(std::to_string(e.base1));
v.push_back(std::to_string(e.base2));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_AA_RANK_EFFECTS_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_AA_RANK_PREREQS_REPOSITORY_H
@@ -112,8 +112,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
aa_rank_prereqs_id
)
);
@@ -122,9 +123,9 @@ public:
if (results.RowCount() == 1) {
AaRankPrereqs e{};
e.rank_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.aa_id = static_cast<int32_t>(atoi(row[1]));
e.points = static_cast<int32_t>(atoi(row[2]));
e.rank_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.aa_id = row[1] ? static_cast<int32_t>(atoi(row[1])) : 0;
e.points = row[2] ? static_cast<int32_t>(atoi(row[2])) : 0;
return e;
}
@@ -250,9 +251,9 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
AaRankPrereqs e{};
e.rank_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.aa_id = static_cast<int32_t>(atoi(row[1]));
e.points = static_cast<int32_t>(atoi(row[2]));
e.rank_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.aa_id = row[1] ? static_cast<int32_t>(atoi(row[1])) : 0;
e.points = row[2] ? static_cast<int32_t>(atoi(row[2])) : 0;
all_entries.push_back(e);
}
@@ -277,9 +278,9 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
AaRankPrereqs e{};
e.rank_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.aa_id = static_cast<int32_t>(atoi(row[1]));
e.points = static_cast<int32_t>(atoi(row[2]));
e.rank_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.aa_id = row[1] ? static_cast<int32_t>(atoi(row[1])) : 0;
e.points = row[2] ? static_cast<int32_t>(atoi(row[2])) : 0;
all_entries.push_back(e);
}
@@ -338,6 +339,66 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const AaRankPrereqs &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.rank_id));
v.push_back(std::to_string(e.aa_id));
v.push_back(std::to_string(e.points));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<AaRankPrereqs> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.rank_id));
v.push_back(std::to_string(e.aa_id));
v.push_back(std::to_string(e.points));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_AA_RANK_PREREQS_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_AA_RANKS_REPOSITORY_H
@@ -152,8 +152,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
aa_ranks_id
)
);
@@ -162,19 +163,19 @@ public:
if (results.RowCount() == 1) {
AaRanks e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.upper_hotkey_sid = static_cast<int32_t>(atoi(row[1]));
e.lower_hotkey_sid = static_cast<int32_t>(atoi(row[2]));
e.title_sid = static_cast<int32_t>(atoi(row[3]));
e.desc_sid = static_cast<int32_t>(atoi(row[4]));
e.cost = static_cast<int32_t>(atoi(row[5]));
e.level_req = static_cast<int32_t>(atoi(row[6]));
e.spell = static_cast<int32_t>(atoi(row[7]));
e.spell_type = static_cast<int32_t>(atoi(row[8]));
e.recast_time = static_cast<int32_t>(atoi(row[9]));
e.expansion = static_cast<int32_t>(atoi(row[10]));
e.prev_id = static_cast<int32_t>(atoi(row[11]));
e.next_id = static_cast<int32_t>(atoi(row[12]));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.upper_hotkey_sid = row[1] ? static_cast<int32_t>(atoi(row[1])) : -1;
e.lower_hotkey_sid = row[2] ? static_cast<int32_t>(atoi(row[2])) : -1;
e.title_sid = row[3] ? static_cast<int32_t>(atoi(row[3])) : -1;
e.desc_sid = row[4] ? static_cast<int32_t>(atoi(row[4])) : -1;
e.cost = row[5] ? static_cast<int32_t>(atoi(row[5])) : 1;
e.level_req = row[6] ? static_cast<int32_t>(atoi(row[6])) : 51;
e.spell = row[7] ? static_cast<int32_t>(atoi(row[7])) : -1;
e.spell_type = row[8] ? static_cast<int32_t>(atoi(row[8])) : 0;
e.recast_time = row[9] ? static_cast<int32_t>(atoi(row[9])) : 0;
e.expansion = row[10] ? static_cast<int32_t>(atoi(row[10])) : 0;
e.prev_id = row[11] ? static_cast<int32_t>(atoi(row[11])) : -1;
e.next_id = row[12] ? static_cast<int32_t>(atoi(row[12])) : -1;
return e;
}
@@ -330,19 +331,19 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
AaRanks e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.upper_hotkey_sid = static_cast<int32_t>(atoi(row[1]));
e.lower_hotkey_sid = static_cast<int32_t>(atoi(row[2]));
e.title_sid = static_cast<int32_t>(atoi(row[3]));
e.desc_sid = static_cast<int32_t>(atoi(row[4]));
e.cost = static_cast<int32_t>(atoi(row[5]));
e.level_req = static_cast<int32_t>(atoi(row[6]));
e.spell = static_cast<int32_t>(atoi(row[7]));
e.spell_type = static_cast<int32_t>(atoi(row[8]));
e.recast_time = static_cast<int32_t>(atoi(row[9]));
e.expansion = static_cast<int32_t>(atoi(row[10]));
e.prev_id = static_cast<int32_t>(atoi(row[11]));
e.next_id = static_cast<int32_t>(atoi(row[12]));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.upper_hotkey_sid = row[1] ? static_cast<int32_t>(atoi(row[1])) : -1;
e.lower_hotkey_sid = row[2] ? static_cast<int32_t>(atoi(row[2])) : -1;
e.title_sid = row[3] ? static_cast<int32_t>(atoi(row[3])) : -1;
e.desc_sid = row[4] ? static_cast<int32_t>(atoi(row[4])) : -1;
e.cost = row[5] ? static_cast<int32_t>(atoi(row[5])) : 1;
e.level_req = row[6] ? static_cast<int32_t>(atoi(row[6])) : 51;
e.spell = row[7] ? static_cast<int32_t>(atoi(row[7])) : -1;
e.spell_type = row[8] ? static_cast<int32_t>(atoi(row[8])) : 0;
e.recast_time = row[9] ? static_cast<int32_t>(atoi(row[9])) : 0;
e.expansion = row[10] ? static_cast<int32_t>(atoi(row[10])) : 0;
e.prev_id = row[11] ? static_cast<int32_t>(atoi(row[11])) : -1;
e.next_id = row[12] ? static_cast<int32_t>(atoi(row[12])) : -1;
all_entries.push_back(e);
}
@@ -367,19 +368,19 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
AaRanks e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.upper_hotkey_sid = static_cast<int32_t>(atoi(row[1]));
e.lower_hotkey_sid = static_cast<int32_t>(atoi(row[2]));
e.title_sid = static_cast<int32_t>(atoi(row[3]));
e.desc_sid = static_cast<int32_t>(atoi(row[4]));
e.cost = static_cast<int32_t>(atoi(row[5]));
e.level_req = static_cast<int32_t>(atoi(row[6]));
e.spell = static_cast<int32_t>(atoi(row[7]));
e.spell_type = static_cast<int32_t>(atoi(row[8]));
e.recast_time = static_cast<int32_t>(atoi(row[9]));
e.expansion = static_cast<int32_t>(atoi(row[10]));
e.prev_id = static_cast<int32_t>(atoi(row[11]));
e.next_id = static_cast<int32_t>(atoi(row[12]));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.upper_hotkey_sid = row[1] ? static_cast<int32_t>(atoi(row[1])) : -1;
e.lower_hotkey_sid = row[2] ? static_cast<int32_t>(atoi(row[2])) : -1;
e.title_sid = row[3] ? static_cast<int32_t>(atoi(row[3])) : -1;
e.desc_sid = row[4] ? static_cast<int32_t>(atoi(row[4])) : -1;
e.cost = row[5] ? static_cast<int32_t>(atoi(row[5])) : 1;
e.level_req = row[6] ? static_cast<int32_t>(atoi(row[6])) : 51;
e.spell = row[7] ? static_cast<int32_t>(atoi(row[7])) : -1;
e.spell_type = row[8] ? static_cast<int32_t>(atoi(row[8])) : 0;
e.recast_time = row[9] ? static_cast<int32_t>(atoi(row[9])) : 0;
e.expansion = row[10] ? static_cast<int32_t>(atoi(row[10])) : 0;
e.prev_id = row[11] ? static_cast<int32_t>(atoi(row[11])) : -1;
e.next_id = row[12] ? static_cast<int32_t>(atoi(row[12])) : -1;
all_entries.push_back(e);
}
@@ -438,6 +439,86 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const AaRanks &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back(std::to_string(e.upper_hotkey_sid));
v.push_back(std::to_string(e.lower_hotkey_sid));
v.push_back(std::to_string(e.title_sid));
v.push_back(std::to_string(e.desc_sid));
v.push_back(std::to_string(e.cost));
v.push_back(std::to_string(e.level_req));
v.push_back(std::to_string(e.spell));
v.push_back(std::to_string(e.spell_type));
v.push_back(std::to_string(e.recast_time));
v.push_back(std::to_string(e.expansion));
v.push_back(std::to_string(e.prev_id));
v.push_back(std::to_string(e.next_id));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<AaRanks> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back(std::to_string(e.upper_hotkey_sid));
v.push_back(std::to_string(e.lower_hotkey_sid));
v.push_back(std::to_string(e.title_sid));
v.push_back(std::to_string(e.desc_sid));
v.push_back(std::to_string(e.cost));
v.push_back(std::to_string(e.level_req));
v.push_back(std::to_string(e.spell));
v.push_back(std::to_string(e.spell_type));
v.push_back(std::to_string(e.recast_time));
v.push_back(std::to_string(e.expansion));
v.push_back(std::to_string(e.prev_id));
v.push_back(std::to_string(e.next_id));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_AA_RANKS_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_ACCOUNT_FLAGS_REPOSITORY_H
@@ -112,8 +112,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
account_flags_id
)
);
@@ -122,7 +123,7 @@ public:
if (results.RowCount() == 1) {
AccountFlags e{};
e.p_accid = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.p_accid = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.p_flag = row[1] ? row[1] : "";
e.p_value = row[2] ? row[2] : "";
@@ -250,7 +251,7 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
AccountFlags e{};
e.p_accid = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.p_accid = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.p_flag = row[1] ? row[1] : "";
e.p_value = row[2] ? row[2] : "";
@@ -277,7 +278,7 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
AccountFlags e{};
e.p_accid = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.p_accid = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.p_flag = row[1] ? row[1] : "";
e.p_value = row[2] ? row[2] : "";
@@ -338,6 +339,66 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const AccountFlags &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.p_accid));
v.push_back("'" + Strings::Escape(e.p_flag) + "'");
v.push_back("'" + Strings::Escape(e.p_value) + "'");
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<AccountFlags> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.p_accid));
v.push_back("'" + Strings::Escape(e.p_flag) + "'");
v.push_back("'" + Strings::Escape(e.p_value) + "'");
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_ACCOUNT_FLAGS_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_ACCOUNT_IP_REPOSITORY_H
@@ -116,8 +116,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
account_ip_id
)
);
@@ -126,10 +127,10 @@ public:
if (results.RowCount() == 1) {
AccountIp e{};
e.accid = static_cast<int32_t>(atoi(row[0]));
e.accid = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.ip = row[1] ? row[1] : "";
e.count = static_cast<int32_t>(atoi(row[2]));
e.lastused = row[3] ? row[3] : "";
e.count = row[2] ? static_cast<int32_t>(atoi(row[2])) : 1;
e.lastused = row[3] ? row[3] : std::time(nullptr);
return e;
}
@@ -258,10 +259,10 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
AccountIp e{};
e.accid = static_cast<int32_t>(atoi(row[0]));
e.accid = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.ip = row[1] ? row[1] : "";
e.count = static_cast<int32_t>(atoi(row[2]));
e.lastused = row[3] ? row[3] : "";
e.count = row[2] ? static_cast<int32_t>(atoi(row[2])) : 1;
e.lastused = row[3] ? row[3] : std::time(nullptr);
all_entries.push_back(e);
}
@@ -286,10 +287,10 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
AccountIp e{};
e.accid = static_cast<int32_t>(atoi(row[0]));
e.accid = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.ip = row[1] ? row[1] : "";
e.count = static_cast<int32_t>(atoi(row[2]));
e.lastused = row[3] ? row[3] : "";
e.count = row[2] ? static_cast<int32_t>(atoi(row[2])) : 1;
e.lastused = row[3] ? row[3] : std::time(nullptr);
all_entries.push_back(e);
}
@@ -348,6 +349,68 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const AccountIp &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.accid));
v.push_back("'" + Strings::Escape(e.ip) + "'");
v.push_back(std::to_string(e.count));
v.push_back("'" + Strings::Escape(e.lastused) + "'");
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<AccountIp> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.accid));
v.push_back("'" + Strings::Escape(e.ip) + "'");
v.push_back(std::to_string(e.count));
v.push_back("'" + Strings::Escape(e.lastused) + "'");
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_ACCOUNT_IP_REPOSITORY_H
@@ -16,7 +16,6 @@
#include "../../strings.h"
#include <ctime>
class BaseAccountRepository {
public:
struct Account {
@@ -208,25 +207,25 @@ public:
if (results.RowCount() == 1) {
Account e{};
e.id = static_cast<int32_t>(atoi(row[0]));
e.id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.name = row[1] ? row[1] : "";
e.charname = row[2] ? row[2] : "";
e.sharedplat = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.sharedplat = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.password = row[4] ? row[4] : "";
e.status = static_cast<int32_t>(atoi(row[5]));
e.ls_id = row[6] ? row[6] : "";
e.lsaccount_id = static_cast<uint32_t>(strtoul(row[7], nullptr, 10));
e.gmspeed = static_cast<uint8_t>(strtoul(row[8], nullptr, 10));
e.invulnerable = static_cast<int8_t>(atoi(row[9]));
e.flymode = static_cast<int8_t>(atoi(row[10]));
e.ignore_tells = static_cast<int8_t>(atoi(row[11]));
e.revoked = static_cast<uint8_t>(strtoul(row[12], nullptr, 10));
e.karma = static_cast<uint32_t>(strtoul(row[13], nullptr, 10));
e.status = row[5] ? static_cast<int32_t>(atoi(row[5])) : 0;
e.ls_id = row[6] ? row[6] : "eqemu";
e.lsaccount_id = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
e.gmspeed = row[8] ? static_cast<uint8_t>(strtoul(row[8], nullptr, 10)) : 0;
e.invulnerable = row[9] ? static_cast<int8_t>(atoi(row[9])) : 0;
e.flymode = row[10] ? static_cast<int8_t>(atoi(row[10])) : 0;
e.ignore_tells = row[11] ? static_cast<int8_t>(atoi(row[11])) : 0;
e.revoked = row[12] ? static_cast<uint8_t>(strtoul(row[12], nullptr, 10)) : 0;
e.karma = row[13] ? static_cast<uint32_t>(strtoul(row[13], nullptr, 10)) : 0;
e.minilogin_ip = row[14] ? row[14] : "";
e.hideme = static_cast<int8_t>(atoi(row[15]));
e.rulesflag = static_cast<uint8_t>(strtoul(row[16], nullptr, 10));
e.hideme = row[15] ? static_cast<int8_t>(atoi(row[15])) : 0;
e.rulesflag = row[16] ? static_cast<uint8_t>(strtoul(row[16], nullptr, 10)) : 0;
e.suspendeduntil = strtoll(row[17] ? row[17] : "-1", nullptr, 10);
e.time_creation = static_cast<uint32_t>(strtoul(row[18], nullptr, 10));
e.time_creation = row[18] ? static_cast<uint32_t>(strtoul(row[18], nullptr, 10)) : 0;
e.ban_reason = row[19] ? row[19] : "";
e.suspend_reason = row[20] ? row[20] : "";
e.crc_eqgame = row[21] ? row[21] : "";
@@ -419,25 +418,25 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
Account e{};
e.id = static_cast<int32_t>(atoi(row[0]));
e.id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.name = row[1] ? row[1] : "";
e.charname = row[2] ? row[2] : "";
e.sharedplat = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.sharedplat = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.password = row[4] ? row[4] : "";
e.status = static_cast<int32_t>(atoi(row[5]));
e.ls_id = row[6] ? row[6] : "";
e.lsaccount_id = static_cast<uint32_t>(strtoul(row[7], nullptr, 10));
e.gmspeed = static_cast<uint8_t>(strtoul(row[8], nullptr, 10));
e.invulnerable = static_cast<int8_t>(atoi(row[9]));
e.flymode = static_cast<int8_t>(atoi(row[10]));
e.ignore_tells = static_cast<int8_t>(atoi(row[11]));
e.revoked = static_cast<uint8_t>(strtoul(row[12], nullptr, 10));
e.karma = static_cast<uint32_t>(strtoul(row[13], nullptr, 10));
e.status = row[5] ? static_cast<int32_t>(atoi(row[5])) : 0;
e.ls_id = row[6] ? row[6] : "eqemu";
e.lsaccount_id = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
e.gmspeed = row[8] ? static_cast<uint8_t>(strtoul(row[8], nullptr, 10)) : 0;
e.invulnerable = row[9] ? static_cast<int8_t>(atoi(row[9])) : 0;
e.flymode = row[10] ? static_cast<int8_t>(atoi(row[10])) : 0;
e.ignore_tells = row[11] ? static_cast<int8_t>(atoi(row[11])) : 0;
e.revoked = row[12] ? static_cast<uint8_t>(strtoul(row[12], nullptr, 10)) : 0;
e.karma = row[13] ? static_cast<uint32_t>(strtoul(row[13], nullptr, 10)) : 0;
e.minilogin_ip = row[14] ? row[14] : "";
e.hideme = static_cast<int8_t>(atoi(row[15]));
e.rulesflag = static_cast<uint8_t>(strtoul(row[16], nullptr, 10));
e.hideme = row[15] ? static_cast<int8_t>(atoi(row[15])) : 0;
e.rulesflag = row[16] ? static_cast<uint8_t>(strtoul(row[16], nullptr, 10)) : 0;
e.suspendeduntil = strtoll(row[17] ? row[17] : "-1", nullptr, 10);
e.time_creation = static_cast<uint32_t>(strtoul(row[18], nullptr, 10));
e.time_creation = row[18] ? static_cast<uint32_t>(strtoul(row[18], nullptr, 10)) : 0;
e.ban_reason = row[19] ? row[19] : "";
e.suspend_reason = row[20] ? row[20] : "";
e.crc_eqgame = row[21] ? row[21] : "";
@@ -467,25 +466,25 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
Account e{};
e.id = static_cast<int32_t>(atoi(row[0]));
e.id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.name = row[1] ? row[1] : "";
e.charname = row[2] ? row[2] : "";
e.sharedplat = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.sharedplat = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.password = row[4] ? row[4] : "";
e.status = static_cast<int32_t>(atoi(row[5]));
e.ls_id = row[6] ? row[6] : "";
e.lsaccount_id = static_cast<uint32_t>(strtoul(row[7], nullptr, 10));
e.gmspeed = static_cast<uint8_t>(strtoul(row[8], nullptr, 10));
e.invulnerable = static_cast<int8_t>(atoi(row[9]));
e.flymode = static_cast<int8_t>(atoi(row[10]));
e.ignore_tells = static_cast<int8_t>(atoi(row[11]));
e.revoked = static_cast<uint8_t>(strtoul(row[12], nullptr, 10));
e.karma = static_cast<uint32_t>(strtoul(row[13], nullptr, 10));
e.status = row[5] ? static_cast<int32_t>(atoi(row[5])) : 0;
e.ls_id = row[6] ? row[6] : "eqemu";
e.lsaccount_id = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
e.gmspeed = row[8] ? static_cast<uint8_t>(strtoul(row[8], nullptr, 10)) : 0;
e.invulnerable = row[9] ? static_cast<int8_t>(atoi(row[9])) : 0;
e.flymode = row[10] ? static_cast<int8_t>(atoi(row[10])) : 0;
e.ignore_tells = row[11] ? static_cast<int8_t>(atoi(row[11])) : 0;
e.revoked = row[12] ? static_cast<uint8_t>(strtoul(row[12], nullptr, 10)) : 0;
e.karma = row[13] ? static_cast<uint32_t>(strtoul(row[13], nullptr, 10)) : 0;
e.minilogin_ip = row[14] ? row[14] : "";
e.hideme = static_cast<int8_t>(atoi(row[15]));
e.rulesflag = static_cast<uint8_t>(strtoul(row[16], nullptr, 10));
e.hideme = row[15] ? static_cast<int8_t>(atoi(row[15])) : 0;
e.rulesflag = row[16] ? static_cast<uint8_t>(strtoul(row[16], nullptr, 10)) : 0;
e.suspendeduntil = strtoll(row[17] ? row[17] : "-1", nullptr, 10);
e.time_creation = static_cast<uint32_t>(strtoul(row[18], nullptr, 10));
e.time_creation = row[18] ? static_cast<uint32_t>(strtoul(row[18], nullptr, 10)) : 0;
e.ban_reason = row[19] ? row[19] : "";
e.suspend_reason = row[20] ? row[20] : "";
e.crc_eqgame = row[21] ? row[21] : "";
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_ACCOUNT_REWARDS_REPOSITORY_H
@@ -112,8 +112,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
account_rewards_id
)
);
@@ -122,9 +123,9 @@ public:
if (results.RowCount() == 1) {
AccountRewards e{};
e.account_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.reward_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.amount = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.account_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.reward_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.amount = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
return e;
}
@@ -250,9 +251,9 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
AccountRewards e{};
e.account_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.reward_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.amount = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.account_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.reward_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.amount = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -277,9 +278,9 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
AccountRewards e{};
e.account_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.reward_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.amount = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.account_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.reward_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.amount = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -338,6 +339,66 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const AccountRewards &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.account_id));
v.push_back(std::to_string(e.reward_id));
v.push_back(std::to_string(e.amount));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<AccountRewards> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.account_id));
v.push_back(std::to_string(e.reward_id));
v.push_back(std::to_string(e.amount));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_ACCOUNT_REWARDS_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_ADVENTURE_DETAILS_REPOSITORY_H
@@ -136,8 +136,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
adventure_details_id
)
);
@@ -146,15 +147,15 @@ public:
if (results.RowCount() == 1) {
AdventureDetails e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.adventure_id = static_cast<uint16_t>(strtoul(row[1], nullptr, 10));
e.instance_id = static_cast<int32_t>(atoi(row[2]));
e.count = static_cast<uint16_t>(strtoul(row[3], nullptr, 10));
e.assassinate_count = static_cast<uint16_t>(strtoul(row[4], nullptr, 10));
e.status = static_cast<uint8_t>(strtoul(row[5], nullptr, 10));
e.time_created = static_cast<uint32_t>(strtoul(row[6], nullptr, 10));
e.time_zoned = static_cast<uint32_t>(strtoul(row[7], nullptr, 10));
e.time_completed = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.adventure_id = row[1] ? static_cast<uint16_t>(strtoul(row[1], nullptr, 10)) : 0;
e.instance_id = row[2] ? static_cast<int32_t>(atoi(row[2])) : -1;
e.count = row[3] ? static_cast<uint16_t>(strtoul(row[3], nullptr, 10)) : 0;
e.assassinate_count = row[4] ? static_cast<uint16_t>(strtoul(row[4], nullptr, 10)) : 0;
e.status = row[5] ? static_cast<uint8_t>(strtoul(row[5], nullptr, 10)) : 0;
e.time_created = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
e.time_zoned = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
e.time_completed = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
return e;
}
@@ -297,15 +298,15 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
AdventureDetails e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.adventure_id = static_cast<uint16_t>(strtoul(row[1], nullptr, 10));
e.instance_id = static_cast<int32_t>(atoi(row[2]));
e.count = static_cast<uint16_t>(strtoul(row[3], nullptr, 10));
e.assassinate_count = static_cast<uint16_t>(strtoul(row[4], nullptr, 10));
e.status = static_cast<uint8_t>(strtoul(row[5], nullptr, 10));
e.time_created = static_cast<uint32_t>(strtoul(row[6], nullptr, 10));
e.time_zoned = static_cast<uint32_t>(strtoul(row[7], nullptr, 10));
e.time_completed = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.adventure_id = row[1] ? static_cast<uint16_t>(strtoul(row[1], nullptr, 10)) : 0;
e.instance_id = row[2] ? static_cast<int32_t>(atoi(row[2])) : -1;
e.count = row[3] ? static_cast<uint16_t>(strtoul(row[3], nullptr, 10)) : 0;
e.assassinate_count = row[4] ? static_cast<uint16_t>(strtoul(row[4], nullptr, 10)) : 0;
e.status = row[5] ? static_cast<uint8_t>(strtoul(row[5], nullptr, 10)) : 0;
e.time_created = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
e.time_zoned = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
e.time_completed = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -330,15 +331,15 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
AdventureDetails e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.adventure_id = static_cast<uint16_t>(strtoul(row[1], nullptr, 10));
e.instance_id = static_cast<int32_t>(atoi(row[2]));
e.count = static_cast<uint16_t>(strtoul(row[3], nullptr, 10));
e.assassinate_count = static_cast<uint16_t>(strtoul(row[4], nullptr, 10));
e.status = static_cast<uint8_t>(strtoul(row[5], nullptr, 10));
e.time_created = static_cast<uint32_t>(strtoul(row[6], nullptr, 10));
e.time_zoned = static_cast<uint32_t>(strtoul(row[7], nullptr, 10));
e.time_completed = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.adventure_id = row[1] ? static_cast<uint16_t>(strtoul(row[1], nullptr, 10)) : 0;
e.instance_id = row[2] ? static_cast<int32_t>(atoi(row[2])) : -1;
e.count = row[3] ? static_cast<uint16_t>(strtoul(row[3], nullptr, 10)) : 0;
e.assassinate_count = row[4] ? static_cast<uint16_t>(strtoul(row[4], nullptr, 10)) : 0;
e.status = row[5] ? static_cast<uint8_t>(strtoul(row[5], nullptr, 10)) : 0;
e.time_created = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
e.time_zoned = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
e.time_completed = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -397,6 +398,78 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const AdventureDetails &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back(std::to_string(e.adventure_id));
v.push_back(std::to_string(e.instance_id));
v.push_back(std::to_string(e.count));
v.push_back(std::to_string(e.assassinate_count));
v.push_back(std::to_string(e.status));
v.push_back(std::to_string(e.time_created));
v.push_back(std::to_string(e.time_zoned));
v.push_back(std::to_string(e.time_completed));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<AdventureDetails> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back(std::to_string(e.adventure_id));
v.push_back(std::to_string(e.instance_id));
v.push_back(std::to_string(e.count));
v.push_back(std::to_string(e.assassinate_count));
v.push_back(std::to_string(e.status));
v.push_back(std::to_string(e.time_created));
v.push_back(std::to_string(e.time_zoned));
v.push_back(std::to_string(e.time_completed));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_ADVENTURE_DETAILS_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_ADVENTURE_MEMBERS_REPOSITORY_H
@@ -108,8 +108,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
adventure_members_id
)
);
@@ -118,8 +119,8 @@ public:
if (results.RowCount() == 1) {
AdventureMembers e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.charid = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.charid = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
return e;
}
@@ -242,8 +243,8 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
AdventureMembers e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.charid = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.charid = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -268,8 +269,8 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
AdventureMembers e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.charid = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.charid = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -328,6 +329,64 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const AdventureMembers &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back(std::to_string(e.charid));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<AdventureMembers> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back(std::to_string(e.charid));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_ADVENTURE_MEMBERS_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_ADVENTURE_STATS_REPOSITORY_H
@@ -144,8 +144,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
adventure_stats_id
)
);
@@ -154,17 +155,17 @@ public:
if (results.RowCount() == 1) {
AdventureStats e{};
e.player_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.guk_wins = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.mir_wins = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.mmc_wins = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.ruj_wins = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
e.tak_wins = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
e.guk_losses = static_cast<uint32_t>(strtoul(row[6], nullptr, 10));
e.mir_losses = static_cast<uint32_t>(strtoul(row[7], nullptr, 10));
e.mmc_losses = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
e.ruj_losses = static_cast<uint32_t>(strtoul(row[9], nullptr, 10));
e.tak_losses = static_cast<uint32_t>(strtoul(row[10], nullptr, 10));
e.player_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.guk_wins = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.mir_wins = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.mmc_wins = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.ruj_wins = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
e.tak_wins = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
e.guk_losses = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
e.mir_losses = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
e.mmc_losses = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
e.ruj_losses = row[9] ? static_cast<uint32_t>(strtoul(row[9], nullptr, 10)) : 0;
e.tak_losses = row[10] ? static_cast<uint32_t>(strtoul(row[10], nullptr, 10)) : 0;
return e;
}
@@ -314,17 +315,17 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
AdventureStats e{};
e.player_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.guk_wins = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.mir_wins = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.mmc_wins = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.ruj_wins = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
e.tak_wins = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
e.guk_losses = static_cast<uint32_t>(strtoul(row[6], nullptr, 10));
e.mir_losses = static_cast<uint32_t>(strtoul(row[7], nullptr, 10));
e.mmc_losses = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
e.ruj_losses = static_cast<uint32_t>(strtoul(row[9], nullptr, 10));
e.tak_losses = static_cast<uint32_t>(strtoul(row[10], nullptr, 10));
e.player_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.guk_wins = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.mir_wins = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.mmc_wins = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.ruj_wins = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
e.tak_wins = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
e.guk_losses = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
e.mir_losses = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
e.mmc_losses = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
e.ruj_losses = row[9] ? static_cast<uint32_t>(strtoul(row[9], nullptr, 10)) : 0;
e.tak_losses = row[10] ? static_cast<uint32_t>(strtoul(row[10], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -349,17 +350,17 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
AdventureStats e{};
e.player_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.guk_wins = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.mir_wins = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.mmc_wins = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.ruj_wins = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
e.tak_wins = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
e.guk_losses = static_cast<uint32_t>(strtoul(row[6], nullptr, 10));
e.mir_losses = static_cast<uint32_t>(strtoul(row[7], nullptr, 10));
e.mmc_losses = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
e.ruj_losses = static_cast<uint32_t>(strtoul(row[9], nullptr, 10));
e.tak_losses = static_cast<uint32_t>(strtoul(row[10], nullptr, 10));
e.player_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.guk_wins = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.mir_wins = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.mmc_wins = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.ruj_wins = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
e.tak_wins = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
e.guk_losses = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
e.mir_losses = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
e.mmc_losses = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
e.ruj_losses = row[9] ? static_cast<uint32_t>(strtoul(row[9], nullptr, 10)) : 0;
e.tak_losses = row[10] ? static_cast<uint32_t>(strtoul(row[10], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -418,6 +419,82 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const AdventureStats &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.player_id));
v.push_back(std::to_string(e.guk_wins));
v.push_back(std::to_string(e.mir_wins));
v.push_back(std::to_string(e.mmc_wins));
v.push_back(std::to_string(e.ruj_wins));
v.push_back(std::to_string(e.tak_wins));
v.push_back(std::to_string(e.guk_losses));
v.push_back(std::to_string(e.mir_losses));
v.push_back(std::to_string(e.mmc_losses));
v.push_back(std::to_string(e.ruj_losses));
v.push_back(std::to_string(e.tak_losses));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<AdventureStats> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.player_id));
v.push_back(std::to_string(e.guk_wins));
v.push_back(std::to_string(e.mir_wins));
v.push_back(std::to_string(e.mmc_wins));
v.push_back(std::to_string(e.ruj_wins));
v.push_back(std::to_string(e.tak_wins));
v.push_back(std::to_string(e.guk_losses));
v.push_back(std::to_string(e.mir_losses));
v.push_back(std::to_string(e.mmc_losses));
v.push_back(std::to_string(e.ruj_losses));
v.push_back(std::to_string(e.tak_losses));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_ADVENTURE_STATS_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_ADVENTURE_TEMPLATE_ENTRY_FLAVOR_REPOSITORY_H
@@ -108,8 +108,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
adventure_template_entry_flavor_id
)
);
@@ -118,7 +119,7 @@ public:
if (results.RowCount() == 1) {
AdventureTemplateEntryFlavor e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.text = row[1] ? row[1] : "";
return e;
@@ -242,7 +243,7 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
AdventureTemplateEntryFlavor e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.text = row[1] ? row[1] : "";
all_entries.push_back(e);
@@ -268,7 +269,7 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
AdventureTemplateEntryFlavor e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.text = row[1] ? row[1] : "";
all_entries.push_back(e);
@@ -328,6 +329,64 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const AdventureTemplateEntryFlavor &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back("'" + Strings::Escape(e.text) + "'");
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<AdventureTemplateEntryFlavor> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back("'" + Strings::Escape(e.text) + "'");
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_ADVENTURE_TEMPLATE_ENTRY_FLAVOR_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_ADVENTURE_TEMPLATE_ENTRY_REPOSITORY_H
@@ -108,8 +108,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
adventure_template_entry_id
)
);
@@ -118,8 +119,8 @@ public:
if (results.RowCount() == 1) {
AdventureTemplateEntry e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.template_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.template_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
return e;
}
@@ -242,8 +243,8 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
AdventureTemplateEntry e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.template_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.template_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -268,8 +269,8 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
AdventureTemplateEntry e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.template_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.template_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -328,6 +329,64 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const AdventureTemplateEntry &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back(std::to_string(e.template_id));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<AdventureTemplateEntry> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back(std::to_string(e.template_id));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_ADVENTURE_TEMPLATE_ENTRY_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_ADVENTURE_TEMPLATE_REPOSITORY_H
@@ -232,8 +232,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
adventure_template_id
)
);
@@ -242,38 +243,38 @@ public:
if (results.RowCount() == 1) {
AdventureTemplate e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.zone = row[1] ? row[1] : "";
e.zone_version = static_cast<uint8_t>(strtoul(row[2], nullptr, 10));
e.is_hard = static_cast<uint8_t>(strtoul(row[3], nullptr, 10));
e.is_raid = static_cast<uint8_t>(strtoul(row[4], nullptr, 10));
e.min_level = static_cast<uint8_t>(strtoul(row[5], nullptr, 10));
e.max_level = static_cast<uint8_t>(strtoul(row[6], nullptr, 10));
e.type = static_cast<uint8_t>(strtoul(row[7], nullptr, 10));
e.type_data = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
e.type_count = static_cast<uint16_t>(strtoul(row[9], nullptr, 10));
e.assa_x = strtof(row[10], nullptr);
e.assa_y = strtof(row[11], nullptr);
e.assa_z = strtof(row[12], nullptr);
e.assa_h = strtof(row[13], nullptr);
e.zone_version = row[2] ? static_cast<uint8_t>(strtoul(row[2], nullptr, 10)) : 0;
e.is_hard = row[3] ? static_cast<uint8_t>(strtoul(row[3], nullptr, 10)) : 0;
e.is_raid = row[4] ? static_cast<uint8_t>(strtoul(row[4], nullptr, 10)) : 0;
e.min_level = row[5] ? static_cast<uint8_t>(strtoul(row[5], nullptr, 10)) : 1;
e.max_level = row[6] ? static_cast<uint8_t>(strtoul(row[6], nullptr, 10)) : 65;
e.type = row[7] ? static_cast<uint8_t>(strtoul(row[7], nullptr, 10)) : 0;
e.type_data = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
e.type_count = row[9] ? static_cast<uint16_t>(strtoul(row[9], nullptr, 10)) : 0;
e.assa_x = row[10] ? strtof(row[10], nullptr) : 0;
e.assa_y = row[11] ? strtof(row[11], nullptr) : 0;
e.assa_z = row[12] ? strtof(row[12], nullptr) : 0;
e.assa_h = row[13] ? strtof(row[13], nullptr) : 0;
e.text = row[14] ? row[14] : "";
e.duration = static_cast<uint32_t>(strtoul(row[15], nullptr, 10));
e.zone_in_time = static_cast<uint32_t>(strtoul(row[16], nullptr, 10));
e.win_points = static_cast<uint16_t>(strtoul(row[17], nullptr, 10));
e.lose_points = static_cast<uint16_t>(strtoul(row[18], nullptr, 10));
e.theme = static_cast<uint8_t>(strtoul(row[19], nullptr, 10));
e.zone_in_zone_id = static_cast<uint16_t>(strtoul(row[20], nullptr, 10));
e.zone_in_x = strtof(row[21], nullptr);
e.zone_in_y = strtof(row[22], nullptr);
e.zone_in_object_id = static_cast<int16_t>(atoi(row[23]));
e.dest_x = strtof(row[24], nullptr);
e.dest_y = strtof(row[25], nullptr);
e.dest_z = strtof(row[26], nullptr);
e.dest_h = strtof(row[27], nullptr);
e.graveyard_zone_id = static_cast<uint32_t>(strtoul(row[28], nullptr, 10));
e.graveyard_x = strtof(row[29], nullptr);
e.graveyard_y = strtof(row[30], nullptr);
e.graveyard_z = strtof(row[31], nullptr);
e.duration = row[15] ? static_cast<uint32_t>(strtoul(row[15], nullptr, 10)) : 7200;
e.zone_in_time = row[16] ? static_cast<uint32_t>(strtoul(row[16], nullptr, 10)) : 1800;
e.win_points = row[17] ? static_cast<uint16_t>(strtoul(row[17], nullptr, 10)) : 0;
e.lose_points = row[18] ? static_cast<uint16_t>(strtoul(row[18], nullptr, 10)) : 0;
e.theme = row[19] ? static_cast<uint8_t>(strtoul(row[19], nullptr, 10)) : 1;
e.zone_in_zone_id = row[20] ? static_cast<uint16_t>(strtoul(row[20], nullptr, 10)) : 0;
e.zone_in_x = row[21] ? strtof(row[21], nullptr) : 0;
e.zone_in_y = row[22] ? strtof(row[22], nullptr) : 0;
e.zone_in_object_id = row[23] ? static_cast<int16_t>(atoi(row[23])) : 0;
e.dest_x = row[24] ? strtof(row[24], nullptr) : 0;
e.dest_y = row[25] ? strtof(row[25], nullptr) : 0;
e.dest_z = row[26] ? strtof(row[26], nullptr) : 0;
e.dest_h = row[27] ? strtof(row[27], nullptr) : 0;
e.graveyard_zone_id = row[28] ? static_cast<uint32_t>(strtoul(row[28], nullptr, 10)) : 0;
e.graveyard_x = row[29] ? strtof(row[29], nullptr) : 0;
e.graveyard_y = row[30] ? strtof(row[30], nullptr) : 0;
e.graveyard_z = row[31] ? strtof(row[31], nullptr) : 0;
return e;
}
@@ -489,38 +490,38 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
AdventureTemplate e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.zone = row[1] ? row[1] : "";
e.zone_version = static_cast<uint8_t>(strtoul(row[2], nullptr, 10));
e.is_hard = static_cast<uint8_t>(strtoul(row[3], nullptr, 10));
e.is_raid = static_cast<uint8_t>(strtoul(row[4], nullptr, 10));
e.min_level = static_cast<uint8_t>(strtoul(row[5], nullptr, 10));
e.max_level = static_cast<uint8_t>(strtoul(row[6], nullptr, 10));
e.type = static_cast<uint8_t>(strtoul(row[7], nullptr, 10));
e.type_data = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
e.type_count = static_cast<uint16_t>(strtoul(row[9], nullptr, 10));
e.assa_x = strtof(row[10], nullptr);
e.assa_y = strtof(row[11], nullptr);
e.assa_z = strtof(row[12], nullptr);
e.assa_h = strtof(row[13], nullptr);
e.zone_version = row[2] ? static_cast<uint8_t>(strtoul(row[2], nullptr, 10)) : 0;
e.is_hard = row[3] ? static_cast<uint8_t>(strtoul(row[3], nullptr, 10)) : 0;
e.is_raid = row[4] ? static_cast<uint8_t>(strtoul(row[4], nullptr, 10)) : 0;
e.min_level = row[5] ? static_cast<uint8_t>(strtoul(row[5], nullptr, 10)) : 1;
e.max_level = row[6] ? static_cast<uint8_t>(strtoul(row[6], nullptr, 10)) : 65;
e.type = row[7] ? static_cast<uint8_t>(strtoul(row[7], nullptr, 10)) : 0;
e.type_data = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
e.type_count = row[9] ? static_cast<uint16_t>(strtoul(row[9], nullptr, 10)) : 0;
e.assa_x = row[10] ? strtof(row[10], nullptr) : 0;
e.assa_y = row[11] ? strtof(row[11], nullptr) : 0;
e.assa_z = row[12] ? strtof(row[12], nullptr) : 0;
e.assa_h = row[13] ? strtof(row[13], nullptr) : 0;
e.text = row[14] ? row[14] : "";
e.duration = static_cast<uint32_t>(strtoul(row[15], nullptr, 10));
e.zone_in_time = static_cast<uint32_t>(strtoul(row[16], nullptr, 10));
e.win_points = static_cast<uint16_t>(strtoul(row[17], nullptr, 10));
e.lose_points = static_cast<uint16_t>(strtoul(row[18], nullptr, 10));
e.theme = static_cast<uint8_t>(strtoul(row[19], nullptr, 10));
e.zone_in_zone_id = static_cast<uint16_t>(strtoul(row[20], nullptr, 10));
e.zone_in_x = strtof(row[21], nullptr);
e.zone_in_y = strtof(row[22], nullptr);
e.zone_in_object_id = static_cast<int16_t>(atoi(row[23]));
e.dest_x = strtof(row[24], nullptr);
e.dest_y = strtof(row[25], nullptr);
e.dest_z = strtof(row[26], nullptr);
e.dest_h = strtof(row[27], nullptr);
e.graveyard_zone_id = static_cast<uint32_t>(strtoul(row[28], nullptr, 10));
e.graveyard_x = strtof(row[29], nullptr);
e.graveyard_y = strtof(row[30], nullptr);
e.graveyard_z = strtof(row[31], nullptr);
e.duration = row[15] ? static_cast<uint32_t>(strtoul(row[15], nullptr, 10)) : 7200;
e.zone_in_time = row[16] ? static_cast<uint32_t>(strtoul(row[16], nullptr, 10)) : 1800;
e.win_points = row[17] ? static_cast<uint16_t>(strtoul(row[17], nullptr, 10)) : 0;
e.lose_points = row[18] ? static_cast<uint16_t>(strtoul(row[18], nullptr, 10)) : 0;
e.theme = row[19] ? static_cast<uint8_t>(strtoul(row[19], nullptr, 10)) : 1;
e.zone_in_zone_id = row[20] ? static_cast<uint16_t>(strtoul(row[20], nullptr, 10)) : 0;
e.zone_in_x = row[21] ? strtof(row[21], nullptr) : 0;
e.zone_in_y = row[22] ? strtof(row[22], nullptr) : 0;
e.zone_in_object_id = row[23] ? static_cast<int16_t>(atoi(row[23])) : 0;
e.dest_x = row[24] ? strtof(row[24], nullptr) : 0;
e.dest_y = row[25] ? strtof(row[25], nullptr) : 0;
e.dest_z = row[26] ? strtof(row[26], nullptr) : 0;
e.dest_h = row[27] ? strtof(row[27], nullptr) : 0;
e.graveyard_zone_id = row[28] ? static_cast<uint32_t>(strtoul(row[28], nullptr, 10)) : 0;
e.graveyard_x = row[29] ? strtof(row[29], nullptr) : 0;
e.graveyard_y = row[30] ? strtof(row[30], nullptr) : 0;
e.graveyard_z = row[31] ? strtof(row[31], nullptr) : 0;
all_entries.push_back(e);
}
@@ -545,38 +546,38 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
AdventureTemplate e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.zone = row[1] ? row[1] : "";
e.zone_version = static_cast<uint8_t>(strtoul(row[2], nullptr, 10));
e.is_hard = static_cast<uint8_t>(strtoul(row[3], nullptr, 10));
e.is_raid = static_cast<uint8_t>(strtoul(row[4], nullptr, 10));
e.min_level = static_cast<uint8_t>(strtoul(row[5], nullptr, 10));
e.max_level = static_cast<uint8_t>(strtoul(row[6], nullptr, 10));
e.type = static_cast<uint8_t>(strtoul(row[7], nullptr, 10));
e.type_data = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
e.type_count = static_cast<uint16_t>(strtoul(row[9], nullptr, 10));
e.assa_x = strtof(row[10], nullptr);
e.assa_y = strtof(row[11], nullptr);
e.assa_z = strtof(row[12], nullptr);
e.assa_h = strtof(row[13], nullptr);
e.zone_version = row[2] ? static_cast<uint8_t>(strtoul(row[2], nullptr, 10)) : 0;
e.is_hard = row[3] ? static_cast<uint8_t>(strtoul(row[3], nullptr, 10)) : 0;
e.is_raid = row[4] ? static_cast<uint8_t>(strtoul(row[4], nullptr, 10)) : 0;
e.min_level = row[5] ? static_cast<uint8_t>(strtoul(row[5], nullptr, 10)) : 1;
e.max_level = row[6] ? static_cast<uint8_t>(strtoul(row[6], nullptr, 10)) : 65;
e.type = row[7] ? static_cast<uint8_t>(strtoul(row[7], nullptr, 10)) : 0;
e.type_data = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
e.type_count = row[9] ? static_cast<uint16_t>(strtoul(row[9], nullptr, 10)) : 0;
e.assa_x = row[10] ? strtof(row[10], nullptr) : 0;
e.assa_y = row[11] ? strtof(row[11], nullptr) : 0;
e.assa_z = row[12] ? strtof(row[12], nullptr) : 0;
e.assa_h = row[13] ? strtof(row[13], nullptr) : 0;
e.text = row[14] ? row[14] : "";
e.duration = static_cast<uint32_t>(strtoul(row[15], nullptr, 10));
e.zone_in_time = static_cast<uint32_t>(strtoul(row[16], nullptr, 10));
e.win_points = static_cast<uint16_t>(strtoul(row[17], nullptr, 10));
e.lose_points = static_cast<uint16_t>(strtoul(row[18], nullptr, 10));
e.theme = static_cast<uint8_t>(strtoul(row[19], nullptr, 10));
e.zone_in_zone_id = static_cast<uint16_t>(strtoul(row[20], nullptr, 10));
e.zone_in_x = strtof(row[21], nullptr);
e.zone_in_y = strtof(row[22], nullptr);
e.zone_in_object_id = static_cast<int16_t>(atoi(row[23]));
e.dest_x = strtof(row[24], nullptr);
e.dest_y = strtof(row[25], nullptr);
e.dest_z = strtof(row[26], nullptr);
e.dest_h = strtof(row[27], nullptr);
e.graveyard_zone_id = static_cast<uint32_t>(strtoul(row[28], nullptr, 10));
e.graveyard_x = strtof(row[29], nullptr);
e.graveyard_y = strtof(row[30], nullptr);
e.graveyard_z = strtof(row[31], nullptr);
e.duration = row[15] ? static_cast<uint32_t>(strtoul(row[15], nullptr, 10)) : 7200;
e.zone_in_time = row[16] ? static_cast<uint32_t>(strtoul(row[16], nullptr, 10)) : 1800;
e.win_points = row[17] ? static_cast<uint16_t>(strtoul(row[17], nullptr, 10)) : 0;
e.lose_points = row[18] ? static_cast<uint16_t>(strtoul(row[18], nullptr, 10)) : 0;
e.theme = row[19] ? static_cast<uint8_t>(strtoul(row[19], nullptr, 10)) : 1;
e.zone_in_zone_id = row[20] ? static_cast<uint16_t>(strtoul(row[20], nullptr, 10)) : 0;
e.zone_in_x = row[21] ? strtof(row[21], nullptr) : 0;
e.zone_in_y = row[22] ? strtof(row[22], nullptr) : 0;
e.zone_in_object_id = row[23] ? static_cast<int16_t>(atoi(row[23])) : 0;
e.dest_x = row[24] ? strtof(row[24], nullptr) : 0;
e.dest_y = row[25] ? strtof(row[25], nullptr) : 0;
e.dest_z = row[26] ? strtof(row[26], nullptr) : 0;
e.dest_h = row[27] ? strtof(row[27], nullptr) : 0;
e.graveyard_zone_id = row[28] ? static_cast<uint32_t>(strtoul(row[28], nullptr, 10)) : 0;
e.graveyard_x = row[29] ? strtof(row[29], nullptr) : 0;
e.graveyard_y = row[30] ? strtof(row[30], nullptr) : 0;
e.graveyard_z = row[31] ? strtof(row[31], nullptr) : 0;
all_entries.push_back(e);
}
@@ -635,6 +636,126 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const AdventureTemplate &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back("'" + Strings::Escape(e.zone) + "'");
v.push_back(std::to_string(e.zone_version));
v.push_back(std::to_string(e.is_hard));
v.push_back(std::to_string(e.is_raid));
v.push_back(std::to_string(e.min_level));
v.push_back(std::to_string(e.max_level));
v.push_back(std::to_string(e.type));
v.push_back(std::to_string(e.type_data));
v.push_back(std::to_string(e.type_count));
v.push_back(std::to_string(e.assa_x));
v.push_back(std::to_string(e.assa_y));
v.push_back(std::to_string(e.assa_z));
v.push_back(std::to_string(e.assa_h));
v.push_back("'" + Strings::Escape(e.text) + "'");
v.push_back(std::to_string(e.duration));
v.push_back(std::to_string(e.zone_in_time));
v.push_back(std::to_string(e.win_points));
v.push_back(std::to_string(e.lose_points));
v.push_back(std::to_string(e.theme));
v.push_back(std::to_string(e.zone_in_zone_id));
v.push_back(std::to_string(e.zone_in_x));
v.push_back(std::to_string(e.zone_in_y));
v.push_back(std::to_string(e.zone_in_object_id));
v.push_back(std::to_string(e.dest_x));
v.push_back(std::to_string(e.dest_y));
v.push_back(std::to_string(e.dest_z));
v.push_back(std::to_string(e.dest_h));
v.push_back(std::to_string(e.graveyard_zone_id));
v.push_back(std::to_string(e.graveyard_x));
v.push_back(std::to_string(e.graveyard_y));
v.push_back(std::to_string(e.graveyard_z));
v.push_back(std::to_string(e.graveyard_radius));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<AdventureTemplate> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back("'" + Strings::Escape(e.zone) + "'");
v.push_back(std::to_string(e.zone_version));
v.push_back(std::to_string(e.is_hard));
v.push_back(std::to_string(e.is_raid));
v.push_back(std::to_string(e.min_level));
v.push_back(std::to_string(e.max_level));
v.push_back(std::to_string(e.type));
v.push_back(std::to_string(e.type_data));
v.push_back(std::to_string(e.type_count));
v.push_back(std::to_string(e.assa_x));
v.push_back(std::to_string(e.assa_y));
v.push_back(std::to_string(e.assa_z));
v.push_back(std::to_string(e.assa_h));
v.push_back("'" + Strings::Escape(e.text) + "'");
v.push_back(std::to_string(e.duration));
v.push_back(std::to_string(e.zone_in_time));
v.push_back(std::to_string(e.win_points));
v.push_back(std::to_string(e.lose_points));
v.push_back(std::to_string(e.theme));
v.push_back(std::to_string(e.zone_in_zone_id));
v.push_back(std::to_string(e.zone_in_x));
v.push_back(std::to_string(e.zone_in_y));
v.push_back(std::to_string(e.zone_in_object_id));
v.push_back(std::to_string(e.dest_x));
v.push_back(std::to_string(e.dest_y));
v.push_back(std::to_string(e.dest_z));
v.push_back(std::to_string(e.dest_h));
v.push_back(std::to_string(e.graveyard_zone_id));
v.push_back(std::to_string(e.graveyard_x));
v.push_back(std::to_string(e.graveyard_y));
v.push_back(std::to_string(e.graveyard_z));
v.push_back(std::to_string(e.graveyard_radius));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_ADVENTURE_TEMPLATE_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_ALTERNATE_CURRENCY_REPOSITORY_H
@@ -108,8 +108,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
alternate_currency_id
)
);
@@ -118,8 +119,8 @@ public:
if (results.RowCount() == 1) {
AlternateCurrency e{};
e.id = static_cast<int32_t>(atoi(row[0]));
e.item_id = static_cast<int32_t>(atoi(row[1]));
e.id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.item_id = row[1] ? static_cast<int32_t>(atoi(row[1])) : 0;
return e;
}
@@ -242,8 +243,8 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
AlternateCurrency e{};
e.id = static_cast<int32_t>(atoi(row[0]));
e.item_id = static_cast<int32_t>(atoi(row[1]));
e.id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.item_id = row[1] ? static_cast<int32_t>(atoi(row[1])) : 0;
all_entries.push_back(e);
}
@@ -268,8 +269,8 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
AlternateCurrency e{};
e.id = static_cast<int32_t>(atoi(row[0]));
e.item_id = static_cast<int32_t>(atoi(row[1]));
e.id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.item_id = row[1] ? static_cast<int32_t>(atoi(row[1])) : 0;
all_entries.push_back(e);
}
@@ -328,6 +329,64 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const AlternateCurrency &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back(std::to_string(e.item_id));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<AlternateCurrency> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back(std::to_string(e.item_id));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_ALTERNATE_CURRENCY_REPOSITORY_H
+109 -32
View File
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_AURAS_REPOSITORY_H
@@ -144,8 +144,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
auras_id
)
);
@@ -154,17 +155,17 @@ public:
if (results.RowCount() == 1) {
Auras e{};
e.type = static_cast<int32_t>(atoi(row[0]));
e.npc_type = static_cast<int32_t>(atoi(row[1]));
e.type = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.npc_type = row[1] ? static_cast<int32_t>(atoi(row[1])) : 0;
e.name = row[2] ? row[2] : "";
e.spell_id = static_cast<int32_t>(atoi(row[3]));
e.distance = static_cast<int32_t>(atoi(row[4]));
e.aura_type = static_cast<int32_t>(atoi(row[5]));
e.spawn_type = static_cast<int32_t>(atoi(row[6]));
e.movement = static_cast<int32_t>(atoi(row[7]));
e.duration = static_cast<int32_t>(atoi(row[8]));
e.icon = static_cast<int32_t>(atoi(row[9]));
e.cast_time = static_cast<int32_t>(atoi(row[10]));
e.spell_id = row[3] ? static_cast<int32_t>(atoi(row[3])) : 0;
e.distance = row[4] ? static_cast<int32_t>(atoi(row[4])) : 60;
e.aura_type = row[5] ? static_cast<int32_t>(atoi(row[5])) : 1;
e.spawn_type = row[6] ? static_cast<int32_t>(atoi(row[6])) : 0;
e.movement = row[7] ? static_cast<int32_t>(atoi(row[7])) : 0;
e.duration = row[8] ? static_cast<int32_t>(atoi(row[8])) : 5400;
e.icon = row[9] ? static_cast<int32_t>(atoi(row[9])) : -1;
e.cast_time = row[10] ? static_cast<int32_t>(atoi(row[10])) : 0;
return e;
}
@@ -314,17 +315,17 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
Auras e{};
e.type = static_cast<int32_t>(atoi(row[0]));
e.npc_type = static_cast<int32_t>(atoi(row[1]));
e.type = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.npc_type = row[1] ? static_cast<int32_t>(atoi(row[1])) : 0;
e.name = row[2] ? row[2] : "";
e.spell_id = static_cast<int32_t>(atoi(row[3]));
e.distance = static_cast<int32_t>(atoi(row[4]));
e.aura_type = static_cast<int32_t>(atoi(row[5]));
e.spawn_type = static_cast<int32_t>(atoi(row[6]));
e.movement = static_cast<int32_t>(atoi(row[7]));
e.duration = static_cast<int32_t>(atoi(row[8]));
e.icon = static_cast<int32_t>(atoi(row[9]));
e.cast_time = static_cast<int32_t>(atoi(row[10]));
e.spell_id = row[3] ? static_cast<int32_t>(atoi(row[3])) : 0;
e.distance = row[4] ? static_cast<int32_t>(atoi(row[4])) : 60;
e.aura_type = row[5] ? static_cast<int32_t>(atoi(row[5])) : 1;
e.spawn_type = row[6] ? static_cast<int32_t>(atoi(row[6])) : 0;
e.movement = row[7] ? static_cast<int32_t>(atoi(row[7])) : 0;
e.duration = row[8] ? static_cast<int32_t>(atoi(row[8])) : 5400;
e.icon = row[9] ? static_cast<int32_t>(atoi(row[9])) : -1;
e.cast_time = row[10] ? static_cast<int32_t>(atoi(row[10])) : 0;
all_entries.push_back(e);
}
@@ -349,17 +350,17 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
Auras e{};
e.type = static_cast<int32_t>(atoi(row[0]));
e.npc_type = static_cast<int32_t>(atoi(row[1]));
e.type = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.npc_type = row[1] ? static_cast<int32_t>(atoi(row[1])) : 0;
e.name = row[2] ? row[2] : "";
e.spell_id = static_cast<int32_t>(atoi(row[3]));
e.distance = static_cast<int32_t>(atoi(row[4]));
e.aura_type = static_cast<int32_t>(atoi(row[5]));
e.spawn_type = static_cast<int32_t>(atoi(row[6]));
e.movement = static_cast<int32_t>(atoi(row[7]));
e.duration = static_cast<int32_t>(atoi(row[8]));
e.icon = static_cast<int32_t>(atoi(row[9]));
e.cast_time = static_cast<int32_t>(atoi(row[10]));
e.spell_id = row[3] ? static_cast<int32_t>(atoi(row[3])) : 0;
e.distance = row[4] ? static_cast<int32_t>(atoi(row[4])) : 60;
e.aura_type = row[5] ? static_cast<int32_t>(atoi(row[5])) : 1;
e.spawn_type = row[6] ? static_cast<int32_t>(atoi(row[6])) : 0;
e.movement = row[7] ? static_cast<int32_t>(atoi(row[7])) : 0;
e.duration = row[8] ? static_cast<int32_t>(atoi(row[8])) : 5400;
e.icon = row[9] ? static_cast<int32_t>(atoi(row[9])) : -1;
e.cast_time = row[10] ? static_cast<int32_t>(atoi(row[10])) : 0;
all_entries.push_back(e);
}
@@ -418,6 +419,82 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const Auras &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.type));
v.push_back(std::to_string(e.npc_type));
v.push_back("'" + Strings::Escape(e.name) + "'");
v.push_back(std::to_string(e.spell_id));
v.push_back(std::to_string(e.distance));
v.push_back(std::to_string(e.aura_type));
v.push_back(std::to_string(e.spawn_type));
v.push_back(std::to_string(e.movement));
v.push_back(std::to_string(e.duration));
v.push_back(std::to_string(e.icon));
v.push_back(std::to_string(e.cast_time));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<Auras> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.type));
v.push_back(std::to_string(e.npc_type));
v.push_back("'" + Strings::Escape(e.name) + "'");
v.push_back(std::to_string(e.spell_id));
v.push_back(std::to_string(e.distance));
v.push_back(std::to_string(e.aura_type));
v.push_back(std::to_string(e.spawn_type));
v.push_back(std::to_string(e.movement));
v.push_back(std::to_string(e.duration));
v.push_back(std::to_string(e.icon));
v.push_back(std::to_string(e.cast_time));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_AURAS_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_BASE_DATA_REPOSITORY_H
@@ -19,16 +19,16 @@
class BaseBaseDataRepository {
public:
struct BaseData {
uint32_t level;
uint32_t class_;
double hp;
double mana;
double end;
double unk1;
double unk2;
double hp_fac;
double mana_fac;
double end_fac;
uint8_t level;
uint8_t class_;
double hp;
double mana;
double end;
double hp_regen;
double end_regen;
double hp_fac;
double mana_fac;
double end_fac;
};
static std::string PrimaryKey()
@@ -44,8 +44,8 @@ public:
"hp",
"mana",
"end",
"unk1",
"unk2",
"hp_regen",
"end_regen",
"hp_fac",
"mana_fac",
"end_fac",
@@ -60,8 +60,8 @@ public:
"hp",
"mana",
"end",
"unk1",
"unk2",
"hp_regen",
"end_regen",
"hp_fac",
"mana_fac",
"end_fac",
@@ -105,16 +105,16 @@ public:
{
BaseData e{};
e.level = 0;
e.class_ = 0;
e.hp = 0;
e.mana = 0;
e.end = 0;
e.unk1 = 0;
e.unk2 = 0;
e.hp_fac = 0;
e.mana_fac = 0;
e.end_fac = 0;
e.level = 0;
e.class_ = 0;
e.hp = 0;
e.mana = 0;
e.end = 0;
e.hp_regen = 0;
e.end_regen = 0;
e.hp_fac = 0;
e.mana_fac = 0;
e.end_fac = 0;
return e;
}
@@ -140,8 +140,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
base_data_id
)
);
@@ -150,16 +151,16 @@ public:
if (results.RowCount() == 1) {
BaseData e{};
e.level = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.class_ = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.hp = strtod(row[2], nullptr);
e.mana = strtod(row[3], nullptr);
e.end = strtod(row[4], nullptr);
e.unk1 = strtod(row[5], nullptr);
e.unk2 = strtod(row[6], nullptr);
e.hp_fac = strtod(row[7], nullptr);
e.mana_fac = strtod(row[8], nullptr);
e.end_fac = strtod(row[9], nullptr);
e.level = row[0] ? static_cast<uint8_t>(strtoul(row[0], nullptr, 10)) : 0;
e.class_ = row[1] ? static_cast<uint8_t>(strtoul(row[1], nullptr, 10)) : 0;
e.hp = row[2] ? strtod(row[2], nullptr) : 0;
e.mana = row[3] ? strtod(row[3], nullptr) : 0;
e.end = row[4] ? strtod(row[4], nullptr) : 0;
e.hp_regen = row[5] ? strtod(row[5], nullptr) : 0;
e.end_regen = row[6] ? strtod(row[6], nullptr) : 0;
e.hp_fac = row[7] ? strtod(row[7], nullptr) : 0;
e.mana_fac = row[8] ? strtod(row[8], nullptr) : 0;
e.end_fac = row[9] ? strtod(row[9], nullptr) : 0;
return e;
}
@@ -198,8 +199,8 @@ public:
v.push_back(columns[2] + " = " + std::to_string(e.hp));
v.push_back(columns[3] + " = " + std::to_string(e.mana));
v.push_back(columns[4] + " = " + std::to_string(e.end));
v.push_back(columns[5] + " = " + std::to_string(e.unk1));
v.push_back(columns[6] + " = " + std::to_string(e.unk2));
v.push_back(columns[5] + " = " + std::to_string(e.hp_regen));
v.push_back(columns[6] + " = " + std::to_string(e.end_regen));
v.push_back(columns[7] + " = " + std::to_string(e.hp_fac));
v.push_back(columns[8] + " = " + std::to_string(e.mana_fac));
v.push_back(columns[9] + " = " + std::to_string(e.end_fac));
@@ -229,8 +230,8 @@ public:
v.push_back(std::to_string(e.hp));
v.push_back(std::to_string(e.mana));
v.push_back(std::to_string(e.end));
v.push_back(std::to_string(e.unk1));
v.push_back(std::to_string(e.unk2));
v.push_back(std::to_string(e.hp_regen));
v.push_back(std::to_string(e.end_regen));
v.push_back(std::to_string(e.hp_fac));
v.push_back(std::to_string(e.mana_fac));
v.push_back(std::to_string(e.end_fac));
@@ -268,8 +269,8 @@ public:
v.push_back(std::to_string(e.hp));
v.push_back(std::to_string(e.mana));
v.push_back(std::to_string(e.end));
v.push_back(std::to_string(e.unk1));
v.push_back(std::to_string(e.unk2));
v.push_back(std::to_string(e.hp_regen));
v.push_back(std::to_string(e.end_regen));
v.push_back(std::to_string(e.hp_fac));
v.push_back(std::to_string(e.mana_fac));
v.push_back(std::to_string(e.end_fac));
@@ -306,16 +307,16 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BaseData e{};
e.level = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.class_ = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.hp = strtod(row[2], nullptr);
e.mana = strtod(row[3], nullptr);
e.end = strtod(row[4], nullptr);
e.unk1 = strtod(row[5], nullptr);
e.unk2 = strtod(row[6], nullptr);
e.hp_fac = strtod(row[7], nullptr);
e.mana_fac = strtod(row[8], nullptr);
e.end_fac = strtod(row[9], nullptr);
e.level = row[0] ? static_cast<uint8_t>(strtoul(row[0], nullptr, 10)) : 0;
e.class_ = row[1] ? static_cast<uint8_t>(strtoul(row[1], nullptr, 10)) : 0;
e.hp = row[2] ? strtod(row[2], nullptr) : 0;
e.mana = row[3] ? strtod(row[3], nullptr) : 0;
e.end = row[4] ? strtod(row[4], nullptr) : 0;
e.hp_regen = row[5] ? strtod(row[5], nullptr) : 0;
e.end_regen = row[6] ? strtod(row[6], nullptr) : 0;
e.hp_fac = row[7] ? strtod(row[7], nullptr) : 0;
e.mana_fac = row[8] ? strtod(row[8], nullptr) : 0;
e.end_fac = row[9] ? strtod(row[9], nullptr) : 0;
all_entries.push_back(e);
}
@@ -340,16 +341,16 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BaseData e{};
e.level = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.class_ = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.hp = strtod(row[2], nullptr);
e.mana = strtod(row[3], nullptr);
e.end = strtod(row[4], nullptr);
e.unk1 = strtod(row[5], nullptr);
e.unk2 = strtod(row[6], nullptr);
e.hp_fac = strtod(row[7], nullptr);
e.mana_fac = strtod(row[8], nullptr);
e.end_fac = strtod(row[9], nullptr);
e.level = row[0] ? static_cast<uint8_t>(strtoul(row[0], nullptr, 10)) : 0;
e.class_ = row[1] ? static_cast<uint8_t>(strtoul(row[1], nullptr, 10)) : 0;
e.hp = row[2] ? strtod(row[2], nullptr) : 0;
e.mana = row[3] ? strtod(row[3], nullptr) : 0;
e.end = row[4] ? strtod(row[4], nullptr) : 0;
e.hp_regen = row[5] ? strtod(row[5], nullptr) : 0;
e.end_regen = row[6] ? strtod(row[6], nullptr) : 0;
e.hp_fac = row[7] ? strtod(row[7], nullptr) : 0;
e.mana_fac = row[8] ? strtod(row[8], nullptr) : 0;
e.end_fac = row[9] ? strtod(row[9], nullptr) : 0;
all_entries.push_back(e);
}
@@ -408,6 +409,80 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const BaseData &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.level));
v.push_back(std::to_string(e.class_));
v.push_back(std::to_string(e.hp));
v.push_back(std::to_string(e.mana));
v.push_back(std::to_string(e.end));
v.push_back(std::to_string(e.hp_regen));
v.push_back(std::to_string(e.end_regen));
v.push_back(std::to_string(e.hp_fac));
v.push_back(std::to_string(e.mana_fac));
v.push_back(std::to_string(e.end_fac));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<BaseData> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.level));
v.push_back(std::to_string(e.class_));
v.push_back(std::to_string(e.hp));
v.push_back(std::to_string(e.mana));
v.push_back(std::to_string(e.end));
v.push_back(std::to_string(e.hp_regen));
v.push_back(std::to_string(e.end_regen));
v.push_back(std::to_string(e.hp_fac));
v.push_back(std::to_string(e.mana_fac));
v.push_back(std::to_string(e.end_fac));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_BASE_DATA_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_BLOCKED_SPELLS_REPOSITORY_H
@@ -16,7 +16,6 @@
#include "../../strings.h"
#include <ctime>
class BaseBlockedSpellsRepository {
public:
struct BlockedSpells {
@@ -176,20 +175,20 @@ public:
if (results.RowCount() == 1) {
BlockedSpells e{};
e.id = static_cast<int32_t>(atoi(row[0]));
e.spellid = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.type = static_cast<int8_t>(atoi(row[2]));
e.zoneid = static_cast<int32_t>(atoi(row[3]));
e.x = strtof(row[4], nullptr);
e.y = strtof(row[5], nullptr);
e.z = strtof(row[6], nullptr);
e.x_diff = strtof(row[7], nullptr);
e.y_diff = strtof(row[8], nullptr);
e.z_diff = strtof(row[9], nullptr);
e.id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.spellid = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.type = row[2] ? static_cast<int8_t>(atoi(row[2])) : 0;
e.zoneid = row[3] ? static_cast<int32_t>(atoi(row[3])) : 0;
e.x = row[4] ? strtof(row[4], nullptr) : 0;
e.y = row[5] ? strtof(row[5], nullptr) : 0;
e.z = row[6] ? strtof(row[6], nullptr) : 0;
e.x_diff = row[7] ? strtof(row[7], nullptr) : 0;
e.y_diff = row[8] ? strtof(row[8], nullptr) : 0;
e.z_diff = row[9] ? strtof(row[9], nullptr) : 0;
e.message = row[10] ? row[10] : "";
e.description = row[11] ? row[11] : "";
e.min_expansion = static_cast<int8_t>(atoi(row[12]));
e.max_expansion = static_cast<int8_t>(atoi(row[13]));
e.min_expansion = row[12] ? static_cast<int8_t>(atoi(row[12])) : -1;
e.max_expansion = row[13] ? static_cast<int8_t>(atoi(row[13])) : -1;
e.content_flags = row[14] ? row[14] : "";
e.content_flags_disabled = row[15] ? row[15] : "";
@@ -355,20 +354,20 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BlockedSpells e{};
e.id = static_cast<int32_t>(atoi(row[0]));
e.spellid = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.type = static_cast<int8_t>(atoi(row[2]));
e.zoneid = static_cast<int32_t>(atoi(row[3]));
e.x = strtof(row[4], nullptr);
e.y = strtof(row[5], nullptr);
e.z = strtof(row[6], nullptr);
e.x_diff = strtof(row[7], nullptr);
e.y_diff = strtof(row[8], nullptr);
e.z_diff = strtof(row[9], nullptr);
e.id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.spellid = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.type = row[2] ? static_cast<int8_t>(atoi(row[2])) : 0;
e.zoneid = row[3] ? static_cast<int32_t>(atoi(row[3])) : 0;
e.x = row[4] ? strtof(row[4], nullptr) : 0;
e.y = row[5] ? strtof(row[5], nullptr) : 0;
e.z = row[6] ? strtof(row[6], nullptr) : 0;
e.x_diff = row[7] ? strtof(row[7], nullptr) : 0;
e.y_diff = row[8] ? strtof(row[8], nullptr) : 0;
e.z_diff = row[9] ? strtof(row[9], nullptr) : 0;
e.message = row[10] ? row[10] : "";
e.description = row[11] ? row[11] : "";
e.min_expansion = static_cast<int8_t>(atoi(row[12]));
e.max_expansion = static_cast<int8_t>(atoi(row[13]));
e.min_expansion = row[12] ? static_cast<int8_t>(atoi(row[12])) : -1;
e.max_expansion = row[13] ? static_cast<int8_t>(atoi(row[13])) : -1;
e.content_flags = row[14] ? row[14] : "";
e.content_flags_disabled = row[15] ? row[15] : "";
@@ -395,20 +394,20 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BlockedSpells e{};
e.id = static_cast<int32_t>(atoi(row[0]));
e.spellid = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.type = static_cast<int8_t>(atoi(row[2]));
e.zoneid = static_cast<int32_t>(atoi(row[3]));
e.x = strtof(row[4], nullptr);
e.y = strtof(row[5], nullptr);
e.z = strtof(row[6], nullptr);
e.x_diff = strtof(row[7], nullptr);
e.y_diff = strtof(row[8], nullptr);
e.z_diff = strtof(row[9], nullptr);
e.id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.spellid = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.type = row[2] ? static_cast<int8_t>(atoi(row[2])) : 0;
e.zoneid = row[3] ? static_cast<int32_t>(atoi(row[3])) : 0;
e.x = row[4] ? strtof(row[4], nullptr) : 0;
e.y = row[5] ? strtof(row[5], nullptr) : 0;
e.z = row[6] ? strtof(row[6], nullptr) : 0;
e.x_diff = row[7] ? strtof(row[7], nullptr) : 0;
e.y_diff = row[8] ? strtof(row[8], nullptr) : 0;
e.z_diff = row[9] ? strtof(row[9], nullptr) : 0;
e.message = row[10] ? row[10] : "";
e.description = row[11] ? row[11] : "";
e.min_expansion = static_cast<int8_t>(atoi(row[12]));
e.max_expansion = static_cast<int8_t>(atoi(row[13]));
e.min_expansion = row[12] ? static_cast<int8_t>(atoi(row[12])) : -1;
e.max_expansion = row[13] ? static_cast<int8_t>(atoi(row[13])) : -1;
e.content_flags = row[14] ? row[14] : "";
e.content_flags_disabled = row[15] ? row[15] : "";
@@ -469,6 +468,92 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const BlockedSpells &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back(std::to_string(e.spellid));
v.push_back(std::to_string(e.type));
v.push_back(std::to_string(e.zoneid));
v.push_back(std::to_string(e.x));
v.push_back(std::to_string(e.y));
v.push_back(std::to_string(e.z));
v.push_back(std::to_string(e.x_diff));
v.push_back(std::to_string(e.y_diff));
v.push_back(std::to_string(e.z_diff));
v.push_back("'" + Strings::Escape(e.message) + "'");
v.push_back("'" + Strings::Escape(e.description) + "'");
v.push_back(std::to_string(e.min_expansion));
v.push_back(std::to_string(e.max_expansion));
v.push_back("'" + Strings::Escape(e.content_flags) + "'");
v.push_back("'" + Strings::Escape(e.content_flags_disabled) + "'");
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<BlockedSpells> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back(std::to_string(e.spellid));
v.push_back(std::to_string(e.type));
v.push_back(std::to_string(e.zoneid));
v.push_back(std::to_string(e.x));
v.push_back(std::to_string(e.y));
v.push_back(std::to_string(e.z));
v.push_back(std::to_string(e.x_diff));
v.push_back(std::to_string(e.y_diff));
v.push_back(std::to_string(e.z_diff));
v.push_back("'" + Strings::Escape(e.message) + "'");
v.push_back("'" + Strings::Escape(e.description) + "'");
v.push_back(std::to_string(e.min_expansion));
v.push_back(std::to_string(e.max_expansion));
v.push_back("'" + Strings::Escape(e.content_flags) + "'");
v.push_back("'" + Strings::Escape(e.content_flags_disabled) + "'");
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_BLOCKED_SPELLS_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_BOOKS_REPOSITORY_H
@@ -116,8 +116,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
books_id
)
);
@@ -126,10 +127,10 @@ public:
if (results.RowCount() == 1) {
Books e{};
e.id = static_cast<int32_t>(atoi(row[0]));
e.id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.name = row[1] ? row[1] : "";
e.txtfile = row[2] ? row[2] : "";
e.language = static_cast<int32_t>(atoi(row[3]));
e.language = row[3] ? static_cast<int32_t>(atoi(row[3])) : 0;
return e;
}
@@ -257,10 +258,10 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
Books e{};
e.id = static_cast<int32_t>(atoi(row[0]));
e.id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.name = row[1] ? row[1] : "";
e.txtfile = row[2] ? row[2] : "";
e.language = static_cast<int32_t>(atoi(row[3]));
e.language = row[3] ? static_cast<int32_t>(atoi(row[3])) : 0;
all_entries.push_back(e);
}
@@ -285,10 +286,10 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
Books e{};
e.id = static_cast<int32_t>(atoi(row[0]));
e.id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.name = row[1] ? row[1] : "";
e.txtfile = row[2] ? row[2] : "";
e.language = static_cast<int32_t>(atoi(row[3]));
e.language = row[3] ? static_cast<int32_t>(atoi(row[3])) : 0;
all_entries.push_back(e);
}
@@ -347,6 +348,68 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const Books &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back("'" + Strings::Escape(e.name) + "'");
v.push_back("'" + Strings::Escape(e.txtfile) + "'");
v.push_back(std::to_string(e.language));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<Books> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back("'" + Strings::Escape(e.name) + "'");
v.push_back("'" + Strings::Escape(e.txtfile) + "'");
v.push_back(std::to_string(e.language));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_BOOKS_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_BOT_BUFFS_REPOSITORY_H
@@ -180,8 +180,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
bot_buffs_id
)
);
@@ -190,26 +191,26 @@ public:
if (results.RowCount() == 1) {
BotBuffs e{};
e.buffs_index = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.bot_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.spell_id = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.caster_level = static_cast<uint8_t>(strtoul(row[3], nullptr, 10));
e.duration_formula = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
e.tics_remaining = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
e.poison_counters = static_cast<uint32_t>(strtoul(row[6], nullptr, 10));
e.disease_counters = static_cast<uint32_t>(strtoul(row[7], nullptr, 10));
e.curse_counters = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
e.corruption_counters = static_cast<uint32_t>(strtoul(row[9], nullptr, 10));
e.numhits = static_cast<uint32_t>(strtoul(row[10], nullptr, 10));
e.melee_rune = static_cast<uint32_t>(strtoul(row[11], nullptr, 10));
e.magic_rune = static_cast<uint32_t>(strtoul(row[12], nullptr, 10));
e.dot_rune = static_cast<uint32_t>(strtoul(row[13], nullptr, 10));
e.persistent = static_cast<int8_t>(atoi(row[14]));
e.caston_x = static_cast<int32_t>(atoi(row[15]));
e.caston_y = static_cast<int32_t>(atoi(row[16]));
e.caston_z = static_cast<int32_t>(atoi(row[17]));
e.extra_di_chance = static_cast<uint32_t>(strtoul(row[18], nullptr, 10));
e.instrument_mod = static_cast<int32_t>(atoi(row[19]));
e.buffs_index = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.bot_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.spell_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.caster_level = row[3] ? static_cast<uint8_t>(strtoul(row[3], nullptr, 10)) : 0;
e.duration_formula = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
e.tics_remaining = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
e.poison_counters = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
e.disease_counters = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
e.curse_counters = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
e.corruption_counters = row[9] ? static_cast<uint32_t>(strtoul(row[9], nullptr, 10)) : 0;
e.numhits = row[10] ? static_cast<uint32_t>(strtoul(row[10], nullptr, 10)) : 0;
e.melee_rune = row[11] ? static_cast<uint32_t>(strtoul(row[11], nullptr, 10)) : 0;
e.magic_rune = row[12] ? static_cast<uint32_t>(strtoul(row[12], nullptr, 10)) : 0;
e.dot_rune = row[13] ? static_cast<uint32_t>(strtoul(row[13], nullptr, 10)) : 0;
e.persistent = row[14] ? static_cast<int8_t>(atoi(row[14])) : 0;
e.caston_x = row[15] ? static_cast<int32_t>(atoi(row[15])) : 0;
e.caston_y = row[16] ? static_cast<int32_t>(atoi(row[16])) : 0;
e.caston_z = row[17] ? static_cast<int32_t>(atoi(row[17])) : 0;
e.extra_di_chance = row[18] ? static_cast<uint32_t>(strtoul(row[18], nullptr, 10)) : 0;
e.instrument_mod = row[19] ? static_cast<int32_t>(atoi(row[19])) : 10;
return e;
}
@@ -385,26 +386,26 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotBuffs e{};
e.buffs_index = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.bot_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.spell_id = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.caster_level = static_cast<uint8_t>(strtoul(row[3], nullptr, 10));
e.duration_formula = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
e.tics_remaining = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
e.poison_counters = static_cast<uint32_t>(strtoul(row[6], nullptr, 10));
e.disease_counters = static_cast<uint32_t>(strtoul(row[7], nullptr, 10));
e.curse_counters = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
e.corruption_counters = static_cast<uint32_t>(strtoul(row[9], nullptr, 10));
e.numhits = static_cast<uint32_t>(strtoul(row[10], nullptr, 10));
e.melee_rune = static_cast<uint32_t>(strtoul(row[11], nullptr, 10));
e.magic_rune = static_cast<uint32_t>(strtoul(row[12], nullptr, 10));
e.dot_rune = static_cast<uint32_t>(strtoul(row[13], nullptr, 10));
e.persistent = static_cast<int8_t>(atoi(row[14]));
e.caston_x = static_cast<int32_t>(atoi(row[15]));
e.caston_y = static_cast<int32_t>(atoi(row[16]));
e.caston_z = static_cast<int32_t>(atoi(row[17]));
e.extra_di_chance = static_cast<uint32_t>(strtoul(row[18], nullptr, 10));
e.instrument_mod = static_cast<int32_t>(atoi(row[19]));
e.buffs_index = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.bot_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.spell_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.caster_level = row[3] ? static_cast<uint8_t>(strtoul(row[3], nullptr, 10)) : 0;
e.duration_formula = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
e.tics_remaining = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
e.poison_counters = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
e.disease_counters = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
e.curse_counters = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
e.corruption_counters = row[9] ? static_cast<uint32_t>(strtoul(row[9], nullptr, 10)) : 0;
e.numhits = row[10] ? static_cast<uint32_t>(strtoul(row[10], nullptr, 10)) : 0;
e.melee_rune = row[11] ? static_cast<uint32_t>(strtoul(row[11], nullptr, 10)) : 0;
e.magic_rune = row[12] ? static_cast<uint32_t>(strtoul(row[12], nullptr, 10)) : 0;
e.dot_rune = row[13] ? static_cast<uint32_t>(strtoul(row[13], nullptr, 10)) : 0;
e.persistent = row[14] ? static_cast<int8_t>(atoi(row[14])) : 0;
e.caston_x = row[15] ? static_cast<int32_t>(atoi(row[15])) : 0;
e.caston_y = row[16] ? static_cast<int32_t>(atoi(row[16])) : 0;
e.caston_z = row[17] ? static_cast<int32_t>(atoi(row[17])) : 0;
e.extra_di_chance = row[18] ? static_cast<uint32_t>(strtoul(row[18], nullptr, 10)) : 0;
e.instrument_mod = row[19] ? static_cast<int32_t>(atoi(row[19])) : 10;
all_entries.push_back(e);
}
@@ -429,26 +430,26 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotBuffs e{};
e.buffs_index = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.bot_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.spell_id = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.caster_level = static_cast<uint8_t>(strtoul(row[3], nullptr, 10));
e.duration_formula = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
e.tics_remaining = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
e.poison_counters = static_cast<uint32_t>(strtoul(row[6], nullptr, 10));
e.disease_counters = static_cast<uint32_t>(strtoul(row[7], nullptr, 10));
e.curse_counters = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
e.corruption_counters = static_cast<uint32_t>(strtoul(row[9], nullptr, 10));
e.numhits = static_cast<uint32_t>(strtoul(row[10], nullptr, 10));
e.melee_rune = static_cast<uint32_t>(strtoul(row[11], nullptr, 10));
e.magic_rune = static_cast<uint32_t>(strtoul(row[12], nullptr, 10));
e.dot_rune = static_cast<uint32_t>(strtoul(row[13], nullptr, 10));
e.persistent = static_cast<int8_t>(atoi(row[14]));
e.caston_x = static_cast<int32_t>(atoi(row[15]));
e.caston_y = static_cast<int32_t>(atoi(row[16]));
e.caston_z = static_cast<int32_t>(atoi(row[17]));
e.extra_di_chance = static_cast<uint32_t>(strtoul(row[18], nullptr, 10));
e.instrument_mod = static_cast<int32_t>(atoi(row[19]));
e.buffs_index = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.bot_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.spell_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.caster_level = row[3] ? static_cast<uint8_t>(strtoul(row[3], nullptr, 10)) : 0;
e.duration_formula = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
e.tics_remaining = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
e.poison_counters = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
e.disease_counters = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
e.curse_counters = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
e.corruption_counters = row[9] ? static_cast<uint32_t>(strtoul(row[9], nullptr, 10)) : 0;
e.numhits = row[10] ? static_cast<uint32_t>(strtoul(row[10], nullptr, 10)) : 0;
e.melee_rune = row[11] ? static_cast<uint32_t>(strtoul(row[11], nullptr, 10)) : 0;
e.magic_rune = row[12] ? static_cast<uint32_t>(strtoul(row[12], nullptr, 10)) : 0;
e.dot_rune = row[13] ? static_cast<uint32_t>(strtoul(row[13], nullptr, 10)) : 0;
e.persistent = row[14] ? static_cast<int8_t>(atoi(row[14])) : 0;
e.caston_x = row[15] ? static_cast<int32_t>(atoi(row[15])) : 0;
e.caston_y = row[16] ? static_cast<int32_t>(atoi(row[16])) : 0;
e.caston_z = row[17] ? static_cast<int32_t>(atoi(row[17])) : 0;
e.extra_di_chance = row[18] ? static_cast<uint32_t>(strtoul(row[18], nullptr, 10)) : 0;
e.instrument_mod = row[19] ? static_cast<int32_t>(atoi(row[19])) : 10;
all_entries.push_back(e);
}
@@ -507,6 +508,100 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const BotBuffs &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.buffs_index));
v.push_back(std::to_string(e.bot_id));
v.push_back(std::to_string(e.spell_id));
v.push_back(std::to_string(e.caster_level));
v.push_back(std::to_string(e.duration_formula));
v.push_back(std::to_string(e.tics_remaining));
v.push_back(std::to_string(e.poison_counters));
v.push_back(std::to_string(e.disease_counters));
v.push_back(std::to_string(e.curse_counters));
v.push_back(std::to_string(e.corruption_counters));
v.push_back(std::to_string(e.numhits));
v.push_back(std::to_string(e.melee_rune));
v.push_back(std::to_string(e.magic_rune));
v.push_back(std::to_string(e.dot_rune));
v.push_back(std::to_string(e.persistent));
v.push_back(std::to_string(e.caston_x));
v.push_back(std::to_string(e.caston_y));
v.push_back(std::to_string(e.caston_z));
v.push_back(std::to_string(e.extra_di_chance));
v.push_back(std::to_string(e.instrument_mod));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<BotBuffs> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.buffs_index));
v.push_back(std::to_string(e.bot_id));
v.push_back(std::to_string(e.spell_id));
v.push_back(std::to_string(e.caster_level));
v.push_back(std::to_string(e.duration_formula));
v.push_back(std::to_string(e.tics_remaining));
v.push_back(std::to_string(e.poison_counters));
v.push_back(std::to_string(e.disease_counters));
v.push_back(std::to_string(e.curse_counters));
v.push_back(std::to_string(e.corruption_counters));
v.push_back(std::to_string(e.numhits));
v.push_back(std::to_string(e.melee_rune));
v.push_back(std::to_string(e.magic_rune));
v.push_back(std::to_string(e.dot_rune));
v.push_back(std::to_string(e.persistent));
v.push_back(std::to_string(e.caston_x));
v.push_back(std::to_string(e.caston_y));
v.push_back(std::to_string(e.caston_z));
v.push_back(std::to_string(e.extra_di_chance));
v.push_back(std::to_string(e.instrument_mod));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_BOT_BUFFS_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_BOT_CREATE_COMBINATIONS_REPOSITORY_H
@@ -108,8 +108,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
bot_create_combinations_id
)
);
@@ -118,8 +119,8 @@ public:
if (results.RowCount() == 1) {
BotCreateCombinations e{};
e.race = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.classes = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.race = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.classes = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
return e;
}
@@ -242,8 +243,8 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotCreateCombinations e{};
e.race = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.classes = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.race = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.classes = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -268,8 +269,8 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotCreateCombinations e{};
e.race = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.classes = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.race = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.classes = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -328,6 +329,64 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const BotCreateCombinations &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.race));
v.push_back(std::to_string(e.classes));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<BotCreateCombinations> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.race));
v.push_back(std::to_string(e.classes));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_BOT_CREATE_COMBINATIONS_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_BOT_DATA_REPOSITORY_H
@@ -278,7 +278,7 @@ public:
e.expansion_bitmask = -1;
e.enforce_spell_settings = 0;
e.archery_setting = 0;
e.caster_range = 0;
e.caster_range = 300;
return e;
}
@@ -315,57 +315,57 @@ public:
if (results.RowCount() == 1) {
BotData e{};
e.bot_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.owner_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.spells_id = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.bot_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.owner_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.spells_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.name = row[3] ? row[3] : "";
e.last_name = row[4] ? row[4] : "";
e.title = row[5] ? row[5] : "";
e.suffix = row[6] ? row[6] : "";
e.zone_id = static_cast<int16_t>(atoi(row[7]));
e.gender = static_cast<int8_t>(atoi(row[8]));
e.race = static_cast<int16_t>(atoi(row[9]));
e.class_ = static_cast<int8_t>(atoi(row[10]));
e.level = static_cast<uint8_t>(strtoul(row[11], nullptr, 10));
e.deity = static_cast<uint32_t>(strtoul(row[12], nullptr, 10));
e.creation_day = static_cast<uint32_t>(strtoul(row[13], nullptr, 10));
e.last_spawn = static_cast<uint32_t>(strtoul(row[14], nullptr, 10));
e.time_spawned = static_cast<uint32_t>(strtoul(row[15], nullptr, 10));
e.size = strtof(row[16], nullptr);
e.face = static_cast<int32_t>(atoi(row[17]));
e.hair_color = static_cast<int32_t>(atoi(row[18]));
e.hair_style = static_cast<int32_t>(atoi(row[19]));
e.beard = static_cast<int32_t>(atoi(row[20]));
e.beard_color = static_cast<int32_t>(atoi(row[21]));
e.eye_color_1 = static_cast<int32_t>(atoi(row[22]));
e.eye_color_2 = static_cast<int32_t>(atoi(row[23]));
e.drakkin_heritage = static_cast<int32_t>(atoi(row[24]));
e.drakkin_tattoo = static_cast<int32_t>(atoi(row[25]));
e.drakkin_details = static_cast<int32_t>(atoi(row[26]));
e.ac = static_cast<int16_t>(atoi(row[27]));
e.atk = static_cast<int32_t>(atoi(row[28]));
e.hp = static_cast<int32_t>(atoi(row[29]));
e.mana = static_cast<int32_t>(atoi(row[30]));
e.str = static_cast<int32_t>(atoi(row[31]));
e.sta = static_cast<int32_t>(atoi(row[32]));
e.cha = static_cast<int32_t>(atoi(row[33]));
e.dex = static_cast<int32_t>(atoi(row[34]));
e.int_ = static_cast<int32_t>(atoi(row[35]));
e.agi = static_cast<int32_t>(atoi(row[36]));
e.wis = static_cast<int32_t>(atoi(row[37]));
e.fire = static_cast<int16_t>(atoi(row[38]));
e.cold = static_cast<int16_t>(atoi(row[39]));
e.magic = static_cast<int16_t>(atoi(row[40]));
e.poison = static_cast<int16_t>(atoi(row[41]));
e.disease = static_cast<int16_t>(atoi(row[42]));
e.corruption = static_cast<int16_t>(atoi(row[43]));
e.show_helm = static_cast<uint32_t>(strtoul(row[44], nullptr, 10));
e.follow_distance = static_cast<uint32_t>(strtoul(row[45], nullptr, 10));
e.stop_melee_level = static_cast<uint8_t>(strtoul(row[46], nullptr, 10));
e.expansion_bitmask = static_cast<int32_t>(atoi(row[47]));
e.enforce_spell_settings = static_cast<uint8_t>(strtoul(row[48], nullptr, 10));
e.archery_setting = static_cast<uint8_t>(strtoul(row[49], nullptr, 10));
e.caster_range = static_cast<uint32_t>(strtoul(row[50], nullptr, 10));
e.zone_id = row[7] ? static_cast<int16_t>(atoi(row[7])) : 0;
e.gender = row[8] ? static_cast<int8_t>(atoi(row[8])) : 0;
e.race = row[9] ? static_cast<int16_t>(atoi(row[9])) : 0;
e.class_ = row[10] ? static_cast<int8_t>(atoi(row[10])) : 0;
e.level = row[11] ? static_cast<uint8_t>(strtoul(row[11], nullptr, 10)) : 0;
e.deity = row[12] ? static_cast<uint32_t>(strtoul(row[12], nullptr, 10)) : 0;
e.creation_day = row[13] ? static_cast<uint32_t>(strtoul(row[13], nullptr, 10)) : 0;
e.last_spawn = row[14] ? static_cast<uint32_t>(strtoul(row[14], nullptr, 10)) : 0;
e.time_spawned = row[15] ? static_cast<uint32_t>(strtoul(row[15], nullptr, 10)) : 0;
e.size = row[16] ? strtof(row[16], nullptr) : 0;
e.face = row[17] ? static_cast<int32_t>(atoi(row[17])) : 1;
e.hair_color = row[18] ? static_cast<int32_t>(atoi(row[18])) : 1;
e.hair_style = row[19] ? static_cast<int32_t>(atoi(row[19])) : 1;
e.beard = row[20] ? static_cast<int32_t>(atoi(row[20])) : 0;
e.beard_color = row[21] ? static_cast<int32_t>(atoi(row[21])) : 1;
e.eye_color_1 = row[22] ? static_cast<int32_t>(atoi(row[22])) : 1;
e.eye_color_2 = row[23] ? static_cast<int32_t>(atoi(row[23])) : 1;
e.drakkin_heritage = row[24] ? static_cast<int32_t>(atoi(row[24])) : 0;
e.drakkin_tattoo = row[25] ? static_cast<int32_t>(atoi(row[25])) : 0;
e.drakkin_details = row[26] ? static_cast<int32_t>(atoi(row[26])) : 0;
e.ac = row[27] ? static_cast<int16_t>(atoi(row[27])) : 0;
e.atk = row[28] ? static_cast<int32_t>(atoi(row[28])) : 0;
e.hp = row[29] ? static_cast<int32_t>(atoi(row[29])) : 0;
e.mana = row[30] ? static_cast<int32_t>(atoi(row[30])) : 0;
e.str = row[31] ? static_cast<int32_t>(atoi(row[31])) : 75;
e.sta = row[32] ? static_cast<int32_t>(atoi(row[32])) : 75;
e.cha = row[33] ? static_cast<int32_t>(atoi(row[33])) : 75;
e.dex = row[34] ? static_cast<int32_t>(atoi(row[34])) : 75;
e.int_ = row[35] ? static_cast<int32_t>(atoi(row[35])) : 75;
e.agi = row[36] ? static_cast<int32_t>(atoi(row[36])) : 75;
e.wis = row[37] ? static_cast<int32_t>(atoi(row[37])) : 75;
e.fire = row[38] ? static_cast<int16_t>(atoi(row[38])) : 0;
e.cold = row[39] ? static_cast<int16_t>(atoi(row[39])) : 0;
e.magic = row[40] ? static_cast<int16_t>(atoi(row[40])) : 0;
e.poison = row[41] ? static_cast<int16_t>(atoi(row[41])) : 0;
e.disease = row[42] ? static_cast<int16_t>(atoi(row[42])) : 0;
e.corruption = row[43] ? static_cast<int16_t>(atoi(row[43])) : 0;
e.show_helm = row[44] ? static_cast<uint32_t>(strtoul(row[44], nullptr, 10)) : 0;
e.follow_distance = row[45] ? static_cast<uint32_t>(strtoul(row[45], nullptr, 10)) : 200;
e.stop_melee_level = row[46] ? static_cast<uint8_t>(strtoul(row[46], nullptr, 10)) : 255;
e.expansion_bitmask = row[47] ? static_cast<int32_t>(atoi(row[47])) : -1;
e.enforce_spell_settings = row[48] ? static_cast<uint8_t>(strtoul(row[48], nullptr, 10)) : 0;
e.archery_setting = row[49] ? static_cast<uint8_t>(strtoul(row[49], nullptr, 10)) : 0;
e.caster_range = row[50] ? static_cast<uint32_t>(strtoul(row[50], nullptr, 10)) : 300;
return e;
}
@@ -634,57 +634,57 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotData e{};
e.bot_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.owner_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.spells_id = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.bot_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.owner_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.spells_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.name = row[3] ? row[3] : "";
e.last_name = row[4] ? row[4] : "";
e.title = row[5] ? row[5] : "";
e.suffix = row[6] ? row[6] : "";
e.zone_id = static_cast<int16_t>(atoi(row[7]));
e.gender = static_cast<int8_t>(atoi(row[8]));
e.race = static_cast<int16_t>(atoi(row[9]));
e.class_ = static_cast<int8_t>(atoi(row[10]));
e.level = static_cast<uint8_t>(strtoul(row[11], nullptr, 10));
e.deity = static_cast<uint32_t>(strtoul(row[12], nullptr, 10));
e.creation_day = static_cast<uint32_t>(strtoul(row[13], nullptr, 10));
e.last_spawn = static_cast<uint32_t>(strtoul(row[14], nullptr, 10));
e.time_spawned = static_cast<uint32_t>(strtoul(row[15], nullptr, 10));
e.size = strtof(row[16], nullptr);
e.face = static_cast<int32_t>(atoi(row[17]));
e.hair_color = static_cast<int32_t>(atoi(row[18]));
e.hair_style = static_cast<int32_t>(atoi(row[19]));
e.beard = static_cast<int32_t>(atoi(row[20]));
e.beard_color = static_cast<int32_t>(atoi(row[21]));
e.eye_color_1 = static_cast<int32_t>(atoi(row[22]));
e.eye_color_2 = static_cast<int32_t>(atoi(row[23]));
e.drakkin_heritage = static_cast<int32_t>(atoi(row[24]));
e.drakkin_tattoo = static_cast<int32_t>(atoi(row[25]));
e.drakkin_details = static_cast<int32_t>(atoi(row[26]));
e.ac = static_cast<int16_t>(atoi(row[27]));
e.atk = static_cast<int32_t>(atoi(row[28]));
e.hp = static_cast<int32_t>(atoi(row[29]));
e.mana = static_cast<int32_t>(atoi(row[30]));
e.str = static_cast<int32_t>(atoi(row[31]));
e.sta = static_cast<int32_t>(atoi(row[32]));
e.cha = static_cast<int32_t>(atoi(row[33]));
e.dex = static_cast<int32_t>(atoi(row[34]));
e.int_ = static_cast<int32_t>(atoi(row[35]));
e.agi = static_cast<int32_t>(atoi(row[36]));
e.wis = static_cast<int32_t>(atoi(row[37]));
e.fire = static_cast<int16_t>(atoi(row[38]));
e.cold = static_cast<int16_t>(atoi(row[39]));
e.magic = static_cast<int16_t>(atoi(row[40]));
e.poison = static_cast<int16_t>(atoi(row[41]));
e.disease = static_cast<int16_t>(atoi(row[42]));
e.corruption = static_cast<int16_t>(atoi(row[43]));
e.show_helm = static_cast<uint32_t>(strtoul(row[44], nullptr, 10));
e.follow_distance = static_cast<uint32_t>(strtoul(row[45], nullptr, 10));
e.stop_melee_level = static_cast<uint8_t>(strtoul(row[46], nullptr, 10));
e.expansion_bitmask = static_cast<int32_t>(atoi(row[47]));
e.enforce_spell_settings = static_cast<uint8_t>(strtoul(row[48], nullptr, 10));
e.archery_setting = static_cast<uint8_t>(strtoul(row[49], nullptr, 10));
e.caster_range = static_cast<uint32_t>(strtoul(row[50], nullptr, 10));
e.zone_id = row[7] ? static_cast<int16_t>(atoi(row[7])) : 0;
e.gender = row[8] ? static_cast<int8_t>(atoi(row[8])) : 0;
e.race = row[9] ? static_cast<int16_t>(atoi(row[9])) : 0;
e.class_ = row[10] ? static_cast<int8_t>(atoi(row[10])) : 0;
e.level = row[11] ? static_cast<uint8_t>(strtoul(row[11], nullptr, 10)) : 0;
e.deity = row[12] ? static_cast<uint32_t>(strtoul(row[12], nullptr, 10)) : 0;
e.creation_day = row[13] ? static_cast<uint32_t>(strtoul(row[13], nullptr, 10)) : 0;
e.last_spawn = row[14] ? static_cast<uint32_t>(strtoul(row[14], nullptr, 10)) : 0;
e.time_spawned = row[15] ? static_cast<uint32_t>(strtoul(row[15], nullptr, 10)) : 0;
e.size = row[16] ? strtof(row[16], nullptr) : 0;
e.face = row[17] ? static_cast<int32_t>(atoi(row[17])) : 1;
e.hair_color = row[18] ? static_cast<int32_t>(atoi(row[18])) : 1;
e.hair_style = row[19] ? static_cast<int32_t>(atoi(row[19])) : 1;
e.beard = row[20] ? static_cast<int32_t>(atoi(row[20])) : 0;
e.beard_color = row[21] ? static_cast<int32_t>(atoi(row[21])) : 1;
e.eye_color_1 = row[22] ? static_cast<int32_t>(atoi(row[22])) : 1;
e.eye_color_2 = row[23] ? static_cast<int32_t>(atoi(row[23])) : 1;
e.drakkin_heritage = row[24] ? static_cast<int32_t>(atoi(row[24])) : 0;
e.drakkin_tattoo = row[25] ? static_cast<int32_t>(atoi(row[25])) : 0;
e.drakkin_details = row[26] ? static_cast<int32_t>(atoi(row[26])) : 0;
e.ac = row[27] ? static_cast<int16_t>(atoi(row[27])) : 0;
e.atk = row[28] ? static_cast<int32_t>(atoi(row[28])) : 0;
e.hp = row[29] ? static_cast<int32_t>(atoi(row[29])) : 0;
e.mana = row[30] ? static_cast<int32_t>(atoi(row[30])) : 0;
e.str = row[31] ? static_cast<int32_t>(atoi(row[31])) : 75;
e.sta = row[32] ? static_cast<int32_t>(atoi(row[32])) : 75;
e.cha = row[33] ? static_cast<int32_t>(atoi(row[33])) : 75;
e.dex = row[34] ? static_cast<int32_t>(atoi(row[34])) : 75;
e.int_ = row[35] ? static_cast<int32_t>(atoi(row[35])) : 75;
e.agi = row[36] ? static_cast<int32_t>(atoi(row[36])) : 75;
e.wis = row[37] ? static_cast<int32_t>(atoi(row[37])) : 75;
e.fire = row[38] ? static_cast<int16_t>(atoi(row[38])) : 0;
e.cold = row[39] ? static_cast<int16_t>(atoi(row[39])) : 0;
e.magic = row[40] ? static_cast<int16_t>(atoi(row[40])) : 0;
e.poison = row[41] ? static_cast<int16_t>(atoi(row[41])) : 0;
e.disease = row[42] ? static_cast<int16_t>(atoi(row[42])) : 0;
e.corruption = row[43] ? static_cast<int16_t>(atoi(row[43])) : 0;
e.show_helm = row[44] ? static_cast<uint32_t>(strtoul(row[44], nullptr, 10)) : 0;
e.follow_distance = row[45] ? static_cast<uint32_t>(strtoul(row[45], nullptr, 10)) : 200;
e.stop_melee_level = row[46] ? static_cast<uint8_t>(strtoul(row[46], nullptr, 10)) : 255;
e.expansion_bitmask = row[47] ? static_cast<int32_t>(atoi(row[47])) : -1;
e.enforce_spell_settings = row[48] ? static_cast<uint8_t>(strtoul(row[48], nullptr, 10)) : 0;
e.archery_setting = row[49] ? static_cast<uint8_t>(strtoul(row[49], nullptr, 10)) : 0;
e.caster_range = row[50] ? static_cast<uint32_t>(strtoul(row[50], nullptr, 10)) : 300;
all_entries.push_back(e);
}
@@ -709,57 +709,57 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotData e{};
e.bot_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.owner_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.spells_id = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.bot_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.owner_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.spells_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.name = row[3] ? row[3] : "";
e.last_name = row[4] ? row[4] : "";
e.title = row[5] ? row[5] : "";
e.suffix = row[6] ? row[6] : "";
e.zone_id = static_cast<int16_t>(atoi(row[7]));
e.gender = static_cast<int8_t>(atoi(row[8]));
e.race = static_cast<int16_t>(atoi(row[9]));
e.class_ = static_cast<int8_t>(atoi(row[10]));
e.level = static_cast<uint8_t>(strtoul(row[11], nullptr, 10));
e.deity = static_cast<uint32_t>(strtoul(row[12], nullptr, 10));
e.creation_day = static_cast<uint32_t>(strtoul(row[13], nullptr, 10));
e.last_spawn = static_cast<uint32_t>(strtoul(row[14], nullptr, 10));
e.time_spawned = static_cast<uint32_t>(strtoul(row[15], nullptr, 10));
e.size = strtof(row[16], nullptr);
e.face = static_cast<int32_t>(atoi(row[17]));
e.hair_color = static_cast<int32_t>(atoi(row[18]));
e.hair_style = static_cast<int32_t>(atoi(row[19]));
e.beard = static_cast<int32_t>(atoi(row[20]));
e.beard_color = static_cast<int32_t>(atoi(row[21]));
e.eye_color_1 = static_cast<int32_t>(atoi(row[22]));
e.eye_color_2 = static_cast<int32_t>(atoi(row[23]));
e.drakkin_heritage = static_cast<int32_t>(atoi(row[24]));
e.drakkin_tattoo = static_cast<int32_t>(atoi(row[25]));
e.drakkin_details = static_cast<int32_t>(atoi(row[26]));
e.ac = static_cast<int16_t>(atoi(row[27]));
e.atk = static_cast<int32_t>(atoi(row[28]));
e.hp = static_cast<int32_t>(atoi(row[29]));
e.mana = static_cast<int32_t>(atoi(row[30]));
e.str = static_cast<int32_t>(atoi(row[31]));
e.sta = static_cast<int32_t>(atoi(row[32]));
e.cha = static_cast<int32_t>(atoi(row[33]));
e.dex = static_cast<int32_t>(atoi(row[34]));
e.int_ = static_cast<int32_t>(atoi(row[35]));
e.agi = static_cast<int32_t>(atoi(row[36]));
e.wis = static_cast<int32_t>(atoi(row[37]));
e.fire = static_cast<int16_t>(atoi(row[38]));
e.cold = static_cast<int16_t>(atoi(row[39]));
e.magic = static_cast<int16_t>(atoi(row[40]));
e.poison = static_cast<int16_t>(atoi(row[41]));
e.disease = static_cast<int16_t>(atoi(row[42]));
e.corruption = static_cast<int16_t>(atoi(row[43]));
e.show_helm = static_cast<uint32_t>(strtoul(row[44], nullptr, 10));
e.follow_distance = static_cast<uint32_t>(strtoul(row[45], nullptr, 10));
e.stop_melee_level = static_cast<uint8_t>(strtoul(row[46], nullptr, 10));
e.expansion_bitmask = static_cast<int32_t>(atoi(row[47]));
e.enforce_spell_settings = static_cast<uint8_t>(strtoul(row[48], nullptr, 10));
e.archery_setting = static_cast<uint8_t>(strtoul(row[49], nullptr, 10));
e.caster_range = static_cast<uint32_t>(strtoul(row[50], nullptr, 10));
e.zone_id = row[7] ? static_cast<int16_t>(atoi(row[7])) : 0;
e.gender = row[8] ? static_cast<int8_t>(atoi(row[8])) : 0;
e.race = row[9] ? static_cast<int16_t>(atoi(row[9])) : 0;
e.class_ = row[10] ? static_cast<int8_t>(atoi(row[10])) : 0;
e.level = row[11] ? static_cast<uint8_t>(strtoul(row[11], nullptr, 10)) : 0;
e.deity = row[12] ? static_cast<uint32_t>(strtoul(row[12], nullptr, 10)) : 0;
e.creation_day = row[13] ? static_cast<uint32_t>(strtoul(row[13], nullptr, 10)) : 0;
e.last_spawn = row[14] ? static_cast<uint32_t>(strtoul(row[14], nullptr, 10)) : 0;
e.time_spawned = row[15] ? static_cast<uint32_t>(strtoul(row[15], nullptr, 10)) : 0;
e.size = row[16] ? strtof(row[16], nullptr) : 0;
e.face = row[17] ? static_cast<int32_t>(atoi(row[17])) : 1;
e.hair_color = row[18] ? static_cast<int32_t>(atoi(row[18])) : 1;
e.hair_style = row[19] ? static_cast<int32_t>(atoi(row[19])) : 1;
e.beard = row[20] ? static_cast<int32_t>(atoi(row[20])) : 0;
e.beard_color = row[21] ? static_cast<int32_t>(atoi(row[21])) : 1;
e.eye_color_1 = row[22] ? static_cast<int32_t>(atoi(row[22])) : 1;
e.eye_color_2 = row[23] ? static_cast<int32_t>(atoi(row[23])) : 1;
e.drakkin_heritage = row[24] ? static_cast<int32_t>(atoi(row[24])) : 0;
e.drakkin_tattoo = row[25] ? static_cast<int32_t>(atoi(row[25])) : 0;
e.drakkin_details = row[26] ? static_cast<int32_t>(atoi(row[26])) : 0;
e.ac = row[27] ? static_cast<int16_t>(atoi(row[27])) : 0;
e.atk = row[28] ? static_cast<int32_t>(atoi(row[28])) : 0;
e.hp = row[29] ? static_cast<int32_t>(atoi(row[29])) : 0;
e.mana = row[30] ? static_cast<int32_t>(atoi(row[30])) : 0;
e.str = row[31] ? static_cast<int32_t>(atoi(row[31])) : 75;
e.sta = row[32] ? static_cast<int32_t>(atoi(row[32])) : 75;
e.cha = row[33] ? static_cast<int32_t>(atoi(row[33])) : 75;
e.dex = row[34] ? static_cast<int32_t>(atoi(row[34])) : 75;
e.int_ = row[35] ? static_cast<int32_t>(atoi(row[35])) : 75;
e.agi = row[36] ? static_cast<int32_t>(atoi(row[36])) : 75;
e.wis = row[37] ? static_cast<int32_t>(atoi(row[37])) : 75;
e.fire = row[38] ? static_cast<int16_t>(atoi(row[38])) : 0;
e.cold = row[39] ? static_cast<int16_t>(atoi(row[39])) : 0;
e.magic = row[40] ? static_cast<int16_t>(atoi(row[40])) : 0;
e.poison = row[41] ? static_cast<int16_t>(atoi(row[41])) : 0;
e.disease = row[42] ? static_cast<int16_t>(atoi(row[42])) : 0;
e.corruption = row[43] ? static_cast<int16_t>(atoi(row[43])) : 0;
e.show_helm = row[44] ? static_cast<uint32_t>(strtoul(row[44], nullptr, 10)) : 0;
e.follow_distance = row[45] ? static_cast<uint32_t>(strtoul(row[45], nullptr, 10)) : 200;
e.stop_melee_level = row[46] ? static_cast<uint8_t>(strtoul(row[46], nullptr, 10)) : 255;
e.expansion_bitmask = row[47] ? static_cast<int32_t>(atoi(row[47])) : -1;
e.enforce_spell_settings = row[48] ? static_cast<uint8_t>(strtoul(row[48], nullptr, 10)) : 0;
e.archery_setting = row[49] ? static_cast<uint8_t>(strtoul(row[49], nullptr, 10)) : 0;
e.caster_range = row[50] ? static_cast<uint32_t>(strtoul(row[50], nullptr, 10)) : 300;
all_entries.push_back(e);
}
@@ -818,6 +818,162 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const BotData &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.bot_id));
v.push_back(std::to_string(e.owner_id));
v.push_back(std::to_string(e.spells_id));
v.push_back("'" + Strings::Escape(e.name) + "'");
v.push_back("'" + Strings::Escape(e.last_name) + "'");
v.push_back("'" + Strings::Escape(e.title) + "'");
v.push_back("'" + Strings::Escape(e.suffix) + "'");
v.push_back(std::to_string(e.zone_id));
v.push_back(std::to_string(e.gender));
v.push_back(std::to_string(e.race));
v.push_back(std::to_string(e.class_));
v.push_back(std::to_string(e.level));
v.push_back(std::to_string(e.deity));
v.push_back(std::to_string(e.creation_day));
v.push_back(std::to_string(e.last_spawn));
v.push_back(std::to_string(e.time_spawned));
v.push_back(std::to_string(e.size));
v.push_back(std::to_string(e.face));
v.push_back(std::to_string(e.hair_color));
v.push_back(std::to_string(e.hair_style));
v.push_back(std::to_string(e.beard));
v.push_back(std::to_string(e.beard_color));
v.push_back(std::to_string(e.eye_color_1));
v.push_back(std::to_string(e.eye_color_2));
v.push_back(std::to_string(e.drakkin_heritage));
v.push_back(std::to_string(e.drakkin_tattoo));
v.push_back(std::to_string(e.drakkin_details));
v.push_back(std::to_string(e.ac));
v.push_back(std::to_string(e.atk));
v.push_back(std::to_string(e.hp));
v.push_back(std::to_string(e.mana));
v.push_back(std::to_string(e.str));
v.push_back(std::to_string(e.sta));
v.push_back(std::to_string(e.cha));
v.push_back(std::to_string(e.dex));
v.push_back(std::to_string(e.int_));
v.push_back(std::to_string(e.agi));
v.push_back(std::to_string(e.wis));
v.push_back(std::to_string(e.fire));
v.push_back(std::to_string(e.cold));
v.push_back(std::to_string(e.magic));
v.push_back(std::to_string(e.poison));
v.push_back(std::to_string(e.disease));
v.push_back(std::to_string(e.corruption));
v.push_back(std::to_string(e.show_helm));
v.push_back(std::to_string(e.follow_distance));
v.push_back(std::to_string(e.stop_melee_level));
v.push_back(std::to_string(e.expansion_bitmask));
v.push_back(std::to_string(e.enforce_spell_settings));
v.push_back(std::to_string(e.archery_setting));
v.push_back(std::to_string(e.caster_range));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<BotData> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.bot_id));
v.push_back(std::to_string(e.owner_id));
v.push_back(std::to_string(e.spells_id));
v.push_back("'" + Strings::Escape(e.name) + "'");
v.push_back("'" + Strings::Escape(e.last_name) + "'");
v.push_back("'" + Strings::Escape(e.title) + "'");
v.push_back("'" + Strings::Escape(e.suffix) + "'");
v.push_back(std::to_string(e.zone_id));
v.push_back(std::to_string(e.gender));
v.push_back(std::to_string(e.race));
v.push_back(std::to_string(e.class_));
v.push_back(std::to_string(e.level));
v.push_back(std::to_string(e.deity));
v.push_back(std::to_string(e.creation_day));
v.push_back(std::to_string(e.last_spawn));
v.push_back(std::to_string(e.time_spawned));
v.push_back(std::to_string(e.size));
v.push_back(std::to_string(e.face));
v.push_back(std::to_string(e.hair_color));
v.push_back(std::to_string(e.hair_style));
v.push_back(std::to_string(e.beard));
v.push_back(std::to_string(e.beard_color));
v.push_back(std::to_string(e.eye_color_1));
v.push_back(std::to_string(e.eye_color_2));
v.push_back(std::to_string(e.drakkin_heritage));
v.push_back(std::to_string(e.drakkin_tattoo));
v.push_back(std::to_string(e.drakkin_details));
v.push_back(std::to_string(e.ac));
v.push_back(std::to_string(e.atk));
v.push_back(std::to_string(e.hp));
v.push_back(std::to_string(e.mana));
v.push_back(std::to_string(e.str));
v.push_back(std::to_string(e.sta));
v.push_back(std::to_string(e.cha));
v.push_back(std::to_string(e.dex));
v.push_back(std::to_string(e.int_));
v.push_back(std::to_string(e.agi));
v.push_back(std::to_string(e.wis));
v.push_back(std::to_string(e.fire));
v.push_back(std::to_string(e.cold));
v.push_back(std::to_string(e.magic));
v.push_back(std::to_string(e.poison));
v.push_back(std::to_string(e.disease));
v.push_back(std::to_string(e.corruption));
v.push_back(std::to_string(e.show_helm));
v.push_back(std::to_string(e.follow_distance));
v.push_back(std::to_string(e.stop_melee_level));
v.push_back(std::to_string(e.expansion_bitmask));
v.push_back(std::to_string(e.enforce_spell_settings));
v.push_back(std::to_string(e.archery_setting));
v.push_back(std::to_string(e.caster_range));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_BOT_DATA_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_BOT_HEAL_ROTATION_MEMBERS_REPOSITORY_H
@@ -112,8 +112,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
bot_heal_rotation_members_id
)
);
@@ -122,9 +123,9 @@ public:
if (results.RowCount() == 1) {
BotHealRotationMembers e{};
e.member_index = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.heal_rotation_index = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.bot_id = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.member_index = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.heal_rotation_index = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.bot_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
return e;
}
@@ -249,9 +250,9 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotHealRotationMembers e{};
e.member_index = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.heal_rotation_index = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.bot_id = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.member_index = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.heal_rotation_index = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.bot_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -276,9 +277,9 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotHealRotationMembers e{};
e.member_index = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.heal_rotation_index = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.bot_id = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.member_index = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.heal_rotation_index = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.bot_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -337,6 +338,66 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const BotHealRotationMembers &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.member_index));
v.push_back(std::to_string(e.heal_rotation_index));
v.push_back(std::to_string(e.bot_id));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<BotHealRotationMembers> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.member_index));
v.push_back(std::to_string(e.heal_rotation_index));
v.push_back(std::to_string(e.bot_id));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_BOT_HEAL_ROTATION_MEMBERS_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_BOT_HEAL_ROTATION_TARGETS_REPOSITORY_H
@@ -112,8 +112,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
bot_heal_rotation_targets_id
)
);
@@ -122,8 +123,8 @@ public:
if (results.RowCount() == 1) {
BotHealRotationTargets e{};
e.target_index = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.heal_rotation_index = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.target_index = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.heal_rotation_index = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.target_name = row[2] ? row[2] : "";
return e;
@@ -249,8 +250,8 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotHealRotationTargets e{};
e.target_index = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.heal_rotation_index = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.target_index = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.heal_rotation_index = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.target_name = row[2] ? row[2] : "";
all_entries.push_back(e);
@@ -276,8 +277,8 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotHealRotationTargets e{};
e.target_index = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.heal_rotation_index = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.target_index = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.heal_rotation_index = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.target_name = row[2] ? row[2] : "";
all_entries.push_back(e);
@@ -337,6 +338,66 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const BotHealRotationTargets &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.target_index));
v.push_back(std::to_string(e.heal_rotation_index));
v.push_back("'" + Strings::Escape(e.target_name) + "'");
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<BotHealRotationTargets> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.target_index));
v.push_back(std::to_string(e.heal_rotation_index));
v.push_back("'" + Strings::Escape(e.target_name) + "'");
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_BOT_HEAL_ROTATION_TARGETS_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_BOT_HEAL_ROTATIONS_REPOSITORY_H
@@ -19,22 +19,22 @@
class BaseBotHealRotationsRepository {
public:
struct BotHealRotations {
uint32_t heal_rotation_index;
uint32_t bot_id;
uint32_t interval;
uint32_t fast_heals;
uint32_t adaptive_targeting;
uint32_t casting_override;
std::string safe_hp_base;
std::string safe_hp_cloth;
std::string safe_hp_leather;
std::string safe_hp_chain;
std::string safe_hp_plate;
std::string critical_hp_base;
std::string critical_hp_cloth;
std::string critical_hp_leather;
std::string critical_hp_chain;
std::string critical_hp_plate;
uint32_t heal_rotation_index;
uint32_t bot_id;
uint32_t interval_;
uint32_t fast_heals;
uint32_t adaptive_targeting;
uint32_t casting_override;
float safe_hp_base;
float safe_hp_cloth;
float safe_hp_leather;
float safe_hp_chain;
float safe_hp_plate;
float critical_hp_base;
float critical_hp_cloth;
float critical_hp_leather;
float critical_hp_chain;
float critical_hp_plate;
};
static std::string PrimaryKey()
@@ -47,7 +47,7 @@ public:
return {
"heal_rotation_index",
"bot_id",
"interval",
"`interval`",
"fast_heals",
"adaptive_targeting",
"casting_override",
@@ -69,7 +69,7 @@ public:
return {
"heal_rotation_index",
"bot_id",
"interval",
"`interval`",
"fast_heals",
"adaptive_targeting",
"casting_override",
@@ -125,7 +125,7 @@ public:
e.heal_rotation_index = 0;
e.bot_id = 0;
e.interval = 0;
e.interval_ = 0;
e.fast_heals = 0;
e.adaptive_targeting = 0;
e.casting_override = 0;
@@ -164,8 +164,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
bot_heal_rotations_id
)
);
@@ -174,12 +175,12 @@ public:
if (results.RowCount() == 1) {
BotHealRotations e{};
e.heal_rotation_index = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.bot_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.interval = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.fast_heals = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.adaptive_targeting = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
e.casting_override = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
e.heal_rotation_index = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.bot_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.interval_ = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.fast_heals = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.adaptive_targeting = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
e.casting_override = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
return e;
}
@@ -214,7 +215,7 @@ public:
auto columns = Columns();
v.push_back(columns[1] + " = " + std::to_string(e.bot_id));
v.push_back(columns[2] + " = " + std::to_string(e.interval));
v.push_back(columns[2] + " = " + std::to_string(e.interval_));
v.push_back(columns[3] + " = " + std::to_string(e.fast_heals));
v.push_back(columns[4] + " = " + std::to_string(e.adaptive_targeting));
v.push_back(columns[5] + " = " + std::to_string(e.casting_override));
@@ -251,7 +252,7 @@ public:
v.push_back(std::to_string(e.heal_rotation_index));
v.push_back(std::to_string(e.bot_id));
v.push_back(std::to_string(e.interval));
v.push_back(std::to_string(e.interval_));
v.push_back(std::to_string(e.fast_heals));
v.push_back(std::to_string(e.adaptive_targeting));
v.push_back(std::to_string(e.casting_override));
@@ -296,7 +297,7 @@ public:
v.push_back(std::to_string(e.heal_rotation_index));
v.push_back(std::to_string(e.bot_id));
v.push_back(std::to_string(e.interval));
v.push_back(std::to_string(e.interval_));
v.push_back(std::to_string(e.fast_heals));
v.push_back(std::to_string(e.adaptive_targeting));
v.push_back(std::to_string(e.casting_override));
@@ -343,12 +344,12 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotHealRotations e{};
e.heal_rotation_index = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.bot_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.interval = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.fast_heals = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.adaptive_targeting = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
e.casting_override = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
e.heal_rotation_index = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.bot_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.interval_ = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.fast_heals = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.adaptive_targeting = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
e.casting_override = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -373,12 +374,12 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotHealRotations e{};
e.heal_rotation_index = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.bot_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.interval = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.fast_heals = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.adaptive_targeting = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
e.casting_override = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
e.heal_rotation_index = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.bot_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.interval_ = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.fast_heals = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.adaptive_targeting = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
e.casting_override = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -437,6 +438,92 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const BotHealRotations &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.heal_rotation_index));
v.push_back(std::to_string(e.bot_id));
v.push_back(std::to_string(e.interval_));
v.push_back(std::to_string(e.fast_heals));
v.push_back(std::to_string(e.adaptive_targeting));
v.push_back(std::to_string(e.casting_override));
v.push_back(std::to_string(e.safe_hp_base));
v.push_back(std::to_string(e.safe_hp_cloth));
v.push_back(std::to_string(e.safe_hp_leather));
v.push_back(std::to_string(e.safe_hp_chain));
v.push_back(std::to_string(e.safe_hp_plate));
v.push_back(std::to_string(e.critical_hp_base));
v.push_back(std::to_string(e.critical_hp_cloth));
v.push_back(std::to_string(e.critical_hp_leather));
v.push_back(std::to_string(e.critical_hp_chain));
v.push_back(std::to_string(e.critical_hp_plate));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<BotHealRotations> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.heal_rotation_index));
v.push_back(std::to_string(e.bot_id));
v.push_back(std::to_string(e.interval_));
v.push_back(std::to_string(e.fast_heals));
v.push_back(std::to_string(e.adaptive_targeting));
v.push_back(std::to_string(e.casting_override));
v.push_back(std::to_string(e.safe_hp_base));
v.push_back(std::to_string(e.safe_hp_cloth));
v.push_back(std::to_string(e.safe_hp_leather));
v.push_back(std::to_string(e.safe_hp_chain));
v.push_back(std::to_string(e.safe_hp_plate));
v.push_back(std::to_string(e.critical_hp_base));
v.push_back(std::to_string(e.critical_hp_cloth));
v.push_back(std::to_string(e.critical_hp_leather));
v.push_back(std::to_string(e.critical_hp_chain));
v.push_back(std::to_string(e.critical_hp_plate));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_BOT_HEAL_ROTATIONS_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_BOT_INSPECT_MESSAGES_REPOSITORY_H
@@ -108,8 +108,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
bot_inspect_messages_id
)
);
@@ -118,7 +119,7 @@ public:
if (results.RowCount() == 1) {
BotInspectMessages e{};
e.bot_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.bot_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.inspect_message = row[1] ? row[1] : "";
return e;
@@ -242,7 +243,7 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotInspectMessages e{};
e.bot_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.bot_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.inspect_message = row[1] ? row[1] : "";
all_entries.push_back(e);
@@ -268,7 +269,7 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotInspectMessages e{};
e.bot_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.bot_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.inspect_message = row[1] ? row[1] : "";
all_entries.push_back(e);
@@ -328,6 +329,64 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const BotInspectMessages &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.bot_id));
v.push_back("'" + Strings::Escape(e.inspect_message) + "'");
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<BotInspectMessages> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.bot_id));
v.push_back("'" + Strings::Escape(e.inspect_message) + "'");
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_BOT_INSPECT_MESSAGES_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_BOT_INVENTORIES_REPOSITORY_H
@@ -168,8 +168,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
bot_inventories_id
)
);
@@ -178,23 +179,23 @@ public:
if (results.RowCount() == 1) {
BotInventories e{};
e.inventories_index = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.bot_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.slot_id = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.item_id = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.inst_charges = static_cast<uint16_t>(strtoul(row[4], nullptr, 10));
e.inst_color = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
e.inst_no_drop = static_cast<uint8_t>(strtoul(row[6], nullptr, 10));
e.inventories_index = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.bot_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.inst_charges = row[4] ? static_cast<uint16_t>(strtoul(row[4], nullptr, 10)) : 0;
e.inst_color = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
e.inst_no_drop = row[6] ? static_cast<uint8_t>(strtoul(row[6], nullptr, 10)) : 0;
e.inst_custom_data = row[7] ? row[7] : "";
e.ornament_icon = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
e.ornament_id_file = static_cast<uint32_t>(strtoul(row[9], nullptr, 10));
e.ornament_hero_model = static_cast<int32_t>(atoi(row[10]));
e.augment_1 = static_cast<uint32_t>(strtoul(row[11], nullptr, 10));
e.augment_2 = static_cast<uint32_t>(strtoul(row[12], nullptr, 10));
e.augment_3 = static_cast<uint32_t>(strtoul(row[13], nullptr, 10));
e.augment_4 = static_cast<uint32_t>(strtoul(row[14], nullptr, 10));
e.augment_5 = static_cast<uint32_t>(strtoul(row[15], nullptr, 10));
e.augment_6 = static_cast<uint32_t>(strtoul(row[16], nullptr, 10));
e.ornament_icon = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
e.ornament_id_file = row[9] ? static_cast<uint32_t>(strtoul(row[9], nullptr, 10)) : 0;
e.ornament_hero_model = row[10] ? static_cast<int32_t>(atoi(row[10])) : 0;
e.augment_1 = row[11] ? static_cast<uint32_t>(strtoul(row[11], nullptr, 10)) : 0;
e.augment_2 = row[12] ? static_cast<uint32_t>(strtoul(row[12], nullptr, 10)) : 0;
e.augment_3 = row[13] ? static_cast<uint32_t>(strtoul(row[13], nullptr, 10)) : 0;
e.augment_4 = row[14] ? static_cast<uint32_t>(strtoul(row[14], nullptr, 10)) : 0;
e.augment_5 = row[15] ? static_cast<uint32_t>(strtoul(row[15], nullptr, 10)) : 0;
e.augment_6 = row[16] ? static_cast<uint32_t>(strtoul(row[16], nullptr, 10)) : 0;
return e;
}
@@ -361,23 +362,23 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotInventories e{};
e.inventories_index = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.bot_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.slot_id = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.item_id = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.inst_charges = static_cast<uint16_t>(strtoul(row[4], nullptr, 10));
e.inst_color = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
e.inst_no_drop = static_cast<uint8_t>(strtoul(row[6], nullptr, 10));
e.inventories_index = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.bot_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.inst_charges = row[4] ? static_cast<uint16_t>(strtoul(row[4], nullptr, 10)) : 0;
e.inst_color = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
e.inst_no_drop = row[6] ? static_cast<uint8_t>(strtoul(row[6], nullptr, 10)) : 0;
e.inst_custom_data = row[7] ? row[7] : "";
e.ornament_icon = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
e.ornament_id_file = static_cast<uint32_t>(strtoul(row[9], nullptr, 10));
e.ornament_hero_model = static_cast<int32_t>(atoi(row[10]));
e.augment_1 = static_cast<uint32_t>(strtoul(row[11], nullptr, 10));
e.augment_2 = static_cast<uint32_t>(strtoul(row[12], nullptr, 10));
e.augment_3 = static_cast<uint32_t>(strtoul(row[13], nullptr, 10));
e.augment_4 = static_cast<uint32_t>(strtoul(row[14], nullptr, 10));
e.augment_5 = static_cast<uint32_t>(strtoul(row[15], nullptr, 10));
e.augment_6 = static_cast<uint32_t>(strtoul(row[16], nullptr, 10));
e.ornament_icon = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
e.ornament_id_file = row[9] ? static_cast<uint32_t>(strtoul(row[9], nullptr, 10)) : 0;
e.ornament_hero_model = row[10] ? static_cast<int32_t>(atoi(row[10])) : 0;
e.augment_1 = row[11] ? static_cast<uint32_t>(strtoul(row[11], nullptr, 10)) : 0;
e.augment_2 = row[12] ? static_cast<uint32_t>(strtoul(row[12], nullptr, 10)) : 0;
e.augment_3 = row[13] ? static_cast<uint32_t>(strtoul(row[13], nullptr, 10)) : 0;
e.augment_4 = row[14] ? static_cast<uint32_t>(strtoul(row[14], nullptr, 10)) : 0;
e.augment_5 = row[15] ? static_cast<uint32_t>(strtoul(row[15], nullptr, 10)) : 0;
e.augment_6 = row[16] ? static_cast<uint32_t>(strtoul(row[16], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -402,23 +403,23 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotInventories e{};
e.inventories_index = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.bot_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.slot_id = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.item_id = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.inst_charges = static_cast<uint16_t>(strtoul(row[4], nullptr, 10));
e.inst_color = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
e.inst_no_drop = static_cast<uint8_t>(strtoul(row[6], nullptr, 10));
e.inventories_index = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.bot_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.inst_charges = row[4] ? static_cast<uint16_t>(strtoul(row[4], nullptr, 10)) : 0;
e.inst_color = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
e.inst_no_drop = row[6] ? static_cast<uint8_t>(strtoul(row[6], nullptr, 10)) : 0;
e.inst_custom_data = row[7] ? row[7] : "";
e.ornament_icon = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
e.ornament_id_file = static_cast<uint32_t>(strtoul(row[9], nullptr, 10));
e.ornament_hero_model = static_cast<int32_t>(atoi(row[10]));
e.augment_1 = static_cast<uint32_t>(strtoul(row[11], nullptr, 10));
e.augment_2 = static_cast<uint32_t>(strtoul(row[12], nullptr, 10));
e.augment_3 = static_cast<uint32_t>(strtoul(row[13], nullptr, 10));
e.augment_4 = static_cast<uint32_t>(strtoul(row[14], nullptr, 10));
e.augment_5 = static_cast<uint32_t>(strtoul(row[15], nullptr, 10));
e.augment_6 = static_cast<uint32_t>(strtoul(row[16], nullptr, 10));
e.ornament_icon = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
e.ornament_id_file = row[9] ? static_cast<uint32_t>(strtoul(row[9], nullptr, 10)) : 0;
e.ornament_hero_model = row[10] ? static_cast<int32_t>(atoi(row[10])) : 0;
e.augment_1 = row[11] ? static_cast<uint32_t>(strtoul(row[11], nullptr, 10)) : 0;
e.augment_2 = row[12] ? static_cast<uint32_t>(strtoul(row[12], nullptr, 10)) : 0;
e.augment_3 = row[13] ? static_cast<uint32_t>(strtoul(row[13], nullptr, 10)) : 0;
e.augment_4 = row[14] ? static_cast<uint32_t>(strtoul(row[14], nullptr, 10)) : 0;
e.augment_5 = row[15] ? static_cast<uint32_t>(strtoul(row[15], nullptr, 10)) : 0;
e.augment_6 = row[16] ? static_cast<uint32_t>(strtoul(row[16], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -477,6 +478,94 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const BotInventories &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.inventories_index));
v.push_back(std::to_string(e.bot_id));
v.push_back(std::to_string(e.slot_id));
v.push_back(std::to_string(e.item_id));
v.push_back(std::to_string(e.inst_charges));
v.push_back(std::to_string(e.inst_color));
v.push_back(std::to_string(e.inst_no_drop));
v.push_back("'" + Strings::Escape(e.inst_custom_data) + "'");
v.push_back(std::to_string(e.ornament_icon));
v.push_back(std::to_string(e.ornament_id_file));
v.push_back(std::to_string(e.ornament_hero_model));
v.push_back(std::to_string(e.augment_1));
v.push_back(std::to_string(e.augment_2));
v.push_back(std::to_string(e.augment_3));
v.push_back(std::to_string(e.augment_4));
v.push_back(std::to_string(e.augment_5));
v.push_back(std::to_string(e.augment_6));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<BotInventories> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.inventories_index));
v.push_back(std::to_string(e.bot_id));
v.push_back(std::to_string(e.slot_id));
v.push_back(std::to_string(e.item_id));
v.push_back(std::to_string(e.inst_charges));
v.push_back(std::to_string(e.inst_color));
v.push_back(std::to_string(e.inst_no_drop));
v.push_back("'" + Strings::Escape(e.inst_custom_data) + "'");
v.push_back(std::to_string(e.ornament_icon));
v.push_back(std::to_string(e.ornament_id_file));
v.push_back(std::to_string(e.ornament_hero_model));
v.push_back(std::to_string(e.augment_1));
v.push_back(std::to_string(e.augment_2));
v.push_back(std::to_string(e.augment_3));
v.push_back(std::to_string(e.augment_4));
v.push_back(std::to_string(e.augment_5));
v.push_back(std::to_string(e.augment_6));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_BOT_INVENTORIES_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_BOT_OWNER_OPTIONS_REPOSITORY_H
@@ -112,8 +112,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
bot_owner_options_id
)
);
@@ -122,9 +123,9 @@ public:
if (results.RowCount() == 1) {
BotOwnerOptions e{};
e.owner_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.option_type = static_cast<uint16_t>(strtoul(row[1], nullptr, 10));
e.option_value = static_cast<uint16_t>(strtoul(row[2], nullptr, 10));
e.owner_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.option_type = row[1] ? static_cast<uint16_t>(strtoul(row[1], nullptr, 10)) : 0;
e.option_value = row[2] ? static_cast<uint16_t>(strtoul(row[2], nullptr, 10)) : 0;
return e;
}
@@ -250,9 +251,9 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotOwnerOptions e{};
e.owner_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.option_type = static_cast<uint16_t>(strtoul(row[1], nullptr, 10));
e.option_value = static_cast<uint16_t>(strtoul(row[2], nullptr, 10));
e.owner_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.option_type = row[1] ? static_cast<uint16_t>(strtoul(row[1], nullptr, 10)) : 0;
e.option_value = row[2] ? static_cast<uint16_t>(strtoul(row[2], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -277,9 +278,9 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotOwnerOptions e{};
e.owner_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.option_type = static_cast<uint16_t>(strtoul(row[1], nullptr, 10));
e.option_value = static_cast<uint16_t>(strtoul(row[2], nullptr, 10));
e.owner_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.option_type = row[1] ? static_cast<uint16_t>(strtoul(row[1], nullptr, 10)) : 0;
e.option_value = row[2] ? static_cast<uint16_t>(strtoul(row[2], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -338,6 +339,66 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const BotOwnerOptions &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.owner_id));
v.push_back(std::to_string(e.option_type));
v.push_back(std::to_string(e.option_value));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<BotOwnerOptions> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.owner_id));
v.push_back(std::to_string(e.option_type));
v.push_back(std::to_string(e.option_value));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_BOT_OWNER_OPTIONS_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_BOT_PET_BUFFS_REPOSITORY_H
@@ -120,8 +120,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
bot_pet_buffs_id
)
);
@@ -130,11 +131,11 @@ public:
if (results.RowCount() == 1) {
BotPetBuffs e{};
e.pet_buffs_index = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.pets_index = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.spell_id = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.caster_level = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.duration = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
e.pet_buffs_index = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.pets_index = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.spell_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.caster_level = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.duration = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
return e;
}
@@ -265,11 +266,11 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotPetBuffs e{};
e.pet_buffs_index = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.pets_index = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.spell_id = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.caster_level = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.duration = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
e.pet_buffs_index = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.pets_index = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.spell_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.caster_level = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.duration = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -294,11 +295,11 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotPetBuffs e{};
e.pet_buffs_index = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.pets_index = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.spell_id = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.caster_level = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.duration = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
e.pet_buffs_index = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.pets_index = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.spell_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.caster_level = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.duration = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -357,6 +358,70 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const BotPetBuffs &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.pet_buffs_index));
v.push_back(std::to_string(e.pets_index));
v.push_back(std::to_string(e.spell_id));
v.push_back(std::to_string(e.caster_level));
v.push_back(std::to_string(e.duration));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<BotPetBuffs> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.pet_buffs_index));
v.push_back(std::to_string(e.pets_index));
v.push_back(std::to_string(e.spell_id));
v.push_back(std::to_string(e.caster_level));
v.push_back(std::to_string(e.duration));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_BOT_PET_BUFFS_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_BOT_PET_INVENTORIES_REPOSITORY_H
@@ -112,8 +112,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
bot_pet_inventories_id
)
);
@@ -122,9 +123,9 @@ public:
if (results.RowCount() == 1) {
BotPetInventories e{};
e.pet_inventories_index = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.pets_index = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.item_id = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.pet_inventories_index = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.pets_index = 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;
return e;
}
@@ -249,9 +250,9 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotPetInventories e{};
e.pet_inventories_index = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.pets_index = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.item_id = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.pet_inventories_index = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.pets_index = 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;
all_entries.push_back(e);
}
@@ -276,9 +277,9 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotPetInventories e{};
e.pet_inventories_index = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.pets_index = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.item_id = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.pet_inventories_index = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.pets_index = 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;
all_entries.push_back(e);
}
@@ -337,6 +338,66 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const BotPetInventories &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.pet_inventories_index));
v.push_back(std::to_string(e.pets_index));
v.push_back(std::to_string(e.item_id));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<BotPetInventories> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.pet_inventories_index));
v.push_back(std::to_string(e.pets_index));
v.push_back(std::to_string(e.item_id));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_BOT_PET_INVENTORIES_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_BOT_PETS_REPOSITORY_H
@@ -124,8 +124,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
bot_pets_id
)
);
@@ -134,12 +135,12 @@ public:
if (results.RowCount() == 1) {
BotPets e{};
e.pets_index = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.spell_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.bot_id = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.pets_index = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.spell_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.bot_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.name = row[3] ? row[3] : "";
e.mana = static_cast<int32_t>(atoi(row[4]));
e.hp = static_cast<int32_t>(atoi(row[5]));
e.mana = row[4] ? static_cast<int32_t>(atoi(row[4])) : 0;
e.hp = row[5] ? static_cast<int32_t>(atoi(row[5])) : 0;
return e;
}
@@ -273,12 +274,12 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotPets e{};
e.pets_index = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.spell_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.bot_id = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.pets_index = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.spell_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.bot_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.name = row[3] ? row[3] : "";
e.mana = static_cast<int32_t>(atoi(row[4]));
e.hp = static_cast<int32_t>(atoi(row[5]));
e.mana = row[4] ? static_cast<int32_t>(atoi(row[4])) : 0;
e.hp = row[5] ? static_cast<int32_t>(atoi(row[5])) : 0;
all_entries.push_back(e);
}
@@ -303,12 +304,12 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotPets e{};
e.pets_index = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.spell_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.bot_id = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.pets_index = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.spell_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.bot_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.name = row[3] ? row[3] : "";
e.mana = static_cast<int32_t>(atoi(row[4]));
e.hp = static_cast<int32_t>(atoi(row[5]));
e.mana = row[4] ? static_cast<int32_t>(atoi(row[4])) : 0;
e.hp = row[5] ? static_cast<int32_t>(atoi(row[5])) : 0;
all_entries.push_back(e);
}
@@ -367,6 +368,72 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const BotPets &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.pets_index));
v.push_back(std::to_string(e.spell_id));
v.push_back(std::to_string(e.bot_id));
v.push_back("'" + Strings::Escape(e.name) + "'");
v.push_back(std::to_string(e.mana));
v.push_back(std::to_string(e.hp));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<BotPets> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.pets_index));
v.push_back(std::to_string(e.spell_id));
v.push_back(std::to_string(e.bot_id));
v.push_back("'" + Strings::Escape(e.name) + "'");
v.push_back(std::to_string(e.mana));
v.push_back(std::to_string(e.hp));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_BOT_PETS_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_BOT_SPELL_CASTING_CHANCES_REPOSITORY_H
@@ -180,8 +180,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
bot_spell_casting_chances_id
)
);
@@ -190,26 +191,26 @@ public:
if (results.RowCount() == 1) {
BotSpellCastingChances e{};
e.id = static_cast<int32_t>(atoi(row[0]));
e.spell_type_index = static_cast<uint8_t>(strtoul(row[1], nullptr, 10));
e.class_id = static_cast<uint8_t>(strtoul(row[2], nullptr, 10));
e.stance_index = static_cast<uint8_t>(strtoul(row[3], nullptr, 10));
e.nHSND_value = static_cast<uint8_t>(strtoul(row[4], nullptr, 10));
e.pH_value = static_cast<uint8_t>(strtoul(row[5], nullptr, 10));
e.pS_value = static_cast<uint8_t>(strtoul(row[6], nullptr, 10));
e.pHS_value = static_cast<uint8_t>(strtoul(row[7], nullptr, 10));
e.pN_value = static_cast<uint8_t>(strtoul(row[8], nullptr, 10));
e.pHN_value = static_cast<uint8_t>(strtoul(row[9], nullptr, 10));
e.pSN_value = static_cast<uint8_t>(strtoul(row[10], nullptr, 10));
e.pHSN_value = static_cast<uint8_t>(strtoul(row[11], nullptr, 10));
e.pD_value = static_cast<uint8_t>(strtoul(row[12], nullptr, 10));
e.pHD_value = static_cast<uint8_t>(strtoul(row[13], nullptr, 10));
e.pSD_value = static_cast<uint8_t>(strtoul(row[14], nullptr, 10));
e.pHSD_value = static_cast<uint8_t>(strtoul(row[15], nullptr, 10));
e.pND_value = static_cast<uint8_t>(strtoul(row[16], nullptr, 10));
e.pHND_value = static_cast<uint8_t>(strtoul(row[17], nullptr, 10));
e.pSND_value = static_cast<uint8_t>(strtoul(row[18], nullptr, 10));
e.pHSND_value = static_cast<uint8_t>(strtoul(row[19], nullptr, 10));
e.id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.spell_type_index = row[1] ? static_cast<uint8_t>(strtoul(row[1], nullptr, 10)) : 0;
e.class_id = row[2] ? static_cast<uint8_t>(strtoul(row[2], nullptr, 10)) : 0;
e.stance_index = row[3] ? static_cast<uint8_t>(strtoul(row[3], nullptr, 10)) : 0;
e.nHSND_value = row[4] ? static_cast<uint8_t>(strtoul(row[4], nullptr, 10)) : 0;
e.pH_value = row[5] ? static_cast<uint8_t>(strtoul(row[5], nullptr, 10)) : 0;
e.pS_value = row[6] ? static_cast<uint8_t>(strtoul(row[6], nullptr, 10)) : 0;
e.pHS_value = row[7] ? static_cast<uint8_t>(strtoul(row[7], nullptr, 10)) : 0;
e.pN_value = row[8] ? static_cast<uint8_t>(strtoul(row[8], nullptr, 10)) : 0;
e.pHN_value = row[9] ? static_cast<uint8_t>(strtoul(row[9], nullptr, 10)) : 0;
e.pSN_value = row[10] ? static_cast<uint8_t>(strtoul(row[10], nullptr, 10)) : 0;
e.pHSN_value = row[11] ? static_cast<uint8_t>(strtoul(row[11], nullptr, 10)) : 0;
e.pD_value = row[12] ? static_cast<uint8_t>(strtoul(row[12], nullptr, 10)) : 0;
e.pHD_value = row[13] ? static_cast<uint8_t>(strtoul(row[13], nullptr, 10)) : 0;
e.pSD_value = row[14] ? static_cast<uint8_t>(strtoul(row[14], nullptr, 10)) : 0;
e.pHSD_value = row[15] ? static_cast<uint8_t>(strtoul(row[15], nullptr, 10)) : 0;
e.pND_value = row[16] ? static_cast<uint8_t>(strtoul(row[16], nullptr, 10)) : 0;
e.pHND_value = row[17] ? static_cast<uint8_t>(strtoul(row[17], nullptr, 10)) : 0;
e.pSND_value = row[18] ? static_cast<uint8_t>(strtoul(row[18], nullptr, 10)) : 0;
e.pHSND_value = row[19] ? static_cast<uint8_t>(strtoul(row[19], nullptr, 10)) : 0;
return e;
}
@@ -385,26 +386,26 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotSpellCastingChances e{};
e.id = static_cast<int32_t>(atoi(row[0]));
e.spell_type_index = static_cast<uint8_t>(strtoul(row[1], nullptr, 10));
e.class_id = static_cast<uint8_t>(strtoul(row[2], nullptr, 10));
e.stance_index = static_cast<uint8_t>(strtoul(row[3], nullptr, 10));
e.nHSND_value = static_cast<uint8_t>(strtoul(row[4], nullptr, 10));
e.pH_value = static_cast<uint8_t>(strtoul(row[5], nullptr, 10));
e.pS_value = static_cast<uint8_t>(strtoul(row[6], nullptr, 10));
e.pHS_value = static_cast<uint8_t>(strtoul(row[7], nullptr, 10));
e.pN_value = static_cast<uint8_t>(strtoul(row[8], nullptr, 10));
e.pHN_value = static_cast<uint8_t>(strtoul(row[9], nullptr, 10));
e.pSN_value = static_cast<uint8_t>(strtoul(row[10], nullptr, 10));
e.pHSN_value = static_cast<uint8_t>(strtoul(row[11], nullptr, 10));
e.pD_value = static_cast<uint8_t>(strtoul(row[12], nullptr, 10));
e.pHD_value = static_cast<uint8_t>(strtoul(row[13], nullptr, 10));
e.pSD_value = static_cast<uint8_t>(strtoul(row[14], nullptr, 10));
e.pHSD_value = static_cast<uint8_t>(strtoul(row[15], nullptr, 10));
e.pND_value = static_cast<uint8_t>(strtoul(row[16], nullptr, 10));
e.pHND_value = static_cast<uint8_t>(strtoul(row[17], nullptr, 10));
e.pSND_value = static_cast<uint8_t>(strtoul(row[18], nullptr, 10));
e.pHSND_value = static_cast<uint8_t>(strtoul(row[19], nullptr, 10));
e.id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.spell_type_index = row[1] ? static_cast<uint8_t>(strtoul(row[1], nullptr, 10)) : 0;
e.class_id = row[2] ? static_cast<uint8_t>(strtoul(row[2], nullptr, 10)) : 0;
e.stance_index = row[3] ? static_cast<uint8_t>(strtoul(row[3], nullptr, 10)) : 0;
e.nHSND_value = row[4] ? static_cast<uint8_t>(strtoul(row[4], nullptr, 10)) : 0;
e.pH_value = row[5] ? static_cast<uint8_t>(strtoul(row[5], nullptr, 10)) : 0;
e.pS_value = row[6] ? static_cast<uint8_t>(strtoul(row[6], nullptr, 10)) : 0;
e.pHS_value = row[7] ? static_cast<uint8_t>(strtoul(row[7], nullptr, 10)) : 0;
e.pN_value = row[8] ? static_cast<uint8_t>(strtoul(row[8], nullptr, 10)) : 0;
e.pHN_value = row[9] ? static_cast<uint8_t>(strtoul(row[9], nullptr, 10)) : 0;
e.pSN_value = row[10] ? static_cast<uint8_t>(strtoul(row[10], nullptr, 10)) : 0;
e.pHSN_value = row[11] ? static_cast<uint8_t>(strtoul(row[11], nullptr, 10)) : 0;
e.pD_value = row[12] ? static_cast<uint8_t>(strtoul(row[12], nullptr, 10)) : 0;
e.pHD_value = row[13] ? static_cast<uint8_t>(strtoul(row[13], nullptr, 10)) : 0;
e.pSD_value = row[14] ? static_cast<uint8_t>(strtoul(row[14], nullptr, 10)) : 0;
e.pHSD_value = row[15] ? static_cast<uint8_t>(strtoul(row[15], nullptr, 10)) : 0;
e.pND_value = row[16] ? static_cast<uint8_t>(strtoul(row[16], nullptr, 10)) : 0;
e.pHND_value = row[17] ? static_cast<uint8_t>(strtoul(row[17], nullptr, 10)) : 0;
e.pSND_value = row[18] ? static_cast<uint8_t>(strtoul(row[18], nullptr, 10)) : 0;
e.pHSND_value = row[19] ? static_cast<uint8_t>(strtoul(row[19], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -429,26 +430,26 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotSpellCastingChances e{};
e.id = static_cast<int32_t>(atoi(row[0]));
e.spell_type_index = static_cast<uint8_t>(strtoul(row[1], nullptr, 10));
e.class_id = static_cast<uint8_t>(strtoul(row[2], nullptr, 10));
e.stance_index = static_cast<uint8_t>(strtoul(row[3], nullptr, 10));
e.nHSND_value = static_cast<uint8_t>(strtoul(row[4], nullptr, 10));
e.pH_value = static_cast<uint8_t>(strtoul(row[5], nullptr, 10));
e.pS_value = static_cast<uint8_t>(strtoul(row[6], nullptr, 10));
e.pHS_value = static_cast<uint8_t>(strtoul(row[7], nullptr, 10));
e.pN_value = static_cast<uint8_t>(strtoul(row[8], nullptr, 10));
e.pHN_value = static_cast<uint8_t>(strtoul(row[9], nullptr, 10));
e.pSN_value = static_cast<uint8_t>(strtoul(row[10], nullptr, 10));
e.pHSN_value = static_cast<uint8_t>(strtoul(row[11], nullptr, 10));
e.pD_value = static_cast<uint8_t>(strtoul(row[12], nullptr, 10));
e.pHD_value = static_cast<uint8_t>(strtoul(row[13], nullptr, 10));
e.pSD_value = static_cast<uint8_t>(strtoul(row[14], nullptr, 10));
e.pHSD_value = static_cast<uint8_t>(strtoul(row[15], nullptr, 10));
e.pND_value = static_cast<uint8_t>(strtoul(row[16], nullptr, 10));
e.pHND_value = static_cast<uint8_t>(strtoul(row[17], nullptr, 10));
e.pSND_value = static_cast<uint8_t>(strtoul(row[18], nullptr, 10));
e.pHSND_value = static_cast<uint8_t>(strtoul(row[19], nullptr, 10));
e.id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.spell_type_index = row[1] ? static_cast<uint8_t>(strtoul(row[1], nullptr, 10)) : 0;
e.class_id = row[2] ? static_cast<uint8_t>(strtoul(row[2], nullptr, 10)) : 0;
e.stance_index = row[3] ? static_cast<uint8_t>(strtoul(row[3], nullptr, 10)) : 0;
e.nHSND_value = row[4] ? static_cast<uint8_t>(strtoul(row[4], nullptr, 10)) : 0;
e.pH_value = row[5] ? static_cast<uint8_t>(strtoul(row[5], nullptr, 10)) : 0;
e.pS_value = row[6] ? static_cast<uint8_t>(strtoul(row[6], nullptr, 10)) : 0;
e.pHS_value = row[7] ? static_cast<uint8_t>(strtoul(row[7], nullptr, 10)) : 0;
e.pN_value = row[8] ? static_cast<uint8_t>(strtoul(row[8], nullptr, 10)) : 0;
e.pHN_value = row[9] ? static_cast<uint8_t>(strtoul(row[9], nullptr, 10)) : 0;
e.pSN_value = row[10] ? static_cast<uint8_t>(strtoul(row[10], nullptr, 10)) : 0;
e.pHSN_value = row[11] ? static_cast<uint8_t>(strtoul(row[11], nullptr, 10)) : 0;
e.pD_value = row[12] ? static_cast<uint8_t>(strtoul(row[12], nullptr, 10)) : 0;
e.pHD_value = row[13] ? static_cast<uint8_t>(strtoul(row[13], nullptr, 10)) : 0;
e.pSD_value = row[14] ? static_cast<uint8_t>(strtoul(row[14], nullptr, 10)) : 0;
e.pHSD_value = row[15] ? static_cast<uint8_t>(strtoul(row[15], nullptr, 10)) : 0;
e.pND_value = row[16] ? static_cast<uint8_t>(strtoul(row[16], nullptr, 10)) : 0;
e.pHND_value = row[17] ? static_cast<uint8_t>(strtoul(row[17], nullptr, 10)) : 0;
e.pSND_value = row[18] ? static_cast<uint8_t>(strtoul(row[18], nullptr, 10)) : 0;
e.pHSND_value = row[19] ? static_cast<uint8_t>(strtoul(row[19], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -507,6 +508,100 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const BotSpellCastingChances &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back(std::to_string(e.spell_type_index));
v.push_back(std::to_string(e.class_id));
v.push_back(std::to_string(e.stance_index));
v.push_back(std::to_string(e.nHSND_value));
v.push_back(std::to_string(e.pH_value));
v.push_back(std::to_string(e.pS_value));
v.push_back(std::to_string(e.pHS_value));
v.push_back(std::to_string(e.pN_value));
v.push_back(std::to_string(e.pHN_value));
v.push_back(std::to_string(e.pSN_value));
v.push_back(std::to_string(e.pHSN_value));
v.push_back(std::to_string(e.pD_value));
v.push_back(std::to_string(e.pHD_value));
v.push_back(std::to_string(e.pSD_value));
v.push_back(std::to_string(e.pHSD_value));
v.push_back(std::to_string(e.pND_value));
v.push_back(std::to_string(e.pHND_value));
v.push_back(std::to_string(e.pSND_value));
v.push_back(std::to_string(e.pHSND_value));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<BotSpellCastingChances> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back(std::to_string(e.spell_type_index));
v.push_back(std::to_string(e.class_id));
v.push_back(std::to_string(e.stance_index));
v.push_back(std::to_string(e.nHSND_value));
v.push_back(std::to_string(e.pH_value));
v.push_back(std::to_string(e.pS_value));
v.push_back(std::to_string(e.pHS_value));
v.push_back(std::to_string(e.pN_value));
v.push_back(std::to_string(e.pHN_value));
v.push_back(std::to_string(e.pSN_value));
v.push_back(std::to_string(e.pHSN_value));
v.push_back(std::to_string(e.pD_value));
v.push_back(std::to_string(e.pHD_value));
v.push_back(std::to_string(e.pSD_value));
v.push_back(std::to_string(e.pHSD_value));
v.push_back(std::to_string(e.pND_value));
v.push_back(std::to_string(e.pHND_value));
v.push_back(std::to_string(e.pSND_value));
v.push_back(std::to_string(e.pHSND_value));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_BOT_SPELL_CASTING_CHANCES_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_BOT_SPELL_SETTINGS_REPOSITORY_H
@@ -128,8 +128,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
bot_spell_settings_id
)
);
@@ -138,13 +139,13 @@ public:
if (results.RowCount() == 1) {
BotSpellSettings e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.bot_id = static_cast<int32_t>(atoi(row[1]));
e.spell_id = static_cast<int16_t>(atoi(row[2]));
e.priority = static_cast<int16_t>(atoi(row[3]));
e.min_hp = static_cast<int16_t>(atoi(row[4]));
e.max_hp = static_cast<int16_t>(atoi(row[5]));
e.is_enabled = static_cast<uint8_t>(strtoul(row[6], nullptr, 10));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.bot_id = row[1] ? static_cast<int32_t>(atoi(row[1])) : 0;
e.spell_id = row[2] ? static_cast<int16_t>(atoi(row[2])) : 0;
e.priority = row[3] ? static_cast<int16_t>(atoi(row[3])) : 0;
e.min_hp = row[4] ? static_cast<int16_t>(atoi(row[4])) : 0;
e.max_hp = row[5] ? static_cast<int16_t>(atoi(row[5])) : 0;
e.is_enabled = row[6] ? static_cast<uint8_t>(strtoul(row[6], nullptr, 10)) : 1;
return e;
}
@@ -281,13 +282,13 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotSpellSettings e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.bot_id = static_cast<int32_t>(atoi(row[1]));
e.spell_id = static_cast<int16_t>(atoi(row[2]));
e.priority = static_cast<int16_t>(atoi(row[3]));
e.min_hp = static_cast<int16_t>(atoi(row[4]));
e.max_hp = static_cast<int16_t>(atoi(row[5]));
e.is_enabled = static_cast<uint8_t>(strtoul(row[6], nullptr, 10));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.bot_id = row[1] ? static_cast<int32_t>(atoi(row[1])) : 0;
e.spell_id = row[2] ? static_cast<int16_t>(atoi(row[2])) : 0;
e.priority = row[3] ? static_cast<int16_t>(atoi(row[3])) : 0;
e.min_hp = row[4] ? static_cast<int16_t>(atoi(row[4])) : 0;
e.max_hp = row[5] ? static_cast<int16_t>(atoi(row[5])) : 0;
e.is_enabled = row[6] ? static_cast<uint8_t>(strtoul(row[6], nullptr, 10)) : 1;
all_entries.push_back(e);
}
@@ -312,13 +313,13 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotSpellSettings e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.bot_id = static_cast<int32_t>(atoi(row[1]));
e.spell_id = static_cast<int16_t>(atoi(row[2]));
e.priority = static_cast<int16_t>(atoi(row[3]));
e.min_hp = static_cast<int16_t>(atoi(row[4]));
e.max_hp = static_cast<int16_t>(atoi(row[5]));
e.is_enabled = static_cast<uint8_t>(strtoul(row[6], nullptr, 10));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.bot_id = row[1] ? static_cast<int32_t>(atoi(row[1])) : 0;
e.spell_id = row[2] ? static_cast<int16_t>(atoi(row[2])) : 0;
e.priority = row[3] ? static_cast<int16_t>(atoi(row[3])) : 0;
e.min_hp = row[4] ? static_cast<int16_t>(atoi(row[4])) : 0;
e.max_hp = row[5] ? static_cast<int16_t>(atoi(row[5])) : 0;
e.is_enabled = row[6] ? static_cast<uint8_t>(strtoul(row[6], nullptr, 10)) : 1;
all_entries.push_back(e);
}
@@ -377,6 +378,74 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const BotSpellSettings &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back(std::to_string(e.bot_id));
v.push_back(std::to_string(e.spell_id));
v.push_back(std::to_string(e.priority));
v.push_back(std::to_string(e.min_hp));
v.push_back(std::to_string(e.max_hp));
v.push_back(std::to_string(e.is_enabled));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<BotSpellSettings> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back(std::to_string(e.bot_id));
v.push_back(std::to_string(e.spell_id));
v.push_back(std::to_string(e.priority));
v.push_back(std::to_string(e.min_hp));
v.push_back(std::to_string(e.max_hp));
v.push_back(std::to_string(e.is_enabled));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_BOT_SPELL_SETTINGS_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_BOT_SPELLS_ENTRIES_REPOSITORY_H
@@ -160,8 +160,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
bot_spells_entries_id
)
);
@@ -170,21 +171,21 @@ public:
if (results.RowCount() == 1) {
BotSpellsEntries e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.npc_spells_id = static_cast<int32_t>(atoi(row[1]));
e.spellid = static_cast<int16_t>(atoi(row[2]));
e.type = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.minlevel = static_cast<uint8_t>(strtoul(row[4], nullptr, 10));
e.maxlevel = static_cast<uint8_t>(strtoul(row[5], nullptr, 10));
e.manacost = static_cast<int16_t>(atoi(row[6]));
e.recast_delay = static_cast<int32_t>(atoi(row[7]));
e.priority = static_cast<int16_t>(atoi(row[8]));
e.resist_adjust = static_cast<int32_t>(atoi(row[9]));
e.min_hp = static_cast<int16_t>(atoi(row[10]));
e.max_hp = static_cast<int16_t>(atoi(row[11]));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.npc_spells_id = row[1] ? static_cast<int32_t>(atoi(row[1])) : 0;
e.spellid = row[2] ? static_cast<int16_t>(atoi(row[2])) : 0;
e.type = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.minlevel = row[4] ? static_cast<uint8_t>(strtoul(row[4], nullptr, 10)) : 0;
e.maxlevel = row[5] ? static_cast<uint8_t>(strtoul(row[5], nullptr, 10)) : 255;
e.manacost = row[6] ? static_cast<int16_t>(atoi(row[6])) : -1;
e.recast_delay = row[7] ? static_cast<int32_t>(atoi(row[7])) : -1;
e.priority = row[8] ? static_cast<int16_t>(atoi(row[8])) : 0;
e.resist_adjust = row[9] ? static_cast<int32_t>(atoi(row[9])) : 0;
e.min_hp = row[10] ? static_cast<int16_t>(atoi(row[10])) : 0;
e.max_hp = row[11] ? static_cast<int16_t>(atoi(row[11])) : 0;
e.bucket_name = row[12] ? row[12] : "";
e.bucket_value = row[13] ? row[13] : "";
e.bucket_comparison = static_cast<uint8_t>(strtoul(row[14], nullptr, 10));
e.bucket_comparison = row[14] ? static_cast<uint8_t>(strtoul(row[14], nullptr, 10)) : 0;
return e;
}
@@ -345,21 +346,21 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotSpellsEntries e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.npc_spells_id = static_cast<int32_t>(atoi(row[1]));
e.spellid = static_cast<int16_t>(atoi(row[2]));
e.type = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.minlevel = static_cast<uint8_t>(strtoul(row[4], nullptr, 10));
e.maxlevel = static_cast<uint8_t>(strtoul(row[5], nullptr, 10));
e.manacost = static_cast<int16_t>(atoi(row[6]));
e.recast_delay = static_cast<int32_t>(atoi(row[7]));
e.priority = static_cast<int16_t>(atoi(row[8]));
e.resist_adjust = static_cast<int32_t>(atoi(row[9]));
e.min_hp = static_cast<int16_t>(atoi(row[10]));
e.max_hp = static_cast<int16_t>(atoi(row[11]));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.npc_spells_id = row[1] ? static_cast<int32_t>(atoi(row[1])) : 0;
e.spellid = row[2] ? static_cast<int16_t>(atoi(row[2])) : 0;
e.type = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.minlevel = row[4] ? static_cast<uint8_t>(strtoul(row[4], nullptr, 10)) : 0;
e.maxlevel = row[5] ? static_cast<uint8_t>(strtoul(row[5], nullptr, 10)) : 255;
e.manacost = row[6] ? static_cast<int16_t>(atoi(row[6])) : -1;
e.recast_delay = row[7] ? static_cast<int32_t>(atoi(row[7])) : -1;
e.priority = row[8] ? static_cast<int16_t>(atoi(row[8])) : 0;
e.resist_adjust = row[9] ? static_cast<int32_t>(atoi(row[9])) : 0;
e.min_hp = row[10] ? static_cast<int16_t>(atoi(row[10])) : 0;
e.max_hp = row[11] ? static_cast<int16_t>(atoi(row[11])) : 0;
e.bucket_name = row[12] ? row[12] : "";
e.bucket_value = row[13] ? row[13] : "";
e.bucket_comparison = static_cast<uint8_t>(strtoul(row[14], nullptr, 10));
e.bucket_comparison = row[14] ? static_cast<uint8_t>(strtoul(row[14], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -384,21 +385,21 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotSpellsEntries e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.npc_spells_id = static_cast<int32_t>(atoi(row[1]));
e.spellid = static_cast<int16_t>(atoi(row[2]));
e.type = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.minlevel = static_cast<uint8_t>(strtoul(row[4], nullptr, 10));
e.maxlevel = static_cast<uint8_t>(strtoul(row[5], nullptr, 10));
e.manacost = static_cast<int16_t>(atoi(row[6]));
e.recast_delay = static_cast<int32_t>(atoi(row[7]));
e.priority = static_cast<int16_t>(atoi(row[8]));
e.resist_adjust = static_cast<int32_t>(atoi(row[9]));
e.min_hp = static_cast<int16_t>(atoi(row[10]));
e.max_hp = static_cast<int16_t>(atoi(row[11]));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.npc_spells_id = row[1] ? static_cast<int32_t>(atoi(row[1])) : 0;
e.spellid = row[2] ? static_cast<int16_t>(atoi(row[2])) : 0;
e.type = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.minlevel = row[4] ? static_cast<uint8_t>(strtoul(row[4], nullptr, 10)) : 0;
e.maxlevel = row[5] ? static_cast<uint8_t>(strtoul(row[5], nullptr, 10)) : 255;
e.manacost = row[6] ? static_cast<int16_t>(atoi(row[6])) : -1;
e.recast_delay = row[7] ? static_cast<int32_t>(atoi(row[7])) : -1;
e.priority = row[8] ? static_cast<int16_t>(atoi(row[8])) : 0;
e.resist_adjust = row[9] ? static_cast<int32_t>(atoi(row[9])) : 0;
e.min_hp = row[10] ? static_cast<int16_t>(atoi(row[10])) : 0;
e.max_hp = row[11] ? static_cast<int16_t>(atoi(row[11])) : 0;
e.bucket_name = row[12] ? row[12] : "";
e.bucket_value = row[13] ? row[13] : "";
e.bucket_comparison = static_cast<uint8_t>(strtoul(row[14], nullptr, 10));
e.bucket_comparison = row[14] ? static_cast<uint8_t>(strtoul(row[14], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -457,6 +458,90 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const BotSpellsEntries &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back(std::to_string(e.npc_spells_id));
v.push_back(std::to_string(e.spellid));
v.push_back(std::to_string(e.type));
v.push_back(std::to_string(e.minlevel));
v.push_back(std::to_string(e.maxlevel));
v.push_back(std::to_string(e.manacost));
v.push_back(std::to_string(e.recast_delay));
v.push_back(std::to_string(e.priority));
v.push_back(std::to_string(e.resist_adjust));
v.push_back(std::to_string(e.min_hp));
v.push_back(std::to_string(e.max_hp));
v.push_back("'" + Strings::Escape(e.bucket_name) + "'");
v.push_back("'" + Strings::Escape(e.bucket_value) + "'");
v.push_back(std::to_string(e.bucket_comparison));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<BotSpellsEntries> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back(std::to_string(e.npc_spells_id));
v.push_back(std::to_string(e.spellid));
v.push_back(std::to_string(e.type));
v.push_back(std::to_string(e.minlevel));
v.push_back(std::to_string(e.maxlevel));
v.push_back(std::to_string(e.manacost));
v.push_back(std::to_string(e.recast_delay));
v.push_back(std::to_string(e.priority));
v.push_back(std::to_string(e.resist_adjust));
v.push_back(std::to_string(e.min_hp));
v.push_back(std::to_string(e.max_hp));
v.push_back("'" + Strings::Escape(e.bucket_name) + "'");
v.push_back("'" + Strings::Escape(e.bucket_value) + "'");
v.push_back(std::to_string(e.bucket_comparison));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_BOT_SPELLS_ENTRIES_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_BOT_STANCES_REPOSITORY_H
@@ -108,8 +108,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
bot_stances_id
)
);
@@ -118,8 +119,8 @@ public:
if (results.RowCount() == 1) {
BotStances e{};
e.bot_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.stance_id = static_cast<uint8_t>(strtoul(row[1], nullptr, 10));
e.bot_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.stance_id = row[1] ? static_cast<uint8_t>(strtoul(row[1], nullptr, 10)) : 0;
return e;
}
@@ -242,8 +243,8 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotStances e{};
e.bot_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.stance_id = static_cast<uint8_t>(strtoul(row[1], nullptr, 10));
e.bot_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.stance_id = row[1] ? static_cast<uint8_t>(strtoul(row[1], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -268,8 +269,8 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotStances e{};
e.bot_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.stance_id = static_cast<uint8_t>(strtoul(row[1], nullptr, 10));
e.bot_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.stance_id = row[1] ? static_cast<uint8_t>(strtoul(row[1], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -328,6 +329,64 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const BotStances &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.bot_id));
v.push_back(std::to_string(e.stance_id));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<BotStances> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.bot_id));
v.push_back(std::to_string(e.stance_id));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_BOT_STANCES_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_BOT_STARTING_ITEMS_REPOSITORY_H
@@ -16,7 +16,6 @@
#include "../../strings.h"
#include <ctime>
class BaseBotStartingItemsRepository {
public:
struct BotStartingItems {
@@ -25,6 +24,7 @@ public:
uint32_t classes;
uint32_t item_id;
uint8_t item_charges;
uint8_t min_status;
int32_t slot_id;
int8_t min_expansion;
int8_t max_expansion;
@@ -45,6 +45,7 @@ public:
"classes",
"item_id",
"item_charges",
"min_status",
"slot_id",
"min_expansion",
"max_expansion",
@@ -61,6 +62,7 @@ public:
"classes",
"item_id",
"item_charges",
"min_status",
"slot_id",
"min_expansion",
"max_expansion",
@@ -111,6 +113,7 @@ public:
e.classes = 0;
e.item_id = 0;
e.item_charges = 1;
e.min_status = 0;
e.slot_id = -1;
e.min_expansion = -1;
e.max_expansion = -1;
@@ -152,16 +155,17 @@ public:
if (results.RowCount() == 1) {
BotStartingItems e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.races = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.classes = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.item_id = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.item_charges = static_cast<uint8_t>(strtoul(row[4], nullptr, 10));
e.slot_id = static_cast<int32_t>(atoi(row[5]));
e.min_expansion = static_cast<int8_t>(atoi(row[6]));
e.max_expansion = static_cast<int8_t>(atoi(row[7]));
e.content_flags = row[8] ? row[8] : "";
e.content_flags_disabled = row[9] ? row[9] : "";
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.races = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.classes = 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.item_charges = row[4] ? static_cast<uint8_t>(strtoul(row[4], nullptr, 10)) : 1;
e.min_status = row[5] ? static_cast<uint8_t>(strtoul(row[5], nullptr, 10)) : 0;
e.slot_id = row[6] ? static_cast<int32_t>(atoi(row[6])) : -1;
e.min_expansion = row[7] ? static_cast<int8_t>(atoi(row[7])) : -1;
e.max_expansion = row[8] ? static_cast<int8_t>(atoi(row[8])) : -1;
e.content_flags = row[9] ? row[9] : "";
e.content_flags_disabled = row[10] ? row[10] : "";
return e;
}
@@ -199,11 +203,12 @@ public:
v.push_back(columns[2] + " = " + std::to_string(e.classes));
v.push_back(columns[3] + " = " + std::to_string(e.item_id));
v.push_back(columns[4] + " = " + std::to_string(e.item_charges));
v.push_back(columns[5] + " = " + std::to_string(e.slot_id));
v.push_back(columns[6] + " = " + std::to_string(e.min_expansion));
v.push_back(columns[7] + " = " + std::to_string(e.max_expansion));
v.push_back(columns[8] + " = '" + Strings::Escape(e.content_flags) + "'");
v.push_back(columns[9] + " = '" + Strings::Escape(e.content_flags_disabled) + "'");
v.push_back(columns[5] + " = " + std::to_string(e.min_status));
v.push_back(columns[6] + " = " + std::to_string(e.slot_id));
v.push_back(columns[7] + " = " + std::to_string(e.min_expansion));
v.push_back(columns[8] + " = " + std::to_string(e.max_expansion));
v.push_back(columns[9] + " = '" + Strings::Escape(e.content_flags) + "'");
v.push_back(columns[10] + " = '" + Strings::Escape(e.content_flags_disabled) + "'");
auto results = db.QueryDatabase(
fmt::format(
@@ -230,6 +235,7 @@ public:
v.push_back(std::to_string(e.classes));
v.push_back(std::to_string(e.item_id));
v.push_back(std::to_string(e.item_charges));
v.push_back(std::to_string(e.min_status));
v.push_back(std::to_string(e.slot_id));
v.push_back(std::to_string(e.min_expansion));
v.push_back(std::to_string(e.max_expansion));
@@ -269,6 +275,7 @@ public:
v.push_back(std::to_string(e.classes));
v.push_back(std::to_string(e.item_id));
v.push_back(std::to_string(e.item_charges));
v.push_back(std::to_string(e.min_status));
v.push_back(std::to_string(e.slot_id));
v.push_back(std::to_string(e.min_expansion));
v.push_back(std::to_string(e.max_expansion));
@@ -307,16 +314,17 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotStartingItems e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.races = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.classes = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.item_id = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.item_charges = static_cast<uint8_t>(strtoul(row[4], nullptr, 10));
e.slot_id = static_cast<int32_t>(atoi(row[5]));
e.min_expansion = static_cast<int8_t>(atoi(row[6]));
e.max_expansion = static_cast<int8_t>(atoi(row[7]));
e.content_flags = row[8] ? row[8] : "";
e.content_flags_disabled = row[9] ? row[9] : "";
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.races = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.classes = 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.item_charges = row[4] ? static_cast<uint8_t>(strtoul(row[4], nullptr, 10)) : 1;
e.min_status = row[5] ? static_cast<uint8_t>(strtoul(row[5], nullptr, 10)) : 0;
e.slot_id = row[6] ? static_cast<int32_t>(atoi(row[6])) : -1;
e.min_expansion = row[7] ? static_cast<int8_t>(atoi(row[7])) : -1;
e.max_expansion = row[8] ? static_cast<int8_t>(atoi(row[8])) : -1;
e.content_flags = row[9] ? row[9] : "";
e.content_flags_disabled = row[10] ? row[10] : "";
all_entries.push_back(e);
}
@@ -341,16 +349,17 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotStartingItems e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.races = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.classes = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.item_id = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.item_charges = static_cast<uint8_t>(strtoul(row[4], nullptr, 10));
e.slot_id = static_cast<int32_t>(atoi(row[5]));
e.min_expansion = static_cast<int8_t>(atoi(row[6]));
e.max_expansion = static_cast<int8_t>(atoi(row[7]));
e.content_flags = row[8] ? row[8] : "";
e.content_flags_disabled = row[9] ? row[9] : "";
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.races = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.classes = 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.item_charges = row[4] ? static_cast<uint8_t>(strtoul(row[4], nullptr, 10)) : 1;
e.min_status = row[5] ? static_cast<uint8_t>(strtoul(row[5], nullptr, 10)) : 0;
e.slot_id = row[6] ? static_cast<int32_t>(atoi(row[6])) : -1;
e.min_expansion = row[7] ? static_cast<int8_t>(atoi(row[7])) : -1;
e.max_expansion = row[8] ? static_cast<int8_t>(atoi(row[8])) : -1;
e.content_flags = row[9] ? row[9] : "";
e.content_flags_disabled = row[10] ? row[10] : "";
all_entries.push_back(e);
}
@@ -409,6 +418,82 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const BotStartingItems &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back(std::to_string(e.races));
v.push_back(std::to_string(e.classes));
v.push_back(std::to_string(e.item_id));
v.push_back(std::to_string(e.item_charges));
v.push_back(std::to_string(e.min_status));
v.push_back(std::to_string(e.slot_id));
v.push_back(std::to_string(e.min_expansion));
v.push_back(std::to_string(e.max_expansion));
v.push_back("'" + Strings::Escape(e.content_flags) + "'");
v.push_back("'" + Strings::Escape(e.content_flags_disabled) + "'");
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<BotStartingItems> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back(std::to_string(e.races));
v.push_back(std::to_string(e.classes));
v.push_back(std::to_string(e.item_id));
v.push_back(std::to_string(e.item_charges));
v.push_back(std::to_string(e.min_status));
v.push_back(std::to_string(e.slot_id));
v.push_back(std::to_string(e.min_expansion));
v.push_back(std::to_string(e.max_expansion));
v.push_back("'" + Strings::Escape(e.content_flags) + "'");
v.push_back("'" + Strings::Escape(e.content_flags_disabled) + "'");
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_BOT_STARTING_ITEMS_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_BOT_TIMERS_REPOSITORY_H
@@ -16,7 +16,6 @@
#include "../../strings.h"
#include <ctime>
class BaseBotTimersRepository {
public:
struct BotTimers {
@@ -148,15 +147,15 @@ public:
if (results.RowCount() == 1) {
BotTimers e{};
e.bot_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.timer_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.timer_value = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.recast_time = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.is_spell = static_cast<uint8_t>(strtoul(row[4], nullptr, 10));
e.is_disc = static_cast<uint8_t>(strtoul(row[5], nullptr, 10));
e.spell_id = static_cast<uint32_t>(strtoul(row[6], nullptr, 10));
e.is_item = static_cast<uint8_t>(strtoul(row[7], nullptr, 10));
e.item_id = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
e.bot_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.timer_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.timer_value = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.recast_time = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.is_spell = row[4] ? static_cast<uint8_t>(strtoul(row[4], nullptr, 10)) : 0;
e.is_disc = row[5] ? static_cast<uint8_t>(strtoul(row[5], nullptr, 10)) : 0;
e.spell_id = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
e.is_item = row[7] ? static_cast<uint8_t>(strtoul(row[7], nullptr, 10)) : 0;
e.item_id = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
return e;
}
@@ -300,15 +299,15 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotTimers e{};
e.bot_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.timer_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.timer_value = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.recast_time = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.is_spell = static_cast<uint8_t>(strtoul(row[4], nullptr, 10));
e.is_disc = static_cast<uint8_t>(strtoul(row[5], nullptr, 10));
e.spell_id = static_cast<uint32_t>(strtoul(row[6], nullptr, 10));
e.is_item = static_cast<uint8_t>(strtoul(row[7], nullptr, 10));
e.item_id = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
e.bot_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.timer_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.timer_value = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.recast_time = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.is_spell = row[4] ? static_cast<uint8_t>(strtoul(row[4], nullptr, 10)) : 0;
e.is_disc = row[5] ? static_cast<uint8_t>(strtoul(row[5], nullptr, 10)) : 0;
e.spell_id = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
e.is_item = row[7] ? static_cast<uint8_t>(strtoul(row[7], nullptr, 10)) : 0;
e.item_id = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -333,15 +332,15 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BotTimers e{};
e.bot_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.timer_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.timer_value = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.recast_time = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.is_spell = static_cast<uint8_t>(strtoul(row[4], nullptr, 10));
e.is_disc = static_cast<uint8_t>(strtoul(row[5], nullptr, 10));
e.spell_id = static_cast<uint32_t>(strtoul(row[6], nullptr, 10));
e.is_item = static_cast<uint8_t>(strtoul(row[7], nullptr, 10));
e.item_id = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
e.bot_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.timer_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.timer_value = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.recast_time = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.is_spell = row[4] ? static_cast<uint8_t>(strtoul(row[4], nullptr, 10)) : 0;
e.is_disc = row[5] ? static_cast<uint8_t>(strtoul(row[5], nullptr, 10)) : 0;
e.spell_id = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
e.is_item = row[7] ? static_cast<uint8_t>(strtoul(row[7], nullptr, 10)) : 0;
e.item_id = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -400,6 +399,78 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const BotTimers &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.bot_id));
v.push_back(std::to_string(e.timer_id));
v.push_back(std::to_string(e.timer_value));
v.push_back(std::to_string(e.recast_time));
v.push_back(std::to_string(e.is_spell));
v.push_back(std::to_string(e.is_disc));
v.push_back(std::to_string(e.spell_id));
v.push_back(std::to_string(e.is_item));
v.push_back(std::to_string(e.item_id));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<BotTimers> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.bot_id));
v.push_back(std::to_string(e.timer_id));
v.push_back(std::to_string(e.timer_value));
v.push_back(std::to_string(e.recast_time));
v.push_back(std::to_string(e.is_spell));
v.push_back(std::to_string(e.is_disc));
v.push_back(std::to_string(e.spell_id));
v.push_back(std::to_string(e.is_item));
v.push_back(std::to_string(e.item_id));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_BOT_TIMERS_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_BUG_REPORTS_REPOSITORY_H
@@ -228,8 +228,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
bug_reports_id
)
);
@@ -238,37 +239,37 @@ public:
if (results.RowCount() == 1) {
BugReports e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.zone = row[1] ? row[1] : "";
e.client_version_id = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.client_version_name = row[3] ? row[3] : "";
e.account_id = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
e.character_id = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
e.character_name = row[6] ? row[6] : "";
e.reporter_spoof = static_cast<int8_t>(atoi(row[7]));
e.category_id = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
e.category_name = row[9] ? row[9] : "";
e.reporter_name = row[10] ? row[10] : "";
e.ui_path = row[11] ? row[11] : "";
e.pos_x = strtof(row[12], nullptr);
e.pos_y = strtof(row[13], nullptr);
e.pos_z = strtof(row[14], nullptr);
e.heading = static_cast<uint32_t>(strtoul(row[15], nullptr, 10));
e.time_played = static_cast<uint32_t>(strtoul(row[16], nullptr, 10));
e.target_id = static_cast<uint32_t>(strtoul(row[17], nullptr, 10));
e.target_name = row[18] ? row[18] : "";
e.optional_info_mask = static_cast<uint32_t>(strtoul(row[19], nullptr, 10));
e._can_duplicate = static_cast<int8_t>(atoi(row[20]));
e._crash_bug = static_cast<int8_t>(atoi(row[21]));
e._target_info = static_cast<int8_t>(atoi(row[22]));
e._character_flags = static_cast<int8_t>(atoi(row[23]));
e._unknown_value = static_cast<int8_t>(atoi(row[24]));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.zone = row[1] ? row[1] : "Unknown";
e.client_version_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.client_version_name = row[3] ? row[3] : "Unknown";
e.account_id = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
e.character_id = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
e.character_name = row[6] ? row[6] : "Unknown";
e.reporter_spoof = row[7] ? static_cast<int8_t>(atoi(row[7])) : 1;
e.category_id = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
e.category_name = row[9] ? row[9] : "Other";
e.reporter_name = row[10] ? row[10] : "Unknown";
e.ui_path = row[11] ? row[11] : "Unknown";
e.pos_x = row[12] ? strtof(row[12], nullptr) : 0;
e.pos_y = row[13] ? strtof(row[13], nullptr) : 0;
e.pos_z = row[14] ? strtof(row[14], nullptr) : 0;
e.heading = row[15] ? static_cast<uint32_t>(strtoul(row[15], nullptr, 10)) : 0;
e.time_played = row[16] ? static_cast<uint32_t>(strtoul(row[16], nullptr, 10)) : 0;
e.target_id = row[17] ? static_cast<uint32_t>(strtoul(row[17], nullptr, 10)) : 0;
e.target_name = row[18] ? row[18] : "Unknown";
e.optional_info_mask = row[19] ? static_cast<uint32_t>(strtoul(row[19], nullptr, 10)) : 0;
e._can_duplicate = row[20] ? static_cast<int8_t>(atoi(row[20])) : 0;
e._crash_bug = row[21] ? static_cast<int8_t>(atoi(row[21])) : 0;
e._target_info = row[22] ? static_cast<int8_t>(atoi(row[22])) : 0;
e._character_flags = row[23] ? static_cast<int8_t>(atoi(row[23])) : 0;
e._unknown_value = row[24] ? static_cast<int8_t>(atoi(row[24])) : 0;
e.bug_report = row[25] ? row[25] : "";
e.system_info = row[26] ? row[26] : "";
e.report_datetime = strtoll(row[27] ? row[27] : "-1", nullptr, 10);
e.bug_status = static_cast<uint8_t>(strtoul(row[28], nullptr, 10));
e.bug_status = row[28] ? static_cast<uint8_t>(strtoul(row[28], nullptr, 10)) : 0;
e.last_review = strtoll(row[29] ? row[29] : "-1", nullptr, 10);
e.last_reviewer = row[30] ? row[30] : "";
e.last_reviewer = row[30] ? row[30] : "None";
e.reviewer_notes = row[31] ? row[31] : "";
return e;
@@ -481,37 +482,37 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BugReports e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.zone = row[1] ? row[1] : "";
e.client_version_id = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.client_version_name = row[3] ? row[3] : "";
e.account_id = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
e.character_id = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
e.character_name = row[6] ? row[6] : "";
e.reporter_spoof = static_cast<int8_t>(atoi(row[7]));
e.category_id = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
e.category_name = row[9] ? row[9] : "";
e.reporter_name = row[10] ? row[10] : "";
e.ui_path = row[11] ? row[11] : "";
e.pos_x = strtof(row[12], nullptr);
e.pos_y = strtof(row[13], nullptr);
e.pos_z = strtof(row[14], nullptr);
e.heading = static_cast<uint32_t>(strtoul(row[15], nullptr, 10));
e.time_played = static_cast<uint32_t>(strtoul(row[16], nullptr, 10));
e.target_id = static_cast<uint32_t>(strtoul(row[17], nullptr, 10));
e.target_name = row[18] ? row[18] : "";
e.optional_info_mask = static_cast<uint32_t>(strtoul(row[19], nullptr, 10));
e._can_duplicate = static_cast<int8_t>(atoi(row[20]));
e._crash_bug = static_cast<int8_t>(atoi(row[21]));
e._target_info = static_cast<int8_t>(atoi(row[22]));
e._character_flags = static_cast<int8_t>(atoi(row[23]));
e._unknown_value = static_cast<int8_t>(atoi(row[24]));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.zone = row[1] ? row[1] : "Unknown";
e.client_version_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.client_version_name = row[3] ? row[3] : "Unknown";
e.account_id = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
e.character_id = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
e.character_name = row[6] ? row[6] : "Unknown";
e.reporter_spoof = row[7] ? static_cast<int8_t>(atoi(row[7])) : 1;
e.category_id = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
e.category_name = row[9] ? row[9] : "Other";
e.reporter_name = row[10] ? row[10] : "Unknown";
e.ui_path = row[11] ? row[11] : "Unknown";
e.pos_x = row[12] ? strtof(row[12], nullptr) : 0;
e.pos_y = row[13] ? strtof(row[13], nullptr) : 0;
e.pos_z = row[14] ? strtof(row[14], nullptr) : 0;
e.heading = row[15] ? static_cast<uint32_t>(strtoul(row[15], nullptr, 10)) : 0;
e.time_played = row[16] ? static_cast<uint32_t>(strtoul(row[16], nullptr, 10)) : 0;
e.target_id = row[17] ? static_cast<uint32_t>(strtoul(row[17], nullptr, 10)) : 0;
e.target_name = row[18] ? row[18] : "Unknown";
e.optional_info_mask = row[19] ? static_cast<uint32_t>(strtoul(row[19], nullptr, 10)) : 0;
e._can_duplicate = row[20] ? static_cast<int8_t>(atoi(row[20])) : 0;
e._crash_bug = row[21] ? static_cast<int8_t>(atoi(row[21])) : 0;
e._target_info = row[22] ? static_cast<int8_t>(atoi(row[22])) : 0;
e._character_flags = row[23] ? static_cast<int8_t>(atoi(row[23])) : 0;
e._unknown_value = row[24] ? static_cast<int8_t>(atoi(row[24])) : 0;
e.bug_report = row[25] ? row[25] : "";
e.system_info = row[26] ? row[26] : "";
e.report_datetime = strtoll(row[27] ? row[27] : "-1", nullptr, 10);
e.bug_status = static_cast<uint8_t>(strtoul(row[28], nullptr, 10));
e.bug_status = row[28] ? static_cast<uint8_t>(strtoul(row[28], nullptr, 10)) : 0;
e.last_review = strtoll(row[29] ? row[29] : "-1", nullptr, 10);
e.last_reviewer = row[30] ? row[30] : "";
e.last_reviewer = row[30] ? row[30] : "None";
e.reviewer_notes = row[31] ? row[31] : "";
all_entries.push_back(e);
@@ -537,37 +538,37 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
BugReports e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.zone = row[1] ? row[1] : "";
e.client_version_id = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.client_version_name = row[3] ? row[3] : "";
e.account_id = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
e.character_id = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
e.character_name = row[6] ? row[6] : "";
e.reporter_spoof = static_cast<int8_t>(atoi(row[7]));
e.category_id = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
e.category_name = row[9] ? row[9] : "";
e.reporter_name = row[10] ? row[10] : "";
e.ui_path = row[11] ? row[11] : "";
e.pos_x = strtof(row[12], nullptr);
e.pos_y = strtof(row[13], nullptr);
e.pos_z = strtof(row[14], nullptr);
e.heading = static_cast<uint32_t>(strtoul(row[15], nullptr, 10));
e.time_played = static_cast<uint32_t>(strtoul(row[16], nullptr, 10));
e.target_id = static_cast<uint32_t>(strtoul(row[17], nullptr, 10));
e.target_name = row[18] ? row[18] : "";
e.optional_info_mask = static_cast<uint32_t>(strtoul(row[19], nullptr, 10));
e._can_duplicate = static_cast<int8_t>(atoi(row[20]));
e._crash_bug = static_cast<int8_t>(atoi(row[21]));
e._target_info = static_cast<int8_t>(atoi(row[22]));
e._character_flags = static_cast<int8_t>(atoi(row[23]));
e._unknown_value = static_cast<int8_t>(atoi(row[24]));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.zone = row[1] ? row[1] : "Unknown";
e.client_version_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.client_version_name = row[3] ? row[3] : "Unknown";
e.account_id = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
e.character_id = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
e.character_name = row[6] ? row[6] : "Unknown";
e.reporter_spoof = row[7] ? static_cast<int8_t>(atoi(row[7])) : 1;
e.category_id = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
e.category_name = row[9] ? row[9] : "Other";
e.reporter_name = row[10] ? row[10] : "Unknown";
e.ui_path = row[11] ? row[11] : "Unknown";
e.pos_x = row[12] ? strtof(row[12], nullptr) : 0;
e.pos_y = row[13] ? strtof(row[13], nullptr) : 0;
e.pos_z = row[14] ? strtof(row[14], nullptr) : 0;
e.heading = row[15] ? static_cast<uint32_t>(strtoul(row[15], nullptr, 10)) : 0;
e.time_played = row[16] ? static_cast<uint32_t>(strtoul(row[16], nullptr, 10)) : 0;
e.target_id = row[17] ? static_cast<uint32_t>(strtoul(row[17], nullptr, 10)) : 0;
e.target_name = row[18] ? row[18] : "Unknown";
e.optional_info_mask = row[19] ? static_cast<uint32_t>(strtoul(row[19], nullptr, 10)) : 0;
e._can_duplicate = row[20] ? static_cast<int8_t>(atoi(row[20])) : 0;
e._crash_bug = row[21] ? static_cast<int8_t>(atoi(row[21])) : 0;
e._target_info = row[22] ? static_cast<int8_t>(atoi(row[22])) : 0;
e._character_flags = row[23] ? static_cast<int8_t>(atoi(row[23])) : 0;
e._unknown_value = row[24] ? static_cast<int8_t>(atoi(row[24])) : 0;
e.bug_report = row[25] ? row[25] : "";
e.system_info = row[26] ? row[26] : "";
e.report_datetime = strtoll(row[27] ? row[27] : "-1", nullptr, 10);
e.bug_status = static_cast<uint8_t>(strtoul(row[28], nullptr, 10));
e.bug_status = row[28] ? static_cast<uint8_t>(strtoul(row[28], nullptr, 10)) : 0;
e.last_review = strtoll(row[29] ? row[29] : "-1", nullptr, 10);
e.last_reviewer = row[30] ? row[30] : "";
e.last_reviewer = row[30] ? row[30] : "None";
e.reviewer_notes = row[31] ? row[31] : "";
all_entries.push_back(e);
@@ -627,6 +628,124 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const BugReports &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back("'" + Strings::Escape(e.zone) + "'");
v.push_back(std::to_string(e.client_version_id));
v.push_back("'" + Strings::Escape(e.client_version_name) + "'");
v.push_back(std::to_string(e.account_id));
v.push_back(std::to_string(e.character_id));
v.push_back("'" + Strings::Escape(e.character_name) + "'");
v.push_back(std::to_string(e.reporter_spoof));
v.push_back(std::to_string(e.category_id));
v.push_back("'" + Strings::Escape(e.category_name) + "'");
v.push_back("'" + Strings::Escape(e.reporter_name) + "'");
v.push_back("'" + Strings::Escape(e.ui_path) + "'");
v.push_back(std::to_string(e.pos_x));
v.push_back(std::to_string(e.pos_y));
v.push_back(std::to_string(e.pos_z));
v.push_back(std::to_string(e.heading));
v.push_back(std::to_string(e.time_played));
v.push_back(std::to_string(e.target_id));
v.push_back("'" + Strings::Escape(e.target_name) + "'");
v.push_back(std::to_string(e.optional_info_mask));
v.push_back(std::to_string(e._can_duplicate));
v.push_back(std::to_string(e._crash_bug));
v.push_back(std::to_string(e._target_info));
v.push_back(std::to_string(e._character_flags));
v.push_back(std::to_string(e._unknown_value));
v.push_back("'" + Strings::Escape(e.bug_report) + "'");
v.push_back("'" + Strings::Escape(e.system_info) + "'");
v.push_back("FROM_UNIXTIME(" + (e.report_datetime > 0 ? std::to_string(e.report_datetime) : "null") + ")");
v.push_back(std::to_string(e.bug_status));
v.push_back("FROM_UNIXTIME(" + (e.last_review > 0 ? std::to_string(e.last_review) : "null") + ")");
v.push_back("'" + Strings::Escape(e.last_reviewer) + "'");
v.push_back("'" + Strings::Escape(e.reviewer_notes) + "'");
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<BugReports> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back("'" + Strings::Escape(e.zone) + "'");
v.push_back(std::to_string(e.client_version_id));
v.push_back("'" + Strings::Escape(e.client_version_name) + "'");
v.push_back(std::to_string(e.account_id));
v.push_back(std::to_string(e.character_id));
v.push_back("'" + Strings::Escape(e.character_name) + "'");
v.push_back(std::to_string(e.reporter_spoof));
v.push_back(std::to_string(e.category_id));
v.push_back("'" + Strings::Escape(e.category_name) + "'");
v.push_back("'" + Strings::Escape(e.reporter_name) + "'");
v.push_back("'" + Strings::Escape(e.ui_path) + "'");
v.push_back(std::to_string(e.pos_x));
v.push_back(std::to_string(e.pos_y));
v.push_back(std::to_string(e.pos_z));
v.push_back(std::to_string(e.heading));
v.push_back(std::to_string(e.time_played));
v.push_back(std::to_string(e.target_id));
v.push_back("'" + Strings::Escape(e.target_name) + "'");
v.push_back(std::to_string(e.optional_info_mask));
v.push_back(std::to_string(e._can_duplicate));
v.push_back(std::to_string(e._crash_bug));
v.push_back(std::to_string(e._target_info));
v.push_back(std::to_string(e._character_flags));
v.push_back(std::to_string(e._unknown_value));
v.push_back("'" + Strings::Escape(e.bug_report) + "'");
v.push_back("'" + Strings::Escape(e.system_info) + "'");
v.push_back("FROM_UNIXTIME(" + (e.report_datetime > 0 ? std::to_string(e.report_datetime) : "null") + ")");
v.push_back(std::to_string(e.bug_status));
v.push_back("FROM_UNIXTIME(" + (e.last_review > 0 ? std::to_string(e.last_review) : "null") + ")");
v.push_back("'" + Strings::Escape(e.last_reviewer) + "'");
v.push_back("'" + Strings::Escape(e.reviewer_notes) + "'");
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_BUG_REPORTS_REPOSITORY_H
+104 -23
View File
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_BUGS_REPOSITORY_H
@@ -152,8 +152,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
bugs_id
)
);
@@ -162,19 +163,19 @@ public:
if (results.RowCount() == 1) {
Bugs e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.zone = row[1] ? row[1] : "";
e.name = row[2] ? row[2] : "";
e.ui = row[3] ? row[3] : "";
e.x = strtof(row[4], nullptr);
e.y = strtof(row[5], nullptr);
e.z = strtof(row[6], nullptr);
e.x = row[4] ? strtof(row[4], nullptr) : 0;
e.y = row[5] ? strtof(row[5], nullptr) : 0;
e.z = row[6] ? strtof(row[6], nullptr) : 0;
e.type = row[7] ? row[7] : "";
e.flag = static_cast<uint8_t>(strtoul(row[8], nullptr, 10));
e.flag = row[8] ? static_cast<uint8_t>(strtoul(row[8], nullptr, 10)) : 0;
e.target = row[9] ? row[9] : "";
e.bug = row[10] ? row[10] : "";
e.date = row[11] ? row[11] : "";
e.status = static_cast<uint8_t>(strtoul(row[12], nullptr, 10));
e.date = row[11] ? row[11] : 0;
e.status = row[12] ? static_cast<uint8_t>(strtoul(row[12], nullptr, 10)) : 0;
return e;
}
@@ -329,19 +330,19 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
Bugs e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.zone = row[1] ? row[1] : "";
e.name = row[2] ? row[2] : "";
e.ui = row[3] ? row[3] : "";
e.x = strtof(row[4], nullptr);
e.y = strtof(row[5], nullptr);
e.z = strtof(row[6], nullptr);
e.x = row[4] ? strtof(row[4], nullptr) : 0;
e.y = row[5] ? strtof(row[5], nullptr) : 0;
e.z = row[6] ? strtof(row[6], nullptr) : 0;
e.type = row[7] ? row[7] : "";
e.flag = static_cast<uint8_t>(strtoul(row[8], nullptr, 10));
e.flag = row[8] ? static_cast<uint8_t>(strtoul(row[8], nullptr, 10)) : 0;
e.target = row[9] ? row[9] : "";
e.bug = row[10] ? row[10] : "";
e.date = row[11] ? row[11] : "";
e.status = static_cast<uint8_t>(strtoul(row[12], nullptr, 10));
e.date = row[11] ? row[11] : 0;
e.status = row[12] ? static_cast<uint8_t>(strtoul(row[12], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -366,19 +367,19 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
Bugs e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.zone = row[1] ? row[1] : "";
e.name = row[2] ? row[2] : "";
e.ui = row[3] ? row[3] : "";
e.x = strtof(row[4], nullptr);
e.y = strtof(row[5], nullptr);
e.z = strtof(row[6], nullptr);
e.x = row[4] ? strtof(row[4], nullptr) : 0;
e.y = row[5] ? strtof(row[5], nullptr) : 0;
e.z = row[6] ? strtof(row[6], nullptr) : 0;
e.type = row[7] ? row[7] : "";
e.flag = static_cast<uint8_t>(strtoul(row[8], nullptr, 10));
e.flag = row[8] ? static_cast<uint8_t>(strtoul(row[8], nullptr, 10)) : 0;
e.target = row[9] ? row[9] : "";
e.bug = row[10] ? row[10] : "";
e.date = row[11] ? row[11] : "";
e.status = static_cast<uint8_t>(strtoul(row[12], nullptr, 10));
e.date = row[11] ? row[11] : 0;
e.status = row[12] ? static_cast<uint8_t>(strtoul(row[12], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -437,6 +438,86 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const Bugs &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back("'" + Strings::Escape(e.zone) + "'");
v.push_back("'" + Strings::Escape(e.name) + "'");
v.push_back("'" + Strings::Escape(e.ui) + "'");
v.push_back(std::to_string(e.x));
v.push_back(std::to_string(e.y));
v.push_back(std::to_string(e.z));
v.push_back("'" + Strings::Escape(e.type) + "'");
v.push_back(std::to_string(e.flag));
v.push_back("'" + Strings::Escape(e.target) + "'");
v.push_back("'" + Strings::Escape(e.bug) + "'");
v.push_back("'" + Strings::Escape(e.date) + "'");
v.push_back(std::to_string(e.status));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<Bugs> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back("'" + Strings::Escape(e.zone) + "'");
v.push_back("'" + Strings::Escape(e.name) + "'");
v.push_back("'" + Strings::Escape(e.ui) + "'");
v.push_back(std::to_string(e.x));
v.push_back(std::to_string(e.y));
v.push_back(std::to_string(e.z));
v.push_back("'" + Strings::Escape(e.type) + "'");
v.push_back(std::to_string(e.flag));
v.push_back("'" + Strings::Escape(e.target) + "'");
v.push_back("'" + Strings::Escape(e.bug) + "'");
v.push_back("'" + Strings::Escape(e.date) + "'");
v.push_back(std::to_string(e.status));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_BUGS_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_BUYER_REPOSITORY_H
@@ -124,8 +124,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
buyer_id
)
);
@@ -134,12 +135,12 @@ public:
if (results.RowCount() == 1) {
Buyer e{};
e.charid = static_cast<int32_t>(atoi(row[0]));
e.buyslot = static_cast<int32_t>(atoi(row[1]));
e.itemid = static_cast<int32_t>(atoi(row[2]));
e.charid = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.buyslot = row[1] ? static_cast<int32_t>(atoi(row[1])) : 0;
e.itemid = row[2] ? static_cast<int32_t>(atoi(row[2])) : 0;
e.itemname = row[3] ? row[3] : "";
e.quantity = static_cast<int32_t>(atoi(row[4]));
e.price = static_cast<int32_t>(atoi(row[5]));
e.quantity = row[4] ? static_cast<int32_t>(atoi(row[4])) : 0;
e.price = row[5] ? static_cast<int32_t>(atoi(row[5])) : 0;
return e;
}
@@ -274,12 +275,12 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
Buyer e{};
e.charid = static_cast<int32_t>(atoi(row[0]));
e.buyslot = static_cast<int32_t>(atoi(row[1]));
e.itemid = static_cast<int32_t>(atoi(row[2]));
e.charid = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.buyslot = row[1] ? static_cast<int32_t>(atoi(row[1])) : 0;
e.itemid = row[2] ? static_cast<int32_t>(atoi(row[2])) : 0;
e.itemname = row[3] ? row[3] : "";
e.quantity = static_cast<int32_t>(atoi(row[4]));
e.price = static_cast<int32_t>(atoi(row[5]));
e.quantity = row[4] ? static_cast<int32_t>(atoi(row[4])) : 0;
e.price = row[5] ? static_cast<int32_t>(atoi(row[5])) : 0;
all_entries.push_back(e);
}
@@ -304,12 +305,12 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
Buyer e{};
e.charid = static_cast<int32_t>(atoi(row[0]));
e.buyslot = static_cast<int32_t>(atoi(row[1]));
e.itemid = static_cast<int32_t>(atoi(row[2]));
e.charid = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.buyslot = row[1] ? static_cast<int32_t>(atoi(row[1])) : 0;
e.itemid = row[2] ? static_cast<int32_t>(atoi(row[2])) : 0;
e.itemname = row[3] ? row[3] : "";
e.quantity = static_cast<int32_t>(atoi(row[4]));
e.price = static_cast<int32_t>(atoi(row[5]));
e.quantity = row[4] ? static_cast<int32_t>(atoi(row[4])) : 0;
e.price = row[5] ? static_cast<int32_t>(atoi(row[5])) : 0;
all_entries.push_back(e);
}
@@ -368,6 +369,72 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const Buyer &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.charid));
v.push_back(std::to_string(e.buyslot));
v.push_back(std::to_string(e.itemid));
v.push_back("'" + Strings::Escape(e.itemname) + "'");
v.push_back(std::to_string(e.quantity));
v.push_back(std::to_string(e.price));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<Buyer> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.charid));
v.push_back(std::to_string(e.buyslot));
v.push_back(std::to_string(e.itemid));
v.push_back("'" + Strings::Escape(e.itemname) + "'");
v.push_back(std::to_string(e.quantity));
v.push_back(std::to_string(e.price));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_BUYER_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_CHAR_CREATE_COMBINATIONS_REPOSITORY_H
@@ -124,8 +124,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
char_create_combinations_id
)
);
@@ -134,12 +135,12 @@ public:
if (results.RowCount() == 1) {
CharCreateCombinations e{};
e.allocation_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.race = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.class_ = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.deity = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.start_zone = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
e.expansions_req = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
e.allocation_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.race = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.class_ = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.deity = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.start_zone = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
e.expansions_req = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
return e;
}
@@ -274,12 +275,12 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
CharCreateCombinations e{};
e.allocation_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.race = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.class_ = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.deity = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.start_zone = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
e.expansions_req = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
e.allocation_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.race = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.class_ = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.deity = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.start_zone = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
e.expansions_req = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -304,12 +305,12 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
CharCreateCombinations e{};
e.allocation_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.race = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.class_ = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.deity = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.start_zone = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
e.expansions_req = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
e.allocation_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.race = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.class_ = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.deity = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.start_zone = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
e.expansions_req = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -368,6 +369,72 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const CharCreateCombinations &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.allocation_id));
v.push_back(std::to_string(e.race));
v.push_back(std::to_string(e.class_));
v.push_back(std::to_string(e.deity));
v.push_back(std::to_string(e.start_zone));
v.push_back(std::to_string(e.expansions_req));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<CharCreateCombinations> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.allocation_id));
v.push_back(std::to_string(e.race));
v.push_back(std::to_string(e.class_));
v.push_back(std::to_string(e.deity));
v.push_back(std::to_string(e.start_zone));
v.push_back(std::to_string(e.expansions_req));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_CHAR_CREATE_COMBINATIONS_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_CHAR_CREATE_POINT_ALLOCATIONS_REPOSITORY_H
@@ -160,8 +160,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
char_create_point_allocations_id
)
);
@@ -170,21 +171,21 @@ public:
if (results.RowCount() == 1) {
CharCreatePointAllocations e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.base_str = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.base_sta = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.base_dex = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.base_agi = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
e.base_int = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
e.base_wis = static_cast<uint32_t>(strtoul(row[6], nullptr, 10));
e.base_cha = static_cast<uint32_t>(strtoul(row[7], nullptr, 10));
e.alloc_str = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
e.alloc_sta = static_cast<uint32_t>(strtoul(row[9], nullptr, 10));
e.alloc_dex = static_cast<uint32_t>(strtoul(row[10], nullptr, 10));
e.alloc_agi = static_cast<uint32_t>(strtoul(row[11], nullptr, 10));
e.alloc_int = static_cast<uint32_t>(strtoul(row[12], nullptr, 10));
e.alloc_wis = static_cast<uint32_t>(strtoul(row[13], nullptr, 10));
e.alloc_cha = static_cast<uint32_t>(strtoul(row[14], nullptr, 10));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.base_str = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.base_sta = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.base_dex = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.base_agi = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
e.base_int = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
e.base_wis = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
e.base_cha = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
e.alloc_str = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
e.alloc_sta = row[9] ? static_cast<uint32_t>(strtoul(row[9], nullptr, 10)) : 0;
e.alloc_dex = row[10] ? static_cast<uint32_t>(strtoul(row[10], nullptr, 10)) : 0;
e.alloc_agi = row[11] ? static_cast<uint32_t>(strtoul(row[11], nullptr, 10)) : 0;
e.alloc_int = row[12] ? static_cast<uint32_t>(strtoul(row[12], nullptr, 10)) : 0;
e.alloc_wis = row[13] ? static_cast<uint32_t>(strtoul(row[13], nullptr, 10)) : 0;
e.alloc_cha = row[14] ? static_cast<uint32_t>(strtoul(row[14], nullptr, 10)) : 0;
return e;
}
@@ -346,21 +347,21 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
CharCreatePointAllocations e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.base_str = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.base_sta = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.base_dex = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.base_agi = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
e.base_int = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
e.base_wis = static_cast<uint32_t>(strtoul(row[6], nullptr, 10));
e.base_cha = static_cast<uint32_t>(strtoul(row[7], nullptr, 10));
e.alloc_str = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
e.alloc_sta = static_cast<uint32_t>(strtoul(row[9], nullptr, 10));
e.alloc_dex = static_cast<uint32_t>(strtoul(row[10], nullptr, 10));
e.alloc_agi = static_cast<uint32_t>(strtoul(row[11], nullptr, 10));
e.alloc_int = static_cast<uint32_t>(strtoul(row[12], nullptr, 10));
e.alloc_wis = static_cast<uint32_t>(strtoul(row[13], nullptr, 10));
e.alloc_cha = static_cast<uint32_t>(strtoul(row[14], nullptr, 10));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.base_str = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.base_sta = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.base_dex = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.base_agi = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
e.base_int = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
e.base_wis = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
e.base_cha = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
e.alloc_str = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
e.alloc_sta = row[9] ? static_cast<uint32_t>(strtoul(row[9], nullptr, 10)) : 0;
e.alloc_dex = row[10] ? static_cast<uint32_t>(strtoul(row[10], nullptr, 10)) : 0;
e.alloc_agi = row[11] ? static_cast<uint32_t>(strtoul(row[11], nullptr, 10)) : 0;
e.alloc_int = row[12] ? static_cast<uint32_t>(strtoul(row[12], nullptr, 10)) : 0;
e.alloc_wis = row[13] ? static_cast<uint32_t>(strtoul(row[13], nullptr, 10)) : 0;
e.alloc_cha = row[14] ? static_cast<uint32_t>(strtoul(row[14], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -385,21 +386,21 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
CharCreatePointAllocations e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.base_str = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.base_sta = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.base_dex = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.base_agi = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
e.base_int = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
e.base_wis = static_cast<uint32_t>(strtoul(row[6], nullptr, 10));
e.base_cha = static_cast<uint32_t>(strtoul(row[7], nullptr, 10));
e.alloc_str = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
e.alloc_sta = static_cast<uint32_t>(strtoul(row[9], nullptr, 10));
e.alloc_dex = static_cast<uint32_t>(strtoul(row[10], nullptr, 10));
e.alloc_agi = static_cast<uint32_t>(strtoul(row[11], nullptr, 10));
e.alloc_int = static_cast<uint32_t>(strtoul(row[12], nullptr, 10));
e.alloc_wis = static_cast<uint32_t>(strtoul(row[13], nullptr, 10));
e.alloc_cha = static_cast<uint32_t>(strtoul(row[14], nullptr, 10));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.base_str = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.base_sta = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.base_dex = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.base_agi = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
e.base_int = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
e.base_wis = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
e.base_cha = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
e.alloc_str = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
e.alloc_sta = row[9] ? static_cast<uint32_t>(strtoul(row[9], nullptr, 10)) : 0;
e.alloc_dex = row[10] ? static_cast<uint32_t>(strtoul(row[10], nullptr, 10)) : 0;
e.alloc_agi = row[11] ? static_cast<uint32_t>(strtoul(row[11], nullptr, 10)) : 0;
e.alloc_int = row[12] ? static_cast<uint32_t>(strtoul(row[12], nullptr, 10)) : 0;
e.alloc_wis = row[13] ? static_cast<uint32_t>(strtoul(row[13], nullptr, 10)) : 0;
e.alloc_cha = row[14] ? static_cast<uint32_t>(strtoul(row[14], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -458,6 +459,90 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const CharCreatePointAllocations &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back(std::to_string(e.base_str));
v.push_back(std::to_string(e.base_sta));
v.push_back(std::to_string(e.base_dex));
v.push_back(std::to_string(e.base_agi));
v.push_back(std::to_string(e.base_int));
v.push_back(std::to_string(e.base_wis));
v.push_back(std::to_string(e.base_cha));
v.push_back(std::to_string(e.alloc_str));
v.push_back(std::to_string(e.alloc_sta));
v.push_back(std::to_string(e.alloc_dex));
v.push_back(std::to_string(e.alloc_agi));
v.push_back(std::to_string(e.alloc_int));
v.push_back(std::to_string(e.alloc_wis));
v.push_back(std::to_string(e.alloc_cha));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<CharCreatePointAllocations> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back(std::to_string(e.base_str));
v.push_back(std::to_string(e.base_sta));
v.push_back(std::to_string(e.base_dex));
v.push_back(std::to_string(e.base_agi));
v.push_back(std::to_string(e.base_int));
v.push_back(std::to_string(e.base_wis));
v.push_back(std::to_string(e.base_cha));
v.push_back(std::to_string(e.alloc_str));
v.push_back(std::to_string(e.alloc_sta));
v.push_back(std::to_string(e.alloc_dex));
v.push_back(std::to_string(e.alloc_agi));
v.push_back(std::to_string(e.alloc_int));
v.push_back(std::to_string(e.alloc_wis));
v.push_back(std::to_string(e.alloc_cha));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_CHAR_CREATE_POINT_ALLOCATIONS_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_CHAR_RECIPE_LIST_REPOSITORY_H
@@ -112,8 +112,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
char_recipe_list_id
)
);
@@ -122,9 +123,9 @@ public:
if (results.RowCount() == 1) {
CharRecipeList e{};
e.char_id = static_cast<int32_t>(atoi(row[0]));
e.recipe_id = static_cast<int32_t>(atoi(row[1]));
e.madecount = static_cast<int32_t>(atoi(row[2]));
e.char_id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.recipe_id = row[1] ? static_cast<int32_t>(atoi(row[1])) : 0;
e.madecount = row[2] ? static_cast<int32_t>(atoi(row[2])) : 0;
return e;
}
@@ -250,9 +251,9 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
CharRecipeList e{};
e.char_id = static_cast<int32_t>(atoi(row[0]));
e.recipe_id = static_cast<int32_t>(atoi(row[1]));
e.madecount = static_cast<int32_t>(atoi(row[2]));
e.char_id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.recipe_id = row[1] ? static_cast<int32_t>(atoi(row[1])) : 0;
e.madecount = row[2] ? static_cast<int32_t>(atoi(row[2])) : 0;
all_entries.push_back(e);
}
@@ -277,9 +278,9 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
CharRecipeList e{};
e.char_id = static_cast<int32_t>(atoi(row[0]));
e.recipe_id = static_cast<int32_t>(atoi(row[1]));
e.madecount = static_cast<int32_t>(atoi(row[2]));
e.char_id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.recipe_id = row[1] ? static_cast<int32_t>(atoi(row[1])) : 0;
e.madecount = row[2] ? static_cast<int32_t>(atoi(row[2])) : 0;
all_entries.push_back(e);
}
@@ -338,6 +339,66 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const CharRecipeList &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.char_id));
v.push_back(std::to_string(e.recipe_id));
v.push_back(std::to_string(e.madecount));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<CharRecipeList> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.char_id));
v.push_back(std::to_string(e.recipe_id));
v.push_back(std::to_string(e.madecount));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_CHAR_RECIPE_LIST_REPOSITORY_H
@@ -6,7 +6,7 @@
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_CHARACTER_ACTIVITIES_REPOSITORY_H
@@ -120,8 +120,9 @@ public:
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE id = {} LIMIT 1",
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
character_activities_id
)
);
@@ -130,11 +131,11 @@ public:
if (results.RowCount() == 1) {
CharacterActivities e{};
e.charid = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.taskid = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.activityid = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.donecount = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.completed = static_cast<int8_t>(atoi(row[4]));
e.charid = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.taskid = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.activityid = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.donecount = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.completed = row[4] ? static_cast<int8_t>(atoi(row[4])) : 0;
return e;
}
@@ -266,11 +267,11 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
CharacterActivities e{};
e.charid = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.taskid = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.activityid = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.donecount = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.completed = static_cast<int8_t>(atoi(row[4]));
e.charid = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.taskid = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.activityid = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.donecount = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.completed = row[4] ? static_cast<int8_t>(atoi(row[4])) : 0;
all_entries.push_back(e);
}
@@ -295,11 +296,11 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
CharacterActivities e{};
e.charid = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.taskid = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.activityid = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.donecount = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.completed = static_cast<int8_t>(atoi(row[4]));
e.charid = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.taskid = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.activityid = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.donecount = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.completed = row[4] ? static_cast<int8_t>(atoi(row[4])) : 0;
all_entries.push_back(e);
}
@@ -358,6 +359,70 @@ public:
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const CharacterActivities &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.charid));
v.push_back(std::to_string(e.taskid));
v.push_back(std::to_string(e.activityid));
v.push_back(std::to_string(e.donecount));
v.push_back(std::to_string(e.completed));
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<CharacterActivities> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.charid));
v.push_back(std::to_string(e.taskid));
v.push_back(std::to_string(e.activityid));
v.push_back(std::to_string(e.donecount));
v.push_back(std::to_string(e.completed));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_CHARACTER_ACTIVITIES_REPOSITORY_H
@@ -16,7 +16,6 @@
#include "../../strings.h"
#include <ctime>
class BaseCharacterAltCurrencyRepository {
public:
struct CharacterAltCurrency {
@@ -124,9 +123,9 @@ public:
if (results.RowCount() == 1) {
CharacterAltCurrency e{};
e.char_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.currency_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.amount = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.char_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.currency_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.amount = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
return e;
}
@@ -252,9 +251,9 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
CharacterAltCurrency e{};
e.char_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.currency_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.amount = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.char_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.currency_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.amount = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -279,9 +278,9 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
CharacterAltCurrency e{};
e.char_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.currency_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
e.amount = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
e.char_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.currency_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.amount = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -16,7 +16,6 @@
#include "../../strings.h"
#include <ctime>
class BaseCharacterAlternateAbilitiesRepository {
public:
struct CharacterAlternateAbilities {
@@ -128,10 +127,10 @@ public:
if (results.RowCount() == 1) {
CharacterAlternateAbilities e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.aa_id = static_cast<uint16_t>(strtoul(row[1], nullptr, 10));
e.aa_value = static_cast<uint16_t>(strtoul(row[2], nullptr, 10));
e.charges = static_cast<uint16_t>(strtoul(row[3], nullptr, 10));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.aa_id = row[1] ? static_cast<uint16_t>(strtoul(row[1], nullptr, 10)) : 0;
e.aa_value = row[2] ? static_cast<uint16_t>(strtoul(row[2], nullptr, 10)) : 0;
e.charges = row[3] ? static_cast<uint16_t>(strtoul(row[3], nullptr, 10)) : 0;
return e;
}
@@ -260,10 +259,10 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
CharacterAlternateAbilities e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.aa_id = static_cast<uint16_t>(strtoul(row[1], nullptr, 10));
e.aa_value = static_cast<uint16_t>(strtoul(row[2], nullptr, 10));
e.charges = static_cast<uint16_t>(strtoul(row[3], nullptr, 10));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.aa_id = row[1] ? static_cast<uint16_t>(strtoul(row[1], nullptr, 10)) : 0;
e.aa_value = row[2] ? static_cast<uint16_t>(strtoul(row[2], nullptr, 10)) : 0;
e.charges = row[3] ? static_cast<uint16_t>(strtoul(row[3], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -288,10 +287,10 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
CharacterAlternateAbilities e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.aa_id = static_cast<uint16_t>(strtoul(row[1], nullptr, 10));
e.aa_value = static_cast<uint16_t>(strtoul(row[2], nullptr, 10));
e.charges = static_cast<uint16_t>(strtoul(row[3], nullptr, 10));
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.aa_id = row[1] ? static_cast<uint16_t>(strtoul(row[1], nullptr, 10)) : 0;
e.aa_value = row[2] ? static_cast<uint16_t>(strtoul(row[2], nullptr, 10)) : 0;
e.charges = row[3] ? static_cast<uint16_t>(strtoul(row[3], nullptr, 10)) : 0;
all_entries.push_back(e);
}
@@ -16,7 +16,6 @@
#include "../../strings.h"
#include <ctime>
class BaseCharacterAurasRepository {
public:
struct CharacterAuras {
@@ -124,9 +123,9 @@ public:
if (results.RowCount() == 1) {
CharacterAuras e{};
e.id = static_cast<int32_t>(atoi(row[0]));
e.slot = static_cast<int8_t>(atoi(row[1]));
e.spell_id = static_cast<int32_t>(atoi(row[2]));
e.id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.slot = row[1] ? static_cast<int8_t>(atoi(row[1])) : 0;
e.spell_id = row[2] ? static_cast<int32_t>(atoi(row[2])) : 0;
return e;
}
@@ -252,9 +251,9 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
CharacterAuras e{};
e.id = static_cast<int32_t>(atoi(row[0]));
e.slot = static_cast<int8_t>(atoi(row[1]));
e.spell_id = static_cast<int32_t>(atoi(row[2]));
e.id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.slot = row[1] ? static_cast<int8_t>(atoi(row[1])) : 0;
e.spell_id = row[2] ? static_cast<int32_t>(atoi(row[2])) : 0;
all_entries.push_back(e);
}
@@ -279,9 +278,9 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
CharacterAuras e{};
e.id = static_cast<int32_t>(atoi(row[0]));
e.slot = static_cast<int8_t>(atoi(row[1]));
e.spell_id = static_cast<int32_t>(atoi(row[2]));
e.id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.slot = row[1] ? static_cast<int8_t>(atoi(row[1])) : 0;
e.spell_id = row[2] ? static_cast<int32_t>(atoi(row[2])) : 0;
all_entries.push_back(e);
}
@@ -16,7 +16,6 @@
#include "../../strings.h"
#include <ctime>
class BaseCharacterBandolierRepository {
public:
struct CharacterBandolier {
@@ -136,12 +135,12 @@ public:
if (results.RowCount() == 1) {
CharacterBandolier e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.bandolier_id = static_cast<uint8_t>(strtoul(row[1], nullptr, 10));
e.bandolier_slot = static_cast<uint8_t>(strtoul(row[2], nullptr, 10));
e.item_id = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.icon = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
e.bandolier_name = row[5] ? row[5] : "";
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.bandolier_id = row[1] ? static_cast<uint8_t>(strtoul(row[1], nullptr, 10)) : 0;
e.bandolier_slot = row[2] ? static_cast<uint8_t>(strtoul(row[2], nullptr, 10)) : 0;
e.item_id = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.icon = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
e.bandolier_name = row[5] ? row[5] : "0";
return e;
}
@@ -276,12 +275,12 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
CharacterBandolier e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.bandolier_id = static_cast<uint8_t>(strtoul(row[1], nullptr, 10));
e.bandolier_slot = static_cast<uint8_t>(strtoul(row[2], nullptr, 10));
e.item_id = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.icon = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
e.bandolier_name = row[5] ? row[5] : "";
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.bandolier_id = row[1] ? static_cast<uint8_t>(strtoul(row[1], nullptr, 10)) : 0;
e.bandolier_slot = row[2] ? static_cast<uint8_t>(strtoul(row[2], nullptr, 10)) : 0;
e.item_id = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.icon = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
e.bandolier_name = row[5] ? row[5] : "0";
all_entries.push_back(e);
}
@@ -306,12 +305,12 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
CharacterBandolier e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.bandolier_id = static_cast<uint8_t>(strtoul(row[1], nullptr, 10));
e.bandolier_slot = static_cast<uint8_t>(strtoul(row[2], nullptr, 10));
e.item_id = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.icon = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
e.bandolier_name = row[5] ? row[5] : "";
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.bandolier_id = row[1] ? static_cast<uint8_t>(strtoul(row[1], nullptr, 10)) : 0;
e.bandolier_slot = row[2] ? static_cast<uint8_t>(strtoul(row[2], nullptr, 10)) : 0;
e.item_id = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.icon = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
e.bandolier_name = row[5] ? row[5] : "0";
all_entries.push_back(e);
}
@@ -16,7 +16,6 @@
#include "../../strings.h"
#include <ctime>
class BaseCharacterBindRepository {
public:
struct CharacterBind {
@@ -144,14 +143,14 @@ public:
if (results.RowCount() == 1) {
CharacterBind e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.slot = static_cast<int32_t>(atoi(row[1]));
e.zone_id = static_cast<uint16_t>(strtoul(row[2], nullptr, 10));
e.instance_id = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.x = strtof(row[4], nullptr);
e.y = strtof(row[5], nullptr);
e.z = strtof(row[6], nullptr);
e.heading = strtof(row[7], nullptr);
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.slot = row[1] ? static_cast<int32_t>(atoi(row[1])) : 0;
e.zone_id = row[2] ? static_cast<uint16_t>(strtoul(row[2], nullptr, 10)) : 0;
e.instance_id = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.x = row[4] ? strtof(row[4], nullptr) : 0;
e.y = row[5] ? strtof(row[5], nullptr) : 0;
e.z = row[6] ? strtof(row[6], nullptr) : 0;
e.heading = row[7] ? strtof(row[7], nullptr) : 0;
return e;
}
@@ -291,14 +290,14 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
CharacterBind e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.slot = static_cast<int32_t>(atoi(row[1]));
e.zone_id = static_cast<uint16_t>(strtoul(row[2], nullptr, 10));
e.instance_id = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.x = strtof(row[4], nullptr);
e.y = strtof(row[5], nullptr);
e.z = strtof(row[6], nullptr);
e.heading = strtof(row[7], nullptr);
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.slot = row[1] ? static_cast<int32_t>(atoi(row[1])) : 0;
e.zone_id = row[2] ? static_cast<uint16_t>(strtoul(row[2], nullptr, 10)) : 0;
e.instance_id = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.x = row[4] ? strtof(row[4], nullptr) : 0;
e.y = row[5] ? strtof(row[5], nullptr) : 0;
e.z = row[6] ? strtof(row[6], nullptr) : 0;
e.heading = row[7] ? strtof(row[7], nullptr) : 0;
all_entries.push_back(e);
}
@@ -323,14 +322,14 @@ public:
for (auto row = results.begin(); row != results.end(); ++row) {
CharacterBind e{};
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
e.slot = static_cast<int32_t>(atoi(row[1]));
e.zone_id = static_cast<uint16_t>(strtoul(row[2], nullptr, 10));
e.instance_id = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
e.x = strtof(row[4], nullptr);
e.y = strtof(row[5], nullptr);
e.z = strtof(row[6], nullptr);
e.heading = strtof(row[7], nullptr);
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.slot = row[1] ? static_cast<int32_t>(atoi(row[1])) : 0;
e.zone_id = row[2] ? static_cast<uint16_t>(strtoul(row[2], nullptr, 10)) : 0;
e.instance_id = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.x = row[4] ? strtof(row[4], nullptr) : 0;
e.y = row[5] ? strtof(row[5], nullptr) : 0;
e.z = row[6] ? strtof(row[6], nullptr) : 0;
e.heading = row[7] ? strtof(row[7], nullptr) : 0;
all_entries.push_back(e);
}

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