[수정1] 데스나이트 불검 커스텀 버전
안녕하세요.
데불 커스텀 Ver.
소스코드에요.
WeaponSkill.java
-
public static void getNewDKSword(L1PcInstance pc, L1Character cha){
-
try{
-
int chance = RandomUtil.nextInt(100);
-
int call = pc.getWeapon().getEnchantLevel();
-
-
// 발동 이펙트 번호
-
int effectId = 7065;
-
-
if(call >= chance){ // 확률은 인챈%
-
-
// 체크 타이머를 시작
-
new NewDeathKnightSwordEffect(pc, cha).begin();
-
-
// 1번 터지면 데이터 입력
-
int count = 0;
-
if(ndkseMap.containsKey(cha.getId())){
-
count = ndkseMap.get(cha.getId());
-
}
-
ndkseMap.put(cha.getId(), count+1);
-
-
// 터진다면 이펙트를 줘서 알 수 있게 한다.
-
pc.sendPackets(new S_SkillSound(cha.getId(), effectId));
-
Broadcaster.broadcastPacket(pc, new S_SkillSound(cha.getId(), effectId));
-
}
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
}
-
}
-
-
private ScheduledFuture<?> _future;
-
L1PcInstance pc;
-
L1Character cha;
-
int pcId;
-
int chaId;
-
-
int checkTimeSecMillis = 10000; // 해당 시간 만큼 체크한다.
-
int checkCount = 5; // 이 숫자 이상 발동을 해야 된다.
-
-
public NewDeathKnightSwordEffect(L1PcInstance pc, L1Character cha){
-
this.pc = pc;
-
this.cha = cha;
-
this.pcId = pc.getId();
-
this.chaId = cha.getId();
-
}
-
-
public void run(){
-
// 누군가 나가거나, 죽으면 종료
-
if(pc == null || cha == null){
-
kill();
-
return;
-
}
-
if(pc.isDead() || pc.getCurrentHp() <= 0){
-
kill();
-
return;
-
}
-
if(cha.isDead() || cha.getCurrentHp() <= 0){
-
kill();
-
return;
-
}
-
-
// 발동된 횟수를 가져오기
-
int count = 0;
-
if(ndkseMap.containsKey(chaId)){
-
count = ndkseMap.get(chaId);
-
}
-
-
// 일정 횟수 발동을 하지 않았다면 제외
-
if(count < checkCount){
-
kill();
-
return;
-
}
-
-
// 효과 발동
-
new NewDeathKnightSwordDamage(pc, cha).begin();
-
-
// 종료되면 리스트에서 제거
-
ndkseMap.remove(chaId);
-
}
-
-
public void begin(){
-
// 이미 걸려있다면 return
-
if(ndkseMap.containsKey(chaId)){
-
return;
-
}
-
_future = GeneralThreadPool.getInstance().schedule(this, checkTimeSecMillis);
-
}
-
-
public void kill(){
-
if(_future != null){
-
_future.cancel(false);
-
}
-
-
// 종료되면 리스트에서 제거
-
ndkseMap.remove(chaId);
-
}
-
}
-
-
private ScheduledFuture<?> _future;
-
L1PcInstance pc;
-
L1Character cha;
-
-
int delayTimeSecMillis = 300; // 해당 딜레이로 친다.(적어도 500은 되야 화려화려)
-
int remain = 10; // 해당 횟수만큼 친다.
-
-
int effectId = 245; // 해당 이펙트로 나간다.
-
int actionCode = 31; // 해당 액션을 사용
-
-
int gfxId = 9206; // 해당 gfx로 생성
-
-
int damage = 100; // 해당 데미지를 준다.(회당 데미지)
-
-
// comment
-
// 총 데미지 량은 damage * remain 이므로, 알아서 조정을 하시기 바래요!
-
-
public NewDeathKnightSwordDamage(L1PcInstance pc, L1Character cha){
-
this.pc = pc;
-
this.cha = cha;
-
}
-
-
public void run(){
-
try{
-
// 누군가 나가거나, 죽거나, 횟수가 다 되면 종료
-
if(pc == null || cha == null){
-
kill();
-
return;
-
}
-
if(pc.isDead() || pc.getCurrentHp() <= 0){
-
kill();
-
return;
-
}
-
if(cha.isDead() || cha.getCurrentHp() <= 0){
-
kill();
-
return;
-
}
-
if(remain-- <= 0){
-
kill();
-
return;
-
}
-
-
// 좌표는 케릭 주위 1칸 내로
-
int x = cha.getX() + RandomUtil.nextInt(2) - RandomUtil.nextInt(2);
-
int y = cha.getY() + RandomUtil.nextInt(2) - RandomUtil.nextInt(2);
-
int mapId = cha.getMapId();
-
-
// 몹 소환(허수아비를 만들어서 gfx와 이름을 변경..테이블에 또 만들기는 귀ㅊ...이 아니라 효율을 위해서요)
-
L1NpcInstance npc = NpcTable.getInstance().newNpcInstance(45003);
-
npc.setId(ObjectIdFactory.getInstance().nextId());
-
npc.setLocation(x, y, mapId);
-
npc.getGfxId().setGfxId(gfxId);
-
npc.getGfxId().setTempCharGfx(gfxId);
-
npc.setNameId(transName);
-
npc.setHomeX(npc.getX());
-
npc.setHomeY(npc.getY());
-
npc.getMoveState().setHeading(CharPosUtil.targetDirection(npc, cha.getX(), cha.getY()));
-
npc.setActionStatus(actionCode);
-
-
// 오브젝트 등록을 하고(store는 필요 없다. 보이기만 하면 그만..)
-
L1World.getInstance().addVisibleObject(npc);
-
-
// 오브젝트 생성
-
pc.sendPackets(new S_NPCPack(npc));
-
Broadcaster.broadcastPacket(pc, new S_NPCPack(npc));
-
-
// 액션값 전송
-
pc.sendPackets(new S_DoActionGFX(npc.getId(), actionCode));
-
Broadcaster.broadcastPacket(pc, new S_DoActionGFX(npc.getId(), actionCode));
-
-
// 이펙트 전송
-
pc.sendPackets(new S_SkillSound(npc.getId(), effectId));
-
Broadcaster.broadcastPacket(pc, new S_SkillSound(npc.getId(), effectId));
-
-
// 오브젝트 등록 해제
-
L1World.getInstance().removeVisibleObject(npc);
-
-
// 오브젝트 삭제
-
pc.sendPackets(new S_RemoveObject(npc));
-
Broadcaster.broadcastPacket(pc, new S_RemoveObject(npc));
-
-
// 데미지 주기
-
if(cha instanceof L1PcInstance){
-
((L1PcInstance) cha).receiveDamage(pc, damage, false);
-
}else if(cha instanceof L1MonsterInstance){
-
((L1MonsterInstance) cha).receiveDamage(pc, damage);
-
}
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
}
-
}
-
-
public void begin(){
-
_future = GeneralThreadPool.getInstance().scheduleAtFixedRate(this, 0, delayTimeSecMillis);
-
}
-
-
public void kill(){
-
if(_future != null){
-
_future.cancel(false);
-
}
-
}
-
}
L1Attack.java
calcPcPcdamage
calcPcNpcDamage
위 두개 메소드 에서
if(wepon.getItemId() == 데불번호)
L1WeaponSkill.getNewDKSword(_pc, _target);
메소드를 마법검 형식으로 넣어주세요!
comment
1. 저게 전부에요!
2. 삭제를 원하신다면 삭제요청은 댓글로 올려주세요.
mod
1.리스트에서 제거가 제대로 되지 않는 문제 수정
|
[출처] [수정1] 데스나이트 불검 커스텀 버전 (비공개 카페) |

준희미니 님의 최근 댓글
rt 2021 05.25 ㄳ 2021 05.11 ㄳ 2021 05.11 rt 2021 05.09 rt 2021 04.25