-
| .
|
|
|
Ciao ragazzi, e mi rivolgo in particolare a Ricky e Supreme
Sarebbe interessante trovare negli script penso contenuti in SUBAI il motivo per il quale se si ordina ad un esercito di andare in un punto "abbastanza" lontano (non so quantificare la lontananza) e poi si preme S i soldati si fermano esattamente nel punto in cui si trovano, mentre se si mandano in un punto vicino questo non accade.
Per spiegarmi , se mando l'eroe in un punto diciamo vicino al foro partendo da fuori la porta e poi premo S accade questo
mentre se lo mando sempre in un punto di fronte all'eroe e oltre al punto in cui voglio fermarmi ma abbastanza vicino alla porta nella quale sto entrando, e poi premo S, accade questo:
sarebbe bello e utile se qualcuno indagasse (si potrebbe correggere lo script e/o migliorarlo). potete verificare voi stessi questo fatto provando in gioco.
attendo news,
Razor
|
|
| .
|
-
| .
|
|
|
Il codice penso che č questo:
CODICE // void, Obj me
Unit this, u; point pt; int range; bool bSleeped;
this = me.AsUnit();
if (.IsValid) // leave parry mode at new command .SetParryMode(false);
while( ! .Stop( 1000 )); pt = .posRH; range = 120;
while(.IsAlive) { if (.CmdCount() > 1) break; if( .IsRanged ) { u = .BestTargetInRange( pt, .range ); while( u.IsAlive && .IsValidTarget( u ) && .IsVisible) { bSleeped = false; while( .Attack( u )) { if( ! .IsVisible ) break; bSleeped = true; } if( ! bSleeped ) Sleep( 50 ); u = .BestTargetInRange( pt, .range ); } } else { u = .BestTargetInRange( pt, range ); while( u.IsAlive && .IsValidTarget( u ) && .IsVisible) { bSleeped = false; while( ! .GotoAttack( u, 1500, true, -1 )) { bSleeped = true; u = .BestTargetInRange( pt, range ); if( !u.IsAlive || ! .IsValidTarget( u )) break; if( !.IsVisible ) break; } if( u.IsAlive && .IsValidTarget( u ) && .IsVisible) { while( .Attack( u )) { if( ! .IsVisible ) break; bSleeped = true; } } if( ! bSleeped ) Sleep( 50 ); u = .BestTargetInRange( pt, range ); } } if( ! u.IsAlive && ( pt.x != .posRH.x || pt.y != .posRH.y )) { while( ! .Goto( pt, 0, 2000, false, -1 )); } else .Idle(1793); }
Lo analizzerň meglio dopo perchč devo scoprire cosa serve il ParryMod e il GotoAttack
|
|
| .
|
-
| .
|
|
|
Parry mod č Contenimento.
|
|
| .
|
-
| .
|
|
|
Accade solo alle unitŕ vincolate all'eroe?
|
|
| .
|
-
| .
|
|
|
Si, cioe seleziono l eroe e faccio quei movimenti, quindi penso che guarderei hero_stand_position.vs o come si chiama
L unico modo per fermare le unitŕ nel posto senza che si sciolgano e senza eroe č mandarle dentro un forte/foro/grotta, e poi premere s
|
|
| .
|
-
| .
|
|
|
Dal codice di stand position l'unitŕ non sta in stand position ma attacca se nel caso si trova una unitŕ nemica vicina(se č un arciere anche nel raggio di 600 unitŕ)
Potrebbe invece riguardare un comando dell'eroe anche se dubito perchč questo file stand position riguarda tutte le unitŕ e quindi anche gli eroi,se esiste un file che specifica il comportamento delle unitŕ ad ogni comando dell'eroe allora probabilmente č li la causa di questo piccolo problema.
Se l'eroe si ferma subito allora questo file non ha colpe.
Io penso che il file Hero_stand_ground.vs sia il responsabile,dal codice si puň dedurre che le unitŕ stanno ferme nel caso in cui l'eroe gli viene dato il comando hold_position o stand_position:
CODICE //void, Obj me, point pt
Hero this; point dest; int formed,i;
this = me.AsHero();
dest = GetVec(.posRH, pt, 16);
for (i = 0; i < .army.count; i += 1) .army[i].SetCommand("stand_position");
.SetCommand("stand_position");
Comunque qui ci sono 2 errori: il primo errore č che la variabile dest non č utilizzata(anche se gli viene assegnato un valore),poi anche la variabile formed non č usata.
Anche questo file potrebbe centrare si chiama Hero_holdPosition.vs
CODICE // void, Obj me
Hero this; Unit u; Building b; point pt; int i; this = me.AsHero();
pt = .posRH;
.FormSetupAndMoveTo(pt,0,0,true); while(.HasPath()) { .FormKeepMoving(1500); }
.army.SetCommand("hold_position");
u = .BestTargetForPos(); while(1) { if(u.IsAlive()) { while(u.IsAlive()) { while(!.Attack(u)) { u = .BestTargetForPos(); if(!u.IsValid()) break; } if(u.IsAlive) { for(i = 0; i < 3; i+=1) { if(!.Attack(u)) break; } } u = .BestTargetForPos(); } } else { .Idle(2000); u = .BestTargetForPos(); } }
|
|
| .
|
-
| .
|
|
|
Puoi fare delle prove mettendo quel file nella cartella Data/Subai creata manualmente affianco a gbr.exe e verificare i risultati. ;-)
|
|
| .
|
-
| .
|
|
|
La causa penso che sia:
.FormSetupAndMoveTo(pt,0,0,true);
che non so cosa significa ma penso che l'eroe si muove nel punto pt
Trovato basta che togli idle
In pratica il suo funzionamento non č diverso dalle unitŕ,ma se l'eroe non trova nemici vicini allora si ferma dopo 2 secondi indicato da Idle
Idle(2000); č una funzione latente,comunque non so ma penso che se si tratta di un eroe questo file venga eseguito prima di unit_standposition.vs
e questa funzione "ritarda" lo stand position dell'eroe e/o delle sue unita
|
|
| .
|
-
| .
|
|
|
Hai provato in gioco a fare questo "bug" ? Per capirne bene la causa, prima si deve osservare bene quello che accade
|
|
| .
|
-
| .
|
|
|
Penso che sia la funzione idle,infatti se la togli funziona ho provato io stesso,ma idle non ho ancora capito bene cosa fa oltre a far attendere.
|
|
| .
|
-
| .
|
Ricky
- Group
- Eroi
- Posts
- 4,930
- Reputation
- +197
- Location
- Tourin (Italy)
- Status
- Anonymous
|
|
A quanto sembra, Supreme ha giŕ risolto
|
|
| .
|
-
| .
|
|
|
Se ha risolto, metta in allegato il file vs infetto modificato e proviamo a metterlo in gioco, voglio vedere per credere
|
|
| .
|
-
| .
|
|
|
Ma basta che lo estrai con arch e lo metti sul percorso principale di imperium,togli idle,ci metti 1 minuto a farlo.
|
|
| .
|
-
-
| .
|
|
|
Non č quello...
CODE // void, Obj me
Hero this; Unit u; Building b; point pt; int i; this = me.AsHero();
pt = .posRH;
.FormSetupAndMoveTo(pt,0,0,true); while(.HasPath()) { .FormKeepMoving(1500); }
.army.SetCommand("hold_position");
u = .BestTargetForPos(); while(1) { if(u.IsAlive()) { while(u.IsAlive()) { while(!.Attack(u)) { u = .BestTargetForPos(); if(!u.IsValid()) break; } if(u.IsAlive) { for(i = 0; i < 3; i+=1) { if(!.Attack(u)) break; } } u = .BestTargetForPos(); } } else { u = .BestTargetForPos(); } }
Questo č il file che ho messo in SUBAI, non č cambiato nulla in gioco
|
|
| .
|
29 replies since 22/9/2016, 13:44 208 views
.