es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La redirección de llamada de método con mixin no funciona para LivingEntity.drop.

Actualmente estoy programando un complemento / mod del lado del servidor para Minecraft Fabric que cambia la muerte de un jugador. Para ser más preciso: cuando un jugador muere, deberían conservar su inventario en ciertas circunstancias.

Para lograr esto, tengo una clase que extiende a ‘net.minecraft.entity.player.PlayerEntity’ y mezcla la clase ‘net.minecraft.server.network.ServerPlayerEntity’.
Ahora redirijo la llamada del método ‘drop()’ en ‘onDeath(DamageSource source)’ a mi método donde llamo a ‘this.drop()’ después de una declaración ‘if’.

@Redirect(method = "onDeath", at = @At(value = "INVOKE",
            target = "Lnet/minecraft/server/network/ServerPlayerEntity;drop(Lnet/minecraft/entity/damage/DamageSource;)V"))
    public void redirectDrop(ServerPlayerEntity instance, DamageSource damageSource) {
        LOGGER.log(Level.INFO, "Drop called");
        if (!countDeath) {
            LOGGER.log(Level.INFO, "Kept Items");
            return;
        }
        this.drop(damageSource);
        LOGGER.log(Level.INFO, "Dropped Items");
    }

Como puedes ver, el método ‘drop()’ se llama cuando se cuenta la muerte y cuando no se cuenta, se devuelve el método antes de tiempo.

Pero aquí viene el problema:

Cuando la muerte no se cuenta, el inventario del jugador aún se vacía pero sin dejar caer los objetos. Pero quiero que el jugador conserve su inventario y no simplemente que no deje caer nada. La parte extraña de esto es que en ‘ServerPlayerEntity.onDeath’ hay este código:

if (!this.isSpectator()) {
    this.drop(source);
}

que hace que el jugador conserve sus objetos cuando es asesinado en el modo espectador. Y esto funciona, pero no mi código…

¿Alguien sabe qué estoy haciendo mal o puede ayudarme de otra manera?

¡Gracias!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema podría estar en la condición de tu declaración if. Actualmente estás comprobando si countDeath es falso, y si lo es, retornas sin llamar a this.drop(). Sin embargo, esto no parece tener en cuenta el hecho de que el inventario del jugador todavía se está limpiando incluso si countDeath es falso.

    Una solución podría ser sobrescribir el método createEndScreen, que es responsable de mostrar la pantalla de fin cuando el jugador muere. En lugar del comportamiento habitual de limpiar el inventario, puedes modificarlo para mantener el inventario si se cumplen ciertas condiciones.

    Alternativamente, podrías investigar cómo ServerPlayerEntity.onDeath trata la condición isSpectator() y ver si hay alguna manera de replicar ese comportamiento en tu propio código.

    Sin más información, es difícil determinar exactamente cuál podría ser el problema. Sería útil proporcionar más contexto sobre la variable countDeath y para qué se utiliza.

Comments are closed.