From 394d682880f9cda0a5801460d5d5e0db44d5689d Mon Sep 17 00:00:00 2001 From: Maru Date: Fri, 20 Oct 2017 18:38:02 -0200 Subject: [PATCH 1/5] Added CONTRIBUTING.md; --- CONTRIBUTING.md | 63 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..a2964aca --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,63 @@ +# Contributing + +Thanks for contributing to Sapphire! + +First, we'd like to mention that a lot of discussion regarding the project happens in our Discord server. +We value research and discussion as to how we should tackle our issues as well as improving what is already in. +Of course we also value testing - many things tend to break due to patches, or mistakes/edge cases. + +Regardless of how you plan on contributing, your thoughts are appreciated and you're welcome to join our Discord (link in README.md). + +## Research + +Care in implementating features should be taken. It tends to be end up weird, and replicating the expected behavior +is always preferred. Avoid assumptions and guesswork whenever possible. + +As much research possible should be done before writing it out - on game data, testing with retail, +and even common practices in server development (emulators or not). + +## Pull Requests + +When making a PR, please make sure that it follows our style guidelines and good practices. + +### Coding style + +Indentations are Allman-style based, 4-space, no tabs. +Space between arguments in function calls, as well as for types. + +Example (shortened from ActionHandler.cpp): + +```cpp +switch( commandId ) +{ + case 0x01: // Toggle sheathe + { + if ( param11 == 1 ) + pPlayer->setStance( Entity::Actor::Stance::Active ); + else + { + pPlayer->setStance( Entity::Actor::Stance::Passive ); + pPlayer->setAutoattack( false ); + } + + pPlayer->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), 0, param11, 1 ) ); + + break; + } + case 0x03: // Change target + { + uint64_t targetId = inPacket.getValAt< uint64_t >( 0x24 ); + pPlayer->changeTarget( targetId ); + break; + } + default: + { + break; + } +} +``` + +### Feature implementation + +Please make sure edge cases have been tested, behavior is aligned with retail and (if applicable) your queries make sense. +Any changes to the SQL base should be noted (and reflected in the update.sql file in rootDirectory/sql). \ No newline at end of file From 44905bed31e78f0f52bb1879ec73ed712b0234f4 Mon Sep 17 00:00:00 2001 From: Maru Date: Mon, 20 Nov 2017 18:03:12 -0200 Subject: [PATCH 2/5] Lib --- src/libraries | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries b/src/libraries index 2d0e1a96..c71860d7 160000 --- a/src/libraries +++ b/src/libraries @@ -1 +1 @@ -Subproject commit 2d0e1a962d13c8e07d1131789642e044eb489579 +Subproject commit c71860d79596a93e5668169ac3f0309397c7218c From 2392f504977916500b9bdeea60d66876f3327290 Mon Sep 17 00:00:00 2001 From: Maru Date: Tue, 21 Nov 2017 03:19:08 -0200 Subject: [PATCH 3/5] Reorganize math classes; Fix crash on spawning actor; Style; --- src/servers/Server_Zone/Actor/Actor.cpp | 10 +- src/servers/Server_Zone/Actor/BattleNpc.cpp | 4 +- src/servers/Server_Zone/Actor/Player.cpp | 9 +- src/servers/Server_Zone/CMakeLists.txt | 2 + src/servers/Server_Zone/Math/CalcBattle.cpp | 45 +++ src/servers/Server_Zone/Math/CalcBattle.h | 24 ++ .../CalcBattle.cpp => Math/CalcStats.cpp} | 43 +-- .../{Actor/CalcBattle.h => Math/CalcStats.h} | 17 +- .../Network/Handlers/GMCommandHandlers.cpp | 348 +++++++++--------- .../PacketWrappers/UpdateHpMpTpPacket.h | 1 + 10 files changed, 282 insertions(+), 221 deletions(-) create mode 100644 src/servers/Server_Zone/Math/CalcBattle.cpp create mode 100644 src/servers/Server_Zone/Math/CalcBattle.h rename src/servers/Server_Zone/{Actor/CalcBattle.cpp => Math/CalcStats.cpp} (76%) rename src/servers/Server_Zone/{Actor/CalcBattle.h => Math/CalcStats.h} (54%) diff --git a/src/servers/Server_Zone/Actor/Actor.cpp b/src/servers/Server_Zone/Actor/Actor.cpp index 4c3addc8..fd946a14 100644 --- a/src/servers/Server_Zone/Actor/Actor.cpp +++ b/src/servers/Server_Zone/Actor/Actor.cpp @@ -2,12 +2,13 @@ #include #include #include +#include #include "src/servers/Server_Zone/Forwards.h" #include "src/servers/Server_Zone/Action/Action.h" -#include "Actor.h" + #include "src/servers/Server_Zone/Zone/Zone.h" -#include + #include "src/servers/Server_Zone/Network/GameConnection.h" #include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket142.h" #include "src/servers/Server_Zone/Network/PacketWrappers/ActorControlPacket143.h" @@ -19,7 +20,8 @@ #include "src/servers/Server_Zone/Action/ActionCollision.h" #include "src/servers/Server_Zone/ServerZone.h" #include "src/servers/Server_Zone/Session.h" -#include "CalcBattle.h" +#include "src/servers/Server_Zone/Math/CalcBattle.h" +#include "Actor.h" #include "Player.h" extern Core::ServerZone g_serverZone; @@ -738,7 +740,7 @@ void Core::Entity::Actor::handleScriptSkill( uint32_t type, uint32_t actionId, u case ActionEffectType::Heal: { - uint32_t calculatedHeal = Data::CalcBattle::calculateHealValue( getAsPlayer(), static_cast< uint32_t >( param1 ) ); + 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; diff --git a/src/servers/Server_Zone/Actor/BattleNpc.cpp b/src/servers/Server_Zone/Actor/BattleNpc.cpp index 08fff2e6..7d2ff258 100644 --- a/src/servers/Server_Zone/Actor/BattleNpc.cpp +++ b/src/servers/Server_Zone/Actor/BattleNpc.cpp @@ -66,7 +66,7 @@ Core::Entity::BattleNpc::BattleNpc( uint32_t modelId, uint32_t nameid, const Com m_currentStance = Stance::Passive; m_class = ClassJob::Gladiator; - m_level = level > 0 ? level : 60; + m_level = level > 0 ? level : 70; m_modelId = modelId; m_nameId = nameid; @@ -489,6 +489,8 @@ void Core::Entity::BattleNpc::update( int64_t currTime ) return; } + if ( !m_pStatusEffectContainer ) + initStatusEffectContainer(); m_pStatusEffectContainer->update(); float distance = Math::Util::distance( m_pos.x, m_pos.y, m_pos.z, m_posOrigin.x, m_posOrigin.y, m_posOrigin.z ); diff --git a/src/servers/Server_Zone/Actor/Player.cpp b/src/servers/Server_Zone/Actor/Player.cpp index 26199d4e..6af87613 100644 --- a/src/servers/Server_Zone/Actor/Player.cpp +++ b/src/servers/Server_Zone/Actor/Player.cpp @@ -41,7 +41,8 @@ #include "src/servers/Server_Zone/Action/EventAction.h" #include "src/servers/Server_Zone/Action/EventItemAction.h" #include "src/servers/Server_Zone/Zone/ZonePosition.h" -#include "src/servers/Server_Zone/Actor/CalcBattle.h" +#include "src/servers/Server_Zone/Math/CalcStats.h" +#include "src/servers/Server_Zone/Math/CalcBattle.h" #include extern Core::Logger g_log; @@ -226,7 +227,7 @@ void Core::Entity::Player::calculateStats() auto paramGrowthInfo = paramGrowthInfoIt->second; // TODO: put formula somewhere else... - float base = Data::CalcBattle::calculateBaseStat( getAsPlayer() ); + float base = Math::CalcStats::calculateBaseStat( getAsPlayer() ); m_baseStats.str = static_cast< uint32_t >( base * ( static_cast< float >( classInfo.mod_str ) / 100 ) + tribeInfo.mod_str ); m_baseStats.dex = static_cast< uint32_t >( base * ( static_cast< float >( classInfo.mod_dex ) / 100 ) + tribeInfo.mod_dex ); @@ -242,9 +243,9 @@ void Core::Entity::Player::calculateStats() m_baseStats.attackPotMagic = paramGrowthInfo.base_secondary; m_baseStats.healingPotMagic = paramGrowthInfo.base_secondary; - m_baseStats.max_mp = Data::CalcBattle::calculateMaxMp( getAsPlayer() ); + m_baseStats.max_mp = Math::CalcStats::calculateMaxMp( getAsPlayer() ); - m_baseStats.max_hp = Data::CalcBattle::calculateMaxHp( getAsPlayer() ); + m_baseStats.max_hp = Math::CalcStats::calculateMaxHp( getAsPlayer() ); if( m_mp > m_baseStats.max_mp ) m_mp = m_baseStats.max_mp; diff --git a/src/servers/Server_Zone/CMakeLists.txt b/src/servers/Server_Zone/CMakeLists.txt index 11d27f8d..ddd78661 100644 --- a/src/servers/Server_Zone/CMakeLists.txt +++ b/src/servers/Server_Zone/CMakeLists.txt @@ -12,6 +12,7 @@ file(GLOB SERVER_PUBLIC_INCLUDE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} Event/*.h Inventory/*.h Linkshell/*.h + Math/*.h Network/*.h Network/Handlers/*.h Network/PacketWrappers/*.h @@ -27,6 +28,7 @@ file(GLOB SERVER_SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} Event/*.c* Inventory/*.c* Linkshell/*.c* + Math/*.c* Network/*.c* Network/Handlers/*.c* Network/PacketWrappers/*.c* diff --git a/src/servers/Server_Zone/Math/CalcBattle.cpp b/src/servers/Server_Zone/Math/CalcBattle.cpp new file mode 100644 index 00000000..bc2bc322 --- /dev/null +++ b/src/servers/Server_Zone/Math/CalcBattle.cpp @@ -0,0 +1,45 @@ +#include + +#include +#include +#include +#include + +#include "CalcBattle.h" + + +using namespace Core::Math; +using namespace Core::Entity; + +extern Core::Data::ExdData g_exdData; + +/* + Class used for battle-related formulas and calculations. + Big thanks to the Theoryjerks group! + + NOTE: + Formulas here shouldn't be considered final. It's possible that the formula it was based on is correct but + wasn't implemented correctly here, or approximated things due to limited knowledge of how things work in retail. + It's also possible that we're using formulas that were correct for previous patches, but not the current version. + + TODO: + + Damage outgoing calculations. This includes auto-attacks, etc. + More formulas in general. Most of it was moved to another class, but work can be done in this area as well already. + +*/ + +uint32_t CalcBattle::calculateHealValue( PlayerPtr pPlayer, uint32_t potency ) +{ + auto classInfoIt = g_exdData.m_classJobInfoMap.find( static_cast< uint8_t >( pPlayer->getClass() ) ); + auto paramGrowthInfoIt = g_exdData.m_paramGrowthInfoMap.find( pPlayer->getLevel() ); + + if ( classInfoIt == g_exdData.m_classJobInfoMap.end() || + paramGrowthInfoIt == g_exdData.m_paramGrowthInfoMap.end()) + return 0; + + auto jobModVal = classInfoIt->second; + + // consider 3% variation + return potency / 10; +} \ No newline at end of file diff --git a/src/servers/Server_Zone/Math/CalcBattle.h b/src/servers/Server_Zone/Math/CalcBattle.h new file mode 100644 index 00000000..59a4c421 --- /dev/null +++ b/src/servers/Server_Zone/Math/CalcBattle.h @@ -0,0 +1,24 @@ +#ifndef _CALCBATTLE_H +#define _CALCBATTLE_H + +#include +#include + +using namespace Core::Entity; + +namespace Core { +namespace Math { + + class CalcBattle + { + public: + static uint32_t calculateHealValue( PlayerPtr pPlayer, uint32_t potency ); + + private: + + }; + +} +} + +#endif \ No newline at end of file diff --git a/src/servers/Server_Zone/Actor/CalcBattle.cpp b/src/servers/Server_Zone/Math/CalcStats.cpp similarity index 76% rename from src/servers/Server_Zone/Actor/CalcBattle.cpp rename to src/servers/Server_Zone/Math/CalcStats.cpp index 7beee3b6..4d6ae4d6 100644 --- a/src/servers/Server_Zone/Actor/CalcBattle.cpp +++ b/src/servers/Server_Zone/Math/CalcStats.cpp @@ -1,11 +1,14 @@ -#include - -#include "CalcBattle.h" -#include "Actor.h" -#include "Player.h" #include -using namespace Core::Data; +#include +#include +#include +#include + +#include "CalcStats.h" + + +using namespace Core::Math; using namespace Core::Entity; extern Core::Data::ExdData g_exdData; @@ -22,15 +25,14 @@ extern Core::Data::ExdData g_exdData; TODO: Base HP val modifier. I can only find values for levels 50~70. - Attack power (and healing power). Needs more research on this. - Damage outgoing calculations. This includes auto-attacks, etc. - + Dereferencing the actor (Player right now) for stats seem meh, perhaps consider a structure purely for stats? + Reduce repeated code (more specifically the data we pull from exd) */ // 3 Versions. SB and HW are linear, ARR is polynomial. // Originally from Player.cpp, calculateStats(). -float CalcBattle::calculateBaseStat( PlayerPtr pPlayer ) +float CalcStats::calculateBaseStat( PlayerPtr pPlayer ) { float base = 0.0f; uint8_t level = pPlayer->getLevel(); @@ -53,10 +55,10 @@ float CalcBattle::calculateBaseStat( PlayerPtr pPlayer ) // Leggerless' HP Formula // ROUNDDOWN(JobModHP * (BaseHP / 100)) + ROUNDDOWN(VitHPMod / 100 * (VIT - BaseDET)) -uint32_t CalcBattle::calculateMaxHp( PlayerPtr pPlayer ) +uint32_t CalcStats::calculateMaxHp( PlayerPtr pPlayer ) { // TODO: Replace ApproxBaseHP with something that can get us an accurate BaseHP. - // Is there any way to pull BaseHP without having to manually use a pet for every level, and using the values from a table? + // Is there any way to pull reliable BaseHP without having to manually use a pet for every level, and using the values from a table? // More info here: https://docs.google.com/spreadsheets/d/1de06KGT0cNRUvyiXNmjNgcNvzBCCQku7jte5QxEQRbs/edit?usp=sharing auto classInfoIt = g_exdData.m_classJobInfoMap.find( static_cast< uint8_t >( pPlayer->getClass() ) ); @@ -91,7 +93,7 @@ uint32_t CalcBattle::calculateMaxHp( PlayerPtr pPlayer ) // Leggerless' MP Formula // ROUNDDOWN(((ROUNDDOWN(((PIE - BaseDET) * PieMPMod/100),0) + BaseMP) * JobModMP / 100),0) -uint32_t CalcBattle::calculateMaxMp( PlayerPtr pPlayer ) +uint32_t CalcStats::calculateMaxMp( PlayerPtr pPlayer ) { auto classInfoIt = g_exdData.m_classJobInfoMap.find( static_cast< uint8_t >( pPlayer->getClass() ) ); auto paramGrowthInfoIt = g_exdData.m_paramGrowthInfoMap.find( pPlayer->getLevel() ); @@ -109,19 +111,4 @@ uint32_t CalcBattle::calculateMaxMp( PlayerPtr pPlayer ) uint16_t result = static_cast< uint16_t >( floor( floor( piety - baseStat ) * ( pietyScalar / 100 ) + baseMp ) * jobModMp / 100 ); return result; -} - -uint32_t CalcBattle::calculateHealValue( PlayerPtr pPlayer, uint32_t potency ) -{ - auto classInfoIt = g_exdData.m_classJobInfoMap.find( static_cast< uint8_t >( pPlayer->getClass() ) ); - auto paramGrowthInfoIt = g_exdData.m_paramGrowthInfoMap.find( pPlayer->getLevel() ); - - if ( classInfoIt == g_exdData.m_classJobInfoMap.end() || - paramGrowthInfoIt == g_exdData.m_paramGrowthInfoMap.end()) - return 0; - - auto jobModVal = classInfoIt->second; - - // consider 3% variation - return potency / 10; } \ No newline at end of file diff --git a/src/servers/Server_Zone/Actor/CalcBattle.h b/src/servers/Server_Zone/Math/CalcStats.h similarity index 54% rename from src/servers/Server_Zone/Actor/CalcBattle.h rename to src/servers/Server_Zone/Math/CalcStats.h index 0cbde694..74762bb9 100644 --- a/src/servers/Server_Zone/Actor/CalcBattle.h +++ b/src/servers/Server_Zone/Math/CalcStats.h @@ -1,23 +1,20 @@ -#ifndef _CALCBATTLE_H -#define _CALCBATTLE_H +#ifndef _CALCSTATS_H +#define _CALCSTATS_H -#include - -#include "Actor.h" +#include +#include using namespace Core::Entity; namespace Core { -namespace Data { - - class CalcBattle +namespace Math { + + class CalcStats { public: - static float calculateBaseStat( PlayerPtr pPlayer ); static uint32_t calculateMaxMp( PlayerPtr pPlayer ); static uint32_t calculateMaxHp( PlayerPtr pPlayer ); - static uint32_t calculateHealValue( PlayerPtr pPlayer, uint32_t potency ); private: diff --git a/src/servers/Server_Zone/Network/Handlers/GMCommandHandlers.cpp b/src/servers/Server_Zone/Network/Handlers/GMCommandHandlers.cpp index 011ec59e..63f96d7b 100644 --- a/src/servers/Server_Zone/Network/Handlers/GMCommandHandlers.cpp +++ b/src/servers/Server_Zone/Network/Handlers/GMCommandHandlers.cpp @@ -86,10 +86,12 @@ enum GmCommand GCRank = 0x0155, Aetheryte = 0x015E, Teri = 0x0258, + Kick = 0x025C, TeriInfo = 0x025D, Jump = 0x025E, JumpNpc = 0x025F, }; + void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPacket, Entity::PlayerPtr pPlayer ) { if( pPlayer->getGmRank() <= 0 ) @@ -126,35 +128,85 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac switch( commandId ) { - case GmCommand::Kill: + case GmCommand::Lv: { - targetActor->takeDamage( 9999999 ); - pPlayer->sendNotice( "Killed " + std::to_string( targetActor->getId() ) ); + targetPlayer->setLevel( param1 ); + pPlayer->sendNotice( "Level for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) ); break; } - case GmCommand::QuestSequence: + case GmCommand::Race: { - targetPlayer->updateQuest( param1, param2 ); + targetPlayer->setLookAt( CharaLook::Race, param1 ); + pPlayer->sendNotice( "Race for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) ); + targetPlayer->spawn( targetPlayer ); + auto inRange = targetPlayer->getInRangeActors(); + for ( auto actor : inRange ) + { + targetPlayer->despawn( actor->getAsPlayer() ); + targetPlayer->spawn( actor->getAsPlayer() ); + } break; } - case GmCommand::QuestComplete: + case GmCommand::Tribe: { - targetPlayer->finishQuest( param1 ); + targetPlayer->setLookAt( CharaLook::Tribe, param1 ); + pPlayer->sendNotice( "Tribe for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) ); + targetPlayer->spawn( targetPlayer ); + auto inRange = targetPlayer->getInRangeActors(); + for ( auto actor : inRange ) + { + targetPlayer->despawn( actor->getAsPlayer() ); + targetPlayer->spawn( actor->getAsPlayer() ); + } break; } - case GmCommand::QuestAccept: + case GmCommand::Sex: { - targetPlayer->updateQuest( param1, 1 ); + targetPlayer->setLookAt( CharaLook::Gender, param1 ); + pPlayer->sendNotice( "Sex for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) ); + targetPlayer->spawn( targetPlayer ); + auto inRange = targetActor->getInRangeActors(); + for ( auto actor : inRange ) + { + targetPlayer->despawn( actor->getAsPlayer() ); + targetPlayer->spawn( actor->getAsPlayer() ); + } break; } - case GmCommand::QuestCancel: + case GmCommand::Time: { - targetPlayer->removeQuest( param1 ); + pPlayer->setEorzeaTimeOffset( param2 ); + pPlayer->sendNotice( "Eorzea time offset: " + std::to_string( param2 ) ); break; } - case GmCommand::QuestIncomplete: + case GmCommand::Weather: { - targetPlayer->unfinishQuest( param1 ); + targetPlayer->getCurrentZone()->setWeatherOverride( param1 ); + pPlayer->sendNotice( "Weather in Zone \"" + targetPlayer->getCurrentZone()->getName() + "\" of " + + targetPlayer->getName() + " set in range." ); + break; + } + case GmCommand::Call: + { + if ( targetPlayer->getZoneId() != pPlayer->getZoneId() ) + targetPlayer->setZone( pPlayer->getZoneId() ); + + targetPlayer->changePosition( pPlayer->getPos().x, pPlayer->getPos().y, pPlayer->getPos().z, + pPlayer->getRotation() ); + pPlayer->sendNotice( "Calling " + targetPlayer->getName() ); + break; + } + case GmCommand::Inspect: + { + pPlayer->sendNotice( "Name: " + targetPlayer->getName() + + "\nGil: " + std::to_string( targetPlayer->getCurrency( 1 ) ) + + "\nZone: " + targetPlayer->getCurrentZone()->getName() + + "(" + std::to_string( targetPlayer->getZoneId() ) + ")" + + "\nClass: " + std::to_string( static_cast< uint8_t >( targetPlayer->getClass() ) ) + + "\nLevel: " + std::to_string( targetPlayer->getLevel() ) + + "\nExp: " + std::to_string( targetPlayer->getExp() ) + + "\nSearchMessage: " + targetPlayer->getSearchMessage() + + "\nPlayTime: " + std::to_string( targetPlayer->getPlayTime() ) ); break; } case GmCommand::Speed: @@ -163,16 +215,30 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac pPlayer->sendNotice( "Speed for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) ); break; } - case GmCommand::Gil: + case GmCommand::Kill: { - targetPlayer->addCurrency( 1, param1 ); - pPlayer->sendNotice( "Added " + std::to_string( param1 ) + " Gil for " + targetPlayer->getName() ); + targetActor->takeDamage( 9999999 ); + pPlayer->sendNotice( "Killed " + std::to_string( targetActor->getId() ) ); break; } - case GmCommand::Lv: + case GmCommand::Icon: { - targetPlayer->setLevel( param1 ); - pPlayer->sendNotice( "Level for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) ); + targetPlayer->setOnlineStatusMask( param1 ); + + GamePacketNew< FFXIVIpcSetOnlineStatus, ServerZoneIpcType > statusPacket( targetPlayer->getId() ); + statusPacket.data().onlineStatusFlags = param1; + queueOutPacket( statusPacket ); + + GamePacketNew< FFXIVIpcSetSearchInfo, ServerZoneIpcType > searchInfoPacket( targetPlayer->getId() ); + searchInfoPacket.data().onlineStatusFlags = param1; + searchInfoPacket.data().selectRegion = targetPlayer->getSearchSelectRegion(); + strcpy( searchInfoPacket.data().searchMessage, targetPlayer->getSearchMessage() ); + targetPlayer->queuePacket( searchInfoPacket ); + + targetPlayer->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), SetStatusIcon, + static_cast< uint8_t >( pPlayer->getOnlineStatus() ) ), + true ); + pPlayer->sendNotice( "Icon for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) ); break; } case GmCommand::Hp: @@ -199,43 +265,37 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac pPlayer->sendNotice( std::to_string( param1 ) + " Exp was added to " + targetPlayer->getName() ); break; } - case GmCommand::Sex: + case GmCommand::Inv: { - targetPlayer->setLookAt( CharaLook::Gender, param1 ); - pPlayer->sendNotice( "Sex for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) ); - targetPlayer->spawn( targetPlayer ); - auto inRange = targetActor->getInRangeActors(); - for( auto actor : inRange ) - { - targetPlayer->despawn( actor->getAsPlayer() ); - targetPlayer->spawn( actor->getAsPlayer() ); - } + if ( targetActor->getInvincibilityType() == Common::InvincibilityType::InvincibilityRefill ) + targetActor->setInvincibilityType( Common::InvincibilityType::InvincibilityNone ); + else + targetActor->setInvincibilityType( Common::InvincibilityType::InvincibilityRefill ); + + pPlayer->sendNotice( "Invincibility for " + targetPlayer->getName() + + " was switched." ); break; } - case GmCommand::Race: + case GmCommand::Orchestrion: { - targetPlayer->setLookAt( CharaLook::Race, param1 ); - pPlayer->sendNotice( "Race for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) ); - targetPlayer->spawn( targetPlayer ); - auto inRange = targetPlayer->getInRangeActors(); - for( auto actor : inRange ) + if ( param1 == 1 ) { - targetPlayer->despawn( actor->getAsPlayer() ); - targetPlayer->spawn( actor->getAsPlayer() ); - } - break; - } - case GmCommand::Tribe: - { - targetPlayer->setLookAt( CharaLook::Tribe, param1 ); - pPlayer->sendNotice( "Tribe for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) ); - targetPlayer->spawn( targetPlayer ); - auto inRange = targetPlayer->getInRangeActors(); - for( auto actor : inRange ) - { - targetPlayer->despawn( actor->getAsPlayer() ); - targetPlayer->spawn( actor->getAsPlayer() ); + if ( param2 == 0 ) + { + for ( uint8_t i = 0; i < 255; i++ ) + targetActor->getAsPlayer()->learnSong( i, 0 ); + + pPlayer->sendNotice( "All Songs for " + targetPlayer->getName() + + " were turned on." ); + } + else + { + targetActor->getAsPlayer()->learnSong( param2, 0 ); + pPlayer->sendNotice( "Song " + std::to_string( param2 ) + " for " + targetPlayer->getName() + + " was turned on." ); + } } + break; } case GmCommand::Item: @@ -255,61 +315,17 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac pPlayer->sendUrgent( "Item " + std::to_string( param1 ) + " not found..." ); break; } - case GmCommand::Time: + case GmCommand::Gil: { - pPlayer->setEorzeaTimeOffset( param2 ); - pPlayer->sendNotice( "Eorzea time offset: " + std::to_string( param2 ) ); - break; - } - case GmCommand::Weather: - { - targetPlayer->getCurrentZone()->setWeatherOverride( param1 ); - pPlayer->sendNotice( "Weather in Zone \"" + targetPlayer->getCurrentZone()->getName() + "\" of " + - targetPlayer->getName() + " set in range." ); - break; - } - case GmCommand::TeriInfo: - { - pPlayer->sendNotice( "ZoneId: " + std::to_string( pPlayer->getZoneId() ) + "\nName: " + - pPlayer->getCurrentZone()->getName() + "\nInternalName: " + - pPlayer->getCurrentZone()->getInternalName() + "\nPopCount: " + - std::to_string( pPlayer->getCurrentZone()->getPopCount() ) + - "\nCurrentWeather:" + std::to_string( pPlayer->getCurrentZone()->getCurrentWeather() ) + - "\nNextWeather:" + std::to_string( pPlayer->getCurrentZone()->getNextWeather() ) ); - break; - } - case GmCommand::Teri: - { - auto zoneInfo = g_zoneMgr.getZone( param1 ); - if ( !zoneInfo ) - { - pPlayer->sendUrgent( "Invalid zone " + std::to_string( param1 ) ); - } - else - { - targetPlayer->setPosition( targetPlayer->getPos() ); - targetPlayer->performZoning( param1, targetPlayer->getPos(), 0 ); - pPlayer->sendNotice( targetPlayer->getName() + " was warped to zone " + std::to_string( param1 ) + " (" + zoneInfo->getName( ) + ")" ); - } - break; - } - case GmCommand::Jump: - { - - auto inRange = pPlayer->getInRangeActors(); - for( auto actor : inRange ) - { - pPlayer->changePosition( targetActor->getPos().x, targetActor->getPos().y, targetActor->getPos().z, - targetActor->getRotation() ); - } - pPlayer->sendNotice( "Jumping to " + targetPlayer->getName() + " in range." ); + targetPlayer->addCurrency( 1, param1 ); + pPlayer->sendNotice( "Added " + std::to_string( param1 ) + " Gil for " + targetPlayer->getName() ); break; } case GmCommand::Collect: { uint32_t gil = targetPlayer->getCurrency( 1 ); - if( gil < param1 ) + if ( gil < param1 ) { pPlayer->sendUrgent( "Player does not have enough Gil(" + std::to_string( gil ) + ")" ); } @@ -322,24 +338,29 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac } break; } - case GmCommand::Icon: + case GmCommand::QuestAccept: { - targetPlayer->setOnlineStatusMask( param1 ); - - GamePacketNew< FFXIVIpcSetOnlineStatus, ServerZoneIpcType > statusPacket( targetPlayer->getId() ); - statusPacket.data().onlineStatusFlags = param1; - queueOutPacket( statusPacket ); - - GamePacketNew< FFXIVIpcSetSearchInfo, ServerZoneIpcType > searchInfoPacket( targetPlayer->getId() ); - searchInfoPacket.data().onlineStatusFlags = param1; - searchInfoPacket.data().selectRegion = targetPlayer->getSearchSelectRegion(); - strcpy( searchInfoPacket.data().searchMessage, targetPlayer->getSearchMessage() ); - targetPlayer->queuePacket( searchInfoPacket ); - - targetPlayer->sendToInRangeSet( ActorControlPacket142( pPlayer->getId(), SetStatusIcon, - static_cast< uint8_t >( pPlayer->getOnlineStatus() ) ), - true ); - pPlayer->sendNotice( "Icon for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) ); + targetPlayer->updateQuest( param1, 1 ); + break; + } + case GmCommand::QuestCancel: + { + targetPlayer->removeQuest( param1 ); + break; + } + case GmCommand::QuestComplete: + { + targetPlayer->finishQuest( param1 ); + break; + } + case GmCommand::QuestIncomplete: + { + targetPlayer->unfinishQuest( param1 ); + break; + } + case GmCommand::QuestSequence: + { + targetPlayer->updateQuest( param1, param2 ); break; } case GmCommand::GC: @@ -357,28 +378,17 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac " was set to " + std::to_string( targetPlayer->getGcRankArray()[targetPlayer->getGc() - 1] ) ); break; } - case GmCommand::Inv: - { - if( targetActor->getInvincibilityType() == Common::InvincibilityType::InvincibilityRefill ) - targetActor->setInvincibilityType( Common::InvincibilityType::InvincibilityNone ); - else - targetActor->setInvincibilityType( Common::InvincibilityType::InvincibilityRefill ); - - pPlayer->sendNotice( "Invincibility for " + targetPlayer->getName() + - " was switched." ); - break; - } case GmCommand::Aetheryte: { - if( param1 == 0 ) + if ( param1 == 0 ) { - if( param2 == 0 ) + if ( param2 == 0 ) { - for( uint8_t i = 0; i < 255; i++ ) + for ( uint8_t i = 0; i < 255; i++ ) targetActor->getAsPlayer()->registerAetheryte( i ); - + pPlayer->sendNotice( "All Aetherytes for " + targetPlayer->getName() + - " were turned on." ); + " were turned on." ); } else { @@ -388,33 +398,46 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac } } - break; } - case GmCommand::Orchestrion: + case GmCommand::Teri: { - if( param1 == 1 ) + auto zoneInfo = g_zoneMgr.getZone( param1 ); + if ( !zoneInfo ) { - if( param2 == 0 ) - { - for( uint8_t i = 0; i < 255; i++ ) - targetActor->getAsPlayer()->learnSong( i, 0 ); - - pPlayer->sendNotice( "All Songs for " + targetPlayer->getName() + - " were turned on." ); - } - else - { - targetActor->getAsPlayer()->learnSong( param2, 0 ); - pPlayer->sendNotice( "Song " + std::to_string( param2 ) + " for " + targetPlayer->getName() + - " was turned on." ); - } + pPlayer->sendUrgent( "Invalid zone " + std::to_string( param1 ) ); + } + else + { + targetPlayer->setPosition( targetPlayer->getPos() ); + targetPlayer->performZoning( param1, targetPlayer->getPos(), 0 ); + pPlayer->sendNotice( targetPlayer->getName() + " was warped to zone " + std::to_string( param1 ) + " (" + zoneInfo->getName( ) + ")" ); } - - break; } + case GmCommand::TeriInfo: + { + pPlayer->sendNotice( "ZoneId: " + std::to_string( pPlayer->getZoneId() ) + "\nName: " + + pPlayer->getCurrentZone()->getName() + "\nInternalName: " + + pPlayer->getCurrentZone()->getInternalName() + "\nPopCount: " + + std::to_string( pPlayer->getCurrentZone()->getPopCount() ) + + "\nCurrentWeather:" + std::to_string( pPlayer->getCurrentZone()->getCurrentWeather() ) + + "\nNextWeather:" + std::to_string( pPlayer->getCurrentZone()->getNextWeather() ) ); + break; + } + case GmCommand::Jump: + { + auto inRange = pPlayer->getInRangeActors(); + for( auto actor : inRange ) + { + pPlayer->changePosition( targetActor->getPos().x, targetActor->getPos().y, targetActor->getPos().z, + targetActor->getRotation() ); + } + pPlayer->sendNotice( "Jumping to " + targetPlayer->getName() + " in range." ); + break; + } + default: pPlayer->sendUrgent( "GM1 Command not implemented: " + std::to_string( commandId ) ); break; @@ -454,6 +477,7 @@ void Core::Network::GameConnection::gm2Handler( const Packets::GamePacket& inPac if( !targetActor ) return; + auto targetPlayer = targetActor->getAsPlayer(); switch( commandId ) @@ -481,30 +505,6 @@ void Core::Network::GameConnection::gm2Handler( const Packets::GamePacket& inPac pPlayer->sendNotice( "Jumping to " + targetPlayer->getName() ); break; } - case GmCommand::Call: - { - if( targetPlayer->getZoneId() != pPlayer->getZoneId() ) - targetPlayer->setZone( pPlayer->getZoneId() ); - - targetPlayer->changePosition( pPlayer->getPos().x, pPlayer->getPos().y, pPlayer->getPos().z, - pPlayer->getRotation() ); - pPlayer->sendNotice( "Calling " + targetPlayer->getName() ); - break; - } - case GmCommand::Inspect: - { - pPlayer->sendNotice( "Name: " + targetPlayer->getName() + - "\nGil: " + std::to_string( targetPlayer->getCurrency( 1 ) ) + - "\nZone: " + targetPlayer->getCurrentZone()->getName() + - "(" + std::to_string( targetPlayer->getZoneId() ) + ")" + - "\nClass: " + std::to_string( static_cast< uint8_t >( targetPlayer->getClass() ) ) + - "\nLevel: " + std::to_string( targetPlayer->getLevel() ) + - "\nExp: " + std::to_string( targetPlayer->getExp() ) + - "\nSearchMessage: " + targetPlayer->getSearchMessage() + - "\nPlayTime: " + std::to_string( targetPlayer->getPlayTime() ) ); - break; - } - default: pPlayer->sendUrgent( "GM2 Command not implemented: " + std::to_string( commandId ) ); break; diff --git a/src/servers/Server_Zone/Network/PacketWrappers/UpdateHpMpTpPacket.h b/src/servers/Server_Zone/Network/PacketWrappers/UpdateHpMpTpPacket.h index 7a736da7..fb384453 100644 --- a/src/servers/Server_Zone/Network/PacketWrappers/UpdateHpMpTpPacket.h +++ b/src/servers/Server_Zone/Network/PacketWrappers/UpdateHpMpTpPacket.h @@ -3,6 +3,7 @@ #include #include "src/servers/Server_Zone/Forwards.h" +#include "Actor.h" namespace Core { namespace Network { From 313d315b75e9d6e8b5f6f326cf45d404f4ddb184 Mon Sep 17 00:00:00 2001 From: Maru Date: Tue, 21 Nov 2017 05:30:25 -0200 Subject: [PATCH 4/5] Update libraries --- src/libraries | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries b/src/libraries index c71860d7..2d0e1a96 160000 --- a/src/libraries +++ b/src/libraries @@ -1 +1 @@ -Subproject commit c71860d79596a93e5668169ac3f0309397c7218c +Subproject commit 2d0e1a962d13c8e07d1131789642e044eb489579 From e0d908621914571788647fa2ee41e7a3336c752b Mon Sep 17 00:00:00 2001 From: Maru Date: Tue, 21 Nov 2017 06:08:23 -0200 Subject: [PATCH 5/5] Fix build --- .../Server_Zone/Network/PacketWrappers/UpdateHpMpTpPacket.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/servers/Server_Zone/Network/PacketWrappers/UpdateHpMpTpPacket.h b/src/servers/Server_Zone/Network/PacketWrappers/UpdateHpMpTpPacket.h index fb384453..7494b1e7 100644 --- a/src/servers/Server_Zone/Network/PacketWrappers/UpdateHpMpTpPacket.h +++ b/src/servers/Server_Zone/Network/PacketWrappers/UpdateHpMpTpPacket.h @@ -2,8 +2,8 @@ #define _UPDATEHPMPTP_H #include +#include #include "src/servers/Server_Zone/Forwards.h" -#include "Actor.h" namespace Core { namespace Network {