Ir para conteúdo

Account Manager - Adicionando Escolha de Cidade


Oneshot

Posts Recomendados

Account Manager

Adicionando "Escolha de Cidade"

divisor.png

 

Fala, minha galera do Éks.

 

Vocês sabem que é minoria servidores que possuem site, uma vez que quando queremos criar um servidor (mais por lazer), é meio que inviável hostear um site junto. Os account makers, assim como são chamados os sites de servidores, dão ao jogador a opção de escolher a cidade que ele vai morar.

 

Já o Account Manager, aquele sistema interno de administração da conta de um jogador, não possue uma opção de escolha de cidade, o que o deixa muito limitado. Principalmente para servidores derivados, onde é quase que necessário, que o jogador possa escolher sua cidade.

 

Pensando nisso, desenvolvi uma série de modificações que irão adicionar ao seu servidor, a opção de "escolher uma cidade" no sistema do Account Manager.

 

 

Instalação

divisor.png

 

Você precisa seguir todos os passos abaixo com atenção o bastante para não pular nenhum, senão poderá ocorrer algum erro na compilação.

 

Vale lembrar que não basta modificar os arquivos passados, você precisa re-compilar seu servidor e, após, substituir o executável.

 

Vamos começar.

 


 

No arquivo config.lua de seu servidor, procure por:

 


newPlayerSpawnPosX = 95
newPlayerSpawnPosY = 117
newPlayerSpawnPosZ = 7
newPlayerTownId = 1

 

Apague, substituindo pelas linhas abaixo:

 


newPlayerChooseTown = true
newPlayerDefaultTownId = 1

 


 

A partir daqui, você irá precisar das sources de seu servidor.

 

No arquivo configmanager.h e procure pelas seguintes linhas:

 


SPAWNPOS_X,
SPAWNPOS_Y,
SPAWNPOS_Z,
SPAWNTOWN_ID,

 

Substitua por:

 

DEFAULT_TOWN_ID,

 

Procure por:

 

START_CHOOSEVOC,

 

Logo abaixo adicione:

 

START_CHOOSETOWN,

 


 

No arquivo configmanager.cpp, procure por:

 


m_confNumber[sPAWNPOS_X] = getGlobalNumber("newPlayerSpawnPosX", 100);
m_confNumber[sPAWNPOS_Y] = getGlobalNumber("newPlayerSpawnPosY", 100);
m_confNumber[sPAWNPOS_Z] = getGlobalNumber("newPlayerSpawnPosZ", 7);
m_confNumber[sPAWNTOWN_ID] = getGlobalNumber("newPlayerTownId", 1);

 

Substitua por:

 

m_confNumber[DEFAULT_TOWN_ID] = getGlobalNumber("newPlayerDefaultTownId", 1);

 

Procure por:

 

m_confBool[sTART_CHOOSEVOC] = getGlobalBool("newPlayerChooseVoc", false);

 

Adicione logo abaixo:

 

m_confBool[sTART_CHOOSETOWN] = getGlobalBool("newPlayerChooseTown", true);

 


 

No arquivo iologindata.h, procure por:

 

bool createCharacter(uint32_t accountId, std::string characterName, int32_t vocationId, uint16_t sex);

 

Substitua por:

 

bool createCharacter(uint32_t accountId, std::string characterName, int32_t vocationId, uint16_t sex, uint32_t townId);

 

No arquivo iologindata.cpp, procure por:

 


bool IOLoginData::createCharacter(uint32_t accountId, std::string characterName, int32_t vocationId, uint16_t sex)
{
	if(playerExists(characterName))
			return false;

	Vocation* vocation = Vocations::getInstance()->getVocation(vocationId);
	Vocation* rookVoc = Vocations::getInstance()->getVocation(0);

	uint16_t healthMax = 150, manaMax = 0, capMax = 400, lookType = 136;
	if(sex % 2)
			lookType = 128;

	uint32_t level = g_config.getNumber(ConfigManager::START_LEVEL), tmpLevel = std::min((uint32_t)7, (level - 1));
	uint64_t exp = 0;
	if(level > 1)
			exp = Player::getExpForLevel(level);

	if(tmpLevel > 0)
	{
			healthMax += rookVoc->getGain(GAIN_HEALTH) * tmpLevel;
			manaMax += rookVoc->getGain(GAIN_MANA) * tmpLevel;
			capMax += rookVoc->getGainCap() * tmpLevel;
			if(level > 8)
			{
					tmpLevel = level - 8;
					healthMax += vocation->getGain(GAIN_HEALTH) * tmpLevel;
					manaMax += vocation->getGain(GAIN_MANA) * tmpLevel;
					capMax += vocation->getGainCap() * tmpLevel;
			}
	}

	Database* db = Database::getInstance();
	DBQuery query;

	query << "INSERT INTO `players` (`id`, `name`, `world_id`, `group_id`, `account_id`, `level`, `vocation`, `health`, `healthmax`, `experience`, `lookbody`, `lookfeet`, `lookhead`, `looklegs`, `looktype`, `lookaddons`, `maglevel`, `mana`, `manamax`, `manaspent`, `soul`, `town_id`, `posx`, `posy`, `posz`, `conditions`, `cap`, `sex`, `lastlogin`, `lastip`, `skull`, `skulltime`, `save`, `rank_id`, `guildnick`, `lastlogout`, `blessings`, `online`) VALUES (NULL, " << db->escapeString(characterName) << ", " << g_config.getNumber(ConfigManager::WORLD_ID) << ", 1, " << accountId << ", " << level << ", " << vocationId << ", " << healthMax << ", " << healthMax << ", " << exp << ", 68, 76, 78, 39, " << lookType << ", 0, " << g_config.getNumber(ConfigManager::START_MAGICLEVEL) << ", " << manaMax << ", " << manaMax << ", 0, 100, " << g_config.getNumber(ConfigManager::SPAWNTOWN_ID) << ", " << g_config.getNumber(ConfigManager::SPAWNPOS_X) << ", " << g_config.getNumber(ConfigManager::SPAWNPOS_Y) << ", " << g_config.getNumber(ConfigManager::SPAWNPOS_Z) << ", 0, " << capMax << ", " << sex << ", 0, 0, 0, 0, 1, 0, '', 0, 0, 0)";
	return db->query(query.str());
}

 

Substitua por:

 


bool IOLoginData::createCharacter(uint32_t accountId, std::string characterName, int32_t vocationId, uint16_t sex, uint32_t townId)
{
	if(playerExists(characterName))
			return false;

	Vocation* vocation = Vocations::getInstance()->getVocation(vocationId);
	Vocation* rookVoc = Vocations::getInstance()->getVocation(0);

	Town* town = Towns::getInstance()->getTown(townId);

	uint16_t healthMax = 150, manaMax = 0, capMax = 400, lookType = 136;
	if(sex % 2)
			lookType = 128;

	uint32_t level = g_config.getNumber(ConfigManager::START_LEVEL), tmpLevel = std::min((uint32_t)7, (level - 1));
	uint64_t exp = 0;
	if(level > 1)
			exp = Player::getExpForLevel(level);

	if(tmpLevel > 0)
	{
			healthMax += rookVoc->getGain(GAIN_HEALTH) * tmpLevel;
			manaMax += rookVoc->getGain(GAIN_MANA) * tmpLevel;
			capMax += rookVoc->getGainCap() * tmpLevel;
			if(level > 8)
			{
					tmpLevel = level - 8;
					healthMax += vocation->getGain(GAIN_HEALTH) * tmpLevel;
					manaMax += vocation->getGain(GAIN_MANA) * tmpLevel;
					capMax += vocation->getGainCap() * tmpLevel;
			}
	}

	Database* db = Database::getInstance();
	DBQuery query;

	query << "INSERT INTO `players` (`id`, `name`, `world_id`, `group_id`, `account_id`, `level`, `vocation`, `health`, `healthmax`, `experience`, `lookbody`, `lookfeet`, `lookhead`, `looklegs`, `looktype`, `lookaddons`, `maglevel`, `mana`, `manamax`, `manaspent`, `soul`, `town_id`, `posx`, `posy`, `posz`, `conditions`, `cap`, `sex`, `lastlogin`, `lastip`, `skull`, `skulltime`, `save`, `rank_id`, `guildnick`, `lastlogout`, `blessings`, `online`) VALUES (NULL, " << db->escapeString(characterName) << ", " << g_config.getNumber(ConfigManager::WORLD_ID) << ", 1, " << accountId << ", " << level << ", " << vocationId << ", " << healthMax << ", " << healthMax << ", " << exp << ", 68, 76, 78, 39, " << lookType << ", 0, " << g_config.getNumber(ConfigManager::START_MAGICLEVEL) << ", " << manaMax << ", " << manaMax << ", 0, 100, " << townId << ", " << town->getPosition().x << ", " << town->getPosition().y << ", " << town->getPosition().z << ", 0, " << capMax << ", " << sex << ", 0, 0, 0, 0, 1, 0, '', 0, 0, 0)";
	return db->query(query.str());
}

 


 

No arquivo player.h, procure por:

 

int32_t managerNumber, managerNumber2;

 

Substitua por:

 

int32_t managerNumber, managerNumber2, managerNumber3;

 

No arquivo player.cpp, procure por:

 

editListId = maxWriteLen = windowTextId = rankId = 0;

 

Adicione logo abaixo:

 

managerNumber3 = g_config.getNumber(ConfigManager::DEFAULT_TOWN_ID);

 

Procure por:

 

case MANAGER_ACCOUNT:

 

Muita atenção neste passo.

 

Você precisará substituir todo o conteúdo do case pelo conteúdo abaixo, ou seja:

 

Substitua isso:

 

case MANAGER_ACCOUNT:
{
  ...
}

 

Por isso:

 

ZD3xYbg4[/pastebin]

 


 

Demonstração

divisor.png

 

RTwM6.jpg

 

Testado em The Forgotten Server 0.4 rev3884. Pode não funcionar em versões anteriores.

Editado por Oneshot
Link para o comentário
Compartilhar em outros sites

Este é o problema, não existe uma função nos headers para diferir entre uma cidade premium e uma cidade free. Mas irei desenvolver algo assim que puder sobre isso.

 

Abraços.

Link para o comentário
Compartilhar em outros sites

Uma vez eu fiz assim:

 

Eu deixei o acc manager pro player nascer num lugar que n tinha nada so umas decoraçoes,e dai eu eu coloquei os tps das cidades so que foi uma ideia inutil,porque n deu certo oque eu queria faze mas enfim,mt bom cara adorei.

Link para o comentário
Compartilhar em outros sites

  • 4 months later...
  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...