Ir para conteúdo

Featured Replies

Postado

E aí guys, venho a um tempo vendo as datapacks que lançam diariamente e resolvi postar o sistema de setas no cast (não sei se alguém já postou algo relativo o_o) 

para fazer esse sistema eu estou usando a última versão do OTX do github...  LINK PARA BAIXAR (otx do mattyx)

 

maioria das pessoas já sabem o que é esse sistema, mas pra quem não sabe, é a possibilidade de alternar o cast apertando CTRL + QUALQUER ARROW, mesmo que já tenha em vários servers, algums ainda não tem então toma aí.

 

 

em
protocolgame.cpp

 

procure por 

 

void ProtocolGame::spectate(const std::string& name, const std::string& password)

dentro das chaves após 
 

player->client->addSpectator(this);

 

coloque:

 

	std::ostringstream ss;
	std::string value = "-1";
	player->getStorage("broadcast_start", value);
	time_t ctime = time(NULL);

	uint32_t total = ctime - std::stoi(value);

	uint32_t hours, minutes, seconds;
	minutes = total / 60;
	seconds = total % 60;
	hours = minutes / 60;
	minutes = minutes % 60;
	ss << "Players watching " << player->getName() << ": " << (player->client->list().size()) << "\nBroadcast time: ";
	if (hours > 0)
	{
		ss << hours << " hour(s)";
	}
	if (minutes > 0)
	{
		ss << minutes << " minute(s)";
	}
	if (seconds > 0)
	{
		ss << seconds << " second(s)";
	}
	ss << "\nYou can Switch channels by using CTRL + arrow keys!";
	std::string msg = ss.str();

	this->m_lastSwitch = time(NULL);

	this->sendTextMessage(MSG_INFO_DESCR, msg);

 

no final desse escopo após a }, adicione:

 

void ProtocolGame::spectatorTurn(uint8_t direction) {
	std::vector<Player*> candidates;
	int index = 0;

	for (AutoList<Player>::iterator it = Player::autoList.begin(); it != Player::autoList.end(); ++it) {
		if (!it->second->client->isBroadcasting()) {
			continue;
		}

		if (it->second->client->getPassword() != "") {
			continue;
		}

		if (it->second->client->banned(getIP())) {
			continue;
		}

		if (it->second == player) {
			index = candidates.size();
		}

		candidates.push_back(it->second);
	}

	if (candidates.size() < 2) {
		return;
	}

	if (direction == 0 || direction == 1) {
		direction = uint8_t(1);
	}

	if (direction == 2 || direction == 3) {
		direction = uint8_t(-1);
	}

	if (index == 0 && direction == -1) {
		direction = uint8_t(0);
	}

	Player* _player = candidates[(index + direction) % candidates.size()];
	if (!_player || player == _player) {
		return;
	}

	if (!_player || _player->isRemoved() || !_player->client->getOwner()) {
		return;
	}

	if ((time(NULL) - this->m_lastSwitch) < 1) {
		return;
	}

	this->m_lastSwitch = time	(NULL);
	player->client->removeSpectator(this);
	player->unRef();

	player = _player;
	player->addRef();

	knownCreatureSet.clear();
	player->sendCreatureAppear(player, this);
	player->sendContainers(this);
	if (PrivateChatChannel * channel = g_chat.getPrivateChannel(player))
		chat(channel->getId());

	player->client->addSpectator(this);
}

 

 

agora em:

 

void ProtocolGame::parsePacket(NetworkMessage &msg)

 

procure por:

 

case 0xA1: parseCancelTarget(msg); break;

 

tenha certeza de estar dentro do escopo:

 

if(m_spectator)
	{
		switch(recvbyte)
		{

 

 

então abaixo de "case 0xA1: parseCancelTarget(msg); break;" coloque:

 

 

// Ctrl + Arrow
			case 0x6F:
			case 0x70:
			case 0x71:
			case 0x72:
				Dispatcher::getInstance().addTask(
					createTask(boost::bind(&ProtocolGame::spectatorTurn, this, recvbyte - 0x6F)));
				break;

 

feito, mas agora precisamos adicionar algumas coisas em

 

protocolgame.h

 

procure por:

 

void chat(uint16_t channelId);

 

adicione abaixo:

 

void spectatorTurn(uint8_t direction);

 

 

agora, lá no final do arquivo, procure por:

 

Player* player;

 

coloque abaixo:

 

time_t m_lastSwitch;

 

agora só compilar e testar

 

apenas umas imagem mostrando que deu certo abaixo...

Spoiler

image.png.7929a7f3dfddb52c908a6febe5c299bd.png

 

caso der algum tipo de erro, fico a disposição para ajudar

 

Opcional:

 

mensagem MOTD (mensagem do dia) modificada igual abaixo:

 

image.png.7f37a3f9b9cdcfe1512d61e82b2acf0f.png

 

 

Spoiler

Caso queria por essa mensagem

 

Vá até:

 

procotollogin.cpp

procure por:

 





char motd[1300];
sprintf(motd, "%d\n%s", g_game.getMotdId(), g_config.getString(ConfigManager::MOTD).c_str());

 

substitua por esse:



char motd[1300];
if (account.name == "10" && account.name != "0")
	{
		srand(time(NULL));
		int random_number = std::rand();
		sprintf(motd, "%d\nWelcome to cast system!\n\n Do you know you can use CTRL + ARROWS\n to switch casts?\n\nVocê sabia que pode usar CTRL + SETAS\n para alternar casts?", random_number);
		output->addString(motd);
	}
	else
	{
		sprintf(motd, "%d\n%s", g_game.getMotdId(), g_config.getString(ConfigManager::MOTD).c_str());
		output->addString(motd);
	}

 

feito !

 

 

 

2: 

 

informações de level / specs ativos na janela de login igual a imagem abaixo:


dadasd.PNG.8ae1c86b61167d205c725c5c9d9a8549.PNG

 

 

Spoiler

vá em

protocollogin.cpp

em 





void ProtocolLogin::onRecvFirstMessage(NetworkMessage& msg)

 

procure por:

 





if (!(*it)->client->check(password))
	s << "*";

 

coloque abaixo:

 





s << "L." << (*it)->getLevel();

				const uint32_t pVoc = (*it)->getVocationId();
				std::string voc;
				switch (pVoc) {
				case 0:
					voc = "R";
					break;
				case 1:
					voc = "S";
					break;
				case 2:
					voc = "D";
					break;
				case 3:
					voc = "P";
					break;
				case 4:
					voc = "K";
					break;
				case 5:
					voc = "MS";
					break;
				case 6:
					voc = "ED";
					break;
				case 7:
					voc = "RP";
					break;
				case 8:
					voc = "EK";
					break;
				default:
					voc = "R";
				}
				s << " " << voc;

				s << " " << (*it)->client->list().size() << "/50";

 

feito !!!

 

 

 

é isso.

quem fez esse sistema eu não sei, apenas peguei de uma source que tinha e coloquei explicado aqui, então de créditos eu coloco 1% eu @stackcheese por ter explicado como por hihi


 

Editado por stackcheese
explicação melhor e pequeno fix (veja o histórico de edições)

aka aka

 

monki-flip-monkey.gif

  • 2 weeks later...
  • Respostas 7
  • Visualizações 2.6k
  • Created
  • Última resposta

Top Posters In This Topic

Most Popular Posts

  • para adicionar o look vá em spectators.cpp adicione a função void:   void Spectators::sendLook(ProtocolGame* client, const Position& pos, uint16_t spriteId, int16_t stackpos) {

Posted Images

Postado
  • Autor
21 hours ago, Farathor said:

tambem tem a opcao de dar look nos itens?

 

para adicionar o look vá em

spectators.cpp

adicione a função void:

 

void Spectators::sendLook(ProtocolGame* client, const Position& pos, uint16_t spriteId, int16_t stackpos)
{
	if (!owner)
		return;

	SpectatorList::iterator sit = spectators.find(client);
	if (sit == spectators.end())
		return;

	Thing* thing = g_game.internalGetThing(client->player, pos, stackpos, spriteId, STACKPOS_LOOK);

	if (!thing)
	{
		return;
	}

	Position thingPos = pos;
	if (pos.x == 0xFFFF)
		thingPos = thing->getPosition();


	Position playerPos = client->player->getPosition();
	int32_t lookDistance = -1;
	if (thing != client->player)
	{
		lookDistance = std::max(std::abs(playerPos.x - thingPos.x), std::abs(playerPos.y - thingPos.y));
		if (playerPos.z != thingPos.z)
			lookDistance += 15;
	}


	std::ostringstream ss;
	ss << "You see " << thing->getDescription(lookDistance);

	if (Item * item = thing->getItem())
	{

		if (client->player->hasCustomFlag(PlayerCustomFlag_CanSeeItemDetails))
		{
			ss << ".";
			const ItemType& it = Item::items[item->getID()];
			if (it.transformEquipTo)
				ss << std::endl << "TransformTo: [" << it.transformEquipTo << "] (onEquip).";
			else if (it.transformDeEquipTo)
				ss << std::endl << "TransformTo: [" << it.transformDeEquipTo << "] (onDeEquip).";

			if (it.transformUseTo)
				ss << std::endl << "TransformTo: [" << it.transformUseTo << "] (onUse).";

			if (it.decayTo != -1)
				ss << std::endl << "DecayTo: [" << it.decayTo << "].";
		}
	}

	client->sendTextMessage(MSG_INFO_DESCR, ss.str());
	return;
}

 

em spectators.h

adicione nas funções public:

 

	void sendLook(ProtocolGame* client, const Position& pos, uint16_t spriteId, int16_t stackpos);

  

assim já deve dar certo ?

 

Editado por stackcheese (veja o histórico de edições)

aka aka

 

monki-flip-monkey.gif

  • 2 months later...
Postado

protocolgame.cpp: In member function ‘void ProtocolGame::spectate(const string&, const string&)’:
protocolgame.cpp:139:27: error: ‘stoi’ is not a member of ‘std’
  uint32_t total = ctime - std::stoi(value);
                           ^
protocolgame.cpp: In member function ‘void ProtocolGame::spectatorTurn(uint8_t)’:
protocolgame.cpp:210:30: warning: comparison is always false due to limited range of data type [-Wtype-limits]
  if (index == 0 && direction == -1) {
                              ^
protocolgame.cpp:234:2: error: ‘knownCreatureSet’ was not declared in this scope
  knownCreatureSet.clear();
 

[progress=green]50[/progress]

 

Postado
  • Autor
18 hours ago, Farathor said:

protocolgame.cpp: In member function ‘void ProtocolGame::spectate(const string&, const string&)’:
protocolgame.cpp:139:27: error: ‘stoi’ is not a member of ‘std’
  uint32_t total = ctime - std::stoi(value);
                           ^
protocolgame.cpp: In member function ‘void ProtocolGame::spectatorTurn(uint8_t)’:
protocolgame.cpp:210:30: warning: comparison is always false due to limited range of data type [-Wtype-limits]
  if (index == 0 && direction == -1) {
                              ^
protocolgame.cpp:234:2: error: ‘knownCreatureSet’ was not declared in this scope
  knownCreatureSet.clear();
 

 

amigo, pelo que vi eu sou um animal 

 

 

refaça novamente dessa forma:
 

// troque toda a função spectate por essa 
void ProtocolGame::spectate(const std::string& name, const std::string& password)
{
	PlayerVector players = g_game.getPlayersByName(name);
	Player* _player = NULL;
	if(!players.empty())
		_player = players[random_range(0, (players.size() - 1))];

	if(!_player || _player->isRemoved() || !_player->client->isBroadcasting() || !_player->client->getOwner())
	{
		disconnectClient(0x14, "Stream unavailable.");
		return;
	}

	if(_player->client->banned(getIP()))
	{
		disconnectClient(0x14, "You are banned from this stream.");
		return;
	}

	if(!_player->client->check(password))
	{
		disconnectClient(0x14, "This stream is protected! Invalid password.");
		return;
	}

	m_spectator = true;
	player = _player;
	player->addRef();
	player->client->addSpectator(this);

	player->sendCreatureAppear(player, this);
	player->sendContainers(this);
	std::ostringstream ss;
	std::string value = "-1";
	player->getStorage("broadcast_start", value);
	time_t ctime = time(NULL);

	uint32_t total = ctime - std::stoi(value);

	uint32_t hours, minutes, seconds;
	minutes = total / 60;
	seconds = total % 60;
	hours = minutes / 60;
	minutes = minutes % 60;
	ss << "Players watching " << player->getName() << ": " << (player->client->list().size()) << "\nBroadcast time: ";
	if (hours > 0)
	{
		ss << hours << " hour(s)";
	}
	if (minutes > 0)
	{
		ss << minutes << " minute(s)";
	}
	if (seconds > 0)
	{
		ss << seconds << " second(s)";
	}
	ss << "\nYou can Switch channels by using CTRL + arrow keys!";
	std::string msg = ss.str();

	this->m_lastSwitch = time(NULL);

	this->sendTextMessage(MSG_INFO_DESCR, msg);

	if (PrivateChatChannel * channel = g_chat.getPrivateChannel(player))
		chat(channel->getId());

	acceptPackets = true;
	OutputMessagePool::getInstance().addProtocolToAutosend(shared_from_this());
}

//e adicione essa abaixo
bool ProtocolGame::spectatePlayer(const std::string& name, const std::string& password)
{

	PlayerVector players = g_game.getPlayersByName(name);
	Player* _player = NULL;
	if (!players.empty())
		_player = players[random_range(0, (players.size() - 1))];

	if (!_player || _player->isRemoved() || !_player->client->isBroadcasting() || !_player->client->getOwner())
	{
		player->sendFYIBox("Stream unavailable.");
		return false;
	}

	if (_player->client->banned(getIP()))
	{
		player->sendFYIBox("You are banned from this stream.");
		return false;
	}

	if (!_player->client->check(password))
	{
		player->sendFYIBox("This stream is protected! Invalid password.");
		return false;
	}

	player_old = player;
	if (player_old)
	{
		if (player_old->client)
		{
			player_old->client->resetOwner();
		}
	}

	m_spectator = true;
	is_spectating = true;

	player = _player;
	player->addRef();

	knownCreatureSet.clear();
	player->sendCreatureAppear(player, this);
	player->sendContainers(this);

	player->client->addSpectator(this);

	this->m_lastSwitch = time(NULL);

	std::ostringstream ss;
	std::string value = "-1";
	player->getStorage("broadcast_start", value);
	time_t ctime = time(NULL);

	uint32_t total = ctime - std::stoi(value);

	uint32_t hours, minutes, seconds;
	minutes = total / 60;
	seconds = total % 60;
	hours = minutes / 60;
	minutes = minutes % 60;
	ss << "Players watching " << player->getName() << ": " << (player->client->list().size()) << "\nBroadcast time: ";
	if (hours > 0)
	{
		ss << hours << " hour(s)";
	}
	if (minutes > 0)
	{
		ss << minutes << " minute(s)";
	}
	if (seconds > 0)
	{
		ss << seconds << " second(s)";
	}
	ss << "\nYou can Switch channels by using CTRL + arrow keys!";
	std::string msg = ss.str();
	this->sendTextMessage(MSG_INFO_DESCR, msg);

	if (PrivateChatChannel * channel = g_chat.getPrivateChannel(player))
		chat(channel->getId());

	acceptPackets = true;

	OutputMessagePool::getInstance().addProtocolToAutosend(shared_from_this());

	return true;
}

// dnv 

void ProtocolGame::returnPlayer() {

	m_spectator = false;
	is_spectating = false;

	player->client->removeSpectator(this);
	//player->unRef();

	player = player_old;
	player->addRef();
	player->client->setOwner(getThis());


	knownCreatureSet.clear();
	player->sendCreatureAppear(player, this);
	player->sendContainers(this);
	player->receivePing();
	player->sendTextMessage(MSG_INFO_DESCR, "You have closed cast and returned to your player.");
	g_game.playerOpenChannel(player->getID(), 8);
	g_game.playerOpenChannel(player->getID(), 9);
	g_game.playerOpenChannel(player->getID(), 21);
	acceptPackets = true;

	return;
}

// função spectatorturn
void ProtocolGame::spectatorTurn(uint8_t direction) {
	std::vector<Player*> candidates;
	int index = 0;

	for (AutoList<Player>::iterator it = Player::autoList.begin(); it != Player::autoList.end(); ++it) {
		if (!it->second->client->isBroadcasting()) {
			continue;
		}

		if (it->second->client->getPassword() != "") {
			continue;
		}

		if (it->second->client->banned(getIP())) {
			continue;
		}

		if (it->second == player) {
			index = candidates.size();
		}

		candidates.push_back(it->second);
	}

	if (candidates.size() < 2) {
		return;
	}

	if (direction == 0 || direction == 1) {
		direction = uint8_t(1);
	}

	if (direction == 2 || direction == 3) {
		direction = uint8_t(-1);
	}

	if (index == 0 && direction == -1) {
		direction = uint8_t(0);
	}

	Player* _player = candidates[(index + direction) % candidates.size()];
	if (!_player || player == _player) {
		return;
	}

	if (!_player || _player->isRemoved() || !_player->client->getOwner()) {
		return;
	}

	if ((time(NULL) - this->m_lastSwitch) < 1) {
		return;
	}

	this->m_lastSwitch = time(NULL);
	player->client->removeSpectator(this);
	player->unRef();

	player = _player;
	player->addRef();

	knownCreatureSet.clear();
	player->sendCreatureAppear(player, this);
	player->sendContainers(this);
	if (PrivateChatChannel * channel = g_chat.getPrivateChannel(player))
		chat(channel->getId());

	player->client->addSpectator(this);

	//acceptPackets = true;
}

 

em:

void ProtocolGame::parsePacket(NetworkMessage &msg)
{

procure por:

 

if(m_spectator)
	{
		switch(recvbyte)
		{
			case 0x14: parseLogout(msg); break;
			case 0x96: parseSay(msg); break;
			case 0x1E: parseReceivePing(msg); break;
			case 0x97: parseGetChannels(msg); break;
			case 0x98: parseOpenChannel(msg); break;
			case 0xC9: parseUpdateTile(msg); break;
			case 0xCA: parseUpdateContainer(msg); break;
			case 0xE8: parseDebugAssert(msg); break;
			case 0xA1: parseCancelTarget(msg); break;

 

adicione abaixo:

 

		// Ctrl + Arrow
			case 0x6F:
			case 0x70:
			case 0x71:
			case 0x72:
				Dispatcher::getInstance().addTask(
					createTask(boost::bind(&ProtocolGame::spectatorTurn, this, recvbyte - 0x6F)));
				break;

			case 0x8C: parseLookAt(msg); break;

 

 

 

 

agora em protocolgame.h

 

dentro de:

ProtocolGame(Connection_ptr connection): Protocol(connection)
		{

 

abaixo de: 

player = NULL;

 

adicione:

 

player_old = NULL;

logo abaixo em m_debugAssertSent, coloque:

 

m_debugAssertSent = acceptPackets = m_spectator = false; (estará assim)

deixe assim

m_debugAssertSent = acceptPackets = m_spectator = is_spectating = false;

 

agora, abaixo de:

 

		void chat(uint16_t channelId);

 

adicione:

 

bool spectatePlayer(const std::string& name, const std::string& password);
		void returnPlayer();
		void spectatorTurn(uint8_t direction);

 

abaixo de:

 

Player* player;

 

adicione:

 

Player* player_old;
time_t m_lastSwitch;

em 
bool m_debugAssertSent, acceptPackets, m_spectator;

deixe assim:

bool m_debugAssertSent, acceptPackets, m_spectator, is_spectating;

 

 

agora em protocollogin não tinha nenhum erro (creio eu) 

 

então pode copiar lá de cima, jajá arrumo o post :)

 


(me dê retorno pls)

 

detalhe:

 

agora está com o watch system ...

para usar pegue o script action na datapack do (BaiakPvP)

Editado por stackcheese
informação extra (veja o histórico de edições)

aka aka

 

monki-flip-monkey.gif

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo