MT-Eurythmia / Eurythmia-server

Eurythmia server repository: mods, subgame, configuration, issues tracker, and a few other.
http://eurythmia.langg.net
7 stars 7 forks source link

Les stacks max = 99 sont un bug de Minetest corrigé #110

Closed mgl512 closed 7 years ago

mgl512 commented 7 years ago

Moving large itemstacks to empty itemstacks results in lost items. #6038

paly2 commented 7 years ago

C'est plutôt bien que ce glitch soit corrigé, même si c'était pratique parfois. Le privilège creative offre un nouveau comportement qui le remplace: maintenant, les stacks ne sont plus décrémentées lorsque le node est posé pour les joueurs qui possèdent ce privilège.

mgl512 commented 7 years ago

C'est le comportement actuel du serveur qui est un bug. Comme l'explique l'auteur de l'issue d'origine, ils ont défini un stack_max pour les lingots d'or à 999. Son serveur n'en tient aucun compte et dès que quelqu'un essaie de prendre une ancienne pile de plus de 99 dans un coffre ou dans son inv, la pile est tronquée à 99. Tout déplacement de l'inventaire tronque. C'est ce qui est arrivé à ma dirt. Et le give sépare la quantité voulue en plein de stacks de 99, saturant les emplacements d'inventaire.

paly2 commented 7 years ago

Tout déplacement de l'inventaire tronque. C'est ce qui est arrivé à ma dirt. Et le give sépare la quantité voulue en plein de stacks de 99, saturant les emplacements d'inventaire.

Il n'y a là aucun bug, la stack_max de la dirt est de 99, il est normal que la commande /give sépare en stacks de 99, et que les stacks plus grandes soient tronquées. Si la stack_max de la dirt était de 200, /give séparerait en stacks de 200 et les stacks plus grandes seraient tronquées à 200.

mgl512 commented 7 years ago

Il n'y a là aucun bug, la stack_max de la dirt est de 99, il est normal que la commande /give sépare en stacks de 99, et que les stacks plus grandes soient tronquées.

Absolument pas. Ça n'a jamais fait ça depuis le couronnement de Clovis et ça ne le fera plus à la prochaine mise à jour du serveur. J'ai des stacks de 120+ fleurs et végétation dans un coffre bleu, derrière le batiment du dome, pour décorer les collines. Et, sous la mer du spawn, il doit toutjours y avoir, quelque part dans un coffre, une pile de 450 têtes de chat que tu es censé avoir donné toi-même à un joueur parti sur d'autres serveurs qui aurait perdu sa maison dans un accident de /deleteblocks ou dans le rollback de novembre 2016 plutôt.

Dans son issue, Exeter Dad (la ville des collégiens en jupe!) dit qu'il a mis la stack_max de ses lingots d'or à 999 et le moteur Minetest ne respecte pas cette valeur, il tronque ce qui est déplacé dans les manipulations d'nventaire à la valeur 99, probablement hardcodée, et le reste de la quantité est perdu. Le moteur appelle les mauvaises fonctions dans le survol que j'ai pu faire du patch de correction.

mgl512 commented 7 years ago

Non, ce comportement stupide de limiter les stacks à une quantité de stack_max persiste avec la mise à jour du moteur. Une grosse nuisance de plus de la part des devs.

paly2 commented 7 years ago

Justement, la possibilité de créer des stacks de taille supérieure au stack_max était un glitch - sans-doute corrigé par le même patch que celui qui corrige l'issue en question -, la possibilité de les créer n'était pas un choix volontaire des devs. Maintenant l'engine empêche leur création: toutes les stacks doivent se conformer à la stack_max, give ou pas give. Si une stack non-conforme est détectée lors d'une opération que l'engine effectue (un mouvement dans l'inventaire, par exemple), elle est automatiquement tronquée pour maintenir la cohérence de la stack_max.

Les stacks de taille supérieure au stack_max sont toujours allées à l'encontre de la cohérence de l'engine, c'était presque miraculeux si elles n'engendraient quasiment aucun bug (il y en avait toutefois, par exemple, le stacks tronquées lors des drops, et on ne les a certainement pas tous découverts).

mgl512 commented 7 years ago

Pour moi c'est un problème parce qu'on ne peut pas entrer et sortir du mode créatif facilement. Pour réparer du grief, je dois maintenant entrer en créatif avec une longue commande /grant qui va me répondre en saturant mon écran de plein de lignes de privs dont je n'ai rien à faire. Pareil quand je vais en sortir. Et quand j'en suis sorti, inventory_plus ne le remarque pas et ne m'affiche pas les recettes. Il fait comme si j'étais toujours en créatif. Je peux réduire le temps pour taper les commandes par des raccourcis clavier (dont les devs ont jeté la pull request il y a quelques années) ou des commandes en mod client mais mon écran sera toujours rempli de saletés.

Au lieu de mettre l'API de mobs de plus de 100 lignes LUA en C++, les devs font une police de stack_max et détruisent l'ascenseur sneak et le saut de 2 blocs de haut parce que Minecraft n'en a pas. Minecraft a une commande créative simple au moins... Minetest devient de plus en plus un problème au lieu d'être un jeu pour moi.

paly2 commented 7 years ago

Et quand j'en suis sorti, unified_inventory ne le remarque pas et ne m'affiche pas les recettes.

Il faut pour afficher les recettes cliquer sur la deuxième icône du bas en partant de de la gauche.

Je peux réduire le temps pour taper les commandes par des raccourcis clavier (dont les devs ont jeté la pull request il y a quelques années) ou des commandes en mod client mais mon écran sera toujours rempli de saletés.

Pour les raccourcis claviers, je suis d'accord, c'est vraiment dommage... Pour la CSM, il est tout à fait possible d'empêcher l'affichage du message:

local localplayer
minetest.register_on_connect(function()
        localplayer = minetest.localplayer
end)

local waiting_for_message = false
local after_wait_function = function(_) end

minetest.register_chatcommand("creative", {
    description = "Toggles Creative Mode",
    params = "",
    func = function(param)
        waiting_for_message = true
        after_wait_function = function(message)
            waiting_for_message = true
            if message:find("creative") then
                after_wait_function = function(message)
                    minetest.display_chat_message("Revoked you creative")
                end
                minetest.run_server_chatcommand("revoke", localplayer:get_name().." creative")
            else
                after_wait_function = function(message)
                    minetest.display_chat_message("Granted you creative")
                end
                minetest.run_server_chatcommand("grantme", "creative")
            end
        end
        minetest.run_server_chatcommand("privs", "")
    end
})

minetest.register_on_receiving_chat_message(function(message)
    if waiting_for_message then
        waiting_for_message = false
        after_wait_function(message)
        return true
    end
end)