1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-27 14:57:44 +00:00

Map actions as pointers; Prototype AoE healing;

This commit is contained in:
Maru 2017-09-18 19:07:41 -03:00
parent d12db28951
commit f5f8acb774
7 changed files with 81 additions and 31 deletions

View file

@ -0,0 +1,18 @@
// Skill Name: Medica
// Skill ID: 124
class skillDef_124Def
{
def skillDef_124Def()
{
}
def onFinish( player, target )
{
player.handleScriptSkill( STD_HEAL, 124, 300, 0, player );
}
};
GLOBAL skillDef_124 = skillDef_124Def();

View file

@ -315,8 +315,7 @@ bool Core::Data::ExdData::loadActionInfo()
for( auto row : rows ) for( auto row : rows )
{ {
auto& fields = row.second; auto& fields = row.second;
auto info = boost::make_shared< ActionInfo >();
ActionInfo info{ 0 };
uint32_t id = row.first; uint32_t id = row.first;
if( id == 0 ) if( id == 0 )
@ -350,7 +349,7 @@ bool Core::Data::ExdData::loadActionInfo()
uint16_t recast_time = getField< uint16_t >( fields, 37 ); // 37 uint16_t recast_time = getField< uint16_t >( fields, 37 ); // 37
int8_t model = getField< int8_t >( fields, 39 ); // 39: Action model int8_t model = getField< int8_t >( fields, 39 ); // 39: Action model
uint8_t aspect = getField< uint8_t >( fields, 40 ); // 40: Action aspect uint8_t aspect = getField< uint8_t >( fields, 40 ); // 40: Action aspect
uint8_t typeshift = 0x6; uint8_t typeshift = 0x6;
uint8_t mask = 1 << typeshift; uint8_t mask = 1 << typeshift;
@ -360,36 +359,36 @@ bool Core::Data::ExdData::loadActionInfo()
info.id = id; info->id = id;
info.name = name; info->name = name;
info.category = category; info->category = category;
info.class_job = class_job; info->class_job = class_job;
info.unlock_level = unlock_level; info->unlock_level = unlock_level;
info.range = range; info->range = range;
info.can_target_self = can_target_self; info->can_target_self = can_target_self;
info.can_target_party = can_target_party; info->can_target_party = can_target_party;
info.can_target_friendly = can_target_friendly; info->can_target_friendly = can_target_friendly;
info.can_target_enemy = can_target_enemy; info->can_target_enemy = can_target_enemy;
info.can_target_ko = can_target_ko; info->can_target_ko = can_target_ko;
info.is_aoe = is_aoe; info->is_aoe = is_aoe;
info.aoe_type = aoe_type; info->aoe_type = aoe_type;
info.radius = radius; info->radius = radius;
info.points_type = points_type; info->points_type = points_type;
info.points_cost = points_cost; info->points_cost = points_cost;
info.is_instant = is_instant; info->is_instant = is_instant;
info.cast_time = cast_time * 100; info->cast_time = cast_time * 100;
info.recast_time = recast_time * 100; info->recast_time = recast_time * 100;
info.model = model; info->model = model;
info.aspect = aspect; info->aspect = aspect;
m_actionInfoMap[id] = info; m_actionInfoMap.emplace( std::make_pair( info->id, info ) );
} }
@ -464,6 +463,22 @@ boost::shared_ptr< Core::Data::AetheryteInfo >
} }
boost::shared_ptr< Core::Data::ActionInfo >
Core::Data::ExdData::getActionInfo( uint32_t actionId )
{
try
{
return m_actionInfoMap[actionId];
}
catch ( ... )
{
return nullptr;
}
return nullptr;
}
boost::shared_ptr< Core::Data::CustomTalkInfo > boost::shared_ptr< Core::Data::CustomTalkInfo >
Core::Data::ExdData::getCustomTalkInfo( uint32_t customTalkId ) Core::Data::ExdData::getCustomTalkInfo( uint32_t customTalkId )
{ {

View file

@ -299,7 +299,7 @@ namespace Core {
std::map<uint8_t, ClassJobInfo> m_classJobInfoMap; std::map<uint8_t, ClassJobInfo> m_classJobInfoMap;
std::map<uint32_t, ParamGrowthInfo> m_paramGrowthInfoMap; std::map<uint32_t, ParamGrowthInfo> m_paramGrowthInfoMap;
std::map<uint16_t, EventActionInfo> m_EventActionInfoMap; std::map<uint16_t, EventActionInfo> m_EventActionInfoMap;
std::map<uint16_t, ActionInfo> m_actionInfoMap; std::map<uint16_t, boost::shared_ptr< ActionInfo > > m_actionInfoMap;
std::map<uint16_t, StatusEffectInfo> m_statusEffectInfoMap; std::map<uint16_t, StatusEffectInfo> m_statusEffectInfoMap;
std::map<uint32_t, boost::shared_ptr< AetheryteInfo > > m_aetheryteInfoMap; std::map<uint32_t, boost::shared_ptr< AetheryteInfo > > m_aetheryteInfoMap;
std::map<uint32_t, TribeInfo > m_tribeInfoMap; std::map<uint32_t, TribeInfo > m_tribeInfoMap;
@ -317,6 +317,7 @@ namespace Core {
boost::shared_ptr< OpeningInfo > getOpeningInfo( uint32_t openingId ); boost::shared_ptr< OpeningInfo > getOpeningInfo( uint32_t openingId );
boost::shared_ptr< CustomTalkInfo > getCustomTalkInfo( uint32_t customTalkId ); boost::shared_ptr< CustomTalkInfo > getCustomTalkInfo( uint32_t customTalkId );
boost::shared_ptr< AetheryteInfo > getAetheryteInfo( uint32_t aetheryteId ); boost::shared_ptr< AetheryteInfo > getAetheryteInfo( uint32_t aetheryteId );
boost::shared_ptr< ActionInfo > getActionInfo( uint32_t actionId );
boost::shared_ptr< PlaceNameInfo > getPlaceNameInfo( uint32_t placeNameId ); boost::shared_ptr< PlaceNameInfo > getPlaceNameInfo( uint32_t placeNameId );
boost::shared_ptr< ItemInfo > getItemInfo( uint32_t catalogId ); boost::shared_ptr< ItemInfo > getItemInfo( uint32_t catalogId );
boost::shared_ptr< RaceInfo > getRaceInfo( uint32_t raceId ); boost::shared_ptr< RaceInfo > getRaceInfo( uint32_t raceId );

View file

@ -31,7 +31,7 @@ Core::Action::ActionCast::ActionCast( Entity::ActorPtr pActor, Entity::ActorPtr
m_startTime = 0; m_startTime = 0;
m_id = actionId; m_id = actionId;
m_handleActionType = HandleActionType::Spell; m_handleActionType = HandleActionType::Spell;
m_castTime = g_exdData.m_actionInfoMap[actionId].cast_time; // TODO: Add security checks. m_castTime = g_exdData.getActionInfo( actionId )->cast_time; // TODO: Add security checks.
m_pSource = pActor; m_pSource = pActor;
m_pTarget = pTarget; m_pTarget = pTarget;
m_bInterrupt = false; m_bInterrupt = false;

View file

@ -26,7 +26,7 @@ Core::Action::ActionTeleport::ActionTeleport( Entity::ActorPtr pActor, uint16_t
m_startTime = 0; m_startTime = 0;
m_id = 5; m_id = 5;
m_handleActionType = HandleActionType::Teleport; m_handleActionType = HandleActionType::Teleport;
m_castTime = g_exdData.m_actionInfoMap[5].cast_time; // TODO: Add security checks. m_castTime = g_exdData.getActionInfo(5)->cast_time; // TODO: Add security checks.
m_pSource = pActor; m_pSource = pActor;
m_bInterrupt = false; m_bInterrupt = false;
m_targetAetheryte = targetZone; m_targetAetheryte = targetZone;

View file

@ -980,10 +980,11 @@ const uint8_t * Core::Entity::Player::getStateFlags() const
bool Core::Entity::Player::actionHasCastTime( uint32_t actionId ) //TODO: Add logic for special cases bool Core::Entity::Player::actionHasCastTime( uint32_t actionId ) //TODO: Add logic for special cases
{ {
if( g_exdData.m_actionInfoMap[actionId].is_instant ) auto actionInfoPtr = g_exdData.getActionInfo( actionId );
if( actionInfoPtr->is_instant )
return false; return false;
if( g_exdData.m_actionInfoMap[actionId].cast_time == 0 ) if( actionInfoPtr->cast_time == 0 )
return false; return false;
return true; return true;
@ -1518,6 +1519,9 @@ void Core::Entity::Player::handleScriptSkill( uint32_t type, uint32_t actionId,
sendDebug( std::to_string( pTarget.getId() ) ); sendDebug( std::to_string( pTarget.getId() ) );
sendDebug( "Handle script skill type: " + std::to_string( type ) ); sendDebug( "Handle script skill type: " + std::to_string( type ) );
auto actionInfoPtr = g_exdData.getActionInfo( actionId );
switch( type ) switch( type )
{ {
@ -1574,6 +1578,18 @@ void Core::Entity::Player::handleScriptSkill( uint32_t type, uint32_t actionId,
if ( !pTarget.isAlive() ) if ( !pTarget.isAlive() )
break; break;
// todo: on AoE, send effect to heal all affected actors instead of just the caster
// this includes: calculating heal for every single actor. meaning we'd need to two-step the base heal from actor, and the value received
if ( actionInfoPtr->is_aoe )
{
for ( auto pCurAct : m_inRangePlayers )
{
assert( pCurAct );
pCurAct->heal( calculatedHeal );
}
}
pTarget.heal( calculatedHeal ); pTarget.heal( calculatedHeal );
break; break;
} }

View file

@ -52,7 +52,7 @@ void Core::Network::GameConnection::skillHandler( const Packets::GamePacket& inP
std::string actionIdStr = boost::str( boost::format( "%|04X|" ) % action ); std::string actionIdStr = boost::str( boost::format( "%|04X|" ) % action );
pPlayer->sendDebug( "---------------------------------------" ); pPlayer->sendDebug( "---------------------------------------" );
pPlayer->sendDebug( "ActionHandler ( " + actionIdStr + " | " + pPlayer->sendDebug( "ActionHandler ( " + actionIdStr + " | " +
g_exdData.m_actionInfoMap[action].name + g_exdData.getActionInfo( action )->name +
" | " + std::to_string( targetId ) + " )" ); " | " + std::to_string( targetId ) + " )" );
pPlayer->queuePacket( ActorControlPacket142( pPlayer->getId(), ActorControlType::ActionStart, 0x01, action ) ); pPlayer->queuePacket( ActorControlPacket142( pPlayer->getId(), ActorControlType::ActionStart, 0x01, action ) );