Foro especializado en Warcraft III y su editor
 
BuscarEntrar al ChatboxPortal del foroÍndiceSpellsRegistrarseConectarse
Eventos Actuales
No hay eventos actualmente
¡ Bienvenido Invitado !

Editar Perfil

Tus temas
Tus Mensajes ()

Enlaces rápidos








Comparte
 

 Problemas con Detonador

Ver el tema anterior Ver el tema siguiente Ir abajo 
AutorMensaje
AXEL_XWinDroidX
Peón


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 55
Reputación Reputación : 0
Monedas de oro : 191
Monedas de Platino : 0 Problemas con Detonador Empty

Inventario :
Problemas con Detonador Empysl10 Problemas con Detonador Empysl10 Problemas con Detonador Empysl10
Problemas con Detonador Empysl10 Problemas con Detonador Empysl10 Problemas con Detonador Empysl10

Problemas con Detonador Empty
Mensaje(#) Tema: Problemas con Detonador Problemas con Detonador Clock10Vie Jun 26, 2020 11:14 pm

Hola, ando con un problema con un detonador que saque de https://www.epicwar.com/maps/235176/ y es de un sistema de Damage Enginer o algo asi se le llama. Al hacer el check me tira un error en linea 994 espero no equivocarme, la cosa es que quiero solucionar esto para hacer mis demas sistemas y habilidades. He aplicado todas las variables y habilidades a mi mapa y sigue el problema, la verdad yo no se nada sobre estos tipos de detonadores creo que se llamas JASS bueno espero de su respuesta Smile

[jass]//TESH.scrollpos=62
http://TESH.alwaysfold=0
library Damage

/*---------------------------------------------------------------------
*             autor: Sauron
*               www: worldofeditors.forosweb.net
*---------------------------------------------------------------------
*---------------------------------------------------------------------
*  Utilidad
*---------------------------------------------------------------------
*      +   Provee evento "Unidad recibe daño"
*      +   Detecta tipo de daño (mágico o físico)
*      +   Posibilidad de bloquear daño
*      +   Se encarga de los leaks de evento
*---------------------------------------------------------------------
*  Implementación
*---------------------------------------------------------------------
*      Solo copiar y pegar este código junto con las
*      habilidades que se encuentren en:
*
*          Object Editor -> Abilities -> Custom Abilities -> Special -> Items
*---------------------------------------------------------------------
*  Interface
*---------------------------------------------------------------------
*      static method getSource takes nothing returns unit
*          Devuelve la unidad que hizo el daño
*
*      static method getTarget takes nothing returns unit
*          Devuelve la unidad que recibió el daño
*
*      static method getAmount takes nothing returns real
*          Devuelve la cantidad de daño
*
*      static method isMagic takes nothing returns boolean
*          true si el daño es mágico, false de lo contrario
*
*      static method block takes real amount returns nothing
*          Cantidad de daño a bloquear
*---------------------------------------------------------------------
*                Si usas GUI, ignora estas que siguen
*---------------------------------------------------------------------
*      static method registerFunc takes code func returns nothing
*          Registrar código que se ejecutará cuando
*          una unidad reciba daño
*
*      static method registerUnit takes unit which returns nothing
*          Registra la unidad en esta librería
*
*      static method unregisterUnit takes unit which returns nothing
*          Saca la unidad de la librería
*
*      static method isUnitRegistered takes unit which returns boolean
*          true si la unidad está registrada en
*          el sistema, false de lo contrario
*---------------------------------------------------------------------
*  Nota
*---------------------------------------------------------------------
*      Si removes una unidad que está registrada
*      por esta librería, usa Damage.unregisterUnit(unit)
*
*      Ejemplo:
*          Unit - Remove (unidad) from the game
*          Custom script: Damage.unregisterUnit(unidad)
*
*/

globals
   // Si vas a usar GUI, ponelo en true
   private constant boolean GUI_EXTENSION = true
   
   // Si queres que las unidades se registren
   // automáticamente, pone true
   private constant boolean AUTO_REGISTER = true
   
   // Rawcode de la habilidad que da vida extra
   private constant integer EXTRA_LIFE_ABILITY = 'A001'
   
   // Rawcode de la habilidad que usaremos para detectar
   // el tipo de daño
   private constant integer DAMAGE_TYPE_DETECTOR_ABILITY = 'A000'
   
   // Usar 1 solo detonador para todas las unidades
   // no es de lo mejor, así que dividimos
   // la tarea en varios.
   // Cuando un detonador llega a BUCKET_SIZE
   // eventos, se crea otro. De esta forma
   // cuando necesitemos limpiar los leaks
   // no será una tarea tan pesada como si se
   // estuviese trabajando con 1 solo detonador
   private constant integer BUCKET_SIZE = 50
   
   // Cantidad de leaks que tienen que haber
   // para limpiar el bucket
   private constant integer LEAKS_IN_BUCKET = 10
endglobals

private keyword DamageBlocker

private struct DamageEvent extends array
   readonly static trigger trigger = CreateTrigger()
   static boolean enabled = true
   
   readonly static unit source = null
   readonly static unit target = null
   readonly static real amount = 0.
   readonly static boolean isMagic = false
   
   static method fire takes nothing returns nothing
       local unit prevSource = thistype.source
       local unit prevTarget = thistype.target
       local real prevAmount = thistype.amount
       local boolean prevIsMagic = thistype.isMagic
       local real prevBlocked = DamageBlocker.blocked
       
       set thistype.source = GetEventDamageSource()
       set thistype.target = GetTriggerUnit()
       set thistype.amount = GetEventDamage()
       
       if ( thistype.source != null and thistype.target != null and thistype.amount != 0. ) then
           set thistype.isMagic = false
           set DamageBlocker.blocked = 0.
           
           if ( thistype.amount < 0 ) then
               set thistype.amount = -thistype.amount
               set thistype.isMagic = true
           endif
           
           call TriggerEvaluate(thistype.trigger)
           
           set thistype.isMagic = prevIsMagic
           set DamageBlocker.blocked = prevBlocked
       endif
       
       set thistype.source = prevSource
       set thistype.target = prevTarget
       set thistype.amount = prevAmount
       
       set prevSource = null
       set prevTarget = null
   endmethod
   
   static method register takes code func returns nothing
       local boolexpr f = Condition(func)
       call TriggerAddCondition(thistype.trigger, f)
   endmethod
endstruct

private module DamageTriggerDoublyLinkedList
   private static thistype array reusables
   private thistype prev
   private thistype next
   
   static method unmarkAsUsable takes thistype instance returns nothing
       if ( thistype.reusables[instance] != 0 ) then
           set thistype.reusables[instance] = 0
           
           set instance.next.prev = instance.prev
           set instance.prev.next = instance.next
       endif
   endmethod
   
   static method markAsUsable takes thistype instance returns nothing
       if ( thistype.reusables[instance] == 0 ) then
           set thistype.reusables[instance] = instance
           
           set instance.next = thistype(0).next.next
           set instance.prev = thistype(0).next.prev
           set thistype(0).next = instance
       endif
   endmethod
   
   static method getUsableInstance takes nothing returns thistype
       local thistype instance = thistype(0).next
       
       if ( instance == 0 ) then
           set instance = thistype.create()
       endif
       
       return instance
   endmethod
endmodule

private struct DamageTrigger
   private static hashtable hashtable = InitHashtable()

   private trigger trigger
   private group units
   private integer leaks
   private integer count
   
   implement DamageTriggerDoublyLinkedList
   
   static method isUnitRegistered takes unit which returns boolean
       return HaveSavedInteger(thistype.hashtable, GetHandleId(which), 0)
   endmethod
   
   private static method onDamage takes nothing returns boolean
       if ( DamageEvent.enabled ) then
           call DamageEvent.fire()
       endif
       return false
   endmethod
   
   private method remake takes nothing returns nothing
       local group tmpGroup = CreateGroup()
       local unit enum
   
       call DestroyTrigger(this.trigger)
       set this.trigger = CreateTrigger()
       
       loop
           set enum = FirstOfGroup(this.units)
           exitwhen enum == null
           call GroupRemoveUnit(this.units, enum)
           call GroupAddUnit(tmpGroup, enum)
           
           call TriggerRegisterUnitEvent(this.trigger, enum, EVENT_UNIT_DAMAGED)
       endloop
       
       call TriggerAddCondition(this.trigger, Condition(function DamageTrigger.onDamage))
       
       call DestroyGroup(this.units)
       set this.units = tmpGroup
       
       set this.leaks = 0
       
       set tmpGroup = null
   endmethod
   
   private static method create takes nothing returns DamageTrigger
       local DamageTrigger this = DamageTrigger.allocate()
       
       set this.trigger = CreateTrigger()
       set this.units = CreateGroup()
       set this.leaks = 0
       set this.count = 0
       
       call TriggerAddCondition(this.trigger, Condition(function DamageTrigger.onDamage))
       
       call thistype.markAsUsable(this)
       
       return this
   endmethod
   
   static method register takes unit which returns nothing
       local DamageTrigger instance = DamageTrigger.getUsableInstance()
   
       call SaveInteger(thistype.hashtable, GetHandleId(which), 0, instance)
   
       set instance.count = instance.count + 1
       call TriggerRegisterUnitEvent(instance.trigger, which, EVENT_UNIT_DAMAGED)
       
       call UnitAddAbility(which, DAMAGE_TYPE_DETECTOR_ABILITY)
       call UnitMakeAbilityPermanent(which, true, DAMAGE_TYPE_DETECTOR_ABILITY)
       
       if ( instance.count >= BUCKET_SIZE ) then
           call thistype.unmarkAsUsable(instance)
       endif
   endmethod
   
   static method unregister takes unit which returns nothing
       local integer whichId = GetHandleId(which)
       local DamageTrigger instance = LoadInteger(thistype.hashtable, whichId, 0)
       
       set instance.leaks = instance.leaks + 1
       set instance.count = instance.count - 1
       
       call GroupRemoveUnit(instance.units, which)
       
       if ( instance.leaks >= LEAKS_IN_BUCKET ) then
           call instance.remake()
       endif
       
       if ( instance.count < BUCKET_SIZE ) then
           call thistype.markAsUsable(instance)
       endif
       
       call FlushChildHashtable(thistype.hashtable, whichId)
   endmethod
endstruct

private struct DamageBlocker extends array
   private static timer timer = CreateTimer()
   private static unit unitWithExtraLife = null
   static real blocked = 0.
   
   private static method removeExtraLife takes nothing returns nothing
       local real life = GetWidgetLife(thistype.unitWithExtraLife)
       
       call UnitRemoveAbility(thistype.unitWithExtraLife, EXTRA_LIFE_ABILITY)
       
       if ( life > 0.405 ) then
           call SetWidgetLife(thistype.unitWithExtraLife, life)
       endif
   
       set thistype.unitWithExtraLife = null
   endmethod
   
   static method block takes real amount returns nothing
       local real newLife
   
       if ( thistype.blocked == DamageEvent.amount ) then
           return
       endif
   
       if ( thistype.blocked + amount > DamageEvent.amount ) then
           set amount = DamageEvent.amount - thistype.blocked
           set thistype.blocked = DamageEvent.amount
       else
           set thistype.blocked = thistype.blocked + amount
       endif
       
       set newLife = GetWidgetLife(DamageEvent.target) + amount
       call SetWidgetLife(DamageEvent.target, newLife)
       
       if ( GetWidgetLife(DamageEvent.target) < newLife ) then
           call TimerStart(thistype.timer, 0, false, function DamageBlocker.removeExtraLife)
       
           set thistype.unitWithExtraLife = DamageEvent.target
           call UnitAddAbility(thistype.unitWithExtraLife, EXTRA_LIFE_ABILITY)
           call SetWidgetLife(thistype.unitWithExtraLife, newLife)
       endif
   endmethod
endstruct

private struct MagicFixer extends array
   private static timer timer = CreateTimer()
   
   private static unit source = null
   private static unit target = null
   private static real amount = 0.

   private static method afterDamage takes nothing returns nothing
       set DamageEvent.enabled = false
       call UnitDamageTarget(thistype.source, thistype.target, thistype.amount*2, false, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_UNIVERSAL, null)
       set DamageEvent.enabled = true
   endmethod

   private static method onDamage takes nothing returns nothing
       if ( DamageEvent.isMagic ) then
           call TimerStart(thistype.timer, 0, false, function thistype.afterDamage)
           
           set thistype.source = DamageEvent.source
           set thistype.target = DamageEvent.target
           set thistype.amount = DamageEvent.amount
       endif
   endmethod

   private static method onInit takes nothing returns nothing
       call DamageEvent.register(function thistype.onDamage)
   endmethod
endstruct

struct Damage extends array
   static method getSource takes nothing returns unit
       return DamageEvent.source
   endmethod
   
   static method getTarget takes nothing returns unit
       return DamageEvent.target
   endmethod
   
   static method getAmount takes nothing returns real
       return DamageEvent.amount
   endmethod
   
   static method isMagic takes nothing returns boolean
       return DamageEvent.isMagic
   endmethod

   static method block takes real amount returns nothing
       call DamageBlocker.block(amount)
   endmethod

   static method registerFunc takes code func returns nothing
       call DamageEvent.register(func)
   endmethod
   
   static method registerUnit takes unit which returns nothing
       call DamageTrigger.register(which)
   endmethod
   
   static method unregisterUnit takes unit which returns nothing
       call DamageTrigger.unregister(which)
   endmethod
   
   static method isUnitRegistered takes unit which returns boolean
       return DamageTrigger.isUnitRegistered(which)
   endmethod
   
   static if ( AUTO_REGISTER ) then
       private static method enterUnit takes nothing returns boolean
           call DamageTrigger.register(GetFilterUnit())
           return false
       endmethod

       private static method autoRegisterUnits takes nothing returns nothing
           local trigger enterRegionTrigger = CreateTrigger()
           local region mapRegion = CreateRegion()
           local unit unitToRegister
           
           call GroupEnumUnitsInRect(bj_lastCreatedGroup, bj_mapInitialPlayableArea, null)
           
           loop
               set unitToRegister = FirstOfGroup(bj_lastCreatedGroup)
               exitwhen unitToRegister == null
               call GroupRemoveUnit(bj_lastCreatedGroup, unitToRegister)
               
               call DamageTrigger.register(unitToRegister)
           endloop
           
           call RegionAddRect(mapRegion, bj_mapInitialPlayableArea)
           call TriggerRegisterEnterRegion(enterRegionTrigger, mapRegion, Condition(function thistype.enterUnit))
           
           set enterRegionTrigger = null
           set mapRegion = null
       endmethod
   endif
   
   static if ( GUI_EXTENSION ) then
       private static method onDamage takes nothing returns nothing
           local unit prevSource = udg_Damage_Source
           local unit prevTarget = udg_Damage_Target
           local real prevAmount = udg_Damage_Amount
           local boolean prevIsMagic = udg_Damage_IsMagic
           local real prevToBlock = udg_Damage_ToBlock
           
           set udg_Damage_Source = DamageEvent.source
           set udg_Damage_Target = DamageEvent.target
           set udg_Damage_Amount = DamageEvent.amount
           set udg_Damage_IsMagic = DamageEvent.isMagic
           set udg_Damage_ToBlock = 0.
           
           set udg_Damage_Event = 1.
           set udg_Damage_Event = 0.
           
           if ( udg_Damage_ToBlock > 0. ) then
               call DamageBlocker.block(udg_Damage_ToBlock)
           endif
           
           set udg_Damage_Source = prevSource
           set udg_Damage_Target = prevTarget
           set udg_Damage_Amount = prevAmount
           set udg_Damage_IsMagic = prevIsMagic
           set udg_Damage_ToBlock = prevToBlock
           
           set prevSource = null
           set prevTarget = null
       endmethod
   
       private static method gui takes nothing returns nothing
           call DamageEvent.register(function thistype.onDamage)
       endmethod
   endif
       
   private static method onInit takes nothing returns nothing
       static if ( AUTO_REGISTER ) then
           call thistype.autoRegisterUnits()
       endif
       
       static if ( GUI_EXTENSION ) then
           call thistype.gui()
       endif
   endmethod
endstruct

endlibrary[/jass]
Volver arriba Ir abajo
Marcos_M

Marcos_M


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 3462
Reputación Reputación : 644
Monedas de oro : 10819
Monedas de Platino : 0 Problemas con Detonador Empty

Inventario :
Problemas con Detonador Empysl10 Problemas con Detonador Empysl10 Problemas con Detonador Empysl10
Problemas con Detonador Empysl10 Problemas con Detonador Empysl10 Problemas con Detonador Empysl10

Problemas con Detonador Empty
Mensaje(#) Tema: Re: Problemas con Detonador Problemas con Detonador Clock10Sáb Jun 27, 2020 12:07 pm

Si no tienes JASS Newgen Pack (que ese debe ser tu error) y no entiendes nada de vJASS(como ya mencionaste), deberías usar este sistema para el daño

https://www.hiveworkshop.com/pastebin/894d2c076c67b006c00e4abe5fa27d0a18789/

Y si realmente quieres mantener usando este sistema, deberías mostrar que error te da, porque el error es lo importante aquí
Volver arriba Ir abajo
AXEL_XWinDroidX
Peón


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 55
Reputación Reputación : 0
Monedas de oro : 191
Monedas de Platino : 0 Problemas con Detonador Empty

Inventario :
Problemas con Detonador Empysl10 Problemas con Detonador Empysl10 Problemas con Detonador Empysl10
Problemas con Detonador Empysl10 Problemas con Detonador Empysl10 Problemas con Detonador Empysl10

Problemas con Detonador Empty
Mensaje(#) Tema: Problemas con Detonador Problemas con Detonador Clock10Sáb Jun 27, 2020 11:56 pm

@Marcos_M escribió:
Si no tienes JASS Newgen Pack (que ese debe ser tu error) y no entiendes nada de vJASS(como ya mencionaste), deberías usar este sistema para el daño

https://www.hiveworkshop.com/pastebin/894d2c076c67b006c00e4abe5fa27d0a18789/

Y si realmente quieres mantener usando este sistema, deberías mostrar que error te da, porque el error es lo importante aquí

Acabo de hacer el check en el mapa que tenia el sistema y tambien tira error y me descargue otro mapa que es igual a ese pero es como una version mas reciente y ya no me tira error y ahora tengo otro problema. Un problema con una habilidad muy simple que hice y es de absorber vida con conjuros de (daño magico) es una habilidad que esta un juego llamado Mobile Legeds se llama "Viper Vamp" creo que asi xD no me quiere funcionar y segun el sistema tiene una boolean para saber si el daño causado es fisico o magico, puse:
[gui]Damage_IsMagic Equal to True
[/gui]
Este es el sistema de la habilidad.
[gui]Daga de magia vampirica
   Events
       Game - Damage_Event becomes Equal to 1.00
   Conditions
       (Percentage life of Damage_Source) Less than 99.99
       (Damage_Target is A structure) Equal to False
       (Damage_Source has (Item carried by Damage_Source of type Daga de magia vampirica)) Equal to True
       (Intelligence of Damage_Source (Exclude bonuses)) Less than (Strength of Damage_Source (Exclude bonuses))
       (Intelligence of Damage_Source (Exclude bonuses)) Less than (Agility of Damage_Source (Exclude bonuses))
       Damage_IsMagic Equal to True
   Actions
       Unit - Set life of Damage_Source to ((Life of Damage_Source) + (Damage_Amount / 8.00))
[/gui]
Este es el mapa https://www.epicwar.com/maps/237402/

Esto es para que no funcione en heroes inteligentes solo de otros atributos
[gui]       (Intelligence of Damage_Source (Exclude bonuses)) Less than (Strength of Damage_Source (Exclude bonuses))
       (Intelligence of Damage_Source (Exclude bonuses)) Less than (Agility of Damage_Source (Exclude bonuses))[/gui]
Volver arriba Ir abajo
Marcos_M

Marcos_M


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 3462
Reputación Reputación : 644
Monedas de oro : 10819
Monedas de Platino : 0 Problemas con Detonador Empty

Inventario :
Problemas con Detonador Empysl10 Problemas con Detonador Empysl10 Problemas con Detonador Empysl10
Problemas con Detonador Empysl10 Problemas con Detonador Empysl10 Problemas con Detonador Empysl10

Problemas con Detonador Empty
Mensaje(#) Tema: Re: Problemas con Detonador Problemas con Detonador Clock10Dom Jun 28, 2020 12:02 pm

Deberías usar el sistema que yo te recomendé, es más completo que el sistema de Sauron, pero tu error es debido a que seguramente no pusiste los configurables en tu mapa.

Problemas con Detonador 25b517103f

Fijate las variables
Damage_DetectorAbility
Damage_ExtraLifeAbility
Damage_BucketSize

Estas 3 variables requieren que les des un valor inicial, sino el sistema no funcionará bien
Volver arriba Ir abajo
Contenido patrocinado




Problemas con Detonador Empty
Mensaje(#) Tema: Re: Problemas con Detonador Problemas con Detonador Clock10

Volver arriba Ir abajo
 

Problemas con Detonador

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

 Temas similares

-
» Otra vez problemas de lag..
» algun hombre me podra amar si tengo ciertos problemas psicologicos
» HIJOS PREFERIDOS O PROBLEMAS PSICOLOGICOS DE LOS PADRES
» ansiedad o problemas del corazon
» Practiquemos el Sellado de RoE

Permisos de este foro:No puedes responder a temas en este foro.
Warcraft III - WorldEditor :: Zona de Aprendizaje(Dudas) :: General-