Et pour toi le visuel c'est beaucoup d'effets speciaux ou juste que ca soit beau a voir ? Pck perso des fois je trouve que certains créateur de sorts mettent un peu trop d'effet et que le sort devient surchargé... _________________
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: 05/11/11 22:40 Sujet du message:
Beau à voir. Car spam des effets spéciaux peut créer du lag et être gênant. Du moins, beaucoup d'effets spéciaux peuvent rendre ça beau à voir, si ils sont bien choisis.
Donc, pour moi il faut en mettre, sans en abuser. (ou alors mettre des effets supplémentaires en optionnel)
Sinon, j'ai fait une nouvelle version de ma charge avec des effets et un déplacement plus fluide. Et en plus fait en sorte que la map de test supporte des test multijoueurs. _________________
Inscrit le: 14 Avr 2011 Messages: 1846 Sujets: 119 Spécialité en worldedit: fonctions paramétriques, équation de mouvement.
Posté le: 06/11/11 01:36 Sujet du message:
euh ce qui peut faire lagger est une trop grosse quantité d'exécution dans une courte période (exemple type : boucle à plus d'un certain nombre d'exécution, ba ça lag et peu même crasher si abus)
les effets ne sont qu'un bonus de l'importance du lag, car en plus de la mémoire vive, la carte graphique aussi ne suit plus (reprenez moi si j'me trompe, chuis pas sur)
enfin bon, rassure toi ash, perso j'ai fait de grosses boucles avec beaucoup d'effet et aucun unleak, j'ai aucun problème de lag.
Comme votre sort va probablement être utilisé qu'une fois, juste pour voir comment c'est beau (ouwaaa) il est impossible que le leak occasionné soit suffisamment important pour être génant. En gros, ne vous faites pas <grossièreté> à unleak :p
(si c'est génant, c'est soit que s't'un cas à part d'un sort qui dure longtemps, ou soit qu'en même temps on a un gros lag car trop d'exécution en très peu de temps, donc encore une fois à changer tout ça ^^)
bref, j'vais bientôt poster mon déclos.
édit : j'viens de lire le barème, assez sympa mais j'trouve quand même un point de celui-ci useless :
en ce qui concerne le leak, imaginons un sort normal utilisé dans une partie qui dure 3h :
on va dire qu'il est utilisé en moyenne 4 fois par minutes, c'est à dire 180 en 3h.
on va dire 8 joueurs, et pas de leaver, toujours la même régularité dans l'utilisation du sort.
on va dire aller, 50 qui leakent dans ce sort (quand je dis point, ça représente toute forme de leak en faite, nos fatiguons pas), ça fait beaucoup pour 1 sort ! mais s't'un gros sort, un peu comme le miens.
on a 180*50*8 points qui leakent, c'est à dire 7200 points qui leakent.
je crois qu'on m'avait dit 8 octets pour un point ? ça je sais plus trop, mais imaginons ça :
8 * 7200 = 57600 octets = 57,6 ko (recompter on sait jamais j'ai fait tout les calculs de tête x))
notre mémoire vive aujourd'hui fait en moyenne 2Go c'est à dire 2 000 000 ko. le rapport entre les deux est de 10^4 !!!
euhhhh.... hm hm... j'ai envie de dire que c'est... négligeable...
arrêtez de vouloir tout unleaker comme ça, parfois c'est véritablement useless et perte de temps... _________________
Inscrit le: 21 Fév 2010 Messages: 1785 Sujets: 22 Spécialité en worldedit: La modestie Médailles: 1 (En savoir plus...)
Posté le: 06/11/11 12:11 Sujet du message:
Heu, full.
On exagère peut-être parfois sur le leak, mais si on en parle autant, c'est que ça a un minimum d'importance quand même.
Les 2 Go de ta mémoire vive sont loin d'être monopolisées par Warcraft, de une.
La quantité de leak générée dans une boucle va très facilement au-dessus des 50, de deux (le reste de tes chiffre est un peu exagéré mais c'est sans doute intentionnel).
Et puis tous les objets ne génèrent pas le même leak. Je ne me souviens plus des chiffres, mais je les avais vu pour comparer les leaks des points, des effets spéciaux et des groupes d'unité : les effets spéciaux sont bien plus gourmands que ce qu'on pourrait attendre (les points font sans doute 8o, comme tu l'as dit, et les groupes d'unités sont plus gros lorsqu'ils contiennent plus d'unités)...
Après, il y a les "leaks d'handle", qui se produisent lorsque l'objet est détruit mais que les variables locales ne sont pas nullifiées. Là c'est le même leak pour tous les types (avec peut-être une exception pour les triggers parce qu'il y a aussi les actions/conditions/events).
Bref, sans doute que le leak ne sera pas important dans les maps de test, mais si quelqu'un veut pouvoir copier les sorts dans une vraie map, il faut les éviter un minimum.
Pour revenir au sujet, j'ai toujours aimé les sorts sobres et avec peu d'effets spéciaux délirants, mais il faut reconnaitre que ça ouvre à plus d'originalité.
C'est le forum qui juge et on est tous capable d'apprécier un sort sans que ça explose de tous les côtés. _________________
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/11/11 17:38 Sujet du message:
J'ai fini (entre parenthèses) mon second sort, il me suffit plus qu'à enlever quelques leaks d'handle oubliés ^^
Je sais pas en fait si je pourrais faire quelques sorts pck je suis occupé en ce moment et quand j'ai rien a faire je me co un peu sur Bnet. _________________
Inscrit le: 21 Fév 2010 Messages: 1785 Sujets: 22 Spécialité en worldedit: La modestie Médailles: 1 (En savoir plus...)
Posté le: 12/11/11 12:07 Sujet du message:
Ice Temple par Tirlititi[vJASS/MUI]
Secret:
Description du sort : Invoque un Temple de Glace qui gèle les unités ennemies devant le héros et leur inflige des dommages. À la fin du sort, le héros relâche une nova de glace qui détruit le temple tout en infligeant d'autres dégâts. Les unités affectées restent ralenties pendant quelques secondes. La zone d'effet augmente avec les niveaux. |n|n|cffffcc00niveau 1|r - 20 dommages par secondes pendant 1.5 seconde maximum et 80 dommages finaux. |n|cffffcc00niveau 2|r - 25 dommages par secondes pendant 2.5 secondes maximum et 120 dommages finaux.|n|cffffcc00niveau 3|r - 30 dommages par secondes pendant 3 secondes maximum et 180 dommages finaux.
Infos supp : Le lanceur est invulnérable et incontrôlable pendant toute la durée du sort.
Le sort prend en compte le dénivelé du terrain et possède une hauteur maximale au-dessus de laquelle les unités ne sont pas affectées (certaines unités volantes, par exemple).
À la fin du sort, le lanceur se retrouve au milieu du temple et des ennemis touchés.
Script :
Secret:
Jass:
scope IceTemple initializer Init
// This spell assume that the spell "Raven form" ('Amrf') and the destructable "Large pathing blocker both" ('YTfc')
// are not modified too much.
// It may be asynchronous as far as GetLocationZ is. However, a slight difference will unlikely trigger a real problem.
globals
private constant integer SPELL_ID = 'A000' // The castable spell
private constant integer NOVA_ID = 'A001' // A Frost Nova for dummy, dealing the ending damages ; it should have as many levels as the main spell
private constant integer DUMMY_TEMPLE_ID = 'n000' // The Id of the Temple dummy
private constant integer DUMMY_ID = 'n001' // A dummy Id for casting Frost Novas
private constant integer DUMMY_DROP_ID = 'n002' // The Id of the Drop dummy
private constant real TIMEOUT = 0.04
private constant real MAXHEIGHT = 175 // The height doesn't depend on the model's scale
private constant real MODELSCALEFACTOR = 1.18 // ModelScale = SpellRadius * MODELSCALEFACTOR / 450
private constant real NOVARADIUSFACTOR = 1.3 // NovaRadius = SpellRadius * NOVARADIUSFACTOR
private location LOCZ = Location ( 0, 0 )
private hashtable THEHASH
sound SubmergeSound
private real array FrozenDamages // Over-time damages when frozen
private real array ExtraDuration // Time spent to freeze units
private real array FreezeTimeout // Delay between 2 freezing
private real array SpellRadius // Freeze radius ; the spell looks bad if this value is too far from 380
endglobals
function GetPointZ takes real x, real y returns real
call MoveLocation(LOCZ,x,y)
return GetLocationZ(LOCZ)
endfunction
function RemoveUnitAfterWaitCallback takes nothing returns nothing
local timer t=GetExpiredTimer()
call RemoveUnit(LoadUnitHandle(THEHASH,GetHandleId(t),0))
call FlushChildHashtable(THEHASH,GetHandleId(t))
call DestroyTimer(t)
set t=null
endfunction
function RemoveUnitAfterWait takes unit whichUnit, real wait returns nothing
local timer t=CreateTimer()
call SaveUnitHandle(THEHASH,GetHandleId(t),0,whichUnit)
call TimerStart(t,wait,false,function RemoveUnitAfterWaitCallback)
set t=null
endfunction
private function PauseUnitSafeCallback takes nothing returns nothing
local timer t=GetExpiredTimer()
local unit u=LoadUnitHandle(THEHASH,GetHandleId(t),0)
call PauseUnit(u,true)
call SetUnitX(u,LoadReal(THEHASH,GetHandleId(t),1))
call SetUnitY(u,LoadReal(THEHASH,GetHandleId(t),2))
call SetUnitAnimation(u,"stand victory")
call QueueUnitAnimation(u,"stand victory")
call FlushChildHashtable(THEHASH,GetHandleId(t))
call DestroyTimer(t)
set t=null
set u=null
endfunction
private function PauseUnitSafe takes unit whichUnit returns nothing
local timer t=CreateTimer()
call SaveUnitHandle(THEHASH,GetHandleId(t),0,whichUnit)
call SaveReal(THEHASH,GetHandleId(t),1,GetUnitX(whichUnit))
call SaveReal(THEHASH,GetHandleId(t),2,GetUnitY(whichUnit))
call TimerStart(t,0,false,function PauseUnitSafeCallback)
set t=null
endfunction
private function TrapFilter takes nothing returns boolean
local unit u=GetFilterUnit()
local boolean b=IsUnitEnemy(bj_lastCreatedUnit,GetOwningPlayer(u)) /*
*/ and GetUnitState(u,UNIT_STATE_LIFE)>0.405 /*
*/ and GetPointZ(GetUnitX(u),GetUnitY(u))+GetUnitFlyHeight(u)<=bj_lastTransmissionDuration /*
*/ and not(IsUnitInGroup(u,bj_lastCreatedGroup)) /*
*/ and not(IsUnitType(u,UNIT_TYPE_STRUCTURE)) /*
*/ and not(IsUnitType(u,UNIT_TYPE_MAGIC_IMMUNE))
set u=null
return b
endfunction
private function FinalDamagesFilter takes nothing returns boolean
local unit u=GetFilterUnit()
local boolean b=IsUnitEnemy(bj_lastCreatedUnit,GetOwningPlayer(u)) /*
*/ and GetUnitState(u,UNIT_STATE_LIFE)>0.405 /*
*/ and GetPointZ(GetUnitX(u),GetUnitY(u))+GetUnitFlyHeight(u)<=bj_lastTransmissionDuration /*
*/ and not(IsUnitInGroup(u,bj_randomSubGroupGroup)) /*
*/ and not(IsUnitType(u,UNIT_TYPE_STRUCTURE)) /*
*/ and not(IsUnitType(u,UNIT_TYPE_MAGIC_IMMUNE))
set u=null
return b
endfunction
private function ClearMainDatas takes timer t returns nothing
local integer Id=GetHandleId(t)
call RemoveUnitAfterWait(LoadUnitHandle(THEHASH,Id,2),2)
call DestroyGroup(LoadGroupHandle(THEHASH,Id,5))
call DestroyGroup(LoadGroupHandle(THEHASH,Id,6))
call RemoveDestructable(LoadDestructableHandle(THEHASH,Id,10))
call RemoveDestructable(LoadDestructableHandle(THEHASH,Id,11))
call RemoveDestructable(LoadDestructableHandle(THEHASH,Id,12))
call RemoveDestructable(LoadDestructableHandle(THEHASH,Id,13))
call FlushChildHashtable(THEHASH,Id)
call DestroyTimer(t)
endfunction
private function FinalDamagesEnum takes nothing returns nothing
local unit target=GetEnumUnit()
local unit dummy=CreateUnit(GetOwningPlayer(LoadUnitHandle(THEHASH,GetHandleId(GetExpiredTimer()),0)),DUMMY_ID,GetUnitX(target),GetUnitY(target),0)
local timer t
if (IsUnitInGroup(target,bj_lastCreatedGroup)) then
set t=LoadTimerHandle(THEHASH,GetHandleId(GetExpiredTimer()),GetHandleId(target))
call PauseUnit(target,false)
call SetUnitTimeScale(target,1)
call GroupRemoveUnit(bj_lastCreatedGroup,target)
call RemoveUnit(LoadUnitHandle(THEHASH,GetHandleId(t),2))
call DestroyEffect(LoadEffectHandle(THEHASH,GetHandleId(t),4))
call FlushChildHashtable(THEHASH,GetHandleId(t))
call DestroyTimer(t)
set t=null
endif
call UnitAddAbility(dummy,NOVA_ID)
call IssueTargetOrder(dummy,"frostnova",target)
call RemoveUnitAfterWait(dummy,1)
call GroupAddUnit(bj_randomSubGroupGroup,target)
set target=null
set dummy=null
endfunction
private function FinalDamages takes nothing returns nothing
local integer Id=GetHandleId(GetExpiredTimer())
local real timeleft=LoadReal(THEHASH,Id,4)-TIMEOUT
local group g=CreateGroup()
call SaveReal(THEHASH,Id,4,timeleft)
set bj_randomSubGroupGroup=LoadGroupHandle(THEHASH,Id,6)
set bj_lastCreatedGroup=LoadGroupHandle(THEHASH,Id,5)
set bj_lastTransmissionDuration=LoadReal(THEHASH,Id,3)+MAXHEIGHT
set bj_lastCreatedUnit=LoadUnitHandle(THEHASH,Id,0)
call GroupEnumUnitsInRange(g,GetUnitX(LoadUnitHandle(THEHASH,Id,2)),GetUnitY(LoadUnitHandle(THEHASH,Id,2)),(1-timeleft/1.4)*SpellRadius[LoadInteger(THEHASH,Id,1)]*NOVARADIUSFACTOR,Filter(function FinalDamagesFilter))
call ForGroup(g,function FinalDamagesEnum)
call DestroyGroup(g)
set g=null
if (timeleft<=0) then
call ForGroup(bj_lastCreatedGroup,function FinalDamagesEnum)
call ClearMainDatas(GetExpiredTimer())
endif
endfunction
private function FinalMove takes nothing returns nothing
local integer Id=GetHandleId(GetExpiredTimer())
local unit caster=LoadUnitHandle(THEHASH,Id,0)
local real x=GetUnitX(caster)
local real y=GetUnitY(caster)
local real facing=GetUnitFacing(caster)
local real speedfactor=SpellRadius[LoadInteger(THEHASH,Id,1)]*MODELSCALEFACTOR/450
local real timeleft=LoadReal(THEHASH,Id,4)-TIMEOUT
call SaveReal(THEHASH,Id,4,timeleft)
if (timeleft>=0.78) then
if (timeleft>=2) then
call SaveReal(THEHASH,Id,4,1.04)
call TimerStart(GetExpiredTimer(),TIMEOUT,true,function FinalMove)
return
endif
call SetUnitX(caster,x+770*speedfactor*TIMEOUT*CosBJ(facing))
call SetUnitY(caster,y+770*speedfactor*TIMEOUT*SinBJ(facing))
call SetUnitFlyHeight(caster,280+LoadReal(THEHASH,Id,3)-GetPointZ(x,y)+(1.04-timeleft)*231*speedfactor,0)
elseif (timeleft>=0.52) then
call SetUnitTimeScale(caster,1)
call SetUnitX(caster,x+461*speedfactor*TIMEOUT*CosBJ(facing))
call SetUnitY(caster,y+461*speedfactor*TIMEOUT*SinBJ(facing))
call SetUnitFlyHeight(caster,280+LoadReal(THEHASH,Id,3)-GetPointZ(x,y)+(240-timeleft*231)*speedfactor,0)
elseif (timeleft>=0.26) then
call SetUnitX(caster,x+309*speedfactor*TIMEOUT*CosBJ(facing))
call SetUnitY(caster,y+309*speedfactor*TIMEOUT*SinBJ(facing))
call SetUnitFlyHeight(caster,280+LoadReal(THEHASH,Id,3)-GetPointZ(x,y)+(timeleft*77+80)*speedfactor,0)
elseif (timeleft>=0) then
call SetUnitX(caster,x+193*speedfactor*TIMEOUT*CosBJ(facing))
call SetUnitY(caster,y+193*speedfactor*TIMEOUT*SinBJ(facing))
call SetUnitFlyHeight(caster,280+LoadReal(THEHASH,Id,3)-GetPointZ(x,y)+(timeleft*461-20)*speedfactor,0)
elseif (timeleft>-0.4) then
call SetUnitFlyHeight(caster,280+LoadReal(THEHASH,Id,3)-GetPointZ(x,y)+timeleft*650,0)
else
call SetUnitFlyHeight(caster,0,0)
call PauseUnit(caster,false)
call SetUnitInvulnerable(caster,false)
call SetUnitPosition(caster,x,y)
call SaveReal(THEHASH,Id,4,1.4)
call SaveGroupHandle(THEHASH,Id,6,CreateGroup())
call TimerStart(GetExpiredTimer(),TIMEOUT,true,function FinalDamages)
endif
set caster=null
endfunction
private function StartFinal takes nothing returns nothing
local integer Id=GetHandleId(GetExpiredTimer())
local unit caster=LoadUnitHandle(THEHASH,Id,0)
call SetUnitAnimation(caster,"attack")
call QueueUnitAnimation(caster,"stand")
call SetUnitTimeScale(caster,0.5)
call SetUnitAnimation(LoadUnitHandle(THEHASH,Id,2),"death")
call FlushChildHashtable(THEHASH,GetHandleId(LoadTimerHandle(THEHASH,Id,6)))
call DestroyTimer(LoadTimerHandle(THEHASH,Id,6))
call SaveReal(THEHASH,Id,4,3)
call TimerStart(GetExpiredTimer(),1.26,false,function FinalMove)
endfunction
private function TrapUnitLoop takes nothing returns nothing
local integer Id=GetHandleId(GetExpiredTimer())
local integer Idm=LoadInteger(THEHASH,Id,0)
local unit target=LoadUnitHandle(THEHASH,Id,1)
local real x
local real y
if (LoadBoolean(THEHASH,Id,3)) then
set x=GetUnitX(LoadUnitHandle(THEHASH,Id,2))-GetUnitX(target)
set y=GetUnitY(LoadUnitHandle(THEHASH,Id,2))-GetUnitY(target)
if (x*x+y*y<=90000) then
call SaveBoolean(THEHASH,Id,3,false)
call PauseUnit(target,true)
call SetUnitTimeScale(target,0)
call TimerStart(GetExpiredTimer(),TIMEOUT,true,function TrapUnitLoop)
else
call DestroyEffect(LoadEffectHandle(THEHASH,Id,4))
call RemoveUnit(LoadUnitHandle(THEHASH,Id,2))
call GroupRemoveUnit(LoadGroupHandle(THEHASH,Idm,5),target)
call FlushChildHashtable(THEHASH,Id)
call DestroyTimer(GetExpiredTimer())
endif
elseif (GetUnitState(target,UNIT_STATE_LIFE)>FrozenDamages[LoadInteger(THEHASH,Idm,1)]*2) then
call UnitDamageTarget(LoadUnitHandle(THEHASH,Idm,0),target,FrozenDamages[LoadInteger(THEHASH,Idm,1)],true,false,ATTACK_TYPE_MAGIC,DAMAGE_TYPE_UNIVERSAL,WEAPON_TYPE_WHOKNOWS)
endif
set target=null
endfunction
private function TrapUnit takes nothing returns nothing
local integer Id=LoadInteger(THEHASH,GetHandleId(GetExpiredTimer()),0)
local group g=CreateGroup()
local unit target
local real x
local real y
local unit drop
local timer t
set bj_lastCreatedGroup=LoadGroupHandle(THEHASH,Id,5)
set bj_lastTransmissionDuration=LoadReal(THEHASH,Id,3)+MAXHEIGHT
set bj_lastCreatedUnit=LoadUnitHandle(THEHASH,Id,0)
call GroupEnumUnitsInRange(g,GetUnitX(LoadUnitHandle(THEHASH,Id,2)),GetUnitY(LoadUnitHandle(THEHASH,Id,2)),SpellRadius[LoadInteger(THEHASH,Id,1)],Filter(function TrapFilter))
set target=FirstOfGroup(g)
if (target!=null) then
set x=GetUnitX(target)
set y=GetUnitY(target)
call GroupAddUnit(bj_lastCreatedGroup,target)
call SetSoundPosition(SubmergeSound,x,y,200)
call StartSound(SubmergeSound)
set drop=CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE),DUMMY_DROP_ID,x,y,0)
call UnitAddAbility(drop,'Amrf')
call UnitRemoveAbility(drop,'Amrf')
call SetUnitX(drop,x)
call SetUnitY(drop,y)
call SetUnitFlyHeight(drop,bj_lastTransmissionDuration-MAXHEIGHT-GetPointZ(x,y),0)
call SetUnitAnimation(drop,"death")
set t=CreateTimer()
call SaveInteger(THEHASH,GetHandleId(t),0,Id)
call SaveUnitHandle(THEHASH,GetHandleId(t),1,target)
call SaveUnitHandle(THEHASH,GetHandleId(t),2,drop)
call SaveBoolean(THEHASH,GetHandleId(t),3,true)
call SaveTimerHandle(THEHASH,Id,GetHandleId(target),t)
call TimerStart(t,0.4,false,function TrapUnit2)
set t=null
set drop=null
set target=null
endif
call DestroyGroup(g)
set g=null
endfunction
private function StartFreezing takes nothing returns nothing
local timer t=CreateTimer()
local integer Id=GetHandleId(GetExpiredTimer())
local integer level=LoadInteger(THEHASH,Id,1)
call SaveGroupHandle(THEHASH,Id,5,CreateGroup())
call SaveTimerHandle(THEHASH,Id,6,t)
call SaveInteger(THEHASH,GetHandleId(t),0,Id)
call TimerStart(t,FreezeTimeout[level],true,function TrapUnit)
call TimerStart(GetExpiredTimer(),ExtraDuration[level],false,function StartFinal)
set t=null
endfunction
private function MoveHeroTop takes nothing returns nothing
local integer Id=GetHandleId(GetExpiredTimer())
local unit caster=LoadUnitHandle(THEHASH,Id,0)
local real factor=SpellRadius[LoadInteger(THEHASH,Id,1)]*MODELSCALEFACTOR/450
local real timeleft=LoadReal(THEHASH,Id,4)-TIMEOUT
call SetUnitFlyHeight(caster,RMaxBJ(0,280+LoadReal(THEHASH,Id,3)-GetPointZ(GetUnitX(caster),GetUnitY(caster))-timeleft*200*factor),0)
if (timeleft>0) then
call SaveReal(THEHASH,Id,4,timeleft)
else
call SetUnitAnimation(caster,"spell")
call QueueUnitAnimation(caster,"spell")
call QueueUnitAnimation(caster,"spell")
call TimerStart(GetExpiredTimer(),1.8,false,function StartFreezing)
endif
set caster=null
endfunction
private function CreateTemple takes unit caster, integer level returns nothing
local timer t=CreateTimer()
local integer Id=GetHandleId(t)
local real angle=GetUnitFacing(caster)
local real ux=GetUnitX(caster)
local real uy=GetUnitY(caster)
local real radius=SpellRadius[level]*MODELSCALEFACTOR
local real x=ux+radius*CosBJ(angle)
local real y=uy+radius*SinBJ(angle)
local unit temple=CreateUnit(GetOwningPlayer(caster),DUMMY_TEMPLE_ID,x,y,angle+180)
call UnitAddAbility(temple,'Amrf')
call UnitRemoveAbility(temple,'Amrf')
call SetUnitX(temple,x)
call SetUnitY(temple,y)
call SetUnitFlyHeight(temple,260,0)
call SetUnitScale(temple,radius/450,1,1)
call SetUnitAnimation(temple,"birth")
call SetUnitInvulnerable(caster,true)
call PauseUnitSafe(caster)
call UnitAddAbility(caster,'Amrf')
call UnitRemoveAbility(caster,'Amrf')
call SaveUnitHandle(THEHASH,Id,0,caster)
call SaveInteger(THEHASH,Id,1,level)
call SaveUnitHandle(THEHASH,Id,2,temple)
call SaveReal(THEHASH,Id,3,GetPointZ(x,y))
call SaveReal(THEHASH,Id,4,2)
call SaveDestructableHandle(THEHASH,Id,10,CreateDestructable('YTfc',ux,uy,0,1,0))
call SaveDestructableHandle(THEHASH,Id,11,CreateDestructable('YTfc',x+radius*CosBJ(angle),y+radius*SinBJ(angle),0,1,0))
call SaveDestructableHandle(THEHASH,Id,12,CreateDestructable('YTfc',x+radius*CosBJ(angle+90),y+radius*SinBJ(angle+90),0,1,0))
call SaveDestructableHandle(THEHASH,Id,13,CreateDestructable('YTfc',x+radius*CosBJ(angle-90),y+radius*SinBJ(angle-90),0,1,0))
call TimerStart(t,TIMEOUT,true,function MoveHeroTop)
set temple=null
set t=null
endfunction
private function CastingFilter takes nothing returns boolean
if GetSpellAbilityId()==SPELL_ID then
call CreateTemple(GetTriggerUnit(),GetUnitAbilityLevel(GetTriggerUnit(),SPELL_ID))
endif
return false
endfunction
// You can use a custom hashtable here instead of creating a new one. The spell doesn't use unit's Ids.
set THEHASH = InitHashtable()
// Set the datas. Final damages and slow are supposed to be in the "NOVA_ID" spell.
set FrozenDamages[1] = TIMEOUT * 20
set ExtraDuration[1] = 1.5
set FreezeTimeout[1] = 0.25
set SpellRadius[1] = 300
set FrozenDamages[2] = TIMEOUT * 25
set ExtraDuration[2] = 2.5
set FreezeTimeout[2] = 0.25
set SpellRadius[2] = 380
set FrozenDamages[3] = TIMEOUT * 30
set ExtraDuration[3] = 3
set FreezeTimeout[3] = 0.25
set SpellRadius[3] = 460
endfunction
Il est pas parfaitement optimisé mais j'avais pas envie de mettre des dépendances... Les modèles importés sont de moi, bien sûr.
EDIT : mis-à-jour au format demandé par Vlad. J'ai aussi un peu modifié le sort de façon à ce qu'on puisse choisir le rayon d'effet, mais le modèle devient moins beau s'il est trop gros ou trop petit. Si vous l'avez déjà testé, c'est pas vraiment la peine de le retester pour ça.
EDIT 2 : Il m'est arrivé de le mettre à jour sur THW. _________________
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: 12/11/11 14:49 Sujet du message:
Choqué à vie
Rien à redire sur l'originalité du sort.
Sur l'esthétique, il y a de légères améliorations possibles, mais sinon c'est épique.
Les tooltips sont bonnes. J'aime pas vraiment l'icône, mais elle correspond assez bien au sort.
Le sort respecte le thème.
Le sort est complexe et mui.
Je verrais bien ce sort comme ulti, et non comme sort normal.
ça mets la barre haute ^^ j'ai 8jours pour faire quelque chose de bien. Et j'ai qu'une chose à dire : Le feu vaincra la glace. _________________
Inscrit le: 12 Nov 2011 Messages: 1062 Sujets: 107 Spécialité en worldedit: Inactif(Enfin presque) Médailles: 1 (En savoir plus...)
Posté le: 12/11/11 21:05 Sujet du message:
Nécropacte par Lord_Demon_XMUI
Secret:
Description du sort:Le héros crée un vortex d'ombres qui convergent vers la cible,lorsqu'elles le touche, elles explosent en un nova d'énergies noires qui inflige 250x niveau du sort sur 300 AoE, ralentit les unités de 10x niveau du sort % et réduit l'armure de la cible de 1+1x niveau du sort
le sort est fait de deux parties: le cast et le loop
Secret:
Cast:
Gui:
Trigger:
Evénements
Unité - Une unité Initie l'effet d'une compétence
Conditions
(Compétence étant utilisée) Egal à Nécropacte
Actions
Définir Shadow_Integer = (Shadow_Integer + 1) Définir Caster[Shadow_Integer] = (Unité utilisant la capacité) Définir Target[Shadow_Integer] = (Unité ciblée par la compétence) Unité - Créer 1 Dummy : Vortex pour le (Propriétaire de (Unité utilisant la capacité)) au point ((Position de Target[Shadow_Integer]) décalé de 500.00 et orienté de 0.00 degrés) ; orientation = Orientation bâtiment par défaut degrés. Définir Shadow_1[Shadow_Integer] = (Dernière unité créée) Unité - Créer 1 Dummy : Vortex pour le (Propriétaire de (Unité utilisant la capacité)) au point ((Position de Target[Shadow_Integer]) décalé de 500.00 et orienté de 72.00 degrés) ; orientation = Orientation bâtiment par défaut degrés. Définir Shadow_2[Shadow_Integer] = (Dernière unité créée) Unité - Créer 1 Dummy : Vortex pour le (Propriétaire de (Unité utilisant la capacité)) au point ((Position de Target[Shadow_Integer]) décalé de 500.00 et orienté de 144.00 degrés) ; orientation = Orientation bâtiment par défaut degrés. Définir Shadow_3[Shadow_Integer] = (Dernière unité créée) Unité - Créer 1 Dummy : Vortex pour le (Propriétaire de (Unité utilisant la capacité)) au point ((Position de Target[Shadow_Integer]) décalé de 500.00 et orienté de 216.00 degrés) ; orientation = Orientation bâtiment par défaut degrés. Définir Shadow_4[Shadow_Integer] = (Dernière unité créée) Unité - Créer 1 Dummy : Vortex pour le (Propriétaire de (Unité utilisant la capacité)) au point ((Position de Target[Shadow_Integer]) décalé de 500.00 et orienté de 288.00 degrés) ; orientation = Orientation bâtiment par défaut degrés. Définir Shadow_5[Shadow_Integer] = (Dernière unité créée) Définir Angle_1[Shadow_Integer] = 0.00 Définir Angle_2[Shadow_Integer] = 72.00 Définir Angle_3[Shadow_Integer] = 144.00 Définir Angle_4[Shadow_Integer] = 216.00 Définir Angle_5[Shadow_Integer] = 288.00 Définir Distance[Shadow_Integer] = 500.00
Loop:
Secret:
Gui:
Trigger:
Evénements
Temps - Toutes les 0.03 secondes de temps de jeu.
Conditions
Actions
Pour chaque Entier A à partir de 1 jusqu'à Shadow_Integer, exécuter les actions de l'onglet Boucle - Actions.
Boucle - Actions
Si (conditions) sont vraies, alors exécuter (Actions) sinon (Actions)
Si - Conditions
Distance[(Entier A)] Supérieur à 0.00
Alors - Actions
Définir Distance[(Entier A)] = (Distance[(Entier A)] - 10.00) Définir Point_1a[(Entier A)] = (Position de Shadow_1[(Entier A)]) Définir Angle_1[(Entier A)] = (Angle_1[(Entier A)] + 2.00) Définir Point_1b[(Entier A)] = ((Position de Target[(Entier A)]) décalé de Distance[(Entier A)] et orienté de Angle_1[(Entier A)] degrés) Unité - Déplacer instantanément Shadow_1[(Entier A)] au point Point_1b[(Entier A)]. Définir Point_2a[(Entier A)] = (Position de Shadow_2[(Entier A)]) Définir Angle_2[(Entier A)] = (Angle_2[(Entier A)] + 2.00) Définir Point_2b[(Entier A)] = ((Position de Target[(Entier A)]) décalé de Distance[(Entier A)] et orienté de Angle_2[(Entier A)] degrés) Unité - Déplacer instantanément Shadow_2[(Entier A)] au point Point_2b[(Entier A)]. Définir Point_3a[(Entier A)] = (Position de Shadow_3[(Entier A)]) Définir Angle_3[(Entier A)] = (Angle_3[(Entier A)] + 2.00) Définir Point_3b[(Entier A)] = ((Position de Target[(Entier A)]) décalé de Distance[(Entier A)] et orienté de Angle_3[(Entier A)] degrés) Unité - Déplacer instantanément Shadow_3[(Entier A)] au point Point_3b[(Entier A)]. Définir Point_4a[(Entier A)] = (Position de Shadow_4[(Entier A)]) Définir Angle_4[(Entier A)] = (Angle_4[(Entier A)] + 2.00) Définir Point_4b[(Entier A)] = ((Position de Target[(Entier A)]) décalé de Distance[(Entier A)] et orienté de Angle_4[(Entier A)] degrés) Unité - Déplacer instantanément Shadow_4[(Entier A)] au point Point_4b[(Entier A)]. Définir Point_5a[(Entier A)] = (Position de Shadow_5[(Entier A)]) Définir Angle_5[(Entier A)] = (Angle_5[(Entier A)] + 2.00) Définir Point_5b[(Entier A)] = ((Position de Target[(Entier A)]) décalé de Distance[(Entier A)] et orienté de Angle_5[(Entier A)] degrés) Unité - Déplacer instantanément Shadow_5[(Entier A)] au point Point_5b[(Entier A)]. Texte personnalisé: call RemoveLocation(udg_Point_1a[GetForLoopIndexA()]) Texte personnalisé: call RemoveLocation(udg_Point_1b[GetForLoopIndexA()]) Texte personnalisé: call RemoveLocation(udg_Point_2a[GetForLoopIndexA()]) Texte personnalisé: call RemoveLocation(udg_Point_2b[GetForLoopIndexA()]) Texte personnalisé: call RemoveLocation(udg_Point_3a[GetForLoopIndexA()]) Texte personnalisé: call RemoveLocation(udg_Point_3b[GetForLoopIndexA()]) Texte personnalisé: call RemoveLocation(udg_Point_4a[GetForLoopIndexA()]) Texte personnalisé: call RemoveLocation(udg_Point_4b[GetForLoopIndexA()]) Texte personnalisé: call RemoveLocation(udg_Point_5a[GetForLoopIndexA()]) Texte personnalisé: call RemoveLocation(udg_Point_5b[GetForLoopIndexA()])
Sinon - Actions
Si (conditions) sont vraies, alors exécuter (Actions) sinon (Actions)
Si - Conditions
Boolean[(Entier A)] Egal à FAUX
Alors - Actions
Texte personnalisé: call RemoveUnit(udg_Shadow_1[GetForLoopIndexA()]) Texte personnalisé: call RemoveUnit(udg_Shadow_2[GetForLoopIndexA()]) Texte personnalisé: call RemoveUnit(udg_Shadow_3[GetForLoopIndexA()]) Texte personnalisé: call RemoveUnit(udg_Shadow_4[GetForLoopIndexA()]) Texte personnalisé: call RemoveUnit(udg_Shadow_5[GetForLoopIndexA()]) Si (conditions) sont vraies, alors exécuter (Actions) sinon (Actions)
Si - Conditions
(Target[(Entier A)] est vivante) Egal à VRAI
Alors - Actions
Unité - Créer 1 Dummy : Caster 1 pour le (Propriétaire de Shadow_1[(Entier A)]) au point (Position de Target[(Entier A)]) ; orientation = Orientation bâtiment par défaut degrés. Unité - Régler le niveau de Effect : Armor pour (Dernière unité créée) à (Niveau de Nécropacte pour Caster[(Entier A)]). Définir Caster_1[(Entier A)] = (Dernière unité créée) Unité - Ordonner à Caster_1[(Entier A)] de/d' Druide-corbeau elfe de la nuit - Lucioles Target[(Entier A)]. Unité - Ajouter un temps de désinvocation de 1.00 secondes et de type Générique pour Caster_1[(Entier A)]. Unité - Créer 1 Dummy : Caster 2 pour le (Propriétaire de Shadow_1[(Entier A)]) au point (Position de Target[(Entier A)]) ; orientation = Orientation bâtiment par défaut degrés. Unité - Régler le niveau de Effect : Speed pour (Dernière unité créée) à 1. Définir Caster_2[(Entier A)] = (Dernière unité créée) Unité - Ordonner à Caster_2[(Entier A)] de/d' Roi de la montagne humain - Coup de tonnerre. Unité - Ajouter un temps de désinvocation de 1.00 secondes et de type Générique pour Caster_2[(Entier A)]. Pour chaque Entier B à partir de1 jusqu'à 16, exécuter les actions de l'onglet Boucle - Actions.
Boucle - Actions
Effet spécial - Créer un effet spécial au point ((Position de Caster_2[(Entier A)]) décalé de 90.00 et orienté de (22.50 x (Réel((Entier B)))) degrés) ; utiliser le fichier modèle suivant : AbilitiesSpellsUndeadDeathCoilDeathCoilSpecialArt.mdl.
Pour chaque entier de C[(Entier A)] de 1 jusqu'à 32, exécuter les actions de l'onglet Boucle - Actions.
Boucle - Actions
Effet spécial - Créer un effet spécial au point ((Position de Caster_2[(Entier A)]) décalé de 180.00 et orienté de (11.25 x (Réel(C[(Entier A)]))) degrés) ; utiliser le fichier modèle suivant : AbilitiesSpellsUndeadDeathCoilDeathCoilSpecialArt.mdl.
Pour chaque entier de D[(Entier A)] de 1 jusqu'à 64, exécuter les actions de l'onglet Boucle - Actions.
Boucle - Actions
Effet spécial - Créer un effet spécial au point ((Position de Caster_2[(Entier A)]) décalé de 270.00 et orienté de (5.63 x (Réel(D[(Entier A)]))) degrés) ; utiliser le fichier modèle suivant : AbilitiesSpellsUndeadDeathCoilDeathCoilSpecialArt.mdl.
Groupe unité - Considérer toutes unités présentes dans (Unites présentes dans le cercle de rayon 300.00, de centre (Position de Caster_2[(Entier A)]) et respectant ((((Unité respectant la condition) est Un bâtiment) Egal à FAUX) et ((((Unité respectant la condition) appartient à un ennemi du (Propriétaire et exécuter l'action : (Unité - Faire que Caster_2[(Entier A)] cause des dommages à (Unités considérées), répartissant (250.00 x (Réel((Niveau de Nécropacte pour Caster[(Entier A)])))) points de dégâts de type Sorts et dommages de type Normal.). Définir Boolean[(Entier A)] = VRAI
Sinon - Actions
Si (conditions) sont vraies, alors exécuter (Actions) sinon (Actions)
Si - Conditions
(Target[(Entier A)] est vivante) Egal à FAUX
Alors - Actions
Unité - Créer 1 Dummy : Caster 2 pour le (Propriétaire de Shadow_1[(Entier A)]) au point (Position de Target[(Entier A)]) ; orientation = Orientation bâtiment par défaut degrés. Unité - Régler le niveau de Effect : Speed pour (Dernière unité créée) à 1. Définir Caster_2[(Entier A)] = (Dernière unité créée) Unité - Ordonner à Caster_2[(Entier A)] de/d' Roi de la montagne humain - Coup de tonnerre. Unité - Ajouter un temps de désinvocation de 1.00 secondes et de type Générique pour Caster_2[(Entier A)]. Pour chaque Entier B à partir de1 jusqu'à 16, exécuter les actions de l'onglet Boucle - Actions.
Boucle - Actions
Effet spécial - Créer un effet spécial au point ((Position de Caster_2[(Entier A)]) décalé de 90.00 et orienté de (22.50 x (Réel((Entier B)))) degrés) ; utiliser le fichier modèle suivant : AbilitiesSpellsUndeadDeathCoilDeathCoilSpecialArt.mdl.
Pour chaque entier de C[(Entier A)] de 1 jusqu'à 32, exécuter les actions de l'onglet Boucle - Actions.
Boucle - Actions
Effet spécial - Créer un effet spécial au point ((Position de Caster_2[(Entier A)]) décalé de 180.00 et orienté de (11.25 x (Réel(C[(Entier A)]))) degrés) ; utiliser le fichier modèle suivant : AbilitiesSpellsUndeadDeathCoilDeathCoilSpecialArt.mdl.
Pour chaque entier de D[(Entier A)] de 1 jusqu'à 64, exécuter les actions de l'onglet Boucle - Actions.
Boucle - Actions
Effet spécial - Créer un effet spécial au point ((Position de Caster_2[(Entier A)]) décalé de 270.00 et orienté de (5.63 x (Réel(D[(Entier A)]))) degrés) ; utiliser le fichier modèle suivant : AbilitiesSpellsUndeadDeathCoilDeathCoilSpecialArt.mdl.
Groupe unité - Considérer toutes unités présentes dans (Unites présentes dans le cercle de rayon 300.00, de centre (Position de Caster_2[(Entier A)]) et respectant ((((Unité respectant la condition) est Un bâtiment) Egal à FAUX) et ((((Unité respectant la condition) appartient à un ennemi du (Propriétaire et exécuter l'action : (Unité - Faire que Caster_2[(Entier A)] cause des dommages à (Unités considérées), répartissant (250.00 x (Réel((Niveau de Nécropacte pour Caster[(Entier A)])))) points de dégâts de type Sorts et dommages de type Normal.). Définir Boolean[(Entier A)] = VRAI
Sinon - Actions
Sinon - Actions
Voici trois screens qui présentent le sort:
Screen 1:
Secret:
désolé pour une raison inconnue je ne peux upload les screens.
Screen 2:
Secret:
désolé pour une raison inconnue je ne peux upload les screens.
Screen 3:
Secret:
désolé pour une raison inconnue je ne peux upload les screens.
Voici l'URL:[url=http://communots.free.fr/upload/Nécropactev0.0113213767.w3x]Télécharger la map]Nécropacte 0.01[/url] _________________
Dernière édition par Ectelion le 15/11/11 18:11; édité 2 fois
Inscrit le: 19 Oct 2011 Messages: 382 Sujets: 32 Spécialité en worldedit: Il faut vraiment que je réponde ?
Posté le: 13/11/11 10:09 Sujet du message: Concour F2J
Boule d'énergie -- Zaaap -- MUI-GUI
Le lancement du sort:
Secret:
Gui:
Trigger:
Evénements
Unité - A unit Initie l'effet d'une compétence
Conditions
(Ability being cast) Egal à Boule d'énergie
Actions
Set INTEGER_MUI = (INTEGER_MUI + 1) Set BOOLEAN_NONAME[INTEGER_MUI] = TRUE Set BOOLEAN_NN[INTEGER_MUI] = TRUE Set LEAK_POINT[1] = (Position of (Casting unit)) Set LEAK_POINT[2] = (Target point of ability being cast) Set UNIT_CASTER[INTEGER_MUI] = (Casting unit) Set REAL_ANGLE_2[INTEGER_MUI] = REAL_ANGLE[INTEGER_MUI] Set REAL_ANGLE[INTEGER_MUI] = (Angle from LEAK_POINT[1] to LEAK_POINT[2]) Unité - Create 1 Boule d'énergie (dummy) for (Owner of UNIT_CASTER[INTEGER_MUI]) at LEAK_POINT[1] facing REAL_ANGLE[INTEGER_MUI] degrees Set UNIT_DUMMY[INTEGER_MUI] = (Last created unit) Set REAL_DISTANCE[INTEGER_MUI] = 1000.00 Set REAL_DAMAGE[INTEGER_MUI] = 100.00 Set REAL_SPEED[INTEGER_MUI] = 25.00 Groupe unité - Add UNIT_DUMMY[INTEGER_MUI] to UNITGROUP_DUMMY
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
For each (Integer INTEGER) from 1 to INTEGER_MUI, do (Actions)
Boucle - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
(UNIT_DUMMY[INTEGER] is alive) Egal à TRUE
Alors - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
And - All (Conditions) are true
Conditions
REAL_DISTANCE[INTEGER] Inférieur ou égal à 250.00 BOOLEAN_NONAME[INTEGER] Egal à TRUE
Alors - Actions
Set REAL_ANGLE_2[INTEGER] = (REAL_ANGLE_2[INTEGER] + 5.00) Set BOOLEAN_NN[INTEGER] = FALSE Set LEAK_POINT[1] = (POINT_TURN[INTEGER] offset by 250.00 towards REAL_ANGLE_2[INTEGER] degrees) Effet spécial - Create a special effect at LEAK_POINT[1] using AbilitiesWeaponsSpiritOfVengeanceMissileSpiritOfVengeanceMissile.mdl Effet spécial - Destroy (Last created special effect) Unité - Move UNIT_DUMMY[INTEGER] instantly to LEAK_POINT[1] Set UNITGROUP[INTEGER] = (Units within 150.00 of LEAK_POINT[1] matching ((((Matching unit) is Un bâtiment) Egal à FALSE) and ((((Matching unit) is visible to (Owner of UNIT_DUMMY[INTEGER])) Egal à TRUE) and ((((Matching unit) is Insensible à la magie) Egal à FALSE) and ((((Match
Groupe unité - Pick every unit in UNITGROUP[INTEGER] and do (Actions)
Boucle - Actions
Effet spécial - Create a special effect attached to the origin of (Picked unit) using AbilitiesSpellsOtherStampedeStampedeMissileDeath.mdl Effet spécial - Destroy (Last created special effect) Unité - Cause UNIT_DUMMY[INTEGER] to damage (Picked unit), dealing (REAL_DAMAGE[INTEGER] / 33.33) damage of attack type Sorts and damage type Normal Groupe unité - Add (Picked unit) to UNITGROUP_NOSTACK[INTEGER]
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
And - All (Conditions) are true
Conditions
REAL_ANGLE_2[INTEGER] Supérieur ou égal à REAL_ANGLE_3[INTEGER] BOOLEAN_NN[INTEGER] Egal à FALSE
Alors - Actions
Set BOOLEAN_NONAME[INTEGER] = FALSE Set REAL_DISTANCE[INTEGER] = 1000.00 Set REAL_ANGLE[INTEGER] = (REAL_ANGLE_3[INTEGER] + 45.00) Set BOOLEAN_NN[INTEGER] = TRUE Custom script: call DestroyGroup(udg_UNITGROUP[udg_INTEGER])
Sinon - Actions
Do nothing
Sinon - Actions
Set LEAK_POINT[1] = (Position of UNIT_DUMMY[INTEGER]) Set LEAK_POINT[2] = (LEAK_POINT[1] offset by REAL_SPEED[INTEGER] towards REAL_ANGLE[INTEGER] degrees) Unité - Move UNIT_DUMMY[INTEGER] instantly to LEAK_POINT[2] Effet spécial - Create a special effect at LEAK_POINT[2] using AbilitiesWeaponsSpiritOfVengeanceMissileSpiritOfVengeanceMissile.mdl Effet spécial - Destroy (Last created special effect) Set REAL_DISTANCE[INTEGER] = (REAL_DISTANCE[INTEGER] - REAL_SPEED[INTEGER]) Set UNITGROUP[INTEGER] = (Units within 150.00 of LEAK_POINT[1] matching ((((Matching unit) is Un bâtiment) Egal à FALSE) and ((((Matching unit) is visible to (Owner of UNIT_DUMMY[INTEGER])) Egal à TRUE) and ((((Matching unit) is Insensible à la magie) Egal à FALSE) and ((((Match
Groupe unité - Pick every unit in UNITGROUP[INTEGER] and do (Actions)
Boucle - Actions
Effet spécial - Create a special effect attached to the origin of (Picked unit) using AbilitiesSpellsOtherStampedeStampedeMissileDeath.mdl Effet spécial - Destroy (Last created special effect) Unité - Cause UNIT_DUMMY[INTEGER] to damage (Picked unit), dealing (REAL_DAMAGE[INTEGER] / 33.33) damage of attack type Sorts and damage type Normal Groupe unité - Add (Picked unit) to UNITGROUP_NOSTACK[INTEGER]
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
REAL_DISTANCE[INTEGER] Inférieur ou égal à 250.00
Alors - Actions
Set LEAK_POINT[3] = (Position of UNIT_DUMMY[INTEGER]) Set REAL_ANGLE_3[INTEGER] = (REAL_ANGLE_2[INTEGER] + 720.00) Set POINT_TURN[INTEGER] = (LEAK_POINT[3] offset by 250.00 towards REAL_ANGLE_3[INTEGER] degrees) Custom script: call DestroyGroup(udg_UNITGROUP[udg_INTEGER])
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
And - All (Conditions) are true
Conditions
BOOLEAN_NONAME[INTEGER] Egal à FALSE BOOLEAN_NN[INTEGER] Egal à TRUE
Alors - Actions
Set LEAK_POINT[1] = (Position of UNIT_DUMMY[INTEGER]) Set LEAK_POINT[3] = (LEAK_POINT[1] offset by REAL_SPEED[INTEGER] towards REAL_ANGLE[INTEGER] degrees) Unité - Move UNIT_DUMMY[INTEGER] instantly to LEAK_POINT[3] Effet spécial - Create a special effect at LEAK_POINT[3] using AbilitiesWeaponsSpiritOfVengeanceMissileSpiritOfVengeanceMissile.mdl Effet spécial - Destroy (Last created special effect) Set UNITGROUP[INTEGER] = (Units within 150.00 of LEAK_POINT[1] matching ((((Matching unit) is Un bâtiment) Egal à FALSE) and ((((Matching unit) is visible to (Owner of UNIT_DUMMY[INTEGER])) Egal à TRUE) and ((((Matching unit) is Insensible à la magie) Egal à FALSE) and ((((Match Set REAL_DISTANCE[INTEGER] = (REAL_DISTANCE[INTEGER] - REAL_SPEED[INTEGER])
Groupe unité - Pick every unit in UNITGROUP[INTEGER] and do (Actions)
Boucle - Actions
Effet spécial - Create a special effect attached to the origin of (Picked unit) using AbilitiesSpellsOtherStampedeStampedeMissileDeath.mdl Effet spécial - Destroy (Last created special effect) Unité - Cause UNIT_DUMMY[INTEGER] to damage (Picked unit), dealing (REAL_DAMAGE[INTEGER] / 33.33) damage of attack type Sorts and damage type Normal Groupe unité - Add (Picked unit) to UNITGROUP_NOSTACK[INTEGER]
"Lance une boule d'énergie qui part en ligne droite et quand il atteint le point visé, il décrit un cercle avant de continuer sa course dans sa direction première. Le glaive inflige 100 points de dégâts par touche."
(Et sinon comment je fais pour attacher la map ? Merci d'avance)
EDIT: L'URL de la map
Télécharger la map
EDIT2: Des screens:
Secret:
Celui ci montre les dégâts infligés par le sort.
Celui ci montre que le sort est bien MUI (Il y a 3 fois le sort)
EDIT 3: Formatage à la demande de Vladaam
(Merci à Hoth pour m'avoir dit où upload) _________________
Dernière édition par Zaaap le 14/11/11 18:45; édité 4 fois
Inscrit le: 14 Avr 2011 Messages: 1846 Sujets: 119 Spécialité en worldedit: fonctions paramétriques, équation de mouvement.
Posté le: 13/11/11 11:21 Sujet du message:
bon moi j'retire mon sort, j'ai plus rien à apprendre dessus, le reste n'est que répétition de ce que j'ai déjà fait.
j'vais p't'être me lancer sur un autre si j'trouve une idée intéressante, mais si trop répétitif encore une fois j'garanti pas de le finir (s'pas intéressant après) _________________
22:27:43<Seiraw> Bah y a deux genre de personnes
22:27:57<Seiraw> les soumis et les soumises
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: 13/11/11 15:12 Sujet du message:
Aux personnes ayant postés leur sort :
Cela serait possible de rédiger avec ce format :
Code:
[b][color=blue]NOMDUSORT[/color][/b] par [b]VOTREPSEUDO[/b] [color=red][vJASS-JASS-GUI/MUI-MPI-Rien][/color]
[spoiler][b]Description du sort :[/b] Le sort fait cela.
[b]Infos supp :[/b]
Quelques infos supplémentaires sur comment fonctionne le sort. (des détails n'étant pas forcément présents dans la description).
Toutes les heures sont au format GMT + 1 Heure Aller à la page Précédente1, 2, 3Suivante
Page 2 sur 3
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