mirror of
https://gitea.sffempire.ru/Kolyah35/minecraft-pe-0.6.1.git
synced 2026-03-20 06:53:30 +00:00
68 lines
2.1 KiB
C++
Executable File
68 lines
2.1 KiB
C++
Executable File
#include "ServerLevel.h"
|
|
#include "../network/RakNetInstance.h"
|
|
#include "../network/packet/SetTimePacket.h"
|
|
#include "../network/packet/SetHealthPacket.h"
|
|
#include "../world/level/tile/LevelEvent.h"
|
|
ServerLevel::ServerLevel(LevelStorage* levelStorage, const std::string& levelName, const LevelSettings& settings, int generatorVersion, Dimension* fixedDimension /* = NULL */)
|
|
: super(levelStorage, levelName, settings, generatorVersion, fixedDimension),
|
|
allPlayersAreSleeping(false){
|
|
|
|
}
|
|
|
|
void ServerLevel::updateSleepingPlayerList() {
|
|
bool allPlayersWasSleeping = allPlayersAreSleeping;
|
|
allPlayersAreSleeping = !players.empty();
|
|
for(PlayerList::iterator it = players.begin(); it != players.end(); ++it) {
|
|
Player* player = *it;
|
|
if(!player->isSleeping()) {
|
|
allPlayersAreSleeping = false;
|
|
break;
|
|
}
|
|
}
|
|
if(!allPlayersWasSleeping && allPlayersAreSleeping) {
|
|
levelEvent(NULL, LevelEvent::ALL_PLAYERS_SLEEPING, 0, 0, 0, 0);
|
|
for(PlayerList::iterator it = players.begin(); it != players.end(); ++it) {
|
|
(*it)->setAllPlayersSleeping();
|
|
}
|
|
}
|
|
}
|
|
|
|
void ServerLevel::awakenAllPlayers() {
|
|
allPlayersAreSleeping = false;
|
|
for(PlayerList::iterator it = players.begin(); it != players.end(); ++it) {
|
|
Player* player = *it;
|
|
if(player->isSleeping()) {
|
|
player->stopSleepInBed(false, false, true);
|
|
player->health = Player::MAX_HEALTH;
|
|
player->lastHealth = Player::MAX_HEALTH;
|
|
}
|
|
}
|
|
SetHealthPacket packet(Player::MAX_HEALTH);
|
|
raknetInstance->send(packet);
|
|
}
|
|
|
|
bool ServerLevel::allPlayersSleeping() {
|
|
if(allPlayersAreSleeping && !isClientSide) {
|
|
// all players are sleeping, but have they slept long enough?
|
|
for(PlayerList::iterator it = players.begin(); it != players.end(); ++it) {
|
|
if(!(*it)->isSleepingLongEnough()) {
|
|
return false;
|
|
}
|
|
}
|
|
// yep
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void ServerLevel::tick(){
|
|
super::tick();
|
|
if(allPlayersSleeping()) {
|
|
long newTime = levelData.getTime() + TICKS_PER_DAY;
|
|
levelData.setTime(newTime - (newTime % TICKS_PER_DAY));
|
|
SetTimePacket packet(levelData.getTime());
|
|
raknetInstance->send(packet);
|
|
awakenAllPlayers();
|
|
}
|
|
}
|