Aller au contenu principal

Scripting Lua : API Prop et Objet

Cette page couvre toutes les API disponibles aux scripts de prop et d'objet de FreeMinecraftModels : context.prop, context.item, context.event, context.player, context.world, context.zones, context.scheduler, context.state et context.log. Si le scripting est nouveau pour vous, commencez d'abord par Premiers pas.


context.prop

La table prop fournit des informations sur l'entité prop et des méthodes pour contrôler ses animations. Elle est reconstruite à neuf à chaque appel de hook.

Champs

ChampTypeNotes
prop.model_idstringLe nom de modèle blueprint (par ex. "torch_01")
prop.current_locationtable de locationLa position du prop au moment où le contexte a été construit

La table de location a les champs standard : x, y, z, world, yaw, pitch.

Exemple : lecture des infos du prop
return {
api_version = 1,

on_spawn = function(context)
context.log:info("Prop spawned: " .. (context.prop.model_id or "unknown"))
local loc = context.prop.current_location
if loc then
context.log:info("Location: " .. loc.x .. ", " .. loc.y .. ", " .. loc.z)
end
end
}

prop:play_animation(name, blend, loop)

Joue une animation nommée sur le modèle du prop.

ParamètreTypeDéfautNotes
namestringrequisLe nom de l'animation tel que défini dans le fichier de modèle
blendbooleantrueSi on doit fondre avec l'animation en cours
loopbooleantrueSi l'animation boucle

Retourne true si l'animation a été trouvée et démarrée, false sinon.

Exemple
return {
api_version = 1,

on_right_click = function(context)
local success = context.prop:play_animation("open", true, false)
if not success then
context.log:warn("Animation 'open' not found on this model!")
end
end
}

prop:stop_animation()

Arrête toutes les animations actuellement en cours sur le prop.

Ne prend aucun paramètre.

Exemple
return {
api_version = 1,

on_right_click = function(context)
context.prop:stop_animation()
end
}

prop:hurt_visual()

Joue l'animation visuelle de blessure (flash de teinte rouge) sur le prop sans lui infliger de dégâts réels.

Ne prend aucun paramètre.

Exemple
return {
api_version = 1,

on_left_click = function(context)
-- Flash rouge quand frappé, mais ne pas prendre de dégâts
if context.event then
context.event.cancel()
end
context.prop:hurt_visual()
end
}

prop:pickup()

Retire le prop du monde et drop un objet de placement en papier à sa position. L'objet droppé peut être clic-droit sur un bloc pour replacer le prop.

Ne prend aucun paramètre.

Exemple
return {
api_version = 1,

on_right_click = function(context)
-- Laisse les joueurs ramasser le prop en cliquant droit dessus
context.prop:pickup()
end
}

prop:mount(player)

Monte un joueur sur le premier siège de point de monture disponible sur le prop. Le modèle doit avoir des os de point de monture définis.

ParamètreTypeNotes
playerentity tableUne table d'entité joueur (par ex. depuis context.event.player)
Exemple
return {
api_version = 1,

on_right_click = function(context)
local player = context.event and context.event.player
if player then
context.prop:mount(player)
end
end
}

prop:dismount(player)

Démonte un joueur de son siège de point de monture sur le prop.

ParamètreTypeNotes
playerentity tableUne table d'entité joueur
Exemple
return {
api_version = 1,

on_right_click = function(context)
local player = context.event and context.event.player
if player then
-- Bascule monter/démonter
local passengers = context.prop:get_passengers()
for i = 1, #passengers do
if passengers[i].uuid == player.uuid then
context.prop:dismount(player)
return
end
end
context.prop:mount(player)
end
end
}

prop:get_passengers()

Retourne un array Lua de tables d'entité pour tous les passagers actuels sur le prop.

Ne prend aucun paramètre.

Exemple
return {
api_version = 1,

on_game_tick = function(context)
local passengers = context.prop:get_passengers()
if #passengers > 0 then
context.log:info("Prop has " .. #passengers .. " passenger(s)")
end
end
}

prop:has_mount_points()

Retourne si ce prop a des os de point de monture définis dans son modèle.

Ne prend aucun paramètre. Retourne true ou false.

Exemple
return {
api_version = 1,

on_right_click = function(context)
local player = context.event and context.event.player
if player and context.prop:has_mount_points() then
context.prop:mount(player)
end
end
}

prop:spawn_elitemobs_boss(filename, x, y, z)

Fait apparaître un boss personnalisé EliteMobs à la position donnée. Nécessite qu'EliteMobs soit installé sur le serveur.

ParamètreTypeNotes
filenamestringLe nom de fichier du boss personnalisé (par ex. "my_boss.yml")
xnumberCoordonnée X
ynumberCoordonnée Y
znumberCoordonnée Z

Retourne une table d'entité vivante pour le boss apparu, ou nil si EliteMobs n'est pas installé ou si le fichier de boss n'existe pas.

Exemple
return {
api_version = 1,

on_right_click = function(context)
local loc = context.prop.current_location
if loc then
local boss = context.prop:spawn_elitemobs_boss("dungeon_guardian.yml", loc.x, loc.y + 1, loc.z)
if boss then
context.log:info("Spawned boss: " .. (boss.name or "unknown"))
else
context.log:warn("Could not spawn boss -- is EliteMobs installed?")
end
end
end
}

prop:open_inventory(player, title, rows)

Ouvre une GUI d'inventaire coffre persistante pour le joueur. Le contenu est sauvegardé dans le PersistentDataContainer du prop lorsque l'inventaire est fermé, et restauré lors de la réouverture.

ParamètreTypeDéfautNotes
playerentity tablerequisLe joueur à qui montrer l'inventaire
titlestringrequisLe titre de l'inventaire (supporte les codes de couleur &)
rowsint3Nombre de rangées (1-6, où 6 = 54 slots = double coffre)

Retourne true si l'inventaire a été ouvert, false sinon.


prop:is_viewing_inventory(player)

Retourne si le joueur donné a actuellement l'inventaire de ce prop ouvert.

ParamètreTypeNotes
playerentity tableLe joueur à vérifier

Retourne true ou false.

Exemple : animation de fermeture lorsque l'inventaire est fermé
context.state["task_" .. player.uuid] = context.scheduler:run_repeating(5, 5, function(tick_context)
if not tick_context.prop:is_viewing_inventory(player) then
tick_context.prop:play_animation("close", true, false)
tick_context.scheduler:cancel(tick_context.state["task_" .. player.uuid])
end
end)

prop:place_book(player)

Prend le livre écrit ou inscriptible de la main principale du joueur et le stocke sur le prop.

ParamètreTypeNotes
playerentity tableLe joueur tenant le livre

Retourne true en cas de succès.


prop:read_book(player)

Ouvre le livre stocké en lecture pour le joueur.

ParamètreTypeNotes
playerentity tableLe joueur à qui montrer le livre

Retourne true si un livre a été ouvert.


prop:take_book(player)

Retourne le livre stocké dans l'inventaire du joueur et le retire du prop.

ParamètreTypeNotes
playerentity tableLe joueur à qui donner le livre

Retourne true en cas de succès.


prop:has_book()

Retourne si un livre est stocké sur ce prop. Ne prend aucun paramètre.


prop:drop_inventory()

Drop tout le contenu d'inventaire stocké à la position du prop sous forme d'entités d'objet, puis efface les données stockées. Ferme automatiquement l'inventaire pour tous les joueurs qui le consultent actuellement.

Ne prend aucun paramètre. Retourne true en cas de succès.


prop:drop_book()

Drop le livre stocké à la position du prop sous forme d'entité d'objet et efface les données du livre stocké.

Ne prend aucun paramètre. Retourne true en cas de succès.


prop:set_persistent_data(key, value)

Stocke une valeur chaîne sur le PersistentDataContainer de l'armor stand du prop. Ces données survivent aux redémarrages serveur et aux déchargements de chunks.

ParamètreTypeNotes
keystringUn nom de clé unique (stocké sous fmm_lua_<key> en interne)
valuestringLa valeur à stocker. Utilisez tostring() pour les nombres et booléens.

Retourne true en cas de succès, false si le prop n'a pas d'armor stand support.


prop:get_persistent_data(key)

Récupère une valeur chaîne précédemment stockée avec set_persistent_data. Retourne nil si la clé n'a pas été définie.

ParamètreTypeNotes
keystringLe nom de clé utilisé dans set_persistent_data
Exemple : état de bascule persistant
return {
api_version = 1,

on_spawn = function(context)
local saved = context.prop:get_persistent_data("active")
context.state.active = saved == "true"
end,

on_right_click = function(context)
context.state.active = not context.state.active
context.prop:set_persistent_data("active", tostring(context.state.active))
end
}

context.item

La table item est disponible uniquement dans les scripts d'objet (pas dans les scripts de prop). Elle fournit des informations sur l'objet personnalisé et des méthodes pour le manipuler. Cette table est reconstruite à neuf à chaque appel de hook.

Champs

ChampTypeNotes
item.idstringL'ID de type d'objet (le fmm_item_id depuis la config YML)

item:material()

Retourne le nom du matériau de l'objet sous forme de chaîne (par ex. "DIAMOND_SWORD", "STICK").


item:get_amount() / item:set_amount(n)

Obtient ou définit la taille de stack de l'objet.

ParamètreTypeNotes
nintLa nouvelle quantité de stack

item:consume(n)

Décrémente la quantité de stack de l'objet de n (défaut 1). Si la quantité résultante est 0 ou moins, l'objet est retiré de l'inventaire du joueur.

ParamètreTypeDéfautNotes
nint1Quantité à consommer

item:get_uses() / item:set_uses(n)

Obtient ou définit un compteur d'utilisations personnalisé stocké dans le PersistentDataContainer de l'objet. C'est indépendant de la durabilité vanilla et peut être utilisé pour implémenter des systèmes de durabilité ou de charge personnalisés.

ParamètreTypeNotes
nintLe nouveau compte d'utilisations

item:get_name() / item:set_name(s)

Obtient ou définit le nom d'affichage de l'objet. Supporte les codes de couleur avec &.

ParamètreTypeNotes
sstringLe nouveau nom d'affichage (par ex. "&b&lFrost Sword")

item:get_lore() / item:set_lore(table)

Obtient ou définit le lore de l'objet. get_lore() retourne une table de chaînes (une par ligne). set_lore() prend une table de chaînes.

ParamètreTypeNotes
tabletableArray de chaînes, une par ligne de lore
Exemple : script d'objet qui suit les utilisations
return {
api_version = 1,

on_right_click = function(context)
local uses = context.item:get_uses()
if uses <= 0 then
context.player:send_message("&cThis item is out of charges!")
return
end
context.item:set_uses(uses - 1)
context.player:send_message("&aUsed! Charges remaining: " .. (uses - 1))
end
}

item:get_durability()

Retourne une table avec les champs current et max représentant la durabilité vanilla de l'objet, ou nil si l'objet n'a pas de barre de durabilité.

Exemple
local dur = context.item:get_durability()
if dur then
context.player:send_message("Durability: " .. dur.current .. "/" .. dur.max)
end

item:get_durability_percentage()

Retourne la durabilité restante sous forme de fraction 0.0 à 1.0, ou nil si l'objet n'a pas de barre de durabilité.


item:use_durability(amount, can_break)

Réduit la durabilité vanilla de l'objet d'un montant fixe.

ParamètreTypeDéfautNotes
amountintrequisCombien de points de durabilité consommer
can_breakbooleanfalseSi true, l'objet est détruit lorsque la durabilité s'épuise. Si false, la durabilité s'arrête à 1.

item:use_durability_percentage(fraction, can_break)

Réduit la durabilité vanilla de l'objet d'un pourcentage de son maximum.

ParamètreTypeDéfautNotes
fractionnumberrequisFraction de la durabilité max à consommer (par ex. 0.1 = 10%)
can_breakbooleanfalseSi true, l'objet est détruit lorsque la durabilité s'épuise. Si false, la durabilité s'arrête à 1.

context.event

Données d'événement pour le hook actuel. Disponible dans les hooks de clic, de combat et d'interaction pour les scripts de prop et d'objet. Retourne nil dans les hooks qui n'ont pas d'événement associé (on_spawn, on_game_tick, on_destroy, on_zone_enter, on_zone_leave, on_equip).

Champs et méthodes

Champ ou méthodeTypeNotes
event.playerplayer entity tableLe joueur qui a déclenché l'événement. Disponible dans on_left_click, on_right_click et on_projectile_hit (le tireur, si c'était un joueur). Voir Méthodes d'entité joueur pour tous les champs et méthodes.
event.is_cancelledbooleanSi l'événement est actuellement annulé
event.cancel()functionAnnule l'événement (par ex. empêche les dégâts ou l'interaction)
event.uncancel()functionDé-annule un événement précédemment annulé
info

Tous les événements ne sont pas annulables. Si l'événement Bukkit sous-jacent n'implémente pas Cancellable, event.cancel() et event.uncancel() ne seront pas présents et event.is_cancelled sera toujours false.

Exemple : rendre un prop invulnérable

Exemple
return {
api_version = 1,

on_left_click = function(context)
if context.event then
context.event.cancel()
end
end
}

Exemple : vérification de l'état d'annulation

Exemple
return {
api_version = 1,

on_left_click = function(context)
if context.event and not context.event.is_cancelled then
context.event.cancel()
context.log:info("Damage cancelled!")
end
end
}
attention

À l'intérieur des callbacks programmés (scheduler:run_later, scheduler:run_repeating), context.event est toujours nil. La modification d'événement ne peut se produire que pendant le hook d'événement lui-même.


context.world

L'API world est partagée entre tous les plugins Nightbreak. Voir context.world pour la référence complète.

info

Les props FMM utilisent la même table world MagmaCore que les boss EliteMobs. Toutes les méthodes documentées sur la page globale (get_block_at, set_block_at, spawn_particle, play_sound, strike_lightning, get_time, set_time, get_nearby_entities, get_nearby_players, spawn_entity, get_highest_block_y, raycast, spawn_firework) sont disponibles dans FMM. Voir l'API world MagmaCore pour tous les détails sur world:raycast() (lance un rayon et détecte les entités/blocs touchés) et world:spawn_firework() (fait apparaître des fusées de feu d'artifice avec couleurs et formes personnalisées). EliteMobs étend la table world avec des méthodes supplémentaires pour faire apparaître des boss, renforts, et plus -- voir EliteMobs Monde & Environnement.


Méthodes d'entité joueur

Les tables d'entité joueur sont retournées depuis context.event.player, context.world:get_nearby_players() et les callbacks de zone.

API partagée

Les tables d'entité, méthodes d'entité vivante, méthodes spécifiques aux joueurs et méthodes d'UI joueur sont partagées entre tous les plugins Nightbreak. Voir le moteur de scripting Lua MagmaCore pour la référence complète couvrant les champs de base d'entité, champs et méthodes d'entité vivante, champs et méthodes spécifiques aux joueurs, et méthodes d'UI joueur. Les nouvelles méthodes joueur incluent player:get_target_entity() (ciblage par raycast), player:get_eye_location(), player:get_look_direction(), player:send_block_change() (faux blocs par joueur), et player:reset_block() -- voir Méthodes spécifiques aux joueurs pour les détails.

Champs d'entité spécifiques à FMM

Chaque table d'entité construite à l'intérieur d'un script FMM obtient automatiquement ces champs supplémentaires (via le LuaEntityEnricher de FMM) :

ChampTypeNotes
entity.is_modeledbooleantrue si cette entité Bukkit est l'entité sous-jacente d'un ModeledEntity
entity.is_propbooleantrue si cette entité est un armor stand supportant un PropEntity
entity.modeltable or nilRenseigné uniquement lorsque is_modeled = true (voir ci-dessous)

Lorsque entity.model est présent, il expose :

Champ / MéthodeNotes
model.model_idLe nom de modèle blueprint (par ex. "dragon")
model.is_dynamictrue s'il s'agit d'un DynamicEntity (attaché à une entité vivante)
model:play_animation(name, blend, loop)Joue une animation nommée. Retourne true en cas de succès
model:stop_animations()Arrête toutes les animations en cours
model:remove()Supprime immédiatement l'entité modélisée et tous ses os
on_attack_entity = function(context)
local target = context.event.target
if target and target.is_modeled then
target.model:play_animation("hurt", true, false)
end
end

Champs d'entité EliteMobs

Lorsqu'EliteMobs est installé, FMM transfère à l'enricher d'EliteMobs afin que les mêmes tables d'entité exposent également :

ChampTypeNotes
entity.is_elitebooleantrue si l'entité est suivie par EliteMobs
entity.is_custom_bossbooleantrue s'il s'agit d'une configuration de boss personnalisé
entity.is_significant_bossbooleantrue pour les boss personnalisés avec un healthMultiplier > 1 (filtre les mobs nommés sans importance)
entity.elitetable or nilRenseigné uniquement lorsque is_elite = true. Contient level, name, health, max_health, health_multiplier, damage_multiplier, is_custom_boss, plus elite:remove()

context.zones

L'API zones est partagée entre tous les plugins Nightbreak. Voir context.zones pour la référence complète.


context.scheduler

L'API scheduler est partagée entre tous les plugins Nightbreak. Voir context.scheduler pour la référence complète.


context.state

L'API state est partagée entre tous les plugins Nightbreak. Voir context.state pour la référence complète.


context.log

L'API de logging est partagée entre tous les plugins Nightbreak. Voir context.log pour la référence complète.


Modèle runtime

Un runtime par instance de script

Chaque entité prop qui a des scripts attachés obtient sa propre instance Lua runtime indépendante. Lorsque le prop apparaît, FMM charge la source Lua, l'évalue dans un environnement sandboxé frais, et stocke la table retournée. Lorsque le prop est retiré, le runtime est arrêté.

Pour les scripts d'objet, un runtime est créé par paire (joueur, itemId). Lorsqu'un joueur équipe un objet personnalisé, FMM crée une instance de script pour ce joueur et ce type d'objet. Lorsque l'objet est déséquipé, le runtime est arrêté.

Cela signifie :

  • Les variables locales déclarées à l'échelle du fichier sont privées à cette instance de script.
  • context.state est complètement isolé entre les instances, même si elles partagent le même fichier de script.

Propriété des tâches programmées

Toutes les tâches créées via context.scheduler appartiennent au runtime qui les a créées. Lorsqu'un prop est retiré :

  1. Le runtime est arrêté.
  2. Toute tâche possédée -- à coup unique et répétitive -- est automatiquement annulée.
  3. Toutes les surveillances de zone sont effacées.

Portée des cooldowns

Le moteur de scripting partagé expose context.cooldowns:set_local, :check_local, :set_global, et :check_global (voir la référence des cooldowns MagmaCore). FMM délimite ces stores comme suit :

Type de scriptPortée du store localPortée du store global
Script de propPar ScriptInstance (prop + fichier de script)Par PropEntity (partagé entre tous les scripts liés à ce prop)
Script d'objetPar triplet (player, itemId, scriptFile) — persiste à travers les réÉquipements même si l'instance de script est démontée à chaque fois que l'objet quitte un slot actifPar joueur (partagé entre tous les scripts d'objet FMM que ce joueur exécute)

Comme les scripts d'objet sont démontés et reconstruits à chaque cycle équipement/déséquipement, les cooldowns d'objet sont conservés dans une map statique indexée par UUID de joueur plutôt que de vivre sur le ScriptInstance. C'est pourquoi un cooldown d'objet s'applique toujours après que vous ayez échangé l'objet hors de la hotbar et de retour.

Budget d'exécution

Chaque invocation de hook et chaque invocation de callback est chronométrée. Si un seul appel prend plus de 50 millisecondes, le script est désactivé avec un avertissement console :

[Lua] my_script.lua took 73ms in 'on_game_tick' (limit: 50ms) -- script disabled to prevent lag.

Pour rester dans le budget :

  • Évitez les boucles non bornées à l'intérieur des hooks.
  • Gardez les gestionnaires on_game_tick légers -- ils s'exécutent chaque tick unique.
  • Utilisez context.scheduler:run_repeating(...) pour répartir le travail sur les ticks.

Référence complète des hooks

Cette table liste tous les hooks disponibles à travers les scripts de prop et d'objet.

Hooks de prop (8)

HookSe déclenche quandcontext.event
on_spawnLe prop apparaît dans le mondenil
on_game_tickChaque tick serveur (50ms)nil
on_destroyLe prop est retirénil
on_left_clickLe joueur clique gauche sur le propévénement de dégâts
on_right_clickLe joueur clique droit sur le propévénement d'interaction
on_projectile_hitUn projectile touche le propévénement de coup de projectile
on_zone_enterUn joueur entre dans une zone surveilléenil
on_zone_leaveUn joueur quitte une zone surveilléenil

Hooks d'objet (22)

HookCatégorieSe déclenche quandcontext.event
on_attack_entityCombatLe joueur attaque une entitéévénement de dégâts
on_kill_entityCombatLe joueur tue une entitéévénement de mort
on_take_damageCombatLe joueur subit des dégâtsévénement de dégâts
on_shield_blockCombatLe joueur bloque avec bouclierévénement de dégâts
on_shoot_bowCombatLe joueur tire à l'arcévénement de tir d'arc
on_projectile_hitCombatProjectile du joueur toucheévénement de coup de projectile
on_projectile_launchCombatLe joueur lance un projectileévénement de lancement
on_right_clickInteractionLe joueur clique droitévénement d'interaction
on_left_clickInteractionLe joueur clique gaucheévénement d'interaction
on_shift_right_clickInteractionLe joueur shift+clic droitévénement d'interaction
on_shift_left_clickInteractionLe joueur shift+clic gaucheévénement d'interaction
on_interact_entityInteractionLe joueur clique droit sur entitéévénement d'interaction d'entité
on_equipÉquipementL'objet entre dans un slot actifnil
on_unequipÉquipementL'objet quitte un slot actifnil
on_swap_handsÉquipementÉchange main principale/secondaireévénement d'échange
on_dropÉquipementLe joueur jette l'objetévénement de drop
on_break_blockUtilitéLe joueur casse un blocévénement de cassage de bloc
on_consumeUtilitéLe joueur consomme l'objetévénement de consommation
on_item_damageUtilitéL'objet subit des dégâts de durabilitéévénement de dégâts d'objet
on_fishUtilitéLe joueur utilise canne à pêcheévénement de pêche
on_deathUtilitéLe joueur meurt pendant qu'équipéévénement de mort
on_game_tickCycle de vieChaque tick tant qu'équipénil

Étapes suivantes

  • Exemples et patterns -- scripts complets fonctionnels pour props et objets avec explications
  • Dépannage -- problèmes courants, conseils de débogage et checklist QC
  • Premiers pas -- structure de fichier, hooks, première marche pas à pas