Public Repository for the Magicbane Shadowbane Emulator
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

932 lines
24 KiB

// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
// Magicbane Emulator Project © 2013 - 2022
// www.magicbane.com
package engine.net.client.msg;
import engine.Enum.GameObjectType;
import engine.gameManager.DbManager;
import engine.net.AbstractConnection;
import engine.net.ByteBufferReader;
import engine.net.ByteBufferWriter;
import engine.net.client.ClientConnection;
import engine.net.client.Protocol;
import engine.objects.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;
public class OpenFriendsCondemnListMsg extends ClientNetMsg {
private int messageType;
private ArrayList<Integer> characterList;
private int buildingType;
private int buildingID;
private int playerType;
private int playerID;
private int guildID;
private int inviteType;
private ConcurrentHashMap<Integer,BuildingFriends>friends;
private int removeFriendType;
private int removeFriendID;
private boolean reverseKOS; //TODO Rename this for to fit ReverseKOS/Activate/deactive Condemned.
private ConcurrentHashMap<Integer,Condemned> guildCondemned;
private int nationID;
public OpenFriendsCondemnListMsg(int messageType,ConcurrentHashMap<Integer,BuildingFriends>friends) {
super(Protocol.OPENFRIENDSCONDEMNLIST);
this.messageType = messageType;
this.friends = friends;
}
public OpenFriendsCondemnListMsg(int messageType,ConcurrentHashMap<Integer,Condemned> guildCondemned ,boolean reverse) {
super(Protocol.OPENFRIENDSCONDEMNLIST);
this.messageType = messageType;
this.guildCondemned = guildCondemned;
this.reverseKOS = reverse;
}
// clone
public OpenFriendsCondemnListMsg(OpenFriendsCondemnListMsg openFriendsCondemnListMsg) {
super(Protocol.OPENFRIENDSCONDEMNLIST);
this.messageType = openFriendsCondemnListMsg.messageType;
this.guildCondemned = openFriendsCondemnListMsg.guildCondemned;
this.reverseKOS = openFriendsCondemnListMsg.reverseKOS;
this.playerType = openFriendsCondemnListMsg.playerType;
this.playerID = openFriendsCondemnListMsg.playerID;
this.inviteType = openFriendsCondemnListMsg.inviteType;
this.removeFriendID = openFriendsCondemnListMsg.removeFriendID;
this.removeFriendType = openFriendsCondemnListMsg.removeFriendType;
this.reverseKOS = openFriendsCondemnListMsg.reverseKOS;
this.nationID = openFriendsCondemnListMsg.nationID;
this.buildingType = openFriendsCondemnListMsg.buildingType;
this.buildingID = openFriendsCondemnListMsg.buildingID;
this.friends = openFriendsCondemnListMsg.friends;
this.characterList = openFriendsCondemnListMsg.characterList;
}
public void configure() {
// Pre-Cache all players and guild targets
if (characterList == null)
return;
for (Integer uuid : characterList) {
PlayerCharacter player = (PlayerCharacter) DbManager.getObject(GameObjectType.PlayerCharacter, uuid);
if (player == null)
continue;
Guild guild = player.getGuild();
if (guild == null)
continue;
}
}
public void configureHeraldry(PlayerCharacter player){
}
/**
* This constructor is used by NetMsgFactory. It attempts to deserialize the
* ByteBuffer into a message. If a BufferUnderflow occurs (based on reading
* past the limit) then this constructor Throws that Exception to the
* caller.
*/
public OpenFriendsCondemnListMsg(AbstractConnection origin, ByteBufferReader reader) {
super(Protocol.OPENFRIENDSCONDEMNLIST, origin, reader); // openFriendsCondemnList =1239809615
characterList = new ArrayList<>();
}
/**
* Serializes the subclass specific items to the supplied NetMsgWriter.
*/
@Override
protected void _serialize(ByteBufferWriter writer) {
writer.putInt(this.messageType);
if (this.messageType == 2){
this.showHeraldy(writer);
return;
}
if (this.messageType == 4){
this.writeAddHealrdy(writer);
return;
}
if (this.messageType == 26){
showBuildingFriends(writer);
return;
}
if (this.messageType == 12){
this.showCondemnList(writer);
return;
}
if (this.messageType == 15){
this.removeCondemned(writer);
return;
}
if (this.messageType == 17){
this.handleActivateCondemned(writer);
return;
}
writer.putInt(0);
writer.putInt(this.characterList.size());
writer.putInt(this.characterList.size());
for (Integer uuid : characterList) {
PlayerCharacter player = (PlayerCharacter) DbManager.getObject(GameObjectType.PlayerCharacter, uuid);
if (player == null)
continue;
writer.put((byte) 1);
writer.putInt(0);
writer.putInt(0);
writer.putInt(1);
writer.putInt(GameObjectType.PlayerCharacter.ordinal());
writer.putInt(player.getObjectUUID());
Guild guild = player.getGuild();
Guild nation = null;
if (guild != null) {
writer.putInt(guild.getObjectType().ordinal());
writer.putInt(guild.getObjectUUID());
nation = guild.getNation();
if (nation != null) {
writer.putInt(nation.getObjectType().ordinal());
writer.putInt(nation.getObjectUUID());
} else {
writer.putInt(0);
writer.putInt(0);
}
} else {
for (int i=0;i<4;i++)
writer.putInt(0);
}
writer.putShort((short)0);
writer.put((byte)0);
writer.putString(player.getFirstName());
if (guild != null) {
GuildTag._serializeForDisplay(guild.getGuildTag(),writer);
} else {
writer.putInt(16);
writer.putInt(16);
writer.putInt(16);
writer.putInt(0);
writer.putInt(0);
}
if (nation != null) {
GuildTag._serializeForDisplay(nation.getGuildTag(),writer);
} else {
writer.putInt(16);
writer.putInt(16);
writer.putInt(16);
writer.putInt(0);
writer.putInt(0);
}
if (guild != null)
writer.putString(guild.getName());
else
writer.putString("[No Guild]");
if (nation != null)
writer.putString(nation.getName());
else
writer.putString("[No Nation]");
writer.putInt(0);
}
}
private void readHandleToItem(ByteBufferReader reader){
reader.getInt();
reader.getInt();
reader.getInt();
reader.getInt(); //object Type;
reader.getInt(); //objectID;
reader.getInt();
reader.getInt();
reader.getInt();
reader.getInt();
reader.getInt();
reader.getInt();
}
private void writeHandleToItem(ByteBufferWriter writer){
}
private void removeCondemned(ByteBufferWriter writer){
writer.putInt(0);
writer.putInt(playerType);
writer.putInt(playerID);
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
writer.putInt(removeFriendType);
writer.putInt(removeFriendID);
writer.putInt(buildingType);
writer.putInt(buildingID);
writer.putInt(0);
writer.putInt(0);
writer.putShort((short) 0);
}
/**
* Deserializes the subclass specific items from the supplied NetMsgReader.
*/
@Override
protected void _deserialize(ByteBufferReader reader) {
this.messageType = reader.getInt(); //25 on open of friends list // 28 friends list // 11 open condemned list // 14 Open condemned selection of (indivual, guild, nation)
if (this.messageType == 1){
this.viewHealrdy(reader);
return;
}
if (this.messageType == 4){
this.readAddHealrdy(reader);
return;
}
if (this.messageType == 6){
this.readRemoveHeraldry(reader);
return;
}
if (this.messageType == 11){
this.ackBuildingFriends(reader);
reader.get();
return;
}
if (this.messageType == 14){
this.addGuildCondemn(reader);
return;
}
if (this.messageType == 15){
this.removeFriendList(reader);
reader.get();
return;
}
if (this.messageType == 17){
this.handleActivateCondemned(reader);
return;
}
if (this.messageType == 18){
this.handleCondemnErrant(reader);
return;
}
if (this.messageType == 19){
this.handleKOS(reader);
return;
}
if (this.messageType == 23){
this.readHandleToItem(reader);
return;
}
if (this.messageType == 28){
addFriendsList(reader);
return;
}
if (this.messageType == 30){
removeFriendList(reader);
return;
}
if (this.messageType == 25){
ackBuildingFriends(reader);
return;
}
reader.getInt();
int size = reader.getInt();
reader.getInt(); //size again
for (int i=0;i<size;i++) {
reader.get();
reader.getInt(); //0
reader.getInt(); //0
reader.getInt(); //1
reader.getInt(); //Player Type
int ID = reader.getInt(); //Player ID
reader.getLong(); //Guild ID
reader.getLong(); //Nation ID
reader.getShort();
reader.get();
reader.getString(); //name
for (int j=0;j<10;j++)////////The problem is in here its stops here!!!!
reader.getInt(); //Guild and Nation tags
reader.getString(); //guild name
reader.getString(); //nation name
reader.getInt();
this.characterList.add(ID);
}
}
private void readRemoveHeraldry(ByteBufferReader reader){
reader.getInt();
reader.getInt();
reader.getInt();
this.playerType = reader.getInt();
this.playerID = reader.getInt();
reader.getInt();
reader.getInt();
reader.getInt();
reader.getInt();
reader.getInt();
reader.getInt();
}
private void handleActivateCondemned(ByteBufferReader reader){
reader.getInt();
this.removeFriendType=reader.getInt();
this.removeFriendID = reader.getInt();
reader.getInt();
this.buildingID = reader.getInt();
this.reverseKOS = reader.get() == 1? true:false;
reader.getInt();
reader.getInt();
reader.get();
}
private void handleCondemnErrant(ByteBufferReader reader){
reader.getInt();
this.removeFriendType=reader.getInt();
this.removeFriendID = reader.getInt();
reader.getInt();
this.buildingID = reader.getInt();
this.reverseKOS = reader.get() == 1? true:false;
reader.getInt();
reader.getInt();
reader.get();
}
private void handleActivateCondemned(ByteBufferWriter writer){
writer.putInt(0);
writer.putInt(removeFriendType);
writer.putInt(removeFriendID);
writer.putInt(GameObjectType.Building.ordinal());
writer.putInt(buildingID);
writer.put(reverseKOS ? (byte)1 : (byte)0);
writer.putInt(0);
writer.putInt(0);
writer.put((byte)0);
}
@Override
protected int getPowerOfTwoBufferSize() {
// Larger size for historically larger opcodes
return 12;
}
private void addGuildCondemn(ByteBufferReader reader){
reader.getInt();
this.inviteType = reader.getInt();
reader.getInt();
this.playerID = reader.getInt();
reader.getInt();
this.guildID = reader.getInt();
reader.getInt();
this.nationID = reader.getInt();
reader.getInt();
reader.getInt();
reader.getInt();
reader.getInt();
reader.getInt();
reader.getInt();
reader.getInt();
reader.getInt();
this.buildingID = reader.getInt();
reader.getLong();
reader.getShort();
}
private void addFriendsList(ByteBufferReader reader){
reader.getInt();
this.inviteType = reader.getInt(); //7 individual, 8 guild, 9 guild IC
this.playerType = reader.getInt();
this.playerID = reader.getInt();
reader.getInt();
this.guildID = reader.getInt();
reader.getLong(); //Nation, do we need this?
reader.getLong();
reader.getLong();
reader.getLong();
reader.getInt();
this.buildingType = reader.getInt();
this.buildingID = reader.getInt();
reader.getInt();
reader.getInt();
reader.get();
}
private void handleKOS(ByteBufferReader reader){
reader.getInt();
reader.getInt();
reader.getInt();
reader.getInt();
this.buildingID = reader.getInt();
reader.get();
byte reverse = reader.get();
this.reverseKOS = reverse == 1 ? true : false;
reader.getInt();
reader.getInt();
}
private void removeFriendList(ByteBufferReader reader){
reader.getInt();
this.playerType = reader.getInt();
this.playerID = reader.getInt();
reader.getInt();
reader.getInt();
reader.getInt();
reader.getInt();
reader.getInt();
reader.getInt();
this.removeFriendType = reader.getInt();
this.removeFriendID = reader.getInt();
this.buildingType = reader.getInt();
this.buildingID = reader.getInt();
reader.getInt();
reader.getInt();
reader.get();
}
public int getRemoveFriendID() {
return removeFriendID;
}
private void showCondemnList(ByteBufferWriter writer){
String name = "";
PlayerCharacter pc = null;
Guild guild = null;
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
writer.put((byte)0);
writer.put(reverseKOS ? (byte)1 : 0); //Reverse?
int listSize = this.guildCondemned.size();
writer.putInt(listSize);
writer.putInt(listSize);
for (Condemned condemned:this.guildCondemned.values()){
writer.put((byte)1);
switch (condemned.getFriendType()){
case 2:
PlayerCharacter playerCharacter = (PlayerCharacter) DbManager.getObject(engine.Enum.GameObjectType.PlayerCharacter, condemned.getPlayerUID());
guild = playerCharacter.getGuild();
writer.putInt(GameObjectType.PlayerCharacter.ordinal());
writer.putInt(condemned.getPlayerUID());
writer.putInt(condemned.getFriendType());
writer.putInt(GameObjectType.PlayerCharacter.ordinal());
writer.putInt(condemned.getPlayerUID());
writer.putInt(0);
writer.putInt(0);
writer.putInt(GameObjectType.Guild.ordinal());
if (guild != null)
writer.putInt(guild.getObjectUUID());
else
writer.putInt(0);
writer.put(condemned.isActive() ?(byte)1:(byte)0);
writer.put((byte)0);
writer.put(condemned.isActive() ?(byte)1:(byte)0);
if (playerCharacter != null)
writer.putString(playerCharacter.getFirstName());
else
writer.putInt(0);
GuildTag._serializeForDisplay(GuildTag.ERRANT,writer);
if (guild != null)
GuildTag._serializeForDisplay(guild.getGuildTag(),writer);
else{
GuildTag._serializeForDisplay(GuildTag.ERRANT,writer);
}
break;
case 4:
guild = Guild.getGuild(condemned.getGuildUID());
writer.putInt(GameObjectType.Guild.ordinal());
writer.putInt(condemned.getGuildUID());
writer.putInt(condemned.getFriendType());
writer.putLong(0);
writer.putInt(GameObjectType.Guild.ordinal());
writer.putInt(condemned.getGuildUID());
writer.putLong(0);
writer.put((byte)0);
writer.put(condemned.isActive() ?(byte)1:(byte)0);
writer.put((byte)0);
if (guild != null)
writer.putString(guild.getName());
else
writer.putInt(0);
if (guild != null)
GuildTag._serializeForDisplay(guild.getGuildTag(),writer);
else
GuildTag._serializeForDisplay(GuildTag.ERRANT,writer);
GuildTag._serializeForDisplay(GuildTag.ERRANT,writer);
break;
case 5:
guild = Guild.getGuild(condemned.getGuildUID());
writer.putInt(GameObjectType.Guild.ordinal());
writer.putInt(condemned.getGuildUID());
writer.putInt(condemned.getFriendType());
writer.putLong(0);
writer.putLong(0);
writer.putInt(GameObjectType.Guild.ordinal());
writer.putInt(condemned.getGuildUID());
writer.put((byte)0);
writer.put((byte)0);
writer.put(condemned.isActive() ?(byte)1:(byte)0);
if (guild != null)
writer.putString(guild.getName());
else
writer.putInt(0);
GuildTag._serializeForDisplay(GuildTag.ERRANT,writer);
if (guild != null)
GuildTag._serializeForDisplay(guild.getGuildTag(),writer);
else{
GuildTag._serializeForDisplay(GuildTag.ERRANT,writer);
}
break;
}
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
}
}
private void showBuildingFriends(ByteBufferWriter writer){
String name = "";
PlayerCharacter pc = null;
Guild guild = null;
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
writer.put((byte)0);
int listSize = this.friends.size();
writer.putInt(listSize);
writer.putInt(listSize);
for (BuildingFriends friend:this.friends.values()){
pc = PlayerCharacter.getFromCache(friend.getPlayerUID());
guild = Guild.getGuild(friend.getGuildUID());
if (friend.getFriendType() == 7){
if (pc != null)
name = pc.getCombinedName();
}
else if (guild != null)
name = guild.getName();
writer.put((byte)1);
if (friend.getFriendType() == 7){
writer.putInt(GameObjectType.PlayerCharacter.ordinal());
writer.putInt(friend.getPlayerUID());
}else{
writer.putInt(GameObjectType.Guild.ordinal());
writer.putInt(friend.getGuildUID());
}
writer.putInt(friend.getFriendType());
writer.putInt(0);
writer.putInt(0);
if (guild != null) {
writer.putInt(guild.getObjectType().ordinal());
writer.putInt(guild.getObjectUUID());
if (!guild.getNation().isEmptyGuild()) {
writer.putInt(guild.getNation().getObjectType().ordinal());
writer.putInt(guild.getNation().getObjectUUID());
}else{
writer.putInt(0);
writer.putInt(0);
}
}else{
writer.putLong(0);
writer.putLong(0);
}
writer.putShort((short)0);
writer.put((byte)0);
writer.putString(name);
if (guild != null)
GuildTag._serializeForDisplay(guild.getGuildTag(),writer);
else{
writer.putInt(16);
writer.putInt(16);
writer.putInt(16);
writer.putInt(0);
writer.putInt(0);
}
writer.putInt(16);
writer.putInt(16);
writer.putInt(16);
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
}
}
private void ackBuildingFriends(ByteBufferReader reader){
reader.getInt();
reader.getInt();
reader.getInt();
this.buildingType = reader.getInt();
this.buildingID = reader.getInt();
reader.getInt();
reader.getInt();
reader.get();
}
private void viewHealrdy(ByteBufferReader reader){
reader.getInt();
reader.getInt();
reader.getInt();
}
private void showHeraldy(ByteBufferWriter writer){
PlayerCharacter player = ((ClientConnection)this.getOrigin()).getPlayerCharacter();
writer.putInt(0); //error pop up msg
writer.putInt(0);
// writer.putInt(0);
HashMap<Integer,Integer> heraldryMap = Heraldry.HeraldyMap.get(player.getObjectUUID());
//send empty list if no heraldry
if (heraldryMap == null || heraldryMap.isEmpty()){
writer.putInt(0);
return;
}
writer.putInt(heraldryMap.size());
for (int characterID : heraldryMap.keySet()){
AbstractCharacter heraldryCharacter = null;
int characterType = heraldryMap.get(characterID);
if (characterType == GameObjectType.PlayerCharacter.ordinal())
heraldryCharacter = PlayerCharacter.getFromCache(characterID);
else if (characterType == GameObjectType.NPC.ordinal())
heraldryCharacter = NPC.getFromCache(characterID);
else if (characterType == GameObjectType.Mob.ordinal())
heraldryCharacter = Mob.getFromCache(characterID);
if (heraldryCharacter == null)
this.showNullHeraldryCharacter(writer);
else{
writer.put((byte)1);
writer.putInt(heraldryCharacter.getObjectType().ordinal());
writer.putInt(heraldryCharacter.getObjectUUID());
writer.putInt(9);
writer.putInt(heraldryCharacter.getObjectType().ordinal());
writer.putInt(heraldryCharacter.getObjectUUID());
if (heraldryCharacter.getGuild() != null) {
writer.putInt(heraldryCharacter.getGuild().getObjectType().ordinal());
writer.putInt(heraldryCharacter.getGuild().getObjectUUID());
if (!heraldryCharacter.getGuild().getNation().isEmptyGuild()) {
writer.putInt(heraldryCharacter.getGuild().getNation().getObjectType().ordinal());
writer.putInt(heraldryCharacter.getGuild().getNation().getObjectUUID());
}else{
writer.putInt(0);
writer.putInt(0);
}
}else{
writer.putLong(0);
writer.putLong(0);
}
writer.putShort((short)0);
writer.put((byte)0);
writer.putString(heraldryCharacter.getName());
if (heraldryCharacter.getGuild() != null)
GuildTag._serializeForDisplay(heraldryCharacter.getGuild().getGuildTag(),writer);
else{
writer.putInt(16);
writer.putInt(16);
writer.putInt(16);
writer.putInt(0);
writer.putInt(0);
}
writer.putInt(16);
writer.putInt(16);
writer.putInt(16);
writer.putInt(0);
writer.putInt(0);
if (heraldryCharacter.getGuild() == null){
writer.putString("Errant");
writer.putString("Errant");
}
else{
writer.putString(heraldryCharacter.getGuild().getName());
if (heraldryCharacter.getGuild().getNation() == null)
writer.putString("Errant");
else
writer.putString(heraldryCharacter.getGuild().getNation().getName());
}
writer.putInt(0);
}
}
}
private void readAddHealrdy(ByteBufferReader reader){
reader.getInt();
reader.getInt();
this.playerType = reader.getInt(); //player object type;
this.playerID = reader.getInt();
reader.getInt();
reader.getInt();
reader.getInt();
reader.getInt();
reader.getInt();
reader.getInt();
reader.getInt();
reader.getInt();
reader.getInt();
reader.getInt();
reader.getInt();
}
private void writeAddHealrdy(ByteBufferWriter writer){
writer.putInt(0);
writer.putInt(0);
writer.putInt(this.playerType); //player object type;
writer.putInt(this.playerID);
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
}
public int getMessageType() {
return this.messageType;
}
public ArrayList<Integer> getList() {
return this.characterList;
}
public void setMessageType(int value) {
this.messageType = value;
}
public void setList(ArrayList<Integer> value) {
this.characterList = value;
}
public void updateMsg(int messageType, ArrayList<Integer> list) {
this.messageType = messageType;
this.characterList = list;
this.configure();
}
public int getInviteType() {
return inviteType;
}
public int getPlayerType() {
return playerType;
}
public void setPlayerType(int playerType) {
this.playerType = playerType;
}
public int getPlayerID() {
return playerID;
}
public void setPlayerID(int playerID) {
this.playerID = playerID;
}
public int getGuildID() {
return guildID;
}
public int getNationID() {
return nationID;
}
public void setGuildID(int guildID) {
this.guildID = guildID;
}
public int getBuildingID() {
return buildingID;
}
public void setBuildingID(int buildingID) {
this.buildingID = buildingID;
}
public boolean isReverseKOS() {
return reverseKOS;
}
public void setReverseKOS(boolean reverseKOS) {
this.reverseKOS = reverseKOS;
}
private void showNullHeraldryCharacter(ByteBufferWriter writer){
writer.put((byte)1);
writer.putInt(0);
writer.putInt(0);
writer.putInt(6);
writer.putInt(0);
writer.putInt(0);
writer.putLong(0);
writer.putLong(0);
writer.putShort((short)0);
writer.put((byte)0);
writer.putInt(0);
writer.putInt(16);
writer.putInt(16);
writer.putInt(16);
writer.putInt(0);
writer.putInt(0);
writer.putInt(16);
writer.putInt(16);
writer.putInt(16);
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
writer.putInt(0);
}
}