Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите С изменением скорости игрока

Iggi

Старожил
Пользователь
Баллы
103
Имя в Minecraft
iggi666
Здравствуйте.
Помогите, пожалуйста, с замедлением или ускорением игрока.
В onMove делаю так - event.getPlayer().setWalkSpeed((float) 1.0);
Но игрок двигается рывками - т.е, то скорость 1, то 0.2 (стандартная для игрока). Как сделать нормальное замедление?
Зелья не предлагать :)
 
Здравствуйте.
Помогите, пожалуйста, с замедлением или ускорением игрока.
В onMove делаю так - event.getPlayer().setWalkSpeed((float) 1.0);
Но игрок двигается рывками - т.е, то скорость 1, то 0.2 (стандартная для игрока). Как сделать нормальное замедление?
Зелья не предлагать :)
Конечно, с каждым движением игрока отправлять ему пакет об изменении скорости. Достаточно один раз отправить другим методом.
 

Тут всё зависит от тематики плагина. Способов уйма - по команде, при клике каком-нибудь. При том же движении, но добавить переменную для игрока, которая бы показывала, задана скорость или нет.
 
Тут всё зависит от тематики плагина. Способов уйма - по команде, при клике каком-нибудь. При том же движении, но добавить переменную для игрока, которая бы показывала, задана скорость или нет.
Я хочу, чтобы при ношении брони скорость снижалась. Должен быть евент надевания брони.
Тут тогда проблема - что если игрок вышел и зашел, броню он не одевает, а скорость нужно снизить.
 
Я хочу, чтобы при ношении брони скорость снижалась. Должен быть евент надевания брони.
Тут тогда проблема - что если игрок вышел и зашел, броню он не одевает, а скорость нужно снизить.
Scheduler, проверяющий броню.
 
Да, но надо проверять, куда вещь переместилась.
Вот что я тут наговнокодил.
Код:
 scheduler.scheduleSyncRepeatingTask(this, new Runnable() {
        int i = 1;
            @Override
            public void run() {
                Bukkit.getPlayer("test").sendMessage("ТЕСТ");
                if(i==1){
                    Bukkit.getPlayer("test").setWalkSpeed((float) 1.0);
                    i--;
                }else{
                    Bukkit.getPlayer("test").setWalkSpeed((float) 0.5);
                    i++;
                }
               
            }
           
        }, 20L, 100);
Раз в 10 секунд мне пишет ТЕСТ и происходит рывок. Но скорость опять скачет. Т.е. дается на миг, а потом снова стандартная.
Что я на этот раз не правильно сделал? Как изменить игроку скорость, чтобы она у него сохранилась?
 
Вот что я тут наговнокодил.
Код:
scheduler.scheduleSyncRepeatingTask(this, new Runnable() {
        int i = 1;
            @Override
            public void run() {
                Bukkit.getPlayer("test").sendMessage("ТЕСТ");
                if(i==1){
                    Bukkit.getPlayer("test").setWalkSpeed((float) 1.0);
                    i--;
                }else{
                    Bukkit.getPlayer("test").setWalkSpeed((float) 0.5);
                    i++;
                }
              
            }
          
        }, 20L, 100);
Раз в 10 секунд мне пишет ТЕСТ и происходит рывок. Но скорость опять скачет. Т.е. дается на миг, а потом снова стандартная.
Что я на этот раз не правильно сделал? Как изменить игроку скорость, чтобы она у него сохранилась?
Зачем переменная i?
 
Я как смотрел в сторону setWalkSpeed и не стал использовать. Неудобно, остановился на зельях. Всё равно плавнее зелий эффекта не будет.
 
Я как смотрел в сторону setWalkSpeed и не стал использовать. Неудобно, остановился на зельях. Всё равно плавнее зелий эффекта не будет.
Я бы хотел сделать не просто критическую массу, а чтобы каждая часть брони снижала скорость игрока на какой-то процент. Можно сделать зелья разной "мощности", но я все равно думаю, что такое плавное изменение скорости не сделать зельями.
fromgate, это прикол какой-то?
Код:
@EventHandler
    public void onJoin(PlayerJoinEvent event){
        event.getPlayer().sendMessage("Игрок вошел в игру");
        event.getPlayer().sendMessage("Скорость1: " + event.getPlayer().getWalkSpeed());
        event.getPlayer().setWalkSpeed((float)1.0);
        event.getPlayer().sendMessage("Скорость2: " + event.getPlayer().getWalkSpeed());
    }
    @EventHandler
    public void onMove(PlayerMoveEvent event){
        event.getPlayer().sendMessage("В МУВЕ евенте: " + event.getPlayer().getWalkSpeed());
     }
5q4n5.png
 
Я как смотрел в сторону setWalkSpeed и не стал использовать. Неудобно, остановился на зельях. Всё равно плавнее зелий эффекта не будет.
Изменить скорость можно пакетом Packet202Abilities.
Java:
//Где-то в классе//
String PackageName = "net.minecraft.server.1_6_R4";
Class Packet202Abilities = Class.forName(PackageName.concat(".Packet202Abilities"));
Class PlayerAbilities = Class.forName(PackageName.concat(".PlayerAbilities"));
Method player_minecraft = Class.forName("org.bukkit.craftbukkit.1_6_R4.entity.CraftPlayer")).getMethod("getHandle", new Class[]{});
//Где-то в классе//
Object constructPacket202(Player p, float walk, float fly)
{
    Object packet = Packet202Abilities.getConstructor(new Class[]{PlayerAbilities}).newInstance(playerAbilities(p));
    fieldSet(packet, "e", (float) fly);//def 0.5
    fieldSet(packet, "f", (float) walk);//def 0.1
    return packet;
}
void fieldSet(Object o, String name, Object value)
{
    Field field = o.getClass().getDeclaredField(name);
    field.setAccessible(true);
    field.set(o, value);
}
void sendPacket(Player p, Object packet)
{
    Object playerConnection = player_minecraft.getReturnType().getField("playerConnection").get(player_minecraft.invoke(p));
    Method sendPacket = playerConnection.getClass().getDeclaredMethod("sendPacket", new Class[]{Packet});
    sendPacket.setAccessible(true);
    sendPacket.invoke(playerConnection, packet);
}
//Где-то в классе//
@EventHandler
void onPlayerJoin(PlayerJoinEvent e)
{
    sendPacket(e.getPlayer(), constructPacket202(e.getPlayer(), 0.01F, 0.05F));
}
 
Подскажите где найти список пакетов и их функции?
 
Изменить скорость можно пакетом Packet202Abilities.
Java:
//Где-то в классе//
String PackageName = "net.minecraft.server.1_6_R4";
Class Packet202Abilities = Class.forName(PackageName.concat(".Packet202Abilities"));
Class PlayerAbilities = Class.forName(PackageName.concat(".PlayerAbilities"));
Method player_minecraft = Class.forName("org.bukkit.craftbukkit.1_6_R4.entity.CraftPlayer")).getMethod("getHandle", new Class[]{});
//Где-то в классе//
Object constructPacket202(Player p, float walk, float fly)
{
    Object packet = Packet202Abilities.getConstructor(new Class[]{PlayerAbilities}).newInstance(playerAbilities(p));
    fieldSet(packet, "e", (float) fly);//def 0.5
    fieldSet(packet, "f", (float) walk);//def 0.1
    return packet;
}
void fieldSet(Object o, String name, Object value)
{
    Field field = o.getClass().getDeclaredField(name);
    field.setAccessible(true);
    field.set(o, value);
}
void sendPacket(Player p, Object packet)
{
    Object playerConnection = player_minecraft.getReturnType().getField("playerConnection").get(player_minecraft.invoke(p));
    Method sendPacket = playerConnection.getClass().getDeclaredMethod("sendPacket", new Class[]{Packet});
    sendPacket.setAccessible(true);
    sendPacket.invoke(playerConnection, packet);
}
//Где-то в классе//
@EventHandler
void onPlayerJoin(PlayerJoinEvent e)
{
    sendPacket(e.getPlayer(), constructPacket202(e.getPlayer(), 0.01F, 0.05F));
}
Спасибо, но это пока трудновато для меня :)
Буду тогда зельками делать.
 

Поделиться этой страницей

Назад
Верх