From a74efd51781c7eb71ed34d4c2735ad6ee0e04b29 Mon Sep 17 00:00:00 2001 From: xXNiceYT <23722462+xXNiceYT@users.noreply.github.com> Date: Wed, 4 Aug 2021 10:23:46 -0400 Subject: [PATCH 1/5] Fixed /p biome & teleportation issue --- src/MyPlot/MyPlot.php | 8 ++++++-- src/MyPlot/provider/JSONDataProvider.php | 12 ++++++++++++ src/MyPlot/provider/MySQLProvider.php | 2 ++ src/MyPlot/provider/SQLiteDataProvider.php | 4 +++- src/MyPlot/provider/YAMLDataProvider.php | 16 +++++++++++++++- src/MyPlot/subcommand/BiomeSubCommand.php | 2 +- src/MyPlot/subcommand/GiveSubCommand.php | 2 +- 7 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/MyPlot/MyPlot.php b/src/MyPlot/MyPlot.php index a845c65f..98db44d3 100644 --- a/src/MyPlot/MyPlot.php +++ b/src/MyPlot/MyPlot.php @@ -601,8 +601,12 @@ public function teleportPlayerToPlot(Player $player, Plot $plot, bool $center = $pos->z -= 1; $world = Server::getInstance()->getWorldManager()->getWorldByName($plot->levelName); if($world->getOrLoadChunkAtPosition($pos) === null) { - $world->orderChunkPopulation($pos->getFloorX() >> 4, $pos->getFloorZ() >> 4, null); + $world->orderChunkPopulation($pos->getFloorX() >> 4, $pos->getFloorZ() >> 4, null)->onCompletion(function ()use($player, $pos): void{ + if($player->isOnline()) $player->teleport($pos); + }, function (): void{}); + return true; } + return $player->teleport($pos); } @@ -1000,7 +1004,7 @@ public function setPlotBiome(Plot $plot, Biome $biome) : bool { } } } - $world->setChunk($coords[0], $coords[1], $chunk, false); + $world->setChunk((int)$coords[0], (int)$coords[1], $chunk, false); } return !$failed; } diff --git a/src/MyPlot/provider/JSONDataProvider.php b/src/MyPlot/provider/JSONDataProvider.php index abfa8ce9..5425bf63 100644 --- a/src/MyPlot/provider/JSONDataProvider.php +++ b/src/MyPlot/provider/JSONDataProvider.php @@ -23,6 +23,18 @@ public function __construct(MyPlot $plugin, int $cacheSize = 0) { parent::__construct($plugin, $cacheSize); @mkdir($this->plugin->getDataFolder() . "Data"); $this->json = new Config($this->plugin->getDataFolder() . "Data" . DIRECTORY_SEPARATOR . "plots.yml", Config::JSON, ["count" => -1, "plots" => []]); + + foreach($this->json->get("plots", []) as $key => $plot){ + $biome = $plot["biome"]; + + if($biome === "SWAMP"){ + $plot["biome"] = "SWAMPLAND"; + }elseif($biome === "MOUNTAINS"){ + $plot["biome"] = "EXTREME_HILLS"; + } + $this->json->setNested("plots.$key", $plot); + $this->json->save(); + } } public function savePlot(Plot $plot) : bool { diff --git a/src/MyPlot/provider/MySQLProvider.php b/src/MyPlot/provider/MySQLProvider.php index 7bca088a..75d8fb2e 100644 --- a/src/MyPlot/provider/MySQLProvider.php +++ b/src/MyPlot/provider/MySQLProvider.php @@ -67,6 +67,8 @@ public function __construct(MyPlot $plugin, int $cacheSize = 0, array $settings $this->db->query("ALTER TABLE plots ADD COLUMN price FLOAT AFTER pvp;"); }catch(\Exception $e) {} $this->prepare(); + $this->db->query("UPDATE plots SET biome = 'SWAMPLAND' WHERE biome = 'SWAMP';"); + $this->db->query("UPDATE plots SET biome = 'EXTREME_HILLS' WHERE biome = 'MOUNTAINS';"); $this->plugin->getLogger()->debug("MySQL data provider registered"); } diff --git a/src/MyPlot/provider/SQLiteDataProvider.php b/src/MyPlot/provider/SQLiteDataProvider.php index 92670958..a298f129 100644 --- a/src/MyPlot/provider/SQLiteDataProvider.php +++ b/src/MyPlot/provider/SQLiteDataProvider.php @@ -120,7 +120,9 @@ public function __construct(MyPlot $plugin, int $cacheSize = 0) { if($stmt === false) throw new \Exception(); $this->sqlGetMergedPlots = $stmt; - $this->plugin->getLogger()->debug("SQLite data provider registered"); + $this->db->exec("UPDATE plots SET biome = 'SWAMPLAND' WHERE biome = 'SWAMP';"); + $this->db->exec("UPDATE plots SET biome = 'EXTREME_HILLS' WHERE biome = 'MOUNTAINS';"); + $this->plugin->getLogger()->debug("SQLite data provider registered"); } public function savePlot(Plot $plot) : bool { diff --git a/src/MyPlot/provider/YAMLDataProvider.php b/src/MyPlot/provider/YAMLDataProvider.php index 5799b5cf..f37031a4 100644 --- a/src/MyPlot/provider/YAMLDataProvider.php +++ b/src/MyPlot/provider/YAMLDataProvider.php @@ -23,6 +23,18 @@ public function __construct(MyPlot $plugin, int $cacheSize = 0) { parent::__construct($plugin, $cacheSize); @mkdir($this->plugin->getDataFolder() . "Data"); $this->yaml = new Config($this->plugin->getDataFolder() . "Data" . DIRECTORY_SEPARATOR . "plots.yml", Config::YAML, ["count" => -1, "plots" => []]); + + foreach($this->yaml->get("plots", []) as $key => $plot){ + $biome = $plot["biome"]; + + if($biome === "SWAMP"){ + $plot["biome"] = "SWAMPLAND"; + }elseif($biome === "MOUNTAINS"){ + $plot["biome"] = "EXTREME_HILLS"; + } + $this->yaml->setNested("plots.$key", $plot); + $this->yaml->save(); + } } public function savePlot(Plot $plot) : bool { @@ -52,7 +64,7 @@ public function deletePlot(Plot $plot) : bool { } public function getPlot(string $levelName, int $X, int $Z) : Plot { - if(($plot = $this->getPlotFromCache($levelName, $X, $Z)) !== null) { + if(($plot = $this->getPlotFromCache($levelName, $X, $Z)) !== null) { return $plot; } $plots = $this->yaml->get("plots", []); @@ -231,6 +243,8 @@ public function getMergeOrigin(Plot $plot) : Plot { if(isset($allMerges[$plot->id])) return $plot; $originId = array_search($plot->id, $allMerges); + if($originId === false) + return $plot; $plotDatums = $this->yaml->get("plots", []); if(isset($plotDatums[$originId])) { $levelName = $plotDatums[$originId]["level"]; diff --git a/src/MyPlot/subcommand/BiomeSubCommand.php b/src/MyPlot/subcommand/BiomeSubCommand.php index 7e09dd27..d5b4b23f 100644 --- a/src/MyPlot/subcommand/BiomeSubCommand.php +++ b/src/MyPlot/subcommand/BiomeSubCommand.php @@ -13,7 +13,7 @@ class BiomeSubCommand extends SubCommand { - public CONST BIOMES = ["PLAINS" => BiomeIds::PLAINS, "DESERT" => BiomeIds::DESERT, "MOUNTAINS" => BiomeIds::MOUNTAINS, "FOREST" => BiomeIds::FOREST, "TAIGA" => BiomeIds::TAIGA, "SWAMP" => BiomeIds::SWAMP, "NETHER" => BiomeIds::HELL, "HELL" => BiomeIds::HELL, "ICE_PLAINS" => BiomeIds::ICE_PLAINS]; + public CONST BIOMES = ["PLAINS" => BiomeIds::PLAINS, "DESERT" => BiomeIds::DESERT, "EXTREME_HILLS" => BiomeIds::EXTREME_HILLS, "FOREST" => BiomeIds::FOREST, "TAIGA" => BiomeIds::TAIGA, "SWAMPLAND" => BiomeIds::SWAMPLAND, "NETHER" => BiomeIds::HELL, "HELL" => BiomeIds::HELL, "ICE_PLAINS" => BiomeIds::ICE_PLAINS]; public function canUse(CommandSender $sender) : bool { return ($sender instanceof Player) and $sender->hasPermission("myplot.command.biome"); diff --git a/src/MyPlot/subcommand/GiveSubCommand.php b/src/MyPlot/subcommand/GiveSubCommand.php index d39f7468..d93d4ab7 100644 --- a/src/MyPlot/subcommand/GiveSubCommand.php +++ b/src/MyPlot/subcommand/GiveSubCommand.php @@ -47,7 +47,7 @@ public function execute(CommandSender $sender, array $args) : bool { $plotsOfPlayer = 0; foreach($this->getPlugin()->getPlotLevels() as $level => $settings) { $level = $this->getPlugin()->getServer()->getWorldManager()->getWorldByName((string)$level); - if($level !== null and !$level->isClosed()) { + if($level !== null and !$level->isLoaded()) { $plotsOfPlayer += count($this->getPlugin()->getPlotsOfPlayer($newOwner->getName(), $level->getFolderName())); } } From 6fc2a510b69e5632dc381a79d5d4255d35a4bf51 Mon Sep 17 00:00:00 2001 From: xXNiceYT <23722462+xXNiceYT@users.noreply.github.com> Date: Wed, 4 Aug 2021 10:58:37 -0400 Subject: [PATCH 2/5] Fixes spacing --- src/MyPlot/provider/JSONDataProvider.php | 11 +++-------- src/MyPlot/provider/SQLiteDataProvider.php | 4 ++-- src/MyPlot/provider/YAMLDataProvider.php | 7 +------ 3 files changed, 6 insertions(+), 16 deletions(-) diff --git a/src/MyPlot/provider/JSONDataProvider.php b/src/MyPlot/provider/JSONDataProvider.php index 5425bf63..31e189d8 100644 --- a/src/MyPlot/provider/JSONDataProvider.php +++ b/src/MyPlot/provider/JSONDataProvider.php @@ -23,15 +23,10 @@ public function __construct(MyPlot $plugin, int $cacheSize = 0) { parent::__construct($plugin, $cacheSize); @mkdir($this->plugin->getDataFolder() . "Data"); $this->json = new Config($this->plugin->getDataFolder() . "Data" . DIRECTORY_SEPARATOR . "plots.yml", Config::JSON, ["count" => -1, "plots" => []]); - - foreach($this->json->get("plots", []) as $key => $plot){ + + foreach($this->json->get("plots", []) as $key => $plot){ $biome = $plot["biome"]; - - if($biome === "SWAMP"){ - $plot["biome"] = "SWAMPLAND"; - }elseif($biome === "MOUNTAINS"){ - $plot["biome"] = "EXTREME_HILLS"; - } + $plot["biome"] = $biome === "SWAMP" ? "SWAMPLAND" : ($biome === "MOUNTAINS" ? "EXTREME_HILLS" : $biome); $this->json->setNested("plots.$key", $plot); $this->json->save(); } diff --git a/src/MyPlot/provider/SQLiteDataProvider.php b/src/MyPlot/provider/SQLiteDataProvider.php index a298f129..6ecafd34 100644 --- a/src/MyPlot/provider/SQLiteDataProvider.php +++ b/src/MyPlot/provider/SQLiteDataProvider.php @@ -121,8 +121,8 @@ public function __construct(MyPlot $plugin, int $cacheSize = 0) { throw new \Exception(); $this->sqlGetMergedPlots = $stmt; $this->db->exec("UPDATE plots SET biome = 'SWAMPLAND' WHERE biome = 'SWAMP';"); - $this->db->exec("UPDATE plots SET biome = 'EXTREME_HILLS' WHERE biome = 'MOUNTAINS';"); - $this->plugin->getLogger()->debug("SQLite data provider registered"); + $this->db->exec("UPDATE plots SET biome = 'EXTREME_HILLS' WHERE biome = 'MOUNTAINS';"); + $this->plugin->getLogger()->debug("SQLite data provider registered"); } public function savePlot(Plot $plot) : bool { diff --git a/src/MyPlot/provider/YAMLDataProvider.php b/src/MyPlot/provider/YAMLDataProvider.php index f37031a4..07f3cb2b 100644 --- a/src/MyPlot/provider/YAMLDataProvider.php +++ b/src/MyPlot/provider/YAMLDataProvider.php @@ -26,12 +26,7 @@ public function __construct(MyPlot $plugin, int $cacheSize = 0) { foreach($this->yaml->get("plots", []) as $key => $plot){ $biome = $plot["biome"]; - - if($biome === "SWAMP"){ - $plot["biome"] = "SWAMPLAND"; - }elseif($biome === "MOUNTAINS"){ - $plot["biome"] = "EXTREME_HILLS"; - } + $plot["biome"] = $biome === "SWAMP" ? "SWAMPLAND" : ($biome === "MOUNTAINS" ? "EXTREME_HILLS" : $biome); $this->yaml->setNested("plots.$key", $plot); $this->yaml->save(); } From 7427da6af49b2b8f172d9a9d462ae7a5cfc98ff8 Mon Sep 17 00:00:00 2001 From: xXNiceYT <23722462+xXNiceYT@users.noreply.github.com> Date: Wed, 4 Aug 2021 11:00:59 -0400 Subject: [PATCH 3/5] Spacing Fixes v2! --- src/MyPlot/provider/JSONDataProvider.php | 4 ++-- src/MyPlot/provider/YAMLDataProvider.php | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/MyPlot/provider/JSONDataProvider.php b/src/MyPlot/provider/JSONDataProvider.php index 31e189d8..d0f119fd 100644 --- a/src/MyPlot/provider/JSONDataProvider.php +++ b/src/MyPlot/provider/JSONDataProvider.php @@ -23,10 +23,10 @@ public function __construct(MyPlot $plugin, int $cacheSize = 0) { parent::__construct($plugin, $cacheSize); @mkdir($this->plugin->getDataFolder() . "Data"); $this->json = new Config($this->plugin->getDataFolder() . "Data" . DIRECTORY_SEPARATOR . "plots.yml", Config::JSON, ["count" => -1, "plots" => []]); - + foreach($this->json->get("plots", []) as $key => $plot){ $biome = $plot["biome"]; - $plot["biome"] = $biome === "SWAMP" ? "SWAMPLAND" : ($biome === "MOUNTAINS" ? "EXTREME_HILLS" : $biome); + $plot["biome"] = $biome === "SWAMP" ? "SWAMPLAND" : ($biome === "MOUNTAINS" ? "EXTREME_HILLS" : $biome); $this->json->setNested("plots.$key", $plot); $this->json->save(); } diff --git a/src/MyPlot/provider/YAMLDataProvider.php b/src/MyPlot/provider/YAMLDataProvider.php index 07f3cb2b..b7a069b0 100644 --- a/src/MyPlot/provider/YAMLDataProvider.php +++ b/src/MyPlot/provider/YAMLDataProvider.php @@ -25,10 +25,10 @@ public function __construct(MyPlot $plugin, int $cacheSize = 0) { $this->yaml = new Config($this->plugin->getDataFolder() . "Data" . DIRECTORY_SEPARATOR . "plots.yml", Config::YAML, ["count" => -1, "plots" => []]); foreach($this->yaml->get("plots", []) as $key => $plot){ - $biome = $plot["biome"]; - $plot["biome"] = $biome === "SWAMP" ? "SWAMPLAND" : ($biome === "MOUNTAINS" ? "EXTREME_HILLS" : $biome); - $this->yaml->setNested("plots.$key", $plot); - $this->yaml->save(); + $biome = $plot["biome"]; + $plot["biome"] = $biome === "SWAMP" ? "SWAMPLAND" : ($biome === "MOUNTAINS" ? "EXTREME_HILLS" : $biome); + $this->yaml->setNested("plots.$key", $plot); + $this->yaml->save(); } } From 0a3171ef86cba145cbf7f8fb9ded16afc4f3dd9f Mon Sep 17 00:00:00 2001 From: xXNiceYT <23722462+xXNiceYT@users.noreply.github.com> Date: Wed, 4 Aug 2021 11:03:37 -0400 Subject: [PATCH 4/5] Finally fixed spacing? --- src/MyPlot/provider/JSONDataProvider.php | 530 +++++++-------- src/MyPlot/provider/SQLiteDataProvider.php | 746 ++++++++++----------- src/MyPlot/provider/YAMLDataProvider.php | 524 +++++++-------- 3 files changed, 900 insertions(+), 900 deletions(-) diff --git a/src/MyPlot/provider/JSONDataProvider.php b/src/MyPlot/provider/JSONDataProvider.php index d0f119fd..9d263d22 100644 --- a/src/MyPlot/provider/JSONDataProvider.php +++ b/src/MyPlot/provider/JSONDataProvider.php @@ -1,266 +1,266 @@ -plugin->getDataFolder() . "Data"); - $this->json = new Config($this->plugin->getDataFolder() . "Data" . DIRECTORY_SEPARATOR . "plots.yml", Config::JSON, ["count" => -1, "plots" => []]); - - foreach($this->json->get("plots", []) as $key => $plot){ - $biome = $plot["biome"]; - $plot["biome"] = $biome === "SWAMP" ? "SWAMPLAND" : ($biome === "MOUNTAINS" ? "EXTREME_HILLS" : $biome); - $this->json->setNested("plots.$key", $plot); - $this->json->save(); - } - } - - public function savePlot(Plot $plot) : bool { - $plots = $this->json->get("plots", []); - if($plot->id > -1) { - $plots[$plot->id] = ["level" => $plot->levelName, "x" => $plot->X, "z" => $plot->Z, "name" => $plot->name, "owner" => $plot->owner, "helpers" => $plot->helpers, "denied" => $plot->denied, "biome" => $plot->biome, "pvp" => $plot->pvp, "price" => $plot->price]; - }else{ - $id = $this->json->get("count", 0) + 1; - $plot->id = $id; - $plots[$id] = ["level" => $plot->levelName, "x" => $plot->X, "z" => $plot->Z, "name" => $plot->name, "owner" => $plot->owner, "helpers" => $plot->helpers, "denied" => $plot->denied, "biome" => $plot->biome, "pvp" => $plot->pvp, "price" => $plot->price]; - $this->json->set("count", $id); - } - $this->json->set("plots", $plots); - $this->cachePlot($plot); - $this->json->save(); - return true; - } - - public function deletePlot(Plot $plot) : bool { - $plots = $this->json->get("plots", []); - unset($plots[$plot->id]); - $this->json->set("plots", $plots); - $plot = new Plot($plot->levelName, $plot->X, $plot->Z); - $this->cachePlot($plot); - $this->json->save(); - return true; - } - - public function getPlot(string $levelName, int $X, int $Z) : Plot { - if(($plot = $this->getPlotFromCache($levelName, $X, $Z)) !== null) { - return $plot; - } - $plots = $this->json->get("plots", []); - $levelKeys = $xKeys = $zKeys = []; - foreach($plots as $key => $plotData) { - if($plotData["level"] === $levelName) - $levelKeys[] = $key; - if($plotData["x"] === $X) - $xKeys[] = $key; - if($plotData["z"] === $Z) - $zKeys[] = $key; - } - /** @var int|null $key */ - $key = null; - foreach($levelKeys as $levelKey) { - foreach($xKeys as $xKey) { - foreach($zKeys as $zKey) { - if($zKey == $xKey and $xKey == $levelKey and $zKey == $levelKey) { - $key = $levelKey; - break 3; - } - } - } - } - if(is_int($key)) { - $plotName = (string)$plots[$key]["name"]; - $owner = (string)$plots[$key]["owner"]; - $helpers = (array)$plots[$key]["helpers"]; - $denied = (array)$plots[$key]["denied"]; - $biome = strtoupper($plots[$key]["biome"]); - $pvp = (bool)$plots[$key]["pvp"]; - $price = (float)$plots[$key]["price"]; - return new Plot($levelName, $X, $Z, $plotName, $owner, $helpers, $denied, $biome, $pvp, $price, $key); - } - return new Plot($levelName, $X, $Z); - } - - /** - * @param string $owner - * @param string $levelName - * - * @return Plot[] - */ - public function getPlotsByOwner(string $owner, string $levelName = "") : array { - $plots = $this->json->get("plots", []); - $ownerPlots = []; - if($levelName != "") { - /** @var int[] $levelKeys */ - $levelKeys = array_keys($plots, $levelName, true); - /** @var int[] $ownerKeys */ - $ownerKeys = array_keys($plots, $owner, true); - foreach($levelKeys as $levelKey) { - foreach($ownerKeys as $ownerKey) { - if($levelKey === $ownerKey) { - $X = $plots[$levelKey]["x"]; - $Z = $plots[$levelKey]["z"]; - $plotName = $plots[$levelKey]["name"] == "" ? "" : $plots[$levelKey]["name"]; - $owner = $plots[$levelKey]["owner"] == "" ? "" : $plots[$levelKey]["owner"]; - $helpers = $plots[$levelKey]["helpers"] == [] ? [] : $plots[$levelKey]["helpers"]; - $denied = $plots[$levelKey]["denied"] == [] ? [] : $plots[$levelKey]["denied"]; - $biome = strtoupper($plots[$levelKey]["biome"]) == "PLAINS" ? "PLAINS" : strtoupper($plots[$levelKey]["biome"]); - $pvp = $plots[$levelKey]["pvp"] == null ? false : $plots[$levelKey]["pvp"]; - $price = $plots[$levelKey]["price"] == null ? 0.0 : $plots[$levelKey]["price"]; - $ownerPlots[] = new Plot($levelName, $X, $Z, $plotName, $owner, $helpers, $denied, $biome, $pvp, $price, $levelKey); - } - } - } - }else{ - /** @var int[] $ownerKeys */ - $ownerKeys = array_keys($plots, $owner, true); - foreach($ownerKeys as $key) { - $levelName = $plots[$key]["level"]; - $X = $plots[$key]["x"]; - $Z = $plots[$key]["z"]; - $plotName = $plots[$key]["name"] == "" ? "" : $plots[$key]["name"]; - $owner = $plots[$key]["owner"] == "" ? "" : $plots[$key]["owner"]; - $helpers = $plots[$key]["helpers"] == [] ? [] : $plots[$key]["helpers"]; - $denied = $plots[$key]["denied"] == [] ? [] : $plots[$key]["denied"]; - $biome = strtoupper($plots[$key]["biome"]) == "PLAINS" ? "PLAINS" : strtoupper($plots[$key]["biome"]); - $pvp = $plots[$key]["pvp"] == null ? false : $plots[$key]["pvp"]; - $price = $plots[$key]["price"] == null ? 0.0 : $plots[$key]["price"]; - $ownerPlots[] = new Plot($levelName, $X, $Z, $plotName, $owner, $helpers, $denied, $biome, $pvp, $price, $key); - } - } - return $ownerPlots; - } - - public function getNextFreePlot(string $levelName, int $limitXZ = 0) : ?Plot { - $plotsArr = $this->json->get("plots", []); - for($i = 0; $limitXZ <= 0 or $i < $limitXZ; $i++) { - $existing = []; - foreach($plotsArr as $id => $data) { - if($data["level"] === $levelName) { - if(abs($data["x"]) === $i and abs($data["z"]) <= $i) { - $existing[] = [$data["x"], $data["z"]]; - }elseif(abs($data["z"]) === $i and abs($data["x"]) <= $i) { - $existing[] = [$data["x"], $data["z"]]; - } - } - } - $plots = []; - foreach($existing as $XZ) { - $plots[$XZ[0]][$XZ[1]] = true; - } - if(count($plots) === max(1, 8 * $i)) { - continue; - } - if(($ret = self::findEmptyPlotSquared(0, $i, $plots)) !== null) { - [$X, $Z] = $ret; - $plot = new Plot($levelName, $X, $Z); - $this->cachePlot($plot); - return $plot; - } - for($a = 1; $a < $i; $a++) { - if(($ret = self::findEmptyPlotSquared($a, $i, $plots)) !== null) { - [$X, $Z] = $ret; - $plot = new Plot($levelName, $X, $Z); - $this->cachePlot($plot); - return $plot; - } - } - if(($ret = self::findEmptyPlotSquared($i, $i, $plots)) !== null) { - [$X, $Z] = $ret; - $plot = new Plot($levelName, $X, $Z); - $this->cachePlot($plot); - return $plot; - } - } - return null; - } - - public function mergePlots(Plot $base, Plot ...$plots) : bool { - $originId = $base->id; - $mergedIds = $this->json->getNested("merges.$originId", []); - $mergedIds = array_merge($mergedIds, array_map(function(Plot $val) { - return $val->id; - }, $plots)); - $mergedIds = array_unique($mergedIds, SORT_NUMERIC); - $this->json->setNested("merges.$originId", $mergedIds); - $this->json->save(); - return true; - } - - public function getMergedPlots(Plot $plot, bool $adjacent = false) : array { - $originId = $plot->id; - $mergedIds = $this->json->getNested("merges.$originId", []); - $plotDatums = $this->json->get("plots", []); - $plots = [$plot]; - foreach($mergedIds as $mergedId) { - if(!isset($plotDatums[$mergedIds])) - continue; - $levelName = $plotDatums[$mergedId]["level"]; - $X = $plotDatums[$mergedId]["x"]; - $Z = $plotDatums[$mergedId]["z"]; - $plotName = $plotDatums[$mergedId]["name"] == "" ? "" : $plotDatums[$mergedId]["name"]; - $owner = $plotDatums[$mergedId]["owner"] == "" ? "" : $plotDatums[$mergedId]["owner"]; - $helpers = $plotDatums[$mergedId]["helpers"] == [] ? [] : $plotDatums[$mergedId]["helpers"]; - $denied = $plotDatums[$mergedId]["denied"] == [] ? [] : $plotDatums[$mergedId]["denied"]; - $biome = strtoupper($plotDatums[$mergedId]["biome"]) == "PLAINS" ? "PLAINS" : strtoupper($plotDatums[$mergedId]["biome"]); - $pvp = $plotDatums[$mergedId]["pvp"] == null ? false : $plotDatums[$mergedId]["pvp"]; - $price = $plotDatums[$mergedId]["price"] == null ? 0 : $plotDatums[$mergedId]["price"]; - $plots[] = new Plot($levelName, $X, $Z, $plotName, $owner, $helpers, $denied, $biome, $pvp, $price, $mergedId); - } - if($adjacent) - $plots = array_filter($plots, function(Plot $val) use ($plot) { - for($i = Facing::NORTH; $i <= Facing::EAST; ++$i) { - if($plot->getSide($i)->isSame($val)) - return true; - } - return false; - }); - return $plots; - } - - public function getMergeOrigin(Plot $plot) : Plot { - $allMerges = $this->json->get("merges", []); - if(isset($allMerges[$plot->id])) - return $plot; - $originId = array_search($plot->id, $allMerges); - if(!is_int($originId)) { - return $plot; - } - $plotDatums = $this->json->get("plots", []); - if(isset($plotDatums[$originId])) { - $levelName = $plotDatums[$originId]["level"]; - $X = $plotDatums[$originId]["x"]; - $Z = $plotDatums[$originId]["z"]; - $plotName = $plotDatums[$originId]["name"] == "" ? "" : $plotDatums[$originId]["name"]; - $owner = $plotDatums[$originId]["owner"] == "" ? "" : $plotDatums[$originId]["owner"]; - $helpers = $plotDatums[$originId]["helpers"] == [] ? [] : $plotDatums[$originId]["helpers"]; - $denied = $plotDatums[$originId]["denied"] == [] ? [] : $plotDatums[$originId]["denied"]; - $biome = strtoupper($plotDatums[$originId]["biome"]) == "PLAINS" ? "PLAINS" : strtoupper($plotDatums[$originId]["biome"]); - $pvp = $plotDatums[$originId]["pvp"] == null ? false : $plotDatums[$originId]["pvp"]; - $price = $plotDatums[$originId]["price"] == null ? 0 : $plotDatums[$originId]["price"]; - return new Plot($levelName, $X, $Z, $plotName, $owner, $helpers, $denied, $biome, $pvp, $price, $originId); - } - return $plot; - } - - public function close() : void { - $this->json->save(); - unset($this->json); - } +plugin->getDataFolder() . "Data"); + $this->json = new Config($this->plugin->getDataFolder() . "Data" . DIRECTORY_SEPARATOR . "plots.yml", Config::JSON, ["count" => -1, "plots" => []]); + + foreach($this->json->get("plots", []) as $key => $plot){ + $biome = $plot["biome"]; + $plot["biome"] = $biome === "SWAMP" ? "SWAMPLAND" : ($biome === "MOUNTAINS" ? "EXTREME_HILLS" : $biome); + $this->json->setNested("plots.$key", $plot); + $this->json->save(); + } + } + + public function savePlot(Plot $plot) : bool { + $plots = $this->json->get("plots", []); + if($plot->id > -1) { + $plots[$plot->id] = ["level" => $plot->levelName, "x" => $plot->X, "z" => $plot->Z, "name" => $plot->name, "owner" => $plot->owner, "helpers" => $plot->helpers, "denied" => $plot->denied, "biome" => $plot->biome, "pvp" => $plot->pvp, "price" => $plot->price]; + }else{ + $id = $this->json->get("count", 0) + 1; + $plot->id = $id; + $plots[$id] = ["level" => $plot->levelName, "x" => $plot->X, "z" => $plot->Z, "name" => $plot->name, "owner" => $plot->owner, "helpers" => $plot->helpers, "denied" => $plot->denied, "biome" => $plot->biome, "pvp" => $plot->pvp, "price" => $plot->price]; + $this->json->set("count", $id); + } + $this->json->set("plots", $plots); + $this->cachePlot($plot); + $this->json->save(); + return true; + } + + public function deletePlot(Plot $plot) : bool { + $plots = $this->json->get("plots", []); + unset($plots[$plot->id]); + $this->json->set("plots", $plots); + $plot = new Plot($plot->levelName, $plot->X, $plot->Z); + $this->cachePlot($plot); + $this->json->save(); + return true; + } + + public function getPlot(string $levelName, int $X, int $Z) : Plot { + if(($plot = $this->getPlotFromCache($levelName, $X, $Z)) !== null) { + return $plot; + } + $plots = $this->json->get("plots", []); + $levelKeys = $xKeys = $zKeys = []; + foreach($plots as $key => $plotData) { + if($plotData["level"] === $levelName) + $levelKeys[] = $key; + if($plotData["x"] === $X) + $xKeys[] = $key; + if($plotData["z"] === $Z) + $zKeys[] = $key; + } + /** @var int|null $key */ + $key = null; + foreach($levelKeys as $levelKey) { + foreach($xKeys as $xKey) { + foreach($zKeys as $zKey) { + if($zKey == $xKey and $xKey == $levelKey and $zKey == $levelKey) { + $key = $levelKey; + break 3; + } + } + } + } + if(is_int($key)) { + $plotName = (string)$plots[$key]["name"]; + $owner = (string)$plots[$key]["owner"]; + $helpers = (array)$plots[$key]["helpers"]; + $denied = (array)$plots[$key]["denied"]; + $biome = strtoupper($plots[$key]["biome"]); + $pvp = (bool)$plots[$key]["pvp"]; + $price = (float)$plots[$key]["price"]; + return new Plot($levelName, $X, $Z, $plotName, $owner, $helpers, $denied, $biome, $pvp, $price, $key); + } + return new Plot($levelName, $X, $Z); + } + + /** + * @param string $owner + * @param string $levelName + * + * @return Plot[] + */ + public function getPlotsByOwner(string $owner, string $levelName = "") : array { + $plots = $this->json->get("plots", []); + $ownerPlots = []; + if($levelName != "") { + /** @var int[] $levelKeys */ + $levelKeys = array_keys($plots, $levelName, true); + /** @var int[] $ownerKeys */ + $ownerKeys = array_keys($plots, $owner, true); + foreach($levelKeys as $levelKey) { + foreach($ownerKeys as $ownerKey) { + if($levelKey === $ownerKey) { + $X = $plots[$levelKey]["x"]; + $Z = $plots[$levelKey]["z"]; + $plotName = $plots[$levelKey]["name"] == "" ? "" : $plots[$levelKey]["name"]; + $owner = $plots[$levelKey]["owner"] == "" ? "" : $plots[$levelKey]["owner"]; + $helpers = $plots[$levelKey]["helpers"] == [] ? [] : $plots[$levelKey]["helpers"]; + $denied = $plots[$levelKey]["denied"] == [] ? [] : $plots[$levelKey]["denied"]; + $biome = strtoupper($plots[$levelKey]["biome"]) == "PLAINS" ? "PLAINS" : strtoupper($plots[$levelKey]["biome"]); + $pvp = $plots[$levelKey]["pvp"] == null ? false : $plots[$levelKey]["pvp"]; + $price = $plots[$levelKey]["price"] == null ? 0.0 : $plots[$levelKey]["price"]; + $ownerPlots[] = new Plot($levelName, $X, $Z, $plotName, $owner, $helpers, $denied, $biome, $pvp, $price, $levelKey); + } + } + } + }else{ + /** @var int[] $ownerKeys */ + $ownerKeys = array_keys($plots, $owner, true); + foreach($ownerKeys as $key) { + $levelName = $plots[$key]["level"]; + $X = $plots[$key]["x"]; + $Z = $plots[$key]["z"]; + $plotName = $plots[$key]["name"] == "" ? "" : $plots[$key]["name"]; + $owner = $plots[$key]["owner"] == "" ? "" : $plots[$key]["owner"]; + $helpers = $plots[$key]["helpers"] == [] ? [] : $plots[$key]["helpers"]; + $denied = $plots[$key]["denied"] == [] ? [] : $plots[$key]["denied"]; + $biome = strtoupper($plots[$key]["biome"]) == "PLAINS" ? "PLAINS" : strtoupper($plots[$key]["biome"]); + $pvp = $plots[$key]["pvp"] == null ? false : $plots[$key]["pvp"]; + $price = $plots[$key]["price"] == null ? 0.0 : $plots[$key]["price"]; + $ownerPlots[] = new Plot($levelName, $X, $Z, $plotName, $owner, $helpers, $denied, $biome, $pvp, $price, $key); + } + } + return $ownerPlots; + } + + public function getNextFreePlot(string $levelName, int $limitXZ = 0) : ?Plot { + $plotsArr = $this->json->get("plots", []); + for($i = 0; $limitXZ <= 0 or $i < $limitXZ; $i++) { + $existing = []; + foreach($plotsArr as $id => $data) { + if($data["level"] === $levelName) { + if(abs($data["x"]) === $i and abs($data["z"]) <= $i) { + $existing[] = [$data["x"], $data["z"]]; + }elseif(abs($data["z"]) === $i and abs($data["x"]) <= $i) { + $existing[] = [$data["x"], $data["z"]]; + } + } + } + $plots = []; + foreach($existing as $XZ) { + $plots[$XZ[0]][$XZ[1]] = true; + } + if(count($plots) === max(1, 8 * $i)) { + continue; + } + if(($ret = self::findEmptyPlotSquared(0, $i, $plots)) !== null) { + [$X, $Z] = $ret; + $plot = new Plot($levelName, $X, $Z); + $this->cachePlot($plot); + return $plot; + } + for($a = 1; $a < $i; $a++) { + if(($ret = self::findEmptyPlotSquared($a, $i, $plots)) !== null) { + [$X, $Z] = $ret; + $plot = new Plot($levelName, $X, $Z); + $this->cachePlot($plot); + return $plot; + } + } + if(($ret = self::findEmptyPlotSquared($i, $i, $plots)) !== null) { + [$X, $Z] = $ret; + $plot = new Plot($levelName, $X, $Z); + $this->cachePlot($plot); + return $plot; + } + } + return null; + } + + public function mergePlots(Plot $base, Plot ...$plots) : bool { + $originId = $base->id; + $mergedIds = $this->json->getNested("merges.$originId", []); + $mergedIds = array_merge($mergedIds, array_map(function(Plot $val) { + return $val->id; + }, $plots)); + $mergedIds = array_unique($mergedIds, SORT_NUMERIC); + $this->json->setNested("merges.$originId", $mergedIds); + $this->json->save(); + return true; + } + + public function getMergedPlots(Plot $plot, bool $adjacent = false) : array { + $originId = $plot->id; + $mergedIds = $this->json->getNested("merges.$originId", []); + $plotDatums = $this->json->get("plots", []); + $plots = [$plot]; + foreach($mergedIds as $mergedId) { + if(!isset($plotDatums[$mergedIds])) + continue; + $levelName = $plotDatums[$mergedId]["level"]; + $X = $plotDatums[$mergedId]["x"]; + $Z = $plotDatums[$mergedId]["z"]; + $plotName = $plotDatums[$mergedId]["name"] == "" ? "" : $plotDatums[$mergedId]["name"]; + $owner = $plotDatums[$mergedId]["owner"] == "" ? "" : $plotDatums[$mergedId]["owner"]; + $helpers = $plotDatums[$mergedId]["helpers"] == [] ? [] : $plotDatums[$mergedId]["helpers"]; + $denied = $plotDatums[$mergedId]["denied"] == [] ? [] : $plotDatums[$mergedId]["denied"]; + $biome = strtoupper($plotDatums[$mergedId]["biome"]) == "PLAINS" ? "PLAINS" : strtoupper($plotDatums[$mergedId]["biome"]); + $pvp = $plotDatums[$mergedId]["pvp"] == null ? false : $plotDatums[$mergedId]["pvp"]; + $price = $plotDatums[$mergedId]["price"] == null ? 0 : $plotDatums[$mergedId]["price"]; + $plots[] = new Plot($levelName, $X, $Z, $plotName, $owner, $helpers, $denied, $biome, $pvp, $price, $mergedId); + } + if($adjacent) + $plots = array_filter($plots, function(Plot $val) use ($plot) { + for($i = Facing::NORTH; $i <= Facing::EAST; ++$i) { + if($plot->getSide($i)->isSame($val)) + return true; + } + return false; + }); + return $plots; + } + + public function getMergeOrigin(Plot $plot) : Plot { + $allMerges = $this->json->get("merges", []); + if(isset($allMerges[$plot->id])) + return $plot; + $originId = array_search($plot->id, $allMerges); + if(!is_int($originId)) { + return $plot; + } + $plotDatums = $this->json->get("plots", []); + if(isset($plotDatums[$originId])) { + $levelName = $plotDatums[$originId]["level"]; + $X = $plotDatums[$originId]["x"]; + $Z = $plotDatums[$originId]["z"]; + $plotName = $plotDatums[$originId]["name"] == "" ? "" : $plotDatums[$originId]["name"]; + $owner = $plotDatums[$originId]["owner"] == "" ? "" : $plotDatums[$originId]["owner"]; + $helpers = $plotDatums[$originId]["helpers"] == [] ? [] : $plotDatums[$originId]["helpers"]; + $denied = $plotDatums[$originId]["denied"] == [] ? [] : $plotDatums[$originId]["denied"]; + $biome = strtoupper($plotDatums[$originId]["biome"]) == "PLAINS" ? "PLAINS" : strtoupper($plotDatums[$originId]["biome"]); + $pvp = $plotDatums[$originId]["pvp"] == null ? false : $plotDatums[$originId]["pvp"]; + $price = $plotDatums[$originId]["price"] == null ? 0 : $plotDatums[$originId]["price"]; + return new Plot($levelName, $X, $Z, $plotName, $owner, $helpers, $denied, $biome, $pvp, $price, $originId); + } + return $plot; + } + + public function close() : void { + $this->json->save(); + unset($this->json); + } } \ No newline at end of file diff --git a/src/MyPlot/provider/SQLiteDataProvider.php b/src/MyPlot/provider/SQLiteDataProvider.php index 6ecafd34..70ff4c43 100644 --- a/src/MyPlot/provider/SQLiteDataProvider.php +++ b/src/MyPlot/provider/SQLiteDataProvider.php @@ -1,374 +1,374 @@ -db = new \SQLite3($this->plugin->getDataFolder() . "plots.db"); - $this->db->exec("CREATE TABLE IF NOT EXISTS plots - (id INTEGER PRIMARY KEY AUTOINCREMENT, level TEXT, X INTEGER, Z INTEGER, name TEXT, - owner TEXT, helpers TEXT, denied TEXT, biome TEXT, pvp INTEGER, price FLOAT);"); - try{ - $this->db->exec("ALTER TABLE plots ADD pvp INTEGER;"); - }catch(\Exception $e) { - // nothing :P - } - try{ - $this->db->exec("ALTER TABLE plots ADD price FLOAT;"); - }catch(\Exception $e) { - // nothing :P - } - $stmt = $this->db->prepare("SELECT id, name, owner, helpers, denied, biome, pvp, price FROM plots WHERE level = :level AND X = :X AND Z = :Z;"); - if($stmt === false) - throw new \Exception(); - $this->sqlGetPlot = $stmt; - $stmt = $this->db->prepare("INSERT OR REPLACE INTO plots (id, level, X, Z, name, owner, helpers, denied, biome, pvp, price) VALUES - ((SELECT id FROM plots WHERE level = :level AND X = :X AND Z = :Z), - :level, :X, :Z, :name, :owner, :helpers, :denied, :biome, :pvp, :price);"); - if($stmt === false) - throw new \Exception(); - $this->sqlSavePlot = $stmt; - $stmt = $this->db->prepare("UPDATE plots SET name = :name, owner = :owner, helpers = :helpers, denied = :denied, biome = :biome, pvp = :pvp, price = :price WHERE id = :id;"); - if($stmt === false) - throw new \Exception(); - $this->sqlSavePlotById = $stmt; - $stmt = $this->db->prepare("DELETE FROM plots WHERE level = :level AND X = :X AND Z = :Z;"); - if($stmt === false) - throw new \Exception(); - $this->sqlRemovePlot = $stmt; - $stmt = $this->db->prepare("UPDATE plots SET name = '', owner = '', helpers = '', denied = '', biome = :biome, pvp = :pvp, price = :price WHERE level = :level AND X = :X AND Z = :Z;"); - if($stmt === false) - throw new \Exception(); - $this->sqlDisposeMergedPlot = $stmt; - $stmt = $this->db->prepare("DELETE FROM plots WHERE id = :id;"); - if($stmt === false) - throw new \Exception(); - $this->sqlRemovePlotById = $stmt; - $stmt = $this->db->prepare("UPDATE plots SET name = '', owner = '', helpers = '', denied = '', biome = :biome, pvp = :pvp, price = :price WHERE id = :id;"); - if($stmt === false) - throw new \Exception(); - $this->sqlDisposeMergedPlotById = $stmt; - $stmt = $this->db->prepare("SELECT * FROM plots WHERE owner = :owner;"); - if($stmt === false) - throw new \Exception(); - $this->sqlGetPlotsByOwner = $stmt; - $stmt = $this->db->prepare("SELECT * FROM plots WHERE owner = :owner AND level = :level;"); - if($stmt === false) - throw new \Exception(); - $this->sqlGetPlotsByOwnerAndLevel = $stmt; - $stmt = $this->db->prepare("SELECT X, Z FROM plots WHERE ( - level = :level - AND ( - (abs(X) = :number AND abs(Z) <= :number) OR - (abs(Z) = :number AND abs(X) <= :number) - ) - );"); - if($stmt === false) - throw new \Exception(); - $this->sqlGetExistingXZ = $stmt; - $this->db->exec("CREATE TABLE IF NOT EXISTS mergedPlots (originId INTEGER, mergedId INTEGER UNIQUE, PRIMARY KEY (originId, mergedId), FOREIGN KEY (originId) REFERENCES plots (id) ON DELETE CASCADE , FOREIGN KEY (mergedId) REFERENCES plots (id) ON DELETE CASCADE);"); - $stmt = $this->db->prepare("INSERT OR REPLACE INTO mergedPlots (originId, mergedId) VALUES (:originId, :mergedId);"); - if($stmt === false) - throw new \Exception(); - $this->sqlMergePlot = $stmt; - $stmt = $this->db->prepare("SELECT plots.id, level, X, Z, name, owner, helpers, denied, biome, pvp, price FROM plots LEFT JOIN mergedPlots ON mergedPlots.originId = plots.id WHERE mergedId = :mergedId;"); - if($stmt === false) - throw new \Exception(); - $this->sqlGetMergeOrigin = $stmt; - $stmt = $this->db->prepare("SELECT plots.id, level, X, Z, name, owner, helpers, denied, biome, pvp, price FROM plots LEFT JOIN mergedPlots ON mergedPlots.mergedId = plots.id WHERE originId = :originId;"); - if($stmt === false) - throw new \Exception(); - $this->sqlGetMergedPlots = $stmt; - $this->db->exec("UPDATE plots SET biome = 'SWAMPLAND' WHERE biome = 'SWAMP';"); - $this->db->exec("UPDATE plots SET biome = 'EXTREME_HILLS' WHERE biome = 'MOUNTAINS';"); - $this->plugin->getLogger()->debug("SQLite data provider registered"); - } - - public function savePlot(Plot $plot) : bool { - $helpers = implode(",", $plot->helpers); - $denied = implode(",", $plot->denied); - if($plot->id >= 0) { - $stmt = $this->sqlSavePlotById; - $stmt->bindValue(":id", $plot->id, SQLITE3_INTEGER); - }else{ - $stmt = $this->sqlSavePlot; - $stmt->bindValue(":level", $plot->levelName, SQLITE3_TEXT); - $stmt->bindValue(":X", $plot->X, SQLITE3_INTEGER); - $stmt->bindValue(":Z", $plot->Z, SQLITE3_INTEGER); - } - $stmt->bindValue(":name", $plot->name, SQLITE3_TEXT); - $stmt->bindValue(":owner", $plot->owner, SQLITE3_TEXT); - $stmt->bindValue(":helpers", $helpers, SQLITE3_TEXT); - $stmt->bindValue(":denied", $denied, SQLITE3_TEXT); - $stmt->bindValue(":biome", $plot->biome, SQLITE3_TEXT); - $stmt->bindValue(":pvp", $plot->pvp, SQLITE3_INTEGER); - $stmt->bindValue(":price", $plot->price, SQLITE3_FLOAT); - $stmt->reset(); - $result = $stmt->execute(); - if(!$result instanceof \SQLite3Result) { - return false; - } - $this->cachePlot($plot); - return true; - } - - public function deletePlot(Plot $plot) : bool { - if($plot->isMerged()){ - $settings = MyPlot::getInstance()->getLevelSettings($plot->levelName); - if ($plot->id >= 0) { - $stmt = $this->sqlDisposeMergedPlotById; - $stmt->bindValue(":biome", $plot->biome, SQLITE3_TEXT); - $stmt->bindValue(":pvp", !$settings->restrictPVP, SQLITE3_INTEGER); - $stmt->bindValue(":price", $settings->claimPrice, SQLITE3_FLOAT); - $stmt->bindValue(":id", $plot->id, SQLITE3_INTEGER); - } else { - $stmt = $this->sqlDisposeMergedPlot; - $stmt->bindValue(":pvp", !$settings->restrictPVP, SQLITE3_INTEGER); - $stmt->bindValue(":price", $settings->claimPrice, SQLITE3_FLOAT); - $stmt->bindValue(":level", $plot->levelName, SQLITE3_TEXT); - $stmt->bindValue(":X", $plot->X, SQLITE3_INTEGER); - $stmt->bindValue(":Z", $plot->Z, SQLITE3_INTEGER); - } - $stmt->reset(); - $result = $stmt->execute(); - if(!$result instanceof \SQLite3Result) { - return false; - } - $this->cachePlot($this->getMergeOrigin($plot)); - }else { - if($plot->id >= 0) { - $stmt = $this->sqlRemovePlotById; - $stmt->bindValue(":id", $plot->id, SQLITE3_INTEGER); - }else{ - $stmt = $this->sqlRemovePlot; - $stmt->bindValue(":level", $plot->levelName, SQLITE3_TEXT); - $stmt->bindValue(":X", $plot->X, SQLITE3_INTEGER); - $stmt->bindValue(":Z", $plot->Z, SQLITE3_INTEGER); - } - $stmt->reset(); - $result = $stmt->execute(); - if(!$result instanceof \SQLite3Result) { - return false; - } - $plot = new Plot($plot->levelName, $plot->X, $plot->Z); - $this->cachePlot($plot); - } - return true; - } - - public function getPlot(string $levelName, int $X, int $Z) : Plot { - if(($plot = $this->getPlotFromCache($levelName, $X, $Z)) !== null) { - return $plot; - } - $this->sqlGetPlot->bindValue(":level", $levelName, SQLITE3_TEXT); - $this->sqlGetPlot->bindValue(":X", $X, SQLITE3_INTEGER); - $this->sqlGetPlot->bindValue(":Z", $Z, SQLITE3_INTEGER); - $this->sqlGetPlot->reset(); - $result = $this->sqlGetPlot->execute(); - if($result !== false and ($val = $result->fetchArray(SQLITE3_ASSOC)) !== false) { - if($val["helpers"] === null or $val["helpers"] === "") { - $helpers = []; - }else{ - $helpers = explode(",", (string) $val["helpers"]); - } - if($val["denied"] === null or $val["denied"] === "") { - $denied = []; - }else{ - $denied = explode(",", (string) $val["denied"]); - } - $pvp = is_numeric($val["pvp"]) ? (bool)$val["pvp"] : null; - $plot = new Plot($levelName, $X, $Z, (string) $val["name"], (string) $val["owner"], $helpers, $denied, (string) $val["biome"], $pvp, (float) $val["price"], (int) $val["id"]); - }else{ - $plot = new Plot($levelName, $X, $Z); - } - $this->cachePlot($plot); - return $plot; - } - - /** - * @param string $owner - * @param string $levelName - * - * @return Plot[] - */ - public function getPlotsByOwner(string $owner, string $levelName = "") : array { - if($levelName === "") { - $stmt = $this->sqlGetPlotsByOwner; - }else{ - $stmt = $this->sqlGetPlotsByOwnerAndLevel; - $stmt->bindValue(":level", $levelName, SQLITE3_TEXT); - } - $stmt->bindValue(":owner", $owner, SQLITE3_TEXT); - $plots = []; - $stmt->reset(); - $result = $stmt->execute(); - while($result !== false and ($val = $result->fetchArray(SQLITE3_ASSOC)) !== false) { - $helpers = explode(",", (string) $val["helpers"]); - $denied = explode(",", (string) $val["denied"]); - $pvp = is_numeric($val["pvp"]) ? (bool)$val["pvp"] : null; - $plots[] = new Plot((string) $val["level"], (int) $val["X"], (int) $val["Z"], (string) $val["name"], (string) $val["owner"], $helpers, $denied, (string) $val["biome"], $pvp, (float) $val["price"], (int) $val["id"]); - } - // Remove unloaded plots - $plots = array_filter($plots, function(Plot $plot) : bool { - return $this->plugin->isLevelLoaded($plot->levelName); - }); - // Sort plots by level - usort($plots, function(Plot $plot1, Plot $plot2) : int { - return strcmp($plot1->levelName, $plot2->levelName); - }); - return $plots; - } - - public function getNextFreePlot(string $levelName, int $limitXZ = 0) : ?Plot { - $this->sqlGetExistingXZ->bindValue(":level", $levelName, SQLITE3_TEXT); - $i = 0; - $this->sqlGetExistingXZ->bindParam(":number", $i, SQLITE3_INTEGER); - for(; $limitXZ <= 0 or $i < $limitXZ; $i++) { - $this->sqlGetExistingXZ->reset(); - $result = $this->sqlGetExistingXZ->execute(); - $plots = []; - while($result !== false and ($val = $result->fetchArray(SQLITE3_NUM)) !== false) { - $plots[$val[0]][$val[1]] = true; - } - if(count($plots) === max(1, 8 * $i)) { - continue; - } - if(($ret = self::findEmptyPlotSquared(0, $i, $plots)) !== null) { - [$X, $Z] = $ret; - $plot = new Plot($levelName, $X, $Z); - $this->cachePlot($plot); - return $plot; - } - for($a = 1; $a < $i; $a++) { - if(($ret = self::findEmptyPlotSquared($a, $i, $plots)) !== null) { - [$X, $Z] = $ret; - $plot = new Plot($levelName, $X, $Z); - $this->cachePlot($plot); - return $plot; - } - } - if(($ret = self::findEmptyPlotSquared($i, $i, $plots)) !== null) { - [$X, $Z] = $ret; - $plot = new Plot($levelName, $X, $Z); - $this->cachePlot($plot); - return $plot; - } - } - return null; - } - - public function close() : void { - $this->db->close(); - $this->plugin->getLogger()->debug("SQLite database closed!"); - } - - public function mergePlots(Plot $base, Plot ...$plots) : bool { - $stmt = $this->sqlMergePlot; - $ret = true; - foreach($plots as $plot) { - $stmt->bindValue(":originId", $base->id); - $stmt->bindValue(":mergedId", $plot->id); - $stmt->reset(); - $result = $stmt->execute(); - if(!$result instanceof \SQLite3Result) { - MyPlot::getInstance()->getLogger()->debug("Failed to merge plot id ".$plot->id." into ".$base->id); - $ret = false; - continue; - } - } - return $ret; - } - - /** - * @param Plot $plot - * @param bool $adjacent - * - * @return Plot[] - */ - public function getMergedPlots(Plot $plot, bool $adjacent = false) : array { - $origin = $this->getMergeOrigin($plot); - $stmt = $this->sqlGetMergedPlots; - $stmt->bindValue(":originId", $origin->id); - $stmt->reset(); - $result = $stmt->execute(); - $plots = [$origin]; - while($result !== false and $val = $result->fetchArray(SQLITE3_ASSOC)) { - $helpers = explode(",", (string) $val["helpers"]); - $denied = explode(",", (string) $val["denied"]); - $pvp = is_numeric($val["pvp"]) ? (bool)$val["pvp"] : null; - $plots[] = new Plot((string) $val["level"], (int) $val["X"], (int) $val["Z"], (string) $val["name"], (string) $val["owner"], $helpers, $denied, (string) $val["biome"], $pvp, (float) $val["price"], (int) $val["id"]); - } - if($adjacent) - $plots = array_filter($plots, function(Plot $val) use ($plot) : bool { - for($i = Facing::NORTH; $i <= Facing::EAST; ++$i) { - if($plot->getSide($i)->isSame($val)) - return true; - } - return false; - }); - return $plots; - } - - /** - * @param Plot $plot - * - * @return Plot - */ - public function getMergeOrigin(Plot $plot) : Plot { - $stmt = $this->sqlGetMergeOrigin; - $stmt->bindValue(":mergedId", $plot->id); - $stmt->reset(); - $result = $stmt->execute(); - if(!$result instanceof \SQLite3Result) { - return $plot; - } - if($val = $result->fetchArray(SQLITE3_ASSOC)) { - $helpers = explode(",", (string) $val["helpers"]); - $denied = explode(",", (string) $val["denied"]); - $pvp = is_numeric($val["pvp"]) ? (bool)$val["pvp"] : null; - return new Plot((string) $val["level"], (int) $val["X"], (int) $val["Z"], (string) $val["name"], (string) $val["owner"], $helpers, $denied, (string) $val["biome"], $pvp, (float) $val["price"], (int) $val["id"]); - } - return $plot; - } +db = new \SQLite3($this->plugin->getDataFolder() . "plots.db"); + $this->db->exec("CREATE TABLE IF NOT EXISTS plots + (id INTEGER PRIMARY KEY AUTOINCREMENT, level TEXT, X INTEGER, Z INTEGER, name TEXT, + owner TEXT, helpers TEXT, denied TEXT, biome TEXT, pvp INTEGER, price FLOAT);"); + try{ + $this->db->exec("ALTER TABLE plots ADD pvp INTEGER;"); + }catch(\Exception $e) { + // nothing :P + } + try{ + $this->db->exec("ALTER TABLE plots ADD price FLOAT;"); + }catch(\Exception $e) { + // nothing :P + } + $stmt = $this->db->prepare("SELECT id, name, owner, helpers, denied, biome, pvp, price FROM plots WHERE level = :level AND X = :X AND Z = :Z;"); + if($stmt === false) + throw new \Exception(); + $this->sqlGetPlot = $stmt; + $stmt = $this->db->prepare("INSERT OR REPLACE INTO plots (id, level, X, Z, name, owner, helpers, denied, biome, pvp, price) VALUES + ((SELECT id FROM plots WHERE level = :level AND X = :X AND Z = :Z), + :level, :X, :Z, :name, :owner, :helpers, :denied, :biome, :pvp, :price);"); + if($stmt === false) + throw new \Exception(); + $this->sqlSavePlot = $stmt; + $stmt = $this->db->prepare("UPDATE plots SET name = :name, owner = :owner, helpers = :helpers, denied = :denied, biome = :biome, pvp = :pvp, price = :price WHERE id = :id;"); + if($stmt === false) + throw new \Exception(); + $this->sqlSavePlotById = $stmt; + $stmt = $this->db->prepare("DELETE FROM plots WHERE level = :level AND X = :X AND Z = :Z;"); + if($stmt === false) + throw new \Exception(); + $this->sqlRemovePlot = $stmt; + $stmt = $this->db->prepare("UPDATE plots SET name = '', owner = '', helpers = '', denied = '', biome = :biome, pvp = :pvp, price = :price WHERE level = :level AND X = :X AND Z = :Z;"); + if($stmt === false) + throw new \Exception(); + $this->sqlDisposeMergedPlot = $stmt; + $stmt = $this->db->prepare("DELETE FROM plots WHERE id = :id;"); + if($stmt === false) + throw new \Exception(); + $this->sqlRemovePlotById = $stmt; + $stmt = $this->db->prepare("UPDATE plots SET name = '', owner = '', helpers = '', denied = '', biome = :biome, pvp = :pvp, price = :price WHERE id = :id;"); + if($stmt === false) + throw new \Exception(); + $this->sqlDisposeMergedPlotById = $stmt; + $stmt = $this->db->prepare("SELECT * FROM plots WHERE owner = :owner;"); + if($stmt === false) + throw new \Exception(); + $this->sqlGetPlotsByOwner = $stmt; + $stmt = $this->db->prepare("SELECT * FROM plots WHERE owner = :owner AND level = :level;"); + if($stmt === false) + throw new \Exception(); + $this->sqlGetPlotsByOwnerAndLevel = $stmt; + $stmt = $this->db->prepare("SELECT X, Z FROM plots WHERE ( + level = :level + AND ( + (abs(X) = :number AND abs(Z) <= :number) OR + (abs(Z) = :number AND abs(X) <= :number) + ) + );"); + if($stmt === false) + throw new \Exception(); + $this->sqlGetExistingXZ = $stmt; + $this->db->exec("CREATE TABLE IF NOT EXISTS mergedPlots (originId INTEGER, mergedId INTEGER UNIQUE, PRIMARY KEY (originId, mergedId), FOREIGN KEY (originId) REFERENCES plots (id) ON DELETE CASCADE , FOREIGN KEY (mergedId) REFERENCES plots (id) ON DELETE CASCADE);"); + $stmt = $this->db->prepare("INSERT OR REPLACE INTO mergedPlots (originId, mergedId) VALUES (:originId, :mergedId);"); + if($stmt === false) + throw new \Exception(); + $this->sqlMergePlot = $stmt; + $stmt = $this->db->prepare("SELECT plots.id, level, X, Z, name, owner, helpers, denied, biome, pvp, price FROM plots LEFT JOIN mergedPlots ON mergedPlots.originId = plots.id WHERE mergedId = :mergedId;"); + if($stmt === false) + throw new \Exception(); + $this->sqlGetMergeOrigin = $stmt; + $stmt = $this->db->prepare("SELECT plots.id, level, X, Z, name, owner, helpers, denied, biome, pvp, price FROM plots LEFT JOIN mergedPlots ON mergedPlots.mergedId = plots.id WHERE originId = :originId;"); + if($stmt === false) + throw new \Exception(); + $this->sqlGetMergedPlots = $stmt; + $this->db->exec("UPDATE plots SET biome = 'SWAMPLAND' WHERE biome = 'SWAMP';"); + $this->db->exec("UPDATE plots SET biome = 'EXTREME_HILLS' WHERE biome = 'MOUNTAINS';"); + $this->plugin->getLogger()->debug("SQLite data provider registered"); + } + + public function savePlot(Plot $plot) : bool { + $helpers = implode(",", $plot->helpers); + $denied = implode(",", $plot->denied); + if($plot->id >= 0) { + $stmt = $this->sqlSavePlotById; + $stmt->bindValue(":id", $plot->id, SQLITE3_INTEGER); + }else{ + $stmt = $this->sqlSavePlot; + $stmt->bindValue(":level", $plot->levelName, SQLITE3_TEXT); + $stmt->bindValue(":X", $plot->X, SQLITE3_INTEGER); + $stmt->bindValue(":Z", $plot->Z, SQLITE3_INTEGER); + } + $stmt->bindValue(":name", $plot->name, SQLITE3_TEXT); + $stmt->bindValue(":owner", $plot->owner, SQLITE3_TEXT); + $stmt->bindValue(":helpers", $helpers, SQLITE3_TEXT); + $stmt->bindValue(":denied", $denied, SQLITE3_TEXT); + $stmt->bindValue(":biome", $plot->biome, SQLITE3_TEXT); + $stmt->bindValue(":pvp", $plot->pvp, SQLITE3_INTEGER); + $stmt->bindValue(":price", $plot->price, SQLITE3_FLOAT); + $stmt->reset(); + $result = $stmt->execute(); + if(!$result instanceof \SQLite3Result) { + return false; + } + $this->cachePlot($plot); + return true; + } + + public function deletePlot(Plot $plot) : bool { + if($plot->isMerged()){ + $settings = MyPlot::getInstance()->getLevelSettings($plot->levelName); + if ($plot->id >= 0) { + $stmt = $this->sqlDisposeMergedPlotById; + $stmt->bindValue(":biome", $plot->biome, SQLITE3_TEXT); + $stmt->bindValue(":pvp", !$settings->restrictPVP, SQLITE3_INTEGER); + $stmt->bindValue(":price", $settings->claimPrice, SQLITE3_FLOAT); + $stmt->bindValue(":id", $plot->id, SQLITE3_INTEGER); + } else { + $stmt = $this->sqlDisposeMergedPlot; + $stmt->bindValue(":pvp", !$settings->restrictPVP, SQLITE3_INTEGER); + $stmt->bindValue(":price", $settings->claimPrice, SQLITE3_FLOAT); + $stmt->bindValue(":level", $plot->levelName, SQLITE3_TEXT); + $stmt->bindValue(":X", $plot->X, SQLITE3_INTEGER); + $stmt->bindValue(":Z", $plot->Z, SQLITE3_INTEGER); + } + $stmt->reset(); + $result = $stmt->execute(); + if(!$result instanceof \SQLite3Result) { + return false; + } + $this->cachePlot($this->getMergeOrigin($plot)); + }else { + if($plot->id >= 0) { + $stmt = $this->sqlRemovePlotById; + $stmt->bindValue(":id", $plot->id, SQLITE3_INTEGER); + }else{ + $stmt = $this->sqlRemovePlot; + $stmt->bindValue(":level", $plot->levelName, SQLITE3_TEXT); + $stmt->bindValue(":X", $plot->X, SQLITE3_INTEGER); + $stmt->bindValue(":Z", $plot->Z, SQLITE3_INTEGER); + } + $stmt->reset(); + $result = $stmt->execute(); + if(!$result instanceof \SQLite3Result) { + return false; + } + $plot = new Plot($plot->levelName, $plot->X, $plot->Z); + $this->cachePlot($plot); + } + return true; + } + + public function getPlot(string $levelName, int $X, int $Z) : Plot { + if(($plot = $this->getPlotFromCache($levelName, $X, $Z)) !== null) { + return $plot; + } + $this->sqlGetPlot->bindValue(":level", $levelName, SQLITE3_TEXT); + $this->sqlGetPlot->bindValue(":X", $X, SQLITE3_INTEGER); + $this->sqlGetPlot->bindValue(":Z", $Z, SQLITE3_INTEGER); + $this->sqlGetPlot->reset(); + $result = $this->sqlGetPlot->execute(); + if($result !== false and ($val = $result->fetchArray(SQLITE3_ASSOC)) !== false) { + if($val["helpers"] === null or $val["helpers"] === "") { + $helpers = []; + }else{ + $helpers = explode(",", (string) $val["helpers"]); + } + if($val["denied"] === null or $val["denied"] === "") { + $denied = []; + }else{ + $denied = explode(",", (string) $val["denied"]); + } + $pvp = is_numeric($val["pvp"]) ? (bool)$val["pvp"] : null; + $plot = new Plot($levelName, $X, $Z, (string) $val["name"], (string) $val["owner"], $helpers, $denied, (string) $val["biome"], $pvp, (float) $val["price"], (int) $val["id"]); + }else{ + $plot = new Plot($levelName, $X, $Z); + } + $this->cachePlot($plot); + return $plot; + } + + /** + * @param string $owner + * @param string $levelName + * + * @return Plot[] + */ + public function getPlotsByOwner(string $owner, string $levelName = "") : array { + if($levelName === "") { + $stmt = $this->sqlGetPlotsByOwner; + }else{ + $stmt = $this->sqlGetPlotsByOwnerAndLevel; + $stmt->bindValue(":level", $levelName, SQLITE3_TEXT); + } + $stmt->bindValue(":owner", $owner, SQLITE3_TEXT); + $plots = []; + $stmt->reset(); + $result = $stmt->execute(); + while($result !== false and ($val = $result->fetchArray(SQLITE3_ASSOC)) !== false) { + $helpers = explode(",", (string) $val["helpers"]); + $denied = explode(",", (string) $val["denied"]); + $pvp = is_numeric($val["pvp"]) ? (bool)$val["pvp"] : null; + $plots[] = new Plot((string) $val["level"], (int) $val["X"], (int) $val["Z"], (string) $val["name"], (string) $val["owner"], $helpers, $denied, (string) $val["biome"], $pvp, (float) $val["price"], (int) $val["id"]); + } + // Remove unloaded plots + $plots = array_filter($plots, function(Plot $plot) : bool { + return $this->plugin->isLevelLoaded($plot->levelName); + }); + // Sort plots by level + usort($plots, function(Plot $plot1, Plot $plot2) : int { + return strcmp($plot1->levelName, $plot2->levelName); + }); + return $plots; + } + + public function getNextFreePlot(string $levelName, int $limitXZ = 0) : ?Plot { + $this->sqlGetExistingXZ->bindValue(":level", $levelName, SQLITE3_TEXT); + $i = 0; + $this->sqlGetExistingXZ->bindParam(":number", $i, SQLITE3_INTEGER); + for(; $limitXZ <= 0 or $i < $limitXZ; $i++) { + $this->sqlGetExistingXZ->reset(); + $result = $this->sqlGetExistingXZ->execute(); + $plots = []; + while($result !== false and ($val = $result->fetchArray(SQLITE3_NUM)) !== false) { + $plots[$val[0]][$val[1]] = true; + } + if(count($plots) === max(1, 8 * $i)) { + continue; + } + if(($ret = self::findEmptyPlotSquared(0, $i, $plots)) !== null) { + [$X, $Z] = $ret; + $plot = new Plot($levelName, $X, $Z); + $this->cachePlot($plot); + return $plot; + } + for($a = 1; $a < $i; $a++) { + if(($ret = self::findEmptyPlotSquared($a, $i, $plots)) !== null) { + [$X, $Z] = $ret; + $plot = new Plot($levelName, $X, $Z); + $this->cachePlot($plot); + return $plot; + } + } + if(($ret = self::findEmptyPlotSquared($i, $i, $plots)) !== null) { + [$X, $Z] = $ret; + $plot = new Plot($levelName, $X, $Z); + $this->cachePlot($plot); + return $plot; + } + } + return null; + } + + public function close() : void { + $this->db->close(); + $this->plugin->getLogger()->debug("SQLite database closed!"); + } + + public function mergePlots(Plot $base, Plot ...$plots) : bool { + $stmt = $this->sqlMergePlot; + $ret = true; + foreach($plots as $plot) { + $stmt->bindValue(":originId", $base->id); + $stmt->bindValue(":mergedId", $plot->id); + $stmt->reset(); + $result = $stmt->execute(); + if(!$result instanceof \SQLite3Result) { + MyPlot::getInstance()->getLogger()->debug("Failed to merge plot id ".$plot->id." into ".$base->id); + $ret = false; + continue; + } + } + return $ret; + } + + /** + * @param Plot $plot + * @param bool $adjacent + * + * @return Plot[] + */ + public function getMergedPlots(Plot $plot, bool $adjacent = false) : array { + $origin = $this->getMergeOrigin($plot); + $stmt = $this->sqlGetMergedPlots; + $stmt->bindValue(":originId", $origin->id); + $stmt->reset(); + $result = $stmt->execute(); + $plots = [$origin]; + while($result !== false and $val = $result->fetchArray(SQLITE3_ASSOC)) { + $helpers = explode(",", (string) $val["helpers"]); + $denied = explode(",", (string) $val["denied"]); + $pvp = is_numeric($val["pvp"]) ? (bool)$val["pvp"] : null; + $plots[] = new Plot((string) $val["level"], (int) $val["X"], (int) $val["Z"], (string) $val["name"], (string) $val["owner"], $helpers, $denied, (string) $val["biome"], $pvp, (float) $val["price"], (int) $val["id"]); + } + if($adjacent) + $plots = array_filter($plots, function(Plot $val) use ($plot) : bool { + for($i = Facing::NORTH; $i <= Facing::EAST; ++$i) { + if($plot->getSide($i)->isSame($val)) + return true; + } + return false; + }); + return $plots; + } + + /** + * @param Plot $plot + * + * @return Plot + */ + public function getMergeOrigin(Plot $plot) : Plot { + $stmt = $this->sqlGetMergeOrigin; + $stmt->bindValue(":mergedId", $plot->id); + $stmt->reset(); + $result = $stmt->execute(); + if(!$result instanceof \SQLite3Result) { + return $plot; + } + if($val = $result->fetchArray(SQLITE3_ASSOC)) { + $helpers = explode(",", (string) $val["helpers"]); + $denied = explode(",", (string) $val["denied"]); + $pvp = is_numeric($val["pvp"]) ? (bool)$val["pvp"] : null; + return new Plot((string) $val["level"], (int) $val["X"], (int) $val["Z"], (string) $val["name"], (string) $val["owner"], $helpers, $denied, (string) $val["biome"], $pvp, (float) $val["price"], (int) $val["id"]); + } + return $plot; + } } \ No newline at end of file diff --git a/src/MyPlot/provider/YAMLDataProvider.php b/src/MyPlot/provider/YAMLDataProvider.php index b7a069b0..8b234d7a 100644 --- a/src/MyPlot/provider/YAMLDataProvider.php +++ b/src/MyPlot/provider/YAMLDataProvider.php @@ -1,263 +1,263 @@ -plugin->getDataFolder() . "Data"); - $this->yaml = new Config($this->plugin->getDataFolder() . "Data" . DIRECTORY_SEPARATOR . "plots.yml", Config::YAML, ["count" => -1, "plots" => []]); - - foreach($this->yaml->get("plots", []) as $key => $plot){ - $biome = $plot["biome"]; - $plot["biome"] = $biome === "SWAMP" ? "SWAMPLAND" : ($biome === "MOUNTAINS" ? "EXTREME_HILLS" : $biome); - $this->yaml->setNested("plots.$key", $plot); - $this->yaml->save(); - } - } - - public function savePlot(Plot $plot) : bool { - $plots = $this->yaml->get("plots", []); - if($plot->id > -1) { - $plots[$plot->id] = ["level" => $plot->levelName, "x" => $plot->X, "z" => $plot->Z, "name" => $plot->name, "owner" => $plot->owner, "helpers" => $plot->helpers, "denied" => $plot->denied, "biome" => $plot->biome, "pvp" => $plot->pvp, "price" => $plot->price]; - }else{ - $id = $this->yaml->get("count", 0) + 1; - $plot->id = $id; - $plots[$id] = ["level" => $plot->levelName, "x" => $plot->X, "z" => $plot->Z, "name" => $plot->name, "owner" => $plot->owner, "helpers" => $plot->helpers, "denied" => $plot->denied, "biome" => $plot->biome, "pvp" => $plot->pvp, "price" => $plot->price]; - $this->yaml->set("count", $id); - } - $this->yaml->set("plots", $plots); - $this->cachePlot($plot); - $this->yaml->save(); - return true; - } - - public function deletePlot(Plot $plot) : bool { - $plots = $this->yaml->get("plots", []); - unset($plots[$plot->id]); - $this->yaml->set("plots", $plots); - $plot = new Plot($plot->levelName, $plot->X, $plot->Z); - $this->cachePlot($plot); - $this->yaml->save(); - return true; - } - - public function getPlot(string $levelName, int $X, int $Z) : Plot { - if(($plot = $this->getPlotFromCache($levelName, $X, $Z)) !== null) { - return $plot; - } - $plots = $this->yaml->get("plots", []); - $levelKeys = $xKeys = $zKeys = []; - foreach($plots as $key => $plotData) { - if($plotData["level"] === $levelName) - $levelKeys[] = $key; - if($plotData["x"] === $X) - $xKeys[] = $key; - if($plotData["z"] === $Z) - $zKeys[] = $key; - } - /** @var int|null $key */ - $key = null; - foreach($levelKeys as $levelKey) { - foreach($xKeys as $xKey) { - foreach($zKeys as $zKey) { - if($zKey == $xKey and $xKey == $levelKey and $zKey == $levelKey) { - $key = $levelKey; - break 3; - } - } - } - } - if(is_int($key)) { - $plotName = (string)$plots[$key]["name"]; - $owner = (string)$plots[$key]["owner"]; - $helpers = (array)$plots[$key]["helpers"]; - $denied = (array)$plots[$key]["denied"]; - $biome = strtoupper($plots[$key]["biome"]); - $pvp = (bool)$plots[$key]["pvp"]; - $price = (float)$plots[$key]["price"]; - return new Plot($levelName, $X, $Z, $plotName, $owner, $helpers, $denied, $biome, $pvp, $price, $key); - } - return new Plot($levelName, $X, $Z); - } - - /** - * @param string $owner - * @param string $levelName - * - * @return Plot[] - */ - public function getPlotsByOwner(string $owner, string $levelName = "") : array { - $plots = $this->yaml->get("plots", []); - $ownerPlots = []; - if($levelName != "") { - /** @var int[] $levelKeys */ - $levelKeys = array_keys($plots, $levelName, true); - $ownerKeys = array_keys($plots, $owner, true); - foreach($levelKeys as $levelKey) { - foreach($ownerKeys as $ownerKey) { - if($levelKey == $ownerKey) { - $X = $plots[$levelKey]["x"]; - $Z = $plots[$levelKey]["z"]; - $plotName = $plots[$levelKey]["name"] == "" ? "" : $plots[$levelKey]["name"]; - $owner = $plots[$levelKey]["owner"] == "" ? "" : $plots[$levelKey]["owner"]; - $helpers = $plots[$levelKey]["helpers"] == [] ? [] : $plots[$levelKey]["helpers"]; - $denied = $plots[$levelKey]["denied"] == [] ? [] : $plots[$levelKey]["denied"]; - $biome = strtoupper($plots[$levelKey]["biome"]) == "PLAINS" ? "PLAINS" : strtoupper($plots[$levelKey]["biome"]); - $pvp = $plots[$levelKey]["pvp"] == null ? false : $plots[$levelKey]["pvp"]; - $price = $plots[$levelKey]["price"] == null ? 0 : $plots[$levelKey]["price"]; - $ownerPlots[] = new Plot($levelName, $X, $Z, $plotName, $owner, $helpers, $denied, $biome, $pvp, $price, $levelKey); - } - } - } - }else{ - /** @var int[] $ownerKeys */ - $ownerKeys = array_keys($plots, $owner, true); - foreach($ownerKeys as $key) { - $levelName = $plots[$key]["level"]; - $X = $plots[$key]["x"]; - $Z = $plots[$key]["z"]; - $plotName = $plots[$key]["name"] == "" ? "" : $plots[$key]["name"]; - $owner = $plots[$key]["owner"] == "" ? "" : $plots[$key]["owner"]; - $helpers = $plots[$key]["helpers"] == [] ? [] : $plots[$key]["helpers"]; - $denied = $plots[$key]["denied"] == [] ? [] : $plots[$key]["denied"]; - $biome = strtoupper($plots[$key]["biome"]) == "PLAINS" ? "PLAINS" : strtoupper($plots[$key]["biome"]); - $pvp = $plots[$key]["pvp"] == null ? false : $plots[$key]["pvp"]; - $price = $plots[$key]["price"] == null ? 0 : $plots[$key]["price"]; - $ownerPlots[] = new Plot($levelName, $X, $Z, $plotName, $owner, $helpers, $denied, $biome, $pvp, $price, $key); - } - } - return $ownerPlots; - } - - public function getNextFreePlot(string $levelName, int $limitXZ = 0) : ?plot { - $plotsArr = $this->yaml->get("plots", []); - for($i = 0; $limitXZ <= 0 or $i < $limitXZ; $i++) { - $existing = []; - foreach($plotsArr as $id => $data) { - if($data["level"] === $levelName) { - if(abs($data["x"]) === $i and abs($data["z"]) <= $i) { - $existing[] = [$data["x"], $data["z"]]; - }elseif(abs($data["z"]) === $i and abs($data["x"]) <= $i) { - $existing[] = [$data["x"], $data["z"]]; - } - } - } - $plots = []; - foreach($existing as $arr) { - $plots[$arr[0]][$arr[1]] = true; - } - if(count($plots) === max(1, 8 * $i)) { - continue; - } - if(($ret = self::findEmptyPlotSquared(0, $i, $plots)) !== null) { - [$X, $Z] = $ret; - $plot = new Plot($levelName, $X, $Z); - $this->cachePlot($plot); - return $plot; - } - for($a = 1; $a < $i; $a++) { - if(($ret = self::findEmptyPlotSquared($a, $i, $plots)) !== null) { - [$X, $Z] = $ret; - $plot = new Plot($levelName, $X, $Z); - $this->cachePlot($plot); - return $plot; - } - } - if(($ret = self::findEmptyPlotSquared($i, $i, $plots)) !== null) { - [$X, $Z] = $ret; - $plot = new Plot($levelName, $X, $Z); - $this->cachePlot($plot); - return $plot; - } - } - return null; - } - - public function mergePlots(Plot $base, Plot ...$plots) : bool { - $originId = $base->id; - $mergedIds = $this->yaml->getNested("merges.$originId", []); - $mergedIds = array_merge($mergedIds, array_map(function(Plot $val) { - return $val->id; - }, $plots)); - $mergedIds = array_unique($mergedIds, SORT_NUMERIC); - $this->yaml->setNested("merges.$originId", $mergedIds); - $this->yaml->save(); - return true; - } - - public function getMergedPlots(Plot $plot, bool $adjacent = false) : array { - $originId = $plot->id; - $mergedIds = $this->yaml->getNested("merges.$originId", []); - $plotDatums = $this->yaml->get("plots", []); - $plots = [$plot]; - foreach($mergedIds as $mergedId) { - if(!isset($plotDatums[$mergedIds])) - continue; - $levelName = $plotDatums[$mergedId]["level"]; - $X = $plotDatums[$mergedId]["x"]; - $Z = $plotDatums[$mergedId]["z"]; - $plotName = $plotDatums[$mergedId]["name"] == "" ? "" : $plotDatums[$mergedId]["name"]; - $owner = $plotDatums[$mergedId]["owner"] == "" ? "" : $plotDatums[$mergedId]["owner"]; - $helpers = $plotDatums[$mergedId]["helpers"] == [] ? [] : $plotDatums[$mergedId]["helpers"]; - $denied = $plotDatums[$mergedId]["denied"] == [] ? [] : $plotDatums[$mergedId]["denied"]; - $biome = strtoupper($plotDatums[$mergedId]["biome"]) == "PLAINS" ? "PLAINS" : strtoupper($plotDatums[$mergedId]["biome"]); - $pvp = $plotDatums[$mergedId]["pvp"] == null ? false : $plotDatums[$mergedId]["pvp"]; - $price = $plotDatums[$mergedId]["price"] == null ? 0 : $plotDatums[$mergedId]["price"]; - $plots[] = new Plot($levelName, $X, $Z, $plotName, $owner, $helpers, $denied, $biome, $pvp, $price, $mergedId); - } - if($adjacent) - $plots = array_filter($plots, function(Plot $val) use ($plot) { - for($i = Facing::NORTH; $i <= Facing::EAST; ++$i) { - if($plot->getSide($i)->isSame($val)) - return true; - } - return false; - }); - return $plots; - } - - public function getMergeOrigin(Plot $plot) : Plot { - $allMerges = $this->yaml->get("merges", []); - if(isset($allMerges[$plot->id])) - return $plot; - $originId = array_search($plot->id, $allMerges); - if($originId === false) - return $plot; - $plotDatums = $this->yaml->get("plots", []); - if(isset($plotDatums[$originId])) { - $levelName = $plotDatums[$originId]["level"]; - $X = $plotDatums[$originId]["x"]; - $Z = $plotDatums[$originId]["z"]; - $plotName = $plotDatums[$originId]["name"] == "" ? "" : $plotDatums[$originId]["name"]; - $owner = $plotDatums[$originId]["owner"] == "" ? "" : $plotDatums[$originId]["owner"]; - $helpers = $plotDatums[$originId]["helpers"] == [] ? [] : $plotDatums[$originId]["helpers"]; - $denied = $plotDatums[$originId]["denied"] == [] ? [] : $plotDatums[$originId]["denied"]; - $biome = strtoupper($plotDatums[$originId]["biome"]) == "PLAINS" ? "PLAINS" : strtoupper($plotDatums[$originId]["biome"]); - $pvp = $plotDatums[$originId]["pvp"] == null ? false : $plotDatums[$originId]["pvp"]; - $price = $plotDatums[$originId]["price"] == null ? 0 : $plotDatums[$originId]["price"]; - return new Plot($levelName, $X, $Z, $plotName, $owner, $helpers, $denied, $biome, $pvp, $price, $originId); - } - return $plot; - } - - public function close() : void { - unset($this->yaml); - } +plugin->getDataFolder() . "Data"); + $this->yaml = new Config($this->plugin->getDataFolder() . "Data" . DIRECTORY_SEPARATOR . "plots.yml", Config::YAML, ["count" => -1, "plots" => []]); + + foreach($this->yaml->get("plots", []) as $key => $plot){ + $biome = $plot["biome"]; + $plot["biome"] = $biome === "SWAMP" ? "SWAMPLAND" : ($biome === "MOUNTAINS" ? "EXTREME_HILLS" : $biome); + $this->yaml->setNested("plots.$key", $plot); + $this->yaml->save(); + } + } + + public function savePlot(Plot $plot) : bool { + $plots = $this->yaml->get("plots", []); + if($plot->id > -1) { + $plots[$plot->id] = ["level" => $plot->levelName, "x" => $plot->X, "z" => $plot->Z, "name" => $plot->name, "owner" => $plot->owner, "helpers" => $plot->helpers, "denied" => $plot->denied, "biome" => $plot->biome, "pvp" => $plot->pvp, "price" => $plot->price]; + }else{ + $id = $this->yaml->get("count", 0) + 1; + $plot->id = $id; + $plots[$id] = ["level" => $plot->levelName, "x" => $plot->X, "z" => $plot->Z, "name" => $plot->name, "owner" => $plot->owner, "helpers" => $plot->helpers, "denied" => $plot->denied, "biome" => $plot->biome, "pvp" => $plot->pvp, "price" => $plot->price]; + $this->yaml->set("count", $id); + } + $this->yaml->set("plots", $plots); + $this->cachePlot($plot); + $this->yaml->save(); + return true; + } + + public function deletePlot(Plot $plot) : bool { + $plots = $this->yaml->get("plots", []); + unset($plots[$plot->id]); + $this->yaml->set("plots", $plots); + $plot = new Plot($plot->levelName, $plot->X, $plot->Z); + $this->cachePlot($plot); + $this->yaml->save(); + return true; + } + + public function getPlot(string $levelName, int $X, int $Z) : Plot { + if(($plot = $this->getPlotFromCache($levelName, $X, $Z)) !== null) { + return $plot; + } + $plots = $this->yaml->get("plots", []); + $levelKeys = $xKeys = $zKeys = []; + foreach($plots as $key => $plotData) { + if($plotData["level"] === $levelName) + $levelKeys[] = $key; + if($plotData["x"] === $X) + $xKeys[] = $key; + if($plotData["z"] === $Z) + $zKeys[] = $key; + } + /** @var int|null $key */ + $key = null; + foreach($levelKeys as $levelKey) { + foreach($xKeys as $xKey) { + foreach($zKeys as $zKey) { + if($zKey == $xKey and $xKey == $levelKey and $zKey == $levelKey) { + $key = $levelKey; + break 3; + } + } + } + } + if(is_int($key)) { + $plotName = (string)$plots[$key]["name"]; + $owner = (string)$plots[$key]["owner"]; + $helpers = (array)$plots[$key]["helpers"]; + $denied = (array)$plots[$key]["denied"]; + $biome = strtoupper($plots[$key]["biome"]); + $pvp = (bool)$plots[$key]["pvp"]; + $price = (float)$plots[$key]["price"]; + return new Plot($levelName, $X, $Z, $plotName, $owner, $helpers, $denied, $biome, $pvp, $price, $key); + } + return new Plot($levelName, $X, $Z); + } + + /** + * @param string $owner + * @param string $levelName + * + * @return Plot[] + */ + public function getPlotsByOwner(string $owner, string $levelName = "") : array { + $plots = $this->yaml->get("plots", []); + $ownerPlots = []; + if($levelName != "") { + /** @var int[] $levelKeys */ + $levelKeys = array_keys($plots, $levelName, true); + $ownerKeys = array_keys($plots, $owner, true); + foreach($levelKeys as $levelKey) { + foreach($ownerKeys as $ownerKey) { + if($levelKey == $ownerKey) { + $X = $plots[$levelKey]["x"]; + $Z = $plots[$levelKey]["z"]; + $plotName = $plots[$levelKey]["name"] == "" ? "" : $plots[$levelKey]["name"]; + $owner = $plots[$levelKey]["owner"] == "" ? "" : $plots[$levelKey]["owner"]; + $helpers = $plots[$levelKey]["helpers"] == [] ? [] : $plots[$levelKey]["helpers"]; + $denied = $plots[$levelKey]["denied"] == [] ? [] : $plots[$levelKey]["denied"]; + $biome = strtoupper($plots[$levelKey]["biome"]) == "PLAINS" ? "PLAINS" : strtoupper($plots[$levelKey]["biome"]); + $pvp = $plots[$levelKey]["pvp"] == null ? false : $plots[$levelKey]["pvp"]; + $price = $plots[$levelKey]["price"] == null ? 0 : $plots[$levelKey]["price"]; + $ownerPlots[] = new Plot($levelName, $X, $Z, $plotName, $owner, $helpers, $denied, $biome, $pvp, $price, $levelKey); + } + } + } + }else{ + /** @var int[] $ownerKeys */ + $ownerKeys = array_keys($plots, $owner, true); + foreach($ownerKeys as $key) { + $levelName = $plots[$key]["level"]; + $X = $plots[$key]["x"]; + $Z = $plots[$key]["z"]; + $plotName = $plots[$key]["name"] == "" ? "" : $plots[$key]["name"]; + $owner = $plots[$key]["owner"] == "" ? "" : $plots[$key]["owner"]; + $helpers = $plots[$key]["helpers"] == [] ? [] : $plots[$key]["helpers"]; + $denied = $plots[$key]["denied"] == [] ? [] : $plots[$key]["denied"]; + $biome = strtoupper($plots[$key]["biome"]) == "PLAINS" ? "PLAINS" : strtoupper($plots[$key]["biome"]); + $pvp = $plots[$key]["pvp"] == null ? false : $plots[$key]["pvp"]; + $price = $plots[$key]["price"] == null ? 0 : $plots[$key]["price"]; + $ownerPlots[] = new Plot($levelName, $X, $Z, $plotName, $owner, $helpers, $denied, $biome, $pvp, $price, $key); + } + } + return $ownerPlots; + } + + public function getNextFreePlot(string $levelName, int $limitXZ = 0) : ?plot { + $plotsArr = $this->yaml->get("plots", []); + for($i = 0; $limitXZ <= 0 or $i < $limitXZ; $i++) { + $existing = []; + foreach($plotsArr as $id => $data) { + if($data["level"] === $levelName) { + if(abs($data["x"]) === $i and abs($data["z"]) <= $i) { + $existing[] = [$data["x"], $data["z"]]; + }elseif(abs($data["z"]) === $i and abs($data["x"]) <= $i) { + $existing[] = [$data["x"], $data["z"]]; + } + } + } + $plots = []; + foreach($existing as $arr) { + $plots[$arr[0]][$arr[1]] = true; + } + if(count($plots) === max(1, 8 * $i)) { + continue; + } + if(($ret = self::findEmptyPlotSquared(0, $i, $plots)) !== null) { + [$X, $Z] = $ret; + $plot = new Plot($levelName, $X, $Z); + $this->cachePlot($plot); + return $plot; + } + for($a = 1; $a < $i; $a++) { + if(($ret = self::findEmptyPlotSquared($a, $i, $plots)) !== null) { + [$X, $Z] = $ret; + $plot = new Plot($levelName, $X, $Z); + $this->cachePlot($plot); + return $plot; + } + } + if(($ret = self::findEmptyPlotSquared($i, $i, $plots)) !== null) { + [$X, $Z] = $ret; + $plot = new Plot($levelName, $X, $Z); + $this->cachePlot($plot); + return $plot; + } + } + return null; + } + + public function mergePlots(Plot $base, Plot ...$plots) : bool { + $originId = $base->id; + $mergedIds = $this->yaml->getNested("merges.$originId", []); + $mergedIds = array_merge($mergedIds, array_map(function(Plot $val) { + return $val->id; + }, $plots)); + $mergedIds = array_unique($mergedIds, SORT_NUMERIC); + $this->yaml->setNested("merges.$originId", $mergedIds); + $this->yaml->save(); + return true; + } + + public function getMergedPlots(Plot $plot, bool $adjacent = false) : array { + $originId = $plot->id; + $mergedIds = $this->yaml->getNested("merges.$originId", []); + $plotDatums = $this->yaml->get("plots", []); + $plots = [$plot]; + foreach($mergedIds as $mergedId) { + if(!isset($plotDatums[$mergedIds])) + continue; + $levelName = $plotDatums[$mergedId]["level"]; + $X = $plotDatums[$mergedId]["x"]; + $Z = $plotDatums[$mergedId]["z"]; + $plotName = $plotDatums[$mergedId]["name"] == "" ? "" : $plotDatums[$mergedId]["name"]; + $owner = $plotDatums[$mergedId]["owner"] == "" ? "" : $plotDatums[$mergedId]["owner"]; + $helpers = $plotDatums[$mergedId]["helpers"] == [] ? [] : $plotDatums[$mergedId]["helpers"]; + $denied = $plotDatums[$mergedId]["denied"] == [] ? [] : $plotDatums[$mergedId]["denied"]; + $biome = strtoupper($plotDatums[$mergedId]["biome"]) == "PLAINS" ? "PLAINS" : strtoupper($plotDatums[$mergedId]["biome"]); + $pvp = $plotDatums[$mergedId]["pvp"] == null ? false : $plotDatums[$mergedId]["pvp"]; + $price = $plotDatums[$mergedId]["price"] == null ? 0 : $plotDatums[$mergedId]["price"]; + $plots[] = new Plot($levelName, $X, $Z, $plotName, $owner, $helpers, $denied, $biome, $pvp, $price, $mergedId); + } + if($adjacent) + $plots = array_filter($plots, function(Plot $val) use ($plot) { + for($i = Facing::NORTH; $i <= Facing::EAST; ++$i) { + if($plot->getSide($i)->isSame($val)) + return true; + } + return false; + }); + return $plots; + } + + public function getMergeOrigin(Plot $plot) : Plot { + $allMerges = $this->yaml->get("merges", []); + if(isset($allMerges[$plot->id])) + return $plot; + $originId = array_search($plot->id, $allMerges); + if($originId === false) + return $plot; + $plotDatums = $this->yaml->get("plots", []); + if(isset($plotDatums[$originId])) { + $levelName = $plotDatums[$originId]["level"]; + $X = $plotDatums[$originId]["x"]; + $Z = $plotDatums[$originId]["z"]; + $plotName = $plotDatums[$originId]["name"] == "" ? "" : $plotDatums[$originId]["name"]; + $owner = $plotDatums[$originId]["owner"] == "" ? "" : $plotDatums[$originId]["owner"]; + $helpers = $plotDatums[$originId]["helpers"] == [] ? [] : $plotDatums[$originId]["helpers"]; + $denied = $plotDatums[$originId]["denied"] == [] ? [] : $plotDatums[$originId]["denied"]; + $biome = strtoupper($plotDatums[$originId]["biome"]) == "PLAINS" ? "PLAINS" : strtoupper($plotDatums[$originId]["biome"]); + $pvp = $plotDatums[$originId]["pvp"] == null ? false : $plotDatums[$originId]["pvp"]; + $price = $plotDatums[$originId]["price"] == null ? 0 : $plotDatums[$originId]["price"]; + return new Plot($levelName, $X, $Z, $plotName, $owner, $helpers, $denied, $biome, $pvp, $price, $originId); + } + return $plot; + } + + public function close() : void { + unset($this->yaml); + } } \ No newline at end of file From 323836f23b8938047ed0fa81aad822ef73b1ba09 Mon Sep 17 00:00:00 2001 From: xXNiceYT <23722462+xXNiceYT@users.noreply.github.com> Date: Wed, 4 Aug 2021 11:11:35 -0400 Subject: [PATCH 5/5] Finally Fixed Space --- src/MyPlot/provider/JSONDataProvider.php | 10 +++++----- src/MyPlot/provider/MySQLProvider.php | 4 ++-- src/MyPlot/provider/YAMLDataProvider.php | 10 +++++----- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/MyPlot/provider/JSONDataProvider.php b/src/MyPlot/provider/JSONDataProvider.php index 9d263d22..8d2f5e57 100644 --- a/src/MyPlot/provider/JSONDataProvider.php +++ b/src/MyPlot/provider/JSONDataProvider.php @@ -25,11 +25,11 @@ public function __construct(MyPlot $plugin, int $cacheSize = 0) { $this->json = new Config($this->plugin->getDataFolder() . "Data" . DIRECTORY_SEPARATOR . "plots.yml", Config::JSON, ["count" => -1, "plots" => []]); foreach($this->json->get("plots", []) as $key => $plot){ - $biome = $plot["biome"]; - $plot["biome"] = $biome === "SWAMP" ? "SWAMPLAND" : ($biome === "MOUNTAINS" ? "EXTREME_HILLS" : $biome); - $this->json->setNested("plots.$key", $plot); - $this->json->save(); - } + $biome = $plot["biome"]; + $plot["biome"] = $biome === "SWAMP" ? "SWAMPLAND" : ($biome === "MOUNTAINS" ? "EXTREME_HILLS" : $biome); + $this->json->setNested("plots.$key", $plot); + $this->json->save(); + } } public function savePlot(Plot $plot) : bool { diff --git a/src/MyPlot/provider/MySQLProvider.php b/src/MyPlot/provider/MySQLProvider.php index 75d8fb2e..6140966f 100644 --- a/src/MyPlot/provider/MySQLProvider.php +++ b/src/MyPlot/provider/MySQLProvider.php @@ -67,8 +67,8 @@ public function __construct(MyPlot $plugin, int $cacheSize = 0, array $settings $this->db->query("ALTER TABLE plots ADD COLUMN price FLOAT AFTER pvp;"); }catch(\Exception $e) {} $this->prepare(); - $this->db->query("UPDATE plots SET biome = 'SWAMPLAND' WHERE biome = 'SWAMP';"); - $this->db->query("UPDATE plots SET biome = 'EXTREME_HILLS' WHERE biome = 'MOUNTAINS';"); + $this->db->query("UPDATE plots SET biome = 'SWAMPLAND' WHERE biome = 'SWAMP';"); + $this->db->query("UPDATE plots SET biome = 'EXTREME_HILLS' WHERE biome = 'MOUNTAINS';"); $this->plugin->getLogger()->debug("MySQL data provider registered"); } diff --git a/src/MyPlot/provider/YAMLDataProvider.php b/src/MyPlot/provider/YAMLDataProvider.php index 8b234d7a..cd4e76f6 100644 --- a/src/MyPlot/provider/YAMLDataProvider.php +++ b/src/MyPlot/provider/YAMLDataProvider.php @@ -25,11 +25,11 @@ public function __construct(MyPlot $plugin, int $cacheSize = 0) { $this->yaml = new Config($this->plugin->getDataFolder() . "Data" . DIRECTORY_SEPARATOR . "plots.yml", Config::YAML, ["count" => -1, "plots" => []]); foreach($this->yaml->get("plots", []) as $key => $plot){ - $biome = $plot["biome"]; - $plot["biome"] = $biome === "SWAMP" ? "SWAMPLAND" : ($biome === "MOUNTAINS" ? "EXTREME_HILLS" : $biome); - $this->yaml->setNested("plots.$key", $plot); - $this->yaml->save(); - } + $biome = $plot["biome"]; + $plot["biome"] = $biome === "SWAMP" ? "SWAMPLAND" : ($biome === "MOUNTAINS" ? "EXTREME_HILLS" : $biome); + $this->yaml->setNested("plots.$key", $plot); + $this->yaml->save(); + } } public function savePlot(Plot $plot) : bool {