[1.7.2] Sneaking и Невидимость

Статус
В этой теме нельзя размещать новые ответы.
329
13
  1. Как наложить эффект невидимости, когда персонаж крадется? Важное условие: эффект должен пропадать (можно через 1-2 сек), когда персонаж переходит на ходьбу или бег.
  2. Изменение скорости передвижения в состоянии скрытности. Где закодить условия изменения скорости?
  3. Возможно ли сделать следующее: при нажатии на кнопку или при использовании предмета персонаж "как-бы" осматривается, выводя из невидимости всех других персонажей в радиусе 5 клеток.
Нужны идеи и советы , как и через что :) подобное реализовать.
 
2,955
12
1. TickHandler + player.isSneaking + player.addPotionEffect. 2. player.capabilities.movementSpeed. 3. Возможно, но с пакетиками, так как я ленивый, что бы использовать KeyRegistry, по мне больше Keybinds.isKeyDown(key) + пакет.
Если с пакетами - MouseEvent. Покажу пример :
Код:
     @SubscribeEvent
 public void onMouse(MouseEvent e) {
     World clientWorld = Minecraft.getMinecraft.theWorld;
     EntityClientPlayerMP clientPlayer = Minecraft.getMinecraft.thePlayer;
     double radius = 5.0D;
   if(e.buttom == номерТвоейКнопки) {
   List<EntityLiving> entities = clientWorld.getEntitiesWithinAABB(EntityLiving.class, newAxisAlignedBB(clientPlayer.posX - radius, clientPlayer.posY - radius, clientPlayer.posZ - radius, clientPlayer.posX + radius, clientPlayer.posY + radius, clientPlayer.posZ + radius));
    entities.removePotionEffect(Potion.invisible.getPotionId());
    }
}
НО это будет работать только на клиенте. Что бы это работало и на сервере, нужно отправлять пакет. Как - смотри тутор анти по пакетам.
 
329
13
На 1.7.2 первые 2 пункта решились эвентом.
Код:
@SubscribeEvent
public void onSneakingUpdate(LivingUpdateEvent event)
{
    if (event.entityLiving instanceof EntityPlayer)
    {
        EntityPlayer Player = (EntityPlayer)event.entityLiving;
        if (Player.isSneaking())
            {
                Player.addPotionEffect(new PotionEffect(Potion.invisibility.id, 5, 0));
                Player.capabilities.setPlayerWalkSpeed(0.15F);
            }
    }
}
И да, вероятнее всего, это не прокатит на сервере (домой приду - проверю). Но главное, что работает.
 
329
13
Dragon2488 написал(а):
НО это будет работать только на клиенте. Что бы это работало и на сервере, нужно отправлять пакет.
По поводу работы только в клиенте: при игре на сервере игроки станут видимы исключительно мне? Или это вообще не заработает и выдаст ошибку?
Было бы хорошо, если бы игроки теряли невидимость исключительно для меня, при этом для остальных оставаясь невидимыми.
 
2,955
12
TaoGunner написал(а):
Dragon2488 написал(а):
НО это будет работать только на клиенте. Что бы это работало и на сервере, нужно отправлять пакет.
По поводу работы только в клиенте: при игре на сервере игроки станут видимы исключительно мне? Или это вообще не заработает и выдаст ошибку?
Было бы хорошо, если бы игроки теряли невидимость исключительно для меня, при этом для остальных оставаясь невидимыми.
Да, только для тебя.
 
771
5
Как это только ему, если невидимость снимается со всех и для всех?
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Короче, 1 - не LivingUpdateEvent, а PlayerTickEvent (и регистрировать в FMLCommonHandler.instance().bus())
А 2 - вы запутались, ибо один использовал идиотский клиентский и никак тут неподходящий евент движения мышкой, а второй использовал евент обновления энтити(не игрока - энтити, что есть доп-нагрзка для тяжёлого instanceof).
[merge_posts_bbcode]Добавлено: 29.04.2014 16:03:47[/merge_posts_bbcode]

Ладно, ошибся, просто один говорил про 3й пункт, а вы про 1 и 2

[merge_posts_bbcode]Добавлено: 29.04.2014 16:04:24[/merge_posts_bbcode]

Да, с пакетами.
 
329
13
anti344 написал(а):
Короче, 1 - не LivingUpdateEvent, а PlayerTickEvent (и регистрировать в FMLCommonHandler.instance().bus())
А вот coolAlias в своем туториале считает иначе:
!!! STOP !!!
Chances are, you do NOT need to create a tick handler for whatever it is you are doing. There are many methods built-in to Minecraft that already act as tick handlers, and it is ALWAYS better to use them when you can. Why? Because they tick only when the object in question actually exists, whereas a generic tick handler processes every tick no matter what. Here are some of the pre-made tickers at your disposal:

Entity#onUpdate: called every tick for each Entity; to manipulate vanilla entities, use LivingUpdateEvent
TileEntity#onUpdate: called for tile entities every tick unless you tell it not to tick
Item#onUpdate: called every tick while the specific item is in a player's inventory
Item#onArmorTick: called only for armor each tick that it is equipped
Block#updateTick: may be called randomly based on the block's tick rate, or it may be scheduled

5. LivingUpdateEvent
Variables: EntityLivingBase entity
Called every tick at the beginning of the entity's onUpdate method.
Uses: This is probably the most useful Event. You can allow players to fly if holding an item or wearing your armor set, you can modify a player's fall speed here, add potion effects or anything else you can imagine. It's really really handy.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
А ты пункт 2 дочитал? Да, это полезный эвент, для всего, кроме игрока, для которого уже есть этот(практичеки абсолютно ничем от него не отличающийся, кроме того, что он вызывается из самого игрока и тебе не надо проверять).
 
2,955
12
1. MouseEvent - клиентский, ферстик, поэтому она снимается для всех только у клиента.
2.Чем это этот эвент не подходит? Пакет отправлять слабо чтоль?
 
771
5
Я не за маус говорил, а за апдейт, который написал TaoGunner.
 
329
13
Первые 2 пункта легко решились следующим действом:
Код:
// Forge v10.12.1.1060
// Minecraft v1.7.2
@SubscribeEvent
public void onPlayerTick(PlayerTickEvent event)
{
    // Если персонаж крадётся
    if (event.player.isSneaking())
    {
        // Вешаем на него невидимость на 20 тиков (1 секунду)
        event.player.addPotionEffect(new PotionEffect(Potion.invisibility.id, 20, 0));
        // И увеличиваем базовую скорость бега
        event.player.capabilities.setPlayerWalkSpeed(0.2F);
    }
    else
    {
        // А если персонаж не крадётся - уменьшаем скорость до нормальной
        event.player.capabilities.setPlayerWalkSpeed(0.1F);
    }
}
А то, что третий пункт будет работать с пакетами (когда я с ними сам разберусь) - это очевидно.

Тему можно закрывать. 
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Оказалось, пакеты можно пилить в разы проще, сейчас запилю 2й вариант.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху