1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Обновлённый EventHelper или его аналог?

Тема в разделе "Оффтопик", создана пользователем Avescarelo, 12 авг 2023.

  1. Автор темы
    Avescarelo

    Avescarelo Активный участник

    Баллы:
    61
    Имя в Minecraft:
    Avescarelo
    Существует ли аналог EventHelper для версии 1.20.1?
    Если нет, то его порт на эту версию?

    Если совсем нет, то как делать эвенты для модов на этой версии?
     
  2. SergK35

    SergK35 Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Sergk35
    Пока никто не портировал.

    Ивенты делаются по старой схеме:
    Вызываем ивент интеракт/брейк/плейсблок и т.п., а затем проверяем, отменён он или нет.

    А с появлением миксинов делать патчи в моды ещё проще
     
  3. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Так а зачем? В спонже мод и плагин по сути одно и тоже. Можно спокойно проюзать ивенты forge и не будет никаких конфликтов..
     
  4. SergK35

    SergK35 Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Sergk35
    Я это и имел ввиду
     
  5. Автор темы
    Avescarelo

    Avescarelo Активный участник

    Баллы:
    61
    Имя в Minecraft:
    Avescarelo
    Мои навыки ограничиваются копированием того как это делал гейм на 1.7.10 в других модах и я без понятия как вызвать форджевский эвент атаки и проверить отменился он или нет :(

    Вот к примеру эвент у лука, который наносит урон поджогом в привате:
    Код:
        @Override
        public void releaseUsing(ItemStack stack, Level level, LivingEntity entity, int remainingTime) {
            if (entity instanceof ServerPlayer) {
                stack.hurtAndBreak(1,entity,(l)->{
                    l.broadcastBreakEvent(l.getUsedItemHand());
                });
            }
            if (!level.isClientSide){
                int i = this.getUseDuration(stack) - remainingTime;
                float power = BowItem.getPowerForTime(i);
    
                int damage = 10;
                if (getItemLevel(stack) >= 1){
                    damage+=5;
                }
                damage *= power;
                Consumer<EntityHitResult> cons = (ctx)-> {
                    Entity entity1 = ctx.getEntity();
                    if (entity1 instanceof LivingEntity ent) {
                        if (getItemLevel(stack) >= 2){
                            ent.setSecondsOnFire(8);
                        }
                        if (getItemLevel(stack) >= 3) {
                            ent.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 80, 2));
                        }
                        if (getItemLevel(stack) >= 5){
                            List<LivingEntity> targets = ent.level.getEntitiesOfClass(LivingEntity.class,aoe.move(ent.position()),(target)->{
                               if (target.equals(ent) || target.equals(entity)) {
                                   return false;
                               }else{
                                   return true;
                               }
                            });
                            targets.forEach((target)->{
                                Vec3 origPos = ent.position().add(0,ent.getBbHeight()/1.2,0);
                                Vec3 targetPos = target.position().add(0,target.getBbHeight()/1.2,0);
                                Vec3 velocity = new Vec3(targetPos.x - origPos.x,targetPos.y - origPos.y,targetPos.z - origPos.z);
                                AbstractTurretProjectile proj = new AbstractTurretProjectile(level,new AbstractTurretProjectile.Constructor()
                                        .setPosition(origPos)
                                        .setVelocity(velocity.normalize().multiply(3,3,3))
                                        .setDamageSource(SolarcraftDamageSources.livingArmorPierceProjectile(entity))
                                        .setDamage(15*power)
                                        .addOnHitEntityEffect((sideContext)->{
                                            if (sideContext.getEntity() instanceof LivingEntity t){
                                                t.setSecondsOnFire(8);
                                                t.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 80, 2));
                                            }
                                        })
                                );
                                ctx.getEntity().level.addFreshEntity(proj);
                            });
                        }
                    }
                };
                AbstractTurretProjectile proj = new AbstractTurretProjectile(level,new AbstractTurretProjectile.Constructor()
                .setPosition(entity.position().add(entity.getLookAngle().x,entity.getBbHeight()/1.4 + entity.getLookAngle().y,entity.getLookAngle().z))
                        .setVelocity(entity.getLookAngle().multiply(3,3,3))
                        .setDamageSource(SolarcraftDamageSources.livingArmorPierceProjectile(entity))
                        .setDamage(damage)
                        .addOnHitEntityEffect(cons)
                );
    
                if ((getItemLevel(stack) >= 4) && power >= 0.8){
                    proj.explosionPower = 5;
                }
                level.addFreshEntity(proj);
            }
    
            super.releaseUsing(stack, level, entity, remainingTime);
        }
    
    Я понимаю, что мне нужно перед:
    Код:
                                                t.setSecondsOnFire(8);
                                                t.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 80, 2));
    Вызвать эвент и проверить отменился он или нет, но я не понимаю что делать
     
  6. Автор темы
    Avescarelo

    Avescarelo Активный участник

    Баллы:
    61
    Имя в Minecraft:
    Avescarelo
    Попытки привели либо к крашам, либо к поджогу в привате(
     

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