mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-06-07 12:18:46 +00:00
Updated player deaths
This commit is contained in:
parent
d9c39ca816
commit
4a46fde483
1
TODO
1
TODO
@ -4,3 +4,4 @@
|
|||||||
- Fix metadata orientation
|
- Fix metadata orientation
|
||||||
- Proper session checks
|
- Proper session checks
|
||||||
- Fix incorrect timeout
|
- Fix incorrect timeout
|
||||||
|
- Inventory loading and saving
|
@ -53,6 +53,18 @@ class EntityAPI{
|
|||||||
return $this->server->entities;
|
return $this->server->entities;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function heal($eid, $heal = 1, $cause){
|
||||||
|
$this->harm($eid, -$heal, $cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function harm($eid, $attack = 1, $cause){
|
||||||
|
$e = $this->get($eid);
|
||||||
|
if($e === false or $e->dead === true){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$e->setHealth($e->getHealth()-$attack, $cause);
|
||||||
|
}
|
||||||
|
|
||||||
public function add($class, $type = 0, $data = array()){
|
public function add($class, $type = 0, $data = array()){
|
||||||
$eid = $this->server->eidCnt++;
|
$eid = $this->server->eidCnt++;
|
||||||
$this->server->entities[$eid] = new Entity($this->server, $eid, $class, $type, $data);
|
$this->server->entities[$eid] = new Entity($this->server, $eid, $class, $type, $data);
|
||||||
|
@ -29,6 +29,7 @@ class PlayerAPI{
|
|||||||
private $server;
|
private $server;
|
||||||
function __construct($server){
|
function __construct($server){
|
||||||
$this->server = $server;
|
$this->server = $server;
|
||||||
|
$this->server->event("onHealthRegeneration", array($this, "handle"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function init(){
|
public function init(){
|
||||||
@ -38,6 +39,19 @@ class PlayerAPI{
|
|||||||
$this->server->api->console->register("tp", "Teleports a player to another player", array($this, "commandHandler"));
|
$this->server->api->console->register("tp", "Teleports a player to another player", array($this, "commandHandler"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function handle($data, $event){
|
||||||
|
switch($event){
|
||||||
|
case "onHealthRegeneration":
|
||||||
|
$result = $this->server->query("SELECT ip,port FROM players WHERE EID = (SELECT EID FROM entities WHERE health < 20);", true);
|
||||||
|
if($result !== true and $result !== false){
|
||||||
|
while($player = $result->fetchArray()){
|
||||||
|
$player->entity->setHealth(min(20, $player->entity->getHealth() + $data), "regeneration");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public function commandHandler($cmd, $params){
|
public function commandHandler($cmd, $params){
|
||||||
switch($cmd){
|
switch($cmd){
|
||||||
case "tp":
|
case "tp":
|
||||||
@ -71,7 +85,7 @@ class PlayerAPI{
|
|||||||
case "kill":
|
case "kill":
|
||||||
$player = $this->get(implode(" ", $params));
|
$player = $this->get(implode(" ", $params));
|
||||||
if($player !== false){
|
if($player !== false){
|
||||||
$this->server->trigger("onHealthChange", array("eid" => $player->eid, "health" => -1, "cause" => "console"));
|
$this->server->api->entity->harm($player->eid, 20, "console");
|
||||||
}else{
|
}else{
|
||||||
console("[INFO] Usage: /kill <player>");
|
console("[INFO] Usage: /kill <player>");
|
||||||
}
|
}
|
||||||
|
@ -27,8 +27,8 @@ the Free Software Foundation, either version 3 of the License, or
|
|||||||
|
|
||||||
class ChunkParser{
|
class ChunkParser{
|
||||||
private $location, $raw = b"", $file;
|
private $location, $raw = b"", $file;
|
||||||
var $sectorLenght = 4096; //16 * 16 * 16
|
var $sectorLength = 4096; //16 * 16 * 16
|
||||||
var $chunkLenght = 86016; //21 * $sectorLenght
|
var $chunkLength = 86016; //21 * $sectorLength
|
||||||
var $map;
|
var $map;
|
||||||
|
|
||||||
function __construct(){
|
function __construct(){
|
||||||
@ -64,7 +64,7 @@ class ChunkParser{
|
|||||||
}
|
}
|
||||||
$this->file = $file;
|
$this->file = $file;
|
||||||
$this->raw = file_get_contents($file);
|
$this->raw = file_get_contents($file);
|
||||||
$this->chunkLenght = $this->sectorLenght * ord($this->raw{0});
|
$this->chunkLength = $this->sectorLength * ord($this->raw{0});
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,7 +80,7 @@ class ChunkParser{
|
|||||||
public function getChunk($X, $Z){
|
public function getChunk($X, $Z){
|
||||||
$X = (int) $X;
|
$X = (int) $X;
|
||||||
$Z = (int) $Z;
|
$Z = (int) $Z;
|
||||||
return substr($this->raw, $this->getOffset($X, $Z), $this->chunkLenght);
|
return substr($this->raw, $this->getOffset($X, $Z), $this->chunkLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function writeChunk($X, $Z){
|
public function writeChunk($X, $Z){
|
||||||
@ -169,7 +169,7 @@ class ChunkParser{
|
|||||||
foreach($this->map as $x => $d){
|
foreach($this->map as $x => $d){
|
||||||
foreach($d as $z => $chunk){
|
foreach($d as $z => $chunk){
|
||||||
fseek($fp, $this->getOffset($x, $z));
|
fseek($fp, $this->getOffset($x, $z));
|
||||||
fwrite($fp, $this->writeChunk($x, $z), $this->chunkLenght);
|
fwrite($fp, $this->writeChunk($x, $z), $this->chunkLength);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
flock($fp, LOCK_UN);
|
flock($fp, LOCK_UN);
|
||||||
|
@ -183,9 +183,23 @@ class Entity extends stdClass{
|
|||||||
return !isset($this->position) ? false:($round === true ? array_map("floor", $this->position):$this->position);
|
return !isset($this->position) ? false:($round === true ? array_map("floor", $this->position):$this->position);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setHealth($health){
|
public function setHealth($health, $cause = ""){
|
||||||
$this->health = (int) $health;
|
$this->health = (int) $health;
|
||||||
$this->server->query("UPDATE entities SET health = ".$this->health." WHERE EID = ".$this->eid.";");
|
$this->server->query("UPDATE entities SET health = ".$this->health." WHERE EID = ".$this->eid.";");
|
||||||
|
$this->server->trigger("onHealthChange", array("eid" => $this->eid, "health" => $health, "cause" => $cause));
|
||||||
|
if($this->player !== false){
|
||||||
|
$this->player->dataPacket(MC_SET_HEALTH, array(
|
||||||
|
"health" => $this->health,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
if($this->health <= 0){
|
||||||
|
$this->dead = true;
|
||||||
|
if($this->player !== false){
|
||||||
|
$this->server->trigger("onPlayerDeath", array("name" => $this->name, "cause" => $cause));
|
||||||
|
}
|
||||||
|
}elseif($this->health > 0){
|
||||||
|
$this->dead = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getHealth(){
|
public function getHealth(){
|
||||||
|
@ -91,7 +91,7 @@ class PocketMinecraftServer extends stdClass{
|
|||||||
$this->event("onHealthChange", "eventHandler", true);
|
$this->event("onHealthChange", "eventHandler", true);
|
||||||
|
|
||||||
$this->action(500000, '$this->time += (int) ($this->timePerSecond / 2);$this->trigger("onTimeChange", $this->time);');
|
$this->action(500000, '$this->time += (int) ($this->timePerSecond / 2);$this->trigger("onTimeChange", $this->time);');
|
||||||
$this->action(5000000, '$this->trigger("onHealthRegeneration", 1);');
|
$this->action(5000000, 'if($this->difficulty < 2){$this->trigger("onHealthRegeneration", 1);}');
|
||||||
$this->action(1000000 * 60, '$this->reloadConfig();');
|
$this->action(1000000 * 60, '$this->reloadConfig();');
|
||||||
$this->action(1000000 * 60 * 10, '$this->custom = array();');
|
$this->action(1000000 * 60 * 10, '$this->custom = array();');
|
||||||
if($this->api !== false){
|
if($this->api !== false){
|
||||||
@ -167,7 +167,7 @@ class PocketMinecraftServer extends stdClass{
|
|||||||
$message = "<".$owner."> ";
|
$message = "<".$owner."> ";
|
||||||
}
|
}
|
||||||
$message .= $text;
|
$message .= $text;
|
||||||
$this->trigger("onChat", $text);
|
$this->trigger("onChat", $message);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setType($type = "normal"){
|
public function setType($type = "normal"){
|
||||||
@ -212,9 +212,10 @@ class PocketMinecraftServer extends stdClass{
|
|||||||
case "onPlayerDeath":
|
case "onPlayerDeath":
|
||||||
$message = $data["name"];
|
$message = $data["name"];
|
||||||
if(is_numeric($data["cause"]) and isset($this->entities[$data["cause"]])){
|
if(is_numeric($data["cause"]) and isset($this->entities[$data["cause"]])){
|
||||||
switch($this->entities[$data["cause"]]->class){
|
$e = $this->api->entity->get($data["cause"]);
|
||||||
|
switch($e->class){
|
||||||
case ENTITY_PLAYER:
|
case ENTITY_PLAYER:
|
||||||
$message .= " was killed by ".$this->entities[$data["cause"]]->name;
|
$message .= " was killed by ".$e->name;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
$message .= " was killed";
|
$message .= " was killed";
|
||||||
@ -229,11 +230,6 @@ class PocketMinecraftServer extends stdClass{
|
|||||||
}
|
}
|
||||||
$this->chat(false, $message);
|
$this->chat(false, $message);
|
||||||
break;
|
break;
|
||||||
case "onHealthChange":
|
|
||||||
if($data["health"] <= 0){
|
|
||||||
$this->trigger("onDeath", array("eid" => $data["eid"], "cause" => $data["cause"]));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case "onPlayerAdd":
|
case "onPlayerAdd":
|
||||||
console("[DEBUG] Player \"".$data["username"]."\" EID ".$data["eid"]." spawned at X ".$data["x"]." Y ".$data["y"]." Z ".$data["z"], true, true, 2);
|
console("[DEBUG] Player \"".$data["username"]."\" EID ".$data["eid"]." spawned at X ".$data["x"]." Y ".$data["y"]." Z ".$data["z"], true, true, 2);
|
||||||
break;
|
break;
|
||||||
@ -426,7 +422,6 @@ class PocketMinecraftServer extends stdClass{
|
|||||||
while($evn = $events->fetchArray(SQLITE3_ASSOC)){
|
while($evn = $events->fetchArray(SQLITE3_ASSOC)){
|
||||||
$evid = (int) $evn["ID"];
|
$evid = (int) $evn["ID"];
|
||||||
$this->responses[$evid] = call_user_func($this->events[$evid], $data, $event, $this);
|
$this->responses[$evid] = call_user_func($this->events[$evid], $data, $event, $this);
|
||||||
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -112,11 +112,6 @@ class Session{
|
|||||||
|
|
||||||
public function eventHandler($data, $event){
|
public function eventHandler($data, $event){
|
||||||
switch($event){
|
switch($event){
|
||||||
case "onDeath":
|
|
||||||
if($data["eid"] === $this->eid){
|
|
||||||
$this->server->trigger("onPlayerDeath", array("name" => $this->username, "cause" => $data["cause"]));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case "onBlockUpdate":
|
case "onBlockUpdate":
|
||||||
$this->dataPacket(MC_UPDATE_BLOCK, $data);
|
$this->dataPacket(MC_UPDATE_BLOCK, $data);
|
||||||
break;
|
break;
|
||||||
@ -147,22 +142,6 @@ class Session{
|
|||||||
"pitch" => $entity->pitch,
|
"pitch" => $entity->pitch,
|
||||||
));
|
));
|
||||||
break;
|
break;
|
||||||
case "onHealthRegeneration":
|
|
||||||
if($this->server->difficulty < 2){
|
|
||||||
$this->server->trigger("onHealthChange", array("eid" => $this->eid, "health" => min(20, $this->data["health"] + $data), "cause" => "regeneration"));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case "onHealthChange":
|
|
||||||
if($data["eid"] === $this->eid){
|
|
||||||
$this->dataPacket(MC_SET_HEALTH, array(
|
|
||||||
"health" => $data["health"],
|
|
||||||
));
|
|
||||||
$this->data["health"] = $data["health"];
|
|
||||||
/*if(is_object($this->entity)){
|
|
||||||
$this->entity->setHealth($data["health"]);
|
|
||||||
}*/
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case "onEntityRemove":
|
case "onEntityRemove":
|
||||||
if($data === $this->eid){
|
if($data === $this->eid){
|
||||||
break;
|
break;
|
||||||
@ -296,11 +275,8 @@ class Session{
|
|||||||
$this->server->api->entity->spawnToAll($this->eid);
|
$this->server->api->entity->spawnToAll($this->eid);
|
||||||
$this->evid[] = $this->server->event("onTimeChange", array($this, "eventHandler"));
|
$this->evid[] = $this->server->event("onTimeChange", array($this, "eventHandler"));
|
||||||
$this->evid[] = $this->server->event("onChat", array($this, "eventHandler"));
|
$this->evid[] = $this->server->event("onChat", array($this, "eventHandler"));
|
||||||
$this->evid[] = $this->server->event("onDeath", array($this, "eventHandler"));
|
|
||||||
$this->evid[] = $this->server->event("onEntityRemove", array($this, "eventHandler"));
|
$this->evid[] = $this->server->event("onEntityRemove", array($this, "eventHandler"));
|
||||||
$this->evid[] = $this->server->event("onEntityMove", array($this, "eventHandler"));
|
$this->evid[] = $this->server->event("onEntityMove", array($this, "eventHandler"));
|
||||||
$this->evid[] = $this->server->event("onHealthChange", array($this, "eventHandler"));
|
|
||||||
$this->evid[] = $this->server->event("onHealthRegeneration", array($this, "eventHandler"));
|
|
||||||
$this->evid[] = $this->server->event("onAnimate", array($this, "eventHandler"));
|
$this->evid[] = $this->server->event("onAnimate", array($this, "eventHandler"));
|
||||||
$this->evid[] = $this->server->event("onTeleport", array($this, "eventHandler"));
|
$this->evid[] = $this->server->event("onTeleport", array($this, "eventHandler"));
|
||||||
$this->evid[] = $this->server->event("onBlockUpdate", array($this, "eventHandler"));
|
$this->evid[] = $this->server->event("onBlockUpdate", array($this, "eventHandler"));
|
||||||
@ -354,8 +330,8 @@ class Session{
|
|||||||
$this->server->trigger("onAnimate", array("eid" => $this->eid, "action" => $data["action"]));
|
$this->server->trigger("onAnimate", array("eid" => $this->eid, "action" => $data["action"]));
|
||||||
break;
|
break;
|
||||||
case MC_RESPAWN:
|
case MC_RESPAWN:
|
||||||
$this->server->trigger("onHealthChange", array("eid" => $this->eid, "health" => 20, "cause" => "respawn"));
|
$this->entity->setHealth(20, "respawn");
|
||||||
$this->entity->setPosition($data["x"], $data["y"], $data["z"], $data["x"], 0, 0);
|
$this->entity->setPosition($data["x"], $data["y"], $data["z"], 0, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user