Compare commits

..

9 Commits
3.5.3 ... 3.5.4

Author SHA1 Message Date
d33acc4fd0 Release 3.5.4 2019-01-01 12:33:17 +00:00
f7de6eb59f Network: Deprecate some garbage
Deprecations on a patch version breaks release protocol, but I don't care at this point. Nobody should have been using this shit anyway.
2018-12-31 22:52:39 +00:00
75a0627bf2 Network: cut this catch-all bullshit out as well
If a network interface crashes, it should take out the whole server, not try to keep on ticking.
2018-12-31 22:40:13 +00:00
8752e363c9 EXCUSE ME, HOW DARE YOU NOT LOG NETWORK ERRORS?! 2018-12-31 22:33:56 +00:00
9ed1b5ca7f Event: More detailed errors for non-cancellable events 2018-12-31 21:29:22 +00:00
1cbb31f1db Player: Reintroduce permission checks for command hints
This was removed way back in 2016 because of an unidentified bug which caused permissible commands not to show up on the client. Back then, command parsing and validity checks were client-sided, and the client would simply not send the command at all if it didn't recognize it. Now, that problem is gone, so it doesn't matter as much if there are permission bugs which cause commands to be erroneously missing.
closes #2625
2018-12-31 19:35:59 +00:00
1393b4c4e2 Player: aDd a HacK foR CliEnt SidE rIghT cLicK SpaM BuG
this bug has existed for so long I forgot it was still here. People stopped pestering me to do something about it, and as a result I forgot to do anything about it.

This hack isn't perfect, but it filters out the worst of the noise. It has side effects for legitimate fast double-clicks, but I don't think anyone will be too bothered - just click more slowly.

This hack may also have negative side effects on poor connections where latency spikes are a problem, but there isn't really much that can be done about that.
2018-12-31 19:16:13 +00:00
2921c86b3c Torch: fixed crash on blockupdate with corrupted meta 2018-12-30 19:50:35 +00:00
9c3a929b65 3.5.4 is next 2018-12-30 19:04:47 +00:00
9 changed files with 39 additions and 28 deletions

View File

@ -327,6 +327,11 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
/** @var Form[] */
protected $forms = [];
/** @var float */
protected $lastRightClickTime = 0.0;
/** @var Vector3|null */
protected $lastRightClickPos = null;
/**
* @return TranslationContainer|string
*/
@ -671,7 +676,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
public function sendCommandData(){
$pk = new AvailableCommandsPacket();
foreach($this->server->getCommandMap()->getCommands() as $name => $command){
if(isset($pk->commandData[$command->getName()]) or $command->getName() === "help"){
if(isset($pk->commandData[$command->getName()]) or $command->getName() === "help" or !$command->testPermissionSilent($this)){
continue;
}
@ -2333,6 +2338,19 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
$type = $packet->trData->actionType;
switch($type){
case InventoryTransactionPacket::USE_ITEM_ACTION_CLICK_BLOCK:
//TODO: start hack for client spam bug
$spamBug = ($this->lastRightClickPos !== null and
microtime(true) - $this->lastRightClickTime < 0.1 and //100ms
$this->lastRightClickPos->distanceSquared($packet->trData->clickPos) < 0.00001 //signature spam bug has 0 distance, but allow some error
);
//get rid of continued spam if the player clicks and holds right-click
$this->lastRightClickPos = clone $packet->trData->clickPos;
$this->lastRightClickTime = microtime(true);
if($spamBug){
return true;
}
//TODO: end hack for client spam bug
$this->setUsingItem(false);
if(!$this->canInteract($blockVector->add(0.5, 0.5, 0.5), 13) or $this->isSpectator()){

View File

@ -37,7 +37,7 @@ namespace pocketmine {
use pocketmine\wizard\SetupWizard;
const NAME = "PocketMine-MP";
const BASE_VERSION = "3.5.3";
const BASE_VERSION = "3.5.4";
const IS_DEVELOPMENT_BUILD = false;
const BUILD_NUMBER = 0;

View File

@ -2491,9 +2491,7 @@ class Server{
$this->logger->debug("Unhandled raw packet from $address $port: " . bin2hex($payload));
}
}catch(\Throwable $e){
if(\pocketmine\DEBUG > 1){
$this->logger->logException($e);
}
$this->getNetwork()->blockAddress($address, 600);
}

View File

@ -45,8 +45,8 @@ class Torch extends Flowable{
public function onNearbyBlockChange() : void{
$below = $this->getSide(Vector3::SIDE_DOWN);
$side = $this->getDamage();
$faces = [
$meta = $this->getDamage();
static $faces = [
0 => Vector3::SIDE_DOWN,
1 => Vector3::SIDE_WEST,
2 => Vector3::SIDE_EAST,
@ -54,8 +54,9 @@ class Torch extends Flowable{
4 => Vector3::SIDE_SOUTH,
5 => Vector3::SIDE_DOWN
];
$face = $faces[$meta] ?? Vector3::SIDE_DOWN;
if($this->getSide($faces[$side])->isTransparent() and !($faces[$side] === Vector3::SIDE_DOWN and ($below->getId() === self::FENCE or $below->getId() === self::COBBLESTONE_WALL))){
if($this->getSide($face)->isTransparent() and !($face === Vector3::SIDE_DOWN and ($below->getId() === self::FENCE or $below->getId() === self::COBBLESTONE_WALL))){
$this->getLevel()->useBreakOn($this);
}
}

View File

@ -50,7 +50,7 @@ abstract class Event{
*/
public function isCancelled() : bool{
if(!($this instanceof Cancellable)){
throw new \BadMethodCallException("Event is not Cancellable");
throw new \BadMethodCallException(get_class($this) . " is not Cancellable");
}
/** @var Event $this */
@ -64,7 +64,7 @@ abstract class Event{
*/
public function setCancelled(bool $value = true) : void{
if(!($this instanceof Cancellable)){
throw new \BadMethodCallException("Event is not Cancellable");
throw new \BadMethodCallException(get_class($this) . " is not Cancellable");
}
/** @var Event $this */

View File

@ -26,7 +26,8 @@ namespace pocketmine\event\server;
use pocketmine\network\SourceInterface;
/**
* Called when a network interface crashes, with relevant crash information.
* Never called. Should never have come into this world. Nothing to see here.
* @deprecated
*/
class NetworkInterfaceCrashEvent extends NetworkInterfaceEvent{
/**

View File

@ -26,7 +26,6 @@ declare(strict_types=1);
*/
namespace pocketmine\network;
use pocketmine\event\server\NetworkInterfaceCrashEvent;
use pocketmine\event\server\NetworkInterfaceRegisterEvent;
use pocketmine\event\server\NetworkInterfaceUnregisterEvent;
use pocketmine\network\mcpe\protocol\PacketPool;
@ -85,25 +84,16 @@ class Network{
public function processInterfaces(){
foreach($this->interfaces as $interface){
$this->processInterface($interface);
}
}
public function processInterface(SourceInterface $interface) : void{
try{
$interface->process();
}catch(\Throwable $e){
$logger = $this->server->getLogger();
if(\pocketmine\DEBUG > 1){
$logger->logException($e);
}
}
(new NetworkInterfaceCrashEvent($interface, $e))->call();
$interface->emergencyShutdown();
$this->unregisterInterface($interface);
$logger->critical($this->server->getLanguage()->translateString("pocketmine.server.networkError", [get_class($interface), $e->getMessage()]));
}
/**
* @deprecated
* @param SourceInterface $interface
*/
public function processInterface(SourceInterface $interface) : void{
$interface->process();
}
/**

View File

@ -71,6 +71,9 @@ interface SourceInterface{
public function shutdown();
/**
* @deprecated
*/
public function emergencyShutdown();
}

View File

@ -89,7 +89,7 @@ class RakLibInterface implements ServerInstance, AdvancedSourceInterface{
public function start(){
$this->server->getTickSleeper()->addNotifier($this->sleeper, function() : void{
$this->server->getNetwork()->processInterface($this);
$this->process();
});
$this->rakLib->start(PTHREADS_INHERIT_CONSTANTS); //HACK: MainLogger needs constants for exception logging
}