/*  
    EQ2Emulator:  Everquest II Server Emulator
    Copyright (C) 2007  EQ2EMulator Development Team (http://www.eq2emulator.net)

    This file is part of EQ2Emulator.

    EQ2Emulator 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.

    EQ2Emulator 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 EQ2Emulator.  If not, see <http://www.gnu.org/licenses/>.
*/
#include "World.h"
#include "Object.h"
#include "Spells.h"

extern World world;
extern ConfigReader configReader;
extern MasterSpellList master_spell_list;

Object::Object(){ 
	clickable = false; 
	zone_name = 0;
	packet_num = 0;
	appearance.activity_status = 64;
	appearance.pos.state = 1;
	appearance.encounter_level = 0;
	spawn_type = 2;
	m_deviceID = 0;
}
Object::~Object(){

}

EQ2Packet* Object::serialize(Player* player, int16 version){
	opcode = EQOpcodeManager[GetOpcodeVersion(version)]->EmuToEQ(OP_EqCreateGhostCmd);
	return spawn_serialize(player, version);
}

void Object::HandleUse(Client* client, string command){
	vector<TransportDestination*>* destinations = 0;
	if(GetTransporterID() > 0)
		destinations = GetZone()->GetTransporters(GetTransporterID());
	if(destinations)
		client->ProcessTeleport(this, destinations, GetTransporterID());
	else if (client && command.length() > 0 && appearance.show_command_icon == 1 && MeetsSpawnAccessRequirements(client->GetPlayer())){
		EntityCommand* entity_command = FindEntityCommand(command);
		if (entity_command)
			client->GetCurrentZone()->ProcessEntityCommand(entity_command, client->GetPlayer(), client->GetPlayer()->GetTarget());
	}
}

Object*	Object::Copy(){
	Object* new_spawn = new Object();
	new_spawn->SetMerchantID(merchant_id);
	new_spawn->SetMerchantType(merchant_type);
	if(GetSizeOffset() > 0){
		int8 offset = GetSizeOffset()+1;
		sint32 tmp_size = size + (rand()%offset - rand()%offset);
		if(tmp_size < 0)
			tmp_size = 1;
		else if(tmp_size >= 0xFFFF)
			tmp_size = 0xFFFF;
		new_spawn->size = (int16)tmp_size;
	}
	else
		new_spawn->size = size;
	new_spawn->SetPrimaryCommands(&primary_command_list);
	new_spawn->SetSecondaryCommands(&secondary_command_list);
	new_spawn->database_id = database_id;
	new_spawn->primary_command_list_id = primary_command_list_id;
	new_spawn->secondary_command_list_id = secondary_command_list_id;
	memcpy(&new_spawn->appearance, &appearance, sizeof(AppearanceData));
	new_spawn->faction_id = faction_id;
	new_spawn->target = 0;
	new_spawn->SetTotalHP(GetTotalHP());
	new_spawn->SetTotalPower(GetTotalPower());
	new_spawn->SetHP(GetHP());
	new_spawn->SetPower(GetPower());
	new_spawn->SetQuestsRequired(GetQuestsRequired());
	new_spawn->SetTransporterID(GetTransporterID());
	new_spawn->SetDeviceID(GetDeviceID());
	return new_spawn;
}
