Jump to content

Anti Minigun


Trinx

Recommended Posts

Bonjour / Bonsoir,

Voilà, j'essaye de scripter un script qui protège contre les abus du Minigun, Lance-Roquette, Rhino, Hunter, etc..

Pour le moment j'ai essayé d'enlever l'accès au Minigun + Rhino à ceux qui n'ont pas accès à la commande KICK.

function AntiRhino (vehicle, seat, jacker) 
         if ( getElementModel (vehicle) == 432 ) then 
            if ( hasObjectPermissionTo (source, "function.kickPlayer")) then return end 
               removePedFromVehicle (source) 
               outputChatBox ("Vous n'avez pas le droit d'utiliser ce véhicule.", source, 255, 0, 0, true) 
        end 
end 
addEventHandler ("onPlayerVehicleEnter", getRootElement(), AntiRhino) 
  
function AntiMiniGun (previous, current) 
     if ( current == 38 ) then 
         if ( hasObjectPermissionTo (source, "function.kickPlayer")) then return end 
            takeWeapon ( source, 38 ) 
            outputChatBox ("Vous n'avez pas le droit d'utiliser cette arme.", source, 255, 0, 0, true) 
  
    end 
end 
addEventHandler ("onPlayerWeaponSwitch", getRootElement(), AntiMiniGun) 

Je précise qu'il n'y a aucune erreur au DebugScript, et j'utilise le logiciel : MTA Script Editor.

Merci d'avance.

Link to comment

Tu n'etais pas loin de la bonne solution ;)

  
function AntiRhino (vehicle, seat, jacker) 
    if ( getElementModel (vehicle) == 432 ) then 
        if not ( hasObjectPermissionTo (source, "function.kickPlayer")) then 
            removePedFromVehicle (source) 
            local x,y,z = getElementPosition(source) 
            setElementPosition(source,x, y, z+3) 
            outputChatBox ("Vous n'avez pas le droit d'utiliser ce véhicule.", source, 255, 0, 0, true) 
        else 
            ouputChatBox("A le droit") 
        end 
    end 
end 
addEventHandler ("onPlayerVehicleEnter", getRootElement(), AntiRhino) 
  
function AntiMiniGun (previous, current) 
    if ( current == 38 ) then 
        if not ( hasObjectPermissionTo (source, "function.kickPlayer")) then  
            takeWeapon ( source, 38 ) 
            outputChatBox ("Vous n'avez pas le droit d'utiliser cette arme.", source, 255, 0, 0, true) 
        else 
            ouputChatBox("A le droit") 
        end 
    end 
end 
addEventHandler ("onPlayerWeaponSwitch", getRootElement(), AntiMiniGun) 
  
  

Par contre je n'ai pas testé avec ton anti-MiniGun mais cela devrait marché sans soucis suite à ma modif.

Bonne journée ;)

Link to comment

Bon alors il y'a un problème au niveau des restrictions des armes, le minigun disparaît uniquement quand le joueur switch d'armes, donc quand il se give, il peux tirer, j'ai essayé avec d'autres events comme : "onResourceStart", ça ne fonctionne pas..

Que-doit je faire?

Link to comment

Avec la version 1.4 on utilisera l'event onWeaponFire mais l'heure est à la 1.3.4 alors on va contourner le probleme, on pourrait utiliser onPlayerDamage mais sans utiliser les damages une des solutions serai d'utiliser un timer qui fera appel à la fonction de verification. J'ai mis comme event onPlayerJoin donc à partir du moment ou le joueur va arriver sur le serveur toutes les 50ms il y aura une verification si le joueur a le minigun

script coté server :

  
function antiMiniGun() 
    setTimer(removeW, 50, 0, source) 
end 
addEventHandler ( "onPlayerJoin", getRootElement(), antiMiniGun) 
function removeW(source) 
    if not ( hasObjectPermissionTo (source, "function.kickPlayer")) and takeWeapon(source, 38) then          
        outputChatBox ("Vous n'avez pas le droit d'utiliser cette arme.", source, 255, 0, 0, true) 
    end 
end 
  
  

Link to comment

J'ai un nouveau problème.. ( et j'espère que c'est le dernier )

Le script est fonctionnel, mais à un moment, il flood les logs + debugscript (3), voici une photo:

1GHZa9T.png

Le flood s'arrête uniquement quand je restart, et encore après un moment, ça recommence a flood.. et ainsi de suite, pourtant le script est fonctionnel

Link to comment
  • Moderators

Bonjour tout le monde,

Je passais par là et j'ai décidé de m'en mêler.

C'est tout tout a fait normal que ça bug, car dès qu'un joueur quitte le serveur, son timer qui lui faisait référence continue toujours de tourner, il faudrait donc le killer (le timer hein, pas le joueur :lol: ).

Mais imaginez 50 joueurs sur le serveur, ça va faire 50 timers qui appelle tous la même fonction mais avec un argument différent. En plus à 50 millisecondes, il va certainement y avoir des lags car le serveur va avoir du mal à gérer ces 50 timers et le reste du gamemode.

Si ça ne tenait qu'à moi, j'aurais fait ça client-side comme ça chaque pc/joueur à son propre timer, et pour vérifier s'il à le droit de kick dans l'acl, je lui aurai mit un setElementData server-side lorsqu'il rejoint le serveur et ducoups côté client, je fais un petit getElementData et le tour est joué. Comme ça le serveur n'a rien à gérer et on gagne donc en performance.

Mais bon ici pour faire simple et rester server-side:

function antiMiniGun() 
    setTimer(removeW, 50, 0) 
end 
addEventHandler ( "onResourceStart", getResourceRootElement(getThisResource()), antiMiniGun) 
  
function removeW() 
    for k, player in ipairs (getElementsByType ("player")) 
        if not hasObjectPermissionTo (player, "function.kickPlayer") and takeWeapon(player, 38) then         
            outputChatBox ("Vous n'avez pas le droit d'utiliser cette arme.", source, 255, 0, 0, true) 
        end 
    end 
end 

A noter qu'il n'y a plus qu'un timer qui est créé, et seulement au démarrage du serveur. La fonction removeW récupère tous les joueurs dans la partie (évite forcément les bug d'argument null lorsqu'un joueur quitte la partie).

Voilà, on pourrai raccourcir le code pour le faire tenir en une fonction mais bon on rentrerai un peu plus dans des notions avancées de programming (les fonctions anonymes pour ceux à qui ça parleraient :D)

Cordialement,

Citizen

Link to comment

Tout d'abord Merci de ton aide,

Mais je veux garder des performances pour le serveur, mais je ne sais pas comment faire, ni utiliser des Trigger..

Ensuite je voudrait pas au démarrage du serveur, mais quand le joueur prend l'arme, ou quand il se connecte au serveur, ça serait mieux que redémarrer le serveur, sachant qu'il est hébergé.

Link to comment

Salut salut,

En effet j'ai fais une belle M**** plus haut ^^. L'une des solutions serait d'utiliser le client side mais Maxur (developpeur principal de notre serveur) à trouvé une solution bien optimisé que voici :

  
local lockedVehicle = { 
432, -- Rhino 
425 -- Hunter 
} 
  
  
local lockedWeapon = { 
35, -- Rocket Launcher 
36, -- Heat-Seeking RPG 
38 -- Minigun 
} 
  
  
function checkLockedVehicle(player) 
    if not hasObjectPermissionTo(player, "function.kickPlayer") then 
        for k, veh in ipairs(lockedVehicle) do 
            if getElementModel(source) == veh then 
                cancelEvent() 
                outputChatBox("Vous n'avez pas le droit d'utiliser ce véhicule.", player, 255, 0, 0) 
                break 
            end 
        end 
    end 
end 
addEventHandler("onVehicleStartEnter", getRootElement(), checkLockedVehicle) 
  
  
function checkLockedWeapon() 
    if not hasObjectPermissionTo(source, "function.kickPlayer") then 
        for k, weapon in ipairs(lockedWeapon) do 
            if getPedWeapon(source) == weapon then 
                takeWeapon(source, weapon) 
                outputChatBox("Vous n'avez pas le droit d'utiliser cette arme.", source, 255, 0, 0) 
                break 
            end 
        end 
    end 
end 
addEventHandler("onPlayerTarget", getRootElement(), checkLockedWeapon) 
  

Note : Concernant le minigun, il sera automatiquement supprimé si le joueur cible un joueur ou un vehicule. Comme tu peux le remarqué il a également ajouté un tableau en debut de script te permetant d'ajouter supprimer les armes interdites/véhicules. Personnelement je pense que utilser l'event onPlayerTarget est la meilleur des solutions en attendant la sortie de la 1.4 pour garder la totalité coté du script coté serveur ;)

Bonne soirée.

Link to comment
  • Moderators
Mais je veux garder des performances pour le serveur

Fait mon système client-side comme j'ai expliqué, et mon système n'a pas besoin de trigger oO (même si le setElementData synchronise la valeur client-side).

Le code de Maxur est difficilement perfectible, y a même le break pour arrêter la boucle for 8)

Je me pose quand même la question de savoir si l'event onPedWeaponSwitch est triggered lors d'un giveWeapon

Car si c'est le cas, on peut l'utiliser à la place de onPlayerTarget pour que l'arme soit immédiatement retirée alors que le système de maxur laisse quand même le gars se balader avec :lol:

A tester.

Link to comment
  • Moderators

Tu devrais pourtant, en effet, rien ne l'empêche de prendre un bazooka et de tirer à coté des autres joueurs et/ou véhicules du moment où il ne vise pas sur un élément de MTA. J'ai testé pour bien définir les conditions pour que l’événement soit triggered.

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...