게시판 제목 잘보고 올리세요 일반게시판에 홍보글 보이면 바로 회원 차단입니다

속성 데미지 / 속성저항 구현하신분 계세요?

컨텐츠 정보

본문

제가 받은 서버 자료가 몇개 없어서 그런지 모르겠으나..2.0을 주로 보는데요.


속성저항을 몬스터가 실제로 가지고 있다거나 한 sql 파일은 찾아볼수가 없더라구요.

그리고 속성 저항 및 데미지 계산 공식이 옛날 제가 아는 리니지 공식과 다소 달라서,


혹시, 옛날 리니지 2.0 시절에 속성 저항이 대강 어떤식으로 작동했는지, 속성 추가 데미지가 어떤식으로 작동하는지 아시는분 계세요?ㅜㅜ


예를 들어서...불타는 궁수가 불속성 저항 50%에 물속성 저항 -50% 라고 치면, 불에 강하고 물에 약한거니 콘오브 던지면 데미지 더 받는다던지

일렉카둠이 물속성 저항 50%에 불속성 -50%라고 치고

버닝 웨폰을 받아서 불속성 추타 +5를 받은 검으로 일렉카둠을 깐다고 치면

불속성 -50%이니 추타가 +7.5가 되야 하는건지....

제가 들고있는 팩에서는 랜덤 추타를 주게 되어 있는데 이게 제가 아는 리니지랑은 다른거 같아서요

제 어렴풋한 기억엔 속성 저항 100% 인 경우 25%인가 데미지 감소 효과가 있고 (해당 속성 공격에 대해)

반대로 -100%이면 25% 데미지 증가 효과 (해아 속성 고격에 대해) 로 알고있는데 뭐 파워북이나 리니지 오피셜로 속성에 대한 실제 데이터가 공개된적은 없는걸로 알고있습니다만

고수 분들의 기억력을 여쭤보고 싶어서요~ 속성 추뎀, 저항력은 보통 어떻게 작동하는게 맞는건가요?

관련자료

댓글 3
profile_image

위딩s님의 댓글

대충 수식이 이렇습니다 제가 직접 역산해서 코딩해놓은건데 참고만하시길 바래요 ㅎㅎpackage l1j.server.server.model.character.Attack.Helper;

import l1j.server.Templates.L1Skills;
import l1j.server.server.model.Instance.L1NpcInstance;
import l1j.server.server.model.Instance.L1PcInstance;

/**
 * 무기 속성 인챈트 + 공격자 속성추타 대미지 계산 (PC-PC / PC-NPC 공용)
 */
public final class L1WeaponAttrEnchantHelper {

private L1WeaponAttrEnchantHelper() {}

public static double calcAttrEnchantDamage(
final int attrLevel,
final L1PcInstance attacker,
final L1PcInstance targetPc,
final L1NpcInstance targetNpc
) {
if (attrLevel <= 0 || attacker == null) {
return 0;
}

// 1) 내 속성 구간 판정
final AttrType type = AttrType.fromAttrLevel(attrLevel);
if (type == AttrType.NONE) {
return 0;
}

// 2) 무기 속성 기본값 (1~5)
double dmg = 1 + type.offsetInBand(attrLevel);

// 3) 공격자 속성추타 합산
dmg += type.getAttackerAttrDmg(attacker);

if (dmg <= 0) {
return 0;
}

// 4) 타겟이 PC인 경우: 해당 속성 저항 % 감산
if (targetPc != null) {
final int resist = type.getPcResist(targetPc);
dmg -= (dmg * resist) / 100.0;
return (dmg > 0) ? dmg : 0;
}

// 5) 타겟이 NPC인 경우: 약점 속성일 때만 발동 + NPC 저항으로 감산
if (targetNpc != null) {
final int weak = targetNpc.getNpcTemplate().get_weakAttr();
if (!type.isEffectiveToNpcWeak(weak)) {
return 0;
}

final int npcResist = type.getNpcResist(targetNpc);
dmg = dmg * (32.0 - (npcResist * 32.0 / 100.0)) / 32.0;
return (dmg > 0) ? dmg : 0;
}

return 0;
}

// =========================
// internal
// =========================
private enum AttrType {
FIRE(1, 5),
WATER(6, 10),
WIND(11, 15),
EARTH(16, 20),
NONE(0, 0);

final int min;
@SuppressWarnings("unused")
final int max;

AttrType(int min, int max) {
this.min = min;
this.max = max;
}

static AttrType fromAttrLevel(int attrLevel) {
if (attrLevel >= 1 && attrLevel <= 5) return FIRE;
if (attrLevel >= 6 && attrLevel <= 10) return WATER;
if (attrLevel >= 11 && attrLevel <= 15) return WIND;
if (attrLevel >= 16 && attrLevel <= 20) return EARTH;
return NONE;
}

int offsetInBand(int attrLevel) {
return attrLevel - min;
}

int getAttackerAttrDmg(L1PcInstance pc) {
switch (this) {
case FIRE:  return pc.getResistance().getAttrFireDmg();
case WATER: return pc.getResistance().getAttrWaterDmg();
case WIND:  return pc.getResistance().getAttrWindDmg();
case EARTH: return pc.getResistance().getAttrEarthDmg();
default:    return 0;
}
}

int getPcResist(L1PcInstance pc) {
switch (this) {
case FIRE:  return pc.getResistance().getFire();
case WATER: return pc.getResistance().getWater();
case WIND:  return pc.getResistance().getWind();
case EARTH: return pc.getResistance().getEarth();
default:    return 0;
}
}

boolean isEffectiveToNpcWeak(int npcWeakAttr) {
switch (this) {
case FIRE:  return npcWeakAttr == L1Skills.ATTR_FIRE;
case WATER: return npcWeakAttr == L1Skills.ATTR_WATER;
case WIND:  return npcWeakAttr == L1Skills.ATTR_WIND;
case EARTH: return npcWeakAttr == L1Skills.ATTR_EARTH;
default:    return false;
}
}

int getNpcResist(L1NpcInstance npc) {
switch (this) {
case FIRE:  return npc.getNpcTemplate().getWeakEarth();
case WATER: return npc.getNpcTemplate().getWeakFire();
case WIND:  return npc.getNpcTemplate().getWeakWater();
case EARTH: return npc.getNpcTemplate().getWeakWind();
default:    return 0;
}
}
}
}
전체 1 / 1 페이지
번호
제목
이름

포인트 랭킹


알림 0