最終更新:ID:d10iQEOINQ 2011年07月02日(土) 06:45:43履歴
package war.mod; import static l1j.server.server.model.skill.L1SkillId.STATUS_FREEZE; import java.util.Random; import java.util.StringTokenizer; import java.util.concurrent.ConcurrentHashMap; import l1j.server.server.GeneralThreadPool; import l1j.server.server.datatables.SkillsTable; import l1j.server.server.model.L1Character; import l1j.server.server.model.L1EffectSpawn; import l1j.server.server.model.L1Location; import l1j.server.server.model.L1Object; import l1j.server.server.model.L1World; import l1j.server.server.model.Instance.L1MonsterInstance; import l1j.server.server.model.Instance.L1NpcInstance; import l1j.server.server.model.Instance.L1PcInstance; import l1j.server.server.model.poison.L1DamagePoison; import l1j.server.server.model.skill.L1SkillId; import l1j.server.server.serverpackets.S_EffectLocation; import l1j.server.server.serverpackets.S_Paralysis; import l1j.server.server.serverpackets.S_SkillSound; import l1j.server.server.serverpackets.S_SystemMessage; import l1j.server.server.serverpackets.S_UseAttackSkill; import l1j.server.server.templates.L1Skills; import war.W_Method; public class W_DoMod { private static final int DAGGER_SINGLE_DMG[] = { 35, 70 }; private static final int SWORD_SINGLE_DMG[] = { 75, 90 }; private static final int TOWHAND_SINGLE_DMG[] = { 100, 150 }; private static final int TOWHAND_AREA_DMG[] = { 50, 150, 3 }; private static final int SPEAR_AREA_DMG[] = { 1, 100, 5 }; private static final int ARROW_SINGLE_DMG[] = { 8, 16 }; private static final int ARROW_LINE_DMG[] = { 20, 30 }; private static final int FETTERS_TIME = 3000; // ホールド時間 // 効果時間 間隔 ダメージ private static final int CRAW_POISON_DMG[] = { 3000, 500, 24 }; private L1PcInstance _attacker; private L1Character _target; private double _dmg; private Random rnd = new Random(); public W_DoMod(L1PcInstance attacker, L1Character target, double dmg) { _attacker = attacker; _target = target; _dmg = dmg; if (_attacker == null || _target == null) { return; } if (_attacker.getWeapon() == null) { return; } proc_Mod(); } private void proc_Mod() { int fire = W_Method.modValue(_attacker.getWeapon(), 12); int water = W_Method.modValue(_attacker.getWeapon(), 13); int wind = W_Method.modValue(_attacker.getWeapon(), 14); int earth = W_Method.modValue(_attacker.getWeapon(), 15); for (L1PcInstance pc : L1World.getInstance().getVisiblePlayer(_attacker, 1)) { if (pc.getSubClassId() == 6) { int element = rnd.nextInt(4); switch (element) { case 0: fire += 2; break; case 1: water += 2; break; case 2: wind += 2; break; case 3: earth += 2; break; } } } if (_attacker.getSubClassId() == 12 && _attacker.getAwakeSkillId() == L1SkillId.AWAKEN_ANTHARAS) { // アンタラス earth += 5; } else if (_attacker.getSubClassId() == 12 && _attacker.getAwakeSkillId() == L1SkillId.AWAKEN_FAFURION) { // パプリオン water += 5; } else if (_attacker.getSubClassId() == 12 && _attacker.getAwakeSkillId() == L1SkillId.AWAKEN_VALAKAS) { // ヴァラカス fire += 5; } if (rnd.nextInt(100) < W_Method.modValue(_attacker.getWeapon(), 9)) { // 範囲攻撃 proc_AreaDmg(); } if (W_Method.modValue(_attacker.getWeapon(), 10) != 0) { // HP吸収 if (_target instanceof L1PcInstance || _target instanceof L1MonsterInstance) { _attacker.setCurrentHp(_attacker.getCurrentHp() + W_Method.modValue(_attacker.getWeapon(), 10)); } } if (W_Method.modValue(_attacker.getWeapon(), 11) != 0) { // MP吸収 if (_target instanceof L1PcInstance || _target instanceof L1MonsterInstance) { _attacker.setCurrentMp(_attacker.getCurrentMp() + W_Method.modValue(_attacker.getWeapon(), 11)); } } if (fire != 0) { int MaxValue = fire; int MinValue = W_Method.modOneLowValue(_attacker.getWeapon(), 12); double parsent = (rnd.nextInt(MaxValue - MinValue) + MinValue) / 100d; W_Method wm = new W_Method(); int dmg = wm.weaponBasicValue(_attacker, _attacker.getWeapon()); double fix_dmg = dmg * parsent; // 対象の属性防御によるダメージ軽減 if (_target instanceof L1PcInstance) { L1PcInstance targetPc = (L1PcInstance) _target; double elementDef = targetPc.getFire() / 100d; fix_dmg = fix_dmg - (fix_dmg * elementDef); fix_dmg = wm.getCalcPcReduction(targetPc, (int) (fix_dmg)); // ダメージ軽減 } if (fix_dmg > 0) { receiveDamage(fix_dmg, false); } } if (water != 0) { int MaxValue = water; int MinValue = W_Method.modOneLowValue(_attacker.getWeapon(), 13); double parsent = (rnd.nextInt(MaxValue - MinValue) + MinValue) / 100d; W_Method wm = new W_Method(); int dmg = wm.weaponBasicValue(_attacker, _attacker.getWeapon()); double fix_dmg = dmg * parsent; // 対象の属性防御によるダメージ軽減 if (_target instanceof L1PcInstance) { L1PcInstance targetPc = (L1PcInstance) _target; double elementDef = targetPc.getWater() / 100d; fix_dmg = fix_dmg - (fix_dmg * elementDef); fix_dmg = wm.getCalcPcReduction(targetPc, (int) (fix_dmg)); // ダメージ軽減 } receiveDamage(fix_dmg, false); } if (wind != 0) { int MaxValue = wind; int MinValue = W_Method.modOneLowValue(_attacker.getWeapon(), 14); double parsent = (rnd.nextInt(MaxValue - MinValue) + MinValue) / 100d; W_Method wm = new W_Method(); int dmg = wm.weaponBasicValue(_attacker, _attacker.getWeapon()); double fix_dmg = dmg * parsent; // 対象の属性防御によるダメージ軽減 if (_target instanceof L1PcInstance) { L1PcInstance targetPc = (L1PcInstance) _target; double elementDef = targetPc.getWind() / 100d; fix_dmg = fix_dmg - (fix_dmg * elementDef); fix_dmg = wm.getCalcPcReduction(targetPc, (int) (fix_dmg)); // ダメージ軽減 } receiveDamage(fix_dmg, false); } if (earth != 0) { int MaxValue = earth; int MinValue = W_Method.modOneLowValue(_attacker.getWeapon(), 15); double parsent = (rnd.nextInt(MaxValue - MinValue) + MinValue) / 100d; W_Method wm = new W_Method(); int dmg = wm.weaponBasicValue(_attacker, _attacker.getWeapon()); double fix_dmg = dmg * parsent; // 対象の属性防御によるダメージ軽減 if (_target instanceof L1PcInstance) { L1PcInstance targetPc = (L1PcInstance) _target; double elementDef = targetPc.getEarth() / 100d; fix_dmg = fix_dmg - (fix_dmg * elementDef); fix_dmg = wm.getCalcPcReduction(targetPc, (int) (fix_dmg)); // ダメージ軽減 } receiveDamage(fix_dmg, false); } if (W_Method.modValue(_attacker.getWeapon(), 16) != 0) { // ダガー魔法 if (rnd.nextInt(100) < W_Method.modValue(_attacker.getWeapon(), 16)) { showGfxToObject(6598); double dmg = rnd.nextInt(DAGGER_SINGLE_DMG[1] - DAGGER_SINGLE_DMG[0]) + DAGGER_SINGLE_DMG[0]; receiveDamage(dmg); } } if (W_Method.modValue(_attacker.getWeapon(), 17) != 0) { // ソード魔法 if (rnd.nextInt(100) < W_Method.modValue(_attacker.getWeapon(), 17)) { showGfxToObject(7004); double dmg = rnd.nextInt(SWORD_SINGLE_DMG[1] - SWORD_SINGLE_DMG[0]) + SWORD_SINGLE_DMG[0]; receiveDamage(dmg); } } if (W_Method.modValue(_attacker.getWeapon(), 18) != 0) { // ツーハンドソードシングル魔法 if (rnd.nextInt(100) < W_Method.modValue(_attacker.getWeapon(), 18)) { showGfxToObject(6763); double dmg = rnd.nextInt(TOWHAND_SINGLE_DMG[1] - TOWHAND_SINGLE_DMG[0]) + TOWHAND_SINGLE_DMG[0]; receiveDamage(dmg); } } if (W_Method.modValue(_attacker.getWeapon(), 19) != 0) { // ツーハンドソードエリア魔法 if (rnd.nextInt(100) < W_Method.modValue(_attacker.getWeapon(), 19)) { showGfxToObject(7300); showGfxToObject(7189); proc_magic_AreaDmg(TOWHAND_AREA_DMG); } } if (W_Method.modValue(_attacker.getWeapon(), 24) != 0) { // スピアーエリア魔法 if (rnd.nextInt(100) < W_Method.modValue(_attacker.getWeapon(), 24)) { showGfxToObject(6703); proc_magic_AreaDmg(SPEAR_AREA_DMG); } } if (W_Method.modValue(_attacker.getWeapon(), 21) != 0) { // アローライン魔法 if (rnd.nextInt(100) < W_Method.modValue(_attacker.getWeapon(), 21)) { proc_ArrowLineSkill(); } } if (W_Method.modValue(_attacker.getWeapon(), 25) != 0) { // ホールド if (rnd.nextInt(100) < W_Method.modValue(_attacker.getWeapon(), 25)) { L1EffectSpawn.getInstance().spawnEffect(81182, FETTERS_TIME, _target.getX(), _target.getY(), _target.getMapId()); if (_target instanceof L1PcInstance) { if (!_target.hasSkillEffect(STATUS_FREEZE)) { L1PcInstance targetPc = (L1PcInstance) _target; targetPc.setSkillEffect(STATUS_FREEZE, FETTERS_TIME); 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 (_target instanceof L1NpcInstance) { L1NpcInstance npc = (L1NpcInstance) _target; npc.setSkillEffect(STATUS_FREEZE, FETTERS_TIME); npc.broadcastPacket(new S_SkillSound(npc.getId(), 4184)); npc.setParalyzed(true); } } } if (W_Method.modValue(_attacker.getWeapon(), 26) != 0) { // 毒 if (rnd.nextInt(100) < W_Method.modValue(_attacker.getWeapon(), 26)) { showGfxToObject(745); showGfxToObject(7403); L1DamagePoison.doInfection(_attacker, _target, CRAW_POISON_DMG[1], CRAW_POISON_DMG[2], CRAW_POISON_DMG[0]); } } if (W_Method.modValue(_attacker.getWeapon(), 27) != 0) { // ポルート if (rnd.nextInt(100) < W_Method.modValue(_attacker.getWeapon(), 27) && !_target.hasSkillEffect(L1SkillId.POLLUTE_WATER)) { if (_target instanceof L1PcInstance) { L1PcInstance targetPc = (L1PcInstance) _target; L1Skills l1skills = SkillsTable.getInstance().getTemplate(L1SkillId.POLLUTE_WATER); targetPc.sendPackets(new S_SystemMessage(_attacker.getName() + "に" + l1skills.getName() + "の呪いをかけられました。(効果時間:" + l1skills.getBuffDuration() + "秒")); S_EffectLocation packet = new S_EffectLocation(targetPc.getX(), targetPc.getY(), l1skills .getCastGfx()); _attacker.sendPackets(packet); _attacker.broadcastPacket(packet); targetPc.setSkillEffect(L1SkillId.POLLUTE_WATER, l1skills.getBuffDuration() * 1000); } } } if (W_Method.modValue(_attacker.getWeapon(), 28) != 0) { // ディケイ if (rnd.nextInt(100) < W_Method.modValue(_attacker.getWeapon(), 28) && !_target.hasSkillEffect(L1SkillId.DECAY_POTION)) { if (_target instanceof L1PcInstance) { L1PcInstance targetPc = (L1PcInstance) _target; L1Skills l1skills = SkillsTable.getInstance().getTemplate(L1SkillId.DECAY_POTION); targetPc.sendPackets(new S_SystemMessage(_attacker.getName() + "に" + l1skills.getName() + "の呪いをかけられました。(効果時間:" + l1skills.getBuffDuration() + "秒")); S_EffectLocation packet = new S_EffectLocation(targetPc.getX(), targetPc.getY(), l1skills .getCastGfx()); _attacker.sendPackets(packet); _attacker.broadcastPacket(packet); targetPc.setSkillEffect(L1SkillId.DECAY_POTION, l1skills.getBuffDuration() * 1000); } } } if (W_Method.modValue(_attacker.getWeapon(), 29) != 0) { // ウィークネス if (rnd.nextInt(100) < W_Method.modValue(_attacker.getWeapon(), 29) && !_target.hasSkillEffect(L1SkillId.WEAKNESS)) { if (_target instanceof L1PcInstance) { L1PcInstance targetPc = (L1PcInstance) _target; L1Skills l1skills = SkillsTable.getInstance().getTemplate(L1SkillId.WEAKNESS); targetPc.sendPackets(new S_SystemMessage(_attacker.getName() + "に" + l1skills.getName() + "の呪いをかけられました。(効果時間:" + l1skills.getBuffDuration() + "秒")); S_EffectLocation packet = new S_EffectLocation(targetPc.getX(), targetPc.getY(), l1skills .getCastGfx()); _attacker.sendPackets(packet); _attacker.broadcastPacket(packet); targetPc.addDmgup(-5); targetPc.addHitup(-1); targetPc.setSkillEffect(L1SkillId.WEAKNESS, l1skills.getBuffDuration() * 1000); } } } if (W_Method.modValue(_attacker.getWeapon(), 30) != 0) { // サイレンス if (rnd.nextInt(100) < W_Method.modValue(_attacker.getWeapon(), 30) && !_target.hasSkillEffect(L1SkillId.SILENCE)) { if (_target instanceof L1PcInstance) { L1PcInstance targetPc = (L1PcInstance) _target; L1Skills l1skills = SkillsTable.getInstance().getTemplate(L1SkillId.SILENCE); targetPc.sendPackets(new S_SystemMessage(_attacker.getName() + "に" + l1skills.getName() + "の呪いをかけられました。(効果時間:" + l1skills.getBuffDuration() + "秒")); S_EffectLocation packet = new S_EffectLocation(targetPc.getX(), targetPc.getY(), l1skills .getCastGfx()); _attacker.sendPackets(packet); _attacker.broadcastPacket(packet); targetPc.setSkillEffect(L1SkillId.SILENCE, l1skills.getBuffDuration() * 1000); } } } } private void proc_AreaDmg() { for (L1Object obj : L1World.getInstance().getVisibleObjects(_target, 2)) { if (obj instanceof L1PcInstance) { L1PcInstance target_pc = (L1PcInstance) obj; if (_attacker.getClanid() != target_pc.getClanid() && !target_pc.isDead()) { W_Method wm = new W_Method(); int dmg = wm.weaponBasicValue(_attacker, _attacker.getWeapon()); dmg = wm.getCalcPcReduction(target_pc, dmg); target_pc.receiveDamage(_attacker, dmg, false); /* * _attacker.sendPackets(new S_UseArrowSkill(_attacker, * target_pc.getId(), 4629, target_pc.getX(), * target_pc.getY(), false, _attacker.getId())); * _attacker.broadcastPacket(new S_UseArrowSkill(_attacker, * target_pc.getId(), 4629, target_pc.getX(), * target_pc.getY(), false, _attacker.getId())); */ _attacker.sendPackets(new S_UseAttackSkill(_attacker, target_pc, 4629, false)); _attacker.broadcastPacket(new S_UseAttackSkill(_attacker, target_pc, 4629, false)); } } else if (obj instanceof L1NpcInstance) { L1NpcInstance target_npc = (L1NpcInstance) obj; if (!target_npc.isDead()) { W_Method wm = new W_Method(); int dmg = wm.weaponBasicValue(_attacker, _attacker.getWeapon()); target_npc.receiveDamage(_attacker, dmg); /* * _attacker.sendPackets(new S_UseArrowSkill(_attacker, * target_npc.getId(), 4629, target_npc.getX(), * target_npc.getY(), false, _attacker.getId())); * _attacker.broadcastPacket(new S_UseArrowSkill(_attacker, * target_npc.getId(), 4629, target_npc .getX(), * target_npc.getY(), false, _attacker.getId())); */ _attacker.sendPackets(new S_UseAttackSkill(_attacker, target_npc, 4629, false)); _attacker.broadcastPacket(new S_UseAttackSkill(_attacker, target_npc, 4629, false)); } } } } private void proc_magic_AreaDmg(int source[]) { for (L1Object obj : L1World.getInstance().getVisibleObjects(_target, source[2])) { if (obj instanceof L1PcInstance) { L1PcInstance target_pc = (L1PcInstance) obj; if (_attacker.getClanid() != target_pc.getClanid() && !target_pc.isDead()) { int dmg = rnd.nextInt(source[1] - source[0]) + source[0]; dmg = W_Method.getCalcPcMagicReduction(target_pc, (int) dmg); target_pc.receiveDamage(_attacker, dmg, false); } } else if (obj instanceof L1NpcInstance) { L1NpcInstance target_npc = (L1NpcInstance) obj; if (!target_npc.isDead()) { int dmg = rnd.nextInt(source[1] - source[0]) + source[0]; target_npc.receiveDamage(_attacker, dmg); } } } } public void proc_ArrowSkill() { // アロー魔法 _attacker.sendPackets(new S_UseAttackSkill(_attacker, _target, 1662, false)); _attacker.broadcastPacket(new S_UseAttackSkill(_attacker, _target, 1662, false)); double dmg = rnd.nextInt(ARROW_SINGLE_DMG[1] - ARROW_SINGLE_DMG[0]) + ARROW_SINGLE_DMG[0]; receiveDamage(dmg); } private void proc_ArrowLineSkill() { _attacker.sendPackets(new S_SkillSound(_attacker.getId(), 7623)); _attacker.broadcastPacket(new S_SkillSound(_attacker.getId(), 7623)); class startAttack implements Runnable { public void run() { try { byte HEADING_TABLE_X[] = { 0, 1, 1, 1, 0, -1, -1, -1 }; byte HEADING_TABLE_Y[] = { -1, -1, 0, 1, 1, 1, 0, -1 }; ConcurrentHashMap<Integer, String> lineMap = new ConcurrentHashMap<Integer, String>(); L1Location loc1 = new L1Location(_attacker.getX() + HEADING_TABLE_X[_attacker.getHeading()], _attacker.getY() + HEADING_TABLE_Y[_attacker.getHeading()], _attacker.getMapId()); L1Location loc2 = new L1Location(_target.getX(), _target.getY(), _attacker.getMapId()); lineMap = W_Method.createLineMap(loc1, loc2); for (int i = 0; i < lineMap.size(); i++) { String delim = ","; StringTokenizer st = new StringTokenizer(lineMap.get(i), delim); int x = 0; int y = 0; // 座標の分解 x = Integer.parseInt(st.nextToken()); y = Integer.parseInt(st.nextToken()); L1Location next_loc = new L1Location(x, y, _attacker.getMapId()); S_EffectLocation packet = new S_EffectLocation(x, y, 7389); _attacker.sendPackets(packet); _attacker.broadcastPacket(packet); for (L1Object obj : L1World.getInstance().getVisiblePoint(next_loc, 0)) { if (obj instanceof L1PcInstance) { L1PcInstance target = (L1PcInstance) obj; if (_attacker.getClanid() != target.getClanid()) { // ダメージ計算 int dmg = rnd.nextInt(ARROW_LINE_DMG[1] - ARROW_LINE_DMG[0]) + ARROW_LINE_DMG[0]; dmg = W_Method.getCalcPcMagicReduction(target, (int) dmg); // HPの減少 target.receiveDamage(_attacker, dmg, false); } } else if (obj instanceof L1NpcInstance) { L1NpcInstance target = (L1NpcInstance) obj; // ダメージ計算 int dmg = rnd.nextInt(ARROW_LINE_DMG[1] - ARROW_LINE_DMG[0]) + ARROW_LINE_DMG[0]; // HPの減少 target.receiveDamage(_attacker, dmg); } } Thread.sleep(100); } } catch (Exception e) { } } } GeneralThreadPool.getInstance().execute(new startAttack()); } private void receiveDamage(double dmg) { receiveDamage(dmg, true); } private void receiveDamage(double dmg, boolean magic) { if (_target instanceof L1PcInstance) { L1PcInstance targetPc = (L1PcInstance) _target; if (magic) { dmg = W_Method.getCalcPcMagicReduction(targetPc, (int) dmg); } targetPc.receiveDamage(_attacker, (int) dmg, false); } else if (_target instanceof L1NpcInstance) { L1NpcInstance targetNpc = (L1NpcInstance) _target; targetNpc.receiveDamage(_attacker, (int) dmg); } } private void showGfxToObject(int gfxid) { if (_target instanceof L1PcInstance) { L1PcInstance targetPc = (L1PcInstance) _target; _attacker.sendPackets(new S_SkillSound(targetPc.getId(), gfxid)); _attacker.broadcastPacket(new S_SkillSound(targetPc.getId(), gfxid)); } else if (_target instanceof L1NpcInstance) { L1NpcInstance targetNpc = (L1NpcInstance) _target; _attacker.sendPackets(new S_SkillSound(targetNpc.getId(), gfxid)); _attacker.broadcastPacket(new S_SkillSound(targetNpc.getId(), gfxid)); } } }
このページへのコメント
W_DoMod - L1J-JP2 WarServerV2 - Seesaa Wiki鐃淑ワ申鐃緒申鐃緒申鐃緒申 for 鐃緒申鐃殉¥申鐃夙フワ申鐃緒申 moncler maya http://www.pslcbi.com/moncler2014.html
W_DoMod - L1J-JP2 WarServerV2 - Seesaa Wiki鐃淑ワ申鐃緒申鐃緒申鐃緒申 for 鐃緒申鐃殉¥申鐃夙フワ申鐃緒申 ≪潟若 激c <潟 http://www.pslcbi.com/moncler2014.html
W_DoMod - L1J-JP2 WarServerV2 - Seesaa Wiki鐃淑ワ申鐃緒申鐃緒申鐃緒申 for 鐃緒申鐃殉¥申鐃夙フワ申鐃緒申 ≪潟若 2014 <潟 http://www.pslcbi.com/moncler2014.html
zooWmm <a href="http://scqvmahpjofc.com/">scqvmahpjofc</a>, [url=http://pngnounxaxaa.com/]pngnounxaxaa[/url], [link=http://aoyjhladacox.com/]aoyjhladacox[/link], http://drqxlestruce.com/