@@ -192,28 +192,60 @@ public function loadPlugins($directory, $newLoaders = null){
192192 continue ;
193193 }
194194
195- $ compatible = false ;
195+ //1=outdated plugin, 2=outdated server, 4=minor, 8=normal
196+ $ compatibility = 0 ;
196197 //Check multiple dependencies
197- foreach ($ description ->getCompatibleApis () as $ version ){
198+ foreach ($ description ->getCompatibleApis () as $ versionString ){
198199 //Format: majorVersion.minorVersion.patch
199- $ version = array_map ("intval " , explode (". " , $ version ));
200+ $ version = array_map ("intval " , explode (". " , $ versionString ));
200201 $ apiVersion = array_map ("intval " , explode (". " , $ this ->server ->getApiVersion ()));
201- //Completely different API version
202- if ($ version [0 ] !== $ apiVersion [0 ]){
202+ //Completely different API version: too old
203+ if ($ version [0 ] < $ apiVersion [0 ]){
204+ $ compatibility |= 1 ;
205+ continue ;
206+ }
207+ //Completely different API version: too new
208+ if ($ version [0 ] > $ apiVersion [0 ]){
209+ $ compatibility |= 2 ;
203210 continue ;
204211 }
205212 //If the plugin requires new API features, being backwards compatible
206213 if ($ version [1 ] > $ apiVersion [1 ]){
214+ $ compatibility |= 4 ;
207215 continue ;
208216 }
209-
210- $ compatible = true ;
217+ $ compatibility |= 8 ;
211218 break ;
212219 }
213-
214- if ($ compatible === false ){
215- $ this ->server ->getLogger ()->error ($ this ->server ->getLanguage ()->translateString ("pocketmine.plugin.loadError " , [$ name , "%pocketmine.plugin.incompatibleAPI " ]));
216- continue ;
220+ if (($ compatibility & 8 ) === 0 ){
221+ $ accept1 = $ this ->server ->getProperty ("settings.incompatible-plugins.plugin-too-old " , false );
222+ $ accept2 = $ this ->server ->getProperty ("settings.incompatible-plugins.plugin-too-new.major " , false );
223+ $ accept4 = $ this ->server ->getProperty ("settings.incompatible-plugins.plugin-too-new.minor " , false );
224+ if (!$ accept1 ){
225+ $ compatibility &= ~1 ;
226+ }
227+ if (!$ accept2 ){
228+ $ compatibility &= ~2 ;
229+ }
230+ if (!$ accept4 ){
231+ $ compatibility &= ~4 ;
232+ }
233+ if ($ compatibility === 0 ){
234+ if (($ compatibility & 4 ) === 0 ){
235+ $ this ->server ->getLogger ()->error ($ this ->server ->getLanguage ()->translateString ("pocketmine.plugin.loadError " , [$ name , "%pocketmine.plugin.incompatibleAPI.minorTooNew " ]));
236+ }elseif (($ compatibility & 2 ) === 0 ){
237+ $ this ->server ->getLogger ()->error ($ this ->server ->getLanguage ()->translateString ("pocketmine.plugin.loadError " , [$ name , "%pocketmine.plugin.incompatibleAPI.majortooNew " ]));
238+ }else {
239+ $ this ->server ->getLogger ()->error ($ this ->server ->getLanguage ()->translateString ("pocketmine.plugin.loadError " , [$ name , "%pocketmine.plugin.incompatibleAPI.majorTooOld " ]));
240+ }
241+ continue ; #Abort loading of this plugin, move on to the next
242+ }elseif ($ compatibility & 4 ){
243+ $ this ->server ->getLogger ()->warning ($ this ->server ->getLanguage ()->translateString ("pocketmine.plugin.incompatibleAPIWarning.minorTooNew " , [$ name ]));
244+ }elseif ($ compatibility & 2 ){
245+ $ this ->server ->getLogger ()->warning ($ this ->server ->getLanguage ()->translateString ("pocketmine.plugin.incompatibleAPIWarning.majorTooNew " , [$ name ]));
246+ }elseif ($ compatibility & 1 ){
247+ $ this ->server ->getLogger ()->warning ($ this ->server ->getLanguage ()->translateString ("pocketmine.plugin.incompatibleAPIWarning.majorTooOld " , [$ name ]));
248+ }
217249 }
218250
219251 $ plugins [$ name ] = $ file ;
0 commit comments