PDA

View Full Version : Soluzione per minare da script



vecchiounno
24-01-2011, 18:03
finalmente sono riuscito a fare lo script per minare

mi manca solo un piccolo dettaglio

l'assegnazione di un tag all'entity (ovvero la mina)

questo lo script:

{"0"
{position -104.753 73.3921 0}
{radius 10}
{commands
{"inventory"
{selector
{source standart}
{mids 1}
}
{action take}
{item "antitank" "mine"}
}
{"inventory"
{selector
{source standart}
{mids 1}
}
{action drop}
}
{"animation"
{collage squat_repair_1}
{cicledelay 0}
{delay 0}
{totalTime 8}
{flags loop}
}
{"delay"
{time 8}
}
{"mine_state"
{selector
{source standart}
{tag mine_ground}
}
{action arm}
{miner "1"}
}
{"entity_state"
{selector
{source standart}
{tag mine_ground}
}
{tag_remove mine_ground}
}
}
}


commento:
è un comando da inserire nel command del waypoint (in questo caso 0) che poi è il punto da minare con 1 mina
il primo inventory mette in mano la mina;
il secondo inventory la deposita per terra;
animation simula l'azione di minare;
delay 8 aspetta che l'azione finisca;
mine_state arma la mina a tutti gli effetti;
entity_state elimina il tag mine_ground.

DILUST proprio questo tag è il mio problema:
per far funzionare tutto le mine devono essere preventivamente taggate con mine_ground (di mia scelta), perchè altrimenti non so come farle identificare dal comando mine_state...
In sostanza ci vuole un comando che faccia un ADD TAG sulla mina (in qualsiasi modo prima del mine_state)

per SPC il problema non esiste visto che posso aggiungere i tag da programma, ma era per dare un tutorial alla comunity.

Ovviamento l'ho provato è funziona!!! :grandpa:

Dilust
25-01-2011, 11:54
È un gran bel pezzo di codice.

La tua domanda a me è se esiste un codice da script per assegnare un tag ad oggetti nell'inventario di un dato soldato?

La mia risposta è non lo so; vorrei tanto saperlo.

Il modo "barbaro" che uso di solito è quello di far buttare dall'omino l'oggetto sul suolo, assegnargli il tag e poi rimetterlo nell'inventario.

Il problema per gli oggetti nell'inventario è che non hanno nessun codice identificativo, fino a quando non vengono messi materialmente sulla mappa.

vecchiounno
26-01-2011, 16:23
potrebbe andare bene anche quando va messo sulla mappa

potrei aggiungere il tag durante l'animazione ma cmq prima del mine_state

illuminami!

Dilust
26-01-2011, 17:17
{Human "mp/eng/antitank_miner" 0xc000
{Position 173.87 293.38}
{xform zl -11.75}
{Player 0}
{MID 1}
{NameId 60 1}
{FsmState "stand"}
}
{Entity "mine_antitank" 0x8001
{Position 178.22 295.43 -0.1}
{xform zl 137.99 y 0.06 zw 88.51}
{Volume "body1"
{able {visible 0}{bullet 0}{obstacle 0}{touch 1}}
}
{Volume "body"
{able {visible 0}{bullet 0}{obstacle 0}{contact 0}{contact_ground 0}{blast 0}{select 0}}
}
}
{Human "mp/eng/antipersonel_miner" 0x8008
{Position 187.95 48.66}
{Player 0}
{MID 2}
{NameId 60 2}
{FsmState "stand"}
}
{Tags "mine_ground" 0x8001}
{Inventory 0xc000
{box
{clear}
{item "m3a" filled {cell 0 0}}
{item "pistol" "ammo" 100 {cell 4 0}}
{item "helmet1_eng" {cell 0 6}{user "head"}}
{item 0x8001 {cell 0 2}}
}
}
{Inventory 0x8008
{box
{clear}
{item "m3a" filled {cell 0 0}}
{item "pistol" "ammo" 100 {cell 4 0}}
{item "antipersonnel" "mine" {cell 4 1}}
{item "antipersonnel" "mine" {cell 0 2}}
{item "antipersonnel" "mine" {cell 2 2}}
{item "antipersonnel" "mine" {cell 4 2}}
{item "antipersonnel" "mine" {cell 0 3}}
{item "antipersonnel" "mine" {cell 2 3}}
{item "antipersonnel" "mine" {cell 4 3}}
{item "antipersonnel" "mine" {cell 0 4}}
{item "antipersonnel" "mine" {cell 2 4}}
{item "antipersonnel" "mine" {cell 4 4}}
{item "antipersonnel" "mine" {cell 0 5}}
{item "antipersonnel" "mine" {cell 2 5}}
{item "antipersonnel" "mine" {cell 4 5}}
{item "antipersonnel" "mine" {cell 0 6}}
{item "antipersonnel" "mine" {cell 2 6}}
{item "helmet1_eng" {cell 4 6}{user "head"}}
}
}

Come vedi le mine che ho prima buttato sulla mappa ora si ritrovano un codice id. Gli ho potuto quindi assegnare il codice tag.
Quando ppoi le faccio raccogliere dal soldato e rimettere nell'inventario tale codice id gli resta

Per le mine ap, che non sono mai uscite dall'inventario del soldato, invece non c'è modo alcuno di identificarle.

Il codice identificativo esadecimale viene assegnato automaticamente dall'engine quando piazzi l'elemento "concreto" sulla mappa.
Immagino che durante la sessione di gioco vengano via via creati numeri successivi in automatico per ogni nuova entità che viene spawnata sulla mappa, come per i frammenti di edificio, le chiazze di sangue o le unità clonate.

Facciamo un esempio se l'ultima entià che ho messo nella mappa che ho creato ha un id 0x8001
Sono sicuro che appena creerò una nuova entità nella sessione di gioco essa avrà id 0x8002

Quindi facciamo il caso che c'ho solo il soldato antitank miner con id 0x8001
Se gli imposto un trigger per droppare al suolo una mina. Tale mina avrà id 0x8002
Per controllare salva e vatti a leggere il file di testo del salvataggio.

Ma sarebbe cosa impossibile andare a prevedere qualè sarà questo id tenendo conto delle infinite variabili che possono accadere in gioco.
Potrebbe capitare che lo sparano e il nuovo id andrebbe alla chiazza di sangue, ecc. ecc.

vecchiounno
31-01-2011, 18:02
la tua proposta non è affatto "deontologica"!


piuttosto...

è possible, avendo un item nell'inventario con un tag, aggiungere a questo item un altro tag?

in pratica ho risolto (in parte) il posizionamento della mina anticarro,
(ho aggiunto il tag "mine_ground" nel file "stuff_mine.ext" che poi ho depositato nella cartella \properties\ del mod), ma non è perfetto!
Nel senso che adesso la mina è identificabile tramite questo tag, ma essendo i minatori una squadra, vengono deposte più mine contemporaneamente nell'area prescelta; quindi volevo aggiungere alla data mina del dato minatore nel momento in cui viene presa, un altro tag (una mia variabile=al mid del minatore) per essere certo che il comando "mine_state" aggisca solo su quella mina.

Dilust
01-02-2011, 10:00
E il problema resta lo stesso. Non possiamo individuare quella specifica mina perché ora tutte le mine hanno lo stesso tag.

Tuttavia se la mina con il tag mine_ground esiste nella mappa, in una determinata zona, in teoria si potrebbe aggiungere questo per specificarle:

{"entity_state"
{selector
{source standart}
{tag mine_ground}
[zone zone_name]
}
{tag_add mines}
}

Quindi tutte le entità con tag mine_ground nella zona devono aggiungere tale altro tag, ecc. ecc.
Ma questo in teoria, provarlo sul campo è tutt'altra cosa...

vecchiounno
01-02-2011, 22:16
ok
adesso è perfetto

ho dovuto aggiungere 1 zona per ogni wp corrispondente alla posa di una mina
e questo per 4 mine per ogni soldato:
quinid mina1 di MID1 in wp1 in zona1, mina2 di MID1 in wp2 in zona2, ecc.

altra cosa aggiunta
solo prima della posa della prima mina di ogni soldato: avere le mani libere da armi o altro + 1 sec di delay
("{weapon_prepare off}")

ecco lo script della posa di una mina (troverete cmq tutto e altre cosette carine nella proxima versione di SPC: la 3.0...)

{"1100"
{position -2137.289 617.4339 0}
{radius 10}
{commands
{"actor_state"
{selector
{source standart}
{mids 29}
}
{weapon_prepare off}
}
{"delay"
{time 1}
}
{"inventory"
{selector
{source standart}
{mids 29}
}
{action take}
{item "antitank" "mine"}
}
{"inventory"
{selector
{source standart}
{mids 29}
}
{action drop}
}
{"animation"
{selector
{source standart}
{mids 29}
}
{collage squat_repair_1}
{cicledelay 0}
{delay 0}
{totalTime 8}
{flags loop}
}
{"delay"
{time 8}
}
{"mine_state"
{selector
{source standart}
{tag mine_ground}
{zone "29_0"}
}
{action arm}
{miner "3"}
}
{"entity_state"
{selector
{source standart}
{tag mine_ground}
{zone "29_0"}
}
{tag_remove mine_ground}
}
{"waypoint"
{who
{type actor}
{use_current 0}
{actors
{mids 29}
}
}
{action
{type start}
{waypoint "1101"}
}
}
}
}


p.s.
penso si possa considerare un piccolo tutorial (seppure parziale come spiegazione)...

vecchiounno
06-02-2011, 19:06
...sono andato a cercare la "trave" mentre invece bastava la "pagliuzza"!!!! :evil:

cercando un tutorial sui convogli, mi sono imbattuto in questo video tutorial (http://www.youtube.com/watch?v=4tdi5m2EsC4&feature=related) su come minare.

Certo impone che la squadra sia motorizzata e non discrimina il tipo di mine (AT o AP), nel senso che la squadra usa quelle che trova nel mezzo, ma è più realistico (le squadre di genieri erano motorizzate) permettendo un intervento e una ritirata al termine del lavoro veloce nelle retrolinee.
Il codice script è quasi banale e sembra che funzioni solo se l'actor è il mezzo e non la truppa a bordo; il mezzo poi va "taggato" e va indicata la zona in cui minare.
Insomma ormai ho scritto quella pappardella di codice in SPC 3.0... :huh: vorrà dire che lo cambierò nella prossima versione (se trovo un compromesso...)

commento:
- si mette un tag (es. "minatori") al camion che porta la squadra e lo si riempie di mine (AT o AP)
- la squadra può essere composta da qualsiasi tipo di soldato, tanto le mine le prendono dal camion
- si crea un percorso (waypoint) che porti nelle vicinanze del campo da minare
- qui si crea (zone) l'area da minare (es. "campominato")
- si dice al camion di andare al primo wp del percorso che porta al camp da minare
- come command dell'ultimo waypoint del percorso si dice al tag "minatori" di minare la zone "campominato"
...e poi fanno tutto loro: prendono le mine e minano fino a saturare la zona poi tornano a bordo!


{triggers
{"minamento"
{condition
}
{actions
{"delay"
{time 3}
}
{"waypoint"
{who
{type actor}
{actors
{tag minatori}
}
}
{action
{type start}
{waypoint "0"}
}
}
}
}
}
{waypoints
{"0"
{position -966.411 1015.91 0}
{transition "4"}
}
{"1"
{position -841.216 843.802 0}
{commands
{"mine"
{selector
{source standart}
{tag minatori}
}
{zone "campominato"}
}
}
}
}

Dilust
07-02-2011, 10:55
È di una semplicità... mi prenderei a schiaffi per quanto è banale come tipo di script :facepalm: