From c53fc16ead6e3f8d83574f1148e74fbfde62bdcd Mon Sep 17 00:00:00 2001 From: Maru Date: Wed, 4 Oct 2017 16:13:11 -0300 Subject: [PATCH 1/7] State in player spawn reflects actual player state; --- .../Server_Zone/Network/PacketWrappers/PlayerSpawnPacket.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/servers/Server_Zone/Network/PacketWrappers/PlayerSpawnPacket.h b/src/servers/Server_Zone/Network/PacketWrappers/PlayerSpawnPacket.h index 5bd39a09..2f7e5a81 100644 --- a/src/servers/Server_Zone/Network/PacketWrappers/PlayerSpawnPacket.h +++ b/src/servers/Server_Zone/Network/PacketWrappers/PlayerSpawnPacket.h @@ -70,7 +70,7 @@ namespace Server { //m_data.u23 = 0x04; //m_data.u24 = 256; - m_data.state = 1; + m_data.state = (pPlayer->getHp() > 0) ? 1 : 2; m_data.type = 1; if( pTarget == pPlayer ) { From 1aeebebde79ab6fb15d83fd2cd44987bf79faad7 Mon Sep 17 00:00:00 2001 From: Maru Date: Wed, 4 Oct 2017 16:47:28 -0300 Subject: [PATCH 2/7] Ugh --- .../Server_Zone/Network/PacketWrappers/PlayerSpawnPacket.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/servers/Server_Zone/Network/PacketWrappers/PlayerSpawnPacket.h b/src/servers/Server_Zone/Network/PacketWrappers/PlayerSpawnPacket.h index 2f7e5a81..c4be1206 100644 --- a/src/servers/Server_Zone/Network/PacketWrappers/PlayerSpawnPacket.h +++ b/src/servers/Server_Zone/Network/PacketWrappers/PlayerSpawnPacket.h @@ -70,7 +70,7 @@ namespace Server { //m_data.u23 = 0x04; //m_data.u24 = 256; - m_data.state = (pPlayer->getHp() > 0) ? 1 : 2; + m_data.state = static_cast< uint8_t >( pPlayer->getStatus() ); m_data.type = 1; if( pTarget == pPlayer ) { From f701f6bd0a04e188c0ecba550a54b86573bab017 Mon Sep 17 00:00:00 2001 From: Maru Date: Wed, 4 Oct 2017 21:16:10 -0300 Subject: [PATCH 3/7] Fix wrong hPCurr/hPMax on PlayerSpawn; --- .../Server_Common/Network/PacketDef/Zone/ServerZoneDef.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h b/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h index 10a34cd0..a9c5905f 100644 --- a/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/servers/Server_Common/Network/PacketDef/Zone/ServerZoneDef.h @@ -368,8 +368,8 @@ struct FFXIVIpcPlayerSpawn : FFXIVIpcBasePacket uint32_t u20; uint32_t ownerId; uint32_t u22; - uint32_t hPCurr; uint32_t hPMax; + uint32_t hPCurr; uint32_t displayFlags; uint16_t fateID; uint16_t mPCurr; From a4c19198d5d5445ff1b6323f6728f0c35cab5a2b Mon Sep 17 00:00:00 2001 From: Maru Date: Wed, 4 Oct 2017 22:04:42 -0300 Subject: [PATCH 4/7] Fix crash when spamming cast action and cast interrupt (esc) while walking (null deref); --- src/servers/Server_Zone/Network/Handlers/ActionHandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/servers/Server_Zone/Network/Handlers/ActionHandler.cpp b/src/servers/Server_Zone/Network/Handlers/ActionHandler.cpp index 01f2e024..09d76e94 100644 --- a/src/servers/Server_Zone/Network/Handlers/ActionHandler.cpp +++ b/src/servers/Server_Zone/Network/Handlers/ActionHandler.cpp @@ -114,7 +114,7 @@ void Core::Network::GameConnection::actionHandler( const Packets::GamePacket& in } case 0x69: // Cancel cast { - if( pPlayer->checkAction() ) + if( pPlayer->getCurrentAction() != nullptr ) pPlayer->getCurrentAction()->setInterrupted(); break; } From 961390ab629977362e79bd9ec62763b1fe2f20ee Mon Sep 17 00:00:00 2001 From: Maru Date: Wed, 4 Oct 2017 22:50:11 -0300 Subject: [PATCH 5/7] Fix issue with aggro when mob dies instantly from skill; Align cast interrupt packet with retail; --- src/servers/Server_Zone/Action/ActionCast.cpp | 6 +++++- src/servers/Server_Zone/Actor/Actor.cpp | 13 ++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/servers/Server_Zone/Action/ActionCast.cpp b/src/servers/Server_Zone/Action/ActionCast.cpp index df132950..a28125c7 100644 --- a/src/servers/Server_Zone/Action/ActionCast.cpp +++ b/src/servers/Server_Zone/Action/ActionCast.cpp @@ -92,7 +92,11 @@ void Core::Action::ActionCast::onInterrupt() m_pSource->getAsPlayer()->sendStateFlags(); auto control = ActorControlPacket142( m_pSource->getId(), ActorControlType::CastInterrupt, - 0x219, 1, m_id, 1 ); + 0x219, 1, m_id, 0 ); + + // Note: When cast interrupt from taking too much damage, set the last value to 1. This enables the cast interrupt effect. Example: + // auto control = ActorControlPacket142( m_pSource->getId(), ActorControlType::CastInterrupt, 0x219, 1, m_id, 0 ); + m_pSource->sendToInRangeSet( control, true ); } diff --git a/src/servers/Server_Zone/Actor/Actor.cpp b/src/servers/Server_Zone/Actor/Actor.cpp index 977cdd6e..33f20c6b 100644 --- a/src/servers/Server_Zone/Actor/Actor.cpp +++ b/src/servers/Server_Zone/Actor/Actor.cpp @@ -696,9 +696,13 @@ void Core::Entity::Actor::handleScriptSkill( uint32_t type, uint32_t actionId, u if ( isPlayer() && !ActionCollision::isActorApplicable( pTarget.shared_from_this(), TargetFilter::Enemies ) ) break; - pTarget.takeDamage( static_cast< uint32_t >( param1 ) ); - pTarget.onActionHostile( shared_from_this() ); sendToInRangeSet( effectPacket, true ); + + pTarget.takeDamage( static_cast< uint32_t >( param1 ) ); + + if ( pTarget.isAlive() ) + pTarget.onActionHostile( shared_from_this() ); + } else { @@ -711,8 +715,11 @@ void Core::Entity::Actor::handleScriptSkill( uint32_t type, uint32_t actionId, u effectPacket.data().effectTarget = pHitActor->getId(); sendToInRangeSet( effectPacket, true ); // todo: send to range of what? ourselves? when mob script hits this is going to be lacking + pHitActor->takeDamage( static_cast< uint32_t >( param1 ) ); - pHitActor->onActionHostile( shared_from_this() ); + + if( pHitActor->isAlive() ) + pHitActor->onActionHostile( shared_from_this() ); // Debug if ( isPlayer() ) From 6dece1af8c0802d7210432a57605057b598e08fb Mon Sep 17 00:00:00 2001 From: Maru Date: Wed, 4 Oct 2017 23:19:38 -0300 Subject: [PATCH 6/7] Player title prototype; --- src/servers/Server_Zone/Actor/Player.cpp | 6 ++++++ src/servers/Server_Zone/Actor/Player.h | 3 +++ .../Server_Zone/DebugCommand/DebugCommandHandler.cpp | 7 +++++++ 3 files changed, 16 insertions(+) diff --git a/src/servers/Server_Zone/Actor/Player.cpp b/src/servers/Server_Zone/Actor/Player.cpp index 54b7270e..17f9e451 100644 --- a/src/servers/Server_Zone/Actor/Player.cpp +++ b/src/servers/Server_Zone/Actor/Player.cpp @@ -1415,6 +1415,12 @@ void Core::Entity::Player::setIsLogin( bool bIsLogin ) m_bIsLogin = bIsLogin; } +void Core::Entity::Player::setTitle( uint8_t titleId ) +{ + m_title = titleId; + sendToInRangeSet( ActorControlPacket142( getId(), SetTitle, titleId ), true ); +} + void Core::Entity::Player::autoAttack( ActorPtr pTarget ) { diff --git a/src/servers/Server_Zone/Actor/Player.h b/src/servers/Server_Zone/Actor/Player.h index 1001251a..da654a4d 100644 --- a/src/servers/Server_Zone/Actor/Player.h +++ b/src/servers/Server_Zone/Actor/Player.h @@ -328,6 +328,8 @@ public: void teleport( uint16_t aetheryteId, uint8_t type = 1 ); /*! prepares zoning / fades out the screen */ void prepareZoning( uint16_t targetZone, bool fadeOut, uint8_t fadoutTime = 0, uint16_t animation = 0 ); + /*! change player's title */ + void setTitle( uint8_t titleId ); void calculateStats() override; void sendStats(); @@ -565,6 +567,7 @@ private: uint8_t status; } m_retainerInfo[8]; + uint8_t m_title; uint8_t m_titleList[32]; uint8_t m_achievement[16]; uint8_t m_howTo[33]; diff --git a/src/servers/Server_Zone/DebugCommand/DebugCommandHandler.cpp b/src/servers/Server_Zone/DebugCommand/DebugCommandHandler.cpp index a9669cef..acfbad2c 100644 --- a/src/servers/Server_Zone/DebugCommand/DebugCommandHandler.cpp +++ b/src/servers/Server_Zone/DebugCommand/DebugCommandHandler.cpp @@ -257,6 +257,13 @@ void Core::DebugCommandHandler::set( char * data, Core::Entity::PlayerPtr pPlaye pPlayer->sendModel(); pPlayer->sendDebug( "Model updated" ); } + else if ( subCommand == "title" ) + { + uint32_t titleId; + sscanf( params.c_str(), "%d", &titleId ); + + pPlayer->setTitle( titleId ); + } else { pPlayer->sendUrgent( subCommand + " is not a valid SET command." ); From 893e78d16bff1346e6d86113b1812161cd0d7d9c Mon Sep 17 00:00:00 2001 From: Maru Date: Wed, 4 Oct 2017 23:30:45 -0300 Subject: [PATCH 7/7] Bigger than expected; --- src/servers/Server_Zone/Actor/Player.cpp | 2 +- src/servers/Server_Zone/Actor/Player.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/servers/Server_Zone/Actor/Player.cpp b/src/servers/Server_Zone/Actor/Player.cpp index 17f9e451..cd4b0c68 100644 --- a/src/servers/Server_Zone/Actor/Player.cpp +++ b/src/servers/Server_Zone/Actor/Player.cpp @@ -1415,7 +1415,7 @@ void Core::Entity::Player::setIsLogin( bool bIsLogin ) m_bIsLogin = bIsLogin; } -void Core::Entity::Player::setTitle( uint8_t titleId ) +void Core::Entity::Player::setTitle( uint16_t titleId ) { m_title = titleId; sendToInRangeSet( ActorControlPacket142( getId(), SetTitle, titleId ), true ); diff --git a/src/servers/Server_Zone/Actor/Player.h b/src/servers/Server_Zone/Actor/Player.h index da654a4d..f64c1d75 100644 --- a/src/servers/Server_Zone/Actor/Player.h +++ b/src/servers/Server_Zone/Actor/Player.h @@ -329,7 +329,7 @@ public: /*! prepares zoning / fades out the screen */ void prepareZoning( uint16_t targetZone, bool fadeOut, uint8_t fadoutTime = 0, uint16_t animation = 0 ); /*! change player's title */ - void setTitle( uint8_t titleId ); + void setTitle( uint16_t titleId ); void calculateStats() override; void sendStats(); @@ -567,8 +567,8 @@ private: uint8_t status; } m_retainerInfo[8]; - uint8_t m_title; - uint8_t m_titleList[32]; + uint16_t m_title; + uint16_t m_titleList[32]; uint8_t m_achievement[16]; uint8_t m_howTo[33]; uint8_t m_homePoint;