Jump to content

Userpanel problème de map queue avec le /vr + question


Recommended Posts

Salut, j'ai un soucis avec mon userpanel, dans mon userpanel je peux acheter plusieurs maps a la fois et ils s'ajoutent dans le map queue, malheureusement quand nous faisons un /vr pour restart la map, la map qui suis dans le map queue se supprime et laisse place a la map qui est redo.

J'aimerais donc modifié cela pour pouvoir acheté seulement une map a la fois puis quand la map est passé pouvoir en racheté une autre.

-- Buy a next map 
function buyMap(thePlayer,mapName,command) 
    local account = getPlayerAccount(thePlayer) 
    if not (isGuestAccount(account)) then 
        local playerCash = tonumber(getAccountData(account,"cash")) 
        if not (mapName == "") then 
            if playerCash >= mapCost then 
                if command then 
                    mapName = getMapName(mapName) 
                else 
                    mapName = tostring(mapName) 
                end 
                if not mapTimer[mapName] then 
                    table.insert(mapQueue,mapName) 
                    local freeMaps = tonumber(getAccountData(account,"freeMaps")) 
                    if freeMaps ~= 0 then 
                        addStat(account,"freeMaps",-1) 
                    else 
                        setAccountData(account,"cash",playerCash - mapCost) 
                    end 
                    addStat(account,"buyedMaps",1) 
                    scoreboardRefresh(thePlayer) 
                    mapTimer[mapName] = true 
                    setTimer(resetMapTimer,1500000,1,mapName) 
                    if #mapQueue == 1 then 
                        triggerEvent("onUseranelWantSetMap",getRootElement(),mapQueue[1]) 
                     end 
                    callClientFunction(thePlayer,"setFreeMapPurchase",getAccountData(account,"freeMaps")) 
                    unlockAchievement(thePlayer,18)     
                    unlockAchievement(thePlayer) 
                    outputChatBox("#0099CCNext: #FFFFFF"..getPlayerNametagText(thePlayer).." #FFFFFFbought map "..tostring(mapName).."",getRootElement(),255,255,255,true) 
                    callClientFunction(getRootElement(),"updateMapQueueList",mapQueue) 
                else 
                    showServerMsg(thePlayer,"Buy nextmap","#FFFFFFYou can't set this map now, wait some time to set!") 
                end 
            else 
                showServerMsg(thePlayer,"Buy nextmap","#FFFFFFYou don't have enough money to set a map!") 
            end 
        else 
            showServerMsg(thePlayer,"Buy nextmap","#FFFFFFPlease select a map from the list first!") 
        end 
    end 
end 

Et ma petite question a part, je possède un multigamemode, mais il me manque un fichier qui permet de load les maps, le scripteur ma dit qu'il s'agissait d'un map loader en php, si quelqu'un serait apte a m'aidé sur ce sujet.

Et j'ai aussi une question par rapport au downlaod des maps sur un serveur, certains serveurs ou l'on a pas besoin de re dl la musique a chaque fois ce qui acclère le temps de téléchargement de tout les maps.

Cordialement

Link to comment
  • Moderators
J'aimerais donc modifié cela pour pouvoir acheté seulement une map a la fois puis quand la map est passé pouvoir en racheté une autre.

Nan c'est débile, pourquoi pas faire plus simple et juste corriger ce bug qui vient de la commande /vr ??? C'est débile parce que si tu fais ça, c'est le plus rapide qui aura le droit d'acheter une map. Autant te dire que ça frustrera pas mal de joueur s'ils sont à chaque fois trop lent.

Montre moi la commande /vr. Est-ce que c'est un vote ? (on dirai vu que vr veut sûrement dire vote restart). Si c'est un vote je veux également la partie (qui doit sûrement ce trouver dans une autre fonction) qui se charge de valider le vote et qui se charge également de rajouter la map à la map queue.

Cette partie là doit sûrement faire

mapQueue[1] = mapName 

ce qui change la valeur de la là 1ère ligne du tableau par la valeur de mapName et donc remplace la map qui devait suivre.

Il faudrait plutôt faire comme ceci:

table.insert(mapQueue, mapName, 1) 

le 3ème argument qui est optionnel précise là position à laquelle elle doit être insérée (ici en 1ère position).

Et après ça le vr fonctionnera sans problème.

Et ma petite question a part, je possède un multigamemode, mais il me manque un fichier qui permet de load les maps, le scripteur ma dit qu'il s'agissait d'un map loader en php, si quelqu'un serait apte a m'aidé sur ce sujet.

Tu aurais dû faire un autre topic pour ça. Mais personne ici ne va travailler pour toi gratuitement (le travail étant de coder un map loader en php et qui doit être compatible avec "ton" multigamemode).

Et j'ai aussi une question par rapport au downlaod des maps sur un serveur, certains serveurs ou l'on a pas besoin de re dl la musique a chaque fois ce qui acclère le temps de téléchargement de tout les maps.

Idem, un autre topic normalement car rien à voir avec le titre de ce dernier. Et heuuu je vois pas de question dans cette phrase.

Comment ils font ? Bah tout simplement en évitant de mettre un nom de map déjà connu (sur d'autre serveurs).

Une map étant une ressource (normalement, mais vu que y a un loader php, je pense que ce n'est pas le cas), elle possède un nom. Lorsqu'un joueur charge cette map pour la 1ère fois, il télécharge cette ressource (qui contient les scripts clients, les sons, les images etc) et le stock dans le dossier de cache de MTA. Si le joueur va sur un autre serveur qui lui fait télécharger une ressource qui porte le même nom que ta ressource (la map en question) qui n'est exactement la même, MTA va donc télécharger cette ressource en remplaçant ta map qui était stockée dans le cache de son jeu. Ce qui fait que s'il revient sur ton serveur, et que cette map revient, ça va encore ! la télécharger.

En gros faudrait prefixer toutes tes ressources par 2 ou 3 lettres qui représente ton serveur. Genre si ton serveur s'appel "My Awesome Server" tu préfixes toutes tes ressources par "mas_" comme ça si une map s'appelle "hunterrace", tu la renommes en "mas_hunterrace".

Avec ce prefix tu peux être sûr que tes joueurs ne téléchargera tes ressources qu'une seule fois.

Cordialement,

Citizen

Link to comment

Salut, merci pour ta reponse rapide,

Voila mon voteredo:

--- VR --- 
local playersVoted = 0 
local sistaredando = 0 
  
function Votaredo(thePlayer) 
    local currentMap = exports.mapmanager:getRunningGamemodeMap() 
    local mapName = getMapName(currentMap) 
    if getElementData( thePlayer, "havotato" ) == false then  
        if not redo[mapName] then 
            if sistaredando == 0 then 
                playersVoted = playersVoted + 1 
                outputChatBox("[VR] "..getPlayerName(thePlayer).."  #FFFFFFvoted for a redo. ["..playersVoted.."/".. math.floor(getPlayerCount() /2 + 0.5) .."]",getRootElement(),0,136,255, true) 
                setElementData( thePlayer, "havotato", true) 
                if playersVoted >= math.floor(getPlayerCount() /2 + 0.5) then 
                    redo[mapName] = setTimer(function(mapName) redo[mapName] = false end,900000,1,mapName) 
                    outputChatBox ("[VoteRedo] #FFFFFFThis map will be restarted by vote", thePlayer,0,136,255,true) 
                    sistaredando = 1 
                    if #mapQueue ~= 0 then 
                        for i=#mapQueue,1 do 
                            mapQueue[i+1] = mapQueue[i] 
                        end 
                        mapQueue[1] = mapName 
                        triggerEvent("onUseranelWantSetMap",getRootElement(),mapQueue[1]) 
                    else 
                        mapQueue[1] = mapName 
                        triggerEvent("onUseranelWantSetMap",getRootElement(),mapQueue[1]) 
                    end 
                    callClientFunction(getRootElement(),"updateMapQueueList",mapQueue) 
                end 
            else 
                showServerMsg(thePlayer,"Voteredo","This map will be redone.") 
            end 
        else 
            showServerMsg(thePlayer,"Voteredo","This map has been already redone.") 
        end 
    else 
        showServerMsg(thePlayer,"Voteredo","You already voted.") 
    end 
end 
addCommandHandler ( "vr", Votaredo ) 

Et serais tu apte a me coder un map loader compatible avec mon multigamemode et pour quel somme environ.

Link to comment
  • Moderators

Envoi-moi un lien de téléchargement en PM que je regarde un peu comment ça se passe.

Un php loader implique la création d'un serveur web et qui devait sûrement contenir un site web pour le serveur avec une section pour gérer les maps.

Le plus simple sera sûrement de modifier la ressource pour le faire revenir à un système basique (toutes les maps sont stockées dans leur propre ressource et sont démarrer pour les charger).

J'ai pas beaucoup de temps de dispo mais je vais quand même regarder pour voir combien de temps ça prendrait.

EDIT: Ah oui et pour le vote redo ! ^^

Comme tu peux le voir, j'avais bien raison mais c'est bizarre que ça ne marche pas comme il faut vu qu'il a bien fait attention que ça ne remplace pas la map suivante car il fait ceci avant:

for i=#mapQueue,1 do 
    mapQueue[i+1] = mapQueue[i] 
end 

Ce qui à pour effet de décalé toutes les maps de la mapQueue d'un cran vers le bas pour libérer et remplacer sans problème la 1ère place dans cette mapQueue.

En gros il a recoder ce que fait:

table.insert(mapQueue, mapName, 1) 

Donc je reste très perplexe.

Donc voilà ma version, techniquement c'est EXACTEMENT la même chose mais écrit différemment:

--- VR --- 
local playersVoted = 0 
local sistaredando = 0 
  
function Votaredo(thePlayer) 
    local currentMap = exports.mapmanager:getRunningGamemodeMap() 
    local mapName = getMapName(currentMap) 
    if getElementData( thePlayer, "havotato" ) == false then 
        if not redo[mapName] then 
            if sistaredando == 0 then 
                playersVoted = playersVoted + 1 
                outputChatBox("[VR] "..getPlayerName(thePlayer).."  #FFFFFFvoted for a redo. ["..playersVoted.."/".. math.floor(getPlayerCount() /2 + 0.5) .."]",getRootElement(),0,136,255, true) 
                setElementData( thePlayer, "havotato", true) 
                if playersVoted >= math.floor(getPlayerCount() /2 + 0.5) then 
                    redo[mapName] = setTimer(function(mapName) redo[mapName] = false end,900000,1,mapName) 
                    outputChatBox ("[VoteRedo] #FFFFFFThis map will be restarted by vote", thePlayer,0,136,255,true) 
                    sistaredando = 1 
                    table.insert(mapQueue, mapName, 1) 
                    triggerEvent("onUseranelWantSetMap", getRootElement(), mapQueue[1]) 
                    callClientFunction(getRootElement(),"updateMapQueueList",mapQueue) 
                end 
            else 
                showServerMsg(thePlayer,"Voteredo","This map will be redone.") 
            end 
        else 
            showServerMsg(thePlayer,"Voteredo","This map has been already redone.") 
        end 
    else 
        showServerMsg(thePlayer,"Voteredo","You already voted.") 
    end 
end 
addCommandHandler ( "vr", Votaredo ) 

D'après ce que je lis, ça devrait très bien marché, mais ça aurait aussi dû marcher avec le code d'origine.

Est-tu bien sûr que ce vote redo remplace la map qui devait venir après ? Ou n'est-ce pas en réalité un problème d'update de la liste des maps du côté client ?

Pour ça vérifie bien que la map qui se lance après ne soit pas celle qui devait normalement être jouée s'il n'y avait pas eu de voteredo.

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...