BlackTibia

No estás conectado. Conéctate o registrate

 » Open Tibia » Pedido de Scripts » 

[Pedido] Script puerta x sacrificio

[Pedido] Script puerta x sacrificio

#1 [Pedido] Script puerta x sacrificio el Sáb Oct 18, 2014 11:53 pm

bjhp4


Novato
Necesito un script que habra una puerta por medio de usar sangre en una piedra. Tipo sacrificio. y a un tiempo determinado se quite la sangre y se cierre la puerta. Por favor ayudenme

#2 Re: [Pedido] Script puerta x sacrificio el Mar Nov 04, 2014 5:55 pm

Belerofonte


Administrador
Te vas a tu Servidor/Data/Actions/Scripts/Liquids/... abres el archivo llamado Containers.lua ya existente y entre las líneas número 133 & 134 creas un espacio:
[Tienes que estar registrado y conectado para ver esa imagen]
Si en esa zona del script que tienes salen y aparecen las mismas cosas de la misma forma, en el espacio creado pegas lo siguiente: (en caso contrario, házmelo saber)
Código:
     local a = { -- Puerta sacrificio By Belero.
        exhaustionKey = 307512, -- Número del StorageKey que gustes.
        segundsAbierto = 690, -- La suma de los segundos que tengan las 3 formas de charcos de fluidos (2016, 2017, 2018) en sus variables "duration" procedentes del Items.xml
        recipienteUID = 4598, -- UniqueID del recipiente.
        PinchosDoorID = 9485, -- ID de la "puerta-reja con pinchos" que toque suelo.
        Damage = {min = 1, max = 2}, -- Daño mínimo & máximo que le asestará la puerta a la posible criatura que haya, al cerrarse.
        Msg = {
          'Para poder abrirla se necesita sangre', -- Mensaje que aparecerá cuando se vierta cualquier otro líquido que no sea sangre.
          'El recipiente ya esta lleno', -- Mensaje que saldra cuando se intente derramar sangre aun quedando ya restos de anteriormente.
        },
      }
      local posi = getThingPos(a.recipienteUID)
      local b = {
        Pa1Pi1 = {x=posi.x-1, y=posi.y-1, z=posi.z}, -- Pared 1 en Piso 1
        Pa2Pi1 = {x=posi.x, y=posi.y-1, z=posi.z}, -- Pared 2 en Piso 1
        Pa1Pi2 = {x=posi.x-1, y=posi.y-1, z=posi.z-1}, -- Pared 1 en Piso 2
        Pa2Pi2 = {x=posi.x, y=posi.y-1, z=posi.z-1}, -- Pared 2 en Piso 2
        Pa1Pi3 = {x=posi.x-1, y=posi.y-1, z=posi.z-2}, -- Pared 1 en Piso 3
        Pa2Pi3 = {x=posi.x, y=posi.y-1, z=posi.z-2}, -- Pared 2 en Piso 3
        Pa1Pi4 = {x=posi.x-1, y=posi.y-1, z=posi.z-3}, -- Pared 1 en Piso 4
        Pa2Pi4 = {x=posi.x, y=posi.y-1, z=posi.z-3}, -- Pared 2 en Piso 4
      }
      local Pa1, Pa2 = getTileItemById(b.Pa1Pi1, a.PinchosDoorID).uid, getTileItemById(b.Pa2Pi1, a.PinchosDoorID).uid
        local function AlfaAbre()
            doRelocate(b.Pa1Pi2, b.Pa1Pi3, false)
            doRelocate(b.Pa2Pi2, b.Pa2Pi3, false)
            doRemoveItem(Pa1, 1)
            doCreateItem(a.PinchosDoorID, 1, b.Pa1Pi2)
            doSendMagicEffect(b.Pa1Pi1, CONST_ME_POFF)
            doRemoveItem(Pa2, 1)
            doCreateItem(a.PinchosDoorID, 1, b.Pa2Pi2)
            doSendMagicEffect(b.Pa2Pi1, CONST_ME_POFF)
        end
        local function BetaAbre()
            doRelocate(b.Pa1Pi3, b.Pa1Pi4, false)
            doRelocate(b.Pa2Pi3, b.Pa2Pi4, false)
            doRelocate(b.Pa1Pi2, b.Pa1Pi3, false)
            doSendMagicEffect(b.Pa1Pi2, CONST_ME_POFF)
            doRelocate(b.Pa2Pi2, b.Pa2Pi3, false)
            doSendMagicEffect(b.Pa2Pi2, CONST_ME_POFF)
        end
        local function BetaCierra()
            doRelocate(b.Pa1Pi3, b.Pa1Pi2, false)
            doSendMagicEffect(b.Pa1Pi4, CONST_ME_POFF)
            doRelocate(b.Pa2Pi3, b.Pa2Pi2, false)
            doSendMagicEffect(b.Pa2Pi4, CONST_ME_POFF)
            doRelocate(b.Pa1Pi4, b.Pa1Pi3, false)
            doRelocate(b.Pa2Pi4, b.Pa2Pi3, false)
        end
        local function AlfaCierra()
         local area = {from = b.Pa1Pi1, to = b.Pa2Pi1}
          for x = area.from.x, area.to.x do
            for y = area.from.y, area.to.y do
              for z = area.from.z, area.to.z do
               local poss = {x=x, y=y, z=z}
                local player = getTopCreature(poss).uid
                if isCreature(player) then
                    doTargetCombatHealth(0, player, COMBAT_PHYSICALDAMAGE, -a.Damage.min, -a.Damage.max, CONST_ME_NONE)
                end
              end
            end
          end
            doRelocate(b.Pa1Pi2, b.Pa1Pi1, false)
            doSendMagicEffect(b.Pa1Pi1, CONST_ME_BLOCKHIT)
            doRelocate(b.Pa2Pi2, b.Pa2Pi1, false)
            doSendMagicEffect(b.Pa2Pi1, CONST_ME_BLOCKHIT)
            doRelocate(b.Pa1Pi3, b.Pa1Pi2, false)
            doRelocate(b.Pa2Pi3, b.Pa2Pi2, false)
        end
        if itemEx.uid == a.recipienteUID then
            if os.time(t) > getGlobalStorageValue(a.exhaustionKey) then
                if item.type == TYPE_BLOOD then
                    doSendDistanceShoot(getThingPos(item.uid), posi, CONST_ANI_EXPLOSION)
                    AlfaAbre()
                    addEvent (BetaAbre, a.segundsAbierto/3 * 1000)
                    addEvent (BetaCierra, a.segundsAbierto/2 * 1000)
                    addEvent (AlfaCierra, a.segundsAbierto * 1000)
                    setGlobalStorageValue(a.exhaustionKey, (os.time(t) + a.segundsAbierto))
                 else
                   doPlayerSendCancel(cid, a.Msg[1])
                end
             else
               doPlayerSendCancel(cid, a.Msg[2])
              return true
            end
        end

Instrucción
... en el script:
    local a = {
      exhaustionKey = 307512, -- Número del StorageKey que gustes.
      segundsAbierto = 690, -- La suma de los segundos que tengan las 3 formas de charcos de fluidos (2016, 2017, 2018) en sus variables "duration" procedentes del Items.xml
      recipienteUID = 4598, -- UniqueID del recipiente.
      PinchosDoorID = 9485, -- ID de la "puerta-reja con pinchos" que toque suelo.
      Damage = {min = 1, max = 2}, -- Daño mínimo & máximo que le asestará la puerta a la posible criatura que haya, al cerrarse.
      Msg = {
        'Para poder abrirla se necesita sangre', -- Mensaje que aparecerá cuando se vierta cualquier otro líquido que no sea sangre.
        'El recipiente ya esta lleno', -- Mensaje que saldra cuando se intente derramar sangre aun quedando ya restos de anteriormente.
      },
    }

Respecto a la variable "segundsAbierto" me refería a que si te vas a tu Servidor/Data/Items/Items.xml y buscas esas 3 formas de charcos, te aparecerá algo así:
  <item id="2016" article="a" name="pool">
       <attribute key="decayTo" value="2017" />
       <attribute key="duration" value="45" />
   </item>
   <item id="2017" article="a" name="pool">
       <attribute key="decayTo" value="2018" />
       <attribute key="duration" value="45" />
   </item>
   <item id="2018" article="a" name="pool">
       <attribute key="decayTo" value="0" />
       <attribute key="duration" value="600" />
   </item>
Esos son los valores que sumados darían la cantidad total de segundos que permanecerá abierta la puerta.


... en el Remeres:
[Tienes que estar registrado y conectado para ver esa imagen]
(Recuerda que para encontrar los objetos más rápidamente solo tienes que pulsar la tecla "J" y escribir en el buscador el id del objeto que quieras pillar)

Como ves, haces lo que sería la "puerta" normal formada por un par de rejas, de 2 pisos y un marco de 4 pisos. Da igual el piso en el que se haye solo puse lo de gris como una referencia.
- En el objeto que quieras usar como "recipiente" pones el UniqueID que le hayas puesto en la variable del script "recipienteUID".
- En el que sería el primer piso y tocando el suelo, las paredes que le hayas puesto en la variable del script "PinchosDoorID".
- En el segundo piso continúas la "la puerta" con la reja id: 9486. Y en éste también el ground id: 460, que en el rme aparece rojo transparente pero en el juego aparecerá totalmente invisible.
- En el tercer piso solamente vuelves a poner el ground id 460. (O cualquier otro que forme parte del escenario de alrededor, que quieras)
- Y en el cuarto piso otra vez vuelves a ponerlo, ground id 460. (O cualquier otro que forme parte del escenario de alrededor, que quieras)

Luego ya, si vas a poner otros objetos inamovibles que formen parte del escenario, en los mismos espacios de cualquiera de los 2 últimos pisos superiores, te recomendaría que también pusieras encima de cada uno el objeto id: 1548 (manteniendo pulsada la tecla "ALT" para que no se remueva el anterior), es un objeto que bloquea el espacio e invisible tanto en el remeres como en el juego.
Solo podrás ver que lo has puesto si al pasar el cursor por encima te aparece su respectivo nombre abajo o al darle doble clíck.

Y es porque la función del script que puse hace de ascensor, es decir, va a hacer subir & bajar absolutamente cualquier objeto que haya en esas posiciones salvo en la inferior por donde pasará el jugador.
Al haber puesto ese objeto invisible, solamente moverá ese e ignorará mover cualquier otro que hayas puesto antes.

El recipiente ya... puede ser el que quieras, eso ya depende del objeto que posea las propiedades correctas para que la sangre se le pueda derramar por encima y no debajo. Como te dije por privado, puedes poner primero el DemonBone id: 2136, y encima el Campfire id: 1421.
O ya para que dé el pego total podrías:
- Poner 1 sqm de ground tipo invisible id 460, justo donde vaya a estar el recipiente:
[Tienes que estar registrado y conectado para ver esa imagen]

- Añadir bordes del mismo tipo terrenal que posea el demás suelo de alrededor en cada uno de los 4 lados que limiten el recipiente:
[Tienes que estar registrado y conectado para ver esa imagen]

- Y en un piso inferior, añadir cualquier objeto que tenga aspecto como de profundad, como: 8642 ó 8647 ó 8653.
[Tienes que estar registrado y conectado para ver esa imagen]

- Vas probando hasta dar con las combinaciones que más te gusten:
[Tienes que estar registrado y conectado para ver esa imagen]


Resultado final
[Tienes que estar registrado y conectado para ver esa imagen]

Cualquier duda, problema, error, (o funcionamiento correcto); me avisas

EDIT: También si quieres que el recipiente vaya en otro lugar que no sea el que puse(al sur de la reja derecha) dime en qué lugar ha de ir respecto a la puerta.



Sugerencia para evitar futuros quebraderos de cabeza:
[Tienes que estar registrado y conectado para ver este vínculo] - [Tienes que estar registrado y conectado para ver este vínculo] - [Tienes que estar registrado y conectado para ver este vínculo]
[Tienes que estar registrado y conectado para ver esa imagen]

Ver el tema anterior Ver el tema siguiente Volver arriba  Mensaje [Página 1 de 1.]

Permisos de este foro:
No puedes responder a temas en este foro.

 

¿Quién está en línea?

En total hay 0 usuarios en línea: 0 Registrados, 0 Ocultos y 0 Invitado

Usuarios navegando en este foro: Ninguno

Forum Statistics

Nuestros miembros han públicado un total de posts en temas.
Actualmente hay miembros registrados.
Démosle la bienvenida al miembro más reciente,
La mayor cantidad de usuarios en línea ha sido de .