mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-05-10 15:59:39 +00:00
Removing achievements
This commit is contained in:
parent
b543744534
commit
a91a86bf1d
@ -1006,7 +1006,6 @@ class Server{
|
|||||||
"motd" => \pocketmine\NAME . " Server",
|
"motd" => \pocketmine\NAME . " Server",
|
||||||
"server-port" => 19132,
|
"server-port" => 19132,
|
||||||
"white-list" => false,
|
"white-list" => false,
|
||||||
"announce-player-achievements" => true,
|
|
||||||
"max-players" => 20,
|
"max-players" => 20,
|
||||||
"gamemode" => 0,
|
"gamemode" => 0,
|
||||||
"force-gamemode" => false,
|
"force-gamemode" => false,
|
||||||
|
@ -23,13 +23,11 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace pocketmine\entity\object;
|
namespace pocketmine\entity\object;
|
||||||
|
|
||||||
use pocketmine\block\Wood;
|
|
||||||
use pocketmine\entity\Entity;
|
use pocketmine\entity\Entity;
|
||||||
use pocketmine\event\entity\ItemDespawnEvent;
|
use pocketmine\event\entity\ItemDespawnEvent;
|
||||||
use pocketmine\event\entity\ItemSpawnEvent;
|
use pocketmine\event\entity\ItemSpawnEvent;
|
||||||
use pocketmine\event\inventory\InventoryPickupItemEvent;
|
use pocketmine\event\inventory\InventoryPickupItemEvent;
|
||||||
use pocketmine\item\Item;
|
use pocketmine\item\Item;
|
||||||
use pocketmine\item\ItemIds;
|
|
||||||
use pocketmine\nbt\tag\CompoundTag;
|
use pocketmine\nbt\tag\CompoundTag;
|
||||||
use pocketmine\network\mcpe\protocol\AddItemActorPacket;
|
use pocketmine\network\mcpe\protocol\AddItemActorPacket;
|
||||||
use pocketmine\network\mcpe\protocol\TakeItemActorPacket;
|
use pocketmine\network\mcpe\protocol\TakeItemActorPacket;
|
||||||
@ -263,12 +261,6 @@ class ItemEntity extends Entity{
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if($item->getBlock() instanceof Wood){
|
|
||||||
$player->awardAchievement("mineWood");
|
|
||||||
}elseif($item->getId() === ItemIds::DIAMOND){
|
|
||||||
$player->awardAchievement("diamond");
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->server->broadcastPacket($this->getViewers(), TakeItemActorPacket::create($player->getId(), $this->getId()));
|
$this->server->broadcastPacket($this->getViewers(), TakeItemActorPacket::create($player->getId(), $this->getId()));
|
||||||
|
|
||||||
$playerInventory->addItem(clone $item);
|
$playerInventory->addItem(clone $item);
|
||||||
|
@ -1,92 +0,0 @@
|
|||||||
<?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\event\player;
|
|
||||||
|
|
||||||
use pocketmine\command\CommandSender;
|
|
||||||
use pocketmine\event\Cancellable;
|
|
||||||
use pocketmine\event\CancellableTrait;
|
|
||||||
use pocketmine\lang\TextContainer;
|
|
||||||
use pocketmine\player\Player;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when a player is awarded an achievement
|
|
||||||
*/
|
|
||||||
class PlayerAchievementAwardedEvent extends PlayerEvent implements Cancellable{
|
|
||||||
use CancellableTrait;
|
|
||||||
|
|
||||||
/** @var string */
|
|
||||||
protected $achievement;
|
|
||||||
/** @var TextContainer|null */
|
|
||||||
private $message;
|
|
||||||
/** @var CommandSender[] */
|
|
||||||
private $broadcastRecipients;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param Player $player
|
|
||||||
* @param string $achievementId
|
|
||||||
* @param TextContainer|null $message
|
|
||||||
* @param CommandSender[] $messageRecipients
|
|
||||||
*/
|
|
||||||
public function __construct(Player $player, string $achievementId, ?TextContainer $message, array $messageRecipients){
|
|
||||||
$this->player = $player;
|
|
||||||
$this->achievement = $achievementId;
|
|
||||||
$this->message = $message;
|
|
||||||
$this->broadcastRecipients = $messageRecipients;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getAchievement() : string{
|
|
||||||
return $this->achievement;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return TextContainer|null
|
|
||||||
*/
|
|
||||||
public function getMessage() : ?TextContainer{
|
|
||||||
return $this->message;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param TextContainer|null $message
|
|
||||||
*/
|
|
||||||
public function setMessage(?TextContainer $message) : void{
|
|
||||||
$this->message = $message;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return CommandSender[]
|
|
||||||
*/
|
|
||||||
public function getBroadcastRecipients() : array{
|
|
||||||
return $this->broadcastRecipients;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param CommandSender[] $broadcastRecipients
|
|
||||||
*/
|
|
||||||
public function setBroadcastRecipients(array $broadcastRecipients) : void{
|
|
||||||
$this->broadcastRecipients = $broadcastRecipients;
|
|
||||||
}
|
|
||||||
}
|
|
@ -26,7 +26,6 @@ namespace pocketmine\inventory\transaction;
|
|||||||
use pocketmine\crafting\CraftingRecipe;
|
use pocketmine\crafting\CraftingRecipe;
|
||||||
use pocketmine\event\inventory\CraftItemEvent;
|
use pocketmine\event\inventory\CraftItemEvent;
|
||||||
use pocketmine\item\Item;
|
use pocketmine\item\Item;
|
||||||
use pocketmine\item\ItemIds;
|
|
||||||
use pocketmine\network\mcpe\protocol\ContainerClosePacket;
|
use pocketmine\network\mcpe\protocol\ContainerClosePacket;
|
||||||
use pocketmine\network\mcpe\protocol\types\ContainerIds;
|
use pocketmine\network\mcpe\protocol\types\ContainerIds;
|
||||||
use function array_pop;
|
use function array_pop;
|
||||||
@ -170,47 +169,4 @@ class CraftingTransaction extends InventoryTransaction{
|
|||||||
*/
|
*/
|
||||||
$this->source->sendDataPacket(ContainerClosePacket::create(ContainerIds::NONE));
|
$this->source->sendDataPacket(ContainerClosePacket::create(ContainerIds::NONE));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function execute() : bool{
|
|
||||||
if(parent::execute()){
|
|
||||||
foreach($this->outputs as $item){
|
|
||||||
switch($item->getId()){
|
|
||||||
case ItemIds::CRAFTING_TABLE:
|
|
||||||
$this->source->awardAchievement("buildWorkBench");
|
|
||||||
break;
|
|
||||||
case ItemIds::WOODEN_PICKAXE:
|
|
||||||
$this->source->awardAchievement("buildPickaxe");
|
|
||||||
break;
|
|
||||||
case ItemIds::FURNACE:
|
|
||||||
$this->source->awardAchievement("buildFurnace");
|
|
||||||
break;
|
|
||||||
case ItemIds::WOODEN_HOE:
|
|
||||||
$this->source->awardAchievement("buildHoe");
|
|
||||||
break;
|
|
||||||
case ItemIds::BREAD:
|
|
||||||
$this->source->awardAchievement("makeBread");
|
|
||||||
break;
|
|
||||||
case ItemIds::CAKE:
|
|
||||||
$this->source->awardAchievement("bakeCake");
|
|
||||||
break;
|
|
||||||
case ItemIds::STONE_PICKAXE:
|
|
||||||
case ItemIds::GOLDEN_PICKAXE:
|
|
||||||
case ItemIds::IRON_PICKAXE:
|
|
||||||
case ItemIds::DIAMOND_PICKAXE:
|
|
||||||
$this->source->awardAchievement("buildBetterPickaxe");
|
|
||||||
break;
|
|
||||||
case ItemIds::WOODEN_SWORD:
|
|
||||||
$this->source->awardAchievement("buildSword");
|
|
||||||
break;
|
|
||||||
case ItemIds::DIAMOND:
|
|
||||||
$this->source->awardAchievement("diamond");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -250,8 +250,6 @@ class InGamePacketHandler extends PacketHandler{
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: fix achievement for getting iron from furnace
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -1,125 +0,0 @@
|
|||||||
<?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\player;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles the achievement list and a bit more
|
|
||||||
*/
|
|
||||||
abstract class Achievement{
|
|
||||||
/**
|
|
||||||
* @var array[]
|
|
||||||
*/
|
|
||||||
public static $list = [
|
|
||||||
/*"openInventory" => array(
|
|
||||||
"name" => "Taking Inventory",
|
|
||||||
"requires" => [],
|
|
||||||
),*/
|
|
||||||
"mineWood" => [
|
|
||||||
"name" => "Getting Wood",
|
|
||||||
"requires" => [ //"openInventory",
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"buildWorkBench" => [
|
|
||||||
"name" => "Benchmarking",
|
|
||||||
"requires" => [
|
|
||||||
"mineWood"
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"buildPickaxe" => [
|
|
||||||
"name" => "Time to Mine!",
|
|
||||||
"requires" => [
|
|
||||||
"buildWorkBench"
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"buildFurnace" => [
|
|
||||||
"name" => "Hot Topic",
|
|
||||||
"requires" => [
|
|
||||||
"buildPickaxe"
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"acquireIron" => [
|
|
||||||
"name" => "Acquire hardware",
|
|
||||||
"requires" => [
|
|
||||||
"buildFurnace"
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"buildHoe" => [
|
|
||||||
"name" => "Time to Farm!",
|
|
||||||
"requires" => [
|
|
||||||
"buildWorkBench"
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"makeBread" => [
|
|
||||||
"name" => "Bake Bread",
|
|
||||||
"requires" => [
|
|
||||||
"buildHoe"
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"bakeCake" => [
|
|
||||||
"name" => "The Lie",
|
|
||||||
"requires" => [
|
|
||||||
"buildHoe"
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"buildBetterPickaxe" => [
|
|
||||||
"name" => "Getting an Upgrade",
|
|
||||||
"requires" => [
|
|
||||||
"buildPickaxe"
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"buildSword" => [
|
|
||||||
"name" => "Time to Strike!",
|
|
||||||
"requires" => [
|
|
||||||
"buildWorkBench"
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"diamonds" => [
|
|
||||||
"name" => "DIAMONDS!",
|
|
||||||
"requires" => [
|
|
||||||
"acquireIron"
|
|
||||||
]
|
|
||||||
]
|
|
||||||
|
|
||||||
];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $achievementId
|
|
||||||
* @param string $achievementName
|
|
||||||
* @param array $requires
|
|
||||||
*
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public static function add(string $achievementId, string $achievementName, array $requires = []) : bool{
|
|
||||||
if(!isset(Achievement::$list[$achievementId])){
|
|
||||||
Achievement::$list[$achievementId] = [
|
|
||||||
"name" => $achievementName,
|
|
||||||
"requires" => $requires
|
|
||||||
];
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
@ -41,7 +41,6 @@ use pocketmine\event\entity\EntityDamageByEntityEvent;
|
|||||||
use pocketmine\event\entity\EntityDamageEvent;
|
use pocketmine\event\entity\EntityDamageEvent;
|
||||||
use pocketmine\event\inventory\InventoryCloseEvent;
|
use pocketmine\event\inventory\InventoryCloseEvent;
|
||||||
use pocketmine\event\inventory\InventoryOpenEvent;
|
use pocketmine\event\inventory\InventoryOpenEvent;
|
||||||
use pocketmine\event\player\PlayerAchievementAwardedEvent;
|
|
||||||
use pocketmine\event\player\PlayerBedEnterEvent;
|
use pocketmine\event\player\PlayerBedEnterEvent;
|
||||||
use pocketmine\event\player\PlayerBedLeaveEvent;
|
use pocketmine\event\player\PlayerBedLeaveEvent;
|
||||||
use pocketmine\event\player\PlayerBlockPickEvent;
|
use pocketmine\event\player\PlayerBlockPickEvent;
|
||||||
@ -78,7 +77,6 @@ use pocketmine\item\ItemUseResult;
|
|||||||
use pocketmine\lang\TextContainer;
|
use pocketmine\lang\TextContainer;
|
||||||
use pocketmine\lang\TranslationContainer;
|
use pocketmine\lang\TranslationContainer;
|
||||||
use pocketmine\math\Vector3;
|
use pocketmine\math\Vector3;
|
||||||
use pocketmine\nbt\tag\ByteTag;
|
|
||||||
use pocketmine\nbt\tag\CompoundTag;
|
use pocketmine\nbt\tag\CompoundTag;
|
||||||
use pocketmine\nbt\tag\DoubleTag;
|
use pocketmine\nbt\tag\DoubleTag;
|
||||||
use pocketmine\nbt\tag\IntTag;
|
use pocketmine\nbt\tag\IntTag;
|
||||||
@ -108,7 +106,6 @@ use pocketmine\world\particle\PunchBlockParticle;
|
|||||||
use pocketmine\world\Position;
|
use pocketmine\world\Position;
|
||||||
use pocketmine\world\World;
|
use pocketmine\world\World;
|
||||||
use function abs;
|
use function abs;
|
||||||
use function array_filter;
|
|
||||||
use function assert;
|
use function assert;
|
||||||
use function ceil;
|
use function ceil;
|
||||||
use function count;
|
use function count;
|
||||||
@ -190,8 +187,6 @@ class Player extends Human implements CommandSender, ChunkLoader, ChunkListener,
|
|||||||
/** @var bool */
|
/** @var bool */
|
||||||
protected $removeFormat = true;
|
protected $removeFormat = true;
|
||||||
|
|
||||||
/** @var bool[] name of achievement => bool */
|
|
||||||
protected $achievements = [];
|
|
||||||
/** @var int */
|
/** @var int */
|
||||||
protected $firstPlayed;
|
protected $firstPlayed;
|
||||||
/** @var int */
|
/** @var int */
|
||||||
@ -370,15 +365,6 @@ class Player extends Human implements CommandSender, ChunkLoader, ChunkListener,
|
|||||||
$this->setNameTagAlwaysVisible();
|
$this->setNameTagAlwaysVisible();
|
||||||
$this->setCanClimb();
|
$this->setCanClimb();
|
||||||
|
|
||||||
$this->achievements = [];
|
|
||||||
$achievements = $nbt->getCompoundTag("Achievements");
|
|
||||||
if($achievements !== null){
|
|
||||||
/** @var ByteTag $tag */
|
|
||||||
foreach($achievements as $name => $tag){
|
|
||||||
$this->achievements[$name] = $tag->getValue() !== 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!$this->hasValidSpawnPosition()){
|
if(!$this->hasValidSpawnPosition()){
|
||||||
if(($world = $this->server->getWorldManager()->getWorldByName($nbt->getString("SpawnLevel", ""))) instanceof World){
|
if(($world = $this->server->getWorldManager()->getWorldByName($nbt->getString("SpawnLevel", ""))) instanceof World){
|
||||||
$this->spawnPosition = new Position($nbt->getInt("SpawnX"), $nbt->getInt("SpawnY"), $nbt->getInt("SpawnZ"), $world);
|
$this->spawnPosition = new Position($nbt->getInt("SpawnX"), $nbt->getInt("SpawnY"), $nbt->getInt("SpawnZ"), $world);
|
||||||
@ -1122,64 +1108,6 @@ class Player extends Human implements CommandSender, ChunkLoader, ChunkListener,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $achievementId
|
|
||||||
*
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function hasAchievement(string $achievementId) : bool{
|
|
||||||
if(!isset(Achievement::$list[$achievementId])){
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->achievements[$achievementId] ?? false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $achievementId
|
|
||||||
*
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function awardAchievement(string $achievementId) : bool{
|
|
||||||
if(isset(Achievement::$list[$achievementId]) and !$this->hasAchievement($achievementId)){
|
|
||||||
foreach(Achievement::$list[$achievementId]["requires"] as $requirementId){
|
|
||||||
if(!$this->hasAchievement($requirementId)){
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$ev = new PlayerAchievementAwardedEvent(
|
|
||||||
$this,
|
|
||||||
$achievementId,
|
|
||||||
new TranslationContainer("chat.type.achievement", [$this->getDisplayName(), TextFormat::GREEN . Achievement::$list[$achievementId]["name"] . TextFormat::RESET]),
|
|
||||||
$this->server->getConfigBool("announce-player-achievements", true) ? array_filter(PermissionManager::getInstance()->getPermissionSubscriptions(Server::BROADCAST_CHANNEL_USERS), function($v){
|
|
||||||
return $v instanceof CommandSender;
|
|
||||||
}) : [$this]
|
|
||||||
);
|
|
||||||
$ev->call();
|
|
||||||
if(!$ev->isCancelled()){
|
|
||||||
$this->achievements[$achievementId] = true;
|
|
||||||
if(($message = $ev->getMessage()) !== null){
|
|
||||||
$this->server->broadcastMessage($message, $ev->getBroadcastRecipients());
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}else{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $achievementId
|
|
||||||
*/
|
|
||||||
public function removeAchievement(string $achievementId){
|
|
||||||
if($this->hasAchievement($achievementId)){
|
|
||||||
$this->achievements[$achievementId] = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return GameMode
|
* @return GameMode
|
||||||
*/
|
*/
|
||||||
@ -2334,12 +2262,6 @@ class Player extends Human implements CommandSender, ChunkLoader, ChunkListener,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$achievements = new CompoundTag();
|
|
||||||
foreach($this->achievements as $achievement => $status){
|
|
||||||
$achievements->setByte($achievement, $status ? 1 : 0);
|
|
||||||
}
|
|
||||||
$nbt->setTag("Achievements", $achievements);
|
|
||||||
|
|
||||||
$nbt->setInt("playerGameType", $this->gamemode->getMagicNumber());
|
$nbt->setInt("playerGameType", $this->gamemode->getMagicNumber());
|
||||||
$nbt->setLong("firstPlayed", $this->firstPlayed);
|
$nbt->setLong("firstPlayed", $this->firstPlayed);
|
||||||
$nbt->setLong("lastPlayed", (int) floor(microtime(true) * 1000));
|
$nbt->setLong("lastPlayed", (int) floor(microtime(true) * 1000));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user