배틀존 소스 구성하기.
5100003 richard3 richard3
5100003 배틀존 입장 배틀존 입장 L1Merchant 1049 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0
L1Character.java
//배틀존 설정
private int _BattleLine;
public int get_BattleLine(){
return _BattleLine;
}
public void set_BattleLine(int i){
_BattleLine = i;
}
private boolean _BattleOk;
public void setBattleOk(boolean BattleOk){
_BattleOk = BattleOk;
}
public boolean getBattleOk(){
return _BattleOk;
}
//배틀존 설정
*********************************************************************************************************
C_Restart.java
if (client.getActiveChar() != null) {
L1PcInstance pc = client.getActiveChar();
pc.setadFeature(1);
pc.save();
pc.saveInventory(); <<검색
// 배틀존 추가
if(pc.getMapId() == 208){
if(pc.getBattleOk()){
return;
}
}
*********************************************************************************************************
C_SelectCharacter.java
if (pc.getMapId() == 101){// 오만의 탑 귀환 설정일경우 1층으로 세팅되어있음
int rnd = ran.nextInt(omanLocX.length);
pc.setX(omanLocX[rnd]);
pc.setY(omanLocY[rnd]);
pc.setMap((short) 101);
} <<검색
//배틀존추가
if(pc.getMapId() == 208){
L1Teleport.teleport(pc, 33442, 32799, (short) 4, 0, true);
}
*********************************************************************************************************
L1Pcinstance.java
if(isDeathMatch()){
if(getMapId() == 5153){
try {
this.setCurrentHp(getMaxHp());
save();
beginGhost(getX(), getY(), (short) getMapId(), true);
sendPackets(new S_ServerMessage(1271));
} catch (Exception e) {
_log.log(Level.SEVERE, e.getLocalizedMessage(), e);
}
return;
}
} else {
death(attacker);
if (attacker instanceof L1PcInstance){ <<검색
if (damage > 0) { //배틀존추가
if(get_BattleLine() != 0 && attacker.get_BattleLine() != 0){
if(get_BattleLine() == attacker.get_BattleLine()){
return;
}
}
} //배틀존여기까지
///////3차 수정임 검색하셔서 완전 교체하세요
public void setCurrentHp(int i) {
if (getCurrentHp() == i) return;
if(isGm()) i = getMaxHp();
super.setCurrentHp(i);
sendPackets(new S_HPUpdate(getCurrentHp(), getMaxHp()));
if (isInParty()) getParty().updateMiniHP(this);
//배틀존 추가
if(this.getBattleOk()){
if(this.getMapId() != 5083){
updateMiniHP(this);
}
}
}
//배틀존 적당한 곳에 넣어주세요.
private void updateMiniHP(L1PcInstance pc){
for (L1PcInstance member : BattleZoneController.getInstance().getBattleMembers()){
if(member != null){
if(pc != member){
if(pc.get_BattleLine() == member.get_BattleLine()){
member.sendPackets(new S_HPMeter(pc.getId(), 100 * pc.getCurrentHp() / pc.getMaxHp()));
}
}
}
}
}
*********************************************************************************************************
C_ReturnToLogin.java
public C_ReturnToLogin(byte decrypt[], LineageClient client) throws Exception {
super(decrypt);
String account = client.getAccountName();
_log.finest((new StringBuilder()).append("account : ").append(account).toString()); <<검색
if(client.getActiveChar().getBattleOk()){//배틀존추가
if (client.getActiveChar() != null) {
if(client.getActiveChar().getMapId() == 208){
return;
}
}
}
*********************************************************************************************************
GmCommands.java
else if (cmd.equalsIgnoreCase("배틀존")){
boolean power = false;
if(!power){
BattleZoneController.getInstance().start();
//상태 초기화
BattleZoneController.getInstance().setBattleOpen(true);
BattleZoneController.getInstance().setBattleOne(true);
BattleZoneController.getInstance().setBattleStart(false);
BattleZoneController.getInstance().setBattling(false);
BattleZoneController.getInstance().BattleTime();
gm.sendPackets(new S_SystemMessage("배틀존 시작하였습니다."));
}else {
gm.sendPackets(new S_SystemMessage("이미 배틀존 실행하였습니다."));
}
}
*********************************************************************************************************
L1Merchantinstance.java
case 4220012:
if (player.getInventory().checkItem(437027, 1)
|| player.getInventory().checkItem(437028, 1)
|| player.getInventory().checkItem(437029, 1)
|| player.getInventory().checkItem(437030, 1)){
htmlid = "suschef2";
}/* else {
htmlid = "suschef1";
}*/
break; <<검색
//배틀존 추가
case 5100003:
BattleZone(player);
break;
-----------------------------------------------
//배틀존 추가 적당한 곳에 넣어주세요
private void BattleZone(L1PcInstance pc) {
//배틀존이 열리지 않았다면
if(BattleZoneController.getInstance().getBattleOpen() == true){
pc.sendPackets(new S_SystemMessage("\\fW배틀존이 열리지 않았습니다."));
return;
}
if(BattleZoneController.getInstance().getBattleCount() == 20){
pc.sendPackets(new S_SystemMessage("\\fW배틀존의 인원이 모두찼습니다."));
return;
}
if(BattleZoneController.getInstance().getBattleStart() == false){
pc.sendPackets(new S_SystemMessage("\\fW배틀존의 입장시간이 아닙니다."));
return;
}
if (pc.isInParty()) {
pc.sendPackets(new S_SystemMessage("\\fW파티중에는 배틀존 입장이 불가능합니다."));
return;
}
if(pc.getLevel() < 64){
pc.sendPackets(new S_SystemMessage("\\fW 65레벨부터 입장 가능합니다."));
return;
}
pc.setBattleOk(true);
L1Teleport.teleport(pc, 32770 ,32837, (short) 5083, 0, true);
pc.sendPackets(new S_SystemMessage("\\fW2분 후에 배틀존으로 이동됩니다."));
BattleZoneController.getInstance().addBattleList(pc); //배틀존 리스트에 pc를 저장한다.
}
*********************************************************************************************************
C_NPCAction.java
else if (((L1NpcInstance) obj).getNpcTemplate().get_npcId() == 5100003) { // 배틀존
if(BattleZoneController.getInstance().getBattleOpen() == true) {
pc.sendPackets(new S_SystemMessage("\\fY 배틀존이 열렸습니다. 입장가능합니다."));
L1Teleport.teleport(pc, 32759 ,32838, (short) 5083, 0, true);
}else{
pc.sendPackets(new S_SystemMessage("\\fY 배틀존이 아직 열리지 않았습니다."));
return;
}
*********************************************************************************************************
BattleZoneController.java 자바 만들어서 l1j.server.server.TimeController 폴더에 추가
*********************************************************************************************************
package l1j.server.server.TimeController;
import l1j.server.server.GeneralThreadPool;
import l1j.server.server.model.L1PolyMorph;
import l1j.server.server.model.L1Teleport;
import l1j.server.server.model.L1World;
import l1j.server.server.model.Instance.L1PcInstance;
import l1j.server.server.serverpackets.S_HPMeter;
import l1j.server.server.serverpackets.S_SystemMessage;
import java.util.ArrayList;
import java.util.List;
public class BattleZoneController{
private static BattleZoneController _instance;
public static BattleZoneController getInstance(){
if(_instance == null){
_instance = new BattleZoneController();
}
return _instance;
}
public void start(){
GeneralThreadPool.getInstance().execute(new TimeUpdater());
}
//배틀존 리스트
private final List<L1PcInstance> _BattleList = new ArrayList<L1PcInstance>();
///배틀존 리스트에 인원을 추가한다.
public void addBattleList(L1PcInstance pc){
if (pc == null || _BattleList.contains(pc)){
return;
}
_BattleList.add(pc);
}
//리스트에서 인원수를 삭제한다
public void removeBattleList(L1PcInstance pc){
if (pc == null || !_BattleList.contains(pc)){
return;
}
_BattleList.remove(pc);
}
//배틀존 인원수 체크
public int getBattleCount(){
return _BattleList.size();
}
public L1PcInstance[] getBattleMembers() {
return (L1PcInstance[]) _BattleList.toArray(new L1PcInstance[_BattleList.size()]);
}
//리스트 안의 모든 객체를 지운다.
public void BattleListClear(){
_BattleList.clear();
}
//시작 여부를 판단하기 위해.
private boolean _BattleStart;
public boolean getBattleStart() {
return _BattleStart;
}
public void setBattleStart(boolean Battle) {
_BattleStart = Battle;
}
//최초 시작시간설정.
private boolean _BattleOne;
public boolean getBattleOne(){
return _BattleOne;
}
public void setBattleOne(boolean BattleOne){
_Battleone = BattleOne;
}
//배틀중인지를 판단
private boolean _Battling;
public boolean getBattling(){
return _Battling;
}
public void setBattling(boolean Battling){
_Battling = Battling;
}
//배틀존의 오픈 여부
private boolean _BattleOpen;
public boolean getBattleOpen() {
return _BattleOpen;
}
public void setBattleOpen(boolean Battle) {
_BattleOpen = Battle;
}
//
public int BattleCount;
private boolean Close;
//
//시간 설정 부분.
private long _endTime;
public long getendTime(){
return _endTime;
}
// 기본적으로 1시간을 설정합니다.
public void setendTime(long endTime){
_endTime = endTime;
}
//오픈시각설정
private long _openTime;
public long getopenTime(){
return _openTime;
}
public void setopenTime(long openTime){
_openTime = openTime;
}
//입장시각
private long _InBattleTime;
public long getInBattleTime(){
return _InBattleTime;
}
public void setInBattleTime(long InBattleTime){
_InBattleTime = InBattleTime;
}
private int ADeadCount;
private int BDeadCount;
//배틀존 통합시간 설정
public void BattleTime(){
if(getBattleOne()){//최초 시작이라면
setendTime(System.currentTimeMillis() + 10000);//최초 시작시 딜레이 10초.
}else{
setendTime(System.currentTimeMillis() + 3600000);//후 배틀존 쿨타임 기본 1시간 3600000
}
setopenTime(getendTime() + 10000); //딜레이 10초
setInBattleTime(getopenTime() + 120000);//입장 시간 2분
}
private class TimeUpdater implements Runnable {
public void run() {
try {
while (true) {
if(getBattleOpen()){//입장여부를 판단한다.
if(getopenTime() < System.currentTimeMillis()){//오픈 시각이라면
L1World.getInstance().broadcastServerMessage("\\fW배틀존이 열렸습니다. 2분 동안 입장 가능합니다.");
setBattleOpen(false);
setBattleStart(true);
}
}else if(getBattleStart()){
if(getInBattleTime() < System.currentTimeMillis()){//입장시간이 다되었다면
L1World.getInstance().broadcastServerMessage("\\fW배틀존 입장시간이 종료되었습니다.");
setBattleStart(false);
setBattling(true);
InBattle();
}
}else if(getBattling()){//배틀존이 시작되었다면
BattleStart();
}
Thread.sleep(1000);
}
}catch(Exception e){
e.printStackTrace();
}
}
}
//배틀존으로 이동.
private void InBattle(){
//리스트에 담겨있는 사람의 수만큼 입장시킨다.
for (int i = 0; i < _BattleList.size(); i++) {
L1PcInstance pc = (L1PcInstance) _BattleList.get(i);//리스트에서 사람을 가져온다.
if(pc != null){
if (pc.getMapId() == 5083){//대기장에 사람이 있다면.
if(pc.getBattleOk()){//입장이 허용된 사람이라면.
if(i % 2 == 0){//짝수일 경우
pc.set_BattleLine(2);
L1Teleport.teleport(pc, 33513 ,32743, (short) 208, 0, true);
pc.sendPackets(new S_SystemMessage("배틀존으로 입장하셨습니다. B라인"));
Poly(pc, 2);
createHp(pc);
}else{//홀수일경우
pc.set_BattleLine(1);
L1Teleport.teleport(pc, 33498 ,32728, (short) 208, 0, true);
pc.sendPackets(new S_SystemMessage("배틀존으로 입장하셨습니다. A라인"));
Poly(pc, 1);
createHp(pc);
}
}else{
pc.sendPackets(new S_SystemMessage("비정상적인 입장으로 이동되지 않았습니다."));
L1Teleport.teleport(pc, 33442, 32799, (short) 4, 0, true);
}
}
}
}
}
private void BattleStart(){
//초기화
ADeadCount = 0;
BDeadCount = 0;
//실시간으로 ** 유저수를 체크한다.
for (L1PcInstance pc : getBattleMembers()) {
if(pc != null){
if(!pc.isDead() && pc.getMapId() == 208){
if(pc.get_BattleLine() == 1){
ADeadCount += 1;
}else{
BDeadCount += 1;
}
}
}
}
//끝날 시간이 아니라면
if(getendTime() < System.currentTimeMillis()){
if(ADeadCount >= 1 && BDeadCount ==0){//살아있는 A사람이 1보다 크고, B사람이 0명이라면 종료
BattleEnd(ADeadCount, BDeadCount);
}else if(BDeadCount >= 1 && ADeadCount == 0){//살아있는 B사람이 1보다크고, A사람이 0명이라면 종료
BattleEnd(ADeadCount, BDeadCount);
}
}else{//끝날 시간이 지났다면 바로 강제종료
BattleEnd(ADeadCount, BDeadCount);
}
if(getBattleCount() == 0){ //참가자가 없을 경우
BattleEnd(0, 0);
}
}
private void BattleEnd(int countA, int countB){
int winLine = 0;
switch(getBattleCount()){
case 0 ://참가자가 0명
winLine = 3;
L1World.getInstance().broadcastServerMessage("\\fW참가자가 없어 배틀존이 종료되었습니다.");
break;
case 1 ://1명 일때
winLine = 3;
L1World.getInstance().broadcastServerMessage("\\fW혼자서는 배틀존을 시작할 수 없습니다.");
L1World.getInstance().broadcastServerMessage("\\fW유저분들의 많은 참여 부탁드립니다.");
break;
default : //해당사항이 없으니 1명 이상이다
if(countA > countB){
winLine = 1;
L1World.getInstance().broadcastServerMessage("\\fW배틀존 A라인의 승리입니다.");
}else if(countA < countB){
winLine = 2;
L1World.getInstance().broadcastServerMessage("\\fW배틀존 B라인의 승리입니다.");
}else if (countA == countB){
winLine = 3;
L1World.getInstance().broadcastServerMessage("\\fW배틀존 무승부입니다.");
}
break;
}
//아이템 지급과 유저의 배틀 상태를 초기화한다.
for (L1PcInstance pc : getBattleMembers()) {
if(pc != null){
if(pc.get_BattleLine() == winLine){
//아이템 추가
pc.getInventory().storeItem(41159, 50);
pc.sendPackets(new S_SystemMessage("\\fW 신비한 날개 깃털(50)개를 얻었습니다."));
pc.set_BattleLine(0);
pc.setBattleOk(false);
deleteMiniHp(pc);
removeBattleList(pc);//전체 리스트 삭제가 재대로 작동안될때를 대비해서 다시 넣어둠
if(!pc.isDead()){//죽지 않은 사람은 마을로
L1Teleport.teleport(pc, 33442, 32799, (short) 4, 0, true);
}else{ // ** 사람에게는 메세지
pc.sendPackets(new S_SystemMessage("배틀존이 끝났습니다. 리스타트를 해주시기 바랍니다."));
}
}else{
pc.set_BattleLine(0);
pc.setBattleOk(false);
deleteMiniHp(pc);
removeBattleList(pc);//전체 리스트 삭제가 재대로 작동안될때를 대비해서 다시 넣어둠
if(!pc.isDead()){//죽지 않은 사람은 마을로
L1Teleport.teleport(pc, 33442, 32799, (short) 4, 0, true);
}else{ // ** 사람에게는 메세지
pc.sendPackets(new S_SystemMessage("배틀존이 끝났습니다. 리스타트를 해주시기 바랍니다."));
}
}
}
}
L1World.getInstance().broadcastServerMessage("\\fW배틀존이 종료되었습니다. 다음 입장시간은 1시간 후 입니다.");
setBattleOpen(true);
setBattleStart(false);
setBattleOne(false);
setBattling(false);
BattleTime();//시간초기화
BattleListClear();//리스트 클리어
}
// 미니 HP바를 생성한다.
private void createHp(L1PcInstance pc) {
for (L1PcInstance member : getBattleMembers()) {
if(member != null){
if(pc != member){
if(pc.get_BattleLine() == member.get_BattleLine()){//같은 라인의 멤버에게 HP바를 전송
member.sendPackets(new S_HPMeter(pc.getId(), 100 * pc.getCurrentHp() / pc.getMaxHp()));
pc.sendPackets(new S_HPMeter(member.getId(), 100 * member.getCurrentHp() / member.getMaxHp()));
}
}
}
}
}
//HP바를 삭제한다.
private void deleteMiniHp(L1PcInstance pc) {
for (L1PcInstance member : getBattleMembers()) {
if(member != null){
if(pc != member){
if(pc.get_BattleLine() == member.get_BattleLine()){
pc.sendPackets(new S_HPMeter(member.getId(), 0xff));
member.sendPackets(new S_HPMeter(pc.getId(), 0xff));
}
}
}
}
}
/*
[weapon]
* 1:sword, 2:dagger, 3:tohandsword, 4:bow, 5:spear, 6:blunt, 7:staff,
* 8:throwingknife, 9:arrow, 10:gauntlet, 11:claw, 12:edoryu, 13:singlebow,
* 14:singlespear, 15:tohandblunt, 16:tohandstaff
*/
private void Poly(L1PcInstance pc, int BattleLine){
int polyid = 0;
int time = 1800;
if (pc.getWeapon() != null){
//타입별 분류
switch(pc.getWeapon().getItem().getType()){
//활
case 4:
case 13:
if(BattleLine == 1){
polyid = 6269;
}else{
polyid = 6272;
}
L1PolyMorph.doPoly(pc, polyid, time, 1);
break;
//크로우 이도류
case 11:
case 12:
if(BattleLine == 1){
polyid = 6279;
}else{
polyid = 6280;
}
L1PolyMorph.doPoly(pc, polyid, time, 1);
break;
//지팡이
case 7:
case 16:
if(BattleLine == 1){
polyid = 6268;
}else{
polyid = 6271;
}
L1PolyMorph.doPoly(pc, polyid, time, 1);
break;
//그외..
default :
if(BattleLine == 1){
polyid = 6267;
}else{
polyid = 6270;
}
L1PolyMorph.doPoly(pc, polyid, time, 1);
break;
}
}else{
if(BattleLine == 1){
polyid = 6267;
}else{
polyid = 6270;
}
L1PolyMorph.doPoly(pc, polyid, time, 1);
}
}
}

멘토 님의 최근 댓글
1. 현재 라이브서버와 동일한 서버팩이며 버전으로 평가하자면 4.6 정도 되겠네요. 2. 한옵은 한옵에 맞는 접속기라 공개된접속기는 없고 업체에 구매해서 쓰는걸로 알고있습니다. 3. 환술사가 나오기 전이라 보시면 되겠네요. 해당하는 질문 답변을 모두 드렸습니다. 2016 05.17 Winhex를 쓰시면되죠 2016 05.13 사이하목걸이와 반지 착용하시면 해당 권환 생깁니다 2016 05.05 내용이 없네요 내용도 상세히 올려졌다면 보기 편한데말이죠 2016 05.03 지식인에 댓글 확인 ㄱㄱㄱㄱㄱㄱㄱㄱ 2016 05.01