package server.events;
import client.MapleCharacter;
import constants.GameConstants;
import handling.channel.ChannelServer;
import handling.world.WorldBroadcastService;
import server.MapleInventoryManipulator;
import server.RandomRewards;
import server.Randomizer;
import server.Timer.EventTimer;
import server.maps.FieldLimitType;
import server.maps.MapleMap;
import server.maps.SavedLocationType;
import tools.FileoutputUtil;
import tools.MaplePacketCreator;
import tools.StringUtil;
public abstract class MapleEvent {
protected MapleEventType type;
protected int channel;
protected int playerCount = 0;
protected boolean isRunning = false;
public MapleEvent(int channel, MapleEventType type) {
this.channel = channel;
this.type = type;
}
public void incrementPlayerCount() {
this.playerCount += 1;
if (this.playerCount == 250) {
setEvent(ChannelServer.getInstance(this.channel), true);
}
}
public MapleEventType getType() {
return this.type;
}
public boolean isRunning() {
return this.isRunning;
}
public MapleMap getMap(int i) {
return getChannelServer().getMapFactory().getMap(this.type.mapids[i]);
}
public ChannelServer getChannelServer() {
return ChannelServer.getInstance(this.channel);
}
public void broadcast(byte[] packet) {
for (int i = 0; i < this.type.mapids.length; i++) {
getMap(i).broadcastMessage(packet);
}
}
public static void givePrize(MapleCharacter chr) {
int reward = RandomRewards.getEventReward();
if (reward == 0) {
int mes = Randomizer.nextInt(900000) + 100000;
chr.gainMeso(mes, true, false);
chr.dropMessage(5, "你获得了 " + mes + " 金币。");
} else if (reward == 1) {
int cs = Randomizer.nextInt(50) + 50;
chr.modifyCSPoints(1, cs, true);
chr.dropMessage(5, "你获得了 " + cs + " 点点券。");
} else if (reward == 2) {
int fe = Randomizer.nextInt(5) + 1;
chr.addFame(fe);
chr.dropMessage(5, "你获得了 " + fe + " 点人气。");
} else if (reward == 3) {
chr.dropMessage(5, "你悲剧了,什么也没得到.");
} else {
int max_quantity = 1;
switch (reward) {
case 5062000:
max_quantity = 1;
break;
case 5220040:
max_quantity = 1;
break;
case 5062002:
max_quantity = 1;
}
int quantity = (max_quantity > 1 ? Randomizer.nextInt(max_quantity) : 0) + 1;
if (MapleInventoryManipulator.checkSpace(chr.getClient(), reward, quantity, "")) {
MapleInventoryManipulator.addById(chr.getClient(), reward, (short) quantity, "活动获得 " + FileoutputUtil.CurrentReadable_Date());
} else {
givePrize(chr);
}
}
}
public abstract void finished(MapleCharacter paramMapleCharacter);
public abstract void startEvent();
public void onMapLoad(MapleCharacter chr) {
if ((GameConstants.isEventMap(chr.getMapId())) && (FieldLimitType.Event.check(chr.getMap().getFieldLimit())) && (FieldLimitType.Event2.check(chr.getMap().getFieldLimit()))) {
chr.getClient().getSession().write(MaplePacketCreator.showEventInstructions());
}
}
public void warpBack(MapleCharacter chr) {
int map = chr.getSavedLocation(SavedLocationType.EVENT);
if (map <= -1) {
map = 104000000;
}
MapleMap mapp = chr.getClient().getChannelServer().getMapFactory().getMap(map);
chr.changeMap(mapp, mapp.getPortal(0));
}
public void reset() {
this.isRunning = true;
this.playerCount = 0;
}
public void unreset() {
this.isRunning = false;
this.playerCount = 0;
}
public static void setEvent(ChannelServer cserv, boolean auto) {
if ((auto) && (cserv.getEvent() > -1)) {
for (MapleEventType t : MapleEventType.values()) {
final MapleEvent e = cserv.getEvent(t);
if (e.isRunning) {
for (int i : e.type.mapids) {
if (cserv.getEvent() == i) {
WorldBroadcastService.getInstance().broadcastMessage(MaplePacketCreator.serverMessageNotice("Entries for the event are now closed!"));
e.broadcast(MaplePacketCreator.serverMessageNotice("The event will start in 30 seconds!"));
e.broadcast(MaplePacketCreator.getClock(30));
EventTimer.getInstance().schedule(new Runnable() {
@Override
public void run() {
e.startEvent();
}
}, 30000L);
break;
}
}
}
}
}
cserv.setEvent(-1);
}
public static void mapLoad(MapleCharacter chr, int channel) {
if (chr == null) {
return;
}
for (MapleEventType t : MapleEventType.values()) {
MapleEvent e = ChannelServer.getInstance(channel).getEvent(t);
if (e.isRunning) {
if (chr.getMapId() == 109050000) {
e.finished(chr);
}
for (int i = 0; i < e.type.mapids.length; i++) {
if (chr.getMapId() == e.type.mapids[i]) {
e.onMapLoad(chr);
if (i == 0) {
e.incrementPlayerCount();
}
}
}
}
}
}
public static void onStartEvent(MapleCharacter chr) {
for (MapleEventType t : MapleEventType.values()) {
MapleEvent e = chr.getClient().getChannelServer().getEvent(t);
if (e.isRunning) {
for (int i : e.type.mapids) {
if (chr.getMapId() == i) {
e.startEvent();
setEvent(chr.getClient().getChannelServer(), false);
chr.dropMessage(5, String.valueOf(t.desc) + " has been started.");
}
}
}
}
}
public static String scheduleEvent(MapleEventType event, ChannelServer cserv) {
if ((cserv.getEvent() != -1) || (cserv.getEvent(event) == null)) {
return "The event must not have been already scheduled.";
}
for (int i : cserv.getEvent(event).type.mapids) {
if (cserv.getMapFactory().getMap(i).getCharactersSize() > 0) {
return "The event is already running.";
}
}
cserv.setEvent(cserv.getEvent(event).type.mapids[0]);
cserv.getEvent(event).reset();
WorldBroadcastService.getInstance().broadcastMessage(MaplePacketCreator.serverMessageNotice("Hello " + cserv.getServerName() + "! Let's play a " + StringUtil.makeEnumHumanReadable(event.desc) + " event in channel " + cserv.getChannel()));
return "";
}
}