Centauro Posted October 4, 2015 Posted October 4, 2015 Buenas a todos, bueno mi pregunta es como puedo obtener la munición del arma de un jugador, es que esto es necesario para mi en este momento ya que quiero realizar un script que cuando el jugador tenga 1 de municion no pueda disparar, esto como para que no se acaben sus armas. ¿Alguien sabe o me puede ayudar? Gracias.
aka Blue Posted October 4, 2015 Posted October 4, 2015 Si no me equivoco, seria algo tal que asi: addEventHandler ( "onWeaponFire", getRootElement ( ) function ( thePlayer, weapon ) local ammo = getWeaponAmmo ( weapon ) if ( ammo == 1 ) then ouputChatBox ( "Solo tienes '1' de munición. No puedes disparar.", thePlayer, 255, 0, 0 ) end end )
Centauro Posted October 4, 2015 Author Posted October 4, 2015 Si no me equivoco, seria algo tal que asi: addEventHandler ( "onWeaponFire", getRootElement ( ) function ( thePlayer, weapon ) local ammo = getWeaponAmmo ( weapon ) if ( ammo == 1 ) then ouputChatBox ( "Solo tienes '1' de munición. No puedes disparar.", thePlayer, 255, 0, 0 ) end end ) No, ya lo probé corrigiendo el codigo y no funciona.
Centauro Posted October 4, 2015 Author Posted October 4, 2015 Prueba con getWeaponClipAmmo Esa no se ajusta a lo que quiero porque es la munición a disparar no toda completa Alguien puede ayudarme ?
Centauro Posted October 4, 2015 Author Posted October 4, 2015 Deberías leerte mejor la función... Ya la leí, perdón si se me pasa algo, pero esa función devuelve lo que tenga para disparar no la munición completa del jugador.
aka Blue Posted October 4, 2015 Posted October 4, 2015 Pues entonces utiliza getPedWeapon con getWeaponAmmo...
Centauro Posted October 6, 2015 Author Posted October 6, 2015 tienes que usar esta funcion getPedAmmoInClip No me sirve para lo que quiero porque eso devuelve la munición a disparar y necesito que me de toda la municion del jugador..
alex17 Posted October 6, 2015 Posted October 6, 2015 getPedAmmoInClip devuelve la municion que queda en el cartucho getPedTotalAmmo devuelve toda la municion total restante y si lo que quires es saver cuanta municion puede alacenar cada arma en su cartucho utiliza getWeaponProperty(weapon, "poor", "maximum_clip_ammo")
Centauro Posted October 6, 2015 Author Posted October 6, 2015 getPedAmmoInClip devuelve la municion que queda en el cartuchogetPedTotalAmmo devuelve toda la municion total restante y si lo que quires es saver cuanta municion puede alacenar cada arma en su cartucho utiliza getWeaponProperty(weapon, "poor", "maximum_clip_ammo") Ya gracias, creo que getPedTotalAmmo es la indicada, y no lo que quiero hacer es que cuando un jugador tenga munición 1 no pueda disparar, solo que no se como hacerlo muy bien, eso intento. EDIT: Hasta ahora este es mi codigo, solo que no se como ejecutar la función, ni con que evento sea el indicado para que cuando llegue a 1 no pueda disparar. alguien puede ayudarme? function ammoF (thePlayer ) if ( thePlayer ) then local ammo = getPedTotalAmmo ( thePlayer ) if (ammo == 1) then setControlState ( thePlayer, "fire", false ) end end end
alex17 Posted October 6, 2015 Posted October 6, 2015 tal ves esto funcione no estoy seguro addEventHandler( "onWeaponFire", root, function () if ( isElement( source ) ) and ( getElementType( source ) == "player" ) then local ammo = getPedTotalAmmo ( source ) if ammo == 1 then outputChatBox("solo tienes 1 de municion",source,255,0,0) cancelEvent() end end end )
Centauro Posted October 6, 2015 Author Posted October 6, 2015 tal ves esto funcione no estoy seguro addEventHandler( "onWeaponFire", root, function () if ( isElement( source ) ) and ( getElementType( source ) == "player" ) then local ammo = getPedTotalAmmo ( source ) if ammo == 1 then outputChatBox("solo tienes 1 de municion",source,255,0,0) cancelEvent() end end end ) Gracias, pero no, no funciona y no tira error
Tomas Posted October 6, 2015 Posted October 6, 2015 No funciona, por que onWeaponFire, no es para player, si no que es para otro tipo.Client Side function onClientPlayerWeaponFireFunc(weapon, ammo, ammoInClip, hitX, hitY, hitZ, hitElement, startX, startY, startZ) if weapon and ammo then if ammo == 1 then setPedWeaponSlot ( localPlayer, 0 ) end end end addEventHandler("onClientPlayerWeaponFire", getLocalPlayer(), onClientPlayerWeaponFireFunc) El problema es que el evento no se puede cancelar, de esta forma. El evento se triggea al disparar, si antes de disparar tiene una bala ya no la tendrá cuando el evento sea triggeado, osea que eso no funcionaría
Sasu Posted October 6, 2015 Posted October 6, 2015 En onClientPlayerWeaponFire en vez de ammo == 1 que la condicion sea ammo == 2.
alex17 Posted October 7, 2015 Posted October 7, 2015 En onClientPlayerWeaponFire en vez de ammo == 1 que la condicion sea ammo == 2. eso solo funcionaria una ves ya que como dijo tomas el evento se triggea despues de disparar y la municion disminuiria 1
Centauro Posted October 7, 2015 Author Posted October 7, 2015 Que pruebe mi último script, él puede variar algunas si lo desea. Gracias por el codigo, lo probe y no sucede nada, es decir llego a 1 y no me cambia el slot o algo parecido y el arma se acaba como tal.. PD: Si lo hice con las armas restringidas por ti.
Centauro Posted October 7, 2015 Author Posted October 7, 2015 Que pruebe mi último script, él puede variar algunas si lo desea. Gracias por el codigo, lo probe y no sucede nada, es decir llego a 1 y no me cambia el slot o algo parecido y el arma se acaba como tal.. PD: Si lo hice con las armas restringidas por ti. Usa este script, lo que pasa es lo siguiente, cuando la munición llega a 1, entonces este evento onClientPlayerWeaponFire, hace que se cambie el slot a 0, es decir a la mano, pero el arma, siempre existe en tus slot, cuando quieres cambiar de slot, con onClientPlayerWeaponSwitch te pone en la mano cualquier arma que tengas con munición mayor que 1. No te permite ponerte en mano cualquier arma que tenga munición 1 o 0. Si no hay arma que tenga munición mayor que 0, automáticamente el sistema te pone en el slot 0, que es la mano. Pero siempre, vas a tener el arma en tus slots, pero no la puedes usar o ponertela en la mano. Client side function onClientPlayerWeaponFireFunc(weapon, ammo, ammoInClip, hitX, hitY, hitZ, hitElement, startX, startY, startZ) if weapon and ammo then if ammo == 1 then setPedWeaponSlot ( localPlayer, 0 ) end end end addEventHandler("onClientPlayerWeaponFire", getLocalPlayer(), onClientPlayerWeaponFireFunc) WeaponsRestricted = {16, 17, 18, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 41, 42, 43} function disableWeaponOnSwitch ( prevSlot, newSlot ) local weapon = getPedWeapon(getLocalPlayer(),newSlot) local ammoSlot = getPedTotalAmmo ( getLocalPlayer(), newSlot ) for k,v in ipairs(WeaponsRestricted) do if (ammoSlot == 1) and (weapon == v) then local h = 0 local dis = 0 repeat dis = 0 h = h + 1 local weapon2 = getPedWeapon(getLocalPlayer(), h) local ammoSlot2 = getPedTotalAmmo ( getLocalPlayer(), h) if ammoSlot2 > 1 then setPedWeaponSlot ( localPlayer, h ) dis = 1 end if (h == 12) and (ammoSlot2 <= 1) then setPedWeaponSlot ( localPlayer, 0 ) dis = 1 end until dis == 1 end end end addEventHandler ( "onClientPlayerWeaponSwitch", getRootElement(), disableWeaponOnSwitch ) Funciona a la perfección, muchas gracias, pero no puedo hacer que en vez de que le cambie un slot si pueda ver su arma, mas no pueda dispararla?
aka Blue Posted October 7, 2015 Posted October 7, 2015 Lo suyo sería comprobar que al disparar, si tiene 1 de munición no le deje. Sería algo como lo que te puse al principio.
Tomas Posted October 7, 2015 Posted October 7, 2015 Ahora, hay otra forma, en la cual, debes remover el click cuando tengas en tu mano un arma, que tenga munición igual a 1. bind 2 fire, izi
UserToDelete Posted October 9, 2015 Posted October 9, 2015 El hecho de cancelar un evento en server side, solo significa que no se sincroniza, pero no que se gaste, Debes hacerlo en client side creo yo. o sino, cancelar en servidor, y giveWeapon No estoy seguro de si se puede cancelar este evento addEventHandler("onClientPlayerWeaponFire", root, function () if getPedTotalAmmo(localPlayer) == 1 then outputChatBox("Solo tienes 1 bala") cancelEvent() end end )
Enargy, Posted October 11, 2015 Posted October 11, 2015 type = { [22] = "handguns", [23] = "handguns", [24] = "handguns", [25] = "shotguns", [26] = "shotguns", [27] = "shotguns", [28] = "sub-machine_guns", [29] = "sub-machine_guns", [32] = "sub-machine_guns", [30] = "machine_guns", [31] = "machine_guns", [33] = "rifles", [34] = "rifles", [35] = "heavy_weapons", [36] = "heavy_weapons", [37] = "heavy_weapons", [38] = "heavy_weapons", } function getWeaponCategory( id ) local myWeapon = getPlayerWeapon( localPlayer ) if ( myWeapon ) then return type[id] end return false end weapons = { ["handguns"] = true,["shotguns"] = true,["sub-machine_guns"] = true, ["machine_guns"] = true,["rifles"] = true,["heavy_weapons"] = true, } function blockWeapon( ) if (not weapons[getWeaponCategory( getPlayerWeapon(localPlayer) )] ) then toggleControl("fire", true) return end if ( getPedTotalAmmo( getLocalPlayer() ) == 1 ) then toggleControl("fire", false) else toggleControl("fire", true) end end addEventHandler( "onClientPlayerWeaponFire", root, blockWeapon ) addEventHandler( "onClientPlayerWeaponSwitch", root, blockWeapon ) addEventHandler( "onClientResourceStop", resourceRoot, function() toggleControl("fire", true) end )
Recommended Posts