Помогите Запись и удаление кординат блока

  • Автор темы Автор темы Jony
  • Дата начала Дата начала

Jony

Ньюби
Баллы
1
Имя в Minecraft
_Jony
Здравствуйте, у меня небольшая проблемка а именно я не знаю как сделать сохранение/удаление кординат блока в конфиг, а конкретнее мой скрипт работал на последний установленный блок
и я не знаю как это можно исправить так чтобы скрипт реагировал на все блоки которые были записаны
Пример:
public void test(BlockPlaceEvent b){
if(p.getBlock().getType() != Material.DIAMOND_BLOCK)return;
String name = b.getPlayer().getName();
this.getConfig().set("Position." + name + ".X", b.getBlock().getX());
this.getConfig().set("Position." + name + ".Y", b.getBlock().getY());
this.getConfig().set("Position." + name + ".Z", b.getBlock().getZ());
saveConfig();
}
или
как сделать такой принцип записывания
Diamonds:
pos1:
x: 600
y: 80
z: -200
pos2:
x: 800
y: 60
z: 900
как-то так, можно ли это сворганить?
и нужно чтобы все корды установленных блоков записывались и после разрушения данного блока удалялись из списка...
Help please 🙂
 
Последнее редактирование:
Ну для начала над методом должно быть @EventHandler у тебя на примере его нет, да и зачем записывать все в конфиг? Не ну... Хозяин-барин, ты сохраняешь по имени игрока String? Уф.... окей, оно будет перезаписываться каждый раз как только ты поставишь блок, следовательно у тебя будет только 3 координаты и все.
 
Дарю.
PHP:
package Example;

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.commons.io.FileUtils;
import org.bukkit.Location;

import com.google.gson.Gson;

public class Saves {
    private Map<String, Save> save = new HashMap<String, Save>();
    private Main plugin;

    Saves(Main plugin) {
        this.plugin = plugin;
    }

    public void add(Location loc, String player) {
        this.getChunk(loc).add(loc, player);
    }

    public void remove(Location loc) {
        this.getChunk(loc).remove(loc);
    }

    public boolean contains(Location loc) {
        return this.getChunk(loc).contains(loc);
    }

    public String get(Location loc) {
        return this.getChunk(loc).get(loc);
    }

    public Save getChunk(Location loc) {
        int ChunkX = loc.getBlockX() >> 4;
        int ChunkZ = loc.getBlockZ() >> 4;
        String s = ChunkX + "." + ChunkZ + ".json";
        if (save.containsKey(s)) {
            return save.get(s);
        } else {
            String str = "{}";
            Gson gson = new Gson();
            try {
                File file = new File(this.plugin.getDataFolder(), s);
                if (!file.exists()) {
                    FileUtils.writeStringToFile(file, new Save().toString(), Charset.defaultCharset());
                }
                str = FileUtils.readFileToString(file, Charset.defaultCharset());
            } catch (IOException e) {
                e.printStackTrace();
            }
            save.put(s, gson.fromJson(str, Save.class));
            return save.get(s);
        }
    }

    public void Save() {
        for (Entry<String, Save> tmp : save.entrySet()) {
            File file = new File(this.plugin.getDataFolder(), tmp.getKey());
            try {
                FileUtils.writeStringToFile(file, tmp.getValue().toString(), Charset.defaultCharset());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
PHP:
package Example;

import java.util.HashMap;
import java.util.Map;

import org.bukkit.Location;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class Save {
    private Map<String, String> locs = new HashMap<String, String>();

    private String convert(Location loc) {
        int x = loc.getBlockX();
        int y = loc.getBlockY();
        int z = loc.getBlockZ();
        int tmpx = x >> 4;
        int tmpx2 = tmpx << 4;
        int tmpz = z >> 4;
        int tmpz2 = tmpz << 4;
        return (x - tmpx2) + "." + y + "." + (z - tmpz2);
    }

    public void add(Location loc, String player) {
        locs.put(convert(loc), player);
    }

    public void remove(Location loc) {
        locs.remove(convert(loc));
    }

    public boolean contains(Location loc) {
        return locs.containsKey(convert(loc));
    }

    public String get(Location loc) {
        if (contains(loc)) {
            return locs.get(convert(loc));
        }
        return null;
    }

    public String toString() {
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        return gson.toJson(this);
    }
}
PHP:
    @Override
    public void onEnable() {
        saves = new Saves(this);
        getServer().getPluginManager().registerEvents(new EventListener(this), this);
    }
   
    @Override
    public void onDisable() {
        saves.Save();
    }
PHP:
package Example;

import org.bukkit.Location;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPlaceEvent;

public class EventListener implements Listener {
    private Main plugin;

    public EventListener(Main instance) {
        this.plugin = instance;
    }
   
    @EventHandler
    public void on(BlockPlaceEvent e) {
        Location loc = e.getBlockPlaced().getLocation();
        this.plugin.saves.add(loc, e.getPlayer().getName());
    }
   
    @EventHandler
    public void on(BlockBreakEvent e) {
        Location loc = e.getBlock().getLocation();
        this.plugin.saves.remove(loc);
    }
}
 
Я конечно все понимаю, но все таки можно немножечко закоментировать действия данного скрипта, я еще не на столько спец)
 
Я конечно все понимаю, но все таки можно немножечко закоментировать действия данного скрипта, я еще не на столько спец)
Последний спойлер же. Пример как юзать.
 
Возможно ли такой принцип записывания блоков?
Пример:
Diamond:
pos1:
x: -100
y: 50
z: 100
pos2:
x: 100
y: 60
z: -100
Короче чтобы записывалось по очереди и если сломать 1 блок из этого списка то он его найдет и уберёт из конфига, вернее кординаты этого блока из списка.
 
//Записать в конфиг
this.plugin.saves.add(loc, e.getPlayer().getName());
//Удалить из конфига
this.plugin.saves.remove(loc);
//Проверить есть ли запись.
this.plugin.saves.contains(loc);
//Получить ник игрока, если запись есть.
this.plugin.saves.get(loc);
 
Собстно вид записи будет такими вот чанками.
d9f6f3d226.jpg
 
Ладно, и на том спасибо, правда для меня этот скрипт ясен как обезьяне автомат...
пока не нажму на курок, не пойму принципа...
 
кстате, 1 вопрос.
Я заметил что если использовать евенты "BlockBreakEvent/BlockPlaceEvent"
то for тобеж таймер срабатывает только 1 раз вместо 10,
как это можно исправить?
 
Назад
Верх