• 28 Mars 2024, 17:54:26


Auteur Sujet: Tutorial 8a: Ion Cannon  (Lu 15723 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne spykerc8

  • *
  • 'The GTAOnline.fr GodFather'
  • Messages: 3821
    • Voir le profil
    • http://www.gtaonline.fr
Tutorial 8a: Ion Cannon
« le: 30 Mars 2007, 19:16:55 »
[yt=425,350]xD4pHYISHRM[/yt]

Lien du script : http://mtasa.com/scripts/script8a.ion.lua
Vidéo HD : http://www.mtasa.com/videos/scriptvideo8.wmv

Définir les variables et préparer le script.

Code: (lua) [Sélectionner]
root = getRootElement ()
players = {}

outputChatBox ( "Ion cannon by Ransom" )
ion_rotx = 0
ion_loops = 0
ion_explosionTimer = 0
ion_cannonActivated = false
ion_cancelActivation = false
ion_beamSize = 5
ion_beamFlareSize = 5
players = getElementsByType ( "player" )

Donne accès à tous les joueurs sur le serveur.

Code: (lua) [Sélectionner]
addEventHandler ( "onResourceStart", root, "ResourceStartIonCannon" )
function ResourceStartIonCannon ( name, root )
if name ~= getThisResource() then return end
        for k,v in players do
        -- for all players in the "players" array
        bindKey ( v, "f", "down", "placeIonCannonBeacon" )
        -- bind the key f for triggering the ion cannon
        end
end

addEventHandler ( "onPlayerJoin", root, "ionPlayerJoin" )
function ionPlayerJoin ()
        bindKey ( source, "f", "down", "placeIonCannonBeacon" )
        --if a player joins after the resource loaded, bind their f key to trigger the ion cannon also
end

Partie du script pour utiliser le canon quand la touche 'f' est utilisée, affiche le curseur de la sourie.

Code: (lua) [Sélectionner]
function placeIonCannonBeacon ( player, key, state )
        if ( ion_cannonActivated == false ) and ( ion_cancelActivation == false ) and ( nuke_cancelActivation == false )
        and ( nuke_cannonActivated == false ) then
    --These conditions prevent triggering the same weapon twice or triggering the other weapon at the same time.
        --Both weapons cannot be triggered because explosions are stretched to the limit, explosions would be random
        defineLaunchType = key
        --This is used later on the onPlayerClick function to tell it what weapon to launch
        showCursor ( player, true )
        ion_cancelActivation = true
        else
                if ion_cancelActivation == true then
                showCursor ( player, false )
                end
                --Prevents cursor from getting messed up if cursor is show for f or g and the opposite key is hit
        ion_cancelActivation = false
        --ion_cancelactivation is true when the cursor is showing. This is necessary along with asking if the actual
        --weapon is active to prevent problems with the cursor and weapon activation between both weapons and themselves
                      if ion_cannonActivated == true then
            outputChatBox ( "Ion cannon has already been activated", activator )
            else
            outputChatBox ( "Cannot activate ion cannon and nuke at the same time", activator )
            end
            --This statement says that if the ion cannon is already in use, display a meassage about it being in
                        --use on f press. Else, if the above conditions were not satisifed and the nuke is not active, it meant
                        --the ion cannon was active. Therefore, display the other message that both weapons cannot be used at
                        --the same time.
        end
end


Quand le joueur click avec la souris

Code: (lua) [Sélectionner]
addEventHandler ( "onPlayerClick", root, "playerClick" )
function playerClick ( button, state, clickedElement, x, y, z )
        if defineLaunchType == "f" then
        --If the player clicked, we check if the key is equal to f or g. This will dictate which onPlayerClick function
        --commences between the ion cannon and nuke scripts
        ion_cancelActivation = false
        --Since the weapon is now in use, you have no chance to abort by pressing the key again, therefore this is false
        defineLaunchType = nil
    --This must be reset to nil so it will not fire the ion cannon next time on click if g was pressed instead of f
        --(which triggers nuke)
        ion_beaconx = x
        ion_beacony = y
        ion_beaconz = z
        --Set the ion cannon beacon (detonation spot) coordinates to the spot the mouse cursor clicked on the game map
        local playerz, playerz, playerz = getElementPosition ( source )
    --For the above line, getElementPosition outputs 3 varibles, but I only want z so I overwrote 1 varible called
        --playerz as the function went through and assigned the XYZ values to varible x, varible y, and varible z
        --respectively.
                        if ( button == "left" ) and ( state == "down" ) and ( ion_cannonActivated == false ) then
            --When the left mouse button is pressed down (not when released), if ion cannon is not active then
                        ion_cannonActivated = true
            --Set this varible to true, which will be used to avoid double launches & double weapon usage
                        showCursor ( source, false )
            --Weapon beacon was chosen and the launch is initiating to that point. Hide cursor.
                        ionBeam = createMarker ( ion_beaconx, ion_beacony, ion_beaconz, "checkpoint", 5, 255, 255, 255, 255 )
                        ionBeam2 = createMarker ( ion_beaconx, ion_beacony, ion_beaconz, "checkpoint", 5, 255, 255, 255, 255 )
                        ionBeam3 = createMarker ( ion_beaconx, ion_beacony, ion_beaconz, "checkpoint", 5, 255, 255, 255, 255 )
                        ionSecondaryBeam = createMarker ( ion_beaconx, ion_beacony, ion_beaconz, "checkpoint", 5, 255, 255,
                        255, 255 )
                        ionSecondaryBeam2 = createMarker ( ion_beaconx, ion_beacony, ion_beaconz, "checkpoint", 5, 255, 255,
                        255, 255 )
                        ionSecondaryBeam3 = createMarker ( ion_beaconx, ion_beacony, ion_beaconz, "checkpoint", 5, 255, 255,
                        255, 255 )
                        ionBeamFlare = createMarker ( ion_beaconx, ion_beacony, ion_beaconz, "corona", 5, 255, 255, 255, 255 )
                        --create six markers at the beacon point. The marker checkpoint will extend into the sky, but will end
                        --at the given z. 6 markers are used to ensure the beam looks full as I rapidly delete and recreate the
                        --markers in the next functions.
                        setTimer ( "ionExplosion", 50, 1 )     
                        setTimer ( "ionShot", 100, 20 )
                        setTimer ( "ionShot2", 150, 20 )
                        --Trigger the functions that will create the ion cannon shot and explosion imitation. 50ms 1 time, 100ms
                        --20 times, and 150ms 20 times respectively.
                        else
                        ion_activator = getPlayerFromNick ( source )
                        showCursor ( source, false )
                        --Makes sure the cursor will not show again for detonation unless the ion cannon is not active.
                        --Activator is used to display output messages in the other functions that activations/launches
                        --arent possible.
                        end
        end
end

Crée l'illusion visuelle d'un faisceau lumineux venant du ciel.

Code: (lua) [Sélectionner]
function ionShot ()
        ion_beamSize = ion_beamSize + 1
        setMarkerSize ( ionBeam, ion_beamSize )
        setMarkerSize ( ionBeam2, ion_beamSize )
        setMarkerSize ( ionBeam3, ion_beamSize )
        if ( ion_beamSize == 6 ) then
        setTimer ( "ionShotFlare", 3, 150 )
        end
        --The first 3 markers making the ion beam are gradually increased at +10 in 1 second. When the function has
        --looped 6 times (6/10 of a second), the flare (again, its a corona marker but I call it a flare) grow
        --function is triggered.
end

function ionShot2 ()
        setMarkerSize ( ionSecondaryBeam, ion_beamSize )
        setMarkerSize ( ionSecondaryBeam2, ion_beamSize )
        setMarkerSize ( ionSecondaryBeam3, ion_beamSize )
        --These beams increase at a different rate, since beamSize is changing more rapidly in the ionShot function.
        --They stay a little smaller than the main 3 markers and assist the "grow" look while keeping the beam visible
        --while the markers change size.
end

function ionShotFlare ()
        ion_beamFlareSize = ion_beamFlareSize + 1
    setMarkerSize ( ionBeamFlare, ion_beamFlareSize )
    --Every 3ms for 150 loops, the flare size increases. This makes a large glow that appears to be caused by the
        --beam's light
end

function ionExplosion ()
        if ion_explosionTimer == 0 then
        --We set this value when the script started. I do so I can keep looping through this function without
        --resetting it.
        setTimer ( "ionExplosion", 170, 18 )
        --Trigger this function to initiate 18 times in 170ms intervals.
        ion_explosionTimer = 1
        --Set the explosion timer flag to 1 so it is not done again with the looping (could have been true/false)
        else
        r = ion_beamSize --min/max blast radius: 1.5-28
        --r will serve as our explosion radius. For the ion cannon, the explosions coming from the ion cannon
        --will gradually increase distance from the center point in a circular motion, since I defined r as
        --ion_beamSize, which is gradully increasing in size in the ionShot function at the same time.
        angleup = randInt(0, 35999)/100
        --Choose a random angle. A value between 0 and 35999 is divided by 100 because we want
        --to have 2 random decimal places for as well, rather than just a whole integer.
        explosionxcoord = r*math.cos(angleup) + ion_beaconx
        explosionycoord = r*math.sin(angleup) + ion_beacony
        --The x and y coordinates of the explosion will occur at a max radius of r away from the nuke beacon,
        --in a circular shape. This is a fundamental, simple circle geometry formula.
        createExplosion ( explosionxcoord, explosionycoord, ion_beaconz, 7 )
        --An explosion of type 7 is created, which is the tied as the largest with some others it is
        --an aircraft explosion.
        ion_loops = ion_loops + 1
                        if ion_loops == 16 then
                        --on the 16th loop of this function
                    ion_beamFlareSize = 200
                        --This triggers the flare to grow +50 immediately right as the beam is ending to create a little
                        --larger flash, just for effect as the beam is done
                        setTimer ( "ionFlareFade", 5, 200 )
                        --The flarefade function is set to occur 200 times at 5ms to set the flare size to 0 quickly, as
                        --the beam has disappeared
                        elseif ion_loops == 18 then
                        --on the 18th loop of this function
                        ion_explosionTimer = 0
                        --Set the explosion timer to 0 for the next ion cannon launch, since this is the last loop
                        ion_loops = 0
                        --Set to 0 to trigger these events directly above on next ion cannon launch as well
                    ion_beamSize = 5
                    --Set to 0 to trigger the functions properly on the next ion cannon launch
                destroyElement ( ionBeam )
                destroyElement ( ionSecondaryBeam )
                destroyElement ( ionBeam2 )
                destroyElement ( ionSecondaryBeam2 )
                destroyElement ( ionBeam3 )
                destroyElement ( ionSecondaryBeam3 )
                --Destroy all the created checkpoint marker elements that made the beam
                        end
        end
end

function ionFlareFade ()   
            setMarkerSize ( ionBeamFlare, ion_beamFlareSize )
        ion_beamFlareSize = ion_beamFlareSize - 1
                if ion_beamFlareSize == 0 then
                        destroyElement ( ionBeamFlare )
                        ion_cannonActivated = false
                        ion_beamFlareSize = 5
                end
--Each time the function loops, the flare gets -1 smaller. When it has a size of 0 and becomes invisible, it needs
--to be deleted for the next ion cannon launch. No elements should stay created as they will pile up and eventually
--crash you or the server. Finally, ion_cannonActivated is false, meaning the ion cannon is inactive and another
--weapon use can be performed.
end


CODE COMPLET :

Code: (lua) [Sélectionner]
--=====================================================================================================================
--Start defining varibles, including a players array. I defined players array in both scripts incase they are seperated
--=====================================================================================================================
root = getRootElement ()
players = {}

outputChatBox ( "Ion cannon by Ransom" )
ion_rotx = 0
ion_loops = 0
ion_explosionTimer = 0
ion_cannonActivated = false
ion_cancelActivation = false
ion_beamSize = 5
ion_beamFlareSize = 5
players = getElementsByType ( "player" )

--==============================================================================================================
--Give all players on the server access to the weapons
--==============================================================================================================
addEventHandler ( "onResourceStart", root, "ResourceStartIonCannon" )
function ResourceStartIonCannon ( name, root )
if name ~= getThisResource() then return end
for k,v in players do
-- for all players in the "players" array
    bindKey ( v, "f", "down", "placeIonCannonBeacon" )
    -- bind the key f for triggering the ion cannon
end
end

addEventHandler ( "onPlayerJoin", root, "ionPlayerJoin" )
function ionPlayerJoin ()
bindKey ( source, "f", "down", "placeIonCannonBeacon" )
--if a player joins after the resource loaded, bind their f key to trigger the ion cannon also
end

--==========================================================================================================================
--When the ion cannon key (f) is pressed, show the mouse cursor that will allow the triggering of the onPlayerClick function
--==========================================================================================================================
function placeIonCannonBeacon ( player, key, state )
if ( ion_cannonActivated == false ) and ( ion_cancelActivation == false ) and ( nuke_cancelActivation == false ) and ( nuke_cannonActivated == false ) then
    --These conditions prevent triggering the same weapon twice or triggering the other weapon at the same time.
--Both weapons cannot be triggered because explosions are stretched to the limit, explosions would be random
defineLaunchType = key
--This is used later on the onPlayerClick function to tell it what weapon to launch
showCursor ( player, true )
ion_cancelActivation = true
    else
if ion_cancelActivation == true then
showCursor ( player, false )
end
--Prevents cursor from getting messed up if cursor is show for f or g and the opposite key is hit
ion_cancelActivation = false
--ion_cancelactivation is true when the cursor is showing. This is necessary along with asking if the actual
--weapon is active to prevent problems with the cursor and weapon activation between both weapons and themselves.
  if ion_cannonActivated == true then
    outputChatBox ( "Ion cannon has already been activated", activator )
    else
    outputChatBox ( "Cannot activate ion cannon and nuke at the same time", activator )
    end
    --This statement says that if the ion cannon is already in use, display a meassage about it being in use on f press.
    --Else, if the above conditions were not satisifed and the nuke is not active, it meant the ion cannon was
    --active. Therefore, display the other message that both weapons cannot be used at the same time.
end
end

--=========================================================================================================================
--When the player clicks the mouse cursor, decide if the ion cannon is supposed to be launched and if so, set up the launch
--=========================================================================================================================
addEventHandler ( "onPlayerClick", root, "playerClick" )
function playerClick ( button, state, clickedElement, x, y, z )
if defineLaunchType == "f" then
--If the player clicked, we check if the key is equal to f or g. This will dictate which onPlayerClick function
--commences between the ion cannon and nuke scripts
ion_cancelActivation = false
--Since the weapon is now in use, you have no chance to abort by pressing the key again, therefore this is false
defineLaunchType = nil
    --This must be reset to nil so it will not fire the ion cannon next time on click if g was pressed instead of f (which triggers nuke)
ion_beaconx = x
ion_beacony = y
ion_beaconz = z
--Set the ion cannon beacon (detonation spot) coordinates to the spot the mouse cursor clicked on the game map
local playerz, playerz, playerz = getElementPosition ( source )
    --For the above line, getElementPosition outputs 3 varibles, but I only want z so I overwrote 1 varible called
--playerz as the function went through and assigned the XYZ values to varible x, varible y, and varible z respectively.
if ( button == "left" ) and ( state == "down" ) and ( ion_cannonActivated == false ) then
            --When the left mouse button is pressed down (not when released), if ion cannon is not active then
ion_cannonActivated = true
            --Set this varible to true, which will be used to avoid double launches & double weapon usage
showCursor ( source, false )
            --Weapon beacon was chosen and the launch is initiating to that point. Hide cursor.
ionBeam = createMarker ( ion_beaconx, ion_beacony, ion_beaconz, "checkpoint", 5, 255, 255, 255, 255 )
ionBeam2 = createMarker ( ion_beaconx, ion_beacony, ion_beaconz, "checkpoint", 5, 255, 255, 255, 255 )
ionBeam3 = createMarker ( ion_beaconx, ion_beacony, ion_beaconz, "checkpoint", 5, 255, 255, 255, 255 )
ionSecondaryBeam = createMarker ( ion_beaconx, ion_beacony, ion_beaconz, "checkpoint", 5, 255, 255, 255, 255 )
ionSecondaryBeam2 = createMarker ( ion_beaconx, ion_beacony, ion_beaconz, "checkpoint", 5, 255, 255, 255, 255 )
ionSecondaryBeam3 = createMarker ( ion_beaconx, ion_beacony, ion_beaconz, "checkpoint", 5, 255, 255, 255, 255 )
ionBeamFlare = createMarker ( ion_beaconx, ion_beacony, ion_beaconz, "corona", 5, 255, 255, 255, 255 ) 
--create six markers at the beacon point. The marker checkpoint will extend into the sky, but will end at
--the given z. 6 markers are used to ensure the beam looks full as I rapidly delete and recreate the markers
--in the next functions.
setTimer ( "ionExplosion", 50, 1 )
setTimer ( "ionShot", 100, 20 )
setTimer ( "ionShot2", 150, 20 )
--Trigger the functions that will create the ion cannon shot and explosion imitation. 50ms 1 time, 100ms
--20 times, and 150ms 20 times respectively.
else
ion_activator = getPlayerFromNick ( source )
showCursor ( source, false )
--Makes sure the cursor will not show again for detonation unless the ion cannon is not active. Activator
--is used to display output messages in the other functions that activations/launches arent possible.
end
end
end

--=============================================================================================================================
--Create the illusion of a beam coming from space and gradually increasing in size (beam strike power)
--=============================================================================================================================
function ionShot ()
ion_beamSize = ion_beamSize + 1
setMarkerSize ( ionBeam, ion_beamSize )
setMarkerSize ( ionBeam2, ion_beamSize )
setMarkerSize ( ionBeam3, ion_beamSize )
if ( ion_beamSize == 6 ) then 
setTimer ( "ionShotFlare", 3, 150 )
end
--The first 3 markers making the ion beam are gradually increased at +10 in 1 second. When the function has looped
--6 times (6/10 of a second), the flare (again, its a corona marker but I call it a flare) grow function is triggered.
end

function ionShot2 ()
setMarkerSize ( ionSecondaryBeam, ion_beamSize )
setMarkerSize ( ionSecondaryBeam2, ion_beamSize )
setMarkerSize ( ionSecondaryBeam3, ion_beamSize )
--These beams increase at a different rate, since beamSize is changing more rapidly in the ionShot function. They stay
--a little smaller than the main 3 markers and assist the "grow" look while keeping the beam visible while the markers
--change size.
end

function ionShotFlare ()
ion_beamFlareSize = ion_beamFlareSize + 1
    setMarkerSize ( ionBeamFlare, ion_beamFlareSize )
    --Every 3ms for 150 loops, the flare size increases. This makes a large glow that appears to be caused by the beam's light
end

function ionExplosion ()
if ion_explosionTimer == 0 then
--We set this value when the script started. I do so I can keep looping through this function without
--resetting it.
setTimer ( "ionExplosion", 170, 18 )
--Trigger this function to initiate 18 times in 170ms intervals.
ion_explosionTimer = 1
--Set the explosion timer flag to 1 so it is not done again with the looping (could have been true/false)
else
r = ion_beamSize --min/max blast radius: 1.5-28
--r will serve as our explosion radius. For the ion cannon, the explosions coming from the ion cannon
--will gradually increase distance from the center point in a circular motion, since I defined r as
--ion_beamSize, which is gradully increasing in size in the ionShot function at the same time.
angleup = randInt(0, 35999)/100
--Choose a random angle. A value between 0 and 35999 is divided by 100 because we want
--to have 2 random decimal places for as well, rather than just a whole integer.
explosionxcoord = r*math.cos(angleup) + ion_beaconx
explosionycoord = r*math.sin(angleup) + ion_beacony
--The x and y coordinates of the explosion will occur at a max radius of r away from the nuke beacon,
--in a circular shape. This is a fundamental, simple circle geometry formula.
createExplosion ( explosionxcoord, explosionycoord, ion_beaconz, 7 )
--An explosion of type 7 is created, which is the tied as the largest with some others it is
--an aircraft explosion.
ion_loops = ion_loops + 1
if ion_loops == 16 then
--on the 16th loop of this function
  ion_beamFlareSize = 200
--This triggers the flare to grow +50 immediately right as the beam is ending to create a little
--larger flash, just for effect as the beam is done
setTimer ( "ionFlareFade", 5, 200 )
--The flarefade function is set to occur 200 times at 5ms to set the flare size to 0 quickly, as
--the beam has disappeared
elseif ion_loops == 18 then
--on the 18th loop of this function
ion_explosionTimer = 0
--Set the explosion timer to 0 for the next ion cannon launch, since this is the last loop
ion_loops = 0
--Set to 0 to trigger these events directly above on next ion cannon launch as well
    ion_beamSize = 5
    --Set to 0 to trigger the functions properly on the next ion cannon launch
        destroyElement ( ionBeam )
        destroyElement ( ionSecondaryBeam )
        destroyElement ( ionBeam2 )
        destroyElement ( ionSecondaryBeam2 )
        destroyElement ( ionBeam3 )
        destroyElement ( ionSecondaryBeam3 )
        --Destroy all the created checkpoint marker elements that made the beam
end
end
end

function ionFlareFade ()   
    setMarkerSize ( ionBeamFlare, ion_beamFlareSize )
        ion_beamFlareSize = ion_beamFlareSize - 1
        if ion_beamFlareSize == 0 then
destroyElement ( ionBeamFlare )
ion_cannonActivated = false
ion_beamFlareSize = 5
        end
--Each time the function loops, the flare gets -1 smaller. When it has a size of 0 and becomes invisible, it needs
--to be deleted for the next ion cannon launch. No elements should stay created as they will pile up and eventually
--crash you or the server. Finally, ion_cannonActivated is false, meaning the ion cannon is inactive and another
--weapon use can be performed.
end

« Modifié: 30 Mars 2007, 19:28:09 par spykerc8 »


~ Leader honoraire de la FsK Team ~ -
~ Membre honoraire de la PCP Team ~

Co-fondateur de GTAO - Retraité de la communauté

"Nous ne sommes rien, soyons tout !"


Hors ligne Labiloute

  • XSA
  • *
  • Tueur en série
  • Messages: 207
    • Voir le profil
    • GTA-Stunt.com
Re : Tutorial 8a: Ion Cannon
« Réponse #1 le: 30 Mars 2007, 20:29:45 »
OMG Hiroshima :ninja


Hors ligne Aless

  • *
  • Bandit
  • Messages: 331
    • Voir le profil
Re : Tutorial 8a: Ion Cannon
« Réponse #2 le: 23 Mai 2007, 00:35:17 »
Excellent! Dommage que l'on puissa pas faire ça sous SA-MP ! :(

EDIT: Ce script fonctionnera pour toutes les endroits de San Andreas ou seulement "le coin perdu dans la forêt"?
« Modifié: 23 Mai 2007, 00:46:46 par Aless(01) »
My Dedicated Server:

Intel Core2Quad Q6600- 2.4GHz - LGA775 - 1066MHz FSB - 2x4 MB L2/L3
2x2GB - DDR2 - 667MHz - Corsair Value - 3.2 Go utilisable sur 32 bits
80GB 16MB Buffer SATA-2 7200 TPM + 1 TB 32 MB Buffer SATA-2 5400 TPM EcoGreen
OS: Ubuntu Linux Hardy Heron 8.04.3

Info serveur: http://www.aless-server.ch/psi/