close_btn
로그인, 회원가입후 더 많은 혜택을 누리세요 로그인 회원가입 닫기

에바일팩(3.63 공성소스)

2016.04.22 11:52

웨롭지않아 조회 수:157

에바팩 판도라팩 3.63버젼을 기준으로하였으며

테스트다해봤고 공성돌아가는거까지 확인했습니다 ㅎ

기존소스와달라진점은 캐슬테이블에 성만 추가하면 공성타이머부분은 알아서돌아줍니다.

이전처럼 소스+디비 다수정할필요는없어졌어요 제작 : 킹덤

 

WarTimeController.java

아래꺼 다 복사해서 고대로 컨트롤 A 컨트롤 V

/*
 * 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.TimeController;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;

import l1j.server.Config;
import l1j.server.server.datatables.CastleTable;
import l1j.server.server.datatables.CharacterTable;
import l1j.server.server.datatables.DoorSpawnTable;
import l1j.server.server.model.L1CastleLocation;
import l1j.server.server.model.L1Clan;
import l1j.server.server.model.L1Object;
import l1j.server.server.model.L1Teleport;
import l1j.server.server.model.L1War;
import l1j.server.server.model.L1WarSpawn;
import l1j.server.server.model.L1World;
import l1j.server.server.model.L1CastleData;
import l1j.server.server.model.Instance.L1CrownInstance;
import l1j.server.server.model.Instance.L1DoorInstance;
import l1j.server.server.model.Instance.L1FieldObjectInstance;
import l1j.server.server.model.Instance.L1PcInstance;
import l1j.server.server.model.Instance.L1TowerInstance;
import l1j.server.server.model.gametime.RealTimeClock;
import l1j.server.server.serverpackets.S_PacketBox;
import l1j.server.server.templates.L1Castle;

public class WarTimeController implements Runnable {
 private static WarTimeController _instance;

 private L1Castle _l1castle = null;

 private int ALT_WAR_TIME_UNIT = Config.ALT_WAR_TIME_UNIT;


  private int ALT_WAR_TIME = Config.ALT_WAR_TIME;


  private int ALT_WAR_INTERVAL_UNIT = Config.ALT_WAR_INTERVAL_UNIT;
  
  private int ALT_WAR_INTERVAL = Config.ALT_WAR_INTERVAL;

 private ArrayList<L1Castle> castlelist = new ArrayList<L1Castle>();

 private ArrayList<L1Castle> Waringcastlelist = new ArrayList<L1Castle>();

 private WarTimeController() {
  L1CastleData CD = new L1CastleData();
  castlelist = CD.CatleDate();  //성리스트를 넣는다.
 }
 /**
  * Run()
  */
 public void run() {
  try {
   while (true) {
    try {
     checkWarTime(); // 전쟁 시간을 체크
     Thread.sleep(1000);
    } catch (Exception e) {
    }
   }
  } catch (Exception e1) {
  }
 }
 /**
  * 싱글톤 패턴
  * @return _instance
  */
 public static WarTimeController getInstance() {
  if (_instance == null) {
   _instance = new WarTimeController();
  }
  return _instance;
 }
 /**
  * 테이블및 castle정보 reLoad
  */
 public void reload() {
  L1CastleData CD = new L1CastleData();
  castlelist = CD.CatleDate();  //성리스트를 넣는다.
 }
 /**
  *  해당성의 공성시간을 변경하고 공지한다.
  * @param name 성이름
  * @param cal 시간
  */
 public void setWarStartTime(String name, Calendar cal) {
  Calendar endtime;
  if (name == null) {
   return;
  }
  if (name.length() == 0) {
   return;
  }  
  int index =0;
  SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm");
  for (L1Castle castle : castlelist) {
   if (castle.getName().startsWith(name)) {
    index = castlelist.indexOf(castle);
    castle.setWarTime(cal);
     endtime = (Calendar) castle.getWarTime().clone();
     endtime.add(ALT_WAR_TIME_UNIT,ALT_WAR_TIME);
    castlelist.set(index,castle);
    // 모든 유저에게 공성시간 알리기
    L1World.getInstance().broadcastServerMessage(String.format("%s공성시간: %s ~ %s", castle.getName(), formatter.format(castle.getWarTime()), formatter.format(endtime)));
   }
  }
 }

 /**
  * void 공성시간체크
  */
 private void checkWarTime() {
  Calendar Rtime = RealTimeClock.getInstance().getRealTimeCalendar();
  Calendar endtime;
  int index = 0;
  for(L1Castle _castle : castlelist){
   index = castlelist.indexOf(_castle);
    endtime = (Calendar) _castle.getWarTime().clone();
      endtime.add(ALT_WAR_TIME_UNIT,ALT_WAR_TIME);
      if(_castle.getWarTime().before(Rtime) && endtime.after(Rtime)){
       if (!_castle.isNowwar()){
        _castle.setNowwar(true);
        castlelist.set(index,_castle);
        StartWar(_castle);
        System.out.println(_castle.getName()+"시작");
       }
      }else if (endtime.before(Rtime)){
       if (_castle.isNowwar()){
        EndWar(_castle);
        System.out.println(_castle.getName()+"종료");
       }
      }
  }
 }

 /**
  * 공성시간이맞다면 공성시작
  * @param _castle2 castlelist의 index
  */
 private void StartWar(L1Castle _castle){
  L1WarSpawn warspawn = null;
  warspawn = new L1WarSpawn();
  warspawn.SpawnFlag(_castle.getId()); // 깃발을 소환한다.
  // 성문을 수리해 닫는다
  for (L1DoorInstance door : DoorSpawnTable.getInstance()
    .getDoorList()) {
   if (L1CastleLocation.checkInWarArea(_castle.getId(), door)) {
    door.setAutoStatus(0);// 자동수리를 해제
    door.repairGate();
   }
  }
  if (_castle.getCastleSecurity() == 1){
   securityStart(_castle);// 치안관리
  }
   for (L1War war : L1World.getInstance().getWarList()) {
       if (war == null) {
        continue;
       }
       for (String attackClan : war.GetAttackClanList()) {
        war.CeaseWar(attackClan, war.GetDefenceClanName());
       }
      }
  L1World.getInstance().broadcastPacketToAll(new S_PacketBox(S_PacketBox.MSG_WAR_BEGIN, _castle.getId())); // %s의
  // 공성전이
  // 시작되었습니다.
  L1World.getInstance().broadcastPacketToAll(new S_PacketBox(S_PacketBox.GREEN_MESSAGE,"공성전이 시작되었습니다~~!!! "));
  int[] loc = new int[3];
  L1Clan clan = null;
  for (L1PcInstance pc : L1World.getInstance()
    .getAllPlayers()) {
   int castleId = _castle.getId();
   if (L1CastleLocation.checkInWarArea(castleId, pc)
     && !pc.isGm()) {
    clan = L1World.getInstance().getClan(
      pc.getClanname());
    if (clan != null) {
     if (clan.getCastleId() == castleId) {
      continue;
     }
    }
    loc = L1CastleLocation.getGetBackLoc(castleId);
    L1Teleport.teleport(pc, loc[0], loc[1],
      (short) loc[2], 5, true);
   }
  }
 }

 /**
  * 공성시간이 지났다면 공성종료
  * @param _castle2 castlelist의 index
  */
 private void EndWar(L1Castle _castle){
  _castle.setNowwar(false);
  L1World.getInstance().broadcastPacketToAll(
    new S_PacketBox(S_PacketBox.MSG_WAR_END, _castle.getId())); // %s의
  // 공성전이
  // 종료했습니다.
   _castle.getWarTime().add(ALT_WAR_INTERVAL_UNIT, ALT_WAR_INTERVAL);
  _castle.setTaxRate(10); // 세율10프로
  CastleTable.getInstance().updateCastle(_castle);
  castlelist.set(_castle.getId(), _castle); // 저장
  WarParkClear(_castle.getId());
 }
 /**
  * 공성존 정리 (깃발,왕관,수호탑수리등등)
  * @param castleNum castleID
  */
 private void WarParkClear(int castleNum){
  L1WarSpawn warspawn = null;
  int castle_id = castleNum;
  L1FieldObjectInstance flag = null;
  L1CrownInstance crown = null;
  L1TowerInstance tower = null;


  for (L1Object l1object : L1World.getInstance().getObject()) {
   // 전쟁 에리어내의 기를 지운다
   if (l1object instanceof L1FieldObjectInstance) {
    flag = (L1FieldObjectInstance) l1object;
    if (L1CastleLocation
      .checkInWarArea(castle_id, flag)) {
     flag.deleteMe();
    }
   }
   // 크라운이 있는 경우는, 크라운을 지워 타워를 spawn 한다
   if (l1object instanceof L1CrownInstance) {
    crown = (L1CrownInstance) l1object;
    if (L1CastleLocation.checkInWarArea(castle_id,
      crown)) {
     crown.deleteMe();
    }
   }
   if (l1object instanceof L1TowerInstance) {
    tower = (L1TowerInstance) l1object;
    if (L1CastleLocation.checkInWarArea(castle_id,
      tower)) {
     tower.deleteMe();
    }
   }
  }
  warspawn = new L1WarSpawn();
  warspawn.SpawnTower(castle_id);
  for (L1DoorInstance door : DoorSpawnTable.getInstance()
    .getDoorList()) {
   if (L1CastleLocation.checkInWarArea(castle_id, door)) {
    door.repairGate();
   }
  }
 }

 // 공성종료
 public void stopWar(String name) {
  if (name == null) {
   return;
  }
  if (name.length() == 0) {
   return;
  }
  int index = 0;
  for(L1Castle _castle : castlelist){
   if (_castle.getName().startsWith(name)) {
    _castle.setNowwar(false);
    index = castlelist.indexOf(_castle);
    L1World.getInstance().broadcastPacketToAll(
      new S_PacketBox(S_PacketBox.MSG_WAR_END, _castle.getId())); // %s의
    // 공성전이
    // 종료했습니다.
     _castle.getWarTime().add(ALT_WAR_INTERVAL_UNIT, ALT_WAR_INTERVAL);

    _castle.setTaxRate(10); // 세율10프로
    CastleTable.getInstance().updateCastle(_castle);
    castlelist.set(index, _castle); // 저장
    WarParkClear(_castle.getId());
   }
  }
 }
 /**
  * 현재 공성중인성인지 
  * @param castlenum Castle ID
  * @return == ID ? True : false
  */
 public boolean isNowWar(int castlenum) {
  for(L1Castle _castle : castlelist){
   if(_castle.getId() ==castlenum){
    if(_castle.isNowwar()){
     return true;
    }
   }
  }
  return false;
 }
 /**
  * 해당유저에게 공성중인 성을 알려주는 메세지
  * @param player 넘어오는 player
  */
 public void checkCastleWar(L1PcInstance player) {
  for(L1Castle _castle : castlelist){
   if (_castle.isNowwar()) {
    player.sendPackets(new S_PacketBox(S_PacketBox.MSG_WAR_GOING,_castle.getId())); // %s의 공성전이 진행중입니다.
    // L1World.getInstance().broadcastPacketToAll(new S_PacketBox(S_PacketBox.GREEN_MESSAGE,"공성전이 진행중입니다. "));
   }
  }
 }
 //공성종료
 private void securityStart(L1Castle castle) {
  int castleId = castle.getId();
  int a = 0, b = 0, c = 0, d = 0, e = 0;
  int[] loc = new int[3];
  L1Clan clan = null;

  switch (castleId) {
  case 1:
  case 2:
  case 3:
  case 4:
   a = 52;
   b = 248;
   c = 249;
   d = 250;
   e = 251;
   break;
  case 5:
  case 6:
  case 7:
  default:
   break;
  }

  for (L1PcInstance pc : L1World.getInstance().getAllPlayers()) {
   if ((pc.getMapId() == a || pc.getMapId() == b || pc.getMapId() == c
     || pc.getMapId() == d || pc.getMapId() == e)
     && !pc.isGm()) {
    clan = L1World.getInstance().getClan(pc.getClanname());
    if (clan != null) {
     if (clan.getCastleId() == castleId) {
      continue;
     }
    }
    loc = L1CastleLocation.getGetBackLoc(castleId);
    L1Teleport
    .teleport(pc, loc[0], loc[1], (short) loc[2], 5, true);
   }
  }
  castle.setCastleSecurity(0);
  CastleTable.getInstance().updateCastle(castle);
  CharacterTable.getInstance().updateLoc(castleId, a, b, c, d, e);
 }
}

이건 l1j.server.server.model 폴더에 위치해주시면되고

새로만드셔야되는 java파일입니다. 파일명 대소문자 꼭 똑같이하세요

L1CastleDate.java

package l1j.server.server.model;

import java.util.ArrayList;
import java.util.Calendar;

import l1j.server.server.datatables.CastleTable;
import l1j.server.server.templates.L1Castle;

public class L1CastleData {
 private ArrayList<L1Castle> castlelist = new ArrayList<L1Castle>();
 
 public L1CastleData(){
  Calendar endtime;
  castlelist = CastleTable.getInstance().CastleLoad();
 }

 public ArrayList<L1Castle> CatleDate(){
  return castlelist;
 }
}

 

 

CastleTable.java 아래꼐 없다면 추가해주세요

/**
  * Castle Table ArrayList형식으로 넘겨준다
  * @return ArrayList<L1Castle>
  */
 public ArrayList<L1Castle> CastleLoad(){
  Connection con = null;
  PreparedStatement pstm = null;
  ResultSet rs = null;
  ArrayList<L1Castle> castlelist = new ArrayList<L1Castle>();
  L1Castle _castle = null;
  try{
   con = L1DatabaseFactory.getInstance().getConnection();
   pstm = con
     .prepareStatement("Select * from castle");
   rs = pstm.executeQuery();
   while(rs.next()){
    _castle = new L1Castle(rs.getInt(1),rs.getString(2));
    _castle.setWarTime(timestampToCalendar((Timestamp) rs
      .getObject(3)));
    _castle.setTaxRate(rs.getInt(4));
    _castle.setPublicMoney(rs.getInt(5));
    _castle.setPublicReadyMoney(rs.getInt(6));
    _castle.setShowMoney(rs.getInt(7));
    _castle.setWarBaseTime(rs.getInt(8));
    _castle.setCastleSecurity(rs.getInt(9));
    castlelist.add(_castle);
   }
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   SQLUtil.close(pstm);
   SQLUtil.close(con);
   SQLUtil.close(rs);
  }
  return castlelist;
 }

번호 제목 글쓴이 날짜 조회 수
공지 소스자료는 직접 올려주세요 게임존 2017.06.06 550
109 참 시스템 이드1 2016.04.26 186
108 채금시 전체공지로 보기 이드1 2016.04.26 32
107 소모성아이템 실시간시간보기 이드1 2016.04.26 66
106 몬스터 피통보이기 이드1 2016.04.26 114
105 단풍막대 변신몹추가 이드1 2016.04.26 107
104 보스몹 리젠 멘트띄우기 이드1 2016.04.26 142
103 마법연속으로죽지않을때 이드1 2016.04.26 27
102 올스킬 반지 이드1 2016.04.26 156
101 운영자 누구 귓말 친추 차단 이드1 2016.04.26 45
100 세이룬 [펌] 이드1 2016.04.26 70
99 둘리팩 디스스턴 중첩막기 이드1 2016.04.26 77
98 적주변에 있을시 외창금지 이드1 2016.04.26 59
97 힐량 체크하기 본섭화 [2] 로스트사가 2016.04.25 119
96 마법 중복으로 못배우게 하기 본섭화 로스트사가 2016.04.25 77
95 명령어로 아지트 지급하기!! 테스트완료 이해인 2016.04.25 98
94 린드 가호 본섭화 로스트사가 2016.04.25 97
93 신규혈 일정렙이상 자동탈퇴부분!! [1] 이해인 2016.04.25 69
92 스킬아이콘 순서 & 스킬창 28자리 8진수 로스트사가 2016.04.25 231
91 [본섭화]수호탑근처가면투명해제 로스트사가 2016.04.25 44
90 혈맹버프 아이콘 패킷부분임 로스트사가 2016.04.24 69
89 뻥튀기 소스 외부화 및 설정. 멘토 2016.04.24 68
88 경험치 지급단 레벨 수정 내멋 2016.04.23 137
87 유저 버프 추가 내멋 2016.04.23 191
86 제작 npc 만들기 내멋 2016.04.23 438
85 2.7버전 트레이저박스 인챈트 표시 내멋 2016.04.23 148
» 에바일팩(3.63 공성소스) 웨롭지않아 2016.04.22 157
83 장비에 버프효과 아이콘표기 로스트사가 2016.04.22 153
82 이벤트용 강제 변신무기 만들기(에바일팩소스) 웨롭지않아 2016.04.21 78
81 마법크리이펙트(에바일팩소스) 웨롭지않아 2016.04.21 115
80 홀,짝. 주사위 , 소막 겜블 소스 [3] file 로스트사가 2016.04.20 189
79 속성방어 본섭화??? 로스트사가 2016.04.20 73
78 드래곤볼소스 오징어소녀 2016.04.19 107
77 보스이동주문서. 오징어소녀 2016.04.19 218
76 보스리스폰 멘트 띄우기 오징어소녀 2016.04.19 138
75 클래스 변경물약 [3] 오징어소녀 2016.04.17 118
74 엔피씨에게 호칭주기 오징어소녀 2016.04.17 97
73 한계정내 두군대혈 가입못하게하는소스 오징어소녀 2016.04.17 55
72 랭커들 아이템 지급하기 오징어소녀 2016.04.17 144
71 혈맹창고내역 file 오징어소녀 2016.04.17 52
70 10렙당 추타 1 부여하기 오징어소녀 2016.04.17 111
69 쇼크 스턴 본섭화입니다. 이상 무 ~ LoseF 2016.04.17 179
68 혈맹 미가입시 상점이용제한 [1] 오징어소녀 2016.04.17 66
67 사망경험치 본섭화 소스 로스트사가 2016.04.16 60
66 데스나이트의 불검 본섭화 로스트사가 2016.04.16 151
65 젠틀님의 요청으로 인해 올립니다 [같은 계정 다른혈맹 중복가입 불가능] [1] SNIKUDO 2016.04.15 60
64 1.82 소스 노 컴파일입니다. file 조안로페즈 2016.04.15 144
63 앱솔루트 블레이드 수정본입니다. [4] LoseF 2016.04.13 147
62 [본섭화] 공성선포시 혈맹원이 공성존 안에있다면 마을로 베르 로스트사가 2016.04.11 62
61 아이콘찾기 출처*팝존* jpark33 2016.04.08 173
60 아이템 옵션 바꾸기 출처*팝존* [1] jpark33 2016.04.08 621