Inscrit le: 23 Aoû 2007 Messages: 7143 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 13/11/10 17:30 Sujet du message:
J'admets que ma phrase est ambigüe, mais tu remarqueras que j'ai bien aussi utilisé l'event "point pour cible".
De plus quand on pause une unité non déjà en pause/assommée, c'est bien cet event qui est déclenché, "objet pour cible" c'est quand l'unité est assommée par un widget.
Je suis d'accord avec toi pour le current order et pause, par contre c'est bien quand on pause l'unité qu'elle reçoit l'ordre spécial 851973, et le fait de donner un ordre pendant la pause de l'unit annule l'ordre qu'elle avait reçu avant, y'a pas de boucle.
Reregardes le trigger, testes le tu verras de quoi je parles.
Tu peux même t'amuser à essayer de mesurer le délai entre l'ordre donné et l'ordre reçu. _________________
Inscrit le: 23 Aoû 2007 Messages: 7143 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 08/08/11 13:51 Sujet du message:
Pour en revenir au sujet, j'ai toujours oublié ou eu la flemme d'exposer cette théorie :
Les ordres sans cible ne semblent pas immédiat, du moins avec certains events. (un comble quand même "immediate order")
Je crois me rappeler par ex avoir fait un trigger avec pour event une unité reçoit un ordre sans cible -> turn off trigger / order "stop" / turn on trigger, mais à ma grande surprise la désactivation du trigger ne suffisait pas, en effet l'ordre avait un petit délai avant de déclencher à nouveau l'event, lorsqu'il se déclenchait le trigger était déjà réactivé.
Cela expliquerait pas mal de choses, je t'encourage à faire des tests poussés, mais si t'as la flemme je le ferais probablement en septembre.
Si cela s'avère être plus qu'une théorie, c'est à dire un fait établi tu pourras bien entendu revendiquer en être le découvreur sur n'importe quel site. _________________
Inscrit le: 11 Fév 2011 Messages: 2151 Sujets: 114 Spécialité en worldedit: Chasser le Dragon, puis l'exterminer proprement avec une petite cuillère et une poêle.
Posté le: 08/08/11 13:55 Sujet du message:
Cela ne se passe pas que pour ça.
Gui:
Trigger:
Aura Pieuse
Evénements
Unité - A unit Est attaqué
Conditions
((Attacked unit) has an item of type Anneau du Paladin) Egal à TRUE
Actions
Set AdP_Aura_Group = (Units within 250.00 of (Position of (Attacked unit)) matching (((Owner of (Matching unit)) is an ally of (Owner of (Attacked unit))) Egal à TRUE))
For each (Integer A) from 1 to (Number of units in AdP_Aura_Group), do (Actions)
Boucle - Actions
Set AdP_Aura_boucle_random = (Random unit from AdP_Aura_Group) Unité - Cause (Triggering unit) to damage AdP_Aura_boucle_random, dealing -2.00 damage of attack type Sorts and damage type Divin
Groupe unité - Remove AdP_Aura_boucle_random from AdP_Aura_Group
Bizarrement il y a un delay d'environ 0,5 secondes avant que le heal se produise. _________________
Inscrit le: 23 Aoû 2007 Messages: 7143 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 08/08/11 14:00 Sujet du message:
Mouai, je suis très très très sceptique c'est probablement l'impression que tu as.
C'est assez simple à vérifier, il suffit d'afficher la vie de l'unit juste avant et après le damage (en partant du principe que sa vie n'était pas au maximum) _________________
Inscrit le: 11 Fév 2011 Messages: 2151 Sujets: 114 Spécialité en worldedit: Chasser le Dragon, puis l'exterminer proprement avec une petite cuillère et une poêle.
Posté le: 08/08/11 14:05 Sujet du message:
Bon, on a un héros avec l'item. On le nomme X.
Il va fighter un creep qui possède une attaque instantané et qu'on nomme Y.
Donc Y attaque X.
X va perdre de la vie dû aux dommages de l'attaque.
Environ 0,5secondes plus tard, X régénère 2hp grâce à cette aura.
Si tu ne me crois pas, test ma map (BotEF) et achète toi l'Anneau du Paladin (2anneaux de protection + 1 anneau de régénération), puis pars te faire attaquer par un creep. _________________
Inscrit le: 23 Aoû 2007 Messages: 7143 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 08/08/11 14:08 Sujet du message:
Teuh teuh teuh fait le test que je te dis, et si c'est comme je le pense alors cela reste une simple impression, cela viendrait de l'event en lui même, c'est à dire au moment où l'event "attaque" se déclenche.
Ou peut être du temps de rafraîchissement de la barre de vie de l'unit, un peu comme pour la barre d'xp.
(et contrairement à toi ce n'est pas chiant à tester, juste un display text à ajouter, puis copier/coller) _________________
Inscrit le: 21 Fév 2010 Messages: 1785 Sujets: 22 Spécialité en worldedit: La modestie Médailles: 1 (En savoir plus...)
Posté le: 08/08/11 14:28 Sujet du message:
Non mais l'event de Vladadamm est "A unit est attaqué", c'est normal :
1) X est attaqué mais est full hp.
2) X subit des dommages.
3) X est attaqué une seconde fois et régénère 2 hp.
C'est normal qu'il y ait un delay entre chaque étape. Ça dépend des "attack points/backswing point/cooldown".
Je testerais le delay des ordres. Ça pourrait en effet expliquer des choses. Merci Troll-Brain. _________________
function TestFirst takes nothing returns nothing
local trigger t=CreateTrigger()
set theTimer=CreateTimer()
set theUnit=CreateUnit(Player(0),'hfoo',0,0,0)
call TimerStart(CreateTimer(),2,false,function TestSecond)
call TriggerRegisterUnitEvent(t,theUnit,EVENT_UNIT_ISSUED_ORDER)
call TriggerRegisterUnitEvent(t,theUnit,EVENT_UNIT_ISSUED_POINT_ORDER)
call TriggerRegisterUnitEvent(t,theUnit,EVENT_UNIT_ISSUED_TARGET_ORDER)
call TriggerAddAction(t,function TestThird)
endfunction
résultats :
1er test :
Secret:
1
order :
timer : 0.000
2
order : stop
timer : 0.010
En utilisant un ordre ciblé (move) :
Secret:
1
order :
timer : 0.000
2
En retirant le pause/unpause :
Secret:
1
order : stop
timer : 0.000
2
Sans mettre d'ordre :
Secret:
1
order :
timer : 0.000
2
Petites précisions :
- "order : " est sans aucun doute l'ordre de mis en pause.
- on a les mêmes résultats avec un Paladin ou un Infestation (la mouche qui a 'Aloc').
- on a les mêmes résultats avec "holdposition".
Conclusions :
Les ordres ciblés ne sont pas pris en compte lorsque l'unité est pausée par déclencheur.
Les ordres sans cible sont immédiats en temps normal.
Les ordres sans cible donnés par déclencheur à une unité pausée ne sont effectifs qu'avec un delay de 0.01 seconde après la démise en pause.
EDIT : Rajout de tests en utilisant "thunderbolt" pour mettre en pause et "UnitRemoveAbility(buff)" pour enlever la pause :
On a les mêmes résultats (delay de 0.01 seconde) mais les ordres ciblés ne sont pas ignorés cette fois (ils ont donc le même delay après avoir enlevé le buff).
L'ordre "donné" avec un delay est le dernier à avoir été "donné" pendant la pause (logique).
Il faut encore que je réfléchisse à comment ça s’imbrique dans le bug des "réponses évènements". Le pire, selon moi, c'est qu'on peut pas utiliser de "timer(0)" dans ce cas. _________________
Inscrit le: 23 Aoû 2007 Messages: 7143 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 13/08/11 18:17 Sujet du message:
J'ai moi même procédé à quelques tests, le but était de savoir si aucun type ordre n'avait de delai avec tous les type d'order event, j'ai donc conçu un test exhaustif.
Constat :
Visiblement aucun délai, je m'en suis assuré avec le turn off/on trigger qui fonctionne comme prévu pour les 9 combinaisons possibles (type d'order event / type d'ordre donné au déclenchement de l'event).
Mais l'ordre sans cible "stop" n'a aucun effet, du moins avec les ordres que j'ai essayé (holdposition,move,smart).
Pour une raison inconnue (pour le fun probablement ...) il stoppe toutefois l'ordre point "patrol" (tu peux faire l'essai en remplaçant l'ordre move par patrol dans la fonction Test), d'ailleurs je n'ai pas essayé d'afficher le current order mais dans ce cas précis aucun ordre n'est sélectionné dans l'interface de l'unité, je veux dire l'ordre stop n'est pas sélectionné.
Donc d'après ce que tu me dis ça serait plus probablement la pause et/ou la reprise qui ne serait pas instantanés plutôt que les ordres en eux mêmes.
Au fait utiliser SetUnitPosition génère un ordre stop (ou 851973 je ne sais plus), j'ai toujours cru que cela générait un ordre stop que si l'on faisait plusieurs fois dans des intervalles courts, étant donné que si l'on ne le fait qu'une fois cela ne stoppait pas forcément l'ordre en cours, mais vu ce que j'ai testé avec l'ordre stop mon erreur est compréhensible.
Toutefois je pense que la solution du Timer(0) fonctionne très bien, la valeur que tu affiches (0.01) vient plus probablement de l'imprécision du TimerGetElapsed (ou du timer en lui même, ce sujet est flou pour moi), pour t'en assurer tu peux faire comme moi utiliser un timer 0 et afficher son expiration.
Mais dans certains cas le timer(0) ne suffit pas, il faut impérativement pause l'unité, je pense notamment à si tu veux empêcher d'apprendre une compétence à une unité depuis la sélection du héros.
Jass:
ibrary Test initializer init
globals
private unit U
private player P
private unit Target
private string TestToDo
private boolean DoTheTest = true
private string array ORDER_EVENT
endglobals
private function TimerExpire takes nothing returns nothing
call BJDebugMsg("timer expire")
endfunction
private function DisplayOrders takes nothing returns nothing
call TriggerRegisterPlayerChatEvent(trig,P,"clear",true) // effacer les messages de la chatbox
call TriggerAddAction(trig,function Test)
set ORDER_EVENT[GetHandleId(EVENT_PLAYER_UNIT_ISSUED_ORDER)]="EVENT_PLAYER_UNIT_ISSUED_ORDER"
set ORDER_EVENT[GetHandleId(EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER)]="EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER"
set ORDER_EVENT[GetHandleId(EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER)]="EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER"
call SelectUnit(U,true)
call PanCameraToTimed(0,0,0)
endfunction
endlibrary
HS : Je n'ai pas mis autant de saut de lignes c'est Jasshelper qui fait cela, j'ai récupéré ce code dans le imputwar3map.j du sous dossier logs du JNGP. _________________
Ici il s'agit d'une erreur de logique de la part de Blizzou, il faut suivre le déroulement de l'appels des fonctions du GUI pour comprendre le bug.
Je ne sais pas si cela bug avec d'autres pick every, mais j'en ai jamais entendu parlé ni expérimenté, cela dit ça fait des années que je n'ai pas touché au GUI et ce bug est très peu connu, en effet la plupart assument que l'utilisation du booléen "bj_wantDestroyGroup" a été bien pensé (les fous ^^ :p) _________________
Inscrit le: 21 Fév 2010 Messages: 1785 Sujets: 22 Spécialité en worldedit: La modestie Médailles: 1 (En savoir plus...)
Posté le: 25/08/11 12:00 Sujet du message:
Bof. Je suis pas contre mettre des bugs GUI, mais un bug GUI qui utilise des custom scripts, c'est limite. D'autant plus qu'on ne donne pas souvent cette méthode pour éviter les leaks : on préfère la solution classique (à la limite, ça aurait sa place comme remarque dans le tuto sur les leaks).
Après, pour l'autre bug, le delay est bien réel et les timers sont très précis (3ème décimale au moins). On peut vraiment pas utiliser de timer(0) dans ce genre là :
Secret:
Jass:
function RenableTrigger
call EnableTrigger40; theTrigger 41;
endfunction
function theTriggerFunctionWithIssuedOrderEvent
call DisableTrigger40; theTrigger 41;
call PauseUnit40; u, true 41;
call IssueImmediateOrder40;theUnit,"stop"41;
call PauseUnit40; u, false 41;
call TimerStart40; theTimer, 0, false, function RenableTrigger 41;
endfunction
Par contre on peut tout à fait utiliser un timer(0) pour éviter le bug comme ça (et donner un ordre effectif) :
Secret:
Jass:
function OrderStop
call IssueImmediateOrder40;theUnit,"stop"41;
call EnableTrigger40; theTrigger 41;
endfunction
function theTriggerFunctionWithIssuedOrderEvent
call DisableTrigger40; theTrigger 41;
call TimerStart40; theTimer, 0, false, function OrderStop 41;
endfunction
À propos de la précision du timer et du "GetElapsed", on peut récupérer le casting time d'une unité (3 décimales au moins, donc) avec un code de ce genre :
Secret:
Jass:
function TestSecond takes nothing returns nothing
if check then
call BJDebugMsg(R2S(TimerGetElapsed(theTimer)))
else
call TimerStart(theTimer,10,false,null)
endif
set check=not check
endfunction
function test takes nothing returns nothing
local trigger t=CreateTrigger()
local unit u=CreateUnit(Player(0),'Udea',-8300,1700,0)
set check = false
call TriggerRegisterUnitEvent(t,u,EVENT_UNIT_SPELL_CAST)
call TriggerRegisterUnitEvent(t,u,EVENT_UNIT_SPELL_EFFECT)
call TriggerAddAction(t,function TestSecond)
endfunction
Donc c'est précis pour mesurer le "temps warcraft III" (après je sais pas si c'est précis en comparant avec une montre réelle mais bon...). _________________
Inscrit le: 23 Aoû 2007 Messages: 7143 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 25/08/11 19:48 Sujet du message:
Tirlititi a écrit:
Bof. Je suis pas contre mettre des bugs GUI, mais un bug GUI qui utilise des custom scripts, c'est limite. D'autant plus qu'on ne donne pas souvent cette méthode pour éviter les leaks : on préfère la solution classique (à la limite, ça aurait sa place comme remarque dans le tuto sur les leaks).
C'est toi qui voit, je croyais juste que tu étais plus "open" que moi ^^
Par contre détrompe toi c'est la solution privilégiée donnée pour ceux qui font la chasse aux leaks en GUI, l'alternative étant aussi d'utiliser un custom script avec DestroyGroup mais il faut en plus utiliser une variable groupe et l'utiliser correctement dans le custom script (moins friendly user).
En fait ce bug est très peu connu, probablement à cause de la relative utilité de "pick every unit of type".
Et comme plusieurs autres (la plupart ?) variables bj_, elles n'a d'utilité que pour les fonctions GUI de groupe "pick every".
Comme tu le sais les customs scripts sont monnaies courantes en GUI, les fonctions de destructions d'handle étant majoritairement indisponibles en GUI.
Pour les timers je quote plus ou moins Vexorian, l'imprécision deviendrait "significative" avec des durées de timer longue, m'enfin ... _________________
Inscrit le: 23 Aoû 2007 Messages: 7143 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 12/01/12 17:20 Sujet du message:
Tirlititi a écrit:
SyncSelections synchronise immédiatement la sélection
M'étonnerait beaucoup que cela soit immédiat, ca devrait plutôt agir à la façon d'un wait, comme les autres fonctions natives Sync liés au gamecache, faudrait tester avec un timer.
Le temps de sélection varie, et est dépendant du type de partie (en solo ou en réseau).
Après je ne sais pas si on peut le faire varier avec des logiciels tiers appelés "réducteurs de delay", mais je suppose que oui. _________________
Inscrit le: 21 Fév 2010 Messages: 1785 Sujets: 22 Spécialité en worldedit: La modestie Médailles: 1 (En savoir plus...)
Posté le: 13/01/12 18:00 Sujet du message:
En effet, y'a un temps d'attente sensiblement égal à TriggerSleepAction(0) et on ne peut pas l'utiliser autre part que dans une action de déclencheur. Moi qui pensait que c'était une bonne petite fonction...
Je m'en vais éditer ça.
EDIT : enlevé la partie nawak de mon post. _________________
Inscrit le: 23 Aoû 2007 Messages: 7143 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 13/01/12 20:26 Sujet du message:
En fait en y réfléchissant, je ne considérerais pas vraiment cela comme un bogue.
Qu'une sélection/dé-sélection n'est pas quelque chose instantané doit avoir une raison, ce n'est pas un bug en soi.
Maintenant le comportement de IsUnitSelected est litigieux, mais en fait ça me semble logique pour éviter de resélectionner/déselectionner une unité qui allait l'être.
Toutefois je suppose que ça vaut le coup de le garder car on m'a encore tout récemment demander de déboguer le cas de récursivité infinie avec delay, que tu illustres. _________________
Toutes les heures sont au format GMT + 1 Heure Aller à la page Précédente1, 2, 3, 4, 5, 6Suivante
Page 5 sur 6
Vous ne pouvez pas poster de nouveaux sujets dans ce forum Vous ne pouvez pas répondre aux sujets dans ce forum Vous ne pouvez pas éditer vos messages dans ce forum Vous ne pouvez pas supprimer vos messages dans ce forum Vous ne pouvez pas voter dans les sondages de ce forum