From dbf0ce5284c0401ad8d7ada98c2b071b29a5d119 Mon Sep 17 00:00:00 2001 From: Mordred Date: Fri, 20 Jul 2018 22:39:10 +0200 Subject: [PATCH 001/117] First step of inventory cleanup, moving defs to common --- src/common/Common.h | 51 +++++++ .../Network/PacketDef/Zone/ServerZoneDef.h | 29 ++-- .../sapphire_zone/Action/ActionMount.cpp | 4 +- .../sapphire_zone/Action/ActionTeleport.cpp | 6 +- .../sapphire_zone/Action/EventItemAction.cpp | 2 +- src/servers/sapphire_zone/Actor/Chara.cpp | 14 +- src/servers/sapphire_zone/Actor/Player.cpp | 28 ++-- src/servers/sapphire_zone/Actor/Player.h | 8 +- .../sapphire_zone/Actor/PlayerInventory.cpp | 38 ++--- .../DebugCommand/DebugCommandHandler.cpp | 2 +- .../sapphire_zone/Inventory/Inventory.cpp | 4 +- .../sapphire_zone/Inventory/Inventory.h | 137 ++---------------- .../Network/PacketWrappers/ModelEquipPacket.h | 10 +- .../PacketWrappers/PlayerSpawnPacket.h | 12 +- 14 files changed, 143 insertions(+), 202 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index 6f8acead..d826fe96 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -114,6 +114,57 @@ namespace Common { FreeCompanyCrystal = 22001 }; + enum ContainerType : uint16_t + { + Unknown = 0, + Bag = 1, + GearSet = 2, + CurrencyCrystal = 3, + Armory = 4 + }; + + + enum CurrencyType : uint8_t + { + Gil = 0x01, + StormSeal = 0x02, + SerpentSeal = 0x03, + FlameSeal = 0x04, + TomestonePhilo = 0x05, + TomestoneMytho = 0x06, + WolfMark = 0x07, + TomestoneSold = 0x08, + AlliedSeal = 0x09, + TomestonePoet = 0x0A, + Mgp = 0x0B, + TomestoneLaw = 0x0C, + TomestoneEso = 0x0D, + TomestoneLore = 0x0E + }; + + enum CrystalType : uint8_t + { + FireShard = 0x01, + IceShard = 0x02, + WindShard = 0x03, + EarthShard = 0x04, + LightningShard = 0x05, + WaterShard = 0x06, + + FireCrystal = 0x07, + IceCrystal = 0x08, + WindCrystal = 0x09, + EarthCrystal = 0x0A, + LightningCrystal = 0x0B, + WaterCrystal = 0x0C, + + FireCluster = 0x0D, + IceCluster = 0x0E, + WindCluster = 0x0F, + EarthCluster = 0x10, + LightningCluster = 0x11, + WaterCluster = 0x12 + }; enum struct ZoneingType : uint8_t { diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 6382bb56..ddbd4b00 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -303,11 +303,11 @@ struct effectEntry { Common::ActionEffectType effectType; Common::ActionHitSeverityType hitSeverity; - uint8_t unknown_3; + uint8_t param; int8_t bonusPercent; - int16_t value; uint8_t valueMultiplier; // This multiplies whatever value is in the 'value' param by 10. Possibly a workaround for big numbers - uint8_t unknown_6; + uint8_t flags; + int16_t value; }; struct FFXIVIpcEffect : FFXIVIpcBasePacket @@ -318,17 +318,26 @@ struct FFXIVIpcEffect : FFXIVIpcBasePacket uint32_t unknown_2; uint32_t unknown_5; uint32_t unknown_6; - uint32_t effectTargetId; + uint16_t unknown_7; uint16_t rotation; uint16_t actionTextId; - uint8_t unknown_61; - uint8_t unknown_62; - uint8_t unknown_10; + uint16_t unknown_8; + + uint8_t unknown_9; uint8_t numEffects; - uint32_t u11; + + uint16_t unknown_10; + uint32_t unknown_11; + uint16_t unknown_12; + effectEntry effects[8]; - uint32_t effectTarget; - uint64_t unknown_8; + + uint32_t unknown_13; + uint16_t unknown_14; + + uint32_t effectTargetId; + + uint64_t unknown_15; }; diff --git a/src/servers/sapphire_zone/Action/ActionMount.cpp b/src/servers/sapphire_zone/Action/ActionMount.cpp index 2859d97a..ea06c069 100644 --- a/src/servers/sapphire_zone/Action/ActionMount.cpp +++ b/src/servers/sapphire_zone/Action/ActionMount.cpp @@ -78,11 +78,11 @@ void Core::Action::ActionMount::onFinish() effectPacket->data().targetId = pPlayer->getId(); effectPacket->data().actionAnimationId = m_id; // Affects displaying action name next to number in floating text - effectPacket->data().unknown_62 = 13; + //effectPacket->data().unknown_62 = 13; effectPacket->data().actionTextId = 4; effectPacket->data().numEffects = 1; effectPacket->data().rotation = Math::Util::floatToUInt16Rot( pPlayer->getRot() ); - effectPacket->data().effectTarget = INVALID_GAME_OBJECT_ID; + //effectPacket->data().effectTarget = INVALID_GAME_OBJECT_ID; effectPacket->data().effects[0].effectType = ActionEffectType::Mount; effectPacket->data().effects[0].hitSeverity = ActionHitSeverityType::CritDamage; effectPacket->data().effects[0].value = m_id; diff --git a/src/servers/sapphire_zone/Action/ActionTeleport.cpp b/src/servers/sapphire_zone/Action/ActionTeleport.cpp index 18220605..277aec5b 100644 --- a/src/servers/sapphire_zone/Action/ActionTeleport.cpp +++ b/src/servers/sapphire_zone/Action/ActionTeleport.cpp @@ -68,13 +68,13 @@ void Core::Action::ActionTeleport::onFinish() auto pPlayer = m_pSource->getAsPlayer(); // check we can finish teleporting - if( pPlayer->getCurrency( Inventory::CurrencyType::Gil ) < m_cost ) + if( pPlayer->getCurrency( Common::CurrencyType::Gil ) < m_cost ) { onInterrupt(); return; } - pPlayer->removeCurrency( Inventory::CurrencyType::Gil, m_cost ); + pPlayer->removeCurrency( Common::CurrencyType::Gil, m_cost ); pPlayer->unsetStateFlag( PlayerStateFlag::Casting ); @@ -92,7 +92,7 @@ void Core::Action::ActionTeleport::onFinish() effectPacket->data().unknown_5 = 1; effectPacket->data().numEffects = 1; effectPacket->data().rotation = static_cast< uint16_t >( 0x8000 * ( ( pPlayer->getRot() + 3.1415926 ) ) / 3.1415926 ); - effectPacket->data().effectTarget = pPlayer->getId(); + effectPacket->data().effectTargetId = pPlayer->getId(); pPlayer->sendToInRangeSet( effectPacket, true ); pPlayer->teleport( m_targetAetheryte ); diff --git a/src/servers/sapphire_zone/Action/EventItemAction.cpp b/src/servers/sapphire_zone/Action/EventItemAction.cpp index 9805834a..a6c68208 100644 --- a/src/servers/sapphire_zone/Action/EventItemAction.cpp +++ b/src/servers/sapphire_zone/Action/EventItemAction.cpp @@ -77,7 +77,7 @@ void Core::Action::EventItemAction::onFinish() effectPacket->data().unknown_5 = 2; effectPacket->data().numEffects = 1; effectPacket->data().rotation = Math::Util::floatToUInt16Rot( m_pSource->getRot() ); - effectPacket->data().effectTarget = static_cast< uint32_t >( m_additional ); + effectPacket->data().effectTargetId = static_cast< uint32_t >( m_additional ); m_pSource->getAsPlayer()->unsetStateFlag( Common::PlayerStateFlag::Casting ); m_pSource->sendToInRangeSet( effectPacket, true ); diff --git a/src/servers/sapphire_zone/Actor/Chara.cpp b/src/servers/sapphire_zone/Actor/Chara.cpp index 9f78525b..7ebcf50a 100644 --- a/src/servers/sapphire_zone/Actor/Chara.cpp +++ b/src/servers/sapphire_zone/Actor/Chara.cpp @@ -407,11 +407,11 @@ void Core::Entity::Chara::autoAttack( CharaPtr pTarget ) ipcEffect->data().actionTextId = 0x366; ipcEffect->data().numEffects = 1; ipcEffect->data().rotation = Math::Util::floatToUInt16Rot( getRot() ); - ipcEffect->data().effectTarget = pTarget->getId(); + ipcEffect->data().effectTargetId = pTarget->getId(); ipcEffect->data().effects[0].value = damage; ipcEffect->data().effects[0].effectType = ActionEffectType::Damage; ipcEffect->data().effects[0].hitSeverity = static_cast< ActionHitSeverityType >( variation ); - ipcEffect->data().effects[0].unknown_3 = 7; + //ipcEffect->data().effects[0].unknown_3 = 7; sendToInRangeSet( ipcEffect ); @@ -447,12 +447,12 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u auto effectPacket = makeZonePacket< FFXIVIpcEffect >( getId() ); effectPacket->data().targetId = target.getId(); effectPacket->data().actionAnimationId = actionId; - effectPacket->data().unknown_62 = 1; // Affects displaying action name next to number in floating text + //effectPacket->data().unknown_62 = 1; // Affects displaying action name next to number in floating text effectPacket->data().unknown_2 = 1; // This seems to have an effect on the "double-cast finish" animation effectPacket->data().actionTextId = actionId; effectPacket->data().numEffects = 1; effectPacket->data().rotation = Math::Util::floatToUInt16Rot( getRot() ); - effectPacket->data().effectTarget = target.getId(); + effectPacket->data().effectTargetId = target.getId(); // Todo: for each actor, calculate how much damage the calculated value should deal to them - 2-step damage calc. we only have 1-step switch( type ) @@ -463,7 +463,7 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u effectPacket->data().effects[0].value = static_cast< uint16_t >( param1 ); effectPacket->data().effects[0].effectType = ActionEffectType::Damage; effectPacket->data().effects[0].hitSeverity = ActionHitSeverityType::NormalDamage; - effectPacket->data().effects[0].unknown_3 = 7; + //effectPacket->data().effects[0].unknown_3 = 7; if( actionInfoPtr->castType == 1 && actionInfoPtr->effectRange != 0 || actionInfoPtr->castType != 1 ) { @@ -488,7 +488,7 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u for( const auto& pHitActor : actorsCollided ) { effectPacket->data().targetId = pHitActor->getId(); - effectPacket->data().effectTarget = pHitActor->getId(); + effectPacket->data().effectTargetId = pHitActor->getId(); // todo: send to range of what? ourselves? when mob script hits this is going to be lacking sendToInRangeSet( effectPacket, true ); @@ -541,7 +541,7 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u for( auto pHitActor : actorsCollided ) { effectPacket->data().targetId = target.getId(); - effectPacket->data().effectTarget = pHitActor->getId(); + effectPacket->data().effectTargetId = pHitActor->getId(); sendToInRangeSet( effectPacket, true ); pHitActor->getAsChara()->heal( calculatedHeal ); diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 9d86cc43..27cf2775 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -769,12 +769,12 @@ void Core::Entity::Player::sendModel() sendToInRangeSet( boost::make_shared< ModelEquipPacket >( *getAsPlayer() ), true ); } -uint32_t Core::Entity::Player::getModelForSlot( Inventory::EquipSlot slot ) +uint32_t Core::Entity::Player::getModelForSlot( Common::EquipSlot slot ) { return m_modelEquip[slot]; } -void Core::Entity::Player::setModelForSlot( Inventory::EquipSlot slot, uint32_t val ) +void Core::Entity::Player::setModelForSlot( Common::EquipSlot slot, uint32_t val ) { m_modelEquip[slot] = val; } @@ -1023,7 +1023,7 @@ void Core::Entity::Player::update( int64_t currTime ) { if( m_targetId && m_currentStance == Entity::Chara::Stance::Active && isAutoattackOn() ) { - auto mainWeap = m_pInventory->getItemAt( Inventory::GearSet0, Inventory::EquipSlot::MainHand ); + auto mainWeap = m_pInventory->getItemAt( Common::GearSet0, Common::EquipSlot::MainHand ); // @TODO i dislike this, iterating over all in range actors when you already know the id of the actor you need... for( auto actor : m_inRangeActor ) @@ -1406,8 +1406,8 @@ uint32_t Core::Entity::Player::getPersistentEmote() const void Core::Entity::Player::autoAttack( CharaPtr pTarget ) { - auto mainWeap = m_pInventory->getItemAt( Inventory::GearSet0, - Inventory::EquipSlot::MainHand ); + auto mainWeap = m_pInventory->getItemAt( Common::GearSet0, + Common::EquipSlot::MainHand ); pTarget->onActionHostile( *this ); //uint64_t tick = Util::getTimeMs(); @@ -1423,16 +1423,16 @@ void Core::Entity::Player::autoAttack( CharaPtr pTarget ) effectPacket->data().actionAnimationId = 8; // effectPacket.data().unknown_2 = variation; effectPacket->data().numEffects = 1; - effectPacket->data().unknown_61 = 1; - effectPacket->data().unknown_62 = 1; + //effectPacket->data().unknown_61 = 1; + //effectPacket->data().unknown_62 = 1; effectPacket->data().actionTextId = 8; effectPacket->data().rotation = Math::Util::floatToUInt16Rot( getRot() ); effectPacket->data().effectTargetId = pTarget->getId(); - effectPacket->data().effectTarget = pTarget->getId(); + //effectPacket->data().effectTarget = pTarget->getId(); effectPacket->data().effects[0].value = damage; effectPacket->data().effects[0].effectType = Common::ActionEffectType::Damage; effectPacket->data().effects[0].hitSeverity = Common::ActionHitSeverityType::NormalDamage; - effectPacket->data().effects[0].unknown_3 = 7; + //effectPacket->data().effects[0].unknown_3 = 7; sendToInRangeSet(effectPacket, true); } @@ -1444,15 +1444,15 @@ void Core::Entity::Player::autoAttack( CharaPtr pTarget ) effectPacket->data().actionAnimationId = 7; // effectPacket.data().unknown_2 = variation; effectPacket->data().numEffects = 1; - effectPacket->data().unknown_61 = 1; - effectPacket->data().unknown_62 = 1; + //effectPacket->data().unknown_61 = 1; + //effectPacket->data().unknown_62 = 1; effectPacket->data().actionTextId = 7; effectPacket->data().rotation = Math::Util::floatToUInt16Rot( getRot() ); - effectPacket->data().effectTarget = pTarget->getId(); + effectPacket->data().effectTargetId = pTarget->getId(); effectPacket->data().effects[0].value = damage; effectPacket->data().effects[0].effectType = Common::ActionEffectType::Damage; effectPacket->data().effects[0].hitSeverity = Common::ActionHitSeverityType::NormalDamage; - effectPacket->data().effects[0].unknown_3 = 71; + //effectPacket->data().effects[0].unknown_3 = 71; sendToInRangeSet(effectPacket, true); } @@ -1701,7 +1701,7 @@ void Core::Entity::Player::teleportQuery( uint16_t aetheryteId ) // cap at 999 gil cost = cost > uint16_t{999} ? uint16_t{999} : cost; - bool insufficientGil = getCurrency( Inventory::CurrencyType::Gil ) < cost; + bool insufficientGil = getCurrency( Common::CurrencyType::Gil ) < cost; // TODO: figure out what param1 really does queuePacket( boost::make_shared< ActorControlPacket143 >( getId(), TeleportStart, insufficientGil ? 2 : 0, aetheryteId ) ); diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index b03bb9dd..33dc78f5 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -223,9 +223,9 @@ public: /*! add an item to a given container */ bool addItem( uint16_t containerId, uint16_t catalogId, uint32_t quantity ); /*! equip an item to a specified slot */ - void equipItem( Inventory::EquipSlot equipSlotId, ItemPtr pItem, bool sendModel ); + void equipItem( Common::EquipSlot equipSlotId, ItemPtr pItem, bool sendModel ); /*! remove an item from an equipment slot */ - void unequipItem( Inventory::EquipSlot equipSlotId, ItemPtr pItem ); + void unequipItem( Common::EquipSlot equipSlotId, ItemPtr pItem ); /*! equip a weapon, possibly forcing a job change */ void equipWeapon( ItemPtr pItem ); /*! get player ilvl */ @@ -243,9 +243,9 @@ public: /*! return a const pointer to the model array */ const uint32_t* getModelArray() const; /*! return the equipment model in a specified equipment slot */ - uint32_t getModelForSlot( Inventory::EquipSlot slot ); + uint32_t getModelForSlot( Common::EquipSlot slot ); /*! set the equipment model in a specified equipment slot */ - void setModelForSlot( Inventory::EquipSlot slot, uint32_t val ); + void setModelForSlot( Common::EquipSlot slot, uint32_t val ); /*! return the current amount of currency of type */ uint32_t getCurrency( uint8_t type ) const; /*! add amount to the currency of type */ diff --git a/src/servers/sapphire_zone/Actor/PlayerInventory.cpp b/src/servers/sapphire_zone/Actor/PlayerInventory.cpp index 595eb762..4e4a6eaa 100644 --- a/src/servers/sapphire_zone/Actor/PlayerInventory.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerInventory.cpp @@ -86,7 +86,7 @@ void Core::Entity::Player::equipWeapon( ItemPtr pItem ) } // equip an item -void Core::Entity::Player::equipItem( Inventory::EquipSlot equipSlotId, ItemPtr pItem, bool sendUpdate ) +void Core::Entity::Player::equipItem( Common::EquipSlot equipSlotId, ItemPtr pItem, bool sendUpdate ) { //g_framework.getLogger().debug( "Equipping into slot " + std::to_string( equipSlotId ) ); @@ -96,18 +96,18 @@ void Core::Entity::Player::equipItem( Inventory::EquipSlot equipSlotId, ItemPtr switch( equipSlotId ) { - case Inventory::EquipSlot::MainHand: + case Common::EquipSlot::MainHand: m_modelMainWeapon = model; m_modelSubWeapon = model2; // TODO: add job change upon changing weapon if needed // equipWeapon( pItem ); break; - case Inventory::EquipSlot::OffHand: + case Common::EquipSlot::OffHand: m_modelSubWeapon = model; break; - case Inventory::EquipSlot::SoulCrystal: + case Common::EquipSlot::SoulCrystal: // TODO: add Job change on equipping crystal // change job break; @@ -126,7 +126,7 @@ void Core::Entity::Player::equipItem( Inventory::EquipSlot equipSlotId, ItemPtr } } -void Core::Entity::Player::unequipItem( Inventory::EquipSlot equipSlotId, ItemPtr pItem ) +void Core::Entity::Player::unequipItem( Common::EquipSlot equipSlotId, ItemPtr pItem ) { m_modelEquip[static_cast< uint8_t >( equipSlotId )] = 0; sendModel(); @@ -137,19 +137,19 @@ void Core::Entity::Player::unequipItem( Inventory::EquipSlot equipSlotId, ItemPt uint32_t Core::Entity::Player::getCurrency( uint8_t type ) const { - return m_pInventory->getCurrency( static_cast< Inventory::CurrencyType >( type ) ); + return m_pInventory->getCurrency( static_cast< Common::CurrencyType >( type ) ); } // TODO: these next functions are so similar that they could likely be simplified void Core::Entity::Player::addCurrency( uint8_t type, uint32_t amount ) { - if( !m_pInventory->addCurrency( static_cast< Inventory::CurrencyType >( type ), amount ) ) + if( !m_pInventory->addCurrency( static_cast< Common::CurrencyType >( type ), amount ) ) return; auto invUpPacket = makeZonePacket< FFXIVIpcUpdateInventorySlot >( getId() ); - invUpPacket->data().containerId = Inventory::InventoryType::Currency; + invUpPacket->data().containerId = Common::InventoryType::Currency; invUpPacket->data().catalogId = 1; - invUpPacket->data().quantity = m_pInventory->getCurrency( static_cast< Inventory::CurrencyType >( type ) ); + invUpPacket->data().quantity = m_pInventory->getCurrency( static_cast< Common::CurrencyType >( type ) ); invUpPacket->data().slot = static_cast< uint8_t >( type ) - 1; queuePacket( invUpPacket ); @@ -157,13 +157,13 @@ void Core::Entity::Player::addCurrency( uint8_t type, uint32_t amount ) void Core::Entity::Player::removeCurrency( uint8_t type, uint32_t amount ) { - if( !m_pInventory->removeCurrency( static_cast< Inventory::CurrencyType >( type ), amount ) ) + if( !m_pInventory->removeCurrency( static_cast< Common::CurrencyType >( type ), amount ) ) return; auto invUpPacket = makeZonePacket< FFXIVIpcUpdateInventorySlot >( getId() ); - invUpPacket->data().containerId = Inventory::InventoryType::Currency; + invUpPacket->data().containerId = Common::InventoryType::Currency; invUpPacket->data().catalogId = 1; - invUpPacket->data().quantity = m_pInventory->getCurrency( static_cast< Inventory::CurrencyType >( type ) ); + invUpPacket->data().quantity = m_pInventory->getCurrency( static_cast< Common::CurrencyType >( type ) ); invUpPacket->data().slot = static_cast< uint8_t >( type ) - 1; queuePacket( invUpPacket ); @@ -172,18 +172,18 @@ void Core::Entity::Player::removeCurrency( uint8_t type, uint32_t amount ) uint32_t Core::Entity::Player::getCrystal( uint8_t type ) const { - return m_pInventory->getCrystal( static_cast< Inventory::CrystalType >( type ) ); + return m_pInventory->getCrystal( static_cast< Common::CrystalType >( type ) ); } void Core::Entity::Player::addCrystal( uint8_t type, uint32_t amount ) { - if( !m_pInventory->addCrystal( static_cast< Inventory::CrystalType >( type ), amount ) ) + if( !m_pInventory->addCrystal( static_cast< Common::CrystalType >( type ), amount ) ) return; auto invUpPacket = makeZonePacket< FFXIVIpcUpdateInventorySlot >( getId() ); - invUpPacket->data().containerId = Inventory::InventoryType::Crystal; + invUpPacket->data().containerId = Common::InventoryType::Crystal; invUpPacket->data().catalogId = static_cast< uint8_t >( type ) + 1; - invUpPacket->data().quantity = m_pInventory->getCrystal( static_cast< Inventory::CrystalType >( type ) ); + invUpPacket->data().quantity = m_pInventory->getCrystal( static_cast< Common::CrystalType >( type ) ); invUpPacket->data().slot = static_cast< uint8_t >( type ) - 1; queuePacket( invUpPacket ); @@ -194,13 +194,13 @@ void Core::Entity::Player::addCrystal( uint8_t type, uint32_t amount ) void Core::Entity::Player::removeCrystal( uint8_t type, uint32_t amount ) { - if( !m_pInventory->removeCrystal( static_cast< Inventory::CrystalType >( type ), amount ) ) + if( !m_pInventory->removeCrystal( static_cast< Common::CrystalType >( type ), amount ) ) return; auto invUpPacket = makeZonePacket< FFXIVIpcUpdateInventorySlot >( getId() ); - invUpPacket->data().containerId = Inventory::InventoryType::Crystal; + invUpPacket->data().containerId = Common::InventoryType::Crystal; invUpPacket->data().catalogId = static_cast< uint8_t >( type ) + 1; - invUpPacket->data().quantity = m_pInventory->getCrystal( static_cast< Inventory::CrystalType >( type ) ); + invUpPacket->data().quantity = m_pInventory->getCrystal( static_cast< Common::CrystalType >( type ) ); invUpPacket->data().slot = static_cast< uint8_t >( type ) - 1; queuePacket( invUpPacket ); diff --git a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp index 6b18689e..f80a0926 100644 --- a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp +++ b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp @@ -268,7 +268,7 @@ void Core::DebugCommandHandler::set( char * data, Entity::Player& player, boost: uint32_t val; sscanf( params.c_str(), "%d %d", &slot, &val ); - player.setModelForSlot( static_cast< Inventory::EquipSlot >( slot ), val ); + player.setModelForSlot( static_cast< Common::EquipSlot >( slot ), val ); player.sendModel(); player.sendDebug( "Model updated" ); } diff --git a/src/servers/sapphire_zone/Inventory/Inventory.cpp b/src/servers/sapphire_zone/Inventory/Inventory.cpp index 9875a444..61a8a82e 100644 --- a/src/servers/sapphire_zone/Inventory/Inventory.cpp +++ b/src/servers/sapphire_zone/Inventory/Inventory.cpp @@ -983,7 +983,7 @@ uint8_t Core::Inventory::getFreeSlotsInBags() } -Core::Inventory::ContainerType Core::Inventory::getContainerType( uint32_t containerId ) +Core::Common::ContainerType Core::Inventory::getContainerType( uint32_t containerId ) { if( containerId < 5 ) { @@ -1003,7 +1003,7 @@ Core::Inventory::ContainerType Core::Inventory::getContainerType( uint32_t conta } else { - return Unknown; + return Common::Unknown; } } diff --git a/src/servers/sapphire_zone/Inventory/Inventory.h b/src/servers/sapphire_zone/Inventory/Inventory.h index 082fbc2d..daaa188c 100644 --- a/src/servers/sapphire_zone/Inventory/Inventory.h +++ b/src/servers/sapphire_zone/Inventory/Inventory.h @@ -16,125 +16,6 @@ public: Inventory( Entity::Player* pOwner ); ~Inventory(); - enum ContainerType : uint16_t - { - Unknown = 0, - Bag = 1, - GearSet = 2, - CurrencyCrystal = 3, - Armory = 4 - }; - - enum InventoryType : uint16_t - { - Bag0 = 0, - Bag1 = 1, - Bag2 = 2, - Bag3 = 3, - - GearSet0 = 1000, - GearSet1 = 1001, - - Currency = 2000, - Crystal = 2001, - //UNKNOWN_0 = 2003, - KeyItem = 2004, - DamagedGear = 2007, - //UNKNOWN_1 = 2008, - - ArmoryOff = 3200, - ArmoryHead = 3201, - ArmoryBody = 3202, - ArmoryHand = 3203, - ArmoryWaist = 3204, - ArmoryLegs = 3205, - ArmoryFeet = 3206, - ArmotyNeck = 3207, - ArmoryEar = 3208, - ArmoryWrist = 3209, - ArmoryRing = 3300, - - ArmorySoulCrystal = 3400, - ArmoryMain = 3500, - - RetainerBag0 = 10000, - RetainerBag1 = 10001, - RetainerBag2 = 10002, - RetainerBag3 = 10003, - RetainerBag4 = 10004, - RetainerBag5 = 10005, - RetainerBag6 = 10006, - RetainerEquippedGear = 11000, - RetainerGil = 12000, - RetainerCrystal = 12001, - RetainerMarket = 12002, - - FreeCompanyBag0 = 20000, - FreeCompanyBag1 = 20001, - FreeCompanyBag2 = 20002, - FreeCompanyGil = 22000, - FreeCompanyCrystal = 22001 - }; - - enum CurrencyType : uint8_t - { - Gil = 0x01, - StormSeal = 0x02, - SerpentSeal = 0x03, - FlameSeal = 0x04, - TomestonePhilo = 0x05, - TomestoneMytho = 0x06, - WolfMark = 0x07, - TomestoneSold = 0x08, - AlliedSeal = 0x09, - TomestonePoet = 0x0A, - Mgp = 0x0B, - TomestoneLaw = 0x0C, - TomestoneEso = 0x0D, - TomestoneLore = 0x0E - }; - - enum CrystalType : uint8_t - { - FireShard = 0x01, - IceShard = 0x02, - WindShard = 0x03, - EarthShard = 0x04, - LightningShard = 0x05, - WaterShard = 0x06, - - FireCrystal = 0x07, - IceCrystal = 0x08, - WindCrystal = 0x09, - EarthCrystal = 0x0A, - LightningCrystal = 0x0B, - WaterCrystal = 0x0C, - - FireCluster = 0x0D, - IceCluster = 0x0E, - WindCluster = 0x0F, - EarthCluster = 0x10, - LightningCluster = 0x11, - WaterCluster = 0x12 - }; - - enum EquipSlot : uint8_t - { - MainHand = 0, - OffHand = 1, - Head = 2, - Body = 3, - Hands = 4, - Waist = 5, - Legs = 6, - Feet = 7, - Neck = 8, - Ear = 9, - Wrist = 10, - Ring1 = 11, - Ring2 = 12, - SoulCrystal = 13, - }; using InvSlotPair = std::pair< uint16_t, int8_t >; typedef std::vector< InvSlotPair > InvSlotPairVec; @@ -160,15 +41,15 @@ public: /*! calculate and return player ilvl based off equipped gear */ uint16_t calculateEquippedGearItemLevel(); /*! return the current amount of currency of type */ - uint32_t getCurrency( CurrencyType type ); + uint32_t getCurrency( Common::CurrencyType type ); /*! add amount to the current of type */ - bool addCurrency( CurrencyType type, uint32_t amount ); + bool addCurrency( Common::CurrencyType type, uint32_t amount ); /*! remove amount from the currency of type */ - bool removeCurrency( CurrencyType type, uint32_t amount ); + bool removeCurrency( Common::CurrencyType type, uint32_t amount ); void updateCurrencyDb(); - void updateBagDb( InventoryType type ); - void updateMannequinDb( InventoryType type ); + void updateBagDb( Common::InventoryType type ); + void updateMannequinDb( Common::InventoryType type ); void updateItemDb( ItemPtr pItem ) const; void deleteItemDb( ItemPtr pItem ) const; @@ -177,11 +58,11 @@ public: uint16_t getArmoryToEquipSlot( uint8_t slotId ); /*! return the crystal amount of currency of type */ - uint32_t getCrystal( CrystalType type ); + uint32_t getCrystal( Common::CrystalType type ); /*! add amount to the crystal of type */ - bool addCrystal( CrystalType type, uint32_t amount ); + bool addCrystal( Common::CrystalType type, uint32_t amount ); /*! remove amount from the crystals of type */ - bool removeCrystal( CrystalType type, uint32_t amount ); + bool removeCrystal( Common::CrystalType type, uint32_t amount ); bool isObtainable( uint32_t catalogId, uint8_t quantity ); void updateCrystalDb(); @@ -192,7 +73,7 @@ public: uint8_t getFreeSlotsInBags(); - ContainerType getContainerType( uint32_t containerId ); + Common::ContainerType getContainerType( uint32_t containerId ); uint32_t getNextUId(); diff --git a/src/servers/sapphire_zone/Network/PacketWrappers/ModelEquipPacket.h b/src/servers/sapphire_zone/Network/PacketWrappers/ModelEquipPacket.h index 41cd107a..6d52668e 100644 --- a/src/servers/sapphire_zone/Network/PacketWrappers/ModelEquipPacket.h +++ b/src/servers/sapphire_zone/Network/PacketWrappers/ModelEquipPacket.h @@ -28,11 +28,11 @@ private: { m_data.mainWeapon = player.getModelMainWeapon(); m_data.offWeapon = player.getModelSubWeapon(); - m_data.models[0] = player.getModelForSlot( Inventory::EquipSlot::Head ); - m_data.models[1] = player.getModelForSlot( Inventory::EquipSlot::Body ); - m_data.models[2] = player.getModelForSlot( Inventory::EquipSlot::Hands ); - m_data.models[3] = player.getModelForSlot( Inventory::EquipSlot::Legs ); - m_data.models[4] = player.getModelForSlot( Inventory::EquipSlot::Feet ); + m_data.models[0] = player.getModelForSlot( Common::EquipSlot::Head ); + m_data.models[1] = player.getModelForSlot( Common::EquipSlot::Body ); + m_data.models[2] = player.getModelForSlot( Common::EquipSlot::Hands ); + m_data.models[3] = player.getModelForSlot( Common::EquipSlot::Legs ); + m_data.models[4] = player.getModelForSlot( Common::EquipSlot::Feet ); }; }; diff --git a/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h b/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h index 3194099c..760a1c2b 100644 --- a/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h +++ b/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h @@ -50,16 +50,16 @@ namespace Server { memcpy( m_data.look, player.getLookArray(), 26 ); - auto item = player.getInventory()->getItemAt( Inventory::GearSet0, Inventory::EquipSlot::MainHand ); + auto item = player.getInventory()->getItemAt( Common::GearSet0, Common::EquipSlot::MainHand ); if( item ) m_data.mainWeaponModel = item->getModelId1(); m_data.secWeaponModel = player.getModelSubWeapon(); - m_data.models[0] = player.getModelForSlot( Inventory::EquipSlot::Head ); - m_data.models[1] = player.getModelForSlot( Inventory::EquipSlot::Body ); - m_data.models[2] = player.getModelForSlot( Inventory::EquipSlot::Hands ); - m_data.models[3] = player.getModelForSlot( Inventory::EquipSlot::Legs ); - m_data.models[4] = player.getModelForSlot( Inventory::EquipSlot::Feet ); + m_data.models[0] = player.getModelForSlot( Common::EquipSlot::Head ); + m_data.models[1] = player.getModelForSlot( Common::EquipSlot::Body ); + m_data.models[2] = player.getModelForSlot( Common::EquipSlot::Hands ); + m_data.models[3] = player.getModelForSlot( Common::EquipSlot::Legs ); + m_data.models[4] = player.getModelForSlot( Common::EquipSlot::Feet ); strcpy( m_data.name, player.getName().c_str() ); m_data.pos.x = player.getPos().x; From 3131d36ea612e3d08a8d63827b1279c747da8c68 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sat, 21 Jul 2018 15:39:58 +1000 Subject: [PATCH 002/117] update effect struct, knockback effect type --- src/common/Common.h | 1 + .../Network/PacketDef/Zone/ServerZoneDef.h | 49 +++++++++++-------- 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index d826fe96..7a72418b 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -409,6 +409,7 @@ namespace Common { TpLoss = 12, TpGain = 13, GpGain = 14, + Knockback = 33, Mount = 38 }; diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index ddbd4b00..2bc4e0ce 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -304,7 +304,7 @@ struct effectEntry Common::ActionEffectType effectType; Common::ActionHitSeverityType hitSeverity; uint8_t param; - int8_t bonusPercent; + int8_t bonusPercent; // shows an additional percentage in the battle log, will not change the damage number sent & shown uint8_t valueMultiplier; // This multiplies whatever value is in the 'value' param by 10. Possibly a workaround for big numbers uint8_t flags; int16_t value; @@ -312,32 +312,41 @@ struct effectEntry struct FFXIVIpcEffect : FFXIVIpcBasePacket { - uint32_t targetId; - uint32_t unknown_1; - uint32_t actionAnimationId; - uint32_t unknown_2; - uint32_t unknown_5; - uint32_t unknown_6; - uint16_t unknown_7; - uint16_t rotation; - uint16_t actionTextId; - uint16_t unknown_8; + uint64_t animationTargetId; // who the animation targets + uint32_t actionId; // what the casting player casts, shown in battle log/ui - uint8_t unknown_9; - uint8_t numEffects; + uint32_t globalEffectCounter; // seems to only increment on retail? + float animationLockTime; // maybe? doesn't seem to do anything - uint16_t unknown_10; - uint32_t unknown_11; - uint16_t unknown_12; + uint32_t someTargetId; // always 00 00 00 E0, 0x0E000000 is the internal def for INVALID TARGET ID + + uint16_t hiddenAnimation; // if 0, always shows animation, otherwise hides it. counts up by 1 for each animation skipped on a caster + + int16_t rotation; + + uint16_t actionAnimationId; // the animation that is played by the casting character + uint8_t unknown1E; // can be 0,1,2 - maybe other values? - doesn't do anything? + + /* effectDisplayType + * 0 = only show damage/heal amount + * 1 = show damage/heal amount + name + * 2 = show damage/heal amount + name but name is from item.exd, name id is actionId + */ + uint8_t effectDisplayType; + + uint8_t unknown20; // is read by handler, runs code which gets the LODWORD of animationLockTime (wtf?) + uint8_t numEffects; // ignores effects if 0, otherwise parses all of them + + uint32_t padding_22[2]; effectEntry effects[8]; - uint32_t unknown_13; - uint16_t unknown_14; + uint16_t padding_6A[3]; - uint32_t effectTargetId; + uint32_t effectTargetId; // who the effect targets + uint32_t effectFlags; // nonzero = effects do nothing, no battle log, no ui text - only shows animations - uint64_t unknown_15; + uint32_t padding_78; }; From 9d7896043c8ad32495e107474dbb7b53d7f457f8 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sat, 21 Jul 2018 15:54:37 +1000 Subject: [PATCH 003/117] fix builds with new effect packet --- .../sapphire_zone/Action/ActionMount.cpp | 6 +++--- .../sapphire_zone/Action/ActionTeleport.cpp | 7 +++---- .../sapphire_zone/Action/EventItemAction.cpp | 8 +++---- src/servers/sapphire_zone/Actor/Chara.cpp | 21 ++++++++----------- src/servers/sapphire_zone/Actor/Player.cpp | 12 +++++------ 5 files changed, 24 insertions(+), 30 deletions(-) diff --git a/src/servers/sapphire_zone/Action/ActionMount.cpp b/src/servers/sapphire_zone/Action/ActionMount.cpp index ea06c069..912e0c84 100644 --- a/src/servers/sapphire_zone/Action/ActionMount.cpp +++ b/src/servers/sapphire_zone/Action/ActionMount.cpp @@ -73,13 +73,13 @@ void Core::Action::ActionMount::onFinish() pPlayer->unsetStateFlag( PlayerStateFlag::Casting ); - auto effectPacket = makeZonePacket< FFXIVIpcEffect >( getId() ); + auto effectPacket = makeZonePacket< Server::FFXIVIpcEffect >( getId() ); - effectPacket->data().targetId = pPlayer->getId(); + effectPacket->data().animationTargetId = pPlayer->getId(); effectPacket->data().actionAnimationId = m_id; // Affects displaying action name next to number in floating text //effectPacket->data().unknown_62 = 13; - effectPacket->data().actionTextId = 4; + effectPacket->data().actionAnimationId = 4; effectPacket->data().numEffects = 1; effectPacket->data().rotation = Math::Util::floatToUInt16Rot( pPlayer->getRot() ); //effectPacket->data().effectTarget = INVALID_GAME_OBJECT_ID; diff --git a/src/servers/sapphire_zone/Action/ActionTeleport.cpp b/src/servers/sapphire_zone/Action/ActionTeleport.cpp index 277aec5b..81a204c4 100644 --- a/src/servers/sapphire_zone/Action/ActionTeleport.cpp +++ b/src/servers/sapphire_zone/Action/ActionTeleport.cpp @@ -84,12 +84,11 @@ void Core::Action::ActionTeleport::onFinish() pPlayer->setZoningType( ZoneingType::Teleport ); - auto effectPacket = makeZonePacket< FFXIVIpcEffect >( getId() ); - effectPacket->data().targetId = pPlayer->getId(); + auto effectPacket = makeZonePacket< Server::FFXIVIpcEffect >( getId() ); + effectPacket->data().animationTargetId = pPlayer->getId(); effectPacket->data().actionAnimationId = 5; //effectPacket.data().unknown_3 = 1; - effectPacket->data().actionTextId = 5; - effectPacket->data().unknown_5 = 1; + effectPacket->data().actionAnimationId = 5; effectPacket->data().numEffects = 1; effectPacket->data().rotation = static_cast< uint16_t >( 0x8000 * ( ( pPlayer->getRot() + 3.1415926 ) ) / 3.1415926 ); effectPacket->data().effectTargetId = pPlayer->getId(); diff --git a/src/servers/sapphire_zone/Action/EventItemAction.cpp b/src/servers/sapphire_zone/Action/EventItemAction.cpp index a6c68208..8fa6323d 100644 --- a/src/servers/sapphire_zone/Action/EventItemAction.cpp +++ b/src/servers/sapphire_zone/Action/EventItemAction.cpp @@ -69,12 +69,10 @@ void Core::Action::EventItemAction::onFinish() try { - auto effectPacket = makeZonePacket< FFXIVIpcEffect >( m_pSource->getId() ); - effectPacket->data().targetId = static_cast< uint32_t >( m_additional ); + auto effectPacket = makeZonePacket< Server::FFXIVIpcEffect >( m_pSource->getId() ); + effectPacket->data().animationTargetId = static_cast< uint32_t >( m_additional ); effectPacket->data().actionAnimationId = 1; -// effectPacket.data().unknown_3 = 3; - effectPacket->data().actionTextId = m_id; - effectPacket->data().unknown_5 = 2; + effectPacket->data().actionId = m_id; effectPacket->data().numEffects = 1; effectPacket->data().rotation = Math::Util::floatToUInt16Rot( m_pSource->getRot() ); effectPacket->data().effectTargetId = static_cast< uint32_t >( m_additional ); diff --git a/src/servers/sapphire_zone/Actor/Chara.cpp b/src/servers/sapphire_zone/Actor/Chara.cpp index 7ebcf50a..a2e6be7d 100644 --- a/src/servers/sapphire_zone/Actor/Chara.cpp +++ b/src/servers/sapphire_zone/Actor/Chara.cpp @@ -399,19 +399,16 @@ void Core::Entity::Chara::autoAttack( CharaPtr pTarget ) uint16_t damage = static_cast< uint16_t >( 10 + rand() % 12 ); uint32_t variation = static_cast< uint32_t >( 0 + rand() % 4 ); - auto ipcEffect = makeZonePacket< FFXIVIpcEffect >( getId() ); - ipcEffect->data().targetId = pTarget->getId(); + auto ipcEffect = makeZonePacket< Server::FFXIVIpcEffect >( getId() ); + ipcEffect->data().animationTargetId = pTarget->getId(); ipcEffect->data().actionAnimationId = 0x366; - ipcEffect->data().unknown_2 = variation; -// effectPacket->data().unknown_3 = 1; - ipcEffect->data().actionTextId = 0x366; + ipcEffect->data().actionId = 0x366; ipcEffect->data().numEffects = 1; ipcEffect->data().rotation = Math::Util::floatToUInt16Rot( getRot() ); ipcEffect->data().effectTargetId = pTarget->getId(); ipcEffect->data().effects[0].value = damage; ipcEffect->data().effects[0].effectType = ActionEffectType::Damage; ipcEffect->data().effects[0].hitSeverity = static_cast< ActionHitSeverityType >( variation ); - //ipcEffect->data().effects[0].unknown_3 = 7; sendToInRangeSet( ipcEffect ); @@ -444,12 +441,12 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u // Prepare packet. This is seemingly common for all packets in the action handler. - auto effectPacket = makeZonePacket< FFXIVIpcEffect >( getId() ); - effectPacket->data().targetId = target.getId(); + auto effectPacket = makeZonePacket< Server::FFXIVIpcEffect >( getId() ); + effectPacket->data().animationTargetId = target.getId(); effectPacket->data().actionAnimationId = actionId; //effectPacket->data().unknown_62 = 1; // Affects displaying action name next to number in floating text - effectPacket->data().unknown_2 = 1; // This seems to have an effect on the "double-cast finish" animation - effectPacket->data().actionTextId = actionId; + //effectPacket->data().globalEffectCounter = 1; // This seems to have an effect on the "double-cast finish" animation + effectPacket->data().actionId = actionId; effectPacket->data().numEffects = 1; effectPacket->data().rotation = Math::Util::floatToUInt16Rot( getRot() ); effectPacket->data().effectTargetId = target.getId(); @@ -487,7 +484,7 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u for( const auto& pHitActor : actorsCollided ) { - effectPacket->data().targetId = pHitActor->getId(); + effectPacket->data().animationTargetId = pHitActor->getId(); effectPacket->data().effectTargetId = pHitActor->getId(); // todo: send to range of what? ourselves? when mob script hits this is going to be lacking @@ -540,7 +537,7 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u for( auto pHitActor : actorsCollided ) { - effectPacket->data().targetId = target.getId(); + effectPacket->data().animationTargetId = target.getId(); effectPacket->data().effectTargetId = pHitActor->getId(); sendToInRangeSet( effectPacket, true ); diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 27cf2775..80356f77 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -1418,14 +1418,14 @@ void Core::Entity::Player::autoAttack( CharaPtr pTarget ) if( getClass() == ClassJob::Machinist || getClass() == ClassJob::Bard || getClass() == ClassJob::Archer ) { - auto effectPacket = makeZonePacket< FFXIVIpcEffect >( getId() ); - effectPacket->data().targetId = pTarget->getId(); + auto effectPacket = makeZonePacket< Server::FFXIVIpcEffect >( getId() ); + effectPacket->data().animationTargetId = pTarget->getId(); effectPacket->data().actionAnimationId = 8; // effectPacket.data().unknown_2 = variation; effectPacket->data().numEffects = 1; //effectPacket->data().unknown_61 = 1; //effectPacket->data().unknown_62 = 1; - effectPacket->data().actionTextId = 8; + effectPacket->data().actionId = 8; effectPacket->data().rotation = Math::Util::floatToUInt16Rot( getRot() ); effectPacket->data().effectTargetId = pTarget->getId(); //effectPacket->data().effectTarget = pTarget->getId(); @@ -1439,14 +1439,14 @@ void Core::Entity::Player::autoAttack( CharaPtr pTarget ) else { - auto effectPacket = makeZonePacket< FFXIVIpcEffect >( getId() ); - effectPacket->data().targetId = pTarget->getId(); + auto effectPacket = makeZonePacket< Server::FFXIVIpcEffect >( getId() ); + effectPacket->data().animationTargetId = pTarget->getId(); effectPacket->data().actionAnimationId = 7; // effectPacket.data().unknown_2 = variation; effectPacket->data().numEffects = 1; //effectPacket->data().unknown_61 = 1; //effectPacket->data().unknown_62 = 1; - effectPacket->data().actionTextId = 7; + effectPacket->data().actionId = 7; effectPacket->data().rotation = Math::Util::floatToUInt16Rot( getRot() ); effectPacket->data().effectTargetId = pTarget->getId(); effectPacket->data().effects[0].value = damage; From c84beee30a2002c324b604208435eb8addb7350e Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sat, 21 Jul 2018 23:32:10 +1000 Subject: [PATCH 004/117] replace old inline generation of effects packet with a wrapper --- src/common/Common.h | 7 ++ .../Network/PacketDef/Zone/ServerZoneDef.h | 15 ++--- .../sapphire_zone/Action/ActionMount.cpp | 21 +++--- .../sapphire_zone/Action/ActionTeleport.cpp | 17 ++--- .../sapphire_zone/Action/EventItemAction.cpp | 11 ++-- src/servers/sapphire_zone/Actor/Chara.cpp | 61 ++++++++--------- src/servers/sapphire_zone/Actor/Player.cpp | 54 +++++++-------- .../Network/PacketWrappers/EffectPacket.h | 65 +++++++++++++++++++ 8 files changed, 146 insertions(+), 105 deletions(-) create mode 100644 src/servers/sapphire_zone/Network/PacketWrappers/EffectPacket.h diff --git a/src/common/Common.h b/src/common/Common.h index 7a72418b..39fbc393 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -423,6 +423,13 @@ namespace Common { CritDirectHitDamage = 3 }; + enum ActionEffectDisplayType : uint8_t + { + HideActionName = 0, + ShowActionName = 1, + ShowItemName = 2, + }; + enum class ActionCollisionType : uint8_t { None, diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 2bc4e0ce..3787e1c2 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -299,7 +299,7 @@ struct FFXIVIpcUpdateHpMpTp : FFXIVIpcBasePacket * Structural representation of the packet sent by the server * for battle actions */ -struct effectEntry +struct EffectEntry { Common::ActionEffectType effectType; Common::ActionHitSeverityType hitSeverity; @@ -322,24 +322,19 @@ struct FFXIVIpcEffect : FFXIVIpcBasePacket uint16_t hiddenAnimation; // if 0, always shows animation, otherwise hides it. counts up by 1 for each animation skipped on a caster - int16_t rotation; + uint16_t rotation; uint16_t actionAnimationId; // the animation that is played by the casting character uint8_t unknown1E; // can be 0,1,2 - maybe other values? - doesn't do anything? - /* effectDisplayType - * 0 = only show damage/heal amount - * 1 = show damage/heal amount + name - * 2 = show damage/heal amount + name but name is from item.exd, name id is actionId - */ - uint8_t effectDisplayType; + Common::ActionEffectDisplayType effectDisplayType; uint8_t unknown20; // is read by handler, runs code which gets the LODWORD of animationLockTime (wtf?) - uint8_t numEffects; // ignores effects if 0, otherwise parses all of them + uint8_t effectCount; // ignores effects if 0, otherwise parses all of them uint32_t padding_22[2]; - effectEntry effects[8]; + EffectEntry effects[8]; uint16_t padding_6A[3]; diff --git a/src/servers/sapphire_zone/Action/ActionMount.cpp b/src/servers/sapphire_zone/Action/ActionMount.cpp index 912e0c84..2b1ec0da 100644 --- a/src/servers/sapphire_zone/Action/ActionMount.cpp +++ b/src/servers/sapphire_zone/Action/ActionMount.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include "Network/PacketWrappers/ActorControlPacket142.h" #include "Network/PacketWrappers/ActorControlPacket143.h" @@ -73,19 +74,15 @@ void Core::Action::ActionMount::onFinish() pPlayer->unsetStateFlag( PlayerStateFlag::Casting ); - auto effectPacket = makeZonePacket< Server::FFXIVIpcEffect >( getId() ); + auto effectPacket = boost::make_shared< Server::EffectPacket >( getId(), pPlayer->getId(), 4 ); + effectPacket->setRotation( Math::Util::floatToUInt16Rot( pPlayer->getRot() ) ); - effectPacket->data().animationTargetId = pPlayer->getId(); - effectPacket->data().actionAnimationId = m_id; - // Affects displaying action name next to number in floating text - //effectPacket->data().unknown_62 = 13; - effectPacket->data().actionAnimationId = 4; - effectPacket->data().numEffects = 1; - effectPacket->data().rotation = Math::Util::floatToUInt16Rot( pPlayer->getRot() ); - //effectPacket->data().effectTarget = INVALID_GAME_OBJECT_ID; - effectPacket->data().effects[0].effectType = ActionEffectType::Mount; - effectPacket->data().effects[0].hitSeverity = ActionHitSeverityType::CritDamage; - effectPacket->data().effects[0].value = m_id; + Server::EffectEntry effectEntry{}; + effectEntry.effectType = ActionEffectType::Mount; + effectEntry.hitSeverity = ActionHitSeverityType::CritDamage; + effectEntry.value = m_id; + + effectPacket->addEffect( effectEntry ); pPlayer->sendToInRangeSet( effectPacket, true ); diff --git a/src/servers/sapphire_zone/Action/ActionTeleport.cpp b/src/servers/sapphire_zone/Action/ActionTeleport.cpp index 81a204c4..257bc27d 100644 --- a/src/servers/sapphire_zone/Action/ActionTeleport.cpp +++ b/src/servers/sapphire_zone/Action/ActionTeleport.cpp @@ -2,6 +2,8 @@ #include #include #include +#include +#include #include "Network/PacketWrappers/ActorControlPacket142.h" #include "Network/PacketWrappers/ActorControlPacket143.h" @@ -84,19 +86,12 @@ void Core::Action::ActionTeleport::onFinish() pPlayer->setZoningType( ZoneingType::Teleport ); - auto effectPacket = makeZonePacket< Server::FFXIVIpcEffect >( getId() ); - effectPacket->data().animationTargetId = pPlayer->getId(); - effectPacket->data().actionAnimationId = 5; - //effectPacket.data().unknown_3 = 1; - effectPacket->data().actionAnimationId = 5; - effectPacket->data().numEffects = 1; - effectPacket->data().rotation = static_cast< uint16_t >( 0x8000 * ( ( pPlayer->getRot() + 3.1415926 ) ) / 3.1415926 ); - effectPacket->data().effectTargetId = pPlayer->getId(); + auto effectPacket = boost::make_shared< Server::EffectPacket >( getId(), pPlayer->getId(), 5 ); + effectPacket->setRotation( Math::Util::floatToUInt16Rot( pPlayer->getRot() ) ); + + pPlayer->sendToInRangeSet( effectPacket, true ); - pPlayer->teleport( m_targetAetheryte ); - - } void Core::Action::ActionTeleport::onInterrupt() diff --git a/src/servers/sapphire_zone/Action/EventItemAction.cpp b/src/servers/sapphire_zone/Action/EventItemAction.cpp index 8fa6323d..f1ac74e3 100644 --- a/src/servers/sapphire_zone/Action/EventItemAction.cpp +++ b/src/servers/sapphire_zone/Action/EventItemAction.cpp @@ -7,6 +7,7 @@ #include "Network/PacketWrappers/ActorControlPacket142.h" #include "Network/PacketWrappers/ActorControlPacket143.h" +#include "Network/PacketWrappers/EffectPacket.h" #include "Actor/Player.h" @@ -69,13 +70,9 @@ void Core::Action::EventItemAction::onFinish() try { - auto effectPacket = makeZonePacket< Server::FFXIVIpcEffect >( m_pSource->getId() ); - effectPacket->data().animationTargetId = static_cast< uint32_t >( m_additional ); - effectPacket->data().actionAnimationId = 1; - effectPacket->data().actionId = m_id; - effectPacket->data().numEffects = 1; - effectPacket->data().rotation = Math::Util::floatToUInt16Rot( m_pSource->getRot() ); - effectPacket->data().effectTargetId = static_cast< uint32_t >( m_additional ); + auto effectPacket = boost::make_shared< Server::EffectPacket >( m_pSource->getId(), m_additional, m_id ); + effectPacket->setAnimationId( 1 ); + effectPacket->setRotation( Math::Util::floatToUInt16Rot( m_pSource->getRot() ) ); m_pSource->getAsPlayer()->unsetStateFlag( Common::PlayerStateFlag::Casting ); m_pSource->sendToInRangeSet( effectPacket, true ); diff --git a/src/servers/sapphire_zone/Actor/Chara.cpp b/src/servers/sapphire_zone/Actor/Chara.cpp index a2e6be7d..b0b22153 100644 --- a/src/servers/sapphire_zone/Actor/Chara.cpp +++ b/src/servers/sapphire_zone/Actor/Chara.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include "Forwards.h" #include "Action/Action.h" @@ -399,21 +400,20 @@ void Core::Entity::Chara::autoAttack( CharaPtr pTarget ) uint16_t damage = static_cast< uint16_t >( 10 + rand() % 12 ); uint32_t variation = static_cast< uint32_t >( 0 + rand() % 4 ); - auto ipcEffect = makeZonePacket< Server::FFXIVIpcEffect >( getId() ); - ipcEffect->data().animationTargetId = pTarget->getId(); - ipcEffect->data().actionAnimationId = 0x366; - ipcEffect->data().actionId = 0x366; - ipcEffect->data().numEffects = 1; - ipcEffect->data().rotation = Math::Util::floatToUInt16Rot( getRot() ); - ipcEffect->data().effectTargetId = pTarget->getId(); - ipcEffect->data().effects[0].value = damage; - ipcEffect->data().effects[0].effectType = ActionEffectType::Damage; - ipcEffect->data().effects[0].hitSeverity = static_cast< ActionHitSeverityType >( variation ); + auto effectPacket = boost::make_shared< Server::EffectPacket >( getId(), pTarget->getId(), 0x336 ); + effectPacket->setRotation( Math::Util::floatToUInt16Rot( getRot() ) ); - sendToInRangeSet( ipcEffect ); + Server::EffectEntry effectEntry{ }; + effectEntry.value = damage; + effectEntry.effectType = ActionEffectType::Damage; + effectEntry.hitSeverity = static_cast< ActionHitSeverityType >( variation ); + + effectPacket->addEffect( effectEntry ); + + sendToInRangeSet( effectPacket ); if( isPlayer() ) - getAsPlayer()->queuePacket( ipcEffect ); + getAsPlayer()->queuePacket( effectPacket ); pTarget->takeDamage( damage ); } @@ -440,16 +440,8 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u // Todo: Effect packet generator. 90% of this is basically setting params and it's basically unreadable. // Prepare packet. This is seemingly common for all packets in the action handler. - - auto effectPacket = makeZonePacket< Server::FFXIVIpcEffect >( getId() ); - effectPacket->data().animationTargetId = target.getId(); - effectPacket->data().actionAnimationId = actionId; - //effectPacket->data().unknown_62 = 1; // Affects displaying action name next to number in floating text - //effectPacket->data().globalEffectCounter = 1; // This seems to have an effect on the "double-cast finish" animation - effectPacket->data().actionId = actionId; - effectPacket->data().numEffects = 1; - effectPacket->data().rotation = Math::Util::floatToUInt16Rot( getRot() ); - effectPacket->data().effectTargetId = target.getId(); + auto effectPacket = boost::make_shared< Server::EffectPacket >( getId(), target.getId(), actionId ); + effectPacket->setRotation( Math::Util::floatToUInt16Rot( getRot() ) ); // Todo: for each actor, calculate how much damage the calculated value should deal to them - 2-step damage calc. we only have 1-step switch( type ) @@ -457,10 +449,12 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u case ActionEffectType::Damage: { - effectPacket->data().effects[0].value = static_cast< uint16_t >( param1 ); - effectPacket->data().effects[0].effectType = ActionEffectType::Damage; - effectPacket->data().effects[0].hitSeverity = ActionHitSeverityType::NormalDamage; - //effectPacket->data().effects[0].unknown_3 = 7; + Server::EffectEntry effectEntry{}; + effectEntry.value = static_cast< uint16_t >( param1 ); + effectEntry.effectType = ActionEffectType::Damage; + effectEntry.hitSeverity = ActionHitSeverityType::NormalDamage; + + effectPacket->addEffect( effectEntry ); if( actionInfoPtr->castType == 1 && actionInfoPtr->effectRange != 0 || actionInfoPtr->castType != 1 ) { @@ -484,8 +478,7 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u for( const auto& pHitActor : actorsCollided ) { - effectPacket->data().animationTargetId = pHitActor->getId(); - effectPacket->data().effectTargetId = pHitActor->getId(); + effectPacket->setTargetActor( pHitActor->getId() ); // todo: send to range of what? ourselves? when mob script hits this is going to be lacking sendToInRangeSet( effectPacket, true ); @@ -515,9 +508,12 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u { uint32_t calculatedHeal = Math::CalcBattle::calculateHealValue( getAsPlayer(), static_cast< uint32_t >( param1 ) ); - effectPacket->data().effects[0].value = calculatedHeal; - effectPacket->data().effects[0].effectType = ActionEffectType::Heal; - effectPacket->data().effects[0].hitSeverity = ActionHitSeverityType::NormalHeal; + Server::EffectEntry effectEntry{}; + effectEntry.value = calculatedHeal; + effectEntry.effectType = ActionEffectType::Heal; + effectEntry.hitSeverity = ActionHitSeverityType::NormalHeal; + + effectPacket->addEffect( effectEntry ); if( actionInfoPtr->castType == 1 && actionInfoPtr->effectRange != 0 || actionInfoPtr->castType != 1 ) { @@ -537,8 +533,7 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u for( auto pHitActor : actorsCollided ) { - effectPacket->data().animationTargetId = target.getId(); - effectPacket->data().effectTargetId = pHitActor->getId(); + effectPacket->setTargetActor( pHitActor->getId() ); sendToInRangeSet( effectPacket, true ); pHitActor->getAsChara()->heal( calculatedHeal ); diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 80356f77..0d1dccb3 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include "Session.h" #include "Player.h" @@ -1418,46 +1419,35 @@ void Core::Entity::Player::autoAttack( CharaPtr pTarget ) if( getClass() == ClassJob::Machinist || getClass() == ClassJob::Bard || getClass() == ClassJob::Archer ) { - auto effectPacket = makeZonePacket< Server::FFXIVIpcEffect >( getId() ); - effectPacket->data().animationTargetId = pTarget->getId(); - effectPacket->data().actionAnimationId = 8; - // effectPacket.data().unknown_2 = variation; - effectPacket->data().numEffects = 1; - //effectPacket->data().unknown_61 = 1; - //effectPacket->data().unknown_62 = 1; - effectPacket->data().actionId = 8; - effectPacket->data().rotation = Math::Util::floatToUInt16Rot( getRot() ); - effectPacket->data().effectTargetId = pTarget->getId(); - //effectPacket->data().effectTarget = pTarget->getId(); - effectPacket->data().effects[0].value = damage; - effectPacket->data().effects[0].effectType = Common::ActionEffectType::Damage; - effectPacket->data().effects[0].hitSeverity = Common::ActionHitSeverityType::NormalDamage; - //effectPacket->data().effects[0].unknown_3 = 7; + auto effectPacket = boost::make_shared< Server::EffectPacket >( getId(), pTarget->getId(), 8 ); + effectPacket->setRotation( Math::Util::floatToUInt16Rot( getRot() ) ); - sendToInRangeSet(effectPacket, true); + Server::EffectEntry entry; + entry.value = damage; + entry.effectType = Common::ActionEffectType::Damage; + entry.hitSeverity = Common::ActionHitSeverityType::NormalDamage; + + effectPacket->addEffect( entry ); + + sendToInRangeSet( effectPacket, true ); } else { + auto effectPacket = boost::make_shared< Server::EffectPacket >( getId(), pTarget->getId(), 7 ); + effectPacket->setRotation( Math::Util::floatToUInt16Rot( getRot() ) ); - auto effectPacket = makeZonePacket< Server::FFXIVIpcEffect >( getId() ); - effectPacket->data().animationTargetId = pTarget->getId(); - effectPacket->data().actionAnimationId = 7; - // effectPacket.data().unknown_2 = variation; - effectPacket->data().numEffects = 1; - //effectPacket->data().unknown_61 = 1; - //effectPacket->data().unknown_62 = 1; - effectPacket->data().actionId = 7; - effectPacket->data().rotation = Math::Util::floatToUInt16Rot( getRot() ); - effectPacket->data().effectTargetId = pTarget->getId(); - effectPacket->data().effects[0].value = damage; - effectPacket->data().effects[0].effectType = Common::ActionEffectType::Damage; - effectPacket->data().effects[0].hitSeverity = Common::ActionHitSeverityType::NormalDamage; - //effectPacket->data().effects[0].unknown_3 = 71; + Server::EffectEntry entry; + entry.value = damage; + entry.effectType = Common::ActionEffectType::Damage; + entry.hitSeverity = Common::ActionHitSeverityType::NormalDamage; + + effectPacket->addEffect( entry ); + + sendToInRangeSet( effectPacket, true ); - sendToInRangeSet(effectPacket, true); } - pTarget->takeDamage(damage); + pTarget->takeDamage( damage ); } diff --git a/src/servers/sapphire_zone/Network/PacketWrappers/EffectPacket.h b/src/servers/sapphire_zone/Network/PacketWrappers/EffectPacket.h new file mode 100644 index 00000000..afafdffc --- /dev/null +++ b/src/servers/sapphire_zone/Network/PacketWrappers/EffectPacket.h @@ -0,0 +1,65 @@ +#ifndef SAPPHIRE_EFFECTPACKET_H +#define SAPPHIRE_EFFECTPACKET_H + +#include +#include +#include "Forwards.h" + +namespace Core { +namespace Network { +namespace Packets { +namespace Server { + +class EffectPacket : + public ZoneChannelPacket< FFXIVIpcEffect > +{ +public: + EffectPacket( uint64_t sourceId, uint32_t targetId, uint32_t actionId ) : + ZoneChannelPacket< FFXIVIpcEffect >( sourceId, targetId ) + { + m_data.actionId = actionId; + m_data.actionAnimationId = static_cast< uint16_t >( actionId ); + + m_data.animationTargetId = targetId; + m_data.effectTargetId = targetId; + + m_data.effectDisplayType = Common::ActionEffectDisplayType::ShowActionName; + } + + void addEffect( const Server::EffectEntry& effect ) + { + assert( m_data.effectCount <= 8 ); + + std::memcpy( &m_data.effects[m_data.effectCount++], &effect, sizeof( Server::EffectEntry ) ); + } + + void setAnimationId( const uint16_t animationId ) + { + m_data.actionAnimationId = animationId; + } + + void setEffectFlags( const uint32_t effectFlags ) + { + m_data.effectFlags = effectFlags; + } + + void setRotation( const uint16_t rotation ) + { + m_data.rotation = rotation; + } + + void setTargetActor( const uint32_t targetId ) + { + m_data.animationTargetId = targetId; + m_data.effectTargetId = targetId; + + FFXIVPacketBase::setTargetActor( targetId ); + } +}; + +} +} +} +} + +#endif //SAPPHIRE_EFFECTPACKET_H From 2665e55a17bf33a6d73fd8c2f9592dc198204864 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sat, 21 Jul 2018 23:48:14 +1000 Subject: [PATCH 005/117] aoeeffect8/16/24/32 packet defs/opcodes --- src/common/Network/PacketDef/Ipcs.h | 4 ++ .../Network/PacketDef/Zone/ServerZoneDef.h | 40 +++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index d8010c37..4de2bb9d 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -97,6 +97,10 @@ namespace Packets { StatusEffectList = 0x014E, // updated 4.3 Effect = 0x0151, // updated 4.3 + AoeEffect8 = 0x0154, // updated 4.3 + AoeEffect16 = 0x0155, // updated 4.3 + AoeEffect24 = 0x0156, // updated 4.3 + AoeEffect32 = 0x0157, // updated 4.3 PersistantEffect = 0x0158, // updated 4.3 GCAffiliation = 0xCCFC, // OUTDATED diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 3787e1c2..e1f875c9 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -344,6 +344,46 @@ struct FFXIVIpcEffect : FFXIVIpcBasePacket uint32_t padding_78; }; +template< int size > +struct FFXIVIpcAoeEffect +{ + uint64_t animationTargetId; + uint32_t actionId; + + uint32_t globalEffectCounter; + float animationLockTime; + + uint32_t someTargetId; + + uint16_t hiddenAnimation; + + uint16_t rotation; + + uint16_t actionAnimationId; + uint8_t unknown1E; + + Common::ActionEffectDisplayType effectDisplayType; + + uint8_t unknown20; + uint8_t effectCount; + + uint32_t padding_22[2]; + + EffectEntry effects[size]; + + uint16_t padding_6A[3]; + + uint32_t effectTargetId[size]; + uint32_t effectFlags; + + uint32_t padding_78; +}; + +struct FFXIVIpcAoeEffect8 : FFXIVIpcBasePacket< AoeEffect8 >, FFXIVIpcAoeEffect< 8 > {}; +struct FFXIVIpcAoeEffect16 : FFXIVIpcBasePacket< AoeEffect16 >, FFXIVIpcAoeEffect< 16 > {}; +struct FFXIVIpcAoeEffect24 : FFXIVIpcBasePacket< AoeEffect24 >, FFXIVIpcAoeEffect< 24 > {}; +struct FFXIVIpcAoeEffect32 : FFXIVIpcBasePacket< AoeEffect32 >, FFXIVIpcAoeEffect< 32 > {}; + /** * Structural representation of the packet sent by the server From 68b08de1ded9e197d6418a4e47e92de435d6e20b Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sun, 22 Jul 2018 16:54:01 +1000 Subject: [PATCH 006/117] housing placard script, gridania mb script, opcodes --- src/common/Network/PacketDef/Ipcs.h | 3 +++ .../Scripts/common/CmnDefHousingSignboard.cpp | 19 +++++++++++++++++++ .../common/CmnDefMarketBoardGridania.cpp | 19 +++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 src/servers/Scripts/common/CmnDefHousingSignboard.cpp create mode 100644 src/servers/Scripts/common/CmnDefMarketBoardGridania.cpp diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 4de2bb9d..1acc4dbd 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -228,8 +228,11 @@ namespace Packets { LinkshellListHandler = 0x00F4, // updated 4.3 + SearchMarketboard = 0x0103, // updated 4.3 + FcInfoReqHandler = 0x011A, // updated 4.2 + ReqMarketWishList = 0x012C, // updated 4.3 ReqJoinNoviceNetwork = 0x0129, // updated 4.2 diff --git a/src/servers/Scripts/common/CmnDefHousingSignboard.cpp b/src/servers/Scripts/common/CmnDefHousingSignboard.cpp new file mode 100644 index 00000000..bb922cbd --- /dev/null +++ b/src/servers/Scripts/common/CmnDefHousingSignboard.cpp @@ -0,0 +1,19 @@ +#include +#include + +class CmnDefHousingSignboard : public EventScript +{ +public: + CmnDefHousingSignboard() : EventScript( 721031 ) + {} + + void Scene00000( Entity::Player& player ) + { + player.playScene( getId(), 0, 0x2000, 0, 1 ); + } + + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + Scene00000( player ); + } +}; \ No newline at end of file diff --git a/src/servers/Scripts/common/CmnDefMarketBoardGridania.cpp b/src/servers/Scripts/common/CmnDefMarketBoardGridania.cpp new file mode 100644 index 00000000..3f0eec55 --- /dev/null +++ b/src/servers/Scripts/common/CmnDefMarketBoardGridania.cpp @@ -0,0 +1,19 @@ +#include +#include + +class CmnDefMarketBoardGridania : public EventScript +{ +public: + CmnDefMarketBoardGridania() : EventScript( 0xB0027 ) + {} + + void Scene00000( Entity::Player& player ) + { + player.playScene( getId(), 0, 0x2000, 0, 1 ); + } + + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + Scene00000( player ); + } +}; \ No newline at end of file From 893ebd3454d4182347462f8724d724363ed5787b Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sun, 22 Jul 2018 16:54:23 +1000 Subject: [PATCH 007/117] move common effect struct members into a shared struct for single target/aoe --- .../Network/PacketDef/Zone/ServerZoneDef.h | 30 +++++-------------- .../Network/PacketWrappers/EffectPacket.h | 18 +++++------ 2 files changed, 17 insertions(+), 31 deletions(-) diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index e1f875c9..98eeda5c 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -310,7 +310,7 @@ struct EffectEntry int16_t value; }; -struct FFXIVIpcEffect : FFXIVIpcBasePacket +struct EffectHeader { uint64_t animationTargetId; // who the animation targets uint32_t actionId; // what the casting player casts, shown in battle log/ui @@ -333,6 +333,11 @@ struct FFXIVIpcEffect : FFXIVIpcBasePacket uint8_t effectCount; // ignores effects if 0, otherwise parses all of them uint32_t padding_22[2]; +}; + +struct FFXIVIpcEffect : FFXIVIpcBasePacket +{ + EffectHeader header; EffectEntry effects[8]; @@ -347,33 +352,14 @@ struct FFXIVIpcEffect : FFXIVIpcBasePacket template< int size > struct FFXIVIpcAoeEffect { - uint64_t animationTargetId; - uint32_t actionId; - - uint32_t globalEffectCounter; - float animationLockTime; - - uint32_t someTargetId; - - uint16_t hiddenAnimation; - - uint16_t rotation; - - uint16_t actionAnimationId; - uint8_t unknown1E; - - Common::ActionEffectDisplayType effectDisplayType; - - uint8_t unknown20; - uint8_t effectCount; - - uint32_t padding_22[2]; + EffectHeader header; EffectEntry effects[size]; uint16_t padding_6A[3]; uint32_t effectTargetId[size]; + Common::FFXIVARR_POSITION3 position; uint32_t effectFlags; uint32_t padding_78; diff --git a/src/servers/sapphire_zone/Network/PacketWrappers/EffectPacket.h b/src/servers/sapphire_zone/Network/PacketWrappers/EffectPacket.h index afafdffc..548aa83c 100644 --- a/src/servers/sapphire_zone/Network/PacketWrappers/EffectPacket.h +++ b/src/servers/sapphire_zone/Network/PacketWrappers/EffectPacket.h @@ -17,25 +17,25 @@ public: EffectPacket( uint64_t sourceId, uint32_t targetId, uint32_t actionId ) : ZoneChannelPacket< FFXIVIpcEffect >( sourceId, targetId ) { - m_data.actionId = actionId; - m_data.actionAnimationId = static_cast< uint16_t >( actionId ); + m_data.header.actionId = actionId; + m_data.header.actionAnimationId = static_cast< uint16_t >( actionId ); - m_data.animationTargetId = targetId; + m_data.header.animationTargetId = targetId; m_data.effectTargetId = targetId; - m_data.effectDisplayType = Common::ActionEffectDisplayType::ShowActionName; + m_data.header.effectDisplayType = Common::ActionEffectDisplayType::ShowActionName; } void addEffect( const Server::EffectEntry& effect ) { - assert( m_data.effectCount <= 8 ); + assert( m_data.header.effectCount <= 8 ); - std::memcpy( &m_data.effects[m_data.effectCount++], &effect, sizeof( Server::EffectEntry ) ); + std::memcpy( &m_data.effects[m_data.header.effectCount++], &effect, sizeof( Server::EffectEntry ) ); } void setAnimationId( const uint16_t animationId ) { - m_data.actionAnimationId = animationId; + m_data.header.actionAnimationId = animationId; } void setEffectFlags( const uint32_t effectFlags ) @@ -45,12 +45,12 @@ public: void setRotation( const uint16_t rotation ) { - m_data.rotation = rotation; + m_data.header.rotation = rotation; } void setTargetActor( const uint32_t targetId ) { - m_data.animationTargetId = targetId; + m_data.header.animationTargetId = targetId; m_data.effectTargetId = targetId; FFXIVPacketBase::setTargetActor( targetId ); From 394988fbb0b7648575b93fdbfcbe7cdd97ce2a1b Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sun, 22 Jul 2018 17:02:09 +1000 Subject: [PATCH 008/117] scripts cleanup, npc repair script and hunt board --- .../Scripts/common/CmnDefCutSceneReplay.cpp | 2 +- .../Scripts/common/CmnDefHousingSignboard.cpp | 2 +- src/servers/Scripts/common/CmnDefInnBed.cpp | 2 +- .../common/CmnDefMarketBoardGridania.cpp | 2 +- .../Scripts/common/CmnDefNpcRepair.cpp | 19 +++++++++++++++++++ .../Scripts/common/ComDefMobHuntBoard.cpp | 19 +++++++++++++++++++ .../Scripts/common/HouFurOrchestrion.cpp | 2 +- 7 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 src/servers/Scripts/common/CmnDefNpcRepair.cpp create mode 100644 src/servers/Scripts/common/ComDefMobHuntBoard.cpp diff --git a/src/servers/Scripts/common/CmnDefCutSceneReplay.cpp b/src/servers/Scripts/common/CmnDefCutSceneReplay.cpp index fdd742e1..137c5a02 100644 --- a/src/servers/Scripts/common/CmnDefCutSceneReplay.cpp +++ b/src/servers/Scripts/common/CmnDefCutSceneReplay.cpp @@ -17,7 +17,7 @@ public: } }; - player.playScene( getId(), 0, 0x2000, 0, 1, callback ); + player.playScene( getId(), 0, HIDE_HOTBAR, 0, 1, callback ); } void Scene00001( Entity::Player& player, uint16_t returnScene ) diff --git a/src/servers/Scripts/common/CmnDefHousingSignboard.cpp b/src/servers/Scripts/common/CmnDefHousingSignboard.cpp index bb922cbd..cced1ec6 100644 --- a/src/servers/Scripts/common/CmnDefHousingSignboard.cpp +++ b/src/servers/Scripts/common/CmnDefHousingSignboard.cpp @@ -9,7 +9,7 @@ public: void Scene00000( Entity::Player& player ) { - player.playScene( getId(), 0, 0x2000, 0, 1 ); + player.playScene( getId(), 0, HIDE_HOTBAR, 0, 1 ); } void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override diff --git a/src/servers/Scripts/common/CmnDefInnBed.cpp b/src/servers/Scripts/common/CmnDefInnBed.cpp index 2b524502..8c09c3c3 100644 --- a/src/servers/Scripts/common/CmnDefInnBed.cpp +++ b/src/servers/Scripts/common/CmnDefInnBed.cpp @@ -16,7 +16,7 @@ public: Scene00001( player, result.param2 ); }; - player.playScene( getId(), 0, 0x2000, 0, 1, callback ); + player.playScene( getId(), 0, HIDE_HOTBAR, 0, 1, callback ); } // lay down diff --git a/src/servers/Scripts/common/CmnDefMarketBoardGridania.cpp b/src/servers/Scripts/common/CmnDefMarketBoardGridania.cpp index 3f0eec55..292bdaa9 100644 --- a/src/servers/Scripts/common/CmnDefMarketBoardGridania.cpp +++ b/src/servers/Scripts/common/CmnDefMarketBoardGridania.cpp @@ -9,7 +9,7 @@ public: void Scene00000( Entity::Player& player ) { - player.playScene( getId(), 0, 0x2000, 0, 1 ); + player.playScene( getId(), 0, HIDE_HOTBAR, 0, 1 ); } void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override diff --git a/src/servers/Scripts/common/CmnDefNpcRepair.cpp b/src/servers/Scripts/common/CmnDefNpcRepair.cpp new file mode 100644 index 00000000..18be6f72 --- /dev/null +++ b/src/servers/Scripts/common/CmnDefNpcRepair.cpp @@ -0,0 +1,19 @@ +#include +#include + +class CmnDefNpcRepair : public EventScript +{ +public: + CmnDefNpcRepair() : EventScript( 0xB0013 ) + {} + + void Scene00000( Entity::Player& player ) + { + player.playScene( getId(), 0, HIDE_HOTBAR, 0, 1 ); + } + + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + Scene00000( player ); + } +}; \ No newline at end of file diff --git a/src/servers/Scripts/common/ComDefMobHuntBoard.cpp b/src/servers/Scripts/common/ComDefMobHuntBoard.cpp new file mode 100644 index 00000000..1c0281a5 --- /dev/null +++ b/src/servers/Scripts/common/ComDefMobHuntBoard.cpp @@ -0,0 +1,19 @@ +#include +#include + +class ComDefMobHuntBoard : public EventScript +{ +public: + ComDefMobHuntBoard() : EventScript( 0xB00CA ) + {} + + void Scene00000( Entity::Player& player ) + { + player.playScene( getId(), 0, HIDE_HOTBAR, 0, 1 ); + } + + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + Scene00000( player ); + } +}; \ No newline at end of file diff --git a/src/servers/Scripts/common/HouFurOrchestrion.cpp b/src/servers/Scripts/common/HouFurOrchestrion.cpp index 7ceeea71..514f86a9 100644 --- a/src/servers/Scripts/common/HouFurOrchestrion.cpp +++ b/src/servers/Scripts/common/HouFurOrchestrion.cpp @@ -9,7 +9,7 @@ public: void Scene00000( Entity::Player& player ) { - player.playScene( getId(), 0, 0x2000, 0, 1 ); + player.playScene( getId(), 0, HIDE_HOTBAR, 0, 1 ); } void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override From d68fa6d19256ab46c670b649500074f5b9d98370 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sun, 22 Jul 2018 19:10:52 +1000 Subject: [PATCH 009/117] remove const constraint --- .../sapphire_zone/Network/PacketWrappers/EffectPacket.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/servers/sapphire_zone/Network/PacketWrappers/EffectPacket.h b/src/servers/sapphire_zone/Network/PacketWrappers/EffectPacket.h index 548aa83c..8e45fc23 100644 --- a/src/servers/sapphire_zone/Network/PacketWrappers/EffectPacket.h +++ b/src/servers/sapphire_zone/Network/PacketWrappers/EffectPacket.h @@ -33,17 +33,17 @@ public: std::memcpy( &m_data.effects[m_data.header.effectCount++], &effect, sizeof( Server::EffectEntry ) ); } - void setAnimationId( const uint16_t animationId ) + void setAnimationId( uint16_t animationId ) { m_data.header.actionAnimationId = animationId; } - void setEffectFlags( const uint32_t effectFlags ) + void setEffectFlags( uint32_t effectFlags ) { m_data.effectFlags = effectFlags; } - void setRotation( const uint16_t rotation ) + void setRotation( uint16_t rotation ) { m_data.header.rotation = rotation; } From bf726c2a48cc816cb4a969b050e6f7d1c20497a2 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sun, 22 Jul 2018 22:05:09 +1000 Subject: [PATCH 010/117] consistent indentation --- src/common/Network/PacketDef/Ipcs.h | 317 ++++++++++++++-------------- 1 file changed, 159 insertions(+), 158 deletions(-) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 1acc4dbd..662c2fba 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -14,13 +14,13 @@ namespace Packets { */ enum ServerLobbyIpcType : uint16_t { - LobbyError = 0x0002, - LobbyServiceAccountList = 0x000C, - LobbyCharList = 0x000D, - LobbyCharCreate = 0x000E, - LobbyEnterWorld = 0x000F, - LobbyServerList = 0x0015, - LobbyRetainerList = 0x0017, + LobbyError = 0x0002, + LobbyServiceAccountList = 0x000C, + LobbyCharList = 0x000D, + LobbyCharCreate = 0x000E, + LobbyEnterWorld = 0x000F, + LobbyServerList = 0x0015, + LobbyRetainerList = 0x0017, }; @@ -29,12 +29,12 @@ namespace Packets { */ enum ClientLobbyIpcType : uint16_t { - ReqCharList = 0x0003, - ReqEnterWorld = 0x0004, - ReqServiceAccountList = 0x0005, + ReqCharList = 0x0003, + ReqEnterWorld = 0x0004, + ReqServiceAccountList = 0x0005, - ReqCharDelete = 0x000A, - ReqCharCreate = 0x000B, + ReqCharDelete = 0x000A, + ReqCharCreate = 0x000B, }; //////////////////////////////////////////////////////////////////////////////// @@ -46,149 +46,150 @@ namespace Packets { { // static opcode ( the ones that rarely, if ever, change ) - Ping = 0x0065, - Init = 0x0066, + Ping = 0x0065, + Init = 0x0066, - ActorFreeSpawn = 0x0191, - InitZone = 0x019A, + ActorFreeSpawn = 0x0191, + InitZone = 0x019A, - AddStatusEffect = 0x0141, - ActorControl142 = 0x0142, - ActorControl143 = 0x0143, - ActorControl144 = 0x0144, - UpdateHpMpTp = 0x0145, + AddStatusEffect = 0x0141, + ActorControl142 = 0x0142, + ActorControl143 = 0x0143, + ActorControl144 = 0x0144, + UpdateHpMpTp = 0x0145, /////////////////////////////////////////////////// - ChatBanned = 0x006B, - Logout = 0x0077, // updated 4.3 - CFNotify = 0x0078, - CFMemberStatus = 0x0079, - CFDutyInfo = 0x007A, - CFPlayerInNeed = 0x007F, + ChatBanned = 0x006B, + Logout = 0x0077, // updated 4.3 + CFNotify = 0x0078, + CFMemberStatus = 0x0079, + CFDutyInfo = 0x007A, + CFPlayerInNeed = 0x007F, - SocialRequestError = 0x00AD, + SocialRequestError = 0x00AD, - CFRegistered = 0x00B8, // updated 4.1 - SocialRequestResponse = 0x00BB, // updated 4.1 - CancelAllianceForming = 0x00C6, // updated 4.2 + CFRegistered = 0x00B8, // updated 4.1 + SocialRequestResponse = 0x00BB, // updated 4.1 + CancelAllianceForming = 0x00C6, // updated 4.2 - Playtime = 0x00F5, // updated 4.3 - Chat = 0x00F7, // updated 4.3 - SocialList = 0x00FD, // updated 4.3 + Playtime = 0x00F5, // updated 4.3 + Chat = 0x00F7, // updated 4.3 + SocialList = 0x00FD, // updated 4.3 - UpdateSearchInfo = 0x0100, // updated 4.3 - InitSearchInfo = 0x0101, // updated 4.3 + UpdateSearchInfo = 0x0100, // updated 4.3 + InitSearchInfo = 0x0101, // updated 4.3 - ServerNotice = 0x0106, // updated 4.3 - SetOnlineStatus = 0x0107, // updated 4.3 + ServerNotice = 0x0106, // updated 4.3 + SetOnlineStatus = 0x0107, // updated 4.3 - CountdownInitiate = 0x0111, // updated 4.3 - CountdownCancel = 0x0112, // updated 4.3 + CountdownInitiate = 0x0111, // updated 4.3 + CountdownCancel = 0x0112, // updated 4.3 - BlackList = 0x0115, // updated 4.3 + BlackList = 0x0115, // updated 4.3 - LogMessage = 0x00D0, + LogMessage = 0x00D0, - LinkshellList = 0x011C, // updated 4.3 - CharaFreeCompanyTag = 0x013B, // updated 4.3 - FreeCompanyBoardMsg = 0x013C, // updated 4.3 - FreeCompanyInfo = 0x013D, // updated 4.3 + LinkshellList = 0x011C, // updated 4.3 + CharaFreeCompanyTag = 0x013B, // updated 4.3 + FreeCompanyBoardMsg = 0x013C, // updated 4.3 + FreeCompanyInfo = 0x013D, // updated 4.3 - StatusEffectList = 0x014E, // updated 4.3 - Effect = 0x0151, // updated 4.3 - AoeEffect8 = 0x0154, // updated 4.3 - AoeEffect16 = 0x0155, // updated 4.3 - AoeEffect24 = 0x0156, // updated 4.3 - AoeEffect32 = 0x0157, // updated 4.3 - PersistantEffect = 0x0158, // updated 4.3 + StatusEffectList = 0x014E, // updated 4.3 + Effect = 0x0151, // updated 4.3 + AoeEffect8 = 0x0154, // updated 4.3 + AoeEffect16 = 0x0155, // updated 4.3 + AoeEffect24 = 0x0156, // updated 4.3 + AoeEffect32 = 0x0157, // updated 4.3 + PersistantEffect = 0x0158, // updated 4.3 - GCAffiliation = 0xCCFC, // OUTDATED + GCAffiliation = 0xCCFC, // OUTDATED - PlayerSpawn = 0x0172, // updated 4.3 - NpcSpawn = 0x0173, // updated 4.3 - ActorMove = 0x0174, // updated 4.3 - ActorSetPos = 0x0176, // updated 4.3 + PlayerSpawn = 0x0172, // updated 4.3 + NpcSpawn = 0x0173, // updated 4.3 + ActorMove = 0x0174, // updated 4.3 + ActorSetPos = 0x0176, // updated 4.3 - ActorCast = 0x0178, // updated 4.3 + ActorCast = 0x0178, // updated 4.3 - PartyList = 0x017A, // updated 4.3 - HateList = 0x017B, // updated 4.3 + PartyList = 0x017A, // updated 4.3 + HateList = 0x017B, // updated 4.3 - ObjectSpawn = 0x017D, // updated 4.3 - ObjectDespawn = 0x017E, // updated 4.3 + ObjectSpawn = 0x017D, // updated 4.3 + ObjectDespawn = 0x017E, // updated 4.3 - SetLevelSync = 0x017F, // updated 4.3 - SilentSetClassJob = 0x0180, // updated 4.3 - seems to be the case, not sure if it's actually used for anything + SetLevelSync = 0x017F, // updated 4.3 + SilentSetClassJob = 0x0180, // updated 4.3 - seems to be the case, not sure if it's actually used for anything - InitUI = 0x0181, // updated 4.3 - PlayerStats = 0x0182, // updated 4.3 - ActorOwner = 0x0183, // updated 4.3 ? - PlayerStateFlags = 0x0184, // updated 4.3 - PlayerClassInfo = 0x0185, // updated 4.3 - ModelEquip = 0x0186, // updated 4.3 + InitUI = 0x0181, // updated 4.3 + PlayerStats = 0x0182, // updated 4.3 + ActorOwner = 0x0183, // updated 4.3 ? + PlayerStateFlags = 0x0184, // updated 4.3 + PlayerClassInfo = 0x0185, // updated 4.3 + ModelEquip = 0x0186, // updated 4.3 - UpdateClassInfo = 0x018A, // updated 4.3 + UpdateClassInfo = 0x018A, // updated 4.3 - ItemInfo = 0x0190, // updated 4.3 - ContainerInfo = 0x0192, // updated 4.3 - InventoryTransactionFinish = 0x0193, // updated 4.3 - InventoryTransaction = 0x0194, // updated 4.3 - InventoryActionAck = 0x0197, // updated 4.3 - CurrencyCrystalInfo = 0xFFFF, // updated 4.3 - wrong opcode + ItemInfo = 0x0190, // updated 4.3 + ContainerInfo = 0x0192, // updated 4.3 + InventoryTransactionFinish = 0x0193, // updated 4.3 + InventoryTransaction = 0x0194, // updated 4.3 + InventoryActionAck = 0x0197, // updated 4.3 + CurrencyCrystalInfo = 0xFFFF, // updated 4.3 - wrong opcode - UpdateInventorySlot = 0x0198, // updated 4.3 + UpdateInventorySlot = 0x0198, // updated 4.3 - EventPlay = 0x01A6, // updated 4.3 - DirectorPlayScene = 0x01AA, // updated 4.3 + EventPlay = 0x01A6, // updated 4.3 + EventOpenGilShop = 0x01AD, // updated 4.3 + DirectorPlayScene = 0x01AA, // updated 4.3 - EventStart = 0x01AF, // updated 4.3 - EventFinish = 0x01B0, // updated 4.3 + EventStart = 0x01AF, // updated 4.3 + EventFinish = 0x01B0, // updated 4.3 - EventLinkshell = 0x1169, + EventLinkshell = 0x1169, - QuestActiveList = 0x01C3, // updated 4.3 - QuestUpdate = 0x01C4, // updated 4.3 - QuestCompleteList = 0x01C5, // updated 4.3 + QuestActiveList = 0x01C3, // updated 4.3 + QuestUpdate = 0x01C4, // updated 4.3 + QuestCompleteList = 0x01C5, // updated 4.3 - QuestFinish = 0x01C6, // updated 4.3 - MSQTrackerComplete = 0x01C7, // updated 4.3 - MSQTrackerProgress = 0x01C8, // updated 4.3 + QuestFinish = 0x01C6, // updated 4.3 + MSQTrackerComplete = 0x01C7, // updated 4.3 + MSQTrackerProgress = 0x01C8, // updated 4.3 - QuestMessage = 0x01CE, // updated 4.3 + QuestMessage = 0x01CE, // updated 4.3 - QuestTracker = 0x01D3, // updated 4.3 + QuestTracker = 0x01D3, // updated 4.3 - Mount = 0x01E3, // updated 4.3 + Mount = 0x01E3, // updated 4.3 - DirectorVars = 0x01E5, // updated 4.3 + DirectorVars = 0x01E5, // updated 4.3 - CFAvailableContents = 0x01FD, // updated 4.2 + CFAvailableContents = 0x01FD, // updated 4.2 - WeatherChange = 0x0200, // updated 4.3 - PlayerTitleList = 0x0201, // updated 4.3 - Discovery = 0x0202, // updated 4.3 + WeatherChange = 0x0200, // updated 4.3 + PlayerTitleList = 0x0201, // updated 4.3 + Discovery = 0x0202, // updated 4.3 - EorzeaTimeOffset = 0x0204, // updated 4.3 + EorzeaTimeOffset = 0x0204, // updated 4.3 - EquipDisplayFlags = 0x0210, // updated 4.3 + EquipDisplayFlags = 0x0210, // updated 4.3 - WardInfo = 0x0224, // updated 4.3 - WardHousingPermission = 0x022D, // updated 4.3 - WardYardInfo = 0x022F, // updated 4.3 + WardInfo = 0x0224, // updated 4.3 + WardHousingPermission = 0x022D, // updated 4.3 + WardYardInfo = 0x022F, // updated 4.3 - DuelChallenge = 0x0277, // 4.2; this is responsible for opening the ui - PerformNote = 0x0286, // updated 4.3 + DuelChallenge = 0x0277, // 4.2; this is responsible for opening the ui + PerformNote = 0x0286, // updated 4.3 - PrepareZoning = 0x0291, // updated 4.3 - ActorGauge = 0x0292, // updated 4.3 + PrepareZoning = 0x0291, // updated 4.3 + ActorGauge = 0x0292, // updated 4.3 // Unknown IPC types that still need to be sent // TODO: figure all these out properly - IPCTYPE_UNK_320 = 0x024C, // updated 4.3 - IPCTYPE_UNK_322 = 0x024E, // updated 4.3 + IPCTYPE_UNK_320 = 0x024C, // updated 4.3 + IPCTYPE_UNK_322 = 0x024E, // updated 4.3 }; @@ -198,78 +199,78 @@ namespace Packets { enum ClientZoneIpcType : uint16_t { - PingHandler = 0x0065, // unchanged 4.3 - InitHandler = 0x0066, // unchanged 4.3 + PingHandler = 0x0065, // unchanged 4.3 + InitHandler = 0x0066, // unchanged 4.3 - FinishLoadingHandler = 0x0069, // unchanged 4.3 + FinishLoadingHandler = 0x0069, // unchanged 4.3 - CFCommenceHandler = 0x006F, + CFCommenceHandler = 0x006F, - CFRegisterDuty = 0x0071, - CFRegisterRoulette = 0x0072, - PlayTimeHandler = 0x0073, // unchanged 4.3 - LogoutHandler = 0x0074, // unchanged 4.3 + CFRegisterDuty = 0x0071, + CFRegisterRoulette = 0x0072, + PlayTimeHandler = 0x0073, // unchanged 4.3 + LogoutHandler = 0x0074, // unchanged 4.3 - CFDutyInfoHandler = 0x0078, // updated 4.2 + CFDutyInfoHandler = 0x0078, // updated 4.2 - SocialReqSendHandler = 0x00AE, // updated 4.1 - CreateCrossWorldLS = 0x00AF, // updated 4.3 + SocialReqSendHandler = 0x00AE, // updated 4.1 + CreateCrossWorldLS = 0x00AF, // updated 4.3 - ChatHandler = 0x00D3, // updated 4.3 + ChatHandler = 0x00D3, // updated 4.3 - SocialListHandler = 0x00DB, // updated 4.3 - ReqSearchInfoHandler = 0x00E0, // updated 4.3 - SetSearchInfoHandler = 0x00DE, // updated 4.3 + SocialListHandler = 0x00DB, // updated 4.3 + ReqSearchInfoHandler = 0x00E0, // updated 4.3 + SetSearchInfoHandler = 0x00DE, // updated 4.3 - BlackListHandler = 0x00EC, // updated 4.3 - PlayerSearchHandler = 0x00E2, // updated 4.2 + BlackListHandler = 0x00EC, // updated 4.3 + PlayerSearchHandler = 0x00E2, // updated 4.2 - LinkshellListHandler = 0x00F4, // updated 4.3 + LinkshellListHandler = 0x00F4, // updated 4.3 - SearchMarketboard = 0x0103, // updated 4.3 + SearchMarketboard = 0x0103, // updated 4.3 - FcInfoReqHandler = 0x011A, // updated 4.2 + FcInfoReqHandler = 0x011A, // updated 4.2 - ReqMarketWishList = 0x012C, // updated 4.3 + ReqMarketWishList = 0x012C, // updated 4.3 - ReqJoinNoviceNetwork = 0x0129, // updated 4.2 + ReqJoinNoviceNetwork = 0x0129, // updated 4.2 - ReqCountdownInitiate = 0x0138, // updated 4.3 - ReqCountdownCancel = 0x0139, // updated 4.3 - ClearWaymarks = 0x013A, // updated 4.3 + ReqCountdownInitiate = 0x0138, // updated 4.3 + ReqCountdownCancel = 0x0139, // updated 4.3 + ClearWaymarks = 0x013A, // updated 4.3 - ZoneLineHandler = 0x013C, // updated 4.3 - ClientTrigger = 0x013D, // updated 4.3 - DiscoveryHandler = 0x013E, // updated 4.3 + ZoneLineHandler = 0x013C, // updated 4.3 + ClientTrigger = 0x013D, // updated 4.3 + DiscoveryHandler = 0x013E, // updated 4.3 - AddWaymark = 0x013F, // updated 4.3 + AddWaymark = 0x013F, // updated 4.3 - SkillHandler = 0x0140, // updated 4.3 - GMCommand1 = 0x0141, // updated 4.3 - GMCommand2 = 0x0142, // updated 4.3 + SkillHandler = 0x0140, // updated 4.3 + GMCommand1 = 0x0141, // updated 4.3 + GMCommand2 = 0x0142, // updated 4.3 - UpdatePositionHandler = 0x0144, // updated 4.3 - UpdatePositionInstance = 0x0183, // updated 4.3 + UpdatePositionHandler = 0x0144, // updated 4.3 + UpdatePositionInstance = 0x0183, // updated 4.3 - InventoryModifyHandler = 0x014B, // updated 4.3 + InventoryModifyHandler = 0x014B, // updated 4.3 - TalkEventHandler = 0x0154, // updated 4.3 - EmoteEventHandler = 0x0155, // updated 4.3 - WithinRangeEventHandler = 0x0156, // updated 4.3 - OutOfRangeEventHandler = 0x0157, // updated 4.3 - EnterTeriEventHandler = 0x0158, // updated 4.3 + TalkEventHandler = 0x0154, // updated 4.3 + EmoteEventHandler = 0x0155, // updated 4.3 + WithinRangeEventHandler = 0x0156, // updated 4.3 + OutOfRangeEventHandler = 0x0157, // updated 4.3 + EnterTeriEventHandler = 0x0158, // updated 4.3 - ReturnEventHandler = 0x015D, // updated 4.3 - TradeReturnEventHandler = 0x015E, // updated 4.3 + ReturnEventHandler = 0x015D, // updated 4.3 + TradeReturnEventHandler = 0x015E, // updated 4.3 - LinkshellEventHandler = 0x0150, // updated 4.1 ?? - LinkshellEventHandler1 = 0x0151, // updated 4.1 ?? + LinkshellEventHandler = 0x0150, // updated 4.1 ?? + LinkshellEventHandler1 = 0x0151, // updated 4.1 ?? - PerformNoteHandler = 0x029B, // updated 4.3 + PerformNoteHandler = 0x029B, // updated 4.3 - ReqEquipDisplayFlagsChange = 0x0178, // updated 4.3 + ReqEquipDisplayFlagsChange = 0x0178, // updated 4.3 }; @@ -281,8 +282,8 @@ namespace Packets { */ enum ServerChatIpcType : uint16_t { - Tell = 0x0064, // updated for sb - TellErrNotFound = 0x0066, + Tell = 0x0064, // updated for sb + TellErrNotFound = 0x0066, }; /** @@ -290,7 +291,7 @@ namespace Packets { */ enum ClientChatIpcType : uint16_t { - TellReq = 0x0064, + TellReq = 0x0064, }; From 18a1ab79d6a2831ddc9314d247b7e7ee260e90f0 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sun, 22 Jul 2018 22:11:03 +1000 Subject: [PATCH 011/117] extremely broken gilshop implementation --- .../Network/PacketDef/Zone/ServerZoneDef.h | 11 ++++++++++ src/servers/Scripts/common/GilShop.cpp | 19 ++++++++++++++++++ src/servers/sapphire_zone/Actor/Player.h | 2 ++ .../sapphire_zone/Actor/PlayerEvent.cpp | 20 +++++++++++++++++++ .../sapphire_zone/Script/ScriptMgr.cpp | 4 ++++ 5 files changed, 56 insertions(+) create mode 100644 src/servers/Scripts/common/GilShop.cpp diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 98eeda5c..6524d7fc 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -1093,6 +1093,17 @@ struct FFXIVIpcEventFinish : FFXIVIpcBasePacket /* 000C */ uint32_t padding1; }; +struct FFXIVIpcEventOpenGilShop : FFXIVIpcBasePacket +{ + uint64_t actorId; + uint32_t eventId; + uint16_t scene; + uint16_t padding; + uint32_t sceneFlags; + + uint32_t unknown_wtf[0x101]; +}; + /** * Structural representation of the packet sent by the server diff --git a/src/servers/Scripts/common/GilShop.cpp b/src/servers/Scripts/common/GilShop.cpp new file mode 100644 index 00000000..c72256fe --- /dev/null +++ b/src/servers/Scripts/common/GilShop.cpp @@ -0,0 +1,19 @@ +#include +#include + +class GilShop : public EventScript +{ +public: + GilShop() : EventScript( 0x00041 ) + {} + + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + auto callback = [actorId]( Entity::Player& player, const Event::SceneResult& result ) + { + player.playGilShop( actorId, result.eventId, HIDE_HOTBAR | NO_DEFAULT_CAMERA ); + }; + + player.playScene( eventId, 0, HIDE_HOTBAR | NO_DEFAULT_CAMERA, 0, 2, callback ); + } +}; \ No newline at end of file diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index 33dc78f5..276610c2 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -58,6 +58,8 @@ public: /*! play a subevent */ void playScene( uint32_t eventId, uint32_t scene, uint32_t flags, uint32_t eventParam2, uint32_t eventParam3 ); + void playGilShop( uint64_t actorId, uint32_t eventId, uint32_t flags ); + void directorPlayScene( uint32_t eventId, uint32_t scene, uint32_t flags, uint32_t eventParam3, uint32_t eventParam4, uint32_t eventParam5 = 0 ); /*! play a subevent */ diff --git a/src/servers/sapphire_zone/Actor/PlayerEvent.cpp b/src/servers/sapphire_zone/Actor/PlayerEvent.cpp index 243474e0..1d877b10 100644 --- a/src/servers/sapphire_zone/Actor/PlayerEvent.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerEvent.cpp @@ -133,6 +133,26 @@ void Core::Entity::Player::playScene( uint32_t eventId, uint32_t scene, playScene( eventId, scene, flags, eventParam2, eventParam3, 0, eventCallback ); } +void Core::Entity::Player::playGilShop( uint64_t actorId, uint32_t eventId, uint32_t flags ) +{ + auto pEvent = getEvent( eventId ); + if( !pEvent ) + { + auto pLog = g_fw.get< Logger >(); + pLog->error( "Could not find event " + std::to_string( eventId ) + ", event has not been started!" ); + return; + } + + auto openGilShopPacket = makeZonePacket< Server::FFXIVIpcEventOpenGilShop >( getId() ); + openGilShopPacket->data().eventId = eventId; + openGilShopPacket->data().sceneFlags = flags; + openGilShopPacket->data().actorId = actorId; + + openGilShopPacket->data().scene = 10; + + queuePacket( openGilShopPacket ); +} + Core::Event::EventHandlerPtr Core::Entity::Player::bootstrapSceneEvent( uint32_t eventId, uint32_t flags ) { if( flags & 0x02 ) diff --git a/src/servers/sapphire_zone/Script/ScriptMgr.cpp b/src/servers/sapphire_zone/Script/ScriptMgr.cpp index 78424df8..fe87b6a4 100644 --- a/src/servers/sapphire_zone/Script/ScriptMgr.cpp +++ b/src/servers/sapphire_zone/Script/ScriptMgr.cpp @@ -182,6 +182,10 @@ bool Core::Scripting::ScriptMgr::onTalk( Entity::Player& player, uint64_t actorI if( !aetherInfo->isAetheryte ) scriptId = EVENTSCRIPT_AETHERNET_ID; } + else if( eventType == Event::EventHandler::EventHandlerType::Shop ) + { + scriptId = 0x00041; + } auto script = m_nativeScriptMgr->getScript< EventScript >( scriptId ); if( !script ) From 9ab7d5c68a001c757c8de6a50251112e1dd4ed59 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sun, 22 Jul 2018 23:20:12 +1000 Subject: [PATCH 012/117] somewhat working gilshops --- .../Network/PacketDef/Zone/ClientZoneDef.h | 2 ++ src/servers/Scripts/common/GilShop.cpp | 32 +++++++++++++++---- src/servers/sapphire_zone/Actor/Player.h | 3 +- .../sapphire_zone/Actor/PlayerEvent.cpp | 13 ++++---- .../sapphire_zone/Event/EventHandler.h | 1 + .../Network/Handlers/EventHandlers.cpp | 2 ++ 6 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/common/Network/PacketDef/Zone/ClientZoneDef.h b/src/common/Network/PacketDef/Zone/ClientZoneDef.h index 6963493b..8ebca6f9 100644 --- a/src/common/Network/PacketDef/Zone/ClientZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ClientZoneDef.h @@ -65,6 +65,8 @@ struct FFXIVIpcEventHandlerReturn : FFXIVIpcBasePacket< ReturnEventHandler > /* 0008 */ uint16_t param2; /* 000A */ char pad_000A[2]; /* 000C */ uint16_t param3; + /* 000E */ char pad_000E[2]; + /* 0010 */ uint16_t tradeQuantity; }; struct FFXIVIpcEnterTerritoryHandler : FFXIVIpcBasePacket< EnterTeriEventHandler > diff --git a/src/servers/Scripts/common/GilShop.cpp b/src/servers/Scripts/common/GilShop.cpp index c72256fe..bcf67844 100644 --- a/src/servers/Scripts/common/GilShop.cpp +++ b/src/servers/Scripts/common/GilShop.cpp @@ -7,13 +7,33 @@ public: GilShop() : EventScript( 0x00041 ) {} + constexpr static auto SCENE_FLAGS = HIDE_HOTBAR | NO_DEFAULT_CAMERA; + + static void shopInteractionCallback( Entity::Player& player, const Event::SceneResult& result ) + { + // item purchase + if( result.param1 == 768 ) + { + //player.playGilShop( result.eventId, HIDE_HOTBAR | NO_DEFAULT_CAMERA, shopInteractionCallback ); + + player.sendDebug("got tradeQuantity: " + std::to_string( result.tradeQuantity ) ); + player.playScene( result.eventId, 10, SCENE_FLAGS, 0, 0, shopInteractionCallback ); + return; + } + + // exit + player.playScene( result.eventId, 255, SCENE_FLAGS ); + } + + static void shopCallback( Entity::Player& player, const Event::SceneResult& result ) + { + //player.playGilShop( result.eventId, HIDE_HOTBAR | NO_DEFAULT_CAMERA, shopInteractionCallback ); + + player.playScene( result.eventId, 10, SCENE_FLAGS, 0, 0, shopInteractionCallback ); + } + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override { - auto callback = [actorId]( Entity::Player& player, const Event::SceneResult& result ) - { - player.playGilShop( actorId, result.eventId, HIDE_HOTBAR | NO_DEFAULT_CAMERA ); - }; - - player.playScene( eventId, 0, HIDE_HOTBAR | NO_DEFAULT_CAMERA, 0, 2, callback ); + player.playScene( eventId, 0, SCENE_FLAGS, 0, 2, shopCallback ); } }; \ No newline at end of file diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index 276610c2..1ea9aec1 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -58,7 +58,8 @@ public: /*! play a subevent */ void playScene( uint32_t eventId, uint32_t scene, uint32_t flags, uint32_t eventParam2, uint32_t eventParam3 ); - void playGilShop( uint64_t actorId, uint32_t eventId, uint32_t flags ); + void playGilShop( uint32_t eventId, uint32_t flags, + Event::EventHandler::SceneReturnCallback eventCallback ); void directorPlayScene( uint32_t eventId, uint32_t scene, uint32_t flags, uint32_t eventParam3, uint32_t eventParam4, uint32_t eventParam5 = 0 ); diff --git a/src/servers/sapphire_zone/Actor/PlayerEvent.cpp b/src/servers/sapphire_zone/Actor/PlayerEvent.cpp index 1d877b10..d8cbf1f7 100644 --- a/src/servers/sapphire_zone/Actor/PlayerEvent.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerEvent.cpp @@ -133,20 +133,19 @@ void Core::Entity::Player::playScene( uint32_t eventId, uint32_t scene, playScene( eventId, scene, flags, eventParam2, eventParam3, 0, eventCallback ); } -void Core::Entity::Player::playGilShop( uint64_t actorId, uint32_t eventId, uint32_t flags ) +void Core::Entity::Player::playGilShop( uint32_t eventId, uint32_t flags, + Event::EventHandler::SceneReturnCallback eventCallback ) { - auto pEvent = getEvent( eventId ); + auto pEvent = bootstrapSceneEvent( eventId, flags ); if( !pEvent ) - { - auto pLog = g_fw.get< Logger >(); - pLog->error( "Could not find event " + std::to_string( eventId ) + ", event has not been started!" ); return; - } + + pEvent->setEventReturnCallback( eventCallback ); auto openGilShopPacket = makeZonePacket< Server::FFXIVIpcEventOpenGilShop >( getId() ); openGilShopPacket->data().eventId = eventId; openGilShopPacket->data().sceneFlags = flags; - openGilShopPacket->data().actorId = actorId; + openGilShopPacket->data().actorId = getId(); openGilShopPacket->data().scene = 10; diff --git a/src/servers/sapphire_zone/Event/EventHandler.h b/src/servers/sapphire_zone/Event/EventHandler.h index 87a29c8d..c6e94105 100644 --- a/src/servers/sapphire_zone/Event/EventHandler.h +++ b/src/servers/sapphire_zone/Event/EventHandler.h @@ -12,6 +12,7 @@ namespace Core { uint16_t param1; uint16_t param2; uint16_t param3; + uint16_t tradeQuantity; }; class EventHandler diff --git a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp index 801ab2b7..27a165bd 100644 --- a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp @@ -203,6 +203,7 @@ void Core::Network::GameConnection::eventHandlerReturn( const Packets::FFXIVARR_ const auto& param1 = packet.data().param1; const auto& param2 = packet.data().param2; const auto& param3 = packet.data().param3; + const auto& tradeQuantity = packet.data().tradeQuantity; std::string eventName = Event::getEventName( eventId ); @@ -228,6 +229,7 @@ void Core::Network::GameConnection::eventHandlerReturn( const Packets::FFXIVARR_ result.param1 = param1; result.param2 = param2; result.param3 = param3; + result.tradeQuantity = tradeQuantity; eventCallback( player, result ); } // we might have a scene chain callback instead so check for that too From b8871519fef83cbadf984642e408d160441f9247 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sun, 22 Jul 2018 23:32:16 +1000 Subject: [PATCH 013/117] minor refactoring --- src/common/Network/PacketDef/Zone/ClientZoneDef.h | 2 +- src/servers/Scripts/common/GilShop.cpp | 2 +- src/servers/sapphire_zone/Event/EventHandler.h | 2 +- src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/common/Network/PacketDef/Zone/ClientZoneDef.h b/src/common/Network/PacketDef/Zone/ClientZoneDef.h index 8ebca6f9..3b77195f 100644 --- a/src/common/Network/PacketDef/Zone/ClientZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ClientZoneDef.h @@ -66,7 +66,7 @@ struct FFXIVIpcEventHandlerReturn : FFXIVIpcBasePacket< ReturnEventHandler > /* 000A */ char pad_000A[2]; /* 000C */ uint16_t param3; /* 000E */ char pad_000E[2]; - /* 0010 */ uint16_t tradeQuantity; + /* 0010 */ uint16_t param4; }; struct FFXIVIpcEnterTerritoryHandler : FFXIVIpcBasePacket< EnterTeriEventHandler > diff --git a/src/servers/Scripts/common/GilShop.cpp b/src/servers/Scripts/common/GilShop.cpp index bcf67844..f496074d 100644 --- a/src/servers/Scripts/common/GilShop.cpp +++ b/src/servers/Scripts/common/GilShop.cpp @@ -16,7 +16,7 @@ public: { //player.playGilShop( result.eventId, HIDE_HOTBAR | NO_DEFAULT_CAMERA, shopInteractionCallback ); - player.sendDebug("got tradeQuantity: " + std::to_string( result.tradeQuantity ) ); + player.sendDebug("got tradeQuantity: " + std::to_string( result.param4 ) ); player.playScene( result.eventId, 10, SCENE_FLAGS, 0, 0, shopInteractionCallback ); return; } diff --git a/src/servers/sapphire_zone/Event/EventHandler.h b/src/servers/sapphire_zone/Event/EventHandler.h index c6e94105..8821d6c5 100644 --- a/src/servers/sapphire_zone/Event/EventHandler.h +++ b/src/servers/sapphire_zone/Event/EventHandler.h @@ -12,7 +12,7 @@ namespace Core { uint16_t param1; uint16_t param2; uint16_t param3; - uint16_t tradeQuantity; + uint16_t param4; }; class EventHandler diff --git a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp index 27a165bd..69d2dd57 100644 --- a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp @@ -203,7 +203,7 @@ void Core::Network::GameConnection::eventHandlerReturn( const Packets::FFXIVARR_ const auto& param1 = packet.data().param1; const auto& param2 = packet.data().param2; const auto& param3 = packet.data().param3; - const auto& tradeQuantity = packet.data().tradeQuantity; + const auto& param4 = packet.data().param4; std::string eventName = Event::getEventName( eventId ); @@ -229,7 +229,7 @@ void Core::Network::GameConnection::eventHandlerReturn( const Packets::FFXIVARR_ result.param1 = param1; result.param2 = param2; result.param3 = param3; - result.tradeQuantity = tradeQuantity; + result.param4 = param4; eventCallback( player, result ); } // we might have a scene chain callback instead so check for that too From 5ac4573bd317a19e05eeb4391a388d3e7eb8d4f9 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Mon, 23 Jul 2018 00:05:44 +1000 Subject: [PATCH 014/117] gilshops now work using the proper packet --- src/servers/Scripts/common/GilShop.cpp | 33 ++++++++++++------- .../sapphire_zone/Actor/PlayerEvent.cpp | 2 ++ .../sapphire_zone/Script/ScriptMgr.cpp | 3 +- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/servers/Scripts/common/GilShop.cpp b/src/servers/Scripts/common/GilShop.cpp index f496074d..8ff007f4 100644 --- a/src/servers/Scripts/common/GilShop.cpp +++ b/src/servers/Scripts/common/GilShop.cpp @@ -4,20 +4,36 @@ class GilShop : public EventScript { public: - GilShop() : EventScript( 0x00041 ) + GilShop() : EventScript( 0x00040001 ) {} constexpr static auto SCENE_FLAGS = HIDE_HOTBAR | NO_DEFAULT_CAMERA; + void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override + { + player.playScene( eventId, 0, SCENE_FLAGS, 0, 2, shopCallback ); + } + +private: static void shopInteractionCallback( Entity::Player& player, const Event::SceneResult& result ) { // item purchase if( result.param1 == 768 ) { - //player.playGilShop( result.eventId, HIDE_HOTBAR | NO_DEFAULT_CAMERA, shopInteractionCallback ); + // buy + if( result.param2 == 1 ) + { - player.sendDebug("got tradeQuantity: " + std::to_string( result.param4 ) ); - player.playScene( result.eventId, 10, SCENE_FLAGS, 0, 0, shopInteractionCallback ); + } + + // sell + else if( result.param2 == 2 ) + { + + } + + player.sendDebug( "got tradeQuantity: " + std::to_string( result.param4 ) ); + player.playGilShop( result.eventId, SCENE_FLAGS, shopInteractionCallback ); return; } @@ -27,13 +43,6 @@ public: static void shopCallback( Entity::Player& player, const Event::SceneResult& result ) { - //player.playGilShop( result.eventId, HIDE_HOTBAR | NO_DEFAULT_CAMERA, shopInteractionCallback ); - - player.playScene( result.eventId, 10, SCENE_FLAGS, 0, 0, shopInteractionCallback ); - } - - void onTalk( uint32_t eventId, Entity::Player& player, uint64_t actorId ) override - { - player.playScene( eventId, 0, SCENE_FLAGS, 0, 2, shopCallback ); + player.playGilShop( result.eventId, SCENE_FLAGS, shopInteractionCallback ); } }; \ No newline at end of file diff --git a/src/servers/sapphire_zone/Actor/PlayerEvent.cpp b/src/servers/sapphire_zone/Actor/PlayerEvent.cpp index d8cbf1f7..61d7e06c 100644 --- a/src/servers/sapphire_zone/Actor/PlayerEvent.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerEvent.cpp @@ -140,7 +140,9 @@ void Core::Entity::Player::playGilShop( uint32_t eventId, uint32_t flags, if( !pEvent ) return; + pEvent->setPlayedScene( true ); pEvent->setEventReturnCallback( eventCallback ); + pEvent->setSceneChainCallback( nullptr ); auto openGilShopPacket = makeZonePacket< Server::FFXIVIpcEventOpenGilShop >( getId() ); openGilShopPacket->data().eventId = eventId; diff --git a/src/servers/sapphire_zone/Script/ScriptMgr.cpp b/src/servers/sapphire_zone/Script/ScriptMgr.cpp index fe87b6a4..f9ca9890 100644 --- a/src/servers/sapphire_zone/Script/ScriptMgr.cpp +++ b/src/servers/sapphire_zone/Script/ScriptMgr.cpp @@ -174,6 +174,7 @@ bool Core::Scripting::ScriptMgr::onTalk( Entity::Player& player, uint64_t actorI uint16_t eventType = eventId >> 16; uint32_t scriptId = eventId; + // todo: replace this shit with something more flexible allowing for handlers for an entire type without a bunch of if statements // aethernet/aetherytes need to be handled separately if( eventType == Event::EventHandler::EventHandlerType::Aetheryte ) { @@ -184,7 +185,7 @@ bool Core::Scripting::ScriptMgr::onTalk( Entity::Player& player, uint64_t actorI } else if( eventType == Event::EventHandler::EventHandlerType::Shop ) { - scriptId = 0x00041; + scriptId = 0x00040001; } auto script = m_nativeScriptMgr->getScript< EventScript >( scriptId ); From 31915f9feeeab391cd14a54245f95c7d957f1068 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Tue, 24 Jul 2018 22:22:19 +1000 Subject: [PATCH 015/117] doxygen doco generation + some documentation for script system --- .gitignore | 5 +- doxygen/Doxyfile | 2494 +++++++++++++++++ doxygen/extra_stylesheet.css | 0 doxygen/logo.png | Bin 0 -> 5996 bytes src/common/Network/CommonActorControl.h | 5 + .../sapphire_zone/Script/NativeScriptApi.h | 74 + .../sapphire_zone/Script/ScriptLoader.cpp | 3 - .../sapphire_zone/Script/ScriptLoader.h | 51 +- 8 files changed, 2626 insertions(+), 6 deletions(-) create mode 100644 doxygen/Doxyfile create mode 100644 doxygen/extra_stylesheet.css create mode 100644 doxygen/logo.png diff --git a/.gitignore b/.gitignore index 7bb065de..5e4101df 100644 --- a/.gitignore +++ b/.gitignore @@ -120,4 +120,7 @@ cotire/ *_cotire.cmake *objects.txt -*exports.def \ No newline at end of file +*exports.def + +# doxygen output folder +doxygen/generated/ \ No newline at end of file diff --git a/doxygen/Doxyfile b/doxygen/Doxyfile new file mode 100644 index 00000000..21be557f --- /dev/null +++ b/doxygen/Doxyfile @@ -0,0 +1,2494 @@ +# Doxyfile 1.8.13 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all text +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv +# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv +# for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = "Sapphire" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "A FINAL FANTASY XIV Server Emulator" + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = logo.png + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = YES + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 3 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: +# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: +# Fortran. In the later case the parser tries to guess whether the code is fixed +# or free formatted code, this is the default for Fortran type files), VHDL. For +# instance to make doxygen treat .inc files as Fortran files (default is PHP), +# and .f files as C (default is Fortran), use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 0. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 0 + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = YES + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO, these declarations will be +# included in the documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES, upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = ../src/servers ../src/common + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: http://www.gnu.org/software/libiconv) for the list of +# possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, +# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf. + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.idl \ + *.ddl \ + *.odl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.cs \ + *.d \ + *.php \ + *.php4 \ + *.php5 \ + *.phtml \ + *.inc \ + *.m \ + *.markdown \ + *.md \ + *.mm \ + *.dox \ + *.py \ + *.pyw \ + *.f90 \ + *.f95 \ + *.f03 \ + *.f08 \ + *.f \ + *.for \ + *.tcl \ + *.vhd \ + *.vhdl \ + *.ucf \ + *.qsf + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = ../src/servers/Scripts + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# function all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see http://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the +# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the +# cost of reduced performance. This can be particularly helpful with template +# rich C++ code for which doxygen's built-in parser lacks the necessary type +# information. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse-libclang=ON option for CMake. +# The default value is: NO. + +CLANG_ASSISTED_PARSING = NO + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_OPTIONS = + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = generated/ + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = extra_stylesheet.css + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: http://developer.apple.com/tools/xcode/), introduced with +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the master .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = YES + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# http://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from http://www.mathjax.org before deployment. +# The default value is: http://cdn.mathjax.org/mathjax/latest. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /