/*******************************************************************************
* Copyright 2015 Maximilian Stark | Dakror <mail@dakror.de>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package de.dakror.arise.net.packet;
import java.util.Arrays;
/**
* @author Dakror
*/
public abstract class Packet {
public static enum PacketTypes {
INVALID(null),
HANDSHAKE(Packet00Handshake.class),
LOGIN(Packet01Login.class),
DISCONNECT(Packet02Disconnect.class),
WORLD(Packet03World.class),
CITY(Packet04City.class),
RESOURCES(Packet05Resources.class),
BUILDING(Packet06Building.class),
RENAMECITY(Packet07RenameCity.class),
PLACEBUILDING(Packet08PlaceBuilding.class),
BUILDINGSTAGE(Packet09BuildingStage.class),
ATTRIBUTE(Packet10Attribute.class),
DECONSTRUCTBUILDING(Packet11DeconstructBuilding.class),
UPGRADEBUILDING(Packet12UpgradeBuilding.class),
BUILDINGLEVEL(Packet13BuildingLevel.class),
CITYLEVEL(Packet14CityLevel.class),
BARRACKSBUILDTROOP(Packet15BarracksBuildTroop.class),
BUILDINGMETA(Packet16BuildingMeta.class),
CITYATTACK(Packet17CityAttack.class),
BATTLERESULT(Packet18BattleResult.class),
TRANSFER(Packet19Transfer.class),
TAKEOVER(Packet20Takeover.class);
;
private Class<?> class1;
private PacketTypes(Class<?> class1) {
this.class1 = class1;
}
public int getID() {
return ordinal() - 1;
}
public Class<?> getPacketClass() {
return class1;
}
}
public byte packetID;
public Packet(int packetID) {
this.packetID = (byte) packetID;
}
protected abstract byte[] getPacketData();
public byte[] getData() {
byte[] strData = getPacketData();
byte[] data = new byte[strData.length + 1];
data[0] = packetID;
System.arraycopy(strData, 0, data, 1, strData.length);
return data;
}
public static String readData(byte[] data) {
return new String(Arrays.copyOfRange(data, 1, data.length)).trim();
}
public PacketTypes getType() {
return Packet.lookupPacket(packetID);
}
public static PacketTypes lookupPacket(int id) {
for (PacketTypes pt : PacketTypes.values()) {
if (pt.getID() == id) return pt;
}
return PacketTypes.INVALID;
}
public static Packet newInstance(PacketTypes type, byte[] data) {
if (type == PacketTypes.INVALID) return null;
try {
return (Packet) type.getPacketClass().getConstructor(byte[].class).newInstance(data);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}