Помогите Табличка

Stamorey

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
Stamorey
Проблема:
Есть табличка с текстом, он должен изменяться в зависимости от определенных событий, например при разрушении определенного блока или при телепортации игрока из одной локации в другую (то есть игрок не взаимодействует с ней напрямую).
Что имею:
Координаты таблички(возможно).
Точно знаю, что написано в табличке в первой строке.

Как же можно ее заставить менять свой текст?
знаю только событие SignChangeEvent , но с его помощью можно изменить значение только при создании таблички игроком.
(p.s. может как-то можно через другое событие вызвать событие SignChangeEvent? )
 
Что мешает получить табличку по коордам и сделать с ней свои темный делишки?
так как это сделать:oops:
Вот например событие - игрок крадется, как в него впихнуть получение таблички и изменение ее строк?
@EventHandler
public void Sneak(PlayerToggleSneakEvent e)
{

//
//>>>> сюда <<<<<<
//
World loc2 = e.getPlayer().getLocation().getWorld();
Player p = e.getPlayer();
p.sendMessage("Ты крадешься в мире " + loc2);
}
 
Чекай что блок гетМатериал == табличка и касть его
 
Чекай что блок гетМатериал == табличка и касть его
Если можно, напиши код, так ничего не понял...
Если можно, напиши код, так ничего не понял...
нашел как вставить блок(создать или получить его), что-то слишком просто оказалось....
@EventHandler
public void Sneak(PlayerToggleSneakEvent e)
{

World loc2 = e.getPlayer().getLocation().getWorld();
Player p = e.getPlayer();

World w_w = Bukkit.getWorld("world");
Location loc = new Location(w_w,p.getLocation().getX(),p.getLocation().getY()+2,p.getLocation().getZ());
loc.getBlock().setType(Material.ANVIL);
p.sendMessage("Ты крадешься в мире " + loc2);
}

Но всетаки не понял как "кастить"- изменить поля таблички==блока.
 
как-то так
JavaScript:
final Block b = w.getBlockAt(loc);
if (b instanceof Sign || b.getType() == Material.WALL_SIGN) {
    final Sign sign = (Sign)b.getState();
    sign.setLine(1, "zhopa");
    sign.update(true);
}
 
как-то так
JavaScript:
final Block b = w.getBlockAt(loc);
if (b instanceof Sign || b.getType() == Material.WALL_SIGN) {
    final Sign sign = (Sign)b.getState();
    sign.setLine(1, "zhopa");
    sign.update(true);
}
D83DDC4C.png
 
Так всё-таки, b instanceof Sign или b.getState() instanceof Sign?
Или у Sign s есть метод s.getState(), возвращающий тоже Sign?
 
Помогло, Спасибо огромное,

(но так и не дошло как изменения созданного нами Sign влияют на сам блок, раньше встречался только с указателями в плюсах, наверное тут тот же принцип....... и еще одно по синтаксису- зачем здесь final , посмотрел что это значит - что-то типо констант.... , это для того, чтобы показать нубу , что sign и block никогда не меняются и работают как я предположил по типу указателей в плюсах?)
 
Чтобы показать, что эта переменная не меняется. Можно ставить, можно нет. Как понравится твоей пятке левой ноги.
белым текстом после своего сообщения это и написал)) :
{
это для того, чтобы показать нубу , что sign и block никогда не меняются и работают как я предположил по типу указателей в плюсах?)
}
Еще одна проблемка, есть какое-нибудь событие, которое вызывается каждый игровой тик или секунду?
Нужно сделать изменение мира на сарвере, независимо от событий игроков(пока-что использовал только события по типу PlayerToggleSneakEvent или PlayerTeleportEvent)
 
Еще одна проблемка, есть какое-нибудь событие, которое вызывается каждый игровой тик или секунду?
Нужно сделать изменение мира на сарвере, независимо от событий игроков(пока-что использовал только события по типу PlayerToggleSneakEvent или PlayerTeleportEvent)
Тот же шедулер.
белым текстом после своего сообщения это и написал))
Значит подтвердил твою догадку.
 
Тот же шедулер.
Значит подтвердил твою догадку.
никогда с ним не работал...
Нашел вот только такой пример :
  1. //активация таймера
  2. @Override
  3. public void onEnable()
  4. {
  5. Timer tp = new Timer();
  6. tp.runTaskTimer(this, 0L, 50L); //50 - переодичность
  7. }

  8. Создаем класс Timer

  9. в нем

  10. import org.bukkit.scheduler.BukkitRunnable;


  11. public class Timer extends BukkitRunnable
  12. {

  13. @Override
  14. public void run()
  15. {
  16. Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "say capone641694");
  17. }

  18. }
как я понял здесь метод run вызывается каждые 50L(тоесть вроде как 2,5секунды),
Не знаете, как запустить класс не в новом классе
Можно и так объяснить. Но ведь самому себе палки в колёса ставить не оч.
+++, как понял это просто правила хорошоге тона, для облегчения чтения кода, ну или в моем случае :
{
это для того, чтобы показать нубу , что sign и block никогда не меняются и работают как я предположил по типу указателей в плюсах.
}
 
Можно и так объяснить. Но ведь самому себе палки в колёса ставить не оч.
Палги и колеса тут не причем.
никогда с ним не работал...
Нашел вот только такой пример :
  1. //активация таймера
  2. @Override
  3. public void onEnable()
  4. {
  5. Timer tp = new Timer();
  6. tp.runTaskTimer(this, 0L, 50L); //50 - переодичность
  7. }

  8. Создаем класс Timer

  9. в нем

  10. import org.bukkit.scheduler.BukkitRunnable;


  11. public class Timer extends BukkitRunnable
  12. {

  13. @Override
  14. public void run()
  15. {
  16. Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "say capone641694");
  17. }

  18. }
как я понял здесь метод run вызывается каждые 50L(тоесть вроде как 2,5секунды),
Не знаете, как запустить класс не в новом классе

+++, как понял это просто правила хорошоге тона, для облегчения чтения кода, ну или в моем случае :
{
это для того, чтобы показать нубу , что sign и block никогда не меняются и работают как я предположил по типу указателей в плюсах.
}
Шедулер измеряется в тиках. 20 тиков = 1 сек, при условие 20 тпс.
 
Последнее редактирование:
никогда с ним не работал...
Нашел вот только такой пример :
  1. //активация таймера
  2. @Override
  3. public void onEnable()
  4. {
  5. Timer tp = new Timer();
  6. tp.runTaskTimer(this, 0L, 50L); //50 - переодичность
  7. }

  8. Создаем класс Timer

  9. в нем

  10. import org.bukkit.scheduler.BukkitRunnable;


  11. public class Timer extends BukkitRunnable
  12. {

  13. @Override
  14. public void run()
  15. {
  16. Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "say capone641694");
  17. }

  18. }
как я понял здесь метод run вызывается каждые 50L(тоесть вроде как 2,5секунды),
Не знаете, как запустить класс не в новом классе

+++, как понял это просто правила хорошоге тона, для облегчения чтения кода, ну или в моем случае :
{
это для того, чтобы показать нубу , что sign и block никогда не меняются и работают как я предположил по типу указателей в плюсах.
}
Говно, а не код, он еще и в консоль шлет сообщение диспетчем...
Код:
new BukkitRunnable() {
public void run() {
//20 тиков - 1сек.
}
}.runTaskTimer(объявленный главный класс, 0L, 20L);

Есть и другие типы таймеров, поищи.
 
Говно, а не код, он еще и в консоль шлет сообщение диспетчем...
Код:
new BukkitRunnable() {
public void run() {
//20 тиков - 1сек.
}
}.runTaskTimer(объявленный главный класс, 0L, 20L);

Есть и другие типы таймеров, поищи.
ну, сообщение от консоли мне не нужно, я его вырезал, вместо него код - проверка онлайна и тд, после чего эта информация отображается на табличках

(по сути для этого и искал таймер, чтобы сделать динамичные таблички, ну и еще пару проверок.)

Но кроме такого таймер ничего не нашел, если знаете что-то лучше, напишите)
(и все таки чем этот таймер так плох?:confused:)
 
ну, сообщение от консоли мне не нужно, я его вырезал, вместо него код - проверка онлайна и тд, после чего эта информация отображается на табличках

(по сути для этого и искал таймер, чтобы сделать динамичные таблички, ну и еще пару проверок.)

Но кроме такого таймер ничего не нашел, если знаете что-то лучше, напишите)
(и все таки чем этот таймер так плох?:confused:)
А в том, что на шедулеры не выделяют отдельные классы
 
Назад
Верх