Desarrolladores
10 TOP-LEVEL ITEMSFakePlayer
FakePlayer es un pequeño pero muy práctico componente de ejecución dentro de la capa core de Croparia IF.
El problema que resuelve no es "fingir una entidad de jugador completa", sino algo mucho más concreto:
- cuando un módulo principal necesita usar un objeto sobre un bloque igual que lo haría un jugador, ¿cómo debería ejecutarse eso de forma segura en el servidor?
Su lugar de uso más típico en este momento es el Atril ritual, por eso encaja mejor dentro de core que en una página puramente utilitaria.
Idea básica
FakePlayer hereda de Player, pero su propósito real no es participar en el bucle normal del juego. En su lugar, expone unas cuantas entradas estáticas:
getPlayer(...)useItemOn(...)finishUseItem(...)useAllItemsOn(...)
Puedes entenderlo como:
- una instancia de jugador falso almacenada por dimensión
- más una capa de ayuda para simular el uso de objetos por parte de un jugador en nombre de módulos
Lo más importante que conviene notar es que simula la semántica de "un jugador usa un objeto", no "genera un drop" o "llama directamente a un método interno del bloque".
Flujo de uso
getPlayer(ServerLevel)
Devuelve la instancia de jugador falso en caché para una dimensión.
La implementación mantiene un Map<ServerLevel, FakePlayer>, lo que significa:
- una dimensión reutiliza una sola instancia de fake player
- los módulos no necesitan crear un jugador nuevo cada vez
useItemOn(ServerLevel, BlockPos, ItemStack)
Mueve al fake player por encima del bloque objetivo y después:
- coloca la pila en la mano principal
- construye un
UseOnContext - llama a
item.useOn(context)
Esta es la simulación central de "un jugador usa este objeto sobre ese bloque".
finishUseItem(ItemStack, ServerLevel)
Llama a item.finishUsingItem(world, fakePlayer) y devuelve el resto.
Esto importa porque algunos objetos no quedan descritos por completo solo con useOn(...). Los restos tras el uso y el comportamiento posterior también forman parte de su semántica.
useAllItemsOn(...)
Esta es la entrada de alto nivel más habitual.
Hará lo siguiente:
- intentar hasta
MAX_USESveces - llamar repetidamente a
useItemOn(...) - si el resultado no es ni
FAILniPASS - continuar con
finishUseItem(...) - recopilar todos los restos y devolverlos
Así que esto no significa "usar el objeto una sola vez". Significa "seguir usando esta pila mientras se comporte como un objeto utilizable".
Papel dentro del Atril ritual
El Atril ritual contiene una rama especial al manejar resultados rituales:
- si el objeto resultado es un
SpawnEggItem - no lo exporta simplemente como un objeto soltado normal
- en su lugar llama a
FakePlayer.useAllItemsOn(...)
Eso significa que el resultado ritual se trata como algo que realmente debe ejecutar su comportamiento de interacción con el mundo, y no simplemente existir como salida de objeto.
Para desarrolladores, esta es una distinción importante porque cambia la forma de pensar los resultados rituales:
- algunos resultados significan "producir este objeto"
- otros significan "ejecutar la acción que un jugador realizaría con este objeto"
FakePlayer es el puente que conecta la segunda categoría con la cadena de interacción vanilla.
Límites de comportamiento
FakePlayer no es un sustituto completo de un jugador, y el código mantiene su papel deliberadamente estrecho:
isSpectator()siempre devuelvefalseisCreative()siempre devuelvefalsegameMode()queda fijado enSURVIVAL
Eso te dice que su objetivo no es simular todos los modos de jugador. Su objetivo es ejecutar de la forma más predecible posible la ruta de "un jugador en supervivencia usa un objeto".
Del mismo modo, su forma de interacción está fijada:
- desde encima del bloque objetivo
- con
Direction.UP - usando
useOncontra ese bloque
Así que, si esperas comportamiento complejo de cámara, diferentes caras de interacción o emulación completa de entrada, eso ya queda fuera del límite de diseño de esta utilidad.
Cuándo usarlo
Buenos casos:
- tu módulo realmente necesita activar la ruta vanilla de "un jugador usa este objeto sobre un bloque"
- necesitas obtener el resto que queda tras usar el objeto
- quieres reutilizar la semántica existente del objeto en lugar de reescribirla
Casos menos adecuados:
- solo quieres generar un objeto de salida simple
- solo quieres llamar directamente al método interno de procesamiento de un módulo
- necesitas detalles muy concretos de entrada del jugador o simulación de interacción por varias caras
Consejos
- Si al módulo realmente le importa "qué ocurre cuando un jugador usa este objeto",
FakePlayersuele encajar mejor que escribir aproximaciones manuales. - Si solo te importa el objeto final, puede que no necesites
FakePlayer; su valor aparece sobre todo en objetos con verdadera semántica de uso. - Al conectar
FakePlayera un módulo principal, trátalo como una rama especial, igual que hace el Atril ritual, y no como la ruta por defecto. - Si más adelante añades más objetos resultado orientados a comportamiento,
useAllItemsOn(...)es la capa adecuada para abstraer antes de repetiruseOn + finishUsingItemen cada módulo.