Inscrit le: 14 Oct 2009 Messages: 719 Sujets: 40 Spécialité en worldedit: Les bugs Médailles: 1 (En savoir plus...)
Posté le: 17/02/13 22:51 Sujet du message: Les patrols irrationnels
Me revoilà avec de nouveaux bugs .
J'aimerais bien comprendre d'où viennent les patrols irrationnels.
Dans ma map, ça arrive toujours à la même unité, et à chaque fois. J'ai beau changer les points d'arrivée et de départ, elle fait toujours n'importe quoi : un aller retour puis elle stoppe net.
Sinon j'ai aussi fait une lib' pour des patrols plus complexes, à plusieurs points, et là aussi j'ai des bugs. C'est à chaque fois les mêmes unités qui buguent, mais pas à chaque partie. Voici le code :
Jass:
library ComplexPatrol uses Mob
private struct PatrolList
readonly thistype next
readonly rect rect
static method create takes rect r returns thistype
local thistype this = thistype.allocate()
set this.next = 0
set this.rect = r
return this
endmethod
method add takes rect r returns thistype
set this.next = thistype.allocate()
set this.next.rect = r
return this.next
endmethod
method addList takes thistype l returns nothing
set this.next = l
endmethod
private region r = null
private trigger t = null
private PatrolList p = 0
private PatrolList l = 0
private PatrolList c = 0
public boolean wantDestroy = false
static method create takes integer i, rect a returns thistype
local thistype this = thistype.allocate(i, GetRectCenterX(a), GetRectCenterY(a), 0)
set this.t = CreateTrigger()
set this.r = CreateRegion()
set this.p = PatrolList.create(a)
set this.l = this.p
set this.c = this.p
call TriggerRegisterEnterRegion(this.t, this.r, null)
call TriggerAddCondition(this.t, Filter(function thistype.enter))
return this
endmethod
method onDestroy takes nothing returns nothing
loop
call p.destroy()
exitwhen p == l
set p = p.next
endloop
call DestroyTrigger(t)
set t = null
call RemoveRegion(r)
set r = null
endmethod
method launch takes nothing returns thistype
if this.c != 0 and this.c.rect != null then
call RegionAddRect(this.r, this.c.rect)
if IsUnitInRegion(this.r, this.unit) then
call RegionClearRect(this.r, this.c.rect)
set this.c = this.c.next
call this.launch()
else
call IssuePointOrder(this.unit, "move", GetRectCenterX(this.c.rect), GetRectCenterY(this.c.rect))
endif
endif
return this
endmethod
private static method enter takes nothing returns boolean
local thistype this = Mob[GetEnteringUnit()]
if this.r == GetTriggeringRegion() then
call RegionClearRect(this.r, this.c.rect)
set this.c = this.c.next
call this.launch()
endif
return false
endmethod
method add takes rect r returns thistype
set this.l = this.l.add(r)
return this
endmethod
L'unité reviens à son point de départ, alors que, j'ai vérifié (avec des ptits effets spéciaux ), les coordonnées de l'endroit où elle est censée aller sont bonnes.
Par contre j'ai pas encore vérifié si elle reçoit un ordre. Dans ce cas, ça serait pas très dur à corriger (on détecte l'ordre et s'il est mauvais, on redonne le bon).
@War : J'ai pas encore testé LinearPatrol, mais c'est pas un peu bourrin de redonner l'ordre toutes les x secondes? D'autant plus que j'ai testé de redonner l'ordre à l'unité qui bug (avec un patrol simple) et ça marche pas : elle refait un aller retour puis stoppe.
Edit : Après test, lorsqu'un bug dans ma lib' survient, l'unité reçoit un ordre, juste après le bon ordre, la ramenant à la position où elle a été créée. C'est possible que ce soit l'ordinateur, mais j'en doute puisque c'est toujours la même unité au même endroit.
Edit #2 : Yeahhh ! Bon, j'ai mis les patrols au joueur 11 (ordinateur) à la place du joueur 15, et plus de mouvements irrationnels ! J'ai aussi essayé de corriger les mouvements irrationnels de ma lib' avec la technique décrite plus haut et ça fonctionne plutôt bien .
Inscrit le: 14 Avr 2011 Messages: 1846 Sujets: 119 Spécialité en worldedit: fonctions paramétriques, équation de mouvement.
Posté le: 18/02/13 11:07 Sujet du message: Re: Les patrols irrationnels
EDIT Tirlititi : Pas besoin de quoter le précédent message dans son intégralité...
à ton avis pourquoi j'ai utilisé le bot 11 ? pas pour bloquer un slot, c'est parce que les neutres vont vouloir faire revenir l'unité à son point de départ, et que après ça les bloques.
si tu veux outrepasser la limite d'unité pour 1 joueur (je connais plus le nombre) et ne pas bloquer un slot, je te conseil de faire comme dans murloc slide : aléatoirement tu donnes l'unité à joueur 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 et tu lui supprime le contrôle avec une fonction dont le nom m'échappe. _________________
22:27:43<Seiraw> Bah y a deux genre de personnes
22:27:57<Seiraw> les soumis et les soumises
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