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...
caso der algum tipo de erro, fico a disposição para ajudar
Opcional:
mensagem MOTD (mensagem do dia) modificada igual abaixo:
2:
informações de level / specs ativos na janela de login igual a imagem abaixo:
é 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