Skocz do zawartości
  • 0

Blad z stoniarkami


JaTuTylkoYT

Pytanie

Siema, napisalem dzisiaj plugin na stoniarki z dragona ale po postawieniu zwyklego stone albo wykopaniu w kopalni stone on tez sie regeneruje a chcialbym zeby regenerowal sie tylko ten stone ktory byl wczesniej ender stonem (mam nadzieje ze ktos zrozumial o co chodzi) ponizej kod z blockbreaka i blockplace:


 

BlockBreak:

package whitehc.stoniarki.events;

import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;

import whitehc.stoniarki.main.Main;

public class BlockBreak implements Listener {
    
    Main plugin;
    
    public BlockBreak(Main m) {
        plugin = m;
        
    }
    
    @EventHandler
    public void onBreak(BlockBreakEvent e) {
        Block b = e.getBlock();
        Location loc1 = b.getLocation();
        
        if(b.getType() == Material.STONE) {
            Bukkit.getScheduler().runTaskLater(plugin, new Runnable() {
                @Override
                public void run() {
                    if(loc1.getBlock().getType() == Material.AIR) {
                        b.setType(Material.STONE);
                    }
                }
            }, 20);
        }
        
    }

}


BlockPlace:

package whitehc.stoniarki.events;

import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockPlaceEvent;

import whitehc.stoniarki.main.Main;

public class BlockPlace implements Listener {
    
    Main plugin;
    
    public BlockPlace(Main m) {
        plugin = m;
        
    }
    
    @EventHandler
    public void onBreak(BlockPlaceEvent e) {
        Block b = e.getBlock();
        Location loc1 = b.getLocation();
        
        if(b.getType() == Material.ENDER_STONE) {
            Bukkit.getScheduler().runTaskLater(plugin, new Runnable() {
                @Override
                public void run() {
                    if(loc1.getBlock().getType() == Material.ENDER_STONE) {
                        loc1.getBlock().setType(Material.STONE);
                    }
                }
        }, 1);}
    }
}

 

Edytowane przez xNightPower_
Nieaktywny

Kody umieszczaj w code.

Odnośnik do komentarza
Udostępnij na innych stronach

Rekomendowane odpowiedzi

  • 0

Stwórz sobie nową klasę, powiedzmy StoneStorage, a w tej klasie listę z lokacjami, w mainie utwórz sobie nowy obiekt tego storage'a i podaj tę samą instancję w konstruktorach klas listenerów. Później w eventach najpierw dodajesz lokacje do listy, a później sprawdzasz sobie podczas rozwalania czy lokacja bloku jest w tej liście.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 0
2 minuty temu, LeviBoyPL napisał:

Stwórz sobie nową klasę, powiedzmy StoneStorage, a w tej klasie listę z lokacjami, w mainie utwórz sobie nowy obiekt tego storage'a i podaj tę samą instancję w konstruktorach klas listenerów. Później w eventach najpierw dodajesz lokacje do listy, a później sprawdzasz sobie podczas rozwalania czy lokacja bloku jest w tej liście.

mozesz jakoś to napisac łatwiej bo ja nowy w pluginach i nie kumam za bardzo czarna magia xD

powiedzmy no stonestorage zrobilem i co dalej

 

Edytowane przez JaTuTylkoYT
Odnośnik do komentarza
Udostępnij na innych stronach

  • 0

Dobra, no to w tym stonestorage tworzysz sobie nową listę poprzez

private ArrayList<Location> blocksLocations = new ArrayList<>();

 

i metody gettera w tej samej klasie

public ArrayList<Location> getBlocksLocations() {
	return blocksLocations;
}

 

I teraz w Twojej klasie main tworzysz sobie nową instancję

private StoneStorage stoneStorage = new StoneStorage();

 

I teraz w miejscu gdzie rejestrujesz sobie listenery w main podajesz ten stone storage

getServer().getPluginManager().registerEvents(new BreakListener(this, stoneStorage), this);
getServer().getPluginManager().registerEvents(new PlaceListener(this, stoneStorage), this);

 

w konstruktorach listenetów podajesz sobie ten obiekt do zmiennej w klasie
 

    private Main plugin;
    private StoneStorage stoneStorage;

    public BlockPlace(Main m, StoneStorage stoneStorage) {
        this.plugin = m;
        this.stoneStorage = stoneStorage;
    }

 

i w listenerach najpierw dodajesz do listy w palce a w break sprawdzasz
 

//dodawanie do listy
stoneStorage.getBlocksLocations().add(block.getLocation());

//sprawdzanie czy obiekt jest w liście
stoneStorage.getBlocksLocations().contains(block.getLocation()) {
}

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • 0
37 minut temu, LeviBoyPL napisał:

Dobra, no to w tym stonestorage tworzysz sobie nową listę poprzez


private ArrayList<Location> blocksLocations = new ArrayList<>();

 

i metody gettera w tej samej klasie


public ArrayList<Location> getBlocksLocations() {
	return blocksLocations;
}

 

I teraz w Twojej klasie main tworzysz sobie nową instancję


private StoneStorage stoneStorage = new StoneStorage();

 

I teraz w miejscu gdzie rejestrujesz sobie listenery w main podajesz ten stone storage


getServer().getPluginManager().registerEvents(new BreakListener(this, stoneStorage), this);
getServer().getPluginManager().registerEvents(new PlaceListener(this, stoneStorage), this);

 

w konstruktorach listenetów podajesz sobie ten obiekt do zmiennej w klasie
 


    private Main plugin;
    private StoneStorage stoneStorage;

    public BlockPlace(Main m, StoneStorage stoneStorage) {
        this.plugin = m;
        this.stoneStorage = stoneStorage;
    }

 

i w listenerach najpierw dodajesz do listy w palce a w break sprawdzasz
 


//dodawanie do listy
stoneStorage.getBlocksLocations().add(block.getLocation());

//sprawdzanie czy obiekt jest w liście
stoneStorage.getBlocksLocations().contains(block.getLocation()) {
}

 

Gdzie mam dokladnie wkleic ostatnie dwa

Kod z BlockBreak:

package whitehc.stoniarki.events;

import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;

import whitehc.stoniarki.main.Main;

public class BlockBreak implements Listener {
	
    private Main plugin;
    private StoneStorage stoneStorage;
	
	
	public BlockBreak(Main m, StoneStorage stoneStorage) {
        this.plugin = m;
        this.stoneStorage = stoneStorage;
    }


	@EventHandler
	public void onBreak(BlockBreakEvent e) {
		Block b = e.getBlock();
		Location loc1 = b.getLocation();
		
		if(b.getType() == Material.STONE) {
			Bukkit.getScheduler().runTaskLater(plugin, new Runnable() {
				@Override
				public void run() {
					if(loc1.getBlock().getType() == Material.AIR) {
						b.setType(Material.STONE);
					}
				}
			}, 20);
		}
		
	}

}

Kod z BlockPlace:

 

package whitehc.stoniarki.events;

import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockPlaceEvent;

import whitehc.stoniarki.main.Main;

public class BlockPlace implements Listener {
	
    private Main plugin;
    private StoneStorage stoneStorage;
	
	
	public BlockPlace(Main m, StoneStorage stoneStorage) {
		this.plugin = m;
        this.stoneStorage = stoneStorage;
	}


	@EventHandler
	public void onBreak(BlockPlaceEvent e) {
		Block b = e.getBlock();
		Location loc1 = b.getLocation();
		
		if(b.getType() == Material.ENDER_STONE) {
			Bukkit.getScheduler().runTaskLater(plugin, new Runnable() {
				@Override
				public void run() {
					if(loc1.getBlock().getType() == Material.ENDER_STONE) {
						loc1.getBlock().setType(Material.STONE);
					}
				}
		}, 1);}
	}
}

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • 0
@EventHandler
public void onBreak(BlockBreakEvent e) {
	Block b = e.getBlock();
	Location loc1 = b.getLocation();
		
	if(b.getType() == Material.STONE) {
		if(stoneStorage.getBlocksLocations().contains(loc1) {
			Bukkit.getScheduler().runTaskLater(plugin, new Runnable() {
				@Override
				public void run() {
					if(loc1.getBlock().getType() == Material.AIR) {
						b.setType(Material.STONE);
					}
				}
			}, 20);
		}

	}
		

 

 

	@EventHandler
	public void onBreak(BlockPlaceEvent e) {
		Block b = e.getBlock();
		Location loc1 = b.getLocation();
		
		if(b.getType() == Material.ENDER_STONE) {
			Bukkit.getScheduler().runTaskLater(plugin, new Runnable() {
				@Override
				public void run() {
					if(loc1.getBlock().getType() == Material.ENDER_STONE) {
                      stoneStorage.getBlocksLocations().add(loc1);
						loc1.getBlock().setType(Material.STONE);
					}
				}
		}, 1);
        }
	}

 

Edytowane przez LeviBoyPL
Odnośnik do komentarza
Udostępnij na innych stronach

  • 0
13 minut temu, LeviBoyPL napisał:


@EventHandler
public void onBreak(BlockBreakEvent e) {
	Block b = e.getBlock();
	Location loc1 = b.getLocation();
		
	if(b.getType() == Material.STONE) {
		if(stoneStorage.getBlocksLocations().contains(loc1) {
			Bukkit.getScheduler().runTaskLater(plugin, new Runnable() {
				@Override
				public void run() {
					if(loc1.getBlock().getType() == Material.AIR) {
						b.setType(Material.STONE);
					}
				}
			}, 20);
		}

	}
		

 

 



	@EventHandler
	public void onBreak(BlockPlaceEvent e) {
		Block b = e.getBlock();
		Location loc1 = b.getLocation();
		
		if(b.getType() == Material.ENDER_STONE) {
			Bukkit.getScheduler().runTaskLater(plugin, new Runnable() {
				@Override
				public void run() {
					if(loc1.getBlock().getType() == Material.ENDER_STONE) {
                      stoneStorage.getBlocksLocations().add(loc1);
						loc1.getBlock().setType(Material.STONE);
					}
				}
		}, 1);
        }
	}

 

super działa, tylko jak zrobic jeszcze zeby usuwac stoniarke np za pomoca zlotego kilofa ?

 

ps po restarcie nie zapisuja sie lokacje stoniarek

 

Edytowane przez JaTuTylkoYT
Odnośnik do komentarza
Udostępnij na innych stronach

  • 0

Na break pobierasz sobie gracza, który coś rozwalił, później używasz metody .getItemInHand() i sprawdzasz czy typ pobranego itemstacka to złoty kilof, jeżeli tak to usuwasz

stoneStorage.getBlocksLocations().remove(loc1);
Edytowane przez LeviBoyPL
Odnośnik do komentarza
Udostępnij na innych stronach

  • 0
1 godzinę temu, LeviBoyPL napisał:

Na break pobierasz sobie gracza, który coś rozwalił, później używasz metody .getItemInHand() i sprawdzasz czy typ pobranego itemstacka to złoty kilof, jeżeli tak to usuwasz


stoneStorage.getBlocksLocations().remove(loc1);

jak pobieram gracza bo nie kumam za bardzo tej javy nowy jestem

Odnośnik do komentarza
Udostępnij na innych stronach

  • 0
	@EventHandler
	public void onBreak(BlockPlaceEvent e) {
		Player player = event.getPlayer();
		Block b = e.getBlock();
		Location loc1 = b.getLocation();
		
		if(b.getType() == Material.ENDER_STONE) {
			Bukkit.getScheduler().runTaskLater(plugin, new Runnable() {
				@Override
				public void run() {
					if(loc1.getBlock().getType() == Material.ENDER_STONE) {
                      stoneStorage.getBlocksLocations().add(loc1);
						loc1.getBlock().setType(Material.STONE);
					}
				}
		}, 1);
        }
	}

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • 0
3 godziny temu, LeviBoyPL napisał:



	@EventHandler
	public void onBreak(BlockPlaceEvent e) {
		Player player = event.getPlayer();
		Block b = e.getBlock();
		Location loc1 = b.getLocation();
		
		if(b.getType() == Material.ENDER_STONE) {
			Bukkit.getScheduler().runTaskLater(plugin, new Runnable() {
				@Override
				public void run() {
					if(loc1.getBlock().getType() == Material.ENDER_STONE) {
                      stoneStorage.getBlocksLocations().add(loc1);
						loc1.getBlock().setType(Material.STONE);
					}
				}
		}, 1);
        }
	}

 

napisalem cos takiego i nic sie nie dzieje po wykopaniu zlotym kilofem:

 

	@EventHandler
	public void onBreak(BlockPlaceEvent e) {
		Block b = e.getBlock();
		Player player = e.getPlayer();
		Location loc1 = b.getLocation();
		e.getPlayer().getItemInHand();
		ItemStack item = e.getItemInHand();
		
		if(item.getType() == Material.GOLD_PICKAXE) {
			stoneStorage.getBlocksLocations().remove(loc1);
			
		}
			
		
		if(b.getType() == Material.ENDER_STONE) {
			Bukkit.getScheduler().runTaskLater(plugin, new Runnable() {
				@Override
				public void run() {
					if(loc1.getBlock().getType() == Material.ENDER_STONE) {
                      stoneStorage.getBlocksLocations().add(loc1);
						loc1.getBlock().setType(Material.STONE);
					}
				}
		}, 1);
		}
	}
}

ps sory ze cie tak z tym mecze bo tak naprawde piszesz plugin za mnie ale bede przynajmniej wiedzial nastepny raz xD

Edytowane przez JaTuTylkoYT
Odnośnik do komentarza
Udostępnij na innych stronach

  • 0
14 minut temu, LeviBoyPL napisał:

Sprawdzaj błędy w konsoli, event nazwałeś zmienną e, a playera pobierałeś ze zmiennej event, zmień event na e w linijce zaczynającej się na Player player = .. 

zmieniłem i dalej tak samo. Nie ma żadnych błędów w konsoli. Jeszcze jak zrobić żeby po restarcie zapisywały się lokalizacje stoniarek bo aktualnie po restarcie jest to zwykły stone który po zniszczeniu się nie regeneruje

Edytowane przez JaTuTylkoYT
Odnośnik do komentarza
Udostępnij na innych stronach

Nieaktywny
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...