mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-06-07 12:18:46 +00:00
Forms API, part 1: add Player->sendForm() and Form interface
There's no implementation here yet, but that can come later. This lays the ground for allowing plugins to have an integrated method to send forms, as well as a solution to the ID conflict problem. A built in implementation should not be a concretion and it should be able to be swapped for third party implementations. This enables the possiblity to do so.
This commit is contained in:
parent
d98a6e566c
commit
df8e10cad9
@ -66,6 +66,8 @@ use pocketmine\event\player\PlayerToggleSneakEvent;
|
|||||||
use pocketmine\event\player\PlayerToggleSprintEvent;
|
use pocketmine\event\player\PlayerToggleSprintEvent;
|
||||||
use pocketmine\event\player\PlayerTransferEvent;
|
use pocketmine\event\player\PlayerTransferEvent;
|
||||||
use pocketmine\event\server\DataPacketSendEvent;
|
use pocketmine\event\server\DataPacketSendEvent;
|
||||||
|
use pocketmine\form\Form;
|
||||||
|
use pocketmine\form\FormValidationException;
|
||||||
use pocketmine\inventory\CraftingGrid;
|
use pocketmine\inventory\CraftingGrid;
|
||||||
use pocketmine\inventory\Inventory;
|
use pocketmine\inventory\Inventory;
|
||||||
use pocketmine\inventory\PlayerCursorInventory;
|
use pocketmine\inventory\PlayerCursorInventory;
|
||||||
@ -116,6 +118,7 @@ use pocketmine\network\mcpe\protocol\LevelSoundEventPacket;
|
|||||||
use pocketmine\network\mcpe\protocol\LoginPacket;
|
use pocketmine\network\mcpe\protocol\LoginPacket;
|
||||||
use pocketmine\network\mcpe\protocol\MobEffectPacket;
|
use pocketmine\network\mcpe\protocol\MobEffectPacket;
|
||||||
use pocketmine\network\mcpe\protocol\MobEquipmentPacket;
|
use pocketmine\network\mcpe\protocol\MobEquipmentPacket;
|
||||||
|
use pocketmine\network\mcpe\protocol\ModalFormRequestPacket;
|
||||||
use pocketmine\network\mcpe\protocol\MovePlayerPacket;
|
use pocketmine\network\mcpe\protocol\MovePlayerPacket;
|
||||||
use pocketmine\network\mcpe\protocol\PlayerActionPacket;
|
use pocketmine\network\mcpe\protocol\PlayerActionPacket;
|
||||||
use pocketmine\network\mcpe\protocol\PlayStatusPacket;
|
use pocketmine\network\mcpe\protocol\PlayStatusPacket;
|
||||||
@ -323,6 +326,11 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
|
|||||||
/** @var int[] ID => ticks map */
|
/** @var int[] ID => ticks map */
|
||||||
protected $usedItemsCooldown = [];
|
protected $usedItemsCooldown = [];
|
||||||
|
|
||||||
|
/** @var int */
|
||||||
|
protected $formIdCounter = 0;
|
||||||
|
/** @var Form[] */
|
||||||
|
protected $forms = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return TranslationContainer|string
|
* @return TranslationContainer|string
|
||||||
*/
|
*/
|
||||||
@ -3353,6 +3361,48 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
|
|||||||
$this->dataPacket($pk);
|
$this->dataPacket($pk);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a Form to the player, or queue to send it if a form is already open.
|
||||||
|
*
|
||||||
|
* @param Form $form
|
||||||
|
*/
|
||||||
|
public function sendForm(Form $form) : void{
|
||||||
|
$id = $this->formIdCounter++;
|
||||||
|
$pk = new ModalFormRequestPacket();
|
||||||
|
$pk->formId = $id;
|
||||||
|
$pk->formData = json_encode($form);
|
||||||
|
if($this->dataPacket($pk)){
|
||||||
|
$this->forms[$id] = $form;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int $formId
|
||||||
|
* @param mixed $responseData
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function onFormSubmit(int $formId, $responseData) : bool{
|
||||||
|
if(!isset($this->forms[$formId])){
|
||||||
|
$this->server->getLogger()->debug("Got unexpected response for form $formId");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
try{
|
||||||
|
$next = $this->forms[$formId]->handleResponse($this, $responseData);
|
||||||
|
if($next !== null){
|
||||||
|
$this->sendForm($next);
|
||||||
|
}
|
||||||
|
}catch(FormValidationException $e){
|
||||||
|
$this->server->getLogger()->critical("Failed to validate form " . get_class($this->forms[$formId]) . ": " . $e->getMessage());
|
||||||
|
$this->server->getLogger()->logException($e);
|
||||||
|
}finally{
|
||||||
|
unset($this->forms[$formId]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Note for plugin developers: use kick() with the isAdmin
|
* Note for plugin developers: use kick() with the isAdmin
|
||||||
* flag set to kick without the "Kicked by admin" part instead of this method.
|
* flag set to kick without the "Kicked by admin" part instead of this method.
|
||||||
|
44
src/pocketmine/form/Form.php
Normal file
44
src/pocketmine/form/Form.php
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* ____ _ _ __ __ _ __ __ ____
|
||||||
|
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
|
||||||
|
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
|
||||||
|
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
|
||||||
|
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* @author PocketMine Team
|
||||||
|
* @link http://www.pocketmine.net/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace pocketmine\form;
|
||||||
|
|
||||||
|
use pocketmine\Player;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Form implementations must implement this interface to be able to utilize the Player form-sending mechanism.
|
||||||
|
* There is no restriction on custom implementations other than that they must implement this.
|
||||||
|
*/
|
||||||
|
interface Form extends \JsonSerializable{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles a form response from a player.
|
||||||
|
*
|
||||||
|
* @param Player $player
|
||||||
|
* @param mixed $data
|
||||||
|
*
|
||||||
|
* @return Form|null a form which will be opened immediately (before queued forms) as a response to this form, or null if not applicable.
|
||||||
|
* @throws FormValidationException
|
||||||
|
*/
|
||||||
|
public function handleResponse(Player $player, $data) : ?Form;
|
||||||
|
}
|
28
src/pocketmine/form/FormValidationException.php
Normal file
28
src/pocketmine/form/FormValidationException.php
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* ____ _ _ __ __ _ __ __ ____
|
||||||
|
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
|
||||||
|
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
|
||||||
|
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
|
||||||
|
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* @author PocketMine Team
|
||||||
|
* @link http://www.pocketmine.net/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace pocketmine\form;
|
||||||
|
|
||||||
|
class FormValidationException extends \RuntimeException{
|
||||||
|
|
||||||
|
}
|
@ -239,7 +239,7 @@ class PlayerNetworkSessionAdapter extends NetworkSession{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function handleModalFormResponse(ModalFormResponsePacket $packet) : bool{
|
public function handleModalFormResponse(ModalFormResponsePacket $packet) : bool{
|
||||||
return false; //TODO: GUI stuff
|
return $this->player->onFormSubmit($packet->formId, json_decode($packet->formData, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function handleServerSettingsRequest(ServerSettingsRequestPacket $packet) : bool{
|
public function handleServerSettingsRequest(ServerSettingsRequestPacket $packet) : bool{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user