решено 10100101010101010110101
10101010101010101010010100101
если что экономика стоит, все ок
так проблема не в плагине “скупщик”, а в “EconomyAPI”
Значит плагин не загружен на сервер
И getPlugin() вернул пустоту
Тогда плагин отключился бы там же проаерка стоит
Тогда по какой причине появляется попытка вызова addMoney() у null?
плагина нету, чекни название в plugin.yml, его и пиши в getPlugin()
та не, плагин стоит, все его команды работают, в активных плагинах он отображается
мне кажется я все же тупой ![]()
ибо я использую версию экономики где нет метода addmoney
<?php
namespace onebone\economyapi;
use onebone\economyapi\event\money\MoneyChangedEvent;
use pocketmine\utils\Config;
use pocketmine\utils\TextFormat;
use pocketmine\event\Listener;
use pocketmine\event\player\PlayerLoginEvent;
use pocketmine\event\player\PlayerCommandPreprocessEvent;
use pocketmine\event\server\ServerCommandEvent;
use pocketmine\plugin\PluginBase;
use pocketmine\Player;
use pocketmine\utils\Utils;
use pocketmine\command\CommandSender;
use pocketmine\command\Command;
use onebone\economyapi\event\money\AddMoneyEvent;
use onebone\economyapi\event\money\ReduceMoneyEvent;
use onebone\economyapi\event\money\SetMoneyEvent;
use onebone\economyapi\event\account\CreateAccountEvent;
use onebone\economyapi\database\DataConverter;
use onebone\economyapi\task\SaveTask;
class EconomyAPI extends PluginBase implements Listener{
const API_VERSION = 1;
const PACKAGE_VERSION = "5.6";
private static $instance = null;
private $money = [];
private $config = null;
/**
* @var Config
*/
private $command = null;
/**
* @var array
*/
private $langRes = [];
/**
* @var array
*/
private $playerLang = []; // language system related
/**
* @var string
*/
private $monetaryUnit = "";
/**
* @var int RET_ERROR_1 Unknown error 1
*/
const RET_ERROR_1 = -4;
/**
* @var int RET_ERROR_2 Unknown error 2
*/
const RET_ERROR_2 = -3;
/**
* @var int RET_CANCELLED Task cancelled by event
*/
const RET_CANCELLED = -2;
/**
* @var int RET_NOT_FOUND Unable to process task due to not found data
*/
const RET_NOT_FOUND = -1;
/**
* @var int RET_INVALID Invalid amount of data
*/
const RET_INVALID = 0;
/**
* @var int RET_SUCCESS The task was successful
*/
const RET_SUCCESS = 1;
/**
* @var int CURRENT_DATABASE_VERSION The version of current database
*/
const CURRENT_DATABASE_VERSION = 0x02;
/**
* @var array
*/
private $langList = [
"def" => "Default",
"en" => "English",
"ko" => "한국어",
"it" => "Italiano",
"ch" => "中文",
"id" => "Bahasa Indonesia",
"ru" => "русский",
"ja" => "日本語",
"user-define" => "User Defined"
];
/**
* @return EconomyAPI
*/
public static function getInstance(){
return self::$instance;
}
public function onLoad(){
self::$instance = $this;
}
public function onEnable(){
@mkdir($this->getDataFolder());
$this->createConfig();
$this->scanResources();
file_put_contents($this->getDataFolder() . "ReadMe.txt", $this->readResource("ReadMe.txt"));
if(!is_file($this->getDataFolder() . "PlayerLang.dat")){
file_put_contents($this->getDataFolder() . "PlayerLang.dat", serialize([]));
}
$this->playerLang = unserialize(file_get_contents($this->getDataFolder() . "PlayerLang.dat"));
if(!isset($this->playerLang["console"])){
$this->getLangFile();
}
$commands = [
"setmoney" => "onebone\\economyapi\\commands\\SetMoneyCommand",
"seemoney" => "onebone\\economyapi\\commands\\SeeMoneyCommand",
"mymoney" => "onebone\\economyapi\\commands\\MyMoneyCommand",
"pay" => "onebone\\economyapi\\commands\\PayCommand",
"givemoney" => "onebone\\economyapi\\commands\\GiveMoneyCommand",
];
$commandMap = $this->getServer()->getCommandMap();
foreach($commands as $key => $command){
foreach($this->command->get($key) as $cmd){
$commandMap->register("economyapi", new $command($this, $cmd));
}
}
$this->getServer()->getPluginManager()->registerEvents($this, $this);
$this->convertData();
$moneyConfig = new Config($this->getDataFolder() . "Money.yml", Config::YAML, [
"version" => 2,
"money" => [],
]);
if($moneyConfig->get("version")< self::CURRENT_DATABASE_VERSION){
$converter = new DataConverter($this->getDataFolder() . "Money.yml");
$result = $converter->convertData(self::CURRENT_DATABASE_VERSION);
if($result !== false){
$this->getLogger()->info("Converted data into new database. Database version : ".self::CURRENT_DATABASE_VERSION);
}
$moneyConfig = new Config($this->getDataFolder() . "Money.yml", Config::YAML);
}
$this->money = $moneyConfig->getAll();
$this->monetaryUnit = $this->config->get("monetary-unit");
$time = $this->config->get("auto-save-interval");
if(is_numeric($time)){
$interval = $time * 1200;
$this->getScheduler()->scheduleDelayedRepeatingTask(new SaveTask($this), $interval, $interval);
$this->getLogger()->notice("Auto save has been set to interval : ".$time." min(s)");
}
}
private function convertData(){
$cnt = 0;
if(is_file($this->getDataFolder() . "MoneyData.yml")){
$data = (new Config($this->getDataFolder() . "MoneyData.yml", Config::YAML))->getAll();
$saveData = [];
foreach($data as $player => $money){
$saveData["money"][$player] = round($money["money"], 2);
++$cnt;
}
@unlink($this->getDataFolder() . "MoneyData.yml");
$moneyConfig = new Config($this->getDataFolder() . "Money.yml", Config::YAML);
$moneyConfig->setAll($saveData);
$moneyConfig->save();
}
if($cnt > 0){
$this->getLogger()->info(TextFormat::AQUA."Converted $cnt data(m) into new format");
}
}
private function createConfig(){
$this->config = new Config($this->getDataFolder() . "economy.properties", Config::PROPERTIES, yaml_parse($this->readResource("config.yml")));
$this->command = new Config($this->getDataFolder() . "command.yml", Config::YAML, yaml_parse($this->readResource("command.yml")));
}
private function scanResources(){
foreach($this->getResources() as $resource){
$s = explode(\DIRECTORY_SEPARATOR, $resource);
$res = $s[count($s) - 1];
if(substr($res, 0, 5) === "lang_"){
$this->langRes[substr($res, 5, -5)] = get_object_vars(json_decode($this->readResource($res)));
}
}
$this->langRes["user-define"] = (new Config($this->getDataFolder() . "language.properties", Config::PROPERTIES, $this->langRes["def"]))->getAll();
}
/**
* @param string $key
* @param mixed $default
*
* @return mixed
*/
public function getConfigurationValue($key, $default = false){
if($this->config->exists($key)){
return $this->config->get($key);
}
return $default;
}
/**
* @param string $res
*
* @return bool|string
*/
private function readResource($res){
$resource = $this->getResource($res);
if($resource !== null){
return stream_get_contents($resource);
}
return false;
}
private function getLangFile(){
$lang = $this->config->get("default-lang");
if(isset($this->langRes[$lang])){
$this->playerLang["console"] = $lang;
$this->playerLang["rcon"] = $lang;
$this->getLogger()->info(TextFormat::GREEN.$this->getMessage("language-set", "console", [$this->langList[$lang], "%2", "%3", "%4"]));
}else{
$this->playerLang["console"] = "def";
$this->playerLang["rcon"] = "def";
$this->getLogger()->info(TextFormat::GREEN.$this->getMessage("language-set", "console", [$this->langList[$lang], "%2", "%3", "%4"]));
}
}
/**
* @param string $lang
* @param string $target
*
* @return bool
*/
public function setLang($lang, $target = "console"){
if(isset($this->langRes[$lang])){
$this->playerLang[strtolower($target)] = $lang;
return $lang;
}else{
$lower = strtolower($lang);
foreach($this->langList as $key => $l){
if($lower === strtolower($l)){
$this->playerLang[strtolower($target)] = $key;
return $l;
}
}
}
return false;
}
/**
* @return array
*/
public function getLangList(){
return $this->langList;
}
/**
* @return array
*/
public function getLangResource(){
return $this->langRes;
}
/**
* @param string|Player $player
*
* @return string|boolean
*/
public function getPlayerLang($player){
if($player instanceof Player){
$player = $player->getName();
}
$player = strtolower($player);
if(isset($this->playerLang[$player])){
return $this->playerLang[$player];
}else{
return false;
}
}
/**
* @deprecated
*
* @param Player|string $player
* @param float $amount
* @param bool $force
* @param string $issuer
*
* @return int
*/
public function addDebt($player, $amount, $force = false, $issuer = "external"){
$this->getLogger()->warning("Debt system is now deprecated");
}
/**
* @deprecated
*
* @param Player|string $player
* @param float $amount
* @param bool $force
* @param string $issuer
*
* @return int
*/
public function reduceDebt($player, $amount, $force = false, $issuer = "external"){
$this->getLogger()->warning("Debt system is now deprecated");
}
/**
* @deprecated
*
* @param Player|string $player
* @param float $amount
* @param bool $force
* @param string $issuer
*
* @return int
*/
public function addBankMoney($player, $amount, $force = false, $issuer = "external"){
$this->getLogger()->warning("Bank system is now deprecated.");
}
/**
* @deprecated
*
* @param Player|string $player
* @param float $amount
* @param bool $force
* @param string $issuer
*
* @return int
*/
public function reduceBankMoney($player, $amount, $force = false, $issuer = "external"){
$this->getLogger()->warning("Bank system is now deprecated");
}
/**
* @return array
*/
public function getAllMoney(){
return $this->money;
}
/**
* @deprecated
*
* @return array
*/
public function getAllBankMoney(){
$this->getLogger()->warning("Bank system is now deprecated");
}
/**
* @return string
*/
public function getMonetaryUnit(){
return $this->monetaryUnit;
}
/**
* @param string $key
* @param Player|string $player
* @param array $value
*
* @return string
*/
public function getMessage($key, $player = "console", array $value = ["%1", "%2", "%3", "%4"]){
if($player instanceof Player){
$player = $player->getName();
}
$player = strtolower($player);
if(isset($this->playerLang[$player]) and isset($this->langRes[$this->playerLang[$player]][$key])){
return str_replace(["%MONETARY_UNIT%", "%1", "%2", "%3", "%4"], [$this->monetaryUnit, $value[0], $value[1], $value[2], $value[3]], $this->langRes[$this->playerLang[$player]][$key]);
}elseif(isset($this->langRes["def"][$key])){
return str_replace(["%MONETARY_UNIT%", "%1", "%2", "%3", "%4"], [$this->monetaryUnit, $value[0], $value[1], $value[2], $value[3]], $this->langRes["def"][$key]);
}else{
return "Couldn't find message resource";
}
}
/**
* @param Player|string $player
*
* @return boolean
*/
public function accountExists($player){
if($player instanceof Player){
$player = $player->getName();
}
$player = strtolower($player);
return isset($this->money["money"][$player]) === true;
}
/**
* @param Player|string $player
* @param bool|float $default_money
* @param bool $force
*
* @return boolean
*/
public function createAccount($player, $default_money = false, $force = false){
if($player instanceof Player){
$player = $player->getName();
}
$player = strtolower($player);
if(!isset($this->money["money"][$player])){
$this->getServer()->getPluginManager()->callEvent(($ev = new CreateAccountEvent($this, $player, $default_money, "EconomyAPI")));
if(!$ev->isCancelled() and $force === false){
$this->money["money"][$player] = ($default_money === false ? $this->config->get("default-money") : $default_money);
return true;
}
}
return false;
}
/**
* @param Player|string $player
*
* @return boolean
*/
public function removeAccount($player){
if($player instanceof Player){
$player = $player->getName();
}
$player = strtolower($player);
if(isset($this->money["money"][$player])){
$this->money["money"][$player] = null;
unset($this->money["money"][$player]);
$p = $this->getServer()->getPlayerExact($player);
if($p instanceof Player){
$p->kick("Your account have been removed.");
}
return true;
}
return false;
}
/**
* @deprecated
*
* @param Player|string $player
*
* @return boolean
*/
public function bankAccountExists($player){
$this->getLogger()->warning("Bank system is now deprecated");
}
/**
* @param Player|string $player
*
* @return boolean|float
*/
public function myMoney($player){ // To identify the result, use '===' operator
if($player instanceof Player){
$player = $player->getName();
}
$player = strtolower($player);
if(!isset($this->money["money"][$player])){
return false;
}
return $this->money["money"][$player];
}
/**
* @deprecated
*
* @param Player|string $player
*
* @return boolean|float
*/
public function myDebt($player){ // To identify the result, use '===' operator
$this->getLogger()->warning("Debt system is now deprecated");
}
/**
* @deprecated
*
* @param Player|string $player
*
* @return boolean|float
*/
public function myBankMoney($player){
$this->getLogger()->warning("Bank system is now deprecated");
}
/**
* @param Player|string $player
* @param float $amount
* @param bool $force
* @param string $issuer
*
* @return int
*/
public function addMoney($player, $amount, $force = false, $issuer = "external"){
if($amount <= 0 or !is_numeric($amount)){
return self::RET_INVALID;
}
if($player instanceof Player){
$player = $player->getName();
}
$player = strtolower($player);
$amount = round($amount, 2);
if(isset($this->money["money"][$player])){
$amount = min($this->config->get("max-money"), $amount);
$event = new AddMoneyEvent($this, $player, $amount, $issuer);
$this->getServer()->getPluginManager()->callEvent($event);
if($force === false and $event->isCancelled()){
return self::RET_CANCELLED;
}
$this->money["money"][$player] += $amount;
$this->getServer()->getPluginManager()->callEvent(new MoneyChangedEvent($this, $player, $this->money["money"][$player], $issuer));
return self::RET_SUCCESS;
}else{
return self::RET_NOT_FOUND;
}
}
/**
* @param Player|string $player
* @param float $amount
* @param bool $force
* @param string $issuer
*
* @return int
*/
public function reduceMoney($player, $amount, $force = false, $issuer = "external"){
if($amount <= 0 or !is_numeric($amount)){
return self::RET_INVALID;
}
if($player instanceof Player){
$player = $player->getName();
}
$player = strtolower($player);
$amount = round($amount, 2);
if(isset($this->money["money"][$player])){
if($this->money["money"][$player] - $amount < 0){
return self::RET_INVALID;
}
$event = new ReduceMoneyEvent($this, $player, $amount, $issuer);
$this->getServer()->getPluginManager()->callEvent($event);
if($force === false and $event->isCancelled()){
return self::RET_CANCELLED;
}
$this->money["money"][$player] -= $amount;
$this->getServer()->getPluginManager()->callEvent(new MoneyChangedEvent($this, $player, $this->money["money"][$player], $issuer));
return self::RET_SUCCESS;
}else{
return self::RET_NOT_FOUND;
}
}
/**
* @param Player|string $player
* @param float $money
* @param bool $force
* @param string $issuer
*
* @return int
*/
public function setMoney($player, $money, $force = false, $issuer = "external"){
if($money < 0 or !is_numeric($money)){
return self::RET_INVALID;
}
if($player instanceof Player){
$player = $player->getName();
}
$player = strtolower($player);
$money = round($money, 2);
if(isset($this->money["money"][$player])){
$money = min($this->config->get("max-money"), $money);
$ev = new SetMoneyEvent($this, $player, $money, $issuer);
$this->getServer()->getPluginManager()->callEvent($ev);
if($force === false and $ev->isCancelled()){
return self::RET_CANCELLED;
}
$this->money["money"][$player] = $money;
$this->getServer()->getPluginManager()->callEvent(new MoneyChangedEvent($this, $player, $this->money["money"][$player], $issuer));
return self::RET_SUCCESS;
}else{
return self::RET_NOT_FOUND;
}
}
public function onDisable(){
$this->save();
}
public function save(){
$moneyConfig = new Config($this->getDataFolder() . "Money.yml", Config::YAML);
$moneyConfig->setAll($this->money);
$moneyConfig->save();
file_put_contents($this->getDataFolder() . "PlayerLang.dat", serialize($this->playerLang));
}
/**
* @param PlayerLoginEvent $event
*/
public function onLoginEvent(PlayerLoginEvent $event){
$username = strtolower($event->getPlayer()->getName());
if(!isset($this->money["money"][$username])){
$this->getServer()->getPluginManager()->callEvent(($ev = new CreateAccountEvent($this, $username, $this->config->get("default-money"), $this->config->get("default-debt"), null, "EconomyAPI")));
$this->money["money"][$username] = round($ev->getDefaultMoney(), 2);
}
if(!isset($this->playerLang[$username])){
$this->setLang($this->config->get("default-lang"), $username);
}
}
/**
* @param PlayerCommandPreprocessEvent $event
*/
public function onPlayerCommandPreprocess(PlayerCommandPreprocessEvent $event){
$command = strtolower(substr($event->getMessage(), 0, 9));
if($command === "/save-all"){
$this->onCommandProcess($event->getPlayer());
}
}
/**
* @param ServerCommandEvent $event
*/
public function onServerCommandProcess(ServerCommandEvent $event){
$command = strtolower(substr($event->getCommand(), 0, 8));
if($command === "save-all"){
$this->onCommandProcess($event->getSender());
}
}
public function onCommandProcess(CommandSender $sender){
$command = $this->getServer()->getCommandMap()->getCommand("save-all");
if($command instanceof Command){
if($command->testPermissionSilent($sender)){
$this->save();
$sender->sendMessage("[EconomyAPI] Saved money data.");
}
}
}
/**
* @return string
*/
public function __toString(){
return "EconomyAPI (total accounts: " . count($this->money) . ")";
}
}
можно же вместо него использовать сетмани?
Конечно
не, просто же не будет проблем? а то если не ошибаюсь сетмани ставит конкретный баланс, то есть было у игрока например 10к, выдали ему через сетмани 1к, и у него в конечном счёте этот косарь и остался
Так вот, есть же
А в чем проблема сделать
$economy->setMoney($player, $economy->myMoney($player) + $money);
я только что так и написал, работает ![]()
та там ■■■■
теперь главный вопрос кому галочку то отдать


