Exemplo n.º 1
0
CAbilityState::CAbilityState(CBattleEntity* PEntity, uint16 targid, uint16 abilityid) :
    CState(PEntity, targid),
    m_PEntity(PEntity)
{
    CAbility* PAbility = ability::GetAbility(abilityid);

    if (!PAbility)
    {
        throw CStateInitException(std::make_unique<CMessageBasicPacket>(m_PEntity, m_PEntity, 0, 0, MSGBASIC_UNABLE_TO_USE_JA));
    }
    auto PTarget = m_PEntity->IsValidTarget(m_targid, PAbility->getValidTarget(), m_errorMsg);

    if (!PTarget || m_errorMsg)
    {
        throw CStateInitException(std::move(m_errorMsg));
    }
    SetTarget(PTarget->targid);
    m_PAbility = std::make_unique<CAbility>(*PAbility);
    m_castTime = PAbility->getCastTime();
    if (m_castTime > 0s)
    {
        action_t action;
        action.id = PEntity->id;
        action.actiontype = ACTION_WEAPONSKILL_START;
        auto& list = action.getNewActionList();
        list.ActionTargetID = PTarget->id;
        auto& actionTarget = list.getNewActionTarget();
        actionTarget.reaction = (REACTION)24;
        actionTarget.animation = 121;
        actionTarget.messageID = 326;
        actionTarget.param = PAbility->getID() + 16;
        PEntity->loc.zone->PushPacket(PEntity, CHAR_INRANGE_SELF, new CActionPacket(action));
    }
    m_PEntity->PAI->EventHandler.triggerListener("ABILITY_START", m_PEntity, PAbility);
}
Exemplo n.º 2
0
    void LoadAbilitiesList()
    {
        // TODO: добавить поле message в таблицу

        memset(PAbilityList, 0, sizeof(PAbilityList));

        const int8* Query =
            "SELECT "
            "abilityId,"
            "IFNULL(min_id,0),"
            "name,"
            "job,"
            "level,"
            "validTarget,"
            "recastTime,"
            "message1, "
            "message2, "
            "animation,"
            "animationTime,"
            "castTime,"
            "actionType,"
            "`range`,"
            "isAOE,"
            "recastId,"
            "CE,"
            "VE, "
            "meritModID, "
            "addType, "
            "required_expansion "
            "FROM abilities LEFT JOIN (SELECT mob_skill_name, MIN(mob_skill_id) AS min_id "
            "FROM mob_skills GROUP BY mob_skill_name) mob_skills_1 ON "
            "abilities.name = mob_skills_1.mob_skill_name "
            "WHERE job < %u AND abilityId < %u "
            "ORDER BY job, level ASC";

        int32 ret = Sql_Query(SqlHandle, Query, MAX_JOBTYPE, MAX_ABILITY_ID);

        if (ret != SQL_ERROR && Sql_NumRows(SqlHandle) != 0)
        {
            while (Sql_NextRow(SqlHandle) == SQL_SUCCESS)
            {
                int8* expansionCode;
                Sql_GetData(SqlHandle, 20, &expansionCode, nullptr);

                if (luautils::IsExpansionEnabled(expansionCode) == false) {
                    continue;
                }

                CAbility* PAbility = new CAbility(Sql_GetIntData(SqlHandle, 0));

                PAbility->setMobSkillID(Sql_GetIntData(SqlHandle, 1));
                PAbility->setName(Sql_GetData(SqlHandle, 2));
                PAbility->setJob((JOBTYPE)Sql_GetIntData(SqlHandle, 3));
                PAbility->setLevel(Sql_GetIntData(SqlHandle, 4));
                PAbility->setValidTarget(Sql_GetIntData(SqlHandle, 5));
                PAbility->setRecastTime(Sql_GetIntData(SqlHandle, 6));
                PAbility->setMessage(Sql_GetIntData(SqlHandle, 7));
                //PAbility->setMessage(Sql_GetIntData(SqlHandle,8));
                PAbility->setAnimationID(Sql_GetIntData(SqlHandle, 9));
                PAbility->setAnimationTime(std::chrono::milliseconds(Sql_GetIntData(SqlHandle, 10)));
                PAbility->setCastTime(std::chrono::milliseconds(Sql_GetIntData(SqlHandle, 11)));
                PAbility->setActionType(static_cast<ACTIONTYPE>(Sql_GetUIntData(SqlHandle, 12)));
                PAbility->setRange(Sql_GetFloatData(SqlHandle, 13));
                PAbility->setAOE(Sql_GetIntData(SqlHandle, 14));
                PAbility->setRecastId(Sql_GetIntData(SqlHandle, 15));
                PAbility->setCE(Sql_GetIntData(SqlHandle, 16));
                PAbility->setVE(Sql_GetIntData(SqlHandle, 17));
                PAbility->setMeritModID(Sql_GetIntData(SqlHandle, 18));
                PAbility->setAddType(Sql_GetUIntData(SqlHandle, 19));

                PAbilityList[PAbility->getID()] = PAbility;
                PAbilitiesList[PAbility->getJob()].push_back(PAbility);
            }
        }

        const int8* Query2 = "SELECT recastId, job, level, maxCharges, chargeTime, meritModId FROM abilities_charges ORDER BY job, level ASC;";

        ret = Sql_Query(SqlHandle, Query2);

        if (ret != SQL_ERROR && Sql_NumRows(SqlHandle) != 0)
        {
            while (Sql_NextRow(SqlHandle) == SQL_SUCCESS)
            {
                Charge_t* PCharge = new Charge_t;
                PCharge->ID = Sql_GetUIntData(SqlHandle, 0);
                PCharge->job = (JOBTYPE)Sql_GetUIntData(SqlHandle, 1);
                PCharge->level = Sql_GetUIntData(SqlHandle, 2);
                PCharge->maxCharges = Sql_GetUIntData(SqlHandle, 3);
                PCharge->chargeTime = Sql_GetUIntData(SqlHandle, 4);
                PCharge->merit = Sql_GetUIntData(SqlHandle, 5);

                PChargesList.push_back(PCharge);
            }
        }
    }