GTAOnline.net

IV : Multiplayer (iv:mp) => Scripting IV:MP [Squirrel center] => Showroom IV:MP => Discussion démarrée par: Barto le 03 Mai 2010, 20:07:24

Titre: Codes & Scripts utiles
Posté par: Barto le 03 Mai 2010, 20:07:24
Bonjour à tous.
Je propose que l'on réunisse quelques codes et scripts utiles dans ce topic. Et même aider des personnes qui galèrent à créer une commande.
Je commence avec la commande /players, commande plutôt connue que l'on trouve facilement mais je la poste ici.

En haut du code :
const Green = 0X00FF00AA;

Dans onPlayerCommand :
function onPlayerCommand(playerid, command)
{
local cmd = split(command, " ");
if(cmd[0] == "/players")
{
    sendPlayerMessage(playerid, Green, "Joueurs connectés :");
    for(local i=0; i<=getPlayerSlots(); i++)
        {
             if(isPlayerConnected(i))
     {
                  sendPlayerMessage(playerid, Green, getPlayerName(i)+" ("+i+")");
     }
        }
}
return 0;
}

Vous pouvez bien sûr modifier la couleur comme vous le voulez.
Titre: Re : Codes & Scripts utiles
Posté par: Kawoua le 03 Mai 2010, 20:28:52
Super idée Bart je posterai quelques scripts utiles  :)
Titre: Re : Codes & Scripts utiles
Posté par: SPL1T le 23 Octobre 2010, 19:38:55
Morceaux de code destinés à ceux qui souhaitent créer un serveur roleplay.

==========================================================================================

• Le compteur de vitesse en km/h:

À placer avant la fonction onPlayerCommand:

function onPlayerEnterVehicle(playerid, vehicleid, seatid)
{
        setTimer(vStats, 100, -1, playerid);
        return 1;
}
addEvent("playerEnterVehicle", onPlayerEnterVehicle);

function getSpeed(vehicleid)
{
local velo = getVehicleVelocity(vehicleid);
return sqrt(pow(velo[0], 2) + pow(velo[1], 2) + pow(velo[2], 2))*3.6;
}
 
function vStats(playerid)
{
if(isPlayerInAnyVehicle(playerid))
{
local vehicleid = getPlayerVehicleId(playerid);
local vhealth = getVehicleHealth(vehicleid);
local speed = getSpeed(vehicleid).tointeger();
displayPlayerInfoText(playerid, speed +" km/h", 1000);
}
}

==========================================================================================

• La commande "/me" ou "/moi":

À placer avant la fonction onPlayerCommand:

function ProxDetector(radi, playerid, string,col1,col2,col3,col4,col5)
{
    if(isPlayerConnected(playerid))
    {
        local posx;
local posy;
        local posz;
        local oldposx;
        local oldposy;
        local oldposz;
        local tempposx;
        local tempposy;
        local tempposz;
        local pos = getPlayerCoordinates(playerid);
        oldposx = pos[0];
        oldposy = pos[1];
        oldposz = pos[2];
        for(local i = 0; i < MAX_PLAYERS; ++i)
        {
            if(isPlayerConnected(i))
            {
                local pos2 = getPlayerCoordinates(i);
                posx = pos2[0];
                posy = pos2[1];
                posz = pos2[2];
                tempposx = (oldposx -posx);
                tempposy = (oldposy -posy);
                tempposz = (oldposz -posz);
                if (((tempposx < radi/16) && (tempposx > -radi/16)) && ((tempposy < radi/16) && (tempposy > -radi/16)) && ((tempposz < radi/16) && (tempposz > -radi/16)))
                {
                    sendPlayerMessage(i, string, col1);
                }
                else if (((tempposx < radi/8) && (tempposx > -radi/8)) && ((tempposy < radi/8) && (tempposy > -radi/8)) && ((tempposz < radi/8) && (tempposz > -radi/8)))
                {
                    sendPlayerMessage(i, string, col2);
                }
                else if (((tempposx < radi/4) && (tempposx > -radi/4)) && ((tempposy < radi/4) && (tempposy > -radi/4)) && ((tempposz < radi/4) && (tempposz > -radi/4)))
                {
                    sendPlayerMessage(i, string, col3);
                }
                else if (((tempposx < radi/2) && (tempposx > -radi/2)) && ((tempposy < radi/2) && (tempposy > -radi/2)) && ((tempposz < radi/2) && (tempposz > -radi/2)))
                {
                    sendPlayerMessage(i, string, col4);
                }
                else if (((tempposx < radi) && (tempposx > -radi)) && ((tempposy < radi) && (tempposy > -radi)) && ((tempposz < radi) && (tempposz > -radi)))
                {
                    sendPlayerMessage(i, string, col5);
                }
            }
        }
    }
    return 1;
}

À placer dans la fonction onPlayerCommand:

if(cmd[0] == "/me" || cmd[0] == "/moi")
{
if(cmd.len() == 1) return sendPlayerMessage(playerid, "Utilisation: /me [texte].");
else return ProxDetector(30.0,playerid,getPlayerName(playerid) +" "+ astring(cmd, 1), 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
}

==========================================================================================
Titre: Re : Codes & Scripts utiles
Posté par: S!m le 11 Juin 2011, 05:18:12
Salut,

je relance ce topic:

//trop souvent mal conçue, ici on teste bel et bien une distance
function isPlayerInRange(playerid, radius, x, y, z)
{
local pos = getPlayerCoordinates(playerid);

pos[0] -= x;
pos[1] -= y;
pos[2] -= z;

return ((pos[0] * pos[0] + pos[1] * pos[1] + pos[2] * pos[2]) <= (radius * radius));//préfère ne pas utiliser x, y et z comme je ne suis pas sur de la façon dont les paramètres sont passés...
}

//même chose avec deux points connus
function pointToPoint(x, y, z, x2, y2, z2, radius)
{
        local tmpX, tmpY, tmpZ;

tmpX = x - x2;
tmpY = y - y2;
tmpZ = z - z2;

return ((tmpX * tmpX + tmpY * tmpY + tmpZ * tmpZ) <= (radius * radius));
}

Et voici une version mieux codée du ProxDetector:

//j'ai conservé l'ordre des paramètres même si je ne l'approuve pas tellement...
function ProxDetector(radius, playerid, string,col1,col2,col3,col4,col5)
{
        local dist;
        local radi = radius * radius;

        local tmpPos;
        local pos = getPlayerCoordinates(playerid);

        for(local i = 0; i < MAX_PLAYERS; i++)//es-ce que les ID commencent à 1? j'ai changé pour ça...
        {
            if(isPlayerConnected(i))
            {
                tmpPos = getPlayerCoordinates(i);//récupère la position du joueur

                tmpPos[0] -= pos[0];
                tmpPos[1] -= pos[1];
                tmpPos[2] -= pos[2];
                dist = (tmpPos[0] * tmpPos[0] + tmpPos[1] * tmpPos[1] + tmpPos[2] * tmpPos[2]);//calcul de la distance entre les deux joueurs, le tout est exposant 2

                if (dist < radi/256)//équivalent à 1/16 car exposant 2
                {
                    sendPlayerMessage(i, string, col1);
                }
                else if (dist < radi/64)//équivaut à 1/8
                {
                    sendPlayerMessage(i, string, col2);
                }
                else if (dist < radi/16)//équivaut 1/4
                {
                    sendPlayerMessage(i, string, col3);
                }
                else if (dist < radi/4)
                {
                    sendPlayerMessage(i, string, col4);
                }
                else if (dist < radi)
                {
                    sendPlayerMessage(i, string, col5);
                }

            }
        }
        return 1;
}

(Il est possible que ces fonctions comportent des erreurs de syntaxe comme je ne connais pas tellement le Squirrel..., j'ai fait en regardant certains codes sur le forum officiel...)

++Sim++
Titre: Re : Codes & Scripts utiles
Posté par: Ssk le 11 Juin 2011, 11:18:36
Sim je pense que les ID de joueurs commencent par 0, car c'est une spécificité de raknet que sa-mp et iv-mp utilisent ^^
Titre: Re : Re : Codes & Scripts utiles
Posté par: S!m le 11 Juin 2011, 16:08:56
Salut,

Sim je pense que les ID de joueurs commencent par 0, car c'est une spécificité de raknet que sa-mp et iv-mp utilisent ^^

Ok, merci :P
Je me demandais vu l'utilisation de ++i au lieu de i++, je n'ai pas vérifier si cela causait une incrémentation au début de l'appel d'ailleurs...

Sinon les codes semblent bon? (premier essaie en Squirrel hein....)

++Sim++
Titre: Re : Codes & Scripts utiles
Posté par: Ssk le 11 Juin 2011, 17:33:37
Je ne sais pas du tout lol je ne code pas en squirell :s
Titre: Re : Codes & Scripts utiles
Posté par: ApocKalipsS le 13 Juin 2011, 16:50:15
Ils me paraissent bon, mais je te conseil d'utiliser getPlayers() qu'une boucle for pour lister tes joueurs, c'est plus rapide car n'appelle pas isPlayerConnected et te donne en plus le nom du joueur.
Titre: Re : Codes & Scripts utiles
Posté par: Armans le 26 Juin 2011, 17:38:20
Sa pourrait m'aider car la je vais commenssais en squerriel mais bon je vais encore galèrer sa me soule il peuve pas crée un truck simple pour une fois  :wall
Titre: Re : Re : Codes & Scripts utiles
Posté par: ApocKalipsS le 27 Juin 2011, 13:52:54
Sa pourrait m'aider car la je vais commenssais en squerriel mais bon je vais encore galèrer sa me soule il peuve pas crée un truck simple pour une fois  :wall

Le Squirrel est très simple, suffit d'apprendre, et si tu fais plus simple, tu perds en possibilités ;).
C'est comme le vélo, si t'ajoute 36 roulettes pour que ça soit plus simple, tu va perdre en vitesse  :closedeyes
Titre: Re : Codes & Scripts utiles
Posté par: Heisenberg le 12 Septembre 2011, 19:02:53
Allez faisons vivre cette partie un peu !

COMMENT INSTALLER UN COMPTEUR SUR SON SERVEUR

Déjà il vous faut les images. Elles sont appelées par défaut Bck.png et Pin.png. Vous pouvez télécharger un grand nombre de "Speedometer" sur ce site :

http://www.gtagaming.com/downloads/search/speedometer (http://www.gtagaming.com/downloads/search/speedometer)

(Ne prendre bien sûr, que les speedometers compatibles avec GTA IV  :ninja )

Pour ma part j'ai choisis celui-ci :

http://www.gtagaming.com/downloads/gta-iv/misc-mods/9516 (http://www.gtagaming.com/downloads/gta-iv/misc-mods/9516)

1. Téléchargez le .zip et décompressez-le.
2. Dans le dossier AdamiX's speedometers\KMH\left\AdamiX, selectionnez les deux images, et déplacez-les dans le dossier "resources" de votre dossier serveur.
3. Ensuite, il faut que le joueur qui se connecte à cotre serveur puisse voir le speedometer lorsqu'il entre dans un véhicule. Vous devrez donc modifier votre clientscript (si vous en avez déjà un), ou créer un nouveau fichier .nut et mettre le code suivant :

local Speed1 = GUIImage("Bck.png");
Speed1.setVisible(false); // On défini l'image Bck, et on la rend invisible au démarrage du serveur

local Speed2 = GUIImage("Pin.png");
Speed2.setVisible(false);// On défini l'image Pin, et on la rend invisible au démarrage du serveur


local ply = getLocalPlayer();

if(isVehicleValid(getPlayerVehicleId(ply))) // Si le joueur entre dans un vehicule valide
    {
   local
            midScreenX = screen[0] / 2, // On défini la moitié de la longueur de l'écran pour que l'imaged s'adapte à toutes les définitions des ordis.
            midScreenY = screen[1] / 2; // Même chose pour la largeur

       Speed1.setPosition(midScreenX - 630, midScreenY + 127, false); // On règle la position de l'image par rapport à l'axe X et Y
   Speed1.setSize(256.0, 256.0, false);
       Speed1.setVisible(true); // On fait apparaître l'image.

   Speed2.setPosition(midScreenX - 630, midScreenY + 127, false); // Même principe que pour Speed1
       Speed2.setSize(242.0, 238.0, false);
   local KM =  sqrt(pow(getVehicleVelocity(getPlayerVehicleId(ply))[0], 2) + pow(getVehicleVelocity(getPlayerVehicleId(ply))[1], 2) + pow(getVehicleVelocity(getPlayerVehicleId(ply))[2], 2))*3.6;
   Speed2.setRotation(0.0, 0.0, KM);
            Speed2.setVisible(true);
} else {
   Speed1.setVisible(false);
Speed2.setVisible(false);
}
}
addEvent("frameRender", onFrameRender);

Ensuite, il faut que vous chargiez les images dans settings.xml, vous allez alors mettre le code qui va suivre dans ce fichier :

<clientresource>Bck.png</clientresource>
<clientresource>Pin.png</clientresource>

Voilà !

PS : Si c'est le speedometer right qui vous plait plus, vous pouvez l'installer, mais il faudra modifier la position ici :

Speed1.setPosition(midScreenX - 630, midScreenY + 127, false);
Et ici :

Speed2.setPosition(midScreenX - 630, midScreenY + 127, false);
Titre: Re : Codes & Scripts utiles
Posté par: ApocKalipsS le 12 Septembre 2011, 19:17:20
C'est plutôt pas mal, mais ça ne marchera pas, et si ça marche, ça risque à 99.9% de faire crasher le client  :laugh

En fait, dis toi que chaque fonctions prend un peu de CPU.
Tu n'a pas mit ton code dans un event, mais je suppose que tu le met dans la fonction frameRender (qui est appelée à chaque FPS).
Dans ton code, tu ajuste la taille, la position, tu récupère l'ID du véhicule plusieurs fois et tu récupère la velocity du véhicule plusieurs fois aussi.
Si un joueur a un FPS de 25 par exemple, ça veut dire qu'il va devoir effectuer ce code 25 fois, donc soit il lag, soit il crash.
Je te recommande de récupérer l'ID de la voiture quand le joueur monte dans sa voiture, définir une variable pour la velocity que tu réutilisera & définir une variable pour vérifier si il est dans un véhicule.
Il faut vraiment optimiser au maximum son code pour les scripts client, et se dire que le joueur a un monocore à 100mhz...
Titre: Re : Codes & Scripts utiles
Posté par: Heisenberg le 12 Septembre 2011, 19:51:36
Citer
Je te recommande de récupérer l'ID de la voiture quand le joueur monte dans sa voiture, définir une variable pour la velocity que tu réutilisera & définir une variable pour vérifier si il est dans un véhicule.
Il faut vraiment optimiser au maximum son code pour les scripts client, et se dire que le joueur a un monocore à 100mhz...

Je savais pas tout ça héhé. Mais j'me sens complètement perdu là. Je ne sais pas du tout quelle fonction utiliser :(



Titre: Re : Codes & Scripts utiles
Posté par: Gilux le 12 Septembre 2011, 22:02:42
Un timer ?  :happy
Titre: Re : Codes & Scripts utiles
Posté par: ApocKalipsS le 13 Septembre 2011, 17:49:55
Non, frameRender, ça sera bien plus fluide et + optimisé.
Cette fonction est appelée à chaque images.
Titre: Re : Codes & Scripts utiles
Posté par: Heisenberg le 01 Février 2012, 23:24:34
Citer
Et une fonction qui retourne un string avec le nom de la météo

T'as des délires bizarres toi...  :dejadehors
Merci du partage.
Titre: Re : Codes & Scripts utiles
Posté par: ApocKalipsS le 05 Février 2012, 10:12:23
Tu peux utiliser un switch dans ce cas là : c'est plus rapide et plus simple à comprendre au niveau syntaxique.
Pour le .tostring(), tu n'en a pas besoin car tu les guillemets indiquent déjà que c'est une chaîne. Donc ici, tu converti une chaîne en chaîne.
Ensuite, pour améliorer la compréhension du code, tu peux enlever les accolades (si tu n'utilise pas switch, comme tu n'a qu'une fonction appelée).