Added /kill, base entity health methods

This commit is contained in:
Shoghi Cervantes 2014-04-02 18:27:49 +02:00
parent bec642310a
commit 5cadc665d1
5 changed files with 134 additions and 22 deletions

View File

@ -24,11 +24,23 @@ namespace pocketmine;
use pocketmine\block\Block; use pocketmine\block\Block;
use pocketmine\command\CommandSender; use pocketmine\command\CommandSender;
use pocketmine\entity\Human; use pocketmine\entity\Human;
use pocketmine\Event; use pocketmine\event\player\PlayerAchievementAwardedEvent;
use pocketmine\event\player\PlayerChatEvent;
use pocketmine\event\player\PlayerCommandPreprocessEvent;
use pocketmine\event\player\PlayerGameModeChangeEvent;
use pocketmine\event\player\PlayerItemHeldEvent;
use pocketmine\event\player\PlayerJoinEvent;
use pocketmine\event\player\PlayerKickEvent;
use pocketmine\event\player\PlayerLoginEvent;
use pocketmine\event\player\PlayerPreLoginEvent;
use pocketmine\event\player\PlayerQuitEvent;
use pocketmine\event\player\PlayerRespawnEvent;
use pocketmine\event\server\DataPacketReceiveEvent;
use pocketmine\event\server\DataPacketSendEvent;
use pocketmine\item\Item; use pocketmine\item\Item;
use pocketmine\level\Level; use pocketmine\level\Level;
use pocketmine\level\Position; use pocketmine\level\Position;
use pocketmine\math\Vector3 as Vector3; use pocketmine\math\Vector3;
use pocketmine\nbt\NBT; use pocketmine\nbt\NBT;
use pocketmine\nbt\tag\Byte; use pocketmine\nbt\tag\Byte;
use pocketmine\nbt\tag\Compound; use pocketmine\nbt\tag\Compound;
@ -638,7 +650,7 @@ class Player extends Human implements CommandSender, IPlayer{
if($this->connected === false){ if($this->connected === false){
return false; return false;
} }
$this->server->getPluginManager()->callEvent($ev = new event\server\DataPacketSendEvent($this, $packet)); $this->server->getPluginManager()->callEvent($ev = new DataPacketSendEvent($this, $packet));
if($ev->isCancelled()){ if($ev->isCancelled()){
return false; return false;
} }
@ -919,7 +931,7 @@ class Player extends Human implements CommandSender, IPlayer{
return false; return false;
} }
} }
$this->server->getPluginManager()->callEvent($ev = new event\player\PlayerAchievementAwardedEvent($this, $achievementId)); $this->server->getPluginManager()->callEvent($ev = new PlayerAchievementAwardedEvent($this, $achievementId));
if(!$ev->isCancelled()){ if(!$ev->isCancelled()){
$this->achievements[$achievementId] = true; $this->achievements[$achievementId] = true;
Achievement::broadcast($this, $achievementId); Achievement::broadcast($this, $achievementId);
@ -953,7 +965,7 @@ class Player extends Human implements CommandSender, IPlayer{
return false; return false;
} }
$this->server->getPluginManager()->callEvent($ev = new event\player\PlayerGameModeChangeEvent($this, (int) $gm)); $this->server->getPluginManager()->callEvent($ev = new PlayerGameModeChangeEvent($this, (int) $gm));
if($ev->isCancelled()){ if($ev->isCancelled()){
return false; return false;
} }
@ -1212,7 +1224,7 @@ class Player extends Human implements CommandSender, IPlayer{
return; return;
} }
$this->server->getPluginManager()->callEvent($ev = new event\server\DataPacketReceiveEvent($this, $packet)); $this->server->getPluginManager()->callEvent($ev = new DataPacketReceiveEvent($this, $packet));
if($ev->isCancelled()){ if($ev->isCancelled()){
return; return;
} }
@ -1280,7 +1292,7 @@ class Player extends Human implements CommandSender, IPlayer{
return; return;
} }
$this->server->getPluginManager()->callEvent($ev = new event\player\PlayerPreLoginEvent($this, "Plugin reason")); $this->server->getPluginManager()->callEvent($ev = new PlayerPreLoginEvent($this, "Plugin reason"));
if($ev->isCancelled()){ if($ev->isCancelled()){
$this->close($ev->getKickMessage(), "Plugin reason"); $this->close($ev->getKickMessage(), "Plugin reason");
@ -1348,7 +1360,7 @@ class Player extends Human implements CommandSender, IPlayer{
$this->slot = $this->hotbar[0]; $this->slot = $this->hotbar[0];
} }
$this->server->getPluginManager()->callEvent($ev = new event\player\PlayerLoginEvent($this, "Plugin reason")); $this->server->getPluginManager()->callEvent($ev = new PlayerLoginEvent($this, "Plugin reason"));
if($ev->isCancelled()){ if($ev->isCancelled()){
$this->close($ev->getKickMessage(), "Plugin reason"); $this->close($ev->getKickMessage(), "Plugin reason");
@ -1392,7 +1404,7 @@ class Player extends Human implements CommandSender, IPlayer{
console("[INFO] " . TextFormat::AQUA . $this->username . TextFormat::RESET . "[/" . $this->ip . ":" . $this->port . "] logged in with entity id " . $this->id . " at (" . $this->level->getName() . ", " . round($this->x, 4) . ", " . round($this->y, 4) . ", " . round($this->z, 4) . ")"); console("[INFO] " . TextFormat::AQUA . $this->username . TextFormat::RESET . "[/" . $this->ip . ":" . $this->port . "] logged in with entity id " . $this->id . " at (" . $this->level->getName() . ", " . round($this->x, 4) . ", " . round($this->y, 4) . ", " . round($this->z, 4) . ")");
$this->server->getPluginManager()->callEvent(new event\player\PlayerJoinEvent($this, $this->username . " joined the game")); $this->server->getPluginManager()->callEvent(new PlayerJoinEvent($this, $this->username . " joined the game"));
break; break;
case ProtocolInfo::READY_PACKET: case ProtocolInfo::READY_PACKET:
@ -1423,7 +1435,7 @@ class Player extends Human implements CommandSender, IPlayer{
$pos = new Position($this->x, $this->y, $this->z, $this->level); $pos = new Position($this->x, $this->y, $this->z, $this->level);
$pos = $this->level->getSafeSpawn($pos); $pos = $this->level->getSafeSpawn($pos);
$this->server->getPluginManager()->callEvent($ev = new event\player\PlayerRespawnEvent($this, $pos)); $this->server->getPluginManager()->callEvent($ev = new PlayerRespawnEvent($this, $pos));
$this->teleport($ev->getRespawnPosition()); $this->teleport($ev->getRespawnPosition());
$this->sendBuffer(); $this->sendBuffer();
@ -1493,7 +1505,7 @@ class Player extends Human implements CommandSender, IPlayer{
if($packet->slot === false){ if($packet->slot === false){
$this->sendInventorySlot($packet->slot); $this->sendInventorySlot($packet->slot);
}else{ }else{
$this->server->getPluginManager()->callEvent($ev = new event\player\PlayerItemHeldEvent($this, $item, $packet->slot, 0)); $this->server->getPluginManager()->callEvent($ev = new PlayerItemHeldEvent($this, $item, $packet->slot, 0));
if($ev->isCancelled()){ if($ev->isCancelled()){
$this->sendInventorySlot($packet->slot); $this->sendInventorySlot($packet->slot);
}elseif($item instanceof Item){ }elseif($item instanceof Item){
@ -1853,7 +1865,7 @@ class Player extends Human implements CommandSender, IPlayer{
$this->craftingItems = array(); $this->craftingItems = array();
$this->toCraft = array(); $this->toCraft = array();
$this->server->getPluginManager()->callEvent($ev = new event\player\PlayerRespawnEvent($this, $this->spawnPosition)); $this->server->getPluginManager()->callEvent($ev = new PlayerRespawnEvent($this, $this->spawnPosition));
$this->teleport($ev->getRespawnPosition()); $this->teleport($ev->getRespawnPosition());
//$this->entity->fire = 0; //$this->entity->fire = 0;
@ -1951,14 +1963,14 @@ class Player extends Human implements CommandSender, IPlayer{
$packet->message = TextFormat::clean($packet->message); $packet->message = TextFormat::clean($packet->message);
if(trim($packet->message) != "" and strlen($packet->message) <= 255){ if(trim($packet->message) != "" and strlen($packet->message) <= 255){
$message = $packet->message; $message = $packet->message;
$this->server->getPluginManager()->callEvent($ev = new event\player\PlayerCommandPreprocessEvent($this, $message)); $this->server->getPluginManager()->callEvent($ev = new PlayerCommandPreprocessEvent($this, $message));
if($ev->isCancelled()){ if($ev->isCancelled()){
break; break;
} }
if(substr($ev->getMessage(), 0, 1) === "/"){ //Command if(substr($ev->getMessage(), 0, 1) === "/"){ //Command
$this->server->dispatchCommand($ev->getPlayer(), substr($ev->getMessage(), 1)); $this->server->dispatchCommand($ev->getPlayer(), substr($ev->getMessage(), 1));
}else{ }else{
$this->server->getPluginManager()->callEvent($ev = new event\player\PlayerChatEvent($this, $ev->getMessage())); $this->server->getPluginManager()->callEvent($ev = new PlayerChatEvent($this, $ev->getMessage()));
if(!$ev->isCancelled()){ if(!$ev->isCancelled()){
$this->server->broadcastMessage(sprintf($ev->getFormat(), $ev->getPlayer()->getDisplayName(), $ev->getMessage()), $ev->getRecipients()); $this->server->broadcastMessage(sprintf($ev->getFormat(), $ev->getPlayer()->getDisplayName(), $ev->getMessage()), $ev->getRecipients());
} }
@ -2218,7 +2230,7 @@ class Player extends Human implements CommandSender, IPlayer{
* @return bool * @return bool
*/ */
public function kick($reason = ""){ public function kick($reason = ""){
$this->server->getPluginManager()->callEvent($ev = new event\player\PlayerKickEvent($this, $reason, "Kicked player " . $this->username . "." . ($reason !== "" ? " With reason: $reason" : ""))); $this->server->getPluginManager()->callEvent($ev = new PlayerKickEvent($this, $reason, "Kicked player " . $this->username . "." . ($reason !== "" ? " With reason: $reason" : "")));
if(!$ev->isCancelled()){ if(!$ev->isCancelled()){
$this->sendMessage("You have been kicked. " . ($reason !== "" ? " Reason: $reason" : "") . "\n"); $this->sendMessage("You have been kicked. " . ($reason !== "" ? " Reason: $reason" : "") . "\n");
$this->close($ev->getQuitMessage(), $reason); $this->close($ev->getQuitMessage(), $reason);
@ -2272,7 +2284,7 @@ class Player extends Human implements CommandSender, IPlayer{
if($this->connected === true){ if($this->connected === true){
unset($this->level->players[$this->CID]); unset($this->level->players[$this->CID]);
if($this->username != ""){ if($this->username != ""){
$this->server->getPluginManager()->callEvent($ev = new event\player\PlayerQuitEvent($this, $message)); $this->server->getPluginManager()->callEvent($ev = new PlayerQuitEvent($this, $message));
if($this->loggedIn === true){ if($this->loggedIn === true){
parent::close(); parent::close();
$this->save(); $this->save();
@ -2351,7 +2363,7 @@ class Player extends Human implements CommandSender, IPlayer{
return false; return false;
} }
$this->server->getPluginManager()->callEvent($ev = new event\server\DataPacketSendEvent($this, $packet)); $this->server->getPluginManager()->callEvent($ev = new DataPacketSendEvent($this, $packet));
if($ev->isCancelled()){ if($ev->isCancelled()){
return array(); return array();
} }

View File

@ -36,14 +36,10 @@ class PlayerAPI{
public function init(){ public function init(){
$this->server->schedule(20 * 15, array($this, "handle"), 1, true, "server.regeneration"); $this->server->schedule(20 * 15, array($this, "handle"), 1, true, "server.regeneration");
$this->server->addHandler("player.death", array($this, "handle"), 1); $this->server->addHandler("player.death", array($this, "handle"), 1);
$this->server->api->console->register("list", "", array($this, "commandHandler"));
$this->server->api->console->register("kill", "<player>", array($this, "commandHandler")); $this->server->api->console->register("kill", "<player>", array($this, "commandHandler"));
$this->server->api->console->register("gamemode", "<mode> [player]", array($this, "commandHandler"));
$this->server->api->console->register("tp", "[target player] <destination player | w:world> OR /tp [target player] <x> <y> <z>", array($this, "commandHandler")); $this->server->api->console->register("tp", "[target player] <destination player | w:world> OR /tp [target player] <x> <y> <z>", array($this, "commandHandler"));
$this->server->api->console->register("spawnpoint", "[player | w:world] [x] [y] [z]", array($this, "commandHandler")); $this->server->api->console->register("spawnpoint", "[player | w:world] [x] [y] [z]", array($this, "commandHandler"));
$this->server->api->console->register("spawn", "", array($this, "commandHandler"));
$this->server->api->console->register("ping", "", array($this, "commandHandler"));
$this->server->api->console->alias("lag", "ping");
$this->server->api->console->alias("suicide", "kill"); $this->server->api->console->alias("suicide", "kill");
$this->server->api->console->alias("tppos", "tp"); $this->server->api->console->alias("tppos", "tp");
$this->server->api->ban->cmdWhitelist("list"); $this->server->api->ban->cmdWhitelist("list");

View File

@ -31,6 +31,7 @@ use pocketmine\command\defaults\GamemodeCommand;
use pocketmine\command\defaults\GiveCommand; use pocketmine\command\defaults\GiveCommand;
use pocketmine\command\defaults\HelpCommand; use pocketmine\command\defaults\HelpCommand;
use pocketmine\command\defaults\KickCommand; use pocketmine\command\defaults\KickCommand;
use pocketmine\command\defaults\KillCommand;
use pocketmine\command\defaults\ListCommand; use pocketmine\command\defaults\ListCommand;
use pocketmine\command\defaults\MeCommand; use pocketmine\command\defaults\MeCommand;
use pocketmine\command\defaults\OpCommand; use pocketmine\command\defaults\OpCommand;
@ -90,6 +91,7 @@ class SimpleCommandMap implements CommandMap{
$this->register("pocketmine", new SaveCommand("save-all")); $this->register("pocketmine", new SaveCommand("save-all"));
$this->register("pocketmine", new GiveCommand("give")); $this->register("pocketmine", new GiveCommand("give"));
$this->register("pocketmine", new GamemodeCommand("gamemode")); $this->register("pocketmine", new GamemodeCommand("gamemode"));
$this->register("pocketmine", new KillCommand("kill"));
} }

View File

@ -0,0 +1,60 @@
<?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/
*
*
*/
namespace pocketmine\command\defaults;
use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\Player;
use pocketmine\Server;
use pocketmine\utils\TextFormat;
class KillCommand extends VanillaCommand{
public function __construct($name){
parent::__construct(
$name,
"Commits suicide, only usable as a player",
"/kill",
["suicide"]
);
$this->setPermission("pocketmine.command.kill");
}
public function execute(CommandSender $sender, $currentAlias, array $args){
if(!$this->testPermission($sender)){
return true;
}
if($sender instanceof Player){
//TODO: EntityDamageEvent
//$ev->setLastDamageCause()
$sender->setHealth(0);
//TODO: set update
$sender->sendMessage("Ouch. That look like it hurt.");
}else{
$sender->sendMessage(TextFormat::RED . "You can only perform this command as a player");
}
return true;
}
}

View File

@ -92,6 +92,10 @@ abstract class Entity extends Position{
public $width; public $width;
public $length; public $length;
/** @var int */
private $health = 20;
private $maxHealth = 20;
public $fallDistance; public $fallDistance;
public $ticksLived; public $ticksLived;
public $lastUpdate; public $lastUpdate;
@ -184,6 +188,44 @@ abstract class Entity extends Position{
abstract function heal($amount, $source = "generic"); abstract function heal($amount, $source = "generic");
/**
* @return int
*/
public function getHealth(){
return $this->health;
}
/**
* Sets the health of the Entity. This won't send any update to the players
*
* @param int $amount
*/
public function setHealth($amount){
if($amount < 0){
$this->health = 0;
$this->dead = true;
}elseif($amount > $this->getMaxHealth()){
$this->health = $this->getMaxHealth();
}else{
$this->health = (int) $amount;
}
}
/**
* @return int
*/
public function getMaxHealth(){
return $this->maxHealth;
}
/**
* @param int $amount
*/
public function setMaxHealth($amount){
$this->maxHealth = (int) $amount;
$this->health = (int) min($this->health, $this->maxHealth);
}
public function onUpdate(){ public function onUpdate(){
if($this->closed !== false){ if($this->closed !== false){
return false; return false;