diff --git a/scripts/chai/skill/cnj/skillDef_121.chai b/scripts/chai/skill/cnj/skillDef_121.chai index a3d56093..19749681 100644 --- a/scripts/chai/skill/cnj/skillDef_121.chai +++ b/scripts/chai/skill/cnj/skillDef_121.chai @@ -10,7 +10,7 @@ class skillDef_121Def def onFinish( player, target ) { - player.handleScriptSkill( STD_DAMAGE, 121, 5, 0, target ); + player.handleScriptSkill( STD_DAMAGE, 121, 50, 0, target ); target.addStatusEffectByIdIfNotExist(143, 20000, 0); } diff --git a/scripts/chai/skill/cnj/skillDef_125.chai b/scripts/chai/skill/cnj/skillDef_125.chai new file mode 100644 index 00000000..5adb4eca --- /dev/null +++ b/scripts/chai/skill/cnj/skillDef_125.chai @@ -0,0 +1,18 @@ +// Skill Name: Raise +// Skill ID: 125 + +class skillDef_125Def +{ + def skillDef_125Def() + { + + } + + def onFinish( player, target ) + { + target.addStatusEffectByIdIfNotExist( 148, 60000, 0 ); + } + +}; + +GLOBAL skillDef_125 = skillDef_125Def(); diff --git a/scripts/chai/skill/cnj/skillDef_132.chai b/scripts/chai/skill/cnj/skillDef_132.chai new file mode 100644 index 00000000..765f82a1 --- /dev/null +++ b/scripts/chai/skill/cnj/skillDef_132.chai @@ -0,0 +1,19 @@ +// Skill Name: Aero II +// Skill ID: 132 + +class skillDef_132Def +{ + def skillDef_132Def() + { + + } + + def onFinish( player, target ) + { + player.handleScriptSkill( STD_DAMAGE, 132, 50, 0, target ); + target.addStatusEffectByIdIfNotExist( 143, 20000, 0 ); + } + +}; + +GLOBAL skillDef_132 = skillDef_132Def(); diff --git a/scripts/chai/status/statusDef_143.chai b/scripts/chai/status/statusDef_143.chai index e797ef37..70a4d80a 100644 --- a/scripts/chai/status/statusDef_143.chai +++ b/scripts/chai/status/statusDef_143.chai @@ -1,4 +1,4 @@ -// Status Name: Wind +// Status Name: Aero // Status ID: 143 class statusDef_143Def diff --git a/scripts/chai/status/statusDef_144.chai b/scripts/chai/status/statusDef_144.chai new file mode 100644 index 00000000..72159c8d --- /dev/null +++ b/scripts/chai/status/statusDef_144.chai @@ -0,0 +1,18 @@ +// Status Name: Aero II +// Status ID: 144 + +class statusDef_144Def +{ + def statusDef_144Def() + { + + } + + def onTick( actor, effect ) + { + effect.registerTickEffect( 1, 50 ); + } + +}; + +GLOBAL statusDef_144 = statusDef_144Def(); diff --git a/src/servers/Server_Common/Common.h b/src/servers/Server_Common/Common.h index 75c1d5ae..954f08cc 100644 --- a/src/servers/Server_Common/Common.h +++ b/src/servers/Server_Common/Common.h @@ -114,6 +114,13 @@ namespace Core { FadeIn = 5, }; + enum struct ResurrectType : uint8_t + { + None = 0, + RaiseSpell = 5, + Return = 8 + }; + enum Tribe : uint8_t { Midlander = 1, diff --git a/src/servers/Server_Common/Util/UtilMath.cpp b/src/servers/Server_Common/Util/UtilMath.cpp index fe534f5f..680998d1 100644 --- a/src/servers/Server_Common/Util/UtilMath.cpp +++ b/src/servers/Server_Common/Util/UtilMath.cpp @@ -1,4 +1,4 @@ -#include +#include #include "UtilMath.h" float Core::Math::Util::distanceSq( float x, float y, float z, float x1, float y1, float z1 ) diff --git a/src/servers/Server_Zone/Action/ActionCast.cpp b/src/servers/Server_Zone/Action/ActionCast.cpp index 5c25d16e..968580a9 100644 --- a/src/servers/Server_Zone/Action/ActionCast.cpp +++ b/src/servers/Server_Zone/Action/ActionCast.cpp @@ -53,10 +53,10 @@ void Core::Action::ActionCast::onStart() castPacket.data().action_id = m_id; castPacket.data().unknown = 1; - castPacket.data().cast_time = m_castTime; + castPacket.data().cast_time = m_castTime / 1000; // This is used for the cast bar above the target bar of the caster. castPacket.data().target_id = m_pTarget->getId(); - m_pSource->sendToInRangeSet( castPacket, true ); + m_pSource->sendToInRangeSet( castPacket, false ); m_pSource->getAsPlayer()->setStateFlag( PlayerStateFlag::Casting ); m_pSource->getAsPlayer()->sendStateFlags(); diff --git a/src/servers/Server_Zone/Actor/Actor.cpp b/src/servers/Server_Zone/Actor/Actor.cpp index cfc75249..6a3d45e3 100644 --- a/src/servers/Server_Zone/Actor/Actor.cpp +++ b/src/servers/Server_Zone/Actor/Actor.cpp @@ -216,7 +216,7 @@ void Core::Entity::Actor::die() // if the actor is a player, the update needs to be send to himself too bool selfNeedsUpdate = isPlayer(); - sendToInRangeSet( ActorControlPacket142( m_id, SetStatus, static_cast< uint8_t>( ActorStatus::Dead ) ), selfNeedsUpdate ); + sendToInRangeSet( ActorControlPacket142( m_id, SetStatus, static_cast< uint8_t >( ActorStatus::Dead ) ), selfNeedsUpdate ); // TODO: not all actor show the death animation when they die, some quest npcs might just despawn // although that might be handled by setting the HP to 1 and doing some script magic diff --git a/src/servers/Server_Zone/Actor/BattleNpc.cpp b/src/servers/Server_Zone/Actor/BattleNpc.cpp index 618d5695..436e072f 100644 --- a/src/servers/Server_Zone/Actor/BattleNpc.cpp +++ b/src/servers/Server_Zone/Actor/BattleNpc.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include diff --git a/src/servers/Server_Zone/Actor/CalcBattle.cpp b/src/servers/Server_Zone/Actor/CalcBattle.cpp index 772e59f1..1ead6ed5 100644 --- a/src/servers/Server_Zone/Actor/CalcBattle.cpp +++ b/src/servers/Server_Zone/Actor/CalcBattle.cpp @@ -3,6 +3,7 @@ #include "CalcBattle.h" #include "Actor.h" #include "Player.h" +#include using namespace Core::Entity; diff --git a/src/servers/Server_Zone/Actor/Player.cpp b/src/servers/Server_Zone/Actor/Player.cpp index f4899997..82ce786a 100644 --- a/src/servers/Server_Zone/Actor/Player.cpp +++ b/src/servers/Server_Zone/Actor/Player.cpp @@ -1516,10 +1516,11 @@ void Core::Entity::Player::handleScriptSkill( uint32_t type, uint32_t actionId, case Core::Common::HandleSkillType::StdDamage: { sendDebug( "STD_DAMAGE" ); + GamePacketNew< FFXIVIpcEffect, ServerZoneIpcType > effectPacket( getId() ); effectPacket.data().targetId = pTarget.getId(); effectPacket.data().actionAnimationId = actionId; - effectPacket.data().unknown_2 = 0; + effectPacket.data().unknown_2 = 1; // This seems to have an effect on the "double-cast finish" animation // effectPacket.data().unknown_3 = 1; effectPacket.data().actionTextId = actionId; effectPacket.data().numEffects = 1; @@ -1532,6 +1533,9 @@ void Core::Entity::Player::handleScriptSkill( uint32_t type, uint32_t actionId, sendToInRangeSet( effectPacket, true ); + if ( !pTarget.isAlive() ) + break; + pTarget.takeDamage( param1 ); pTarget.onActionHostile( shared_from_this() ); break; @@ -1546,7 +1550,7 @@ void Core::Entity::Player::handleScriptSkill( uint32_t type, uint32_t actionId, GamePacketNew< FFXIVIpcEffect, ServerZoneIpcType > effectPacket( getId() ); effectPacket.data().targetId = pTarget.getId(); effectPacket.data().actionAnimationId = actionId; - effectPacket.data().unknown_2 = 0; + effectPacket.data().unknown_2 = 1; // This seems to have an effect on the "double-cast finish" animation // effectPacket.data().unknown_3 = 1; effectPacket.data().actionTextId = actionId; effectPacket.data().numEffects = 1; @@ -1559,6 +1563,9 @@ void Core::Entity::Player::handleScriptSkill( uint32_t type, uint32_t actionId, sendToInRangeSet( effectPacket, true ); + if ( !pTarget.isAlive() ) + break; + pTarget.heal( calculatedHeal ); break; } diff --git a/src/servers/Server_Zone/Network/Handlers/ActionHandler.cpp b/src/servers/Server_Zone/Network/Handlers/ActionHandler.cpp index 21efdb93..91be50ea 100644 --- a/src/servers/Server_Zone/Network/Handlers/ActionHandler.cpp +++ b/src/servers/Server_Zone/Network/Handlers/ActionHandler.cpp @@ -128,8 +128,19 @@ void Core::Network::GameConnection::actionHandler( const Packets::GamePacket& in } case 0xC8: // return dead { - pPlayer->returnToHomepoint(); - break; + switch ( static_cast < ResurrectType >( param1 ) ) + { + case ResurrectType::RaiseSpell: + // todo: handle raise case (set position to raiser, apply weakness status, set hp/mp/tp as well as packet) + pPlayer->returnToHomepoint(); + break; + case ResurrectType::Return: + pPlayer->returnToHomepoint(); + break; + default: + break; + } + } case 0xC9: // Finish zoning { diff --git a/src/servers/Server_Zone/StatusEffect/StatusEffectContainer.cpp b/src/servers/Server_Zone/StatusEffect/StatusEffectContainer.cpp index ba5d7860..3feea268 100644 --- a/src/servers/Server_Zone/StatusEffect/StatusEffectContainer.cpp +++ b/src/servers/Server_Zone/StatusEffect/StatusEffectContainer.cpp @@ -116,7 +116,7 @@ void Core::StatusEffect::StatusEffectContainer::sendUpdate() slot++; } - bool sendToSelf = m_pOwner->isPlayer() ? true : false; + bool sendToSelf = m_pOwner->isPlayer(); m_pOwner->sendToInRangeSet( statusEffectList, sendToSelf ); }