📄 l1weaponskill.java
字号:
public static double getDiceDaggerDamage(L1PcInstance pc,
L1PcInstance targetPc, L1ItemInstance weapon) {
double dmg = 0;
int chance = _random.nextInt(100) + 1;
if (3 >= chance) {
dmg = targetPc.getCurrentHp() * 2 / 3;
if (targetPc.getCurrentHp() - dmg < 0) {
dmg = 0;
}
String msg = weapon.getLogName();
pc.sendPackets(new S_ServerMessage(158, msg));
// \f1%0が蒸発してなくなりました。
pc.getInventory().removeItem(weapon, 1);
}
return dmg;
}
public static int getKiringkuDamage(L1PcInstance pc, L1Character cha) {
int dmg = 0;
int dice = 5;
int diceCount = 2;
int value = 14;
int kiringkuDamage = 0;
int charaIntelligence = 0;
int getTargetMr = 0;
for (int i = 0; i < diceCount; i++) {
kiringkuDamage += (_random.nextInt(dice) + 1);
}
kiringkuDamage += value;
int spByItem = pc.getSp() - pc.getTrueSp(); // アイテムによるSP変動
charaIntelligence = pc.getInt() + spByItem - 12;
if (charaIntelligence < 1) {
charaIntelligence = 1;
}
double kiringkuCoefficientA = (1.0 + charaIntelligence * 3.0 / 32.0);
kiringkuDamage *= kiringkuCoefficientA;
double mrFloor = 0;
if (cha.getMr() <= 100) {
mrFloor = Math.floor((cha.getMr() - pc.getOriginalMagicHit()) / 2);
} else if (cha.getMr() >= 100) {
mrFloor = Math.floor((cha.getMr() - pc.getOriginalMagicHit()) / 10);
}
double kiringkuCoefficientB = 0;
if (cha.getMr() <= 100) {
kiringkuCoefficientB = 1 - 0.01 * mrFloor;
} else if (cha.getMr() > 100) {
kiringkuCoefficientB = 0.6 - 0.01 * mrFloor;
}
double kiringkuFloor = Math.floor(kiringkuDamage);
dmg += kiringkuFloor + pc.getWeapon().getEnchantLevel();
dmg *= kiringkuCoefficientB;
if (pc.getWeapon().getItem().getItemId() == 270) {
pc.sendPackets(new S_SkillSound(pc.getId(), 6983));
pc.broadcastPacket(new S_SkillSound(pc.getId(), 6983));
} else {
pc.sendPackets(new S_SkillSound(pc.getId(), 7049));
pc.broadcastPacket(new S_SkillSound(pc.getId(), 7049));
}
return dmg;
}
public static double getAreaSkillWeaponDamage(L1PcInstance pc,
L1Character cha, int weaponId) {
double dmg = 0;
int probability = 0;
int attr = 0;
int chance = _random.nextInt(100) + 1;
if (weaponId == 263) { // フリージングランサー
probability = 5;
attr = L1Skills.ATTR_WATER;
} else if (weaponId == 260) { // レイジングウィンド
probability = 4;
attr = L1Skills.ATTR_WIND;
}
if (probability >= chance) {
int sp = pc.getSp();
int intel = pc.getInt();
int area = 0;
int effectTargetId = 0;
int effectId = 0;
L1Character areaBase = cha;
double damageRate = 0;
if (weaponId == 263) { // フリージングランサー
area = 3;
damageRate = 1.4D;
effectTargetId = cha.getId();
effectId = 1804;
areaBase = cha;
} else if (weaponId == 260) { // レイジングウィンド
area = 4;
damageRate = 1.5D;
effectTargetId = pc.getId();
effectId = 758;
areaBase = pc;
}
double bsk = 0;
if (pc.hasSkillEffect(BERSERKERS)) {
bsk = 0.2;
}
dmg = (intel + sp) * (damageRate + bsk) + _random.nextInt(intel
+ sp) * damageRate;
pc.sendPackets(new S_SkillSound(effectTargetId, effectId));
pc.broadcastPacket(new S_SkillSound(effectTargetId, effectId));
for (L1Object object : L1World.getInstance()
.getVisibleObjects(areaBase, area)) {
if (object == null) {
continue;
}
if (!(object instanceof L1Character)) {
continue;
}
if (object.getId() == pc.getId()) {
continue;
}
if (object.getId() == cha.getId()) { // 攻撃対象は除外
continue;
}
// 攻撃対象がMOBの場合は、範囲内のMOBにのみ当たる
// 攻撃対象がPC,Summon,Petの場合は、範囲内のPC,Summon,Pet,MOBに当たる
if (cha instanceof L1MonsterInstance) {
if (!(object instanceof L1MonsterInstance)) {
continue;
}
}
if (cha instanceof L1PcInstance
|| cha instanceof L1SummonInstance
|| cha instanceof L1PetInstance) {
if (!(object instanceof L1PcInstance
|| object instanceof L1SummonInstance
|| object instanceof L1PetInstance
|| object instanceof L1MonsterInstance)) {
continue;
}
}
dmg = calcDamageReduction((L1Character) object, dmg, attr);
if (dmg <= 0) {
continue;
}
if (object instanceof L1PcInstance) {
L1PcInstance targetPc = (L1PcInstance) object;
targetPc.sendPackets(new S_DoActionGFX(targetPc.getId(),
ActionCodes.ACTION_Damage));
targetPc.broadcastPacket(new S_DoActionGFX(targetPc.getId(),
ActionCodes.ACTION_Damage));
targetPc.receiveDamage(pc, (int) dmg);
} else if (object instanceof L1SummonInstance
|| object instanceof L1PetInstance
|| object instanceof L1MonsterInstance) {
L1NpcInstance targetNpc = (L1NpcInstance) object;
targetNpc.broadcastPacket(new S_DoActionGFX(targetNpc
.getId(), ActionCodes.ACTION_Damage));
targetNpc.receiveDamage(pc, (int) dmg);
}
}
}
return calcDamageReduction(cha, dmg, attr);
}
public static double getLightningEdgeDamage(L1PcInstance pc,
L1Character cha) {
double dmg = 0;
int chance = _random.nextInt(100) + 1;
if (4 >= chance) {
int sp = pc.getSp();
int intel = pc.getInt();
double bsk = 0;
if (pc.hasSkillEffect(BERSERKERS)) {
bsk = 0.2;
}
dmg = (intel + sp) * (2 + bsk) + _random.nextInt(intel + sp) * 2;
pc.sendPackets(new S_SkillSound(cha.getId(), 10));
pc.broadcastPacket(new S_SkillSound(cha.getId(), 10));
}
return calcDamageReduction(cha, dmg, L1Skills.ATTR_WIND);
}
public static void giveArkMageDiseaseEffect(L1PcInstance pc,
L1Character cha) {
int chance = _random.nextInt(1000) + 1;
int probability = (5 - ((cha.getMr() / 10) * 5)) * 10;
if (probability == 0) {
probability = 10;
}
if (probability >= chance) {
L1SkillUse l1skilluse = new L1SkillUse();
l1skilluse.handleCommands(pc, 56,
cha.getId(), cha.getX(), cha.getY(), null, 0,
L1SkillUse.TYPE_GMBUFF);
}
}
public static void giveFettersEffect(L1PcInstance pc, L1Character cha) {
int fettersTime = 8000;
if (isFreeze(cha)) { // 凍結状態orカウンターマジック中
return;
}
if ((_random.nextInt(100) + 1) <= 2) {
L1EffectSpawn.getInstance().spawnEffect(81182, fettersTime,
cha.getX(), cha.getY(), cha.getMapId());
if (cha instanceof L1PcInstance) {
L1PcInstance targetPc = (L1PcInstance) cha;
targetPc.setSkillEffect(STATUS_FREEZE, fettersTime);
targetPc.sendPackets(new S_SkillSound(targetPc.getId(), 4184));
targetPc.broadcastPacket(new S_SkillSound(targetPc.getId(),
4184));
targetPc.sendPackets(new S_Paralysis(S_Paralysis.TYPE_BIND,
true));
} else if (cha instanceof L1MonsterInstance
|| cha instanceof L1SummonInstance
|| cha instanceof L1PetInstance) {
L1NpcInstance npc = (L1NpcInstance) cha;
npc.setSkillEffect(STATUS_FREEZE, fettersTime);
npc.broadcastPacket(new S_SkillSound(npc.getId(), 4184));
npc.setParalyzed(true);
}
}
}
private static double calcDamageReduction(L1Character cha, double dmg, int attr) {
// 凍結状態orカウンターマジック中
if (isFreeze(cha)) {
return 0;
}
// MRによるダメージ軽減
int mr = cha.getMr();
int rnd = _random.nextInt(100) + 1;
if (mr >= rnd) {
dmg /= 2;
}
// 属性によるダメージ軽減
int resist = 0;
if (attr == L1Skills.ATTR_EARTH) {
resist = cha.getEarth();
} else if (attr == L1Skills.ATTR_FIRE) {
resist = cha.getFire();
} else if (attr == L1Skills.ATTR_WATER) {
resist = cha.getWater();
} else if (attr == L1Skills.ATTR_WIND) {
resist = cha.getWind();
}
int resistFloor = (int) (0.32 * Math.abs(resist));
if (resist >= 0) {
resistFloor *= 1;
} else {
resistFloor *= -1;
}
double attrDeffence = resistFloor / 32.0;
dmg = (1.0 - attrDeffence) * dmg;
return dmg;
}
private static boolean isFreeze(L1Character cha) {
if (cha.hasSkillEffect(STATUS_FREEZE)) {
return true;
}
if (cha.hasSkillEffect(ABSOLUTE_BARRIER)) {
return true;
}
if (cha.hasSkillEffect(ICE_LANCE)) {
return true;
}
if (cha.hasSkillEffect(FREEZING_BLIZZARD)) {
return true;
}
if (cha.hasSkillEffect(EARTH_BIND)) {
return true;
}
// カウンターマジック判定
if (cha.hasSkillEffect(COUNTER_MAGIC)) {
cha.removeSkillEffect(COUNTER_MAGIC);
int castgfx = SkillsTable.getInstance().getTemplate(
COUNTER_MAGIC).getCastGfx();
cha.broadcastPacket(new S_SkillSound(cha.getId(), castgfx));
if (cha instanceof L1PcInstance) {
L1PcInstance pc = (L1PcInstance) cha;
pc.sendPackets(new S_SkillSound(pc.getId(), castgfx));
}
return true;
}
return false;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -