Aller au contenu principal

Scripts Lua : API Prop et Objet

Cette page couvre chaque API disponible pour les scripts de props et d'objets FreeMinecraftModels : context.prop, context.item, context.event, context.player, context.world, context.zones, context.scheduler, context.state et context.log. Si vous êtes nouveau dans le scripting, commencez par Pour commencer.


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 pour chaque appel de hook.

Champs

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

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

Exemple : lire les 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
blendbooleantrueS'il faut fusionner avec l'animation en cours
loopbooleantrueSi l'animation boucle

Renvoie 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 en cours de lecture 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 dégâts (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 red when punched, but don't actually take damage
if context.event then
context.event.cancel()
end
context.prop:hurt_visual()
end
}

prop:pickup()

Retire le prop du monde et lâche un objet papier de placement à son emplacement. L'objet lâché peut être utilisé par clic droit sur un bloc pour replacer le prop.

Ne prend aucun paramètre.

Exemple
return {
api_version = 1,

on_right_click = function(context)
-- Let players pick up the prop by right-clicking it
context.prop:pickup()
end
}

prop:mount(player)

Monte un joueur sur la première position de siège de point de montage disponible du prop. Le modèle doit avoir des os de point de montage définis.

ParamètreTypeNotes
playertable entitéUne table d'entité joueur (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 sa position de siège de point de montage sur le prop.

ParamètreTypeNotes
playertable entitéUne 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
-- Toggle mount/dismount
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()

Renvoie un tableau Lua de tables d'entités 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()

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

Ne prend aucun paramètre. Renvoie 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 à l'emplacement donné. Nécessite qu'EliteMobs soit installé sur le serveur.

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

Renvoie 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 un inventaire de coffre GUI persistant pour le joueur. Le contenu est sauvegardé dans le PersistentDataContainer du prop lorsque l'inventaire est fermé, et restauré lorsqu'il est rouvert.

ParamètreTypeDéfautNotes
playertable entitérequisLe joueur à qui montrer l'inventaire
titlestringrequisLe titre de l'inventaire (prend en charge les codes couleur &)
rowsint3Nombre de lignes (1-6, où 6 = 54 slots = double coffre)

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


prop:is_viewing_inventory(player)

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

ParamètreTypeNotes
playertable entitéLe joueur à vérifier

Renvoie true ou false.

Exemple : Animation de fermeture quand 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
playertable entitéLe joueur tenant le livre

Renvoie true en cas de succès.


prop:read_book(player)

Ouvre le livre stocké pour lecture par le joueur.

ParamètreTypeNotes
playertable entitéLe joueur à qui montrer le livre

Renvoie true si un livre a été ouvert.


prop:take_book(player)

Rend le livre stocké à l'inventaire du joueur et le retire du prop.

ParamètreTypeNotes
playertable entitéLe joueur à qui donner le livre

Renvoie true en cas de succès.


prop:has_book()

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


prop:drop_inventory()

Lâche tout le contenu de l'inventaire stocké à l'emplacement du prop sous forme d'entités d'objets, puis efface les données stockées. Ferme automatiquement l'inventaire pour tout joueur qui le consulte actuellement.

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


prop:drop_book()

Lâche le livre stocké à l'emplacement du prop sous forme d'entité d'objet et efface les données du livre stocké.

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


prop:set_persistent_data(key, value)

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

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

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


prop:get_persistent_data(key)

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

ParamètreTypeNotes
keystringLe nom de la clé utilisé dans set_persistent_data
Exemple : État de basculement 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'objets (pas les scripts de props). Elle fournit des informations sur l'objet personnalisé et des méthodes pour le manipuler. Cette table est reconstruite à neuf pour chaque appel de hook.

Champs

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

item:material()

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


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

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

ParamètreTypeNotes
nintLa nouvelle quantité du stack

item:consume(n)

Décrémente la quantité du 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'utilisation personnalisé stocké dans le PersistentDataContainer de l'objet. Ceci 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 compteur d'utilisations

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

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

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

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

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

ParamètreTypeNotes
tabletableTableau 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()

Renvoie 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()

Renvoie la durabilité restante sous forme de fraction de 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 quand la durabilité atteint zéro. 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é maximale à consommer (ex : 0.1 = 10%)
can_breakbooleanfalseSi true, l'objet est détruit quand la durabilité atteint zéro. Si false, la durabilité s'arrête à 1.

context.event

Données de l'événement pour le hook en cours. Disponible dans les hooks de clic, combat et interaction pour les scripts de props et d'objets. Renvoie 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.playertable entité joueurLe 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 (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érifier 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

Dans les callbacks planifiés (scheduler:run_later, scheduler:run_repeating), context.event est toujours nil. La modification d'événements ne peut se faire 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 les détails complets sur world:raycast() (lancer un rayon et détecter les entités/blocs touchés) et world:spawn_firework() (faire apparaître des fusées de feu d'artifice avec des couleurs et formes personnalisées). EliteMobs étend la table world avec des méthodes supplémentaires pour faire apparaître des boss, des renforts et plus -- voir Monde et environnement EliteMobs.


Méthodes d'entité joueur

Les tables d'entité joueur sont renvoyées par 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 au joueur et méthodes d'interface 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é, les champs et méthodes d'entité vivante, les champs et méthodes spécifiques au joueur, et les Méthodes d'interface 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 au joueur pour les détails.


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 journalisation est partagée entre tous les plugins Nightbreak. Voir context.log pour la référence complète.


Modèle d'exécution

Un moteur d'exécution par instance de script

Chaque entité prop qui a des scripts attachés obtient sa propre instance de moteur d'exécution Lua 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 supprimé, le moteur d'exécution est arrêté.

Pour les scripts d'objets, un moteur d'exécution 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 moteur d'exécution est arrêté.

Cela signifie :

  • Les variables locales déclarées au niveau 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 planifiées

Toutes les tâches créées via context.scheduler appartiennent au moteur d'exécution qui les a créées. Lorsqu'un prop est supprimé :

  1. Le moteur d'exécution s'arrête.
  2. Chaque tâche possédée -- à la fois ponctuelles et répétitives -- est automatiquement annulée.
  3. Toutes les surveillances de zones sont nettoyées.

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 dans les hooks.
  • Gardez les gestionnaires on_game_tick légers -- ils s'exécutent à chaque tick.
  • Utilisez context.scheduler:run_repeating(...) pour répartir le travail sur plusieurs ticks.

Référence complète des hooks

Cette table liste tous les hooks disponibles dans les scripts de props et d'objets.

Hooks de props (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 suppriménil
on_left_clickUn joueur clique gauche sur le propévénement de dégâts
on_right_clickUn joueur clique droit sur le propévénement d'interaction
on_projectile_hitUn projectile touche le propévénement d'impact de projectile
on_zone_enterUn joueur entre dans une zone surveilléenil
on_zone_leaveUn joueur quitte une zone surveilléenil

Hooks d'objets (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 prend 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 avec un arcévénement de tir à l'arc
on_projectile_hitCombatLe projectile du joueur toucheévénement d'impact de projectile
on_projectile_launchCombatLe joueur lance un projectileévénement de lancement
on_right_clickInteractionLe joueur fait un clic droitévénement d'interaction
on_left_clickInteractionLe joueur fait un clic gaucheévénement d'interaction
on_shift_right_clickInteractionLe joueur fait shift+clic droitévénement d'interaction
on_shift_left_clickInteractionLe joueur fait shift+clic gaucheévénement d'interaction
on_interact_entityInteractionLe joueur clic droit sur une entitéévénement d'interaction 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 lâche l'objetévénement de lâcher
on_break_blockUtilitaireLe joueur casse un blocévénement de casse de bloc
on_consumeUtilitaireLe joueur consomme l'objetévénement de consommation
on_item_damageUtilitaireL'objet subit des dégâts de durabilitéévénement de dégâts d'objet
on_fishUtilitaireLe joueur utilise une canne à pêcheévénement de pêche
on_deathUtilitaireLe joueur meurt avec l'objet équipéévénement de mort
on_game_tickCycle de vieChaque tick tant qu'équipénil

Prochaines étapes

  • Exemples et patterns -- scripts complets fonctionnels de props et d'objets avec explications
  • Dépannage -- problèmes courants, astuces de débogage et liste de vérification QC
  • Pour commencer -- structure de fichiers, hooks, guide du premier script