[Plugin] LinkedChest (Coffres liés)
+7
Stigal
Gothz
rodwin
Jjordisons
Bobob_
Ghomerr
Warzouz
11 participants
Page 1 sur 7
Page 1 sur 7 • 1, 2, 3, 4, 5, 6, 7
[Plugin] LinkedChest (Coffres liés)
Ce topic parle du plugin réalisé par Ghomerr. Il permet de lier des coffres à des coffres maitres afin d'accéder aux coffres maitres depuis toute la map, sur tous les mondes.
Page du plugin réalisée par Ghomerr
http://dev.bukkit.org/server-mods/linkedchest/
PS : Ghomerr, n'hésite pas à modifier ce post pour y mettre les informations pertinentes.
Ancien post
Page du plugin réalisée par Ghomerr
http://dev.bukkit.org/server-mods/linkedchest/
PS : Ghomerr, n'hésite pas à modifier ce post pour y mettre les informations pertinentes.
Ancien post
Coffre collectifs
Ghomerr en avait déjà parlé, il y a un certain temps. L'idée est de lier des coffres entre eux pour qu'ils partagent leur contenu.
Idées d'application
- Mise à disposition de bouffe pour toutes les auberges (elles sont ainsi toute achalandées, même si on ne passe pas les alimenter)
- Mise à dispo d'équipement pour le nether, et les postes avancés
- Mise à dispo de potions sur les routes
- Mise en place d'un système de poste fonctionnel
Principe
Le principe se base sur des coffres maîtres et des coffres esclaves. Chaque coffre maître est indépendant et a plusieurs coffres esclaves. Un coffre esclave n'est lié qu'à un seule maître. Le coffre où sont réellement les objets est toujours le maître. Les coffres esclaves sont toujours vides. Ainsi si le plugin est abandonné ou sujet à un problème de config, on aura ni duplication, ni disparition d'objet.
L'accès est simple : quand un joueur accède à un coffre esclave, il accède en réalité au maître. A voir s'il est possible d'accéder à un coffre depuis un autre monde.
Le principe serait applicable aux coffres simples, doubles coffres et éventuellement dispensers
Contrainte au niveau des logs. Idéalement, si on accède à un coffre esclave, il faudrait réussir à tracer ce qui est pris dans le coffre maître. Il faut donc étudier comment ce plugins va interagir avec les plugins de surveillance.
Attention au risque lié à l'accès concurrentiel (1 items pris par deux personnes en même temps ne doit pas dupliquer l'item)
Proposition de commandes
- Add <nom du maître>
Ajout du coffre visé comme coffre maître (si le nom n'existe pas déjà)
- Delete <nom du maître>
Suppression d'un coffre maître et de tous ses esclaves
- Info
Indique si le coffre visé est maître ou esclave. De plus, il donne le nom du maître et tous les esclaves qui lui sont liés.
- Link <nom du maître> <nom de l'esclave>
Lie le coffre visé un esclave à un maître. Si le coffre est déjà lié à un autre : le message d'erreur. Si le coffre n'est pas vide : message d'erreur.
- Unlink
Détacher le coffre visé de son maître.
Permissions : 2 niveaux
- Gestion des coffres maîtres (admins only par défaut)
- Gestion des coffres esclaves (admins only par défaut)
- L'accès aux coffres n'est pas sujet à permission.
Application sur Rodwin.fr
Il n'est pas question que chacun se fasse son coffre esclave sur le coffre des halles ou de la banque de rodville, quoi que les halles et la banque pourraient être liées, à voir... L'idée est surtout de permettre à certaines personnes ou guildes de maintenir une activité qui puisse toucher toute la carte. Par exemple, la guilde des explorateurs pourrait maintenir 1 ou 2 coffres maîtres avec de l'équipement au sein de leur guilde, tout en ayant des coffres esclaves dans chaque avant poste. La maintenance de ces avant postes serait alors possible, le pillage tracé dans les logs.
La poste pourrait être une application envisageable surtout qu'elle reste chère à Cola qui n'a jamais trouvé de système réellement applicable. Un bâtiments central à Rodville et/ou New Rodville avec un coffre maitre par lieu. Les coffres esclaves seraient alors dans chaque lieu. On pourrait ainsi envoyer rapidement du matériel depuis et vers les 2 villes principales. A la demande, des postes locales pourrait être implantées pour permettre les transferts décentralisés. Il y a du potentiel.
Les auberges sont aussi souvent un moyen de rendre un lieu plus vivant. Malheureusement, à part Rodville, elles sont toutes abandonnées. Leur gestion pourrait être rendue beaucoup plus simple.
La mise en place de coffres maîtres et esclaves serait réservée aux admins.
On peut aussi trouver d'autres applications :
- Du matériel pour réparer les voies dans chaque station liées à des coffres à la guilde de rodville.
- Des bateaux pour prendre la mer sur des pontons dispersés partout.
- Les coffres de graines ou de production de la guilde des paysans accessibles plus facilement depuis les ambassades locales.
- Mise en place d'un système d'échange d'objets magiques
Plugins existant.
J'ai trouvé un plugin Craftbukkit mais celui-ci utiliser une synchro régulière. En pratique les objets sont dupliqués, ce qui parrait dangeureux. De plus, le comportement n'est pas clair quand on arrète d'utiliser le plugin. Or le jeu sait déjà gérer les accès concurrentiels à un coffre. Les objets disparaissent en temps réel. Il faut juste voir si on peut substituer le contenu d'un coffre à celui qu'on a sous les yeux.
Technique
Bon, je connais pas grand chose à Java, mais je touche un peu en objet et je sais lire une doc en anglais. Ca aide.
En regardant 2 minutes la doc de bukkit, je trouve dans l'objet Chest (une interface en réalité) une fonction GetInventory. La fonction revoie un Inventory (une autre interface) qui semble gérer les ajouts, suppression, stacks et compagnie, y compris la liste des joueurs qui accèdent à l'inventaire à un moment donné. Comme l'inventaire est géré à part et pas directement dans le bloc, on doit pouvoir contourner le principe de manière plutôt transparente. L'idée serait donc de surcharger cette fonction GetInventory pour qu'elle revoie un autre inventaire que celui du coffre qu'on a sous les yeux, en utilisant une mini base de données. Ca semble très simple, un peu trop pour être vrai d'ailleurs...
Ghomerr, si tu peux me relire avec tes yeux de développeur de plugin, ça pourra faire avancer le bazare.
Dernière édition par Warzouz le Jeu 26 Avr 2012 - 14:23, édité 2 fois
Warzouz- Messages : 5919
Age : 52
Profil
Rôle: Déménageur nihiliste
Re: [Plugin] LinkedChest (Coffres liés)
Dans l'idée, ça paraît réalisable.
Je vais ajouter quelques infos suite à mes quelques expériences.
Pour les coffres, le simple fait d'ajouter un maître ou un esclave ne suffira pas. Il faut une information en jeu pour savoir à quel coffre on à faire. La solution crade mais simple est d'utiliser un panneau tout proche avec le nom du maître, par exemple. La solution transparente mais plus compliquée est d'utiliser la position du coffre. Le problème c'est qu'on doit "écouter" l'évènement de destruction du coffre pour savoir si on le considère encore ou pas (si on conserve sa position ou pas en cas d'ouverture). C'est donc plus lourd à gérer en termes de performance. (il faudra forcément le faire pour le maître !!)
Pour la concurrence, Java gère ça nativement avec l'instruction "synchronize" utilisée à bon escient. Je pourrais "synchroniser" l'accès à mon cache de données (où je stockerai la configuration des coffres) pour permettre qu'un seul accès, au besoin. A moins qu'effectivement l'accès aux inventaires soit géré par Minecraft (à tester en multi: je pourrais faire un plugin bidon pour tester cette fonctionnalité)
Concernant la faisabilité, l'accès à l'inventaire d'un coffre est possible. Néanmoins, ça ne permet pas d'ouvrir l'interface qui permet de déposer ou prendre des objets. On pourrait éventuellement utiliser l'évènement d'ouverture d'un coffre (il n'y en a pas, on sait juste qu'on ouvre un inventaire: org.bukkit.event.inventory.InventoryOpenEvent). Là encore, on peut voir l'inventaire (getInventory) ouvert, mais pas sûr qu'on puisse le remplacer par un autre. C'est peut-être possible, il faudrait essayer. Par exemple, je récupère l'inventaire et je fais un setContents() dessus avec l'inventaire du maître que j'aurais gardé sous le coude en mémoire.
Ce que je pensais faire sinon, de mon côté, c'était coder moi-même des inventaires virtuels. Je comptais m'y prendre simplement. Je gère des listes d'objets dont je peux configurer la quantité. Ces objets peuvent être accessibles via des commandes qui permettent de retirer une quantité précise d'un objet disponible pour un coffre donner. Déposer un objet dans le coffre permettrait (si c'est possible) de réalimenter le coffre, sinon ça serait par commande. Un panneau adjacent pourrait donner le contenu du coffre (plus ou moins en temps réel, puisque le même problème de localisation du panneau et de sa mise à jour se pose, il faut savoir où est le panneau, stocker sa position ou le mettre à jour sur évènement (interaction/commande)). Mais c'est peu intuitif pour l'utilisateur/le joueur.
Bref, c'est faisable mais c'est pas aussi simple que ça en a l'air, malheureusement. Si ça se fait, ça sera assez long à faire, même si la première paraît plus simple/courte, dans la mesure où c'est possible. (en tout cas, si je veux faire ça bien :P)
Pour l'instant, j'ai mis en pause le dev de mon plugin de jeu (le RamboCraft). Je pourrais essayer de faire quelques tests pour les coffres assez rapidement pour au moins vérifier la faisabilité d'un tel plugin et ensuite, si ça vous intéresse, faire un petit plugin ! Je me tâte à faire ça simple ou super configurable ?
Concernant les logs, en dernier lieu, je peux ajouter des logs moi-même sur qui fait quoi. Donc pour la tracabilité, y'a pas de problèmes.
Je vais ajouter quelques infos suite à mes quelques expériences.
Pour les coffres, le simple fait d'ajouter un maître ou un esclave ne suffira pas. Il faut une information en jeu pour savoir à quel coffre on à faire. La solution crade mais simple est d'utiliser un panneau tout proche avec le nom du maître, par exemple. La solution transparente mais plus compliquée est d'utiliser la position du coffre. Le problème c'est qu'on doit "écouter" l'évènement de destruction du coffre pour savoir si on le considère encore ou pas (si on conserve sa position ou pas en cas d'ouverture). C'est donc plus lourd à gérer en termes de performance. (il faudra forcément le faire pour le maître !!)
Pour la concurrence, Java gère ça nativement avec l'instruction "synchronize" utilisée à bon escient. Je pourrais "synchroniser" l'accès à mon cache de données (où je stockerai la configuration des coffres) pour permettre qu'un seul accès, au besoin. A moins qu'effectivement l'accès aux inventaires soit géré par Minecraft (à tester en multi: je pourrais faire un plugin bidon pour tester cette fonctionnalité)
Concernant la faisabilité, l'accès à l'inventaire d'un coffre est possible. Néanmoins, ça ne permet pas d'ouvrir l'interface qui permet de déposer ou prendre des objets. On pourrait éventuellement utiliser l'évènement d'ouverture d'un coffre (il n'y en a pas, on sait juste qu'on ouvre un inventaire: org.bukkit.event.inventory.InventoryOpenEvent). Là encore, on peut voir l'inventaire (getInventory) ouvert, mais pas sûr qu'on puisse le remplacer par un autre. C'est peut-être possible, il faudrait essayer. Par exemple, je récupère l'inventaire et je fais un setContents() dessus avec l'inventaire du maître que j'aurais gardé sous le coude en mémoire.
Ce que je pensais faire sinon, de mon côté, c'était coder moi-même des inventaires virtuels. Je comptais m'y prendre simplement. Je gère des listes d'objets dont je peux configurer la quantité. Ces objets peuvent être accessibles via des commandes qui permettent de retirer une quantité précise d'un objet disponible pour un coffre donner. Déposer un objet dans le coffre permettrait (si c'est possible) de réalimenter le coffre, sinon ça serait par commande. Un panneau adjacent pourrait donner le contenu du coffre (plus ou moins en temps réel, puisque le même problème de localisation du panneau et de sa mise à jour se pose, il faut savoir où est le panneau, stocker sa position ou le mettre à jour sur évènement (interaction/commande)). Mais c'est peu intuitif pour l'utilisateur/le joueur.
Bref, c'est faisable mais c'est pas aussi simple que ça en a l'air, malheureusement. Si ça se fait, ça sera assez long à faire, même si la première paraît plus simple/courte, dans la mesure où c'est possible. (en tout cas, si je veux faire ça bien :P)
Pour l'instant, j'ai mis en pause le dev de mon plugin de jeu (le RamboCraft). Je pourrais essayer de faire quelques tests pour les coffres assez rapidement pour au moins vérifier la faisabilité d'un tel plugin et ensuite, si ça vous intéresse, faire un petit plugin ! Je me tâte à faire ça simple ou super configurable ?
Concernant les logs, en dernier lieu, je peux ajouter des logs moi-même sur qui fait quoi. Donc pour la tracabilité, y'a pas de problèmes.
Re: [Plugin] LinkedChest (Coffres liés)
Je pense que je vais aussi me mettre au dev de plugins. J'ai commencé à regarder des tutos de base, pour l'instant, je comprends tout. C'est déjà un bon point...
Warzouz- Messages : 5919
Age : 52
Profil
Rôle: Déménageur nihiliste
Re: [Plugin] LinkedChest (Coffres liés)
La mise en pratique est souvent différente :p
N'hésite pas si tu as des questions.
De mon côté, je ferais des tests demain pour voir ce qu'on peut faire réellement avec les inventaires via les évènements. Je pense que les InventoryViews sont utilisés pour les partie transactionnelle et concurrentielle sur les inventaires. Je vérifierai ça demain.
Le reste après, c'est rien du tout à faire. Juste du temps :p
Bon courage pour ton apprentissage des plugins ^^
N'hésite pas si tu as des questions.
De mon côté, je ferais des tests demain pour voir ce qu'on peut faire réellement avec les inventaires via les évènements. Je pense que les InventoryViews sont utilisés pour les partie transactionnelle et concurrentielle sur les inventaires. Je vérifierai ça demain.
Le reste après, c'est rien du tout à faire. Juste du temps :p
Bon courage pour ton apprentissage des plugins ^^
Re: [Plugin] LinkedChest (Coffres liés)
l'autre alternative est de transférer le contenu d'un coffre quand on ouvre un esclave puis de bloquer l'accès au maitre et autres esclaves. Quand c'est terminé, tout est remis dans le maitre et on débloque.
Le risque c'est qu'il reste des coffres bloqués. Du coup, on peut mettre un timer sur les coffres pour les débloquer automatiquement
Le risque c'est qu'il reste des coffres bloqués. Du coup, on peut mettre un timer sur les coffres pour les débloquer automatiquement
Warzouz- Messages : 5919
Age : 52
Profil
Rôle: Déménageur nihiliste
Re: [Plugin] LinkedChest (Coffres liés)
Les commandes de ce plug in seraient ouvertes à tout le monde ou aux admins uniquement ?
Ensuite je trouve que c'est une très bonne idée, car ça va m'aider à fournir les coffres de la guilde et surtout ça va me motiver à explorer comme un bourrin pour rentabiliser le plugin !
I amdisapoint !
Ensuite je trouve que c'est une très bonne idée, car ça va m'aider à fournir les coffres de la guilde et surtout ça va me motiver à explorer comme un bourrin pour rentabiliser le plugin !
I am
Bobob_- Messages : 1296
Age : 30
Profil
Rôle: Bloblob
Re: [Plugin] LinkedChest (Coffres liés)
C'est paramétrable, mais l'idée, chez nous serait que seuls les admins peuvent mettre en place ces coffres.
Warzouz- Messages : 5919
Age : 52
Profil
Rôle: Déménageur nihiliste
Re: [Plugin] LinkedChest (Coffres liés)
Quelques plugins dont le principe pourrait nous aider à faire notre propre plugin. Ils peuvnt être obsolète.
Ce plugin permet d'avoir un coffre dont le contenu est propre à chaque joueur. Par exemple s'il contient 1 diams, chaque joueur peut prendre le diams. Le contenu est donc différent pour chaque joueur. Il y a bien permutation d'inventaire.
http://forums.bukkit.org/threads/mech-fun-personalchests-v1-1-player-bound-chests-1-2-3-r0-1.24980/
Un "DropBox" avec des chests. Il utilise un système de synchronisation qui me parait dangereux, ceci dit.
http://forums.bukkit.org/threads/mech-wirelesschests-its-like-dropbox-but-with-minecraft-chests-1337-bukkitdev.46830/
Un système d'échange de ressource qui se base sur des panneaux. C'est pas super clean, mais ça semble siple
http://dev.bukkit.org/server-mods/mondochest/
Un système permettant d'ouvrir l'inventaire d'un joueur comme un coffre. Celui-ci semble être une très bonne piste.
http://forums.bukkit.org/threads/fun-admn-openinv-1-8-3-open-anyones-inventory-as-a-chest-real-time-1-1-r6-1-2-3-r0-1.15379/
Ce plugin permet d'avoir un coffre dont le contenu est propre à chaque joueur. Par exemple s'il contient 1 diams, chaque joueur peut prendre le diams. Le contenu est donc différent pour chaque joueur. Il y a bien permutation d'inventaire.
http://forums.bukkit.org/threads/mech-fun-personalchests-v1-1-player-bound-chests-1-2-3-r0-1.24980/
Un "DropBox" avec des chests. Il utilise un système de synchronisation qui me parait dangereux, ceci dit.
http://forums.bukkit.org/threads/mech-wirelesschests-its-like-dropbox-but-with-minecraft-chests-1337-bukkitdev.46830/
Un système d'échange de ressource qui se base sur des panneaux. C'est pas super clean, mais ça semble siple
http://dev.bukkit.org/server-mods/mondochest/
Un système permettant d'ouvrir l'inventaire d'un joueur comme un coffre. Celui-ci semble être une très bonne piste.
http://forums.bukkit.org/threads/fun-admn-openinv-1-8-3-open-anyones-inventory-as-a-chest-real-time-1-1-r6-1-2-3-r0-1.15379/
Warzouz- Messages : 5919
Age : 52
Profil
Rôle: Déménageur nihiliste
Re: [Plugin] LinkedChest (Coffres liés)
Bon, j'ai regardé la vidéo et le code du dernier plugin. C'est vraiment prometteur. Le gars réussit à créer un inventaire sur mesure (5 lignes au lieu de 6 qu'il appelle sur commande).
La question que je me pose est s'il est possible d'accéder à un inventaire d'un coffre dans un chunk non chargé ?
La question que je me pose est s'il est possible d'accéder à un inventaire d'un coffre dans un chunk non chargé ?
Warzouz- Messages : 5919
Age : 52
Profil
Rôle: Déménageur nihiliste
Re: [Plugin] LinkedChest (Coffres liés)
Logiquement oui, comme il est dit plus haut, le coffre amène à une interface à part, elle existe peut importe l'état du chunk sinon le contenu du coffre disparaitrait. Après je dis peut être des bêtises, auquel cas il suffirait de laisser ce chunk actif, ce qui ne serait pas très dur vu que j'imagine que les coffres "maîtres" se situeraient en NR où Rodville et avec les élevages ce sont des chunks perpétuellement actifs.
Jjordisons- Messages : 101
Age : 31
Profil
Rôle: Karaté girl, mari de Piggyz, dégonfleur d'égo, proxénète, clodo, drogué
Re: [Plugin] LinkedChest (Coffres liés)
Je me réinstalle un environnement de dev ce soir et je vais faire quelques tests.
Le plugin OpenInv me semble également être le plus prometteur et le plus intéressant à étudier. Je suis en train de regarder comment il fonctionne.
Edit: ça commence mal, le plugin utilise pas mal de fonctionnalités natives de Minecraft, et non de Bukkit, pour créer des inventaires customs et les ouvrir. Je vais quand même essayer de faire ça comme je l'entends, et voir si ça marche :p
Sinon, le développeur à créer sa propre classe d'inventaire pour gérer son plugin. Il a implémenté l'interface IIventory qu'il utilise ensuite. C'est pas du petit plugin ^^'
Edit²: D'ailleurs, Warzouz, si tu cherches de l'inspiration, le code de mon premier plugin est dispo ici : https://github.com/Ghomerr/TravelGates
Le plugin OpenInv me semble également être le plus prometteur et le plus intéressant à étudier. Je suis en train de regarder comment il fonctionne.
Edit: ça commence mal, le plugin utilise pas mal de fonctionnalités natives de Minecraft, et non de Bukkit, pour créer des inventaires customs et les ouvrir. Je vais quand même essayer de faire ça comme je l'entends, et voir si ça marche :p
Sinon, le développeur à créer sa propre classe d'inventaire pour gérer son plugin. Il a implémenté l'interface IIventory qu'il utilise ensuite. C'est pas du petit plugin ^^'
Edit²: D'ailleurs, Warzouz, si tu cherches de l'inspiration, le code de mon premier plugin est dispo ici : https://github.com/Ghomerr/TravelGates
Re: [Plugin] LinkedChest (Coffres liés)
Bonne nouvelle !!
J'ai réussi à produire le fonctionnement attendu avec quasiment rien comme code !!! C'est magique ! Je vous le colle ici pour que vous voyez ça :P
La variable plugin.content est juste un tableau d'ItemStack (le contenu d'un inventaire, en somme).
Et ça marche ! En jeu, j'ouvre un coffre, je pose du matos, j'ouvre un deuxième coffre, le matos y est aussi ! Je l'enlève le matos du deuxième coffre, j'ouvre le premier coffre, il a disparu ! :)
Bon, reste plus qu'à voir si la concurrence est bien gérée (pour le moment, a priori, ça ne l'est pas).
J'essaie de pondre un truc à peu près stable et on pourra tester ça sur un serveur de test (voir le serveur alt ?). Sinon j'ai le mien, avec hamachi.
Edit: si vous voulez tester le plugin: http://www.mediafire.com/?e7dnbcc7cdauyad (ATTENTION: ça risque de foirer tous les coffres ouverts !! N'ouvrez pas n'importe quoi ! Pour l'instant ça marche sur TOUS les coffres, donc attention si vous essayez ça). Je vous invite à utiliser Java Decompiler pour regarder les sources, si besoin.
Edit²: voilà comment je vois la suite des choses:
J'ose espérer pouvoir mémoriser la "référence" de l'objet coffre, plutôt que sa position ou le retrouver à l'aide d'un panneau. Ça serait beaucoup plus simple et performant. J'essayerai aussi demain, si je peux.
Vu comme c'est parti, le plugin a l'air plutôt simple à réaliser, au final :) (Ça se voit peut-être pas, mais je suis très enthousiaste :3)
J'ai réussi à produire le fonctionnement attendu avec quasiment rien comme code !!! C'est magique ! Je vous le colle ici pour que vous voyez ça :P
- Code:
@EventHandler
public void onInventoryOpenEven(final InventoryOpenEvent event)
{
final Player player = (Player) event.getPlayer();
final Block block = player.getTargetBlock(null, 6);
if (block != null && block.getType() == Material.CHEST)
{
final InventoryView view = event.getView();
final Inventory topInv = view.getTopInventory();
if (plugin.content != null && plugin.content.length > 0)
{
topInv.setContents(plugin.content);
}
}
}
@EventHandler
public void onInventoryCloseEvent(final InventoryCloseEvent event)
{
final Player player = (Player) event.getPlayer();
final Block block = player.getTargetBlock(null, 6);
if (block != null && block.getType() == Material.CHEST)
{
final InventoryView view = event.getView();
final Inventory topInv = view.getTopInventory();
plugin.content = topInv.getContents();
}
}
La variable plugin.content est juste un tableau d'ItemStack (le contenu d'un inventaire, en somme).
Et ça marche ! En jeu, j'ouvre un coffre, je pose du matos, j'ouvre un deuxième coffre, le matos y est aussi ! Je l'enlève le matos du deuxième coffre, j'ouvre le premier coffre, il a disparu ! :)
Bon, reste plus qu'à voir si la concurrence est bien gérée (pour le moment, a priori, ça ne l'est pas).
J'essaie de pondre un truc à peu près stable et on pourra tester ça sur un serveur de test (voir le serveur alt ?). Sinon j'ai le mien, avec hamachi.
Edit: si vous voulez tester le plugin: http://www.mediafire.com/?e7dnbcc7cdauyad (ATTENTION: ça risque de foirer tous les coffres ouverts !! N'ouvrez pas n'importe quoi ! Pour l'instant ça marche sur TOUS les coffres, donc attention si vous essayez ça). Je vous invite à utiliser Java Decompiler pour regarder les sources, si besoin.
Edit²: voilà comment je vois la suite des choses:
- A l'aide d'une commande, on ajoute un coffre maître dont on va sauvegarder le contenu.
- A chaque ouverture de ce coffre, le contenu mémorisé sera rafraîchit.
- Je ne sais pas encore comment serait repéré un coffre Maître. Je vais voir si je peux faire cela intelligemment.
- On définit un coffre esclave par rapport à un coffre maître avec une commande comme l'a proposé Warzouz (/link maître esclave).
- Chaque ouverture d'un coffre esclave fera que son contenu sera remplacé par le contenu du coffre maître auquel il est lié.
- La fermeture de ce coffre mettra à jour le contenu du coffre maître.
- L'idée est de synchroniser l'accès au contenu maître, en Java pur, par exemple (instruction synchronized).
- Et le tour est joué !
J'ose espérer pouvoir mémoriser la "référence" de l'objet coffre, plutôt que sa position ou le retrouver à l'aide d'un panneau. Ça serait beaucoup plus simple et performant. J'essayerai aussi demain, si je peux.
Vu comme c'est parti, le plugin a l'air plutôt simple à réaliser, au final :) (Ça se voit peut-être pas, mais je suis très enthousiaste :3)
Re: [Plugin] LinkedChest (Coffres liés)
Coffre virtuel, j'aime bien le concept, c'est même plus simple que le principe du maitre esclave. Tous les coffres sont au même niveau.
Il n'y a plus qu'à gérer l'accès exclusif à un coffre virtuel entre l'ouverture et la fermeture du coffre.
Il n'y a plus qu'à gérer l'accès exclusif à un coffre virtuel entre l'ouverture et la fermeture du coffre.
Warzouz- Messages : 5919
Age : 52
Profil
Rôle: Déménageur nihiliste
Re: [Plugin] LinkedChest (Coffres liés)
Je vais essayer de faire une petite version simplifiée ce soir, si j'y parviens.
Mes objectifs à courts termes sont:
Je pense utiliser des panneaux pour faire simple dans un premier temps. C'est le panneau qui indiquera à quel coffre virtuel est relié un coffre physique.
Mes objectifs à courts termes sont:
- Ajouter un coffre
- Lier un coffre
- Gérer la concurrence
Je pense utiliser des panneaux pour faire simple dans un premier temps. C'est le panneau qui indiquera à quel coffre virtuel est relié un coffre physique.
Re: [Plugin] LinkedChest (Coffres liés)
Version stable beta 0.2 : http://www.mediafire.com/?8h4qhw8e2c1qo8h
Alors, comment ça marche:
Vous mettez un coffre avec des trucs dedans. Vous faites /linkedchest add nom_coffre
(/lc, /lchest, /linkchest marchent en théorie)
L'inventaire est mémorisé.
En mettant un panneau à côté du coffre, avec son nom entre "~", il est connecté à l'inventaire mémorisé.
Avec un deuxième coffre dans la même configuration (panneau avec le nom entre "~"), son inventaire est lié avec l'autre.
Je n'ai pas pu tester en multi ce que ça donne ! Si vous le faites, merci de me faire un retour. On essayera de tester ça demain avec Warzouz s'il est dispo :)
Vous pouvez poser le panneau autour du coffre (pas dans les diagonales), au-dessus (juste au-dessus, en mural ou pas), ou dessous (mais pas juste en-dessous, un bloc entre le coffre et le panneau, pour pouvoir le cacher).
Si ça marche bien, j'enroberais un peu tout ça, parce que c'est codé à l'arrache ! :p
Alors, comment ça marche:
Vous mettez un coffre avec des trucs dedans. Vous faites /linkedchest add nom_coffre
(/lc, /lchest, /linkchest marchent en théorie)
L'inventaire est mémorisé.
En mettant un panneau à côté du coffre, avec son nom entre "~", il est connecté à l'inventaire mémorisé.
Avec un deuxième coffre dans la même configuration (panneau avec le nom entre "~"), son inventaire est lié avec l'autre.
Je n'ai pas pu tester en multi ce que ça donne ! Si vous le faites, merci de me faire un retour. On essayera de tester ça demain avec Warzouz s'il est dispo :)
Vous pouvez poser le panneau autour du coffre (pas dans les diagonales), au-dessus (juste au-dessus, en mural ou pas), ou dessous (mais pas juste en-dessous, un bloc entre le coffre et le panneau, pour pouvoir le cacher).
Si ça marche bien, j'enroberais un peu tout ça, parce que c'est codé à l'arrache ! :p
Re: [Plugin] LinkedChest (Coffres liés)
Bon, en fait, après réflexion humide (sous la douche), ça ne marchera pas en multi, en l'état.
La synchro est effectuée lors de l'ouverture et la fermeture. Entre les deux... rien ! N'importe qui peut ouvrir le coffre pendant ce temps, le vider, alors que le premier à l'avoir ouvert aura toujours l'inventaire initial. Du moins, en théorie.
Si c'est effectivement le cas, ce que je pense fortement, la solution simple est d'autoriser un accès à la fois, et le tour est joué. On peut imaginer un système de timeout qui déplacerait le joueur au bout d'un certain temps pour qu'il ne monopolise pas l'accès à un coffre.
Egalement, une commande de notification pour indiquer au joueur qui a ouvert le coffre que l'on souhaite l'utiliser, pour qu'il se dépêche. Les admins pour TP le joueur bloquant.
Par exemple, si le joueur ne ferme pas le coffre en moins d'une minute, il est téléporté à 10 blocs de sa position initiale. (Ce qui fermera le coffre).
Je ne crois pas que Bukkit permette d'accéder à un même inventaire "virtuel" par plusieurs utilisateurs. A moins que je loupe un truc ou d'utiliser les éléments de minecraft.
En tout cas, ça reste possible, mais pas en accès multiple. J'aimerais quand même voir ce que ça donne pour vérifier mon sentiment.
Je pense aussi que l'on pourrait faire des coffres admins, aussi, uniquement ouvrable par un admin. A voir si c'est utile ou pas.
La synchro est effectuée lors de l'ouverture et la fermeture. Entre les deux... rien ! N'importe qui peut ouvrir le coffre pendant ce temps, le vider, alors que le premier à l'avoir ouvert aura toujours l'inventaire initial. Du moins, en théorie.
Si c'est effectivement le cas, ce que je pense fortement, la solution simple est d'autoriser un accès à la fois, et le tour est joué. On peut imaginer un système de timeout qui déplacerait le joueur au bout d'un certain temps pour qu'il ne monopolise pas l'accès à un coffre.
Egalement, une commande de notification pour indiquer au joueur qui a ouvert le coffre que l'on souhaite l'utiliser, pour qu'il se dépêche. Les admins pour TP le joueur bloquant.
Par exemple, si le joueur ne ferme pas le coffre en moins d'une minute, il est téléporté à 10 blocs de sa position initiale. (Ce qui fermera le coffre).
Je ne crois pas que Bukkit permette d'accéder à un même inventaire "virtuel" par plusieurs utilisateurs. A moins que je loupe un truc ou d'utiliser les éléments de minecraft.
En tout cas, ça reste possible, mais pas en accès multiple. J'aimerais quand même voir ce que ça donne pour vérifier mon sentiment.
Je pense aussi que l'on pourrait faire des coffres admins, aussi, uniquement ouvrable par un admin. A voir si c'est utile ou pas.
Re: [Plugin] LinkedChest (Coffres liés)
Au bout du timeout, tu peux synchroniser en l'état (pour récupérer ce qui a déjà été échangé) et vider le coffre esclave.
Cela m'étonne sérieusement que bukkit n'ai rien pour gérer l'accès concurrentiel. Dans le jeu de base, quand 2 personnes accèdent au même coffre, tu vois bien ce qui pris ou ajouté par un autre joueur changer en temps réel dans l'interface que tu as sous les yeux.
Il doit y avoir un évènement à chaque fois qu'un objet ou qu'un stack est modifié dans l'inventaire.
Cela m'étonne sérieusement que bukkit n'ai rien pour gérer l'accès concurrentiel. Dans le jeu de base, quand 2 personnes accèdent au même coffre, tu vois bien ce qui pris ou ajouté par un autre joueur changer en temps réel dans l'interface que tu as sous les yeux.
Il doit y avoir un évènement à chaque fois qu'un objet ou qu'un stack est modifié dans l'inventaire.
Warzouz- Messages : 5919
Age : 52
Profil
Rôle: Déménageur nihiliste
Re: [Plugin] LinkedChest (Coffres liés)
Oui, il y a bien un évènement. J'y ai pensé après coup. C'est InventoryClickEvent.
Après, je crois que j'avais essayé de bosser avec la première fois, mais que ça ne marchait pas.
Il faudrait que je reteste. Mais effectivement. Si à chaque fois que cet évènement est déclenché, je mets à jour mon inventaire virtuel, les autres qui feront pareil en même temps auront leur inventaire à jour. Faut voir si dans les faits c'est bien ça qui se passe.
Je sais bien que le jeu de base le permet, mais Bukkit ne permet pas de faire tout ce que l'on souhaite. Ou alors ce sont des choses qui sont planquées quelque part :P
Quand je vois que pour ouvrir l'inventaire d'un joueur à distance, le mec doit passer par le code de minecraft au lieu de Bukkit, ça montre bien qu'ils ne peuvent pas tout couvrir. Ça changera peut-être dans l'avenir.
Je vais essayer d'inclure cet évènement dans le plugin pour pouvoir tester ce que ça donne. Si tu es dispo ce soir pour essayer !
Edit: bon, je viens de voir un truc. La classe "Player" dispose d'une méthode "getOpenInventory". Voilà ce qu'il fallait. :) Je dois simplement jouer sur cet inventaire et pas celui du coffre. Chaque fois qu'un joueur ouvrira un coffre, j'irai remplacer cet inventaire qu'il voit. Idem si un joueur modifie l'inventaire. Après, je peux savoir qui ouvre mes coffres virtuels et alerter les inventaires de ces derniers en mettant à jour l'inventaire qu'ils observent.
Je vais modifier le plugin dans ce sens et on pourra tester ! :p
Edit: je viens de voir qu'on peut forcer la fermeture d'un inventaire ouvert ! InventoryView.close() ! OH ! Et que je peux ouvrir un inventaire via le joueur !!!!
Après, je crois que j'avais essayé de bosser avec la première fois, mais que ça ne marchait pas.
Il faudrait que je reteste. Mais effectivement. Si à chaque fois que cet évènement est déclenché, je mets à jour mon inventaire virtuel, les autres qui feront pareil en même temps auront leur inventaire à jour. Faut voir si dans les faits c'est bien ça qui se passe.
Je sais bien que le jeu de base le permet, mais Bukkit ne permet pas de faire tout ce que l'on souhaite. Ou alors ce sont des choses qui sont planquées quelque part :P
Quand je vois que pour ouvrir l'inventaire d'un joueur à distance, le mec doit passer par le code de minecraft au lieu de Bukkit, ça montre bien qu'ils ne peuvent pas tout couvrir. Ça changera peut-être dans l'avenir.
Je vais essayer d'inclure cet évènement dans le plugin pour pouvoir tester ce que ça donne. Si tu es dispo ce soir pour essayer !
Edit: bon, je viens de voir un truc. La classe "Player" dispose d'une méthode "getOpenInventory". Voilà ce qu'il fallait. :) Je dois simplement jouer sur cet inventaire et pas celui du coffre. Chaque fois qu'un joueur ouvrira un coffre, j'irai remplacer cet inventaire qu'il voit. Idem si un joueur modifie l'inventaire. Après, je peux savoir qui ouvre mes coffres virtuels et alerter les inventaires de ces derniers en mettant à jour l'inventaire qu'ils observent.
Je vais modifier le plugin dans ce sens et on pourra tester ! :p
Edit: je viens de voir qu'on peut forcer la fermeture d'un inventaire ouvert ! InventoryView.close() ! OH ! Et que je peux ouvrir un inventaire via le joueur !!!!
Re: [Plugin] LinkedChest (Coffres liés)
- Spoiler:
- J'ose espérer avoir trouvé le Saint Graal tant recherché ! Je teste déjà pour voir si ça marche en l'état :)
Voilà ce que j'ai fait:- J'ajoute un coffre: je vais ouvrir le coffre et mémoriser la vue du coffre.
- Quand j'ouvre à nouveau le coffre, c'est la vue mémorisée que j'ouvre !
- J'ajoute un coffre: je vais ouvrir le coffre et mémoriser la vue du coffre.
J'ai fait différemment. Je m'explique:
On ajoute un coffre et on mémorise son "inventaire". C'est objet Java. Unique. Le clique-droit sur un coffre (et non plus l'ouverture) va aller chercher l'inventaire mémorisé s'il existe (via recherche d'un panneau aux alentours, recherche que j'ai rendue plus permissive). Et j'ouvre moi-même cet inventaire !
La chose amusante est qu'un coffre lié ne s'ouvrira pas. Mais on aura le bon inventaire sous les yeux. La liaison fonctionne. A voir si la concurrence est gérée toute seule.
Autre chose amusante: le coffre maître s'ouvre quand on ouvre les coffres liés. Si on le casse, il perd son contenu (contrairement aux autres coffres). Et si on le place au même endroit, il va continuer à s'ouvrir à la place des autres. Mais en le cassant, il ne perdra plus son contenu.
Je propose de tester cela dès que possible pour vérifier la gestion de la concurrence.
Plugin en beta 0.3: http://www.mediafire.com/?xbjrkj09zb7n2p1
Edit: on peut accéder aux coffres dans d'autres mondes aussi :3
Dernière édition par Ghomerr le Ven 9 Mar 2012 - 22:13, édité 1 fois
Re: [Plugin] LinkedChest (Coffres liés)
Bon ! Testé avec Aigly (que j'ai trainé de force sur mon serveur de tests) et...
CA MARCHE !!!!!!
Edit: j'ai nettoyé un peu le code et virer les message de debug: http://www.mediafire.com/?xbjrkj09zb7n2p1 (version 0.3 toujours)
En l'état, ça fait exactement ce qu'on recherche avec quasiment rien. Plus qu'à faire la couche d'administration/gestion du plugin et ça sera bon :P
CA MARCHE !!!!!!
Edit: j'ai nettoyé un peu le code et virer les message de debug: http://www.mediafire.com/?xbjrkj09zb7n2p1 (version 0.3 toujours)
En l'état, ça fait exactement ce qu'on recherche avec quasiment rien. Plus qu'à faire la couche d'administration/gestion du plugin et ça sera bon :P
Re: [Plugin] LinkedChest (Coffres liés)
Magnifique.
Warzouz- Messages : 5919
Age : 52
Profil
Rôle: Déménageur nihiliste
Re: [Plugin] LinkedChest (Coffres liés)
Je vais réfléchir à la suite. Déjà une chose: on ne sera pas autorisé à détruire un coffre maître, au final. Je vais devoir m'en servir pour sauvegarder la configuration. Je vais sauvegarder la position du coffre maître et recharger les inventaires virtuels à leur première ouverture, s'ils ont été configurés.
Je pense pouvoir permettre aux admins l'ouverture d'un coffre lié à distance, aussi.
Je pense pouvoir permettre aux admins l'ouverture d'un coffre lié à distance, aussi.
Re: [Plugin] LinkedChest (Coffres liés)
J'ai codé une grosse partie du plugin:
- Coffres maîtres indestructibles (check location)
- Sauvegarder/Charger Location des coffres maîtres (à partir d'un fichier)
- Charger l'inventaire à la première ouverture d'un coffre esclave ou maître
- Coffres admins
- Ouvrir coffre à distance
- Supprimer un coffre (pas le coffre original)
- Si coffre maître : pas de panneau (inventaire primaire prioritaire)
- Test: afficher Location d'un coffre
- Commande pour savoir si coffre maître ou non
- Message multi-langues
- Permissions (coffres admins, autorisation de créer un panneau de coffre lié)
Re: [Plugin] LinkedChest (Coffres liés)
Quelques questions :
- Tu fais ton dev avec quelle version de bukkit ?
- Les coffres peuvent-ils être dans des mondes différents ?
- Le fait qu'un coffre soit dans un chunk non chargé a-t-il de l'importance ?
- Les maitres sont indestructibles, mais comment les retirer ? Comment cela se passe-t-il avec un worldedit ?
- Peux-on empiler les coffres et mettre les panneaux sur le coté ? N'y a-t-il pas risque de s'emmeller s'il y a plusieurs coffres et panneaux ? Peut-on travailler avec la banque de Rodville ou les halles de NR ?
- Tu fais ton dev avec quelle version de bukkit ?
- Les coffres peuvent-ils être dans des mondes différents ?
- Le fait qu'un coffre soit dans un chunk non chargé a-t-il de l'importance ?
- Les maitres sont indestructibles, mais comment les retirer ? Comment cela se passe-t-il avec un worldedit ?
- Peux-on empiler les coffres et mettre les panneaux sur le coté ? N'y a-t-il pas risque de s'emmeller s'il y a plusieurs coffres et panneaux ? Peut-on travailler avec la banque de Rodville ou les halles de NR ?
Warzouz- Messages : 5919
Age : 52
Profil
Rôle: Déménageur nihiliste
Re: [Plugin] LinkedChest (Coffres liés)
Réponses:
- J'utilise la dernière version sortie et recommandée, à savoir la 1.1-R8.
- Les coffres fonctionnent dans des mondes différents
- Je n'ai pas eu le cas où le coffre maître était dans un chunk non chargé. Dans la mesure où j'ai en mémoire l'inventaire du coffre, qu'il soit chargé ou pas, je pense que ça fonctionnera quand même. Cela fonctionne même si on détruit le coffre, en fait.
- J'ai choisi d'empêcher de détruire un coffre parce que lorsque l'on ajoute un coffre maître, l'inventaire original du coffre est conservé. Quand on détruit le coffre, les objets sont droppés mais l'inventaire virtuel existe toujours. Il y a donc potentiellement des duplicats d'objets. Je ne peux pas nettoyer l'inventaire puisque ça risque (je pense, je n'ai pas testé) de nettoyer aussi l'inventaire virtuel. Donc pour détruire un coffre maître, il faut au préalable supprimer l'inventaire virtuel, détruire le coffre maître, récupérer les loots originaux. Certes, c'est contraignant. Je pense que je vais voir si je peux améliorer cela...
- Oui, on peut empiler les coffres. Même si le coffre ne peut être ouvert, ça fonctionnera. Le plugin fonctionne sur le clic-droit sur une coffre, qu'il soit ouvrable ou non. Les pancartes sont cherchées tout autour du coffre dans un premier temps, puis le bloc sous le bloc sur lequel est posé le coffre (2 blocs sous le coffres donc, pour pouvoir le cacher), sur le bloc au-dessus du coffre et tout autour (sauf diagonales). Donc si tu mets un panneau sur le mur à côté du coffre, le panneau se trouve sur une diagonale autour du coffre, donc ça marche. L'algorithme de recherche s'arrête au premier panneau qu'il trouve (d'ailleurs, faut que je vérifie que c'est le premier panneau "valide" et non le premier panneau). Donc en théorie, s'il y a des panneaux partout, le premier valide trouvé sera celui qui sera appliqué. Les autres, mêmes valides, seront ignorés.
Page 1 sur 7 • 1, 2, 3, 4, 5, 6, 7
Sujets similaires
» Topic des coffres liés
» [Plugin] TravelGates
» Idée de plugin
» [EVENT] Les coffres de Pâques
» Des coffres qui traînent partout.
» [Plugin] TravelGates
» Idée de plugin
» [EVENT] Les coffres de Pâques
» Des coffres qui traînent partout.
Page 1 sur 7
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum