오픈일정에 기반한 자동 스케쥴러
1. 목적
서버 오픈 이후 %일차 또는 %주차 이후 취해야할 서버측의 액션을 자동화 하기 위함
ex) 기본 장비 지급 상자 사용시 주차에 따른 차등 장비 지급
ex) 초보 사냥터 경험치의 주차별 차등 경험치 배율 적용
2. 소스 코드
package l1j.server.GameSystem;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.logging.Level;
import java.util.logging.Logger;
import l1j.server.server.GeneralThreadPool;
public class AutoScheduler implements Runnable {
private static final String OPEN_DATE = "2016-12-31"; // 서버 오픈일자
private static Logger _log = Logger.getLogger(AutoScheduler.class.getName());
private static AutoScheduler _instance = new AutoScheduler();
// 싱글톤 생성자
private AutoScheduler() {
try {
_sdf = new SimpleDateFormat("yyyy-MM-dd");
_openDate = Calendar.getInstance();
_openDate.setTime(_sdf.parse(OPEN_DATE));
} catch (ParseException e) {
_log.log(Level.WARNING, "", e);
}
}
/** 싱글톤 인스턴스 반환 **/
public static AutoScheduler getInstance() {
return _instance;
}
/** Thread 시작 **/
public synchronized void start() {
if (!_isStart) {
_isStart = true;
GeneralThreadPool.getInstance().execute(this);
}
}
private boolean _isStart; // Thread 생존 여부
SimpleDateFormat _sdf; // yyyy-MM-dd
private Calendar _openDate; // 오픈 일정
private int _day; // 오픈 %일차
private int _week; // 오픈 %주차
/** 오픈 몇일차 인지 반환 **/
public int getDay() {
return _day;
}
/** 오픈 몇주차 인지 반환 **/
public int getWeek() {
return _week;
}
/** 오픈일자 문자열 반환 **/
public String getOpenDate() {
return _sdf.format(_openDate.getTimeInMillis());
}
/** 현재일자 문자열 반환 **/
public String getRealTime() {
return _sdf.format(Calendar.getInstance().getTimeInMillis());
}
@Override
public void run() {
try {
while (_isStart) {
// 일자 변경 확인
if (isChangedDay()) {
changeDate(); // 일자 정보 변경
doAction(); // 일자 변경에 따른 액션
}
Thread.sleep(1000);
}
} catch (Exception e) {
_log.log(Level.WARNING, "", e);
}
}
// 일자 변경 확인
private boolean isChangedDay() {
int time = (int) ((Calendar.getInstance().getTimeInMillis() - _openDate.getTimeInMillis()) / 1000);
int day = (time / (24 * 60 * 60)) + 1;
return _day != day;
}
// 일자 정보 변경
private void changeDate() {
try {
int time = (int) ((Calendar.getInstance().getTimeInMillis() - _openDate.getTimeInMillis()) / 1000);
_day = (time / (24 * 60 * 60)) + 1; // 오픈날 부터 1일차
_week = (_day / 7) + 1; // 오픈주 부터 1주차
} catch (Exception e) {
_log.log(Level.WARNING, "", e);
}
}
// 일자 변경에 따른 액션
private void doAction() {
System.out.println("오픈일자 : " + getOpenDate());
System.out.println("현재일자 : " + getRealTime());
System.out.println("오늘은 오픈 " + getDay() + "일차(" + getWeek() + "주차) 입니다.");
}
}
3. 응용 방법
1) C_ItemUse.java 에서 상자 사용시 차등 인챈트 적용
int week = AutoScheduler.getInstance().getWeek();
int enchant = 6 + (week > 4 ? 4 : week); // 주차에 따른 7~10검 차등 지급
2) CalcExp.java 에서 차등 경험치 적용
int day = AutoScheduler.getInstance().getDay();
double dayPer = day / 100D;
add_exp += (int) (add_exp * dayPer); // 일차당 0.01% 추가 경험치
3) 일차/주차 변경시 그 외 서버측의 액션 추가
doAction() 메서드 안에서 처리
4. 기타
Config를 이용하면 서버의 전반적인 설정 자체를 스케쥴러에 따라 자동관리가 가능하게 됩니다.

찰떡01 님의 최근 댓글
ㄳ 2023 06.17 ㄱㅅ 2020 12.19 클라 공유 부탁드립니다. 2020 12.19 ㄱㅅ 2020 11.26 ㄱㅅ 2020 11.05