From bfe0d046632556f41fa4eed8c848e984b99f06f6 Mon Sep 17 00:00:00 2001 From: Shoghi Cervantes Date: Mon, 25 Nov 2013 09:25:24 +0100 Subject: [PATCH 1/2] More notes in Contributions.md --- CONTRIBUTING.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 705cdb48f..6e91d1d1d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,9 +6,8 @@ Before contributing to PocketMine-MP, please read this. ## I've a question -* For questions, please refer to the _#mcpedevs_ IRC - channel on Freenode. There is a [WebIRC](http://webchat.freenode.net?channels=mcpedevs&uio=d4) if you want. -* You can ask directly to _[@PocketMine](https://twitter.com/PocketMine)_ in Twitter. +* For questions, please refer to the _#pocketmine_ or _#mcpedevs_ IRC channel on Freenode. There is a [WebIRC](http://webchat.freenode.net?channels=pockdetmine,mcpedevs&uio=d4) if you want. +* You can ask directly to _[@PocketMine](https://twitter.com/PocketMine)_ in Twitter, but don't expect an inmediate reply. ## I want to create an issue * First, use the [Issue Search](https://github.com/PocketMine/PocketMine-MP/search?ref=cmdform&type=Issues) to check if anyone has reported it. From 7190d444e31ae32d2fd0a024646c2d9e0640dadf Mon Sep 17 00:00:00 2001 From: Shoghi Cervantes Date: Mon, 25 Nov 2013 09:26:12 +0100 Subject: [PATCH 2/2] Revert "Remove Achievement API. Alters game play mechanics." This reverts commit 2621aab2ef9578fea1a1b61ad1e38b81c1a096e9. --- src/API/AchievementAPI.php | 164 +++++++++++++++++++++++++++++++++++++ src/API/PlayerAPI.php | 1 + src/API/ServerAPI.php | 1 + src/Player.php | 47 +++++++++++ 4 files changed, 213 insertions(+) create mode 100644 src/API/AchievementAPI.php diff --git a/src/API/AchievementAPI.php b/src/API/AchievementAPI.php new file mode 100644 index 000000000..f8b047965 --- /dev/null +++ b/src/API/AchievementAPI.php @@ -0,0 +1,164 @@ + array( + "name" => "Taking Inventory", + "requires" => array(), + ),*/ + "mineWood" => array( + "name" => "Getting Wood", + "requires" => array( + //"openInventory", + ), + ), + "buildWorkBench" => array( + "name" => "Benchmarking", + "requires" => array( + "mineWood", + ), + ), + "buildPickaxe" => array( + "name" => "Time to Mine!", + "requires" => array( + "buildWorkBench", + ), + ), + "buildFurnace" => array( + "name" => "Hot Topic", + "requires" => array( + "buildPickaxe", + ), + ), + "acquireIron" => array( + "name" => "Acquire hardware", + "requires" => array( + "buildFurnace", + ), + ), + "buildHoe" => array( + "name" => "Time to Farm!", + "requires" => array( + "buildWorkBench", + ), + ), + "makeBread" => array( + "name" => "Bake Bread", + "requires" => array( + "buildHoe", + ), + ), + "bakeCake" => array( + "name" => "The Lie", + "requires" => array( + "buildHoe", + ), + ), + "buildBetterPickaxe" => array( + "name" => "Getting an Upgrade", + "requires" => array( + "buildPickaxe", + ), + ), + "buildSword" => array( + "name" => "Time to Strike!", + "requires" => array( + "buildWorkBench", + ), + ), + "diamonds" => array( + "name" => "DIAMONDS!", + "requires" => array( + "acquireIron", + ), + ), + + ); + + function __construct(){ + } + + public static function broadcastAchievement(Player $player, $achievementId){ + if(isset(self::$achievements[$achievementId])){ + $result = ServerAPI::request()->api->dhandle("achievement.broadcast", array("player" => $player, "achievementId" => $achievementId)); + if($result !== false and $result !== true){ + if(ServerAPI::request()->api->getProperty("announce-player-achievements") == true){ + ServerAPI::request()->api->chat->broadcast($player->username." has just earned the achievement ".self::$achievements[$achievementId]["name"]); + }else{ + $player->sendChat("You have just earned the achievement ".self::$achievements[$achievementId]["name"]); + } + } + return true; + } + return false; + } + + public static function addAchievement($achievementId, $achievementName, array $requires = array()){ + if(!isset(self::$achievements[$achievementId])){ + self::$achievements[$achievementId] = array( + "name" => $achievementName, + "requires" => $requires, + ); + return true; + } + return false; + } + + public static function hasAchievement(Player $player, $achievementId){ + if(!isset(self::$achievements[$achievementId]) or !isset($player->achievements)){ + $player->achievements = array(); + return false; + } + + if(!isset($player->achievements[$achievementId]) or $player->achievements[$achievementId] == false){ + return false; + } + return true; + } + + public static function grantAchievement(Player $player, $achievementId){ + if(isset(self::$achievements[$achievementId]) and !self::hasAchievement($player, $achievementId)){ + foreach(self::$achievements[$achievementId]["requires"] as $requerimentId){ + if(!self::hasAchievement($player, $requerimentId)){ + return false; + } + } + if(ServerAPI::request()->api->dhandle("achievement.grant", array("player" => $player, "achievementId" => $achievementId)) !== false){ + $player->achievements[$achievementId] = true; + self::broadcastAchievement($player, $achievementId); + return true; + }else{ + return false; + } + } + return false; + } + + public static function removeAchievement(Player $player, $achievementId){ + if(self::hasAchievement($player, $achievementId)){ + $player->achievements[$achievementId] = false; + } + } + + public function init(){ + } +} diff --git a/src/API/PlayerAPI.php b/src/API/PlayerAPI.php index fef602642..525798e9c 100644 --- a/src/API/PlayerAPI.php +++ b/src/API/PlayerAPI.php @@ -459,6 +459,7 @@ class PlayerAPI{ "health" => 20, "lastIP" => "", "lastID" => 0, + "achievements" => array(), ); if(!file_exists(DATA_PATH."players/".$iname.".yml")){ diff --git a/src/API/ServerAPI.php b/src/API/ServerAPI.php index 5c4de5012..809d7952c 100644 --- a/src/API/ServerAPI.php +++ b/src/API/ServerAPI.php @@ -61,6 +61,7 @@ class ServerAPI{ "memory-limit" => "128M", "last-update" => false, "white-list" => false, + "announce-player-achievements" => true, "spawn-protection" => 16, "view-distance" => 10, "max-players" => 20, diff --git a/src/Player.php b/src/Player.php index 42437c49b..dbe3f0633 100644 --- a/src/Player.php +++ b/src/Player.php @@ -58,6 +58,7 @@ class Player{ public $windowCnt = 2; public $windows = array(); public $blocked = true; + public $achievements = array(); public $chunksLoaded = array(); private $chunksOrder = array(); private $lastMeasure = 0; @@ -216,6 +217,7 @@ class Player{ public function save(){ if($this->entity instanceof Entity){ + $this->data->set("achievements", $this->achievements); $this->data->set("position", array( "level" => $this->entity->level->getName(), "x" => $this->entity->x, @@ -536,8 +538,10 @@ class Player{ } switch($data["entity"]->type){ case WOOD: + AchievementAPI::grantAchievement($this, "mineWood"); break; case DIAMOND: + AchievementAPI::grantAchievement($this, "diamond"); break; } }elseif($data["entity"]->level === $this->level){ @@ -749,6 +753,40 @@ class Player{ }else{ $this->setSlot($slot, BlockAPI::getItem($item->getID(), $item->getMetadata(), $s->count + $item->count), false); } + + switch($item->getID()){ + case WORKBENCH: + AchievementAPI::grantAchievement($this, "buildWorkBench"); + break; + case WOODEN_PICKAXE: + AchievementAPI::grantAchievement($this, "buildPickaxe"); + break; + case FURNACE: + AchievementAPI::grantAchievement($this, "buildFurnace"); + break; + case WOODEN_HOE: + AchievementAPI::grantAchievement($this, "buildHoe"); + break; + case BREAD: + AchievementAPI::grantAchievement($this, "makeBread"); + break; + case CAKE: + AchievementAPI::grantAchievement($this, "bakeCake"); + break; + case STONE_PICKAXE: + case GOLD_PICKAXE: + case IRON_PICKAXE: + case DIAMOND_PICKAXE: + AchievementAPI::grantAchievement($this, "buildBetterPickaxe"); + break; + case WOODEN_SWORD: + AchievementAPI::grantAchievement($this, "buildSword"); + break; + case DIAMOND: + AchievementAPI::grantAchievement($this, "diamond"); + break; + + } } } return $res; @@ -1209,6 +1247,7 @@ class Player{ } $this->data->set("inventory", $inv); } + $this->achievements = $this->data->get("achievements"); $this->data->set("caseusername", $this->username); $this->inventory = array(); foreach($this->data->get("inventory") as $slot => $item){ @@ -1969,6 +2008,14 @@ class Player{ )); break; } + + if($tile->class === TILE_FURNACE and $data["slot"] == 2){ + switch($slot->getID()){ + case IRON_INGOT: + AchievementAPI::grantAchievement($this, "acquireIron"); + break; + } + } if($item->getID() !== AIR and $slot->getID() == $item->getID()){ if($slot->count < $item->count){