New VIEW gamemode

This commit is contained in:
Shoghi Cervantes Pueyo 2013-04-18 16:40:30 +02:00
parent 5848d283da
commit 3577667039
10 changed files with 58 additions and 32 deletions

View File

@ -256,7 +256,7 @@ class BlockAPI{
}
if($player instanceof Player){
if($player->gamemode === CREATIVE){
if(($player->gamemode & 0x01) === 0x01){
$output .= "Player is in creative mode.\n";
break;
}
@ -283,6 +283,9 @@ class BlockAPI{
"block" => $block->getID(),
"meta" => $block->getMetadata()
));
if($player->itemEnforcement === true){
$player->sendInventory();
}
return false;
}
@ -295,7 +298,7 @@ class BlockAPI{
return $this->cancelAction($target, $player);
}
if((!$target->isBreakable($item, $player) and $this->server->api->dhandle("player.block.break.invalid", array("player" => $player, "target" => $target, "item" => $item)) !== true) or $player->gamemode === ADVENTURE or ($player->lastBreak + $target->getBreakTime($item, $player)) >= microtime(true)){
if((!$target->isBreakable($item, $player) and $this->server->api->dhandle("player.block.break.invalid", array("player" => $player, "target" => $target, "item" => $item)) !== true) or ($player->gamemode & 0x02) === 0x02 or ($player->lastBreak + $target->getBreakTime($item, $player)) >= microtime(true)){
return $this->cancelAction($target, $player);
}
@ -309,7 +312,7 @@ class BlockAPI{
}
if($player->gamemode !== CREATIVE and count($drops) > 0){
if(($player->gamemode & 0x01) === 0x00 and count($drops) > 0){
foreach($drops as $drop){
$this->drop($target, BlockAPI::getItem($drop[0] & 0xFFFF, $drop[1] & 0xFFFF, $drop[2] & 0xFF));
}
@ -366,7 +369,7 @@ class BlockAPI{
}
}
if($player->gamemode === ADVENTURE){ //Adventure mode!!
if(($player->gamemode & 0x02) === 0x02){ //Adventure mode!!
return $this->cancelAction($block, $player);
}
@ -402,7 +405,7 @@ class BlockAPI{
$t->data["creator"] = $player->username;
}
if($player->gamemode !== CREATIVE){
if(($player->gamemode & 0x01) === 0x00){
$player->removeItem($item->getID(), $item->getMetadata(), 1);
}

View File

@ -132,7 +132,12 @@ class PlayerAPI{
"c" => CREATIVE,
"2" => ADVENTURE,
"adventure" => ADVENTURE,
"a" => ADVENTURE,
"a" => ADVENTURE,
"3" => VIEW,
"view" => VIEW,
"viewer" => VIEW,
"spectator" => VIEW,
"v" => VIEW,
);
if($issuer instanceof Player){
$player = $issuer;
@ -328,7 +333,7 @@ class PlayerAPI{
console("[NOTICE] Player data not found for \"".$iname."\", creating new profile");
$data->save();
}
if($this->server->gamemode === CREATIVE){
if(($this->server->gamemode & 0x01) === 0x01){
$data->set("health", 20);
}
$this->server->handle("player.offline.get", $data);

View File

@ -275,7 +275,7 @@ class Player{
public function sendInventorySlot($s){
$s = (int) $s;
if(!isset($this->inventory[$s]) or ($this->itemEnforcement === false and $this->gamemode !== CREATIVE)){
if(!isset($this->inventory[$s]) or $this->itemEnforcement === false){
return false;
}
@ -346,7 +346,7 @@ class Player{
if($data["eid"] === $this->eid){
$data["eid"] = 0;
$this->dataPacket(MC_TAKE_ITEM_ENTITY, $data);
if(($this->gamemode === SURVIVAL or $this->gamemode === ADVENTURE)){
if(($this->gamemode & 0x01) === 0x00){
$this->addItem($data["entity"]->type, $data["entity"]->meta, $data["entity"]->stack);
}
}else{
@ -491,8 +491,8 @@ class Player{
0x80000000 ?
*/
$flags = 0;
if($this->gamemode === ADVENTURE){
$flags |= 0x01; //Not allow placing/breaking blocks
if(($this->gamemode & 0x02) === 0x02){
$flags |= 0x01; //Not allow placing/breaking blocks, adventure mode
}
if($nametags !== false){
@ -542,17 +542,26 @@ class Player{
return "creative";
case ADVENTURE:
return "adventure";
case VIEW:
return "view";
}
}
public function setGamemode($gm){
if($gm < 0 or $gm > 2 or $this->gamemode === $gm){
if($gm < 0 or $gm > 3 or $this->gamemode === $gm){
return false;
}
if(($this->gamemode === SURVIVAL and $gm === ADVENTURE) or ($this->gamemode === ADVENTURE and $gm === SURVIVAL)){
if(($this->gamemode & 0x01) === ($gm & 0x01)){
$this->gamemode = $gm;
$this->sendSettings();
if(($this->gamemode & 0x01) === 0x01 and ($this->gamemode & 0x02) === 0x02){
$this->inventory = array();
foreach(BlockAPI::$creative as $item){
$this->inventory[] = array(AIR, 0, 0);
}
$this->sendInventory();
}
$this->eventHandler("Your gamemode has been changed to ".$this->getGamemode().".", "server.chat");
}else{
$this->blocked = true;
@ -741,12 +750,18 @@ class Player{
}
$this->auth = true;
if(!$this->data->exists("inventory") or $this->gamemode === CREATIVE){
if($this->gamemode === CREATIVE){
if(!$this->data->exists("inventory") or ($this->gamemode & 0x01) === 0x01){
if(($this->gamemode & 0x01) === 0x01){
$this->itemEnforcement = true;
$this->inventory = array();
foreach(BlockAPI::$creative as $item){
$this->inventory[] = array($item[0], $item[1], 1);
if(($this->gamemode & 0x02) === 0x02){
foreach(BlockAPI::$creative as $item){
$this->inventory[] = array(AIR, 0, 0);
}
}else{
foreach(BlockAPI::$creative as $item){
$this->inventory[] = array($item[0], $item[1], 1);
}
}
}
$this->data->set("inventory", $this->inventory);
@ -773,8 +788,8 @@ class Player{
"gamemode" => $this->gamemode,
"eid" => 0,
));
if($this->gamemode === CREATIVE){
$this->equipment = BlockAPI::getItem(STONE);
if(($this->gamemode & 0x01) === 0x01){
$this->equipment = BlockAPI::getItem($this->inventory[7][0], $this->inventory[7][1], $this->inventory[7][2]);
}
$this->entity = $this->server->api->entity->add(ENTITY_PLAYER, 0, array("player" => $this));
$this->eid = $this->entity->eid;
@ -844,7 +859,7 @@ class Player{
if(($this->entity instanceof Entity) and $data["counter"] > $this->lastMovement){
$this->lastMovement = $data["counter"];
$speed = $this->entity->getSpeed();
if($this->blocked === true or ($speed > 5 and $this->gamemode !== CREATIVE) or $speed > 13 or $this->server->api->handle("player.move", $this->entity) === false){
if($this->blocked === true or ($speed > 5 and ($this->gamemode & 0x01) === 0x00) or $speed > 13 or $this->server->api->handle("player.move", $this->entity) === false){
if($this->lastCorrect instanceof Vector3){
$this->teleport($this->lastCorrect, $this->entity->yaw, $this->entity->pitch, false);
}
@ -908,7 +923,7 @@ class Player{
$data["entity"] = $this->entity;
if(!($target instanceof Entity)){
break;
}elseif($target->class === ENTITY_PLAYER and ($this->server->api->getProperty("pvp") == false or $this->server->difficulty <= 0 or $target->player->gamemode === CREATIVE)){
}elseif($target->class === ENTITY_PLAYER and ($this->server->api->getProperty("pvp") == false or $this->server->difficulty <= 0 or ($target->player->gamemode & 0x01) === 0x01)){
break;
}elseif($this->handle("player.interact", $data) !== false){
switch($this->equipment->getID()){
@ -1000,7 +1015,7 @@ class Player{
if($this->spawned === false){
break;
}
if($this->gamemode === CREATIVE){
if(($this->gamemode & 0x01) === 0x01){
break;
}
//$this->entity->setHealth($data["health"], "client");

View File

@ -291,6 +291,8 @@ class PocketMinecraftServer{
return "creative";
case ADVENTURE:
return "adventure";
case VIEW:
return "view";
}
}
@ -515,7 +517,7 @@ class PocketMinecraftServer{
$data[0],
$this->serverID,
RAKNET_MAGIC,
$this->serverType. $this->name . " [".($this->gamemode === CREATIVE ? "C":($this->gamemode === ADVENTURE ? "A":"S")).($this->whitelist !== false ? "W":"")." ".count($this->clients)."/".$this->maxClients."] ".$txt,
$this->serverType. $this->name . " [".count($this->clients)."/".$this->maxClients."] ".$txt,
), false, $packet["ip"], $packet["port"]);
$this->custom["times_".$CID] = ($this->custom["times_".$CID] + 1) % strlen($this->description);
break;

View File

@ -28,4 +28,5 @@ the Free Software Foundation, either version 3 of the License, or
//Gamemodes
define("SURVIVAL", 0);
define("CREATIVE", 1);
define("ADVENTURE", 2);
define("ADVENTURE", 2);
define("VIEW", 3);

View File

@ -191,7 +191,7 @@ abstract class Block extends Vector3{
}
public function getBreakTime(Item $item, Player $player){
if($player->gamemode === CREATIVE){
if(($player->gamemode & 0x01) === 0x01){
return 0.25;
}
return $this->breakTime;

View File

@ -32,7 +32,7 @@ class BedrockBlock extends SolidBlock{
}
public function isBreakable(Item $item, Player $player){
if($player->gamemode === CREATIVE){
if(($player->gamemode & 0x01) === 0x01){
return true;
}
return false;

View File

@ -60,7 +60,7 @@ class PaintingItem extends Item{
$server = ServerAPI::request();
$e = $server->api->entity->add(ENTITY_OBJECT, OBJECT_PAINTING, $data);
$server->api->entity->spawnToAll($e->eid);
if($player->gamemode !== CREATIVE){
if(($player->gamemode & 0x01) === 0x00){
$player->removeItem($this->getID(), $this->getMetadata(), 1);
}
return true;

View File

@ -194,7 +194,7 @@ class Entity extends stdClass{
}else{
return false;
}
if(($player instanceof Player) and ($player->gamemode === SURVIVAL or $player->gamemode === ADVENTURE) and $player->spawned === true){
if(($player instanceof Player) and ($player->gamemode & 0x01) === 0x00 and $player->spawned === true){
if($this->server->api->dhandle("player.pickup", array(
"eid" => $player->eid,
"player" => $player,
@ -346,7 +346,7 @@ class Entity extends stdClass{
//$this->server->api->handle("entity.motion", $this);
}
}elseif($this->class === ENTITY_PLAYER){
if($support === false and $this->player->gamemode !== CREATIVE){
if($support === false and ($this->player->gamemode & 0x01) === 0x00){
if($this->fallY === false or $this->fallStart === false){
$this->fallY = $y;
$this->fallStart = microtime(true);
@ -375,7 +375,7 @@ class Entity extends stdClass{
if($this->class === ENTITY_PLAYER){
$this->calculateVelocity();
if($this->speed <= 5 or ($this->speed <= 12 and $this->gamemode === CREATIVE)){
if($this->speed <= 5 or ($this->speed <= 12 and ($player->gamemode & 0x01) === 0x01)){
$this->player->lastCorrect = new Vector3($this->last[0], $this->last[1], $this->last[2]);
}
}
@ -634,7 +634,7 @@ class Entity extends stdClass{
if($health < $this->health){
$harm = true;
$dmg = $this->health - $health;
if(($this->class !== ENTITY_PLAYER or (($this->player instanceof Player) and ($this->player->gamemode === SURVIVAL or $this->player->gamemode === ADVENTURE or $force === true))) and ($this->dmgcounter[0] < microtime(true) or $this->dmgcounter[1] < $dmg) and !$this->dead){
if(($this->class !== ENTITY_PLAYER or (($this->player instanceof Player) and (($this->player->gamemode & 0x01) === 0x00 or $force === true))) and ($this->dmgcounter[0] < microtime(true) or $this->dmgcounter[1] < $dmg) and !$this->dead){
$this->dmgcounter[0] = microtime(true) + 0.5;
$this->dmgcounter[1] = $dmg;
}else{

View File

@ -344,7 +344,7 @@ class WorldGenerator{
$level = array(
"LevelName" => $name,
"Time" => 0,
"Gamemode" => 1,
"Gamemode" => CREATIVE,
"RandomSeed" => $this->seed,
"Generator" => $this->genName,
"SpawnX" => $s[0],