2010년 8월 1일 일요일

리니지 자동낚시 구현

더 많은 자료는 http://www.sofree.co.kr/





*반짝이는비늘과 진귀한거북이 획득시 자동낚시 종료!

*반짝이는비늘과 상자물고기는 자신의팩에맞게 번호수정!

*깨진아이템들 주석처리했습니다.

*상자물고기를만드신후 트려져박스에 상자물고기에서 물에젖은아이템

나오게 하면됩니다.

*인벤이미지:반짝이는 비늘(3863)

물고기 상자(3611)

물에 젖은 후드(3610)

물에 젖은 모자(3609)

Opcodes.java



public static final int C_OPCODE_FISHCLICK = 30; // 낚시 입질 클릭



C_Fight.java

(내용통으로)



package l1j.server.server.clientpackets;



import java.util.logging.Level;

import java.util.logging.Logger;



import l1j.server.Config;

import l1j.server.server.ClientThread;

import l1j.server.server.model.Instance.L1PcInstance;

import l1j.server.server.serverpackets.S_Message_YN;

import l1j.server.server.serverpackets.S_ServerMessage;

import l1j.server.server.utils.FaceToFace;



// Referenced classes of package l1j.server.server.clientpackets:

// ClientBasePacket



public class C_Fight extends ClientBasePacket {



private static final String C_FIGHT = "[C] C_Fight";

private static Logger _log = Logger.getLogger(C_Fight.class.getName());



public C_Fight(byte abyte0[], ClientThread client)

throws Exception {

super(abyte0);



L1PcInstance pc = client.getActiveChar();

if (pc.isGhost()) {

return;

}

L1PcInstance target = FaceToFace.faceToFace(pc);

if (target != null) {

if (!target.isParalyzed()) {

if (pc.getFightId() != 0) {

pc.sendPackets(new S_ServerMessage(633)); // \f1당신은 벌써 다른 사람과 결투중입니다.

return;

} else if (target.getFightId() != 0) {

target.sendPackets(new S_ServerMessage(634)); // \f1 벌써 다른 사람과 결투중입니다.

return;

}

pc.setFightId(target.getId());

target.setFightId(pc.getId());

target.sendPackets(new S_Message_YN(630, pc.getName())); // %0%s가 당신과 결투를 바라고 있습니다.응합니까? (Y/N)

}

}

}



@Override

public String getType() {

return C_FIGHT;

}



}



C_FishClick.java

(내용통으로)



package l1j.server.server.clientpackets;



import java.util.logging.Logger;

import java.util.Random;





import l1j.server.server.ClientThread;

import l1j.server.server.FishingTimeController;

import l1j.server.server.datatables.ItemTable;

import l1j.server.server.model.Instance.L1ItemInstance;

import l1j.server.server.model.Instance.L1PcInstance;

import l1j.server.server.model.L1World;

import l1j.server.server.serverpackets.S_CharVisualUpdate;

import l1j.server.server.serverpackets.S_ServerMessage;

import l1j.server.server.model.L1Inventory;



// Referenced classes of package l1j.server.server.clientpackets:

// ClientBasePacket



public class C_FishClick extends ClientBasePacket {



private static final String C_FISHCLICK = "[C] C_FishClick";

private static Logger _log = Logger.getLogger(C_FishClick.class.getName());

private static Random _random = new Random();



public C_FishClick(byte abyte0[], ClientThread clientthread) throws Exception {

super(abyte0);

L1PcInstance pc = clientthread.getActiveChar();

pc.setFishingTime(0);

pc.setFishingReady(false);

pc.setFishing(false);

pc.sendPackets(new S_CharVisualUpdate(pc));

pc.broadcastPacket(new S_CharVisualUpdate(pc));

FishingTimeController.getInstance().removeMember(pc);

}



@Override

public String getType() {

return C_FISHCLICK;

}

}



FishingTimeController.java

(내용통으로)



package l1j.server.server;



import java.util.ArrayList;

import java.util.List;

import java.util.Random;

import java.util.logging.Logger;

import l1j.server.server.datatables.ItemTable;



import l1j.server.server.model.Broadcaster;

import l1j.server.server.model.Instance.L1ItemInstance;

import l1j.server.server.model.Instance.L1PcInstance;

import l1j.server.server.serverpackets.S_CharVisualUpdate;

import l1j.server.server.serverpackets.S_PacketBox;

import l1j.server.server.serverpackets.S_ServerMessage;



public class FishingTimeController implements Runnable {

private static FishingTimeController _instance;

private final List _fishingList =

new ArrayList();



private static Random _random = new Random(System.nanoTime());

public static FishingTimeController getInstance() {

if (_instance == null) {

_instance = new FishingTimeController();

}

return _instance;

}



@Override

public void run() {

try {

while (true) {

Thread.sleep(300);

fishing();

}

} catch (Exception e1) {

}

}



public void addMember(L1PcInstance pc) {

if (pc == null

_fishingList.contains(pc)) {

return;

}

_fishingList.add(pc);

}



public void removeMember(L1PcInstance pc) {

if (pc == null

!_fishingList.contains(pc)) {

return;

}

_fishingList.remove(pc);

}



private void fishing() {

if (_fishingList.size() > 0) {

long currentTime = System.currentTimeMillis();

L1PcInstance pc = null;

for (int i = 0; i < _fishingList.size(); i++) {

pc = _fishingList.get(i);

if (pc.isFishing()) {

long time = pc.getFishingTime();

if (currentTime <= (time + 1000)

&& currentTime >= (time - 1000)

&& !pc.isFishingReady()) {

pc.setFishingReady(true);

// pc.sendPackets(new S_Fishing());

pc.sendPackets(new S_PacketBox(S_PacketBox.FISHING));

} else if ( currentTime > (time + 100)

){

int chance = _random.nextInt(200) + 1;

if (chance < 50) {

successFishing(pc, 41298, "$5256"); // 25%어린 물고기

long time2 = System.currentTimeMillis() + 10000 + _random.nextInt(6) * 1000;

pc.setFishingTime(time2); //낚시시간 될려주기

} else if (chance < 65) {

successFishing(pc, 41300, "$5258"); // 7.5% 강한 물고기

long time2 = System.currentTimeMillis() + 10000 + _random.nextInt(6) * 1000;

pc.setFishingTime(time2);

} else if (chance < 80) {

successFishing(pc, 41299, "$5257"); // 7.5%재빠른 물고기

long time2 = System.currentTimeMillis() + 10000 + _random.nextInt(6) * 1000;

pc.setFishingTime(time2);

} else if (chance < 90) {

successFishing(pc, 41296, "$5249"); // 5%붕어

long time2 = System.currentTimeMillis() + 10000 + _random.nextInt(6) * 1000;

pc.setFishingTime(time2);

} else if (chance < 100) {

successFishing(pc, 41297, "$5250"); // 5%잉어

long time2 = System.currentTimeMillis() + 10000 + _random.nextInt(6) * 1000;

pc.setFishingTime(time2);

} else if (chance < 105) {

successFishing(pc, 41301, "$5259"); // 2.5%붉은 빛 나는 물고기

long time2 = System.currentTimeMillis() + 10000 + _random.nextInt(6) * 1000;

pc.setFishingTime(time2);

} else if (chance < 110) {

successFishing(pc, 41302, "$5260"); // 2.5%초록 빛 나는 물고기

long time2 = System.currentTimeMillis() + 10000 + _random.nextInt(6) * 1000;

pc.setFishingTime(time2);

} else if (chance < 115) {

successFishing(pc, 41303, "$5261"); // 2.5%파란 빛 나는 물고기

long time2 = System.currentTimeMillis() + 10000 + _random.nextInt(6) * 1000;

pc.setFishingTime(time2);

} else if (chance < 120) {

successFishing(pc, 41304, "$5262"); // 2.5%흰 빛 나는 물고기

long time2 = System.currentTimeMillis() + 10000 + _random.nextInt(6) * 1000;

pc.setFishingTime(time2);

/* } else if (chance < 123) {

successFishing(pc, 41306, "$5263"); // 1.5%깨진 반지

long time2 = System.currentTimeMillis() + 10000 + _random.nextInt(6) * 1000;

pc.setFishingTime(time2);

} else if (chance < 126) {

successFishing(pc, 41307, "$5265"); // 1.5%깨진 목걸이

long time2 = System.currentTimeMillis() + 10000 + _random.nextInt(6) * 1000;

pc.setFishingTime(time2);

} else if (chance < 129) {

successFishing(pc, 41305, "$5264"); // 1.5%깨진 귀걸이

long time2 = System.currentTimeMillis() + 10000 + _random.nextInt(6) * 1000;

pc.setFishingTime(time2);

} else if (chance < 134) {

successFishing(pc, 21051, "$5269"); // 2.5%물에 젖은 투구

long time2 = System.currentTimeMillis() + 10000 + _random.nextInt(6) * 1000;

pc.setFishingTime(time2);

} else if (chance < 139) {

successFishing(pc, 21052, "$5270"); // 2.5%물에 젖은 망토

long time2 = System.currentTimeMillis() + 10000 + _random.nextInt(6) * 1000;

pc.setFishingTime(time2);

} else if (chance < 144) {

successFishing(pc, 21053, "$5271"); // 2.5%물에 젖은 갑옷

long time2 = System.currentTimeMillis() + 10000 + _random.nextInt(6) * 1000;

pc.setFishingTime(time2);

} else if (chance < 159) {

successFishing(pc, 21054, "$5272"); // 2.5%물에 젖은 장갑

long time2 = System.currentTimeMillis() + 10000 + _random.nextInt(6) * 1000;

pc.setFishingTime(time2);*/

} else if (chance < 161) {

successFishing(pc, 41252, " 진귀한 거북이 (1) 개"); // 1%

long time2 = System.currentTimeMillis() + 10000 + _random.nextInt(6) * 1000;

pc.setFishingTime(time2);

} else if (chance < 163) {

successFishing(pc, 555129, "상자 물고기 (1) 개"); // 1% //아이템번호

long time2 = System.currentTimeMillis() + 10000 + _random.nextInt(6) * 1000;

pc.setFishingTime(time2);

} else if (chance < 164) {

successFishing(pc, 555128, "반짝이는 비늘 (1) 개"); //0.5% //아이템번호

long time2 = System.currentTimeMillis() + 10000 + _random.nextInt(6) * 1000;

pc.setFishingTime(time2); //낚시시간 될려주기

} else if (chance < 172) { //4퍼 비늘나오게

successFishing(pc, 555128, "반짝이는 비늘 (1) 개"); // 1.0% //아이템번호

successFishing(pc, 41252, " 진귀한 거북이 (1) 개"); // 1%

pc.setFishingTime(0);

pc.setFishingReady(false);

pc.setFishing(false);

pc.sendPackets(new S_CharVisualUpdate(pc));

Broadcaster.broadcastPacket(pc, new S_CharVisualUpdate(pc));

pc.sendPackets(new S_ServerMessage(1163, "")); // 낚시가 종료했습니다.

removeMember(pc);



}else {

pc.sendPackets(new S_ServerMessage(1136, "")); // 낚시해에 실패했습니다.

pc.getInventory().consumeItem(41295, 1); //실패시 삭제

long time2 = System.currentTimeMillis() + 10000 + _random.nextInt(6) * 1000;

pc.setFishingTime(time2);

}



}

}

}

}

}



private void successFishing(L1PcInstance pc, int itemId, String message) {

L1ItemInstance item = ItemTable.getInstance().createItem(itemId);

item.startItemOwnerTimer(pc);

pc.getInventory().storeItem(item);

pc.getInventory().consumeItem(41295, 1); //먹이

pc.sendPackets(new S_ServerMessage(1185, message));//낚시에 성공했습니다.

if (!pc.getInventory().checkItem(41295)) { //먹이



pc.setFishingTime(0);

pc.setFishingReady(false);

pc.setFishing(false);

pc.sendPackets(new S_CharVisualUpdate(pc));

Broadcaster.broadcastPacket(pc, new S_CharVisualUpdate(pc));

pc.sendPackets(new S_ServerMessage(1137)); //낚시를하기 위해선 먹이가 필요합니다.

removeMember(pc);



}

}

}



C_ItemUSe.java



private void startFishing(L1PcInstance pc, int itemId, int fishX, int fishY) { //검색추가

if (pc.getMapId() != 5302

fishX <= 32704

fishX >= 32831



fishY <= 32768

fishY >= 32895) {

// 여기에 낚싯대를 던질 수 없습니다.

pc.sendPackets(new S_ServerMessage(1138));

return;

}

 
더 많은 자료는 http://www.sofree.co.kr

댓글 없음:

댓글 쓰기