-
Posts
3,875 -
Joined
-
Days Won
67
Everything posted by DNL291
-
If the player is already spawned use setElementPosition instead.
-
Isso é uma variável, mas deve ser uma tabela, então é lógico que não vai funcionar. O que deve ser feito é o outro comando, após utilizar o comando, você remove o valor de venda[ thePlayer ]
-
vehicle = createVehicle( 410, 1090.815, -1769.211, 13.352 ) warpPedIntoVehicle( thePlayer, vehicle )
-
Pessoal o Mod Superman que ativei no servidor ele está para todos!
DNL291 replied to NeoGM's topic in Programação em Lua
Tente isto: Client: -- Copyright (c) 2017, Alberto Alonso -- -- All rights reserved. -- -- Redistribution and use in source and binary forms, with or without modification, -- are permitted provided that the following conditions are met: -- -- * Redistributions of source code must retain the above copyright notice, this -- list of conditions and the following disclaimer. -- * Redistributions in binary form must reproduce the above copyright notice, this -- list of conditions and the following disclaimer in the documentation and/or other -- materials provided with the distribution. -- * Neither the name of the superman script nor the names of its contributors may be used -- to endorse or promote products derived from this software without specific prior -- written permission. -- -- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. local Superman = {} -- Settings local ZERO_TOLERANCE = 0.00001 local MAX_ANGLE_SPEED = 6 -- In degrees per frame local MAX_SPEED = 1.3 local EXTRA_SPEED_FACTOR = 2.6 local LOW_SPEED_FACTOR = 0.40 local ACCELERATION = 0.025 local EXTRA_ACCELERATION_FACTOR = 1.8 local LOW_ACCELERATION_FACTOR = 0.85 local TAKEOFF_VELOCITY = 1.75 local TAKEOFF_FLIGHT_DELAY = 750 local SMOKING_SPEED = 1000 -- change back to 1.25 to enable smoke creation, disabled due to FPS lag concerns local GROUND_ZERO_TOLERANCE = 0.18 local LANDING_DISTANCE = 3.2 local FLIGHT_ANIMLIB = "swim" local FLIGHT_ANIMATION = "Swim_Dive_Under" local FLIGHT_ANIM_LOOP = false local IDLE_ANIMLIB = "cop_ambient" local IDLE_ANIMATION = "Coplook_loop" local IDLE_ANIM_LOOP = true local MAX_Y_ROTATION = 70 local ROTATION_Y_SPEED = 3.8 -- Static global variables local thisResource = getThisResource() local rootElement = getRootElement() local localPlayer = getLocalPlayer() local serverGravity = getGravity() -- -- Utility functions -- local function isPlayerFlying(player) local data = getElementData(player, "superman:flying") if not data or data == false then return false else return true end end local function setPlayerFlying(player, state) if state == true then state = true else state = false end setElementData(player, "superman:flying", state) end local function iterateFlyingPlayers() local current = 1 local allPlayers = getElementsByType("player") return function() local player repeat player = allPlayers[current] current = current + 1 until not player or (isPlayerFlying(player) and isElementStreamedIn(player)) return player end end function Superman:restorePlayer(player) setPlayerFlying(player, false) setPedAnimation(player, false) setElementVelocity(player, 0, 0, 0) setElementRotation(player, 0, 0, 0) --setPedRotation(player, getPedRotation(player)) setElementCollisionsEnabled(player, true) self:destroySmokeGenerators(player) self.rotations[player] = nil self.previousVelocity[player] = nil end function Superman:createSmokeGenerator(player) local generator = createObject(2780, getElementPosition(player)) setElementCollisionsEnabled(generator, false) setObjectScale(generator, 0) return generator end function Superman:createSmokeGenerators(player) if not self.smokeGenerators[player] then local smokeGenerators = {} smokeGenerators[1] = self:createSmokeGenerator(player) attachElements(smokeGenerators[1], player, 0.75, -0.2, -0.4, -40, 0, 60) smokeGenerators[2] = self:createSmokeGenerator(player) attachElements(smokeGenerators[2], player, -0.75, -0.2, -0.4, -40, 0, -60) self.smokeGenerators[player] = smokeGenerators end end function Superman:destroySmokeGenerators(player) if self.smokeGenerators[player] then for k, v in ipairs(self.smokeGenerators[player]) do destroyElement(v) end self.smokeGenerators[player] = nil end end function angleDiff(angle1, angle2) angle1, angle2 = angle1 % 360, angle2 % 360 local diff = (angle1 - angle2) % 360 if diff <= 180 then return diff else return -(360 - diff) end end local function isElementInWater(ped) local pedPosition = Vector3D:new(getElementPosition(ped)) if pedPosition.z <= 0 then return true end local waterLevel = getWaterLevel(pedPosition.x, pedPosition.y, pedPosition.z) if not isElementStreamedIn(ped) or not waterLevel or waterLevel < pedPosition.z then return false else return true end end local function isnan(x) math.inf = 1/0 if x == math.inf or x == -math.inf or x ~= x then return true end return false end local function getVector2DAngle(vec) if vec.x == 0 and vec.y == 0 then return 0 end local angle = math.deg(math.atan(vec.x / vec.y)) + 90 if vec.y < 0 then angle = angle + 180 end return angle end -- -- Initialization and shutdown functions -- function Superman.Start() local self = Superman -- Register events addEventHandler("onClientResourceStop", getResourceRootElement(thisResource), Superman.Stop, false) addEventHandler("onPlayerJoin", rootElement, Superman.onJoin) addEventHandler("onPlayerQuit", rootElement, Superman.onQuit) addEventHandler("onClientRender", rootElement, Superman.processControls) addEventHandler("onClientRender", rootElement, Superman.processFlight) addEventHandler("onClientPlayerDamage", localPlayer, Superman.onDamage, false) addEventHandler("onClientPlayerVehicleEnter",localPlayer,Superman.onEnter) addEventHandler("onClientElementDataChange", rootElement, Superman.onDataChange) addEventHandler("onClientElementStreamIn", rootElement, Superman.onStreamIn) addEventHandler("onClientElementStreamOut", rootElement, Superman.onStreamOut) -- Bind keys bindKey("jump", "down", Superman.onJump) -- Register commands addCommandHandler("superman", Superman.cmdSuperman) -- Initializate attributes self.smokeGenerators = {} self.rotations = {} self.previousVelocity = {} end addEventHandler("onClientResourceStart", getResourceRootElement(thisResource), Superman.Start, false) function Superman.Stop() local self = Superman setGravity(serverGravity) -- Restore all players animations, collisions, etc for player in iterateFlyingPlayers() do self:restorePlayer(player) end end -- -- Join/Quit -- function Superman.onJoin(player) local self = Superman local player = player or source setPlayerFlying(player, false) end function Superman.onQuit(reason, player) local self = Superman local player = player or source if isPlayerFlying(player) then self:restorePlayer(player) end end -- --onEnter: superman cant enter vehicles -- Fix (in serverside) for players glitching other players' vehicles by warping into them while superman is active, causing them to flinch into air and get stuck. function showWarning() local x,y,z = getPedBonePosition(localPlayer,6) local sx,sy,dist = getScreenFromWorldPosition(x,y,z+0.3) if sx and sy and dist and dist < 100 then dxDrawText("You can not warp into a vehicle when superman is activated.",sx,sy,sx,sy,tocolor(255,0,0,255),1.1,"default-bold","center") end end function hideWarning() removeEventHandler("onClientRender",root,showWarning) end function Superman.onEnter() if (isPlayerFlying(localPlayer) or getElementData(localPlayer,"superman:takingOff")) and not isTimer(warningTimer) then addEventHandler("onClientRender",root,showWarning) warningTimer = setTimer(hideWarning,5000,1) end end -- -- onDamage: superman is invulnerable -- function Superman.onDamage() local self = Superman if isPlayerFlying(localPlayer) then cancelEvent() end end -- -- onStreamIn: Reset rotation attribute for player -- function Superman.onStreamIn() local self = Superman end function Superman.onStreamOut() local self = Superman if source and isElement(source) and getElementType(source) == "player" and isPlayerFlying(source) then self.rotations[source] = nil self.previousVelocity[source] = nil end end -- -- onDataChange: Check if somebody who is out of stream stops being superman -- function Superman.onDataChange(dataName, oldValue) local self = Superman if dataName == "superman:flying" and isElement(source) and getElementType(source) == "player" and oldValue ~= getElementData(source, dataName) and oldValue == true and getElementData(source, dataName) == false then self:restorePlayer(source) end end -- -- onJump: Combo to start flight without any command -- function canFly( player ) return getElementData(player, "canFly") end function Superman.onJump(key, keyState) if canFly(localPlayer) ~= true then return end local self = Superman local task = getPedSimplestTask(localPlayer) if not isPlayerFlying(localPlayer) then if task == "TASK_SIMPLE_IN_AIR" then setElementVelocity(localPlayer, 0, 0, TAKEOFF_VELOCITY) setTimer(Superman.startFlight, 100, 1) end end end -- -- Commands -- function Superman.cmdSuperman() if canFly(localPlayer) ~= true then return end local self = Superman if isPedInVehicle(localPlayer) or isPlayerFlying(localPlayer) then return end setElementVelocity(localPlayer, 0, 0, TAKEOFF_VELOCITY) setTimer(Superman.startFlight, TAKEOFF_FLIGHT_DELAY, 1) setElementData(localPlayer,"superman:takingOff",true) end function Superman.startFlight() local self = Superman setElementData(localPlayer,"superman:takingOff",false) if isPlayerFlying(localPlayer) then return end triggerServerEvent("superman:start", rootElement) setPlayerFlying(localPlayer, true) setElementVelocity(localPlayer, 0, 0, 0) self.currentSpeed = 0 self.extraVelocity = { x = 0, y = 0, z = 0 } end -- -- Controls processing -- local jump, oldJump = false, false function Superman.processControls() local self = Superman if not isPlayerFlying(localPlayer) then jump, oldJump = getControlState("jump"), jump if not oldJump and jump then Superman.onJump() end return end -- Calculate the requested movement direction local Direction = Vector3D:new(0, 0, 0) if getControlState("forwards") then Direction.y = 1 elseif getControlState("backwards") then Direction.y = -1 end if getControlState("left") then Direction.x = 1 elseif getControlState("right") then Direction.x = -1 end Direction:Normalize() -- Calculate the sight direction local cameraX, cameraY, cameraZ, lookX, lookY, lookZ = getCameraMatrix() local SightDirection = Vector3D:new((lookX - cameraX), (lookY - cameraY), (lookZ - cameraZ)) SightDirection:Normalize() if getControlState("look_behind") then SightDirection = SightDirection:Mul(-1) end -- Calculate the current max speed and acceleration values local maxSpeed = MAX_SPEED local acceleration = ACCELERATION if getControlState("sprint") then maxSpeed = MAX_SPEED * EXTRA_SPEED_FACTOR acceleration = acceleration * EXTRA_ACCELERATION_FACTOR elseif getControlState("walk") then maxSpeed = MAX_SPEED * LOW_SPEED_FACTOR acceleration = acceleration * LOW_ACCELERATION_FACTOR end local DirectionModule = Direction:Module() -- Check if we must change the gravity if DirectionModule == 0 and self.currentSpeed ~= 0 then setGravity(0) else setGravity(serverGravity) end -- Calculate the new current speed if self.currentSpeed ~= 0 and (DirectionModule == 0 or self.currentSpeed > maxSpeed) then -- deccelerate self.currentSpeed = self.currentSpeed - acceleration if self.currentSpeed < 0 then self.currentSpeed = 0 end elseif DirectionModule ~= 0 and self.currentSpeed < maxSpeed then -- accelerate self.currentSpeed = self.currentSpeed + acceleration if self.currentSpeed > maxSpeed then self.currentSpeed = maxSpeed end end -- Calculate the movement requested direction if DirectionModule ~= 0 then Direction = Vector3D:new(SightDirection.x * Direction.y - SightDirection.y * Direction.x, SightDirection.x * Direction.x + SightDirection.y * Direction.y, SightDirection.z * Direction.y) -- Save the last movement direction for when player releases all direction keys self.lastDirection = Direction else -- Player is not specifying any direction, use last known direction or the current velocity if self.lastDirection then Direction = self.lastDirection if self.currentSpeed == 0 then self.lastDirection = nil end else Direction = Vector3D:new(getElementVelocity(localPlayer)) end end Direction:Normalize() Direction = Direction:Mul(self.currentSpeed) -- Applicate a smooth direction change, if moving if self.currentSpeed > 0 then local VelocityDirection = Vector3D:new(getElementVelocity(localPlayer)) VelocityDirection:Normalize() if math.sqrt(VelocityDirection.x^2 + VelocityDirection.y^2) > 0 then local DirectionAngle = getVector2DAngle(Direction) local VelocityAngle = getVector2DAngle(VelocityDirection) local diff = angleDiff(DirectionAngle, VelocityAngle) local calculatedAngle if diff >= 0 then if diff > MAX_ANGLE_SPEED then calculatedAngle = VelocityAngle + MAX_ANGLE_SPEED else calculatedAngle = DirectionAngle end else if diff < MAX_ANGLE_SPEED then calculatedAngle = VelocityAngle - MAX_ANGLE_SPEED else calculatedAngle = DirectionAngle end end calculatedAngle = calculatedAngle % 360 local DirectionModule2D = math.sqrt(Direction.x^2 + Direction.y^2) Direction.x = -DirectionModule2D*math.cos(math.rad(calculatedAngle)) Direction.y = DirectionModule2D*math.sin(math.rad(calculatedAngle)) end end if Direction:Module() == 0 then self.extraVelocity = { x = 0, y = 0, z = 0 } end -- Set the new velocity setElementVelocity(localPlayer, Direction.x + self.extraVelocity.x, Direction.y + self.extraVelocity.y, Direction.z + self.extraVelocity.z) if self.extraVelocity.z > 0 then self.extraVelocity.z = self.extraVelocity.z - 1 if self.extraVelocity.z < 0 then self.extraVelocity.z = 0 end elseif self.extraVelocity.z < 0 then self.extraVelocity.z = self.extraVelocity.z + 1 if self.extraVelocity.z > 0 then self.extraVelocity.z = 0 end end end -- -- Players flight processing -- function Superman.processFlight() local self = Superman for player in iterateFlyingPlayers() do local Velocity = Vector3D:new(getElementVelocity(player)) local distanceToBase = getElementDistanceFromCentreOfMassToBaseOfModel(player) local playerPos = Vector3D:new(getElementPosition(player)) playerPos.z = playerPos.z - distanceToBase local distanceToGround if playerPos.z > 0 then local hit, hitX, hitY, hitZ, hitElement = processLineOfSight(playerPos.x, playerPos.y, playerPos.z, playerPos.x, playerPos.y, playerPos.z - LANDING_DISTANCE - 1, true, true, true, true, true, false, false, false) if hit then distanceToGround = playerPos.z - hitZ end end if distanceToGround and distanceToGround < GROUND_ZERO_TOLERANCE then self:restorePlayer(player) if player == localPlayer then setGravity(serverGravity) triggerServerEvent("superman:stop", getRootElement()) end elseif distanceToGround and distanceToGround < LANDING_DISTANCE then self:processLanding(player, Velocity, distanceToGround) elseif Velocity:Module() < ZERO_TOLERANCE then self:processIdleFlight(player) else self:processMovingFlight(player, Velocity) end end end function Superman:processIdleFlight(player) -- Set the proper animation on the player local animLib, animName = getPedAnimation(player) if animLib ~= IDLE_ANIMLIB or animName ~= IDLE_ANIMATION then setPedAnimation(player, IDLE_ANIMLIB, IDLE_ANIMATION, -1, IDLE_ANIM_LOOP, false, false) end setElementCollisionsEnabled(player, false) -- If this is myself, calculate the ped rotation depending on the camera rotation if player == localPlayer then local cameraX, cameraY, cameraZ, lookX, lookY, lookZ = getCameraMatrix() local Sight = Vector3D:new(lookX - cameraX, lookY - cameraY, lookZ - cameraZ) Sight:Normalize() if getControlState("look_behind") then Sight = Sight:Mul(-1) end Sight.z = math.atan(Sight.x / Sight.y) if Sight.y > 0 then Sight.z = Sight.z + math.pi end Sight.z = math.deg(Sight.z) + 180 setPedRotation(localPlayer, Sight.z) setElementRotation(localPlayer, 0, 0, Sight.z) else local Zangle = getPedCameraRotation(player) setPedRotation(player, Zangle) setElementRotation(player, 0, 0, Zangle) end end function Superman:processMovingFlight(player, Velocity) -- Set the proper animation on the player local animLib, animName = getPedAnimation(player) if animLib ~= FLIGHT_ANIMLIB or animName ~= FLIGHT_ANIMATION then setPedAnimation(player, FLIGHT_ANIMLIB, FLIGHT_ANIMATION, -1, FLIGHT_ANIM_LOOP, true, false) end if player == localPlayer then setElementCollisionsEnabled(player, true) else setElementCollisionsEnabled(player, false) end -- Calculate the player rotation depending on their velocity local Rotation = Vector3D:new(0, 0, 0) if Velocity.x == 0 and Velocity.y == 0 then Rotation.z = getPedRotation(player) else Rotation.z = math.deg(math.atan(Velocity.x / Velocity.y)) if Velocity.y > 0 then Rotation.z = Rotation.z - 180 end Rotation.z = (Rotation.z + 180) % 360 end Rotation.x = -math.deg(Velocity.z / Velocity:Module() * 1.2) -- Rotation compensation for the self animation rotation Rotation.x = Rotation.x - 40 -- Calculate the Y rotation for barrel rotations if not self.rotations[player] then self.rotations[player] = 0 end if not self.previousVelocity[player] then self.previousVelocity[player] = Vector3D:new(0, 0, 0) end local previousAngle = getVector2DAngle(self.previousVelocity[player]) local currentAngle = getVector2DAngle(Velocity) local diff = angleDiff(currentAngle, previousAngle) if isnan(diff) then diff = 0 end local calculatedYRotation = -diff * MAX_Y_ROTATION / MAX_ANGLE_SPEED if calculatedYRotation > self.rotations[player] then if calculatedYRotation - self.rotations[player] > ROTATION_Y_SPEED then self.rotations[player] = self.rotations[player] + ROTATION_Y_SPEED else self.rotations[player] = calculatedYRotation end else if self.rotations[player] - calculatedYRotation > ROTATION_Y_SPEED then self.rotations[player] = self.rotations[player] - ROTATION_Y_SPEED else self.rotations[player] = calculatedYRotation end end if self.rotations[player] > MAX_Y_ROTATION then self.rotations[player] = MAX_Y_ROTATION elseif self.rotations[player] < -MAX_Y_ROTATION then self.rotations[player] = -MAX_Y_ROTATION elseif math.abs(self.rotations[player]) < ZERO_TOLERANCE then self.rotations[player] = 0 end Rotation.y = self.rotations[player] -- Apply the calculated rotation setPedRotation(player, Rotation.z) setElementRotation(player, Rotation.x, Rotation.y, Rotation.z) -- Save the current velocity self.previousVelocity[player] = Velocity -- If the speed is over the given value, create the smoke generators if Velocity:Module() > (SMOKING_SPEED - ZERO_TOLERANCE) and not isElementInWater(player) then self:createSmokeGenerators(player) else self:destroySmokeGenerators(player) end end function Superman:processLanding(player, Velocity, distanceToGround) -- Set the proper animation on the player local animLib, animName = getPedAnimation(player) if animLib ~= FLIGHT_ANIMLIB or animName ~= FLIGHT_ANIMATION then setPedAnimation(player, FLIGHT_ANIMLIB, FLIGHT_ANIMATION, -1, FLIGHT_ANIM_LOOP, true, false) end if player == localPlayer then setElementCollisionsEnabled(player, true) else setElementCollisionsEnabled(player, false) end -- If the speed is over the given value, create the smoke generators if Velocity:Module() > (SMOKING_SPEED - ZERO_TOLERANCE) and not isElementInWater(player) then self:createSmokeGenerators(player) else self:destroySmokeGenerators(player) end -- Calculate the player rotation depending on their velocity and distance to ground local Rotation = Vector3D:new(0, 0, 0) if Velocity.x == 0 and Velocity.y == 0 then Rotation.z = getPedRotation(player) else Rotation.z = math.deg(math.atan(Velocity.x / Velocity.y)) if Velocity.y > 0 then Rotation.z = Rotation.z - 180 end Rotation.z = (Rotation.z + 180) % 360 end Rotation.x = -(85 - (distanceToGround * 85 / LANDING_DISTANCE)) -- Rotation compensation for the self animation rotation Rotation.x = Rotation.x - 40 -- Apply the calculated rotation setPedRotation(player, Rotation.z) setElementRotation(player, Rotation.x, Rotation.y, Rotation.z) end -- -- Vectors -- Vector3D = { new = function(self, _x, _y, _z) local newVector = { x = _x or 0.0, y = _y or 0.0, z = _z or 0.0 } return setmetatable(newVector, { __index = Vector3D }) end, Copy = function(self) return Vector3D:new(self.x, self.y, self.z) end, Normalize = function(self) local mod = self:Module() if mod ~= 0 then self.x = self.x / mod self.y = self.y / mod self.z = self.z / mod end end, Dot = function(self, V) return self.x * V.x + self.y * V.y + self.z * V.z end, Module = function(self) return math.sqrt(self.x * self.x + self.y * self.y + self.z * self.z) end, AddV = function(self, V) return Vector3D:new(self.x + V.x, self.y + V.y, self.z + V.z) end, SubV = function(self, V) return Vector3D:new(self.x - V.x, self.y - V.y, self.z - V.z) end, CrossV = function(self, V) return Vector3D:new(self.y * V.z - self.z * V.y, self.z * V.x - self.x * V.z, self.x * V.y - self.y * V.z) end, Mul = function(self, n) return Vector3D:new(self.x * n, self.y * n, self.z * n) end, Div = function(self, n) return Vector3D:new(self.x / n, self.y / n, self.z / n) end, MulV = function(self, V) return Vector3D:new(self.x * V.x, self.y * V.y, self.z * V.z) end, DivV = function(self, V) return Vector3D:new(self.x / V.x, self.y / V.y, self.z / V.z) end, } Server: -- Copyright (c) 2017, Alberto Alonso -- -- All rights reserved. -- -- Redistribution and use in source and binary forms, with or without modification, -- are permitted provided that the following conditions are met: -- -- * Redistributions of source code must retain the above copyright notice, this -- list of conditions and the following disclaimer. -- * Redistributions in binary form must reproduce the above copyright notice, this -- list of conditions and the following disclaimer in the documentation and/or other -- materials provided with the distribution. -- * Neither the name of the superman script nor the names of its contributors may be used -- to endorse or promote products derived from this software without specific prior -- written permission. -- -- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. local Superman = {} -- Static global values local rootElement = getRootElement() local thisResource = getThisResource() -- Resource events addEvent("superman:start", true) addEvent("superman:stop", true) -- -- Start/stop functions -- function Superman.Start() local self = Superman addEventHandler("superman:start", rootElement, self.clientStart) addEventHandler("superman:stop", rootElement, self.clientStop) addEventHandler("onPlayerVehicleEnter",rootElement,self.enterVehicle) end addEventHandler("onResourceStart", getResourceRootElement(thisResource), Superman.Start, false) function Superman.clientStart() setElementData(client, "superman:flying", true) end function Superman.clientStop() setElementData(client, "superman:flying", false) end -- Fix the notorious "Airkill" bug (would happen when you 'aim' the victim with knife when you get a chance first, like before they jump up, keep yourself in the 'slash' anim, then use /superman bind -- and complete the stealthkill action with left mouse button. This will result in victim just having their head sliced off while standing (or flying) in the air using superman. -- The action of 'targetting'/'aiming' them first, can also be done while they are in the air, assisted by lag (switch) that allows the green/color HP tag above their head to appear quickly enough to target. -- So the glitcher wouldn't always need to first stalk their victim around in order to abusively kill them. function cancelAirkill() if getElementData(source,"superman:flying") or getElementData(source,"superman:takingOff") then cancelEvent() end end addEventHandler("onPlayerStealthKill", getRootElement(),cancelAirkill) -- Fix for players glitching other players' vehicles by warping into them while superman is active, causing them to flinch into air and get stuck. function Superman.enterVehicle() if getElementData(source,"superman:flying") or getElementData(source,"superman:takingOff") then removePedFromVehicle(source) local x,y,z = getElementPosition(source) setElementPosition(source,x,y,z) end end local groups = { "Admin", "Console", "SuperModerator" } addEventHandler("onPlayerLogin", root, function ( _,account ) local accountName = getAccountName(account) for i, v in pairs ( groups ) do if ( isObjectInACLGroup ( "user.".. accountName, aclGetGroup ( v ) ) ) then setElementData(source, "canFly", true) end end end) Não testado -
Tem o isElement ali acima, se você mudar pra uma boolean vai precisar revisar essa linha. Remova também o "local thePlayer = getPlayerFromPartialName (playerName )" do código já que esse não será usado. Tente: function comprarv (source, cmd) if venda[source] then outputChatBox ( "* Erro: So Pode Comprar Uma Venda!", source ) else if getPlayerMoney(source) >= 1000 then -- verifique o dinheiro já que se trata de uma compra outputChatBox ( "* Venda Comprada /vendar [Jogador]", source ) venda[source] = true takePlayerMoney( source, 1000 ) else outputChatBox( "["..Comando_Revistar2.."] Dinheiro insuficiente!", source, 230, 30, 30 ) end end end addCommandHandler ( Comando_Revistar2, comprarv )
-
setElementPosition - se tiver com o veículo vai dar o teleporte junto. Para criar o carro createVehicle e warpPedIntoVehicle pra setar o jogador dentro dele. Criando o veículo já no local desejado junto com a função warp também deve funcionar.
-
-- cliente addEventHandler( "onClientResourceStart", resourceRoot, function() -- client iniciado; notificar o lado server triggerServerEvent( "server.onClientStart", localPlayer ) end ) addEvent( "callClientEvent", true ) addEventHandler( "callClientEvent", root, function() end ) -- server addEvent( "server.onClientStart", true ) addEventHandler( "server.onClientStart", root, function() -- este evento foi chamado pelo cliente, evitando o erro "but event is not added clientside" triggerClientEvent( client, "callClientEvent", resourceRoot ) -- callClientEvent: o evento dos scripts os quais ocorre esse tipo de erro; -- faça esse trigger para cada um daqueles eventos end )
-
A propósito, fadeCamera é bem mais fácil do que um dx, pois você terá que: fazer um trigger, adicionar o "onClientRender" para renderizar o dx; pra remover o mesmo, trigger e removeEventHandler. Enquanto que com fadeCamera seria diretamente na sintaxe da função, sem utilizar triggerClient. fadeCamera( thePlayer, false, 1 ) > escurecer a tela fadeCamera( thePlayer, true, 1 ) > voltar ao normal Você só irá alterar o valor booleano, ali no 1, você pode diminuir se quiser que o fadding gradual seja mais rápido. Obs: O Lord Henry já respondeu antes mas acho conveniente deixar aqui o meu post também Quando ao texto você também pode fazê-lo no lado server, aqui estão as funções: https://wiki.multitheftauto.com/wiki/Server_Scripting_Functions#Text_functions Edit: A cor preta já será a cor padrão na função, ou seja, se você não definir a cor, ela já será preta (red: 0, green: 0, blue: 0)
-
Ocorre quando o lado server chama o cliente mas o cliente ainda não está em execução. Pra sua informação: o lado server sempre inicia primeiro, então quando se usa triggerClientEvent no onResourceStart geralmente causa esses avisos. Também pode ser por conta de errors no client, fazendo com que o evento falhe e assim impossibilitando o trigger. A solução pode ser: fazer um trigger pro lado server no evento onClientResourceStart, e do server novamente pro cliente.
-
É um script de vendar o jogador? Você pode deixar a tela preta com fadeCamera também.
-
This error is probably in the snippet that's calling this function, but this snippet seems ok.
-
Falta verificar se 'player' existe na função Revistar, coloque está verificação após o primeiro if: if not player then return outputChatBox( "Sintaxe: /"..Comando_Revistar.." <jogador>", source ) end Quanto ao seu código eu ainda não entendi o que você quer fazer.
-
Na linha 64 tem um end que irá causar erro, coloque-o depois do outputChatBox abaixo. E também, a variável 'venda' na linha 21 deve ser uma tabela (local venda = {}).
-
No lugar da variável passa a ser a tabela, a qual o jogador-alvo ficará armazenado dentro da chave com o elemento-player como você pode ver no código. 'source' aí na tabela venda se refere ao jogador (que digitou o comando).
-
function comprarv (source, cmd, playerName) if venda[source] and isElement(venda[source]) then outputChatBox ( "* Erro: So Pode Comprar Uma Venda!", source ) else if not playerName then return outputChatBox( "Sintaxe: /"..Comando_Revistar2.." <jogador>", source ) end local thePlayer = getPlayerFromPartialName (playerName ) if isElement(thePlayer) then outputChatBox ( "* Venda Comprada /vendar [Jogador]", source ) venda[source] = thePlayer else outputChatBox( "["..Comando_Revistar2.."] Jogador não encontrado!", source ) end end end addCommandHandler ( Comando_Revistar2, comprarv ) 'venda' passa a ser uma tabela e não uma variável, daí você define como tal no topo do código.
-
No lado server será compartilhada entre os jogadores, então você pode definir um valor numa tabela com o player na chave para evitar conflitos. O código acima é lado server.
-
Pessoal o Mod Superman que ativei no servidor ele está para todos!
DNL291 replied to NeoGM's topic in Programação em Lua
Tópicos relacionados @NeoGM https://forum.multitheftauto.com/topic/92755-why-not-working-superman-only-for-admins/ https://forum.multitheftauto.com/topic/73306-superman-admin-privileges/ https://forum.multitheftauto.com/topic/68282-what-is-wrong/ https://forum.multitheftauto.com/topic/59639-superman-only-for-admins/ -
[AJUDA] Meu painel GUI não mostra a gridlist.
DNL291 replied to joao2235's topic in Programação em Lua
A melhor forma é armazenar em uma tabela e manter nela as armas de todos players, tudo isso no lado server. O setElementData só será útil se você quiser manter esses valores compartilhados com o cliente, caso seja só uma requisição o triggerServerEvent é melhor. Se entendi bem, o que você quer é armazenar temporariamente as armas do jogador, e 'puxar' as armas quando ele quiser obtê-las. Segue o meu código que irá salvar/devolver as armas com salvamento em table/array: local globalPlayerWeapons = {} -- tabela que irá armazenar as armas guardadas (de todos jogadores) function guardarArmas( player ) if not globalPlayerWeapons[player] then -- cria a tabela com o jogador na chave se não existir globalPlayerWeapons[player] = {} end for slot = 0, 12 do -- loop em todos slots das armas local weapon = getPedWeapon( player, slot ) if ( weapon > 0 ) then -- verifica se o player tem uma arma nesse slot local ammo = getPedTotalAmmo( player, slot ) -- obterm a munição da arma; slot: o slot no qual o loop percorre globalPlayerWeapons[ player ][ weapon ] = ammo -- inserir a arma na chave (id) e munição no valor end end takeAllWeapons(player) -- tirar todas armas do jogador end function pegarArmas( player ) if not globalPlayerWeapons[player] then return end -- se não existir a tabela do jogador, interromper a execução -- local weapons = globalPlayerWeapons[player] if weapons then for weapon, ammo in pairs(weapons) do -- loop na tabela das armas "key" : arma; "valor" : ammo giveWeapon(player, weapon, ammo, true) globalPlayerWeapons[player][weapon] = nil -- limpa da memória os valores de cada chave end end globalPlayerWeapons[player] = nil -- remove a tabela do jogador end Leia os comentários no código -
Pessoal Como que faz pra Criar um Download Perssonalizado ?
DNL291 replied to NeoGM's topic in Programação em Lua
Se você utiliza vários mods com excesso de polígonos consequentemente você terá vários MB's no servidor. Com relação ao download personalizado eu não sei se foi isso que você quis dizer, mas você pode fazer um resource para baixar os mods (TXD/DFF/COL) separadamente dos scripts e em segundo plano, a função downloadFile faz isso. Aqui já tem alguns destes resources que faz isso: https://community.multitheftauto.com/index.php?p=resources&s=list&name=downloader&descr=&category= -
Scripting/Lua related questions belongs to the Scripting section, @giovanymito post there next time. Topic: Use this function: https://wiki.multitheftauto.com/wiki/GetZoneName You can use this resource: https://community.multitheftauto.com/index.php?p=resources&s=details&id=15870 And modify it so that shows custom names by indexing a table, like this: local myZoneNames = { ["Ganton"] = "Custom name" } local px,py,pz = getElementPosition( thePlayer ) local playerzn = getZoneName( px,py,pz ) local newZoneName = myZoneNames[playerzn] or playerzn
-
[AJUDA] Meu painel GUI não mostra a gridlist.
DNL291 replied to joao2235's topic in Programação em Lua
Para chamar os lados cliente/server você usa triggerClientEvent/triggerServerEvent, além de chamar você também pode passar vários tipos de valores. Uma dica é você começar pelo que você começou fazer, e não pensar lá na frente. Se não entende como fazer trigger, tire um tempo para testar as funções que que mostrei. Faça o mesmo para a marker, armas, GUI. Os links deste tópico serão de muita ajuda pra você: https://forum.multitheftauto.com/topic/116681-informações-úteis-scriptingconfiguraçõestutoriais-para-o-mta/ -
setWeaponProperty - mas acho que não funciona com armas brancas Ou onClientPlayerDamage
-
O timer do round deve ser no lado server, pois no cliente é como se você tivesse definindo vários timers individualmente (para cada jogador). O que deve ser feito além disso, é fazer triggerServerEvent > triggerClientEvent ou onPlayerLogin > triggerClientEvent, passando o tempo restante, e chamar o evento no cliente.