Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- TuT:
- // In char_skill.cpp #ifdef __PARTY_BUFF__ hinzufügen und den define in service.h/CommonDefines.h hinzufügen
- bool CHARACTER::UseSkill(DWORD dwVnum, LPCHARACTER pkVictim, bool bUseGrandMaster)
- {
- if (false == CanUseSkill(dwVnum))
- return false;
- // NO_GRANDMASTER
- if (test_server)
- {
- if (quest::CQuestManager::instance().GetEventFlag("no_grand_master"))
- {
- bUseGrandMaster = false;
- }
- }
- // END_OF_NO_GRANDMASTER
- if (g_bSkillDisable)
- return false;
- if (IsObserverMode())
- return false;
- if (!CanMove())
- return false;
- if (IsPolymorphed())
- return false;
- const bool bCanUseHorseSkill = CanUseHorseSkill();
- if (dwVnum == SKILL_HORSE_SUMMON)
- {
- if (GetSkillLevel(dwVnum) == 0)
- return false;
- if (GetHorseLevel() <= 0)
- ChatPacket(CHAT_TYPE_INFO, LC_TEXT_LANGUAGE(GetLanguage(),"말이 없습니다. 마굿간 경비병을 찾아가세요."));
- else
- ChatPacket(CHAT_TYPE_INFO, LC_TEXT_LANGUAGE(GetLanguage(),"말 소환 아이템을 사용하세요."));
- return true;
- }
- // 말을 타고있지만 스킬은 사용할 수 없는 상태라면 return false
- if (false == bCanUseHorseSkill && true == IsRiding())
- return false;
- CSkillProto * pkSk = CSkillManager::instance().Get(dwVnum);
- sys_log(0, "%s: USE_SKILL: %d pkVictim %p", GetName(), dwVnum, get_pointer(pkVictim));
- if (!pkSk)
- return false;
- if (bCanUseHorseSkill && pkSk->dwType != SKILL_TYPE_HORSE)
- return BATTLE_NONE;
- if (!bCanUseHorseSkill && pkSk->dwType == SKILL_TYPE_HORSE)
- return BATTLE_NONE;
- if (GetSkillLevel(dwVnum) == 0)
- return false;
- // NO_GRANDMASTER
- if (GetSkillMasterType(dwVnum) < SKILL_GRAND_MASTER)
- bUseGrandMaster = false;
- // END_OF_NO_GRANDMASTER
- // MINING
- if (GetWear(WEAR_WEAPON) && (GetWear(WEAR_WEAPON)->GetType() == ITEM_ROD || GetWear(WEAR_WEAPON)->GetType() == ITEM_PICK))
- return false;
- // END_OF_MINING
- m_SkillUseInfo[dwVnum].TargetVIDMap.clear();
- if (pkSk->IsChargeSkill())
- {
- if ((IsAffectFlag(AFF_TANHWAN_DASH)) || (pkVictim && (pkVictim != this)))
- {
- if (!pkVictim)
- return false;
- if (!IsAffectFlag(AFF_TANHWAN_DASH))
- {
- if (!UseSkill(dwVnum, this))
- return false;
- }
- m_SkillUseInfo[dwVnum].SetMainTargetVID(pkVictim->GetVID());
- // DASH 상태의 탄환격은 공격기술
- ComputeSkill(dwVnum, pkVictim);
- RemoveAffect(dwVnum);
- return true;
- }
- }
- if (dwVnum == SKILL_COMBO)
- {
- if (m_bComboIndex)
- m_bComboIndex = 0;
- else
- m_bComboIndex = GetSkillLevel(SKILL_COMBO);
- ChatPacket(CHAT_TYPE_COMMAND, "combo %d", m_bComboIndex);
- return true;
- }
- // Toggle 할 때는 SP를 쓰지 않음 (SelfOnly로 구분)
- if ((0 != pkSk->dwAffectFlag || pkSk->dwVnum == SKILL_MUYEONG) && (pkSk->dwFlag & SKILL_FLAG_TOGGLE) && RemoveAffect(pkSk->dwVnum))
- {
- return true;
- }
- if (IsAffectFlag(AFF_REVIVE_INVISIBLE))
- RemoveAffect(AFFECT_REVIVE_INVISIBLE);
- const float k = (1.0 * GetSkillPower(pkSk->dwVnum) * pkSk->bMaxLevel / 100);
- pkSk->SetPointVar("k", k);
- pkSk->kSplashAroundDamageAdjustPoly.SetVar("k", k);
- // 쿨타임 체크
- pkSk->kCooldownPoly.SetVar("k", k);
- int iCooltime = (int) pkSk->kCooldownPoly.Eval();
- int lMaxHit = pkSk->lMaxHit ? pkSk->lMaxHit : -1;
- pkSk->SetSPCostVar("k", k);
- DWORD dwCur = get_dword_time();
- if (dwVnum == SKILL_TERROR && m_SkillUseInfo[dwVnum].bUsed && m_SkillUseInfo[dwVnum].dwNextSkillUsableTime > dwCur )
- {
- sys_log(0, " SKILL_TERROR's Cooltime is not delta over %u", m_SkillUseInfo[dwVnum].dwNextSkillUsableTime - dwCur );
- return false;
- }
- int iNeededSP = 0;
- if (IS_SET(pkSk->dwFlag, SKILL_FLAG_USE_HP_AS_COST))
- {
- pkSk->SetSPCostVar("maxhp", GetMaxHP());
- pkSk->SetSPCostVar("v", GetHP());
- iNeededSP = (int) pkSk->kSPCostPoly.Eval();
- // ADD_GRANDMASTER_SKILL
- if (GetSkillMasterType(dwVnum) >= SKILL_GRAND_MASTER && bUseGrandMaster)
- {
- iNeededSP = (int) pkSk->kGrandMasterAddSPCostPoly.Eval();
- }
- // END_OF_ADD_GRANDMASTER_SKILL
- if (GetHP() < iNeededSP)
- return false;
- PointChange(POINT_HP, -iNeededSP);
- }
- else
- {
- // SKILL_FOMULA_REFACTORING
- pkSk->SetSPCostVar("maxhp", GetMaxHP());
- pkSk->SetSPCostVar("maxv", GetMaxSP());
- pkSk->SetSPCostVar("v", GetSP());
- iNeededSP = (int) pkSk->kSPCostPoly.Eval();
- if (GetSkillMasterType(dwVnum) >= SKILL_GRAND_MASTER && bUseGrandMaster)
- {
- iNeededSP = (int) pkSk->kGrandMasterAddSPCostPoly.Eval();
- }
- // END_OF_SKILL_FOMULA_REFACTORING
- if (GetSP() < iNeededSP)
- return false;
- if (test_server)
- ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s SP소모: %d"), pkSk->szName, iNeededSP);
- PointChange(POINT_SP, -iNeededSP);
- }
- if (IS_SET(pkSk->dwFlag, SKILL_FLAG_SELFONLY))
- pkVictim = this;
- #ifdef ENABLE_WOLFMAN_CHARACTER
- else if (IS_SET(pkSk->dwFlag, SKILL_FLAG_PARTY))
- pkVictim = this;
- #endif
- if ((pkSk->dwVnum == SKILL_MUYEONG) || (pkSk->IsChargeSkill() && !IsAffectFlag(AFF_TANHWAN_DASH) && !pkVictim))
- {
- // 처음 사용하는 무영진은 자신에게 Affect를 붙인다.
- pkVictim = this;
- }
- int iSplashCount = 1;
- if (false == m_bDisableCooltime)
- {
- if (false ==
- m_SkillUseInfo[dwVnum].UseSkill(
- bUseGrandMaster,
- (NULL != pkVictim && SKILL_HORSE_WILDATTACK != dwVnum) ? pkVictim->GetVID() : NULL,
- ComputeCooltime(iCooltime * 1000),
- iSplashCount,
- lMaxHit))
- {
- if (test_server)
- ChatPacket(CHAT_TYPE_NOTICE, "cooltime not finished %s %d", pkSk->szName, iCooltime);
- return false;
- }
- }
- if (dwVnum == SKILL_CHAIN)
- {
- ResetChainLightningIndex();
- AddChainLightningExcept(pkVictim);
- }
- if (IS_SET(pkSk->dwFlag, SKILL_FLAG_SELFONLY))
- ComputeSkill(dwVnum, this);
- #ifdef ENABLE_WOLFMAN_CHARACTER
- else if (IS_SET(pkSk->dwFlag, SKILL_FLAG_PARTY))
- ComputeSkillParty(dwVnum, this);
- #endif
- #ifdef __PARTY_BUFF__
- if (GetParty() && (dwVnum == SKILL_HOSIN || dwVnum == SKILL_REFLECT || dwVnum == SKILL_GICHEON) && IsRuneEquip(RUNE_ITEM_BUFFPARTY))
- {
- if (pkVictim->GetParty()){
- if (pkVictim->GetParty() == GetParty()){
- ComputeSkillParty(dwVnum, this);
- }
- }
- }
- #endif
- else if (!IS_SET(pkSk->dwFlag, SKILL_FLAG_ATTACK))
- ComputeSkill(dwVnum, pkVictim);
- else if (dwVnum == SKILL_BYEURAK)
- ComputeSkill(dwVnum, pkVictim);
- else if (dwVnum == SKILL_MUYEONG || pkSk->IsChargeSkill())
- ComputeSkill(dwVnum, pkVictim);
- m_dwLastSkillTime = get_dword_time();
- return true;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement