Inscrit le: 21 Fév 2010 Messages: 1785 Sujets: 22 Spécialité en worldedit: La modestie Médailles: 1 (En savoir plus...)
Posté le: 01/06/10 17:18 Sujet du message: Le Marché aux Bugs - Objets
LES DONNÉES COMPÉTENCE
Dans Warcraft, les compétences sont en grande partie codées en dur dans la bibliothèque Game.dll et leurs modifications via l'éditeur d'objet ou le format .slk sont limitées.
Les différents champs de donnée des compétences sont utilisés de manière spécifique à chaque sort. Ainsi, le champs "Infographie - Spécial" de Esprit sauvage est l'effet spécial montré lorsque les loups meurent mais "Infographie - Spécial" de l'Aura spirituelle est l'effet spécial du lanceur de sort.
Du coup, il est impossible de rajouter des propriétés aux sorts s'ils ne sont pas faits pour. Il est, par exemple, impossible de rajouter un projectile pour beaucoup de compétences. De même, les champs "Texte - Ordre chaîne" sont presque systématiquement codés en dur dans le sort et changer l'ordre dans l'éditeur est inefficace (exception faite de Canaliser et Livre de Sorts).
Même les champs portant sur les conditions ne sont pas utilisables par toutes les compétences. _________________
Dernière édition par Tirlititi le 27/08/10 18:40; édité 2 fois
Inscrit le: 21 Fév 2010 Messages: 1785 Sujets: 22 Spécialité en worldedit: La modestie Médailles: 1 (En savoir plus...)
Posté le: 01/06/10 17:34 Sujet du message:
CONFLIT D'ORDRE
Deux compétences partageant le même ordre sur une même unité vont entrer en conflit. Lorsque l'unité reçoit l'ordre qui est commun aux deux compétences, une seule est lancée : celle qui est positionnée en dernier dans la liste des sorts de l'unité.
Si l'ordre est donné alors que l'une des compétence est indisponible (conditions non requises/cooldown/livre de sort...), l'autre compétence sera lancée normalement mais il y aura l'effet fluorescent sur l'icône de la compétence indisponible.
Ils existe plusieurs méthodes pour contourner ou résoudre ce bug : mettre les compétences dans des livres de sorts séparés, utiliser des compétences basées sur canalisation et la technique du dummy caster... La technique d'ajouter des sorts aux livres de sorts permet également de résoudre ce conflit d'ordre car les deux sorts ne seront pas "véritablement" dans le même livre. Pour rappel :
Secret:
D’autre part on peut ajouter des sorts au livre de sort et les supprimer ensuite en cours de jeu. On peut le faire en ajoutant à l’unité un second livre de sort avec le sort souhaité et en désactivant le second livre en question. Ainsi la compétence sera affichée dans le premier livre de sort et le second livre de sort ne sera pas visible. Pour que cela fonctionne, les deux livres de sort devront avoir la même ID ordre de base. Pour chaque sort que l’on souhaite ajouter on aura besoin d’un livre de sort. [...]
Bien sûr le livre de sort devra être désactivé pour les joueurs au début de la partie. Pour empêcher des bugs le nombre minimum de compétences d’un livre de sort doit être égal au maximum.
(Tiré de la traduction de jk2pach sur les effets des sort.)
Attention : en ce qui concerne la compétence Canaliser, il vaut mieux choisir un ID d'ordre qui correspond au type de cible du sort (par exemple, "thunderbolt" ne devrait être donné qu'à un sort qui cible une unité). Il semble en effet qu'il soit parfois impossible de donner par déclencheur l'ordre de lancer une compétence basée sur Canaliser si ces deux champs ne correspondent pas. _________________
Dernière édition par Tirlititi le 08/03/14 23:18; édité 13 fois
Inscrit le: 21 Fév 2010 Messages: 1785 Sujets: 22 Spécialité en worldedit: La modestie Médailles: 1 (En savoir plus...)
Posté le: 01/06/10 17:56 Sujet du message:
TEXTE D'AIDE ALÉATOIRE
Si on met un texte vide dans le champs "Texte - Aide - Off - Étendue" d'une compétence activable/désactivable comme Feu Intérieur, la description "Texte - Aide - Normal - Étendu" du sort en jeu sera généré aléatoirement à chaque fois qu'on passera le pointeur sur l'icône du sort.
Curieusement, ce bug ne se déclenche que si les conditions requises pour le sort sont satisfaites.
Un simple espace dans le champs permet d'afficher le texte voulu. _________________
Dernière édition par Tirlititi le 02/07/10 19:14; édité 1 fois
Inscrit le: 05 Avr 2010 Messages: 114 Sujets: 8 Spécialité en worldedit: Faire des maps originales; déclencheurs; solutions.
Posté le: 02/06/10 23:09 Sujet du message:
COMPETENCE "EMBARQUER UNITÉ" SUR UN BÂTIMENT
Quand la compétence "transport" des zeppeling gobelins par exemple, est ajoutée à un bâtiment, les unités à qui on ordonne de rentrer dedans ne le feront pas tout de suite, si ils sont plus loin que la portée à laquelle ils peuvent être embarqués directement (sans avoir à se rapprocher du "transporteur", donc le bâtiment dans notre cas).
Ça se passe comme si le "bâtiment transporteur" recevait un ordre du style "Vas embarquer cette unité", qui serait immédiatement annulé vu que c'est un bâtiment et que donc il ne bouge pas, et du coup il ne resterait qu'un ordre actif, celui donné aux "futurs transportés" de s'en rapprocher.
Réitérer l'ordre à courte portée fonctionne. Enchaîner les 2 mêmes ordres d'embarquement en maintenant shift enfoncé ( = *shift enfoncé* clic droit+clic droit ), fonctionne aussi. _________________
Inscrit le: 21 Fév 2010 Messages: 1785 Sujets: 22 Spécialité en worldedit: La modestie Médailles: 1 (En savoir plus...)
Posté le: 10/06/10 12:06 Sujet du message:
CHAMPS DE DONNÉES NULS
Certains champs de l'éditeur d'objet ne doivent pas être nuls sous peine de dysfonctionner. La plupart du temps, lorsqu'une valeur nulle est mise à un mauvais champs, la donnée est soit utilisée comme si c'était la valeur maximale possible qui était mise, soit bridée à la valeur minimale possible.
Les champs en question sont (à part les données compétences spécifiques) :
UNITÉS
• Taille collision -> Valeur minimale (8 de rayon/16 de diamètre). Dans le WE, cette valeur minimale n'est pas respectée : on peut donc placer des unités sur la map qui ne seront pas créées au même endroit en jeu.
• Dégats -> Avec 0 dégats, l'unité n'a plus d'attaque. Pour donner une attaque infligeant 0 dégâts, on peut mettre le champs "Dégâts de base" sur -1 et les champs "Dégâts au dé" et "Dégâts par côté du dé" sur 1 chacun.
• Temps de rechargement (attaques) -> couplé avec des points de lancer/retour nuls, le minimum de temps de recharge est de 0.1 secondes (il y a une autre limite très peu utilisée dans les données de base et indisponible en GUI : minCool).
• Portée -> Valeur minimale.
• Vitesse projectile -> Valeur maximale.
• Portée d'acquisition -> Valeur en fonction de la portée de vue de l'unité(?).
• Vitesse de base -> Une unité avec une vitesse nulle ne se déplace pas (normal) mais ne se tourne pas non plus. On ne peut faire jouer les animations "walk" par déclencheur qu'à ces unités qui n'ont pas de vitesse ou en utilisant la fonction jass "SetUnitAnimationByIndex".
• Taille transportée -> Empêche l'unité de monter dans un transport.
COMPÉTENCES
• Vitesse projectile -> Valeur maximale.
• Durée -> En règle général, les sorts ajoutant un enchantement à la cible utilisent la durée maximale si le champs a pour donnée 0.
• Zone d'effet -> Si la zone est nulle pour un sort de zone, l'image de visée sera invisible ainsi que le curseur.
• Mana -> On peut utiliser un coût en mana négatif.
Secret:
Warcraft 3 admet des valeurs négatives pour les coûts de mana et le mana maximum unité de façon relativement bonne : si un sort coûte 0 mana et que l'unité a -1 mana max et -1 mana initial, le sort sera inlançable. Une valeur positive du mana maximal, par contre, ajuste le mana initial à 0 s'il est négatif dans l'éditeur d'objet. D'autre part, un coût de mana négatif rend du mana (et le coût négatif est affiché dans la description du sort). Enfin, certains sorts comme Défensif n'utilisent pas le coût en mana.
_________________
Dernière édition par Tirlititi le 12/01/12 16:31; édité 5 fois
Inscrit le: 21 Fév 2010 Messages: 1785 Sujets: 22 Spécialité en worldedit: La modestie Médailles: 1 (En savoir plus...)
Posté le: 01/08/10 12:28 Sujet du message:
LES ID (IDENTIFICATEURS)
Le JassNewGenPack ainsi que le format .slk permettent de choisir l'ID que vous voulez attribuer aux objets (unités et compétences en particulier).
Ce choix est utile mais peut provoquer des résultats indésirables si vous n'y faites pas attention.
Premièrement, il faut éviter d'utiliser des caractères spéciaux dans l'ID d'un objet. Il est conseillé de s'en tenir aux lettres (majuscules et minuscules sans accents) et aux chiffres. Pour information, les caractères autorisés sont ceux de l'ASCII, excepté le ' (apostrophe), qui est un meta-caractère dans le script de la carte.
Deuxièmement, il faut éviter de choisir deux fois la même ID ou de choisir une ID déjà utilisée par un objet standard sous peine d'avoir un conflit. Il y a un conflit mineur également lorsque les ID de deux objets ne diffèrent que de la casse (majuscule/minuscule), il faut donc également penser à ça. Il peut y avoir conflit entre deux objets de natures différentes (unité et compétence, par exemple) mais la première lettre de chaque ID indique généralement de quelle nature est l'objet (même s'il n'est pas obligatoire de respecter cette convention).
Troisièmement, pour les unités, la première lettre de l'ID est importante : s'il s'agit d'une minuscule, l'unité est normale, s'il s'agit d'une majuscule, l'unité est un héros. Cela permet de créer un héros à partir d'une unité de base facilement, mais il faut y faire attention. _________________
Dernière édition par Tirlititi le 06/08/10 15:23; édité 3 fois
Inscrit le: 21 Fév 2010 Messages: 1785 Sujets: 22 Spécialité en worldedit: La modestie Médailles: 1 (En savoir plus...)
Posté le: 01/08/10 12:47 Sujet du message:
LEAKS D'OBJET
Un objet possédant l'option "Utiliser automatiquement une fois acquis" n'est pas totalement supprimé lors de son utilisation. Il laisse en effet un petit point lumineux (l'objet en modèle réduit) et son ID n'est pas recyclé, causant un leak d'handle.
De la même façon, les objets qui sont détruits lorsqu'on les attaque ne sont pas recyclés. Vous aurez besoin du JNGP pour utiliser l'une des librairies qui règlent ce problème (la seconde est plus performante et nécessite TimerUtils) :
Secret:
Jass:
library ClearItems initializer init
/*
This librairy fix the leak and the lag caused by non-removed items. This includes powerups and items that are destroyed by killing them (by attacking them or setting their life to less than 0.405).
The dead items are periodically destroyed. You can fix the period by changing the constant CLEANINGPERIOD. Note that items' death animation need a few time to be played so I added a DEATH_TIME delay which let the execution of the animation.
If you don't know exactly what you are doing, you shouldn't change the life of a dead item : the items are no more usable after their first death but you can still change their life and if you put their life to more than 0.405, they won't be cleaned by this librairy. You should also remove items manually if you kill them when they are carried.
*/
globals
private hashtable ItemHash
private rect WorldBounds
private filterfunc CleanItemCode
// Period of the cleanup call.
private constant real CLEANINGPERIOD = 15.
// Time for the item's death animation, optimized for tomes and runes.
// If you set it to 0, the hashtable won't be used and it won't create timers
// but the death animation could be not shown.
private constant real DEATH_TIME = 1.5
endglobals
private function DeleteItem takes nothing returns nothing
local timer tim = GetExpiredTimer()
local item it = LoadItemHandle(ItemHash,GetHandleId(tim),0)
// Set the item's life to more than 0.405 in order to properly destroy it.
call SetWidgetLife(it,1)
call RemoveItem(it)
call FlushChildHashtable(ItemHash,GetHandleId(tim))
call DestroyTimer(tim)
set tim = null
set it = null
endfunction
private function CleanItem takes nothing returns boolean
local timer tim
if (GetWidgetLife(GetFilterItem())<0.405) then
if (DEATH_TIME>0) then
set tim = CreateTimer()
call SaveItemHandle(ItemHash,GetHandleId(tim),0,GetFilterItem())
call TimerStart(tim,DEATH_TIME,false,function DeleteItem)
set tim = null
else
// Set the item's life to more than 0.405 in order to properly destroy it.
call SetWidgetLife(GetFilterItem(),1)
call RemoveItem(GetFilterItem())
endif
endif
return false
endfunction
private function CleanupDeadItems takes nothing returns nothing
call EnumItemsInRect(WorldBounds,CleanItemCode,null)
endfunction
private function init takes nothing returns nothing
set WorldBounds = GetWorldBounds()
set CleanItemCode = Filter(function CleanItem)
call TimerStart(CreateTimer(),CLEANINGPERIOD,true,function CleanupDeadItems)
if (DEATH_TIME>0) then
set ItemHash = InitHashtable()
endif
endfunction
/*
This library fixes the leak and the lag caused by unremoved items,
including powerups and manually-destroyed items.
The dead items are periodically removed. You can adjust the period by changing
the constant CLEANING_PERIOD. Note that items' death animations need some time
to play so adjust the DEATH_TIME delay accordingly.
If you don't know exactly what you are doing, you shouldn't change the life
of a dead item; the items are no longer usable after their death but
you can still change their life. If you set their life to more than 0.405,
they won't be properly cleaned. You should also remove items manually
if you kill them when they are carried by a unit.
*/
globals
// Interval between item-cleanups.
private constant real CLEANING_PERIOD = 15.0
// Time for the item's death animation; optimized for tomes and runes.
private constant real DEATH_TIME = 1.5
endglobals
private struct object
item Item
endstruct
globals
private object obj
private timer tim
endglobals
private function DeleteItem takes nothing returns nothing
set tim = GetExpiredTimer()
set obj = GetTimerData(tim)
call ReleaseTimer(tim)
call SetWidgetLife(obj.Item, 1.0)
call RemoveItem(obj.Item)
set obj.Item = null
call obj.destroy()
endfunction
private function CleanItems takes nothing returns boolean
if (GetWidgetLife(GetFilterItem()) < 0.405) then
set tim = NewTimer()
set obj = object.create()
set obj.Item = GetFilterItem()
call SetTimerData(tim, integer(obj))
call TimerStart(tim, DEATH_TIME, false, function DeleteItem)
endif
return false
endfunction
private function init takes nothing returns nothing
call TimerStart(CreateTimer(), CLEANING_PERIOD, true, function SweepItems)
set WorldBounds = GetWorldBounds()
set Detect = Filter(function CleanItems)
endfunction
endlibrary
Si vous n'avez pas le JNGP, vous pouvez toujours utiliser une version jass, à placer dans un déclencheur nommé "ClearPowerups", mais qui ne résout pas tous les problèmes de leak :
Secret:
Jass:
function ClearPowerupsPickup takes nothing returns nothing
local item it = GetManipulatedItem()
call TriggerSleepAction(0.0)
if (GetWidgetLife(it)<0.405) then
call SetWidgetLife(it,1)
call RemoveItem(it)
endif
set it=null
endfunction
function InitTrig_ClearPowerups takes nothing returns nothing
set gg_trg_ClearPowerups = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_ClearPowerups, EVENT_PLAYER_UNIT_PICKUP_ITEM)
call TriggerAddAction(gg_trg_ClearPowerups, function ClearPowerupsPickup)
endfunction
_________________
Dernière édition par Tirlititi le 05/11/10 22:27; édité 4 fois
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/10 18:46 Sujet du message:
LES COMPÉTENCES DES OBJETS
Plusieurs compétences pouvant être données à un objet, il y a des problèmes de coolown ou de coût de mana qui peuvent apparaître :
• D'après ce que je sais, le champs "Stats - Compétence objet" n'a aucune importance en jeu, seulement dans l'éditeur.
• Les conditions des compétences (améliorations requises, par exemple) ne sont pas utilisées lorsque la compétence est donnée à un objet.
• Si un objet possède plusieurs compétences basées sur "Livre de sorts", les sorts de tous ces livres seront disponibles même si l'ID d'ordre est différent pour chaque compétences.
• Le coût de mana affiché dans la description de l'objet est celui de la compétence positionnée en premier dans la liste des compétences de l'objet (si un objet possède une compétence passive en premier et une compétence active en second, le coût de mana ne sera donc pas affiché). C'est valable également pour les objets ne possédant pas l'option "Utiliser activement". Cependant, si l'objet possède le champs "Peut être vendu aux marchands" sur false, ni le prix de vente ni le coût en mana ne seront jamais affichés.
• De même, le cooldown ne sera affiché proprement que si la première compétence de la liste n'est pas un passif. Dans tous les cas, utiliser l'objet démarre le cooldown de la compétence lancée pour tous les objets qui ont le même champs "Rechargement groupe" que l'objet utilisé.
• Dans le cas où plusieurs compétences actives sont données à un même objet, le type de cible (instantané, cible unité, sort de zone, etc...) dépend de la première compétence active. Le mana utilisé et l'effet du sort dépendent aussi de la première compétence si elle est sans cible et de la dernière compétence active de la liste si la première compétence demande une cible (c'est également le sort qui est considéré comme lancé et c'est son cooldown qui sera prit en compte). Si le sort ne peut finalement pas se lancer - parce que le lanceur n'a pas assez de mana ou parce que le type de cible n'est pas bon -, le jeu teste si la compétence suivante/précédente est lançable et ainsi de suite en parcourant la liste de haut en bas pour les sorts sans cible et de bas en haut pour les sorts ciblés. Si aucun sort n'est lançable, l'ordre est annulé.
• Quel que soit le nombre de compétence active que l'objet possède ou le coût en mana affiché sur l'objet, si le porteur possède suffisamment de mana pour lancer l'un des sorts de l'objet, il pourra essayer d'utiliser l'objet. Si la première compétence demande une cible, mais que tous les sorts pour lesquels le lanceur possède suffisamment de mana ont un type de cible différent, le message "Mana insuffisant" sera affiché lorsque le joueur essaiera de valider la cible.
En gros : avant la validation de la cible, c'est la première compétence de la liste qui est prise en compte ; après la validation de la cible (et jusqu'à la fin du cooldown), c'est la dernière compétence de la liste qui est prise en compte. Les sorts sans cibles zappent la validation de la cible donc c'est le premier sort qui compte du début à la fin.
En effet, ajuster le nombre de charges d'un objet sur 0 ne supprime pas l'objet et ne lui retire pas ses capacités actives. Ainsi, on peut rendre les objets chargés permanents.
Inversement, on peut définir des charges sur un objet permanent. Dans tous les cas, lors de l'utilisation de la dernière charge :
• Si l'option "Périssable" est activée, l'objet est détruit,
• Sinon, ses compétences actives sont désactivées jusqu'à ce qu'un déclencheur lui rende 0 charge ou plus. _________________
Dernière édition par Tirlititi le 22/05/11 14:23; édité 2 fois
Inscrit le: 21 Fév 2010 Messages: 1785 Sujets: 22 Spécialité en worldedit: La modestie Médailles: 1 (En savoir plus...)
Posté le: 22/12/10 14:01 Sujet du message:
IMPOSSIBLE D'EXPLOSER
Si une unité possède l'option "Ne peut réanimer" dans le champs "Combat - Type de mort" de l'éditeur d'objet, elle ne pourra jamais exploser.
C'est valable tant pour l'action "Explode unit" que pour l'explosion par des sorts comme 'Doigt de la mort". _________________
Inscrit le: 21 Fév 2010 Messages: 1785 Sujets: 22 Spécialité en worldedit: La modestie Médailles: 1 (En savoir plus...)
Posté le: 22/05/11 14:15 Sujet du message:
LES BUFFS
Tout comme les compétences, une partie des données des enchantements est codée en dur dans Game.dll. Cependant, cette partie est bien moins importante que pour les compétences : la plupart des données d'un buff sont associée à la compétence qui donne ce buff (Note : certains buffs peuvent même se satisfaire des données qui sont dans les fichiers .txt et être absent des fichiers .slk).
Par exemple, si l'on associe le buff "Frénésie impie" à la compétence "Lenteur", l'icône et les textes d'aides affichés seront ceux du buff "Frénésie impie" mais l'unité sera ralentie et non boostée.
Après avoir lancé "Lenteur", le buff possédé par l'unité est lié à l'effet "être ralenti" : on peut donc, par déclencheur, utiliser l'action "Unité - Remove Frénésie impie from [Unit]" pour retirer le buff et l'effet "être ralenti".
À cause de la façon dont ça fonctionne, il se passe des bugs si deux compétences différentes partagent le même buff. Ces bugs ont l'air spécifiques aux compétences utilisées (je n'ai pas trouvé de principe général qui permettrait de les expliquer). Par exemple, si une unité sur laquelle on a lancé le sort "Lenteur" s'approche d'une unité qui a la compétence "Aura d'illumination" et que ces deux compétences ont le même buff, l'effet de "Lenteur" devient permanent.
De la même façon (mais qui peut se produire même si toutes les compétences ont un buff différent), certaines compétences sont transmissibles aux illusions mais sans que l'effet ne soit efficace. Par exemple, la compétence "Assommoir", lorsqu'elle est déclenchée par des illusions, n'assomme pas la cible mais lui donne quand même le buff.
Si un héros déclenche la compétence "Assommoir" sur une unité après une illusion, il rallongera l'effet associé au buff que l'illusion lui avait donné (c'est-à-dire rien) et l'unité ne sera pas assommée.
Inversement, une illusion peut rallonger la durée du stun qui aura été placé par un héros.
Les mêmes exemples sous forme de map : Télécharger la map _________________
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