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)