사이트 로그인
2016.06.29 11:46
WeaponSkillTable.java <<< 없으면 추가
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*
* http://www.gnu.org/copyleft/gpl.html
*/
package l1j.server.server.datatables;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import l1j.server.L1DatabaseFactory;
import l1j.server.server.utils.PerformanceTimer;
import l1j.server.server.utils.SQLUtil;
public class WeaponSkillTable {
public class WeaponSkillData {
public int weapon_id = 0;
public String name = null;
public int probability = 0;
public int fix_damage = 0;
public int random_damage = 0;
public int area = 0;
public int skill_id = 0;
public int skill_time = 0;
public int effect_id = 0;
public int effect_target = 0;
public int arrow_type = 0;
public int attr = 0;
}
private static Logger _log = Logger.getLogger(WeaponSkillTable.class.getName());
private static WeaponSkillTable _instance;
private final Map<Integer, WeaponSkillData> _weaponskill = new HashMap<Integer, WeaponSkillData>();
public static WeaponSkillTable getInstance() {
if (_instance == null) {
_instance = new WeaponSkillTable();
}
return _instance;
}
private WeaponSkillTable() {
PerformanceTimer timer = new PerformanceTimer();
System.out.print("[WeaponSkill] loading WeaponSkill...");
weaponSkillList();
System.out.println("OK! " + timer.get() + " ms");
}
public void weaponSkillList() {
Connection con = null;
PreparedStatement pstm = null;
ResultSet rs = null;
try {
con = L1DatabaseFactory.getInstance().getConnection();
pstm = con.prepareStatement("select * from weapon_skill");
rs = pstm.executeQuery();
WeaponSkillData weaponskilldata = null;
while (rs.next()) {
weaponskilldata = new WeaponSkillData();
int weapon_id = rs.getInt("weapon_id");
weaponskilldata.weapon_id = rs.getInt("weapon_id");
weaponskilldata.name = rs.getString("note");
weaponskilldata.probability = rs.getInt("probability");
weaponskilldata.fix_damage = rs.getInt("fix_damage");
weaponskilldata.random_damage = rs.getInt("random_damage");
weaponskilldata.area = rs.getInt("area");
weaponskilldata.skill_id = rs.getInt("skill_id");
weaponskilldata.skill_time = rs.getInt("skill_time");
weaponskilldata.effect_id = rs.getInt("effect_id");
weaponskilldata.effect_target = rs.getInt("effect_target");
weaponskilldata.arrow_type = rs.getInt("arrow_type");
weaponskilldata.attr = rs.getInt("attr");
_weaponskill.put(weapon_id, weaponskilldata);
}
} catch (SQLException e) {
_log.log(Level.SEVERE, e.getLocalizedMessage(), e);
} finally {
SQLUtil.close(rs);
SQLUtil.close(pstm);
SQLUtil.close(con);
}
}
public static void reload() {
WeaponSkillTable oldInstance = _instance;
_instance = new WeaponSkillTable();
if (oldInstance != null)
oldInstance._weaponskill.clear();
}
public Map<Integer, WeaponSkillData> getWeaponSkillList() {
return _weaponskill;
}
public WeaponSkillData getWeaponSkillData(int itemId) {
WeaponSkillData data = _weaponskill.get(itemId);
if (data == null) {
data = new WeaponSkillData();
data.weapon_id = 0;
}
return data;
}
}
L1WeaponSkill.java << 없으면 추가
package l1j.server.server.model;
import java.util.Random;
import l1j.server.server.ActionCodes;
import l1j.server.server.datatables.WeaponSkillTable;
import l1j.server.server.datatables.WeaponSkillTable.WeaponSkillData;
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.Instance.L1PetInstance;
import l1j.server.server.model.Instance.L1SummonInstance;
import l1j.server.server.serverpackets.S_DoActionGFX;
import l1j.server.server.serverpackets.S_SkillSound;
import l1j.server.server.serverpackets.S_UseAttackSkill;
public class L1WeaponSkill {
private static Random _random = new Random(System.nanoTime());
public static double getWeaponSkillDamage(L1PcInstance pc, L1Character cha, int weapon_id, int enchant) {
double dmg = 0;
int chance = _random.nextInt(100) + 1;
int weapondmg = 0;
int enchantdmg = 0;
//공성지역 마법검안나가게
// int castle_id = L1CastleLocation.getCastleIdByArea(pc);
// int target_castle_id = L1CastleLocation.getCastleIdByArea(cha);
//// if (castle_id != 0 && target_castle_id !=0 && target_castle_id == castle_id ){
// return 0;
// }
//공성지역 마법검 안나가게 끝
try {
WeaponSkillData weaponskilldata = WeaponSkillTable.getInstance().getWeaponSkillData(weapon_id);
// System.out.println("무기 : " + weaponskilldata.weapon_id);
// System.out.println("확률 : " + weaponskilldata.probability);
// System.out.println("데미지 : " + weaponskilldata.fix_damage);
// System.out.println("이펙트 : " + weaponskilldata.effect_id);
// System.out.println("찬스 : " + chance);
if (weaponskilldata.weapon_id != 0) {
if (chance <= weaponskilldata.probability) {
// System.out.println("arrow_type : " +
// weaponskilldata.arrow_type);
if (weaponskilldata.area == 0) {
// System.out.println("dmg1 : " + dmg);
weapondmg = weaponskilldata.fix_damage;
if (enchant < 0) {
enchantdmg = 0;
enchantdmg = _random.nextInt(enchantdmg + 1);
} else {
enchantdmg = _random.nextInt(enchant + 1);
}
// System.out.println("enchantdmg : " + enchantdmg);
dmg = weapondmg + enchantdmg;
// System.out.println("dmg2 : " + dmg);
if (weaponskilldata.arrow_type == 0) {
pc.sendPackets(new S_SkillSound(cha.getId(), weaponskilldata.effect_id));
Broadcaster.broadcastPacket(pc, new S_SkillSound(cha.getId(), weaponskilldata.effect_id));
} else if (weaponskilldata.arrow_type == 1) {
if (weaponskilldata.effect_target == 0) {
S_UseAttackSkill packet = new S_UseAttackSkill(pc, cha.getId(), weaponskilldata.effect_id, cha.getX(), cha.getY(), ActionCodes.ACTION_Attack, false);
pc.sendPackets(packet);
Broadcaster.broadcastPacket(pc, packet);
} else if (weaponskilldata.effect_target == 1) {
S_UseAttackSkill packet = new S_UseAttackSkill(cha, cha.getId(), weaponskilldata.effect_id, cha.getX(), cha.getY(), ActionCodes.ACTION_Attack, false);
pc.sendPackets(packet);
Broadcaster.broadcastPacket(pc, packet);
}
}
// System.out.println("skill_id : " +
// weaponskilldata.skill_id);
if (weaponskilldata.skill_id != 0) {
if (!cha.getSkillEffectTimerSet().hasSkillEffect(weaponskilldata.skill_id)) {
cha.getSkillEffectTimerSet().setSkillEffect(weaponskilldata.skill_id, weaponskilldata.skill_time * 1000);
}
}
} else if (weaponskilldata.area != 0) {
L1Magic magic = new L1Magic(pc, cha);
dmg = magic.calcMagicDamage(weaponskilldata.skill_id);
dmg = magic.calcMrDefense((int) dmg);
if (dmg <= 0) {
dmg = 0;
}
pc.sendPackets(new S_SkillSound(cha.getId(), weaponskilldata.effect_id));
Broadcaster.broadcastPacket(pc, new S_SkillSound(cha.getId(), weaponskilldata.effect_id));
L1PcInstance targetPc = null;
L1NpcInstance targetNpc = null;
for (L1Object object : L1World.getInstance().getVisibleObjects(cha, weaponskilldata.area)) {
if (object == null) {
continue;
}
if (!(object instanceof L1Character)) {
continue;
}
if (object.getId() == pc.getId() || object.getId() == cha.getId()) {
continue;
}
if (object instanceof L1PcInstance) {
targetPc = (L1PcInstance) object;
if (CharPosUtil.getZoneType(targetPc) == 1) {
continue;
}
}
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;
}
}
if (dmg <= 0) {
continue;
}
if (object instanceof L1PcInstance) {
targetPc = (L1PcInstance) object;
if (!pc.getMap().isSafetyZone(pc.getLocation())) {
if (targetPc.getClanid() != pc.getClanid()) {
targetPc.sendPackets(new S_DoActionGFX(targetPc.getId(), ActionCodes.ACTION_Damage));
Broadcaster.broadcastPacket(targetPc, new S_DoActionGFX(targetPc.getId(), ActionCodes.ACTION_Damage));
targetPc.receiveDamage(pc, (int)dmg, false);
}
}
} else if (object instanceof L1SummonInstance || object instanceof L1PetInstance || object instanceof L1MonsterInstance) {
targetNpc = (L1NpcInstance) object;
Broadcaster.broadcastPacket(targetNpc, new S_DoActionGFX(targetNpc.getId(), ActionCodes.ACTION_Damage));
if (!pc.getMap().isSafetyZone(pc.getLocation())) {
targetNpc.receiveDamage(pc, (int) dmg);
}
}
}
}
}
}
} catch (Exception e) {
System.out.println("WeaponSkill Error");
}
return dmg;
}
}
L1Attack.java
pctopc 부분
case 415015:
case 415016:
dmg += WeaponSkill.getChaserDamage(_pc, _target, 7179);
break;
case 413103:
calcStaffOfMana();
WeaponSkill.getDiseaseWeapon(_pc, _target, 413101);
break;
default:
/**웨폰스킬 외부화 **/
dmg += L1WeaponSkill.getWeaponSkillDamage(_pc, _target, _weaponId, _weaponEnchant);
/**웨폰스킬 외부화 **/
break; //검색
}
}
pctonpc 부분
case 415015:
case 415016:
dmg += WeaponSkill.getChaserDamage(_pc, _target, 7179);
break;
case 413103:
calcStaffOfMana();
WeaponSkill.getDiseaseWeapon(_pc, _target, 413101);
break;
default:
/**웨폰스킬 외부화 **/
dmg += L1WeaponSkill.getWeaponSkillDamage(_pc, _target, _weaponId, _weaponEnchant);
/**웨폰스킬 외부화 **/
break; //검색후 위에 추가
}
L1Reload.java
} else if (arg.equalsIgnoreCase("무기퍼센트")) {
WeaponPersentDamage.reload();
gm.sendPackets(new S_SystemMessage("WeaponPersentDamage Update Complete..."));
/** 웨폰퍼센트 데미지 **/
/** 웨폰스킬 데미지 **/
} else if (arg.equalsIgnoreCase("무기스킬")) {
WeaponSkillTable.reload();
gm.sendPackets(new S_SystemMessage("WeaponSkill Update Complete..."));
/** 웨폰스킬 데미지 **/
} else if (arg.equalsIgnoreCase("엔피씨")) {
NpcTable.reload();
gm.sendPackets(new S_SystemMessage("NpcTable Update Complete..."));
eva.java << 매니져창인데 하셔도 돼구 안하셔도 됩니다 ^^
JMenuItem bossCycleReload = new JMenuItem("BossCycle");
bossCycleReload.setAccelerator(KeyStroke.getKeyStroke('L', InputEvent.SHIFT_DOWN_MASK));
bossCycleReload.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (QMsg("BossCycle " + ReloadMSG) == 0) {
L1BossCycle.load();
jSystemLogWindow.append(getLogTime() + " [도구 실행] BossCycle Update Complete..." + "\n", "Red");
}
}
});
JMenuItem weaponSkillReload = new JMenuItem("WeaponSkill");
weaponSkillReload.setAccelerator(KeyStroke.getKeyStroke('Z', InputEvent.SHIFT_DOWN_MASK));
weaponSkillReload.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (QMsg("WeaponSkill " + ReloadMSG) == 0) {
WeaponSkillTable.reload();
jSystemLogWindow.append(getLogTime() + " [도구 실행] WeaponSkill Update Complete..." + "\n", "Red");
}
}
});
jJMenu4.add(skillsReload);
jJMenu4.add(mobSkillReload);
jJMenu4.add(mapFixKeyReload);
jJMenu4.add(itemReload);
jJMenu4.add(shopReload);
jJMenu4.add(npcReload);
jJMenu4.add(bossCycleReload);
jJMenu4.add(weaponSkillReload);
디비는 어느 퍡이든 다 있으니 패스 할게요 ㅎ
출처: 아시는분 댓글로 달아주시면 감사하겠습니다
[출처] 먹통 웨폰스킬테이블(디비) 작동시키기 (비공개 카페)