44#include " api/McAPI.h"
55#include " ll/api/service/Bedrock.h"
66#include " ll/api/utils/RandomUtils.h"
7+ #include " mc/common/IMinecraftApp.h"
8+ #include " mc/common/SharedConstants.h"
79#include " mc/network/ServerNetworkHandler.h"
810#include " mc/network/packet/SetTimePacket.h"
9- #include " mc/world/level/Tick.h"
1011#include " mc/world/level/storage/LevelData.h"
1112
1213#include < cstdint>
@@ -29,9 +30,32 @@ Local<Value> McClass::setMaxNumPlayers(const Arguments& args) {
2930 CHECK_ARG_TYPE (args[0 ], ValueKind::kNumber )
3031
3132 try {
32- int back = ll::service::getServerNetworkHandler ()->setMaxNumPlayers (args[0 ].asNumber ().toInt32 ());
33- ll::service::getServerNetworkHandler ()->updateServerAnnouncement ();
34- return Boolean::newBoolean (back == 0 ? true : false );
33+ int maxPlayers = args[0 ].asNumber ().toInt32 ();
34+ auto handler = ll::service::getServerNetworkHandler ();
35+ int activePlayerCount = handler->_getActiveAndInProgressPlayerCount (mce::UUID::EMPTY ());
36+ bool result = true ;
37+
38+ if (maxPlayers <= SharedConstants::NetworkDefaultMaxConnections ()) {
39+ if (maxPlayers < activePlayerCount) {
40+ maxPlayers = activePlayerCount;
41+ result = false ;
42+ }
43+ } else {
44+ maxPlayers = SharedConstants::NetworkDefaultMaxConnections ();
45+ result = false ;
46+ }
47+
48+ int previousMaxPlayers = handler->mMaxNumPlayers ;
49+ handler->mMaxNumPlayers = maxPlayers;
50+
51+ if (previousMaxPlayers != maxPlayers) {
52+ handler->updateServerAnnouncement ();
53+ handler->mApp .onNetworkMaxPlayersChanged (handler->mMaxNumPlayers );
54+ }
55+
56+ handler->updateServerAnnouncement ();
57+
58+ return Boolean::newBoolean (result);
3559 }
3660 CATCH (" Fail in setMaxPlayers!" )
3761}
@@ -47,13 +71,10 @@ Local<Value> McClass::getTime(const Arguments& args) {
4771 switch (option) {
4872 case 0 :
4973 return Number::newNumber (ll::service::getLevel ()->getTime () % 24000 );
50- break ;
5174 case 1 :
5275 return Number::newNumber (static_cast <int64_t >(ll::service::getLevel ()->getCurrentTick ().tickID ));
53- break ;
5476 case 2 :
5577 return Number::newNumber (ll::service::getLevel ()->getTime () / 24000 );
56- break ;
5778 default :
5879 throw script::Exception (" The range of this argument is between 0 and 2" );
5980 }
@@ -74,16 +95,18 @@ Local<Value> McClass::setTime(const Arguments& args) {
7495 else if (targetTime < currentTimeOfDay) newTime = currentTime + targetTime + 24000 - currentTimeOfDay;
7596
7697 ll::service::getLevel ()->setTime (newTime);
77- SetTimePacket (newTime).sendToClients ();
98+ SetTimePacket packet;
99+ packet.mTime = newTime;
100+ packet.sendToClients ();
78101 }
79102 CATCH (" Fail in setTime!" )
80103
81104 return Boolean::newBoolean (true );
82105}
83106
84107Local<Value> McClass::getWeather (const Arguments&) { // weather: 0: Clear, 1: Rain, 2: Thunder
85- if (ll::service::getLevel ()->getLevelData ().isLightning () ) return Number::newNumber (2 );
86- else if (ll::service::getLevel ()->getLevelData ().isRaining () ) return Number::newNumber (1 );
108+ if (ll::service::getLevel ()->getLevelData ().mLightningLevel > 0 . 0f ) return Number::newNumber (2 );
109+ else if (ll::service::getLevel ()->getLevelData ().mRainLevel > 0 . 0f ) return Number::newNumber (1 );
87110
88111 return Number::newNumber (0 );
89112}
0 commit comments