Player: move toggle* rollback handling to network session

this allows network sessions to react to it how they want, or (in the case of things like Specter) perhaps ignore it.
This commit is contained in:
Dylan K. Taylor 2019-04-02 19:49:53 +01:00
parent 80a6fc5dd1
commit f332550e52
2 changed files with 30 additions and 21 deletions

View File

@ -2145,38 +2145,37 @@ class Player extends Human implements CommandSender, ChunkLoader, ChunkListener,
return false; return false;
} }
public function toggleSprint(bool $sprint) : void{ public function toggleSprint(bool $sprint) : bool{
$ev = new PlayerToggleSprintEvent($this, $sprint); $ev = new PlayerToggleSprintEvent($this, $sprint);
$ev->call(); $ev->call();
if($ev->isCancelled()){ if($ev->isCancelled()){
$this->sendData($this); return false;
}else{
$this->setSprinting($sprint);
} }
$this->setSprinting($sprint);
return true;
} }
public function toggleSneak(bool $sneak) : void{ public function toggleSneak(bool $sneak) : bool{
$ev = new PlayerToggleSneakEvent($this, $sneak); $ev = new PlayerToggleSneakEvent($this, $sneak);
$ev->call(); $ev->call();
if($ev->isCancelled()){ if($ev->isCancelled()){
$this->sendData($this); return false;
}else{
$this->setSneaking($sneak);
} }
$this->setSneaking($sneak);
return true;
} }
public function toggleFlight(bool $fly) : void{ public function toggleFlight(bool $fly) : bool{
$ev = new PlayerToggleFlightEvent($this, $fly); $ev = new PlayerToggleFlightEvent($this, $fly);
if(!$this->allowFlight){ $ev->setCancelled(!$this->allowFlight);
$ev->setCancelled();
}
$ev->call(); $ev->call();
if($ev->isCancelled()){ if($ev->isCancelled()){
$this->networkSession->syncAdventureSettings($this); return false;
}else{ //don't use setFlying() here, to avoid feedback loops
$this->flying = $fly;
$this->resetFallDistance();
} }
//don't use setFlying() here, to avoid feedback loops - TODO: get rid of this hack
$this->flying = $fly;
$this->resetFallDistance();
return true;
} }
public function animate(int $action) : bool{ public function animate(int $action) : bool{

View File

@ -362,16 +362,24 @@ class SimpleSessionHandler extends SessionHandler{
$this->player->jump(); $this->player->jump();
return true; return true;
case PlayerActionPacket::ACTION_START_SPRINT: case PlayerActionPacket::ACTION_START_SPRINT:
$this->player->toggleSprint(true); if(!$this->player->toggleSprint(true)){
$this->player->sendData($this->player);
}
return true; return true;
case PlayerActionPacket::ACTION_STOP_SPRINT: case PlayerActionPacket::ACTION_STOP_SPRINT:
$this->player->toggleSprint(false); if(!$this->player->toggleSprint(false)){
$this->player->sendData($this->player);
}
return true; return true;
case PlayerActionPacket::ACTION_START_SNEAK: case PlayerActionPacket::ACTION_START_SNEAK:
$this->player->toggleSneak(true); if(!$this->player->toggleSneak(true)){
$this->player->sendData($this->player);
}
return true; return true;
case PlayerActionPacket::ACTION_STOP_SNEAK: case PlayerActionPacket::ACTION_STOP_SNEAK:
$this->player->toggleSneak(false); if(!$this->player->toggleSneak(false)){
$this->player->sendData($this->player);
}
return true; return true;
case PlayerActionPacket::ACTION_START_GLIDE: case PlayerActionPacket::ACTION_START_GLIDE:
case PlayerActionPacket::ACTION_STOP_GLIDE: case PlayerActionPacket::ACTION_STOP_GLIDE:
@ -423,7 +431,9 @@ class SimpleSessionHandler extends SessionHandler{
$isFlying = $packet->getFlag(AdventureSettingsPacket::FLYING); $isFlying = $packet->getFlag(AdventureSettingsPacket::FLYING);
if($isFlying !== $this->player->isFlying()){ if($isFlying !== $this->player->isFlying()){
$this->player->toggleFlight($isFlying); if(!$this->player->toggleFlight($isFlying)){
$this->session->syncAdventureSettings($this->player);
}
$handled = true; $handled = true;
} }