/*
* This file is part of aion-unique <aion-unique.org>.
*
* aion-unique 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 3 of the License, or
* (at your option) any later version.
*
* aion-unique 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 aion-unique. If not, see <http://www.gnu.org/licenses/>.
*/
package com.aionemu.gameserver.network.aion.clientpackets;
import java.util.List;
import com.aionemu.gameserver.configs.main.GSConfig;
import com.aionemu.gameserver.model.ChatType;
import com.aionemu.gameserver.model.account.Account;
import com.aionemu.gameserver.model.account.PlayerAccountData;
import com.aionemu.gameserver.model.gameobjects.Item;
import com.aionemu.gameserver.model.gameobjects.player.Player;
import com.aionemu.gameserver.model.gameobjects.player.Storage;
import com.aionemu.gameserver.network.aion.AionClientPacket;
import com.aionemu.gameserver.network.aion.AionConnection;
import com.aionemu.gameserver.network.aion.serverpackets.SM_ABYSS_RANK;
import com.aionemu.gameserver.network.aion.serverpackets.SM_CHANNEL_INFO;
import com.aionemu.gameserver.network.aion.serverpackets.SM_CUBE_UPDATE;
import com.aionemu.gameserver.network.aion.serverpackets.SM_EMOTION_LIST;
import com.aionemu.gameserver.network.aion.serverpackets.SM_ENTER_WORLD_CHECK;
import com.aionemu.gameserver.network.aion.serverpackets.SM_GAME_TIME;
import com.aionemu.gameserver.network.aion.serverpackets.SM_INFLUENCE_RATIO;
import com.aionemu.gameserver.network.aion.serverpackets.SM_INVENTORY_INFO;
import com.aionemu.gameserver.network.aion.serverpackets.SM_MACRO_LIST;
import com.aionemu.gameserver.network.aion.serverpackets.SM_MESSAGE;
import com.aionemu.gameserver.network.aion.serverpackets.SM_PLAYER_ID;
import com.aionemu.gameserver.network.aion.serverpackets.SM_PLAYER_SPAWN;
import com.aionemu.gameserver.network.aion.serverpackets.SM_PRICES;
import com.aionemu.gameserver.network.aion.serverpackets.SM_QUEST_LIST;
import com.aionemu.gameserver.network.aion.serverpackets.SM_RECIPE_LIST;
import com.aionemu.gameserver.network.aion.serverpackets.SM_SKILL_LIST;
import com.aionemu.gameserver.network.aion.serverpackets.SM_STATS_INFO;
import com.aionemu.gameserver.network.aion.serverpackets.SM_TITLE_LIST;
import com.aionemu.gameserver.network.aion.serverpackets.SM_UI_SETTINGS;
import com.aionemu.gameserver.network.aion.serverpackets.unk.SM_UNK5E;
import com.aionemu.gameserver.services.ClassChangeService;
import com.aionemu.gameserver.services.GroupService;
import com.aionemu.gameserver.services.LegionService;
import com.aionemu.gameserver.services.MailService;
import com.aionemu.gameserver.services.PlayerService;
import com.aionemu.gameserver.services.PunishmentService;
import com.aionemu.gameserver.services.StigmaService;
import com.aionemu.gameserver.services.TeleportService;
import com.aionemu.gameserver.utils.rates.Rates;
import com.aionemu.gameserver.world.World;
import com.google.inject.Inject;
/**
* In this packets aion client is asking if given char [by oid] may login into game [ie start playing].
*
* @author -Nemesiss-, Avol
*
*/
public class CM_ENTER_WORLD extends AionClientPacket
{
/**
* Object Id of player that is entering world
*/
private int objectId;
@Inject
private World world;
@Inject
private PlayerService playerService;
@Inject
private LegionService legionService;
@Inject
private GroupService groupService;
@Inject
private TeleportService teleportService;
@Inject
private PunishmentService punishmentService;
@Inject
private MailService mailService;
@Inject
private StigmaService stigmaService;;
/**
* Constructs new instance of <tt>CM_ENTER_WORLD </tt> packet
*
* @param opcode
*/
public CM_ENTER_WORLD(int opcode)
{
super(opcode);
}
/**
* {@inheritDoc}
*/
@Override
protected void readImpl()
{
objectId = readD();
}
/**
* {@inheritDoc}
*/
@Override
protected void runImpl()
{
AionConnection client = getConnection();
Account account = client.getAccount();
PlayerAccountData playerAccData = client.getAccount().getPlayerAccountData(objectId);
if(playerAccData == null)
{
// Somebody wanted to login on character that is not at his account
return;
}
Player player = playerService.getPlayer(objectId, account);
if(player != null && client.setActivePlayer(player))
{
player.setClientConnection(client);
/*
* Store player into World.
*/
world.storeObject(player);
sendPacket(new SM_SKILL_LIST(player));
stigmaService.onPlayerLogin(player);
// sendPacket(new SM_UNK91());
// sendPacket(new SM_UNKC7());
// sendPacket(new SM_UNKC8());
client.sendPacket(new SM_QUEST_LIST(player));
client.sendPacket(new SM_RECIPE_LIST(player.getRecipeList().getRecipeList()));
/*
* Needed
*/
client.sendPacket(new SM_ENTER_WORLD_CHECK());
byte[] uiSettings = player.getPlayerSettings().getUiSettings();
byte[] shortcuts = player.getPlayerSettings().getShortcuts();
if(uiSettings != null)
client.sendPacket(new SM_UI_SETTINGS(uiSettings, 0));
if(shortcuts != null)
client.sendPacket(new SM_UI_SETTINGS(shortcuts, 1));
// sendPacket(new SM_UNK60());
// sendPacket(new SM_UNK17());
sendPacket(new SM_UNK5E());
// Cubesize limit set in inventory.
int cubeSize = player.getCubeSize();
player.getInventory().setLimit(27 + cubeSize * 9);
// TODO no need to load items here - inventory will be populated at startup
// will be removed next time
// items
Storage inventory = player.getInventory();
List<Item> equipedItems = player.getEquipment().getEquippedItems();
if(equipedItems.size() != 0)
{
client.sendPacket(new SM_INVENTORY_INFO(player.getEquipment().getEquippedItems(), cubeSize));
}
List<Item> unequipedItems = inventory.getAllItems();
int itemsSize = unequipedItems.size();
if(itemsSize != 0)
{
int index = 0;
while(index + 10 < itemsSize)
{
client.sendPacket(new SM_INVENTORY_INFO(unequipedItems.subList(index, index + 10), cubeSize));
index += 10;
}
client.sendPacket(new SM_INVENTORY_INFO(unequipedItems.subList(index, itemsSize), cubeSize));
}
client.sendPacket(new SM_INVENTORY_INFO());
playerService.playerLoggedIn(player);
// sendPacket(new SM_UNKD3());
/*
* Needed
*/
client.sendPacket(new SM_STATS_INFO(player));
sendPacket(new SM_CUBE_UPDATE(player, 6));
teleportService.sendSetBindPoint(player);
// sendPacket(new SM_UNKE1());
sendPacket(new SM_MACRO_LIST(player));
sendPacket(new SM_GAME_TIME());
player.getController().updateNearbyQuests();
sendPacket(new SM_TITLE_LIST(player));
client.sendPacket(new SM_CHANNEL_INFO(player.getPosition()));
/*
* Needed
*/
sendPacket(new SM_PLAYER_SPAWN(player));
sendPacket(new SM_EMOTION_LIST());
sendPacket(new SM_INFLUENCE_RATIO());
sendPacket(new SM_PRICES());
sendPacket(new SM_PLAYER_ID(player));
sendPacket(new SM_ABYSS_RANK(player.getAbyssRank()));
sendPacket(new SM_MESSAGE(0, null, "Welcome to " + GSConfig.SERVER_NAME
+ " server\nPowered by aion-unique software\ndeveloped by www.aion-unique.org team.\nCopyright 2010",
ChatType.ANNOUNCEMENTS));
if(player.isInPrison())
punishmentService.updatePrisonStatus(player);
if(player.isLegionMember())
legionService.onLogin(player);
if(player.isInGroup())
groupService.onLogin(player);
player.setRates(Rates.getRatesFor(client.getAccount().getMembership()));
ClassChangeService.showClassChangeDialog(player);
/**
* Notify mail service to load all mails
*/
mailService.onPlayerLogin(player);
}
else
{
// TODO this is an client error - inform client.
}
}
}