mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-07-06 10:01:53 +00:00
Added methods for calculating sun angle and sky light level reduction by day time
Use real sky light level in Level->getFullLightAt() close #1471
This commit is contained in:
parent
a5f4dda918
commit
51cec525ee
@ -168,6 +168,11 @@ class Level implements ChunkManager, Metadatable{
|
|||||||
/** @var bool */
|
/** @var bool */
|
||||||
public $stopTime = false;
|
public $stopTime = false;
|
||||||
|
|
||||||
|
/** @var float */
|
||||||
|
private $sunAnglePercentage = 0.0;
|
||||||
|
/** @var int */
|
||||||
|
private $skyLightReduction = 0;
|
||||||
|
|
||||||
/** @var string */
|
/** @var string */
|
||||||
private $folderName;
|
private $folderName;
|
||||||
/** @var string */
|
/** @var string */
|
||||||
@ -704,6 +709,9 @@ class Level implements ChunkManager, Metadatable{
|
|||||||
|
|
||||||
$this->checkTime();
|
$this->checkTime();
|
||||||
|
|
||||||
|
$this->sunAnglePercentage = $this->computeSunAnglePercentage(); //Sun angle depends on the current time
|
||||||
|
$this->skyLightReduction = $this->computeSkyLightReduction(); //Sky light reduction depends on the sun angle
|
||||||
|
|
||||||
if(++$this->sendTimeTicker === 200){
|
if(++$this->sendTimeTicker === 200){
|
||||||
$this->sendTime();
|
$this->sendTime();
|
||||||
$this->sendTimeTicker = 0;
|
$this->sendTimeTicker = 0;
|
||||||
@ -1303,8 +1311,7 @@ class Level implements ChunkManager, Metadatable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function getFullLightAt(int $x, int $y, int $z) : int{
|
public function getFullLightAt(int $x, int $y, int $z) : int{
|
||||||
//TODO: decrease light level by time of day
|
$skyLight = $this->getRealBlockSkyLightAt($x, $y, $z);
|
||||||
$skyLight = $this->getBlockSkyLightAt($x, $y, $z);
|
|
||||||
if($skyLight < 15){
|
if($skyLight < 15){
|
||||||
return max($skyLight, $this->getBlockLightAt($x, $y, $z));
|
return max($skyLight, $this->getBlockLightAt($x, $y, $z));
|
||||||
}else{
|
}else{
|
||||||
@ -1312,6 +1319,85 @@ class Level implements ChunkManager, Metadatable{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Computes the percentage of a circle away from noon the sun is currently at. This can be multiplied by 2 * M_PI to
|
||||||
|
* get an angle in radians, or by 360 to get an angle in degrees.
|
||||||
|
*
|
||||||
|
* @return float
|
||||||
|
*/
|
||||||
|
public function computeSunAnglePercentage() : float{
|
||||||
|
$timeProgress = ($this->time % 24000) / 24000;
|
||||||
|
|
||||||
|
//0.0 needs to be high noon, not dusk
|
||||||
|
$sunProgress = $timeProgress + ($timeProgress < 0.25 ? 0.75 : -0.25);
|
||||||
|
|
||||||
|
//Offset the sun progress to be above the horizon longer at dusk and dawn
|
||||||
|
//this is roughly an inverted sine curve, which pushes the sun progress back at dusk and forwards at dawn
|
||||||
|
$diff = (((1 - ((cos($sunProgress * M_PI) + 1) / 2)) - $sunProgress) / 3);
|
||||||
|
|
||||||
|
return $sunProgress + $diff;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the percentage of a circle away from noon the sun is currently at.
|
||||||
|
* @return float
|
||||||
|
*/
|
||||||
|
public function getSunAnglePercentage() : float{
|
||||||
|
return $this->sunAnglePercentage;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the current sun angle in radians.
|
||||||
|
* @return float
|
||||||
|
*/
|
||||||
|
public function getSunAngleRadians() : float{
|
||||||
|
return $this->sunAnglePercentage * 2 * M_PI;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the current sun angle in degrees.
|
||||||
|
* @return float
|
||||||
|
*/
|
||||||
|
public function getSunAngleDegrees() : float{
|
||||||
|
return $this->sunAnglePercentage * 360.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Computes how many points of sky light is subtracted based on the current time. Used to offset raw chunk sky light
|
||||||
|
* to get a real light value.
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public function computeSkyLightReduction() : int{
|
||||||
|
$percentage = max(0, min(1, -(cos($this->getSunAngleRadians()) * 2 - 0.5)));
|
||||||
|
|
||||||
|
//TODO: check rain and thunder level
|
||||||
|
|
||||||
|
return (int) ($percentage * 11);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns how many points of sky light is subtracted based on the current time.
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public function getSkyLightReduction() : int{
|
||||||
|
return $this->skyLightReduction;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the sky light level at the specified coordinates, offset by the current time and weather.
|
||||||
|
*
|
||||||
|
* @param int $x
|
||||||
|
* @param int $y
|
||||||
|
* @param int $z
|
||||||
|
*
|
||||||
|
* @return int 0-15
|
||||||
|
*/
|
||||||
|
public function getRealBlockSkyLightAt(int $x, int $y, int $z) : int{
|
||||||
|
$light = $this->getBlockSkyLightAt($x, $y, $z) - $this->skyLightReduction;
|
||||||
|
return $light < 0 ? 0 : $light;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param $x
|
* @param $x
|
||||||
* @param $y
|
* @param $y
|
||||||
|
Loading…
x
Reference in New Issue
Block a user