Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- CHAOS WAND 2.0
- -- AUTHOR : ALTAMURENZA
- --[[
- ---------------
- # GARAGES.LUA #
- ---------------
- ]]
- if type(F_InitGarages) ~= 'function' then
- F_InitGarages = function()
- DATLoad('Garages.DAT', 1)
- GarageClearAll()
- GarageAdd(TRIGGER._Garage_SchoolGrounds, POINTLIST._Garage_SchoolGrounds)
- GarageAdd(TRIGGER._Garage_RichArea, POINTLIST._Garage_RichArea)
- GarageAdd(TRIGGER._Garage_BusinessArea, POINTLIST._Garage_BusinessArea)
- GarageAdd(TRIGGER._Garage_PoorArea, POINTLIST._Garage_PoorArea)
- end
- end
- --[[
- ---------------------
- # CHAOS WAND SCRIPT #
- ---------------------
- ]]
- _G.CHAOS_WAND_MAIN = function()
- while not SystemIsReady() or AreaIsLoading() do
- Wait(0)
- end
- -----------------------
- -- # SHARED VARIABLES #
- -----------------------
- shared.gChaosWand = {}
- shared.gChaosWand.MinTimer = 0.5
- shared.gChaosWand.MaxTimer = 1
- shared.gChaosWand.Speed = 1
- shared.gChaosWand.Delay = 0
- shared.gChaosWand.Range = 3
- -----------------------
- -- # SHARED FRAMEWORK #
- -----------------------
- shared.gChaosWand.Framework = {}
- shared.gChaosWand.Framework.Animation = {}
- shared.gChaosWand.Framework.Electrocute = {}
- shared.gChaosWand.Framework.Burn = {}
- _G.CHAOS_WAND_FRAMEWORK = function()
- local OPEN = {
- [272] = true, [273] = true, [274] = true, [275] = true, [276] = true,
- [277] = true, [278] = true, [279] = true, [280] = true, [281] = true,
- [282] = true, [283] = true, [284] = true, [289] = true,
- }
- while true do
- Wait(0)
- ----------------
- -- # ANIMATION #
- ----------------
- for INDEX, CONTENT in ipairs(shared.gChaosWand.Framework.Animation) do
- if EffectIsRunning(CONTENT.EFFECT) then
- if CONTENT.TIMER < GetTimer() then
- EffectSetPosition(CONTENT.EFFECT, CONTENT.XYZ[CONTENT.ID][1], CONTENT.XYZ[CONTENT.ID][2], CONTENT.XYZ[CONTENT.ID][3] + (CONTENT.TYPE == 'ElectrocuteLRG' and 1 or 0.5))
- CONTENT.ID, CONTENT.TIMER = CONTENT.ID + shared.gChaosWand.Speed, GetTimer() + shared.gChaosWand.Delay
- end
- if CONTENT.ID < table.getn(CONTENT.XYZ) then
- for _, PED in {PedFindInAreaXYZ(0, 0, 0, 99999)} do
- if PedIsValid(PED) and PED ~= CONTENT.CASTER and PedGetHealth(PED) > 0 and PedIsInAreaXYZ(PED, CONTENT.XYZ[CONTENT.ID][1], CONTENT.XYZ[CONTENT.ID][2], CONTENT.XYZ[CONTENT.ID][3] + (CONTENT.TYPE == 'ElectrocuteLRG' and 1 or 0.5), 1.5) then
- _G.MODE = (not PedIsInAnyVehicle(PED) or (PedIsInAnyVehicle(PED) and OPEN[VehicleGetModelId(VehicleFromDriver(PED))])) and {
- ['ElectrocuteLRG'] = {'Electrocute', {TIMER = GetTimer() + math.random(shared.gChaosWand.MinTimer * 1000, shared.gChaosWand.MaxTimer * 1000), EFFECT = nil, SHAKE = GetTimer() + 0}},
- ['GymFire'] = {'Burn', {TIMER = GetTimer() + math.random(shared.gChaosWand.MinTimer * 1000, shared.gChaosWand.MaxTimer * 1000), EFFECT = nil, TYPE = 'BarrelFire'}},
- } or nil
- if type(MODE) == 'table' and MODE[CONTENT.TYPE] then
- if shared.gChaosWand.Framework[MODE[CONTENT.TYPE][1]][PED] then
- if EffectIsRunning(shared.gChaosWand.Framework[MODE[CONTENT.TYPE][1]][PED].EFFECT) then
- EffectKill(shared.gChaosWand.Framework[MODE[CONTENT.TYPE][1]][PED].EFFECT)
- end
- shared.gChaosWand.Framework[MODE[CONTENT.TYPE][1]][PED] = nil
- end
- shared.gChaosWand.Framework[MODE[CONTENT.TYPE][1]][PED] = MODE[CONTENT.TYPE][2]
- if EffectIsRunning(CONTENT.EFFECT) then
- EffectSlowKill(CONTENT.EFFECT, 1, true)
- end
- table.remove(shared.gChaosWand.Framework.Animation, INDEX)
- end
- end
- end
- else
- if EffectIsRunning(CONTENT.EFFECT) then
- EffectSlowKill(CONTENT.EFFECT, 1, true)
- end
- table.remove(shared.gChaosWand.Framework.Animation, INDEX)
- end
- else
- table.remove(shared.gChaosWand.Framework.Animation, INDEX)
- end
- end
- ------------------
- -- # ELECTROCUTE #
- ------------------
- for PED, CONTENT in pairs(shared.gChaosWand.Framework.Electrocute) do
- if PedIsValid(PED) then
- if PED ~= gPlayer then
- if not SoundSpeechPlaying(PED) and PedGetHealth(PED) > 0 then
- SoundPlayAmbientSpeechEvent(PED, math.random(1, 2) == 1 and 'FIGHT_FLEE' or 'FLEE')
- end
- end
- local PX, PY, PZ = PedGetPosXYZ(PED)
- if CONTENT.TIMER == nil or CONTENT.TIMER > GetTimer() then
- if not CONTENT.EFFECT then
- CONTENT.EFFECT = EffectCreate('ElectrocuteLRG', PX, PY, PZ + 0.2)
- else
- EffectSetPosition(CONTENT.EFFECT, PX, PY, PZ + 0.2)
- end
- if CONTENT.SHAKE < GetTimer() then
- if PedIsInAnyVehicle(PED) then
- PedSetActionNode(PED, '/Global/Vehicles/Bikes/ExecuteNodes/FallOffBase/base', 'Act/Vehicles.act')
- else
- PedSetActionNode(PED, '/Global/HitTree/Standing/PostHit/BellyDown/OnGroundBounce/BackBounceSmall', 'Act/HitTree.act')
- end
- PedApplyDamage(PED, 5)
- CONTENT.SHAKE = GetTimer() + (PedMePlaying(PED, 'BellyDown') and 400 or 0)
- end
- end
- for _, PED in {PedFindInAreaXYZ(0, 0, 0, 99999)} do
- if PedIsValid(PED) and PedIsInAreaXYZ(PED, PX, PY, PZ, 1.5) and PedGetHealth(PED) > 0 and not shared.gChaosWand.Framework.Electrocute[PED] then
- shared.gChaosWand.Framework.Electrocute[PED] = {TIMER = GetTimer() + math.random(shared.gChaosWand.MinTimer * 1000, shared.gChaosWand.MaxTimer * 1000), EFFECT = nil, SHAKE = GetTimer() + 0}
- end
- end
- if CONTENT.TIMER ~= nil and CONTENT.TIMER < GetTimer() then
- if EffectIsRunning(CONTENT.EFFECT) then
- EffectSlowKill(CONTENT.EFFECT, 1, true)
- end
- shared.gChaosWand.Framework.Electrocute[PED] = nil
- end
- else
- if EffectIsRunning(CONTENT.EFFECT) then
- EffectKill(CONTENT.EFFECT)
- end
- shared.gChaosWand.Framework.Electrocute[PED] = nil
- end
- end
- -----------
- -- # BURN #
- -----------
- for PED, CONTENT in pairs(shared.gChaosWand.Framework.Burn) do
- if PedIsValid(PED) then
- if PED ~= gPlayer then
- PedFlee(PED)
- if not SoundSpeechPlaying(PED) and PedGetHealth(PED) > 0 then
- SoundPlayAmbientSpeechEvent(PED, math.random(1, 2) == 1 and 'FIGHT_FLEE' or 'FLEE')
- end
- end
- local PX, PY, PZ = PedGetPosXYZ(PED)
- if CONTENT.TIMER == nil or CONTENT.TIMER > GetTimer() then
- if not CONTENT.EFFECT then
- EffectSlowKill(EffectCreate('BigExplosion', PX, PY, PZ + 1), 3, true)
- SoundPlay3D(PX, PY, PZ + 0.5, 'Chrybmb_Exp', 'large')
- CONTENT.EFFECT = EffectCreate(CONTENT.TYPE, PX, PY, PZ)
- if not shared.gChaosWand.Framework.Electrocute[PED] then
- if PedIsInAnyVehicle(PED) then
- PedSetActionNode(PED, '/Global/Vehicles/Bikes/HIT/FallOff/'..(PedIsFacingObject(PED, CONTENT.EFFECT, 3, 180) and 'CheckFrontHitCollision/HitHardFrontLong' or 'CheckBackHitCollision/HitHardBackLong'), 'Act/Vehicles.act')
- else
- PedSetActionNode(PED, '/Global/HitTree/KnockOuts/'..(PedIsFacingObject(PED, CONTENT.EFFECT, 3, 180) and 'Front/KD_DROP_Default' or 'Rear/Rear'), 'Act/HitTree.act')
- end
- end
- end
- EffectSetPosition(CONTENT.EFFECT, PX, PY, PZ + ((PedGetHealth(PED) < 1 or PedMePlaying(PED, 'BellyDown') or PedMePlaying(PED, 'BellyUp') or PedMePlaying(PED, 'SitOnWall')) and 0.1 or 1))
- if PedGetHealth(PED) > 0 then
- PedApplyDamage(PED, 0.3)
- end
- end
- for _, PED in {PedFindInAreaXYZ(0, 0, 0, 99999)} do
- if PedIsValid(PED) and PedIsInAreaXYZ(PED, PX, PY, PZ, 1) and PedGetHealth(PED) > 0 and not shared.gChaosWand.Framework.Burn[PED] then
- shared.gChaosWand.Framework.Burn[PED] = {TIMER = GetTimer() + math.random(shared.gChaosWand.MinTimer * 1000, shared.gChaosWand.MaxTimer * 1000), EFFECT = nil, TYPE = 'BarrelFire'}
- end
- end
- if CONTENT.TIMER ~= nil and CONTENT.TIMER < GetTimer() then
- if EffectIsRunning(CONTENT.EFFECT) then
- EffectSlowKill(CONTENT.EFFECT, 1, true)
- end
- shared.gChaosWand.Framework.Burn[PED] = nil
- end
- else
- if EffectIsRunning(CONTENT.EFFECT) then
- EffectKill(CONTENT.EFFECT)
- end
- shared.gChaosWand.Framework.Burn[PED] = nil
- end
- end
- end
- end
- shared.gChaosWand_FrameworkThread = CreateThread('CHAOS_WAND_FRAMEWORK')
- ------------
- -- # SETUP #
- ------------
- for _, STAT in ipairs({{REQ = '6_B', 2, 0, 15, 4, 6}, {REQ = '4_06', 1, 0, 15, 2, 5}, {REQ = '3_B', 1, 0, 12, 2, 4}, {REQ = '2_B', 1, 0, 9, 1, 3}, {REQ = '1_B', 1, 0, 6, 1, 2}}) do
- if IsMissionCompleated(STAT.REQ) then
- shared.gChaosWand.Speed, shared.gChaosWand.Delay, shared.gChaosWand.Range, shared.gChaosWand.MinTimer, shared.gChaosWand.MaxTimer = STAT[1], STAT[2], STAT[3], STAT[4], STAT[5]
- break
- end
- end
- for _, ANIM in ipairs({'W_Stick', 'Umbrella'}) do
- if not HasAnimGroupLoaded(ANIM) then
- LoadAnimationGroup(ANIM)
- end
- end
- ----------------------
- -- # LOCAL VARIABLES #
- ----------------------
- local X, Y, Z, IS_POSSIBLE
- local FLASHLIGHT = GetTimer()
- local GAME_EDITION = type(_G.ClassMusicSetPlayers) == 'function' and 'SE' or 'AE'
- ----------------
- -- # MAIN LOOP #
- ----------------
- while true do
- Wait(0)
- -- POSITION & CLEAN UP
- X, Y, Z = PlayerGetPosXYZ()
- PickupDestroyTypeInAreaXYZ(X, Y, Z, 4, 410)
- -- CONDITION CHECK
- IS_POSSIBLE = true
- for _, NODE in ipairs({'BlockHits', 'BellyDown', 'BellyUp', 'SitOnWall', 'TreeCheck', 'Dead', 'Climb_ON_BOT', 'HoistUp_Spawns', 'Jump', 'HitTree', 'Vehicles', 'Swing3'}) do
- if PedMePlaying(gPlayer, NODE) then
- IS_POSSIBLE = false
- break
- end
- end
- -- LAUNCH MECHANISM
- if PlayerHasWeapon(410) and IS_POSSIBLE and IsButtonBeingPressed(6, 0) then
- if not shared.gChaosWand.Speech then
- shared.gChaosWand.Speech = {
- 'INFIRMARY',
- 'MP_TAUNT_JIMMY',
- 'PLAYER_TAUNT_VICTIM',
- 'PLAYER_DEJECTED',
- 'PLAYER_NEGATIVE',
- 'PLAYER_TAUNT_HARASS',
- 'PLAYER_TAUNT_BURN',
- 'PLAYER_EXCUSE',
- 'PLAYER_JEER',
- 'PLAYER_TAUNT_HUMILIATE',
- 'PLAYER_TAUNT_HUMILIATE_HIT',
- 'PLAYER_TAUNT_KO',
- }
- end
- if SoundSpeechPlaying(gPlayer) then
- SoundStopCurrentSpeechEvent(gPlayer)
- end
- SoundPlayAmbientSpeechEvent(gPlayer, math.random(1, 5) == 3 and 'PLAYER_LAUGH_CRUEL' or shared.gChaosWand.Speech[math.random(1, table.getn(shared.gChaosWand.Speech))])
- PedSetActionNode(gPlayer, '/Global/umbrella/Actions/Attacks/HeavyAttacks/Swing1/Swing2/Swing3', 'Act/Weapons/umbrella.act')
- Wait((600 / GameGetPedStat(gPlayer, 20)) * 100)
- local XYZ = {}
- for INT = 1, shared.gChaosWand.Range do
- for DEC = 1, 10 do
- local PX, PY, PZ = PedGetOffsetInWorldCoords(gPlayer, 0, INT + (DEC/10), 0)
- table.insert(XYZ, {PX, PY, PZ})
- end
- end
- local TYPE = _G['IsButton'..(GAME_EDITION == 'SE' and 'Pressed' or 'Held')](6, 0) and 'ElectrocuteLRG' or 'GymFire'
- table.insert(shared.gChaosWand.Framework.Animation, {EFFECT = EffectCreate(TYPE, XYZ[1][1], XYZ[1][2], XYZ[1][3] + (TYPE == 'ElectrocuteLRG' and 1 or 0.5)), TYPE = TYPE, XYZ = XYZ, ID = 2, TIMER = GetTimer() + shared.gChaosWand.Delay, CASTER = gPlayer})
- end
- -- FLASHLIST REPLACEMENT
- if PlayerHasWeapon(420) then
- if FLASHLIGHT + 500 < GetTimer() and not PlayerHasWeapon(410) then
- PlayerSetWeapon(410, 1, false)
- end
- else
- FLASHLIGHT = GetTimer()
- if ItemGetCurrentNum(420) == 0 then
- GiveWeaponToPlayer(420, 1, true)
- end
- end
- -- LIMIT
- shared.gChaosWand.Speed = shared.gChaosWand.Speed > 5 and 5 or (shared.gChaosWand.Speed < 1 and 1 or math.floor(shared.gChaosWand.Speed))
- shared.gChaosWand.Delay = shared.gChaosWand.Delay > 100 and 100 or (shared.gChaosWand.Delay < 0 and 0 or math.floor(shared.gChaosWand.Delay))
- end
- end
- shared.gChaosWand_MainThread = CreateThread('CHAOS_WAND_MAIN')
Advertisement
Add Comment
Please, Sign In to add comment