Advertisement
Guest User

Untitled

a guest
Jul 21st, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.47 KB | None | 0 0
  1. TuT:
  2. // In char_skill.cpp #ifdef __PARTY_BUFF__ hinzufügen und den define in service.h/CommonDefines.h hinzufügen
  3.  
  4. bool CHARACTER::UseSkill(DWORD dwVnum, LPCHARACTER pkVictim, bool bUseGrandMaster)
  5. {
  6.     if (false == CanUseSkill(dwVnum))
  7.         return false;
  8.  
  9.     // NO_GRANDMASTER
  10.     if (test_server)
  11.     {
  12.         if (quest::CQuestManager::instance().GetEventFlag("no_grand_master"))
  13.         {
  14.             bUseGrandMaster = false;
  15.         }
  16.     }
  17.     // END_OF_NO_GRANDMASTER
  18.  
  19.     if (g_bSkillDisable)
  20.         return false;
  21.  
  22.     if (IsObserverMode())
  23.         return false;
  24.  
  25.     if (!CanMove())
  26.         return false;
  27.  
  28.     if (IsPolymorphed())
  29.         return false;
  30.  
  31.     const bool bCanUseHorseSkill = CanUseHorseSkill();
  32.  
  33.  
  34.     if (dwVnum == SKILL_HORSE_SUMMON)
  35.     {
  36.         if (GetSkillLevel(dwVnum) == 0)
  37.             return false;
  38.  
  39.         if (GetHorseLevel() <= 0)
  40.             ChatPacket(CHAT_TYPE_INFO, LC_TEXT_LANGUAGE(GetLanguage(),"말이 없습니다. 마굿간 경비병을 찾아가세요."));
  41.         else
  42.             ChatPacket(CHAT_TYPE_INFO, LC_TEXT_LANGUAGE(GetLanguage(),"말 소환 아이템을 사용하세요."));
  43.  
  44.         return true;
  45.     }
  46.  
  47.     // 말을 타고있지만 스킬은 사용할 수 없는 상태라면 return false
  48.     if (false == bCanUseHorseSkill && true == IsRiding())
  49.         return false;
  50.  
  51.     CSkillProto * pkSk = CSkillManager::instance().Get(dwVnum);
  52.     sys_log(0, "%s: USE_SKILL: %d pkVictim %p", GetName(), dwVnum, get_pointer(pkVictim));
  53.  
  54.     if (!pkSk)
  55.         return false;
  56.  
  57.     if (bCanUseHorseSkill && pkSk->dwType != SKILL_TYPE_HORSE)
  58.         return BATTLE_NONE;
  59.  
  60.     if (!bCanUseHorseSkill && pkSk->dwType == SKILL_TYPE_HORSE)
  61.         return BATTLE_NONE;
  62.  
  63.     if (GetSkillLevel(dwVnum) == 0)
  64.         return false;
  65.  
  66.  
  67.     // NO_GRANDMASTER
  68.     if (GetSkillMasterType(dwVnum) < SKILL_GRAND_MASTER)
  69.         bUseGrandMaster = false;
  70.     // END_OF_NO_GRANDMASTER
  71.  
  72.     // MINING
  73.     if (GetWear(WEAR_WEAPON) && (GetWear(WEAR_WEAPON)->GetType() == ITEM_ROD || GetWear(WEAR_WEAPON)->GetType() == ITEM_PICK))
  74.         return false;
  75.     // END_OF_MINING
  76.  
  77.     m_SkillUseInfo[dwVnum].TargetVIDMap.clear();
  78.  
  79.     if (pkSk->IsChargeSkill())
  80.     {
  81.         if ((IsAffectFlag(AFF_TANHWAN_DASH)) || (pkVictim && (pkVictim != this)))
  82.         {
  83.             if (!pkVictim)
  84.                 return false;
  85.  
  86.             if (!IsAffectFlag(AFF_TANHWAN_DASH))
  87.             {
  88.                 if (!UseSkill(dwVnum, this))
  89.                     return false;
  90.             }
  91.  
  92.             m_SkillUseInfo[dwVnum].SetMainTargetVID(pkVictim->GetVID());
  93.             // DASH 상태의 탄환격은 공격기술
  94.             ComputeSkill(dwVnum, pkVictim);
  95.             RemoveAffect(dwVnum);
  96.             return true;
  97.         }
  98.     }
  99.  
  100.     if (dwVnum == SKILL_COMBO)
  101.     {
  102.         if (m_bComboIndex)
  103.             m_bComboIndex = 0;
  104.         else
  105.             m_bComboIndex = GetSkillLevel(SKILL_COMBO);
  106.  
  107.         ChatPacket(CHAT_TYPE_COMMAND, "combo %d", m_bComboIndex);
  108.         return true;
  109.     }
  110.  
  111.     // Toggle 할 때는 SP를 쓰지 않음 (SelfOnly로 구분)
  112.     if ((0 != pkSk->dwAffectFlag || pkSk->dwVnum == SKILL_MUYEONG) && (pkSk->dwFlag & SKILL_FLAG_TOGGLE) && RemoveAffect(pkSk->dwVnum))
  113.     {
  114.         return true;
  115.     }
  116.  
  117.     if (IsAffectFlag(AFF_REVIVE_INVISIBLE))
  118.         RemoveAffect(AFFECT_REVIVE_INVISIBLE);
  119.  
  120.     const float k = (1.0 * GetSkillPower(pkSk->dwVnum) * pkSk->bMaxLevel / 100);
  121.  
  122.  
  123.     pkSk->SetPointVar("k", k);
  124.     pkSk->kSplashAroundDamageAdjustPoly.SetVar("k", k);
  125.  
  126.     // 쿨타임 체크
  127.     pkSk->kCooldownPoly.SetVar("k", k);
  128.     int iCooltime = (int) pkSk->kCooldownPoly.Eval();
  129.     int lMaxHit = pkSk->lMaxHit ? pkSk->lMaxHit : -1;
  130.  
  131.     pkSk->SetSPCostVar("k", k);
  132.  
  133.     DWORD dwCur = get_dword_time();
  134.  
  135.     if (dwVnum == SKILL_TERROR && m_SkillUseInfo[dwVnum].bUsed && m_SkillUseInfo[dwVnum].dwNextSkillUsableTime > dwCur )
  136.     {
  137.         sys_log(0, " SKILL_TERROR's Cooltime is not delta over %u", m_SkillUseInfo[dwVnum].dwNextSkillUsableTime  - dwCur );
  138.         return false;
  139.     }
  140.  
  141.     int iNeededSP = 0;
  142.  
  143.     if (IS_SET(pkSk->dwFlag, SKILL_FLAG_USE_HP_AS_COST))
  144.     {
  145.         pkSk->SetSPCostVar("maxhp", GetMaxHP());
  146.         pkSk->SetSPCostVar("v", GetHP());
  147.         iNeededSP = (int) pkSk->kSPCostPoly.Eval();
  148.  
  149.         // ADD_GRANDMASTER_SKILL
  150.         if (GetSkillMasterType(dwVnum) >= SKILL_GRAND_MASTER && bUseGrandMaster)
  151.         {
  152.             iNeededSP = (int) pkSk->kGrandMasterAddSPCostPoly.Eval();
  153.         }
  154.         // END_OF_ADD_GRANDMASTER_SKILL
  155.  
  156.         if (GetHP() < iNeededSP)
  157.             return false;
  158.  
  159.         PointChange(POINT_HP, -iNeededSP);
  160.     }
  161.     else
  162.     {
  163.         // SKILL_FOMULA_REFACTORING
  164.         pkSk->SetSPCostVar("maxhp", GetMaxHP());
  165.         pkSk->SetSPCostVar("maxv", GetMaxSP());
  166.         pkSk->SetSPCostVar("v", GetSP());
  167.  
  168.         iNeededSP = (int) pkSk->kSPCostPoly.Eval();
  169.  
  170.         if (GetSkillMasterType(dwVnum) >= SKILL_GRAND_MASTER && bUseGrandMaster)
  171.         {
  172.             iNeededSP = (int) pkSk->kGrandMasterAddSPCostPoly.Eval();
  173.         }
  174.         // END_OF_SKILL_FOMULA_REFACTORING
  175.  
  176.         if (GetSP() < iNeededSP)
  177.             return false;
  178.  
  179.         if (test_server)
  180.             ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s SP소모: %d"), pkSk->szName, iNeededSP);
  181.  
  182.         PointChange(POINT_SP, -iNeededSP);
  183.     }
  184.  
  185.     if (IS_SET(pkSk->dwFlag, SKILL_FLAG_SELFONLY))
  186.         pkVictim = this;
  187. #ifdef ENABLE_WOLFMAN_CHARACTER
  188.     else if (IS_SET(pkSk->dwFlag, SKILL_FLAG_PARTY))
  189.         pkVictim = this;
  190. #endif
  191.  
  192.     if ((pkSk->dwVnum == SKILL_MUYEONG) || (pkSk->IsChargeSkill() && !IsAffectFlag(AFF_TANHWAN_DASH) && !pkVictim))
  193.     {
  194.         // 처음 사용하는 무영진은 자신에게 Affect를 붙인다.
  195.         pkVictim = this;
  196.     }
  197.  
  198.  
  199.     int iSplashCount = 1;
  200.  
  201.     if (false == m_bDisableCooltime)
  202.     {
  203.         if (false ==
  204.                 m_SkillUseInfo[dwVnum].UseSkill(
  205.                     bUseGrandMaster,
  206.                     (NULL != pkVictim && SKILL_HORSE_WILDATTACK != dwVnum) ? pkVictim->GetVID() : NULL,
  207.                     ComputeCooltime(iCooltime * 1000),
  208.                     iSplashCount,
  209.                     lMaxHit))
  210.         {
  211.             if (test_server)
  212.                 ChatPacket(CHAT_TYPE_NOTICE, "cooltime not finished %s %d", pkSk->szName, iCooltime);
  213.  
  214.             return false;
  215.         }
  216.     }
  217.  
  218.     if (dwVnum == SKILL_CHAIN)
  219.     {
  220.         ResetChainLightningIndex();
  221.         AddChainLightningExcept(pkVictim);
  222.     }
  223.    
  224.     if (IS_SET(pkSk->dwFlag, SKILL_FLAG_SELFONLY))
  225.         ComputeSkill(dwVnum, this);
  226. #ifdef ENABLE_WOLFMAN_CHARACTER
  227.     else if (IS_SET(pkSk->dwFlag, SKILL_FLAG_PARTY))
  228.         ComputeSkillParty(dwVnum, this);
  229. #endif
  230. #ifdef __PARTY_BUFF__
  231.     if (GetParty() && (dwVnum == SKILL_HOSIN || dwVnum == SKILL_REFLECT || dwVnum == SKILL_GICHEON) && IsRuneEquip(RUNE_ITEM_BUFFPARTY))
  232.     {
  233.         if (pkVictim->GetParty()){
  234.             if (pkVictim->GetParty() == GetParty()){
  235.                 ComputeSkillParty(dwVnum, this);
  236.             }
  237.         }
  238.     }
  239. #endif 
  240.     else if (!IS_SET(pkSk->dwFlag, SKILL_FLAG_ATTACK))
  241.         ComputeSkill(dwVnum, pkVictim);
  242.     else if (dwVnum == SKILL_BYEURAK)
  243.         ComputeSkill(dwVnum, pkVictim);
  244.     else if (dwVnum == SKILL_MUYEONG || pkSk->IsChargeSkill())
  245.         ComputeSkill(dwVnum, pkVictim);
  246.  
  247.     m_dwLastSkillTime = get_dword_time();
  248.  
  249.     return true;
  250. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement