PDA

Voir la version complète : Demande de scripts 'maison'



Balles
05/07/2009, 03h05
Je lance ce topic d'entre-aide apres avoir aidé quelques uns a faire 2-3 trucs niveau scripting. On peut faire plein de choses sans scripter mais comme j'aime ça et que je le pense, sans scripter on va pas super loin (ce qui n'empeche pas de tres bonnes mission on est d'accord).

Je ne sais pas tout faire mais j'aime les defis et faire les choses a ma façon (home made quoi !), plein de scripts existent deja (faut chercher deja dans ceux qui existent voir si ça conviendrait pas on sait jamais), mais il y a toujours le petit truc qui fait que notre mission serait bien mieux si on savait faire ça mais on trouve pas forcement ce qui nous convient ou on ne sait pas comment faire... (reprend son soufle)... Donc je propose mes services pour des petits trucs, scripting, astuces et conseils qui peuvent faire la difference sur une mission de quelqu'un qui coince.

Je suis prêt a y passer du temps avec la personne si ça en vaut la peine pour lui. Je m'eclate presque plus a faire de jolis programmes qui fonctionnent qu'a jouer (j'ai dit presque hein !).

Mettez donc ici vos doleances et j'essaierai d'y repondre dans le topic si c'est faisable ou on essaiera de se donner rendez-vous et de resoudre les problemes. Mettez bien le pourquoi du comment, le où, quand et dans quel but, apres avoir testé plusieurs choses si vous coincez, je serai ravi de donner un coup de main dans la mesure de mes possibilités.

Voilà, et si quelqu'un pose une question et que VOUS avez la solution, ba n'hésitez pas ! :)

Balles
05/07/2009, 03h27
Bon allez, j'en profite pour me lancer et demander si quelqu'un aurait vu ça ou aurait le courage de le faire :

Un liste de toutes les armes de Arma2 avec les munitions correspondantes.
Il y a bien cette liste pour Arma dans le wiki (qui est a 80% au moins la même je vous l'accorde, mais pas assez complete, voir pas du tout) mais pas encore celle pour Arma2. Tout ce que j'ai pu trouvé c'est le tres bon boulot qu'a fait harmaholic mais ça ne correspond pas a mes attentes.

Donc si jamais vous trouvez ou que vous le faites... Vous savez quoi faire !

Jean Pale
05/07/2009, 04h30
Dans le script AmmoRefill tu les vois. Pour les objets, j'ai pas compris comment il a fait, mais pour les noms d'armes et de munitions je m'en sers.

fwouedd
05/07/2009, 09h57
Il y a bien cette liste dans le quatrième message de ce topic :
http://forums.bistudio.com/showthread.php?t=73241

Par contre, je ne suis pas sur quelle soit complète.



Sinon, je me permet de te redemander ton aide en ce qui concerne notre problème de script sur ce petit truc "tout bête" qui sert à recharger les munitions d'un équipier. Je pose les fichiers en téléchargement ici (http://www.megaupload.com/?d=0TGEF1MH) si besoin (et évidemment, je campe sous Mumble :) ).

Y'aurait pas un truc à faire avec ça ?

Sometimes it might be needed that the distance of two units or objects has to be used
As condition to run a script or execute a trigger. To do this just use following syntax:
Player distance Jeep1<= 50 or Player distance Jeep1 == 50
Local variable value allocated: _distance = Player distance Jeep1


1/ Sinon, j'aimerais, si c'est possible, que les hints de tests laissent, à terme, place à un truc du genre :

Rechargement ok -> lancer un déclencheur nommé rok ou un truc du genre ( unit groupChat "Reçu, je recharge."] )
Plus de chargeurs -> lancer un déclencheur nommé rnon ou un truc du genre ( unit groupChat plus de munitions."] )
Il ne reste qu'un chargeur -> lancer un déclencheur rwarning ou un truc du genre ( unit groupChat "C'est mon dernier chargeur." )

(Mais deja, est ce qu'on peut faire en sorte que le "unit" ne soit pas precisé dans le déclencheur et soit celui qui utilise la commande rearm?)

Çà me parait intéressant que ces infos passent sur le groupchat dans la mesure ou un groupe M240 ne contient qu'un Gunner, un assistant Gunner et un porteur de munitions (les trois en portent) et qu'il en est de même pour les autres groupes spécialisés.


2/ Et si possible, je suis un affreux profiteur, que le porteur de la M240 voit son option "rearmer le joueur" modifiée en "rearmez moi, je suis à sec." faisant appel à un déclencheur ou un truc du genre "rdem" qui contient :
unit groupChat "rearmez moi, je suis à sec."


3/ Et puis, tant que j'y suis, on peux ajouter une animation type "je me sers dans une caisse" au gars qui recharge le Main Gunner?


Mais j'avoue que je suis lourd avec mon truc (après promis, je fais plein de missions coop sans respawn bien orientées simu pour groupes de toutes tailles, j'ai beau chercher j'ai besoin de rien d'autre) ;)

fwouedd
05/07/2009, 11h30
Ahhh si, il me manque un second truc.

Est ce que quelqu'un sait comment faire pour lancer une fin de mission si le nombre de joueur est inférieur à un certain nombre (par exemple, si 60% des joueurs sont mort -> échec de la mission)?

Edit : j'ai trouvé :


Donc il faut créer un premier déclencheur largement plus grand que la zone de mission (le déclencheur se met en marche si les joueurs sortent de la zone, j'ai mis 100 000 sur les deux axes)

Activation : BLUFOR
Condition : count thislist < # le nombre que vous voulez
Type : Perdre
Compte à rebours : min 20 moy 20 max 20 (enfin vous mettez ce que vous voulez, c'est en secondes)

Je crée un second déclencheur aussi grand que le premier

Activation : BLUFOR
Condition : Count thislist < # le même nombre que le premier déclencheur
Sur act : hint "Echec de la mission : pertes trop importantes"

Çà permet d'arrêter la mission avant que tout le monde soit mort en prévenant les survivants 20 sec avant la fin que la mission est un échec.
Çà évite les séances de deux heures en corbeau en restant réaliste.

Balles
05/07/2009, 15h24
CAISSE ARMORYFILL

Dans l'init de la caisse :
Nul = [this] execVM "nom_du_fichier.sqf";

Dans le fichier nom_du_fichier :
_caisse = _this select 0;

While {alive _caisse} do
{
Clearweaponcargo _caisse;
Clearmagazinecargo _caisse;

//BIS WEAPONS//

_caisse addWeaponCargo ["AK_107_kobra",20];
_caisse addWeaponCargo ["AK_107_GL_kobra",20];
_caisse addWeaponCargo ["AK_107_GL_pso",20];
_caisse addWeaponCargo ["AK_107_pso",20];
_caisse addWeaponCargo ["AK_74",20];
_caisse addWeaponCargo ["AK_74_GL",20];
_caisse addWeaponCargo ["AK_47_M",20];
_caisse addWeaponCargo ["AK_47_S",20];
_caisse addWeaponCargo ["AKS_74_kobra",20];
_caisse addWeaponCargo ["AKS_74_pso",20];
_caisse addWeaponCargo ["AKS_74_U",20];
_caisse addWeaponCargo ["AKS_74_UN_kobra",20];
_caisse addWeaponCargo ["Bizon",20];
_caisse addWeaponCargo ["bizon_silenced",20];
_caisse addWeaponCargo ["G36a",20];
_caisse addWeaponCargo ["G36C",20];
_caisse addWeaponCargo ["G36_C_SD_eotech",20];
_caisse addWeaponCargo ["G36K",20];
_caisse addWeaponCargo ["M1014",20];
_caisse addWeaponCargo ["M16A2",20];
_caisse addWeaponCargo ["M16A2GL",20];
_caisse addWeaponCargo ["M16A4",20];
_caisse addWeaponCargo ["M16A4_GL",20];
_caisse addWeaponCargo ["M16A4_ACG_GL",20];
_caisse addWeaponCargo ["M16A4_ACG",20];
_caisse addWeaponCargo ["M4A1",20];
_caisse addWeaponCargo ["M4A1_HWS_GL",20];
_caisse addWeaponCargo ["M4A1_HWS_GL_camo",20];
_caisse addWeaponCargo ["M4A1_HWS_GL_SD_Camo",20];
_caisse addWeaponCargo ["M4A1_RCO_GL",20];
_caisse addWeaponCargo ["M4A1_Aim",20];
_caisse addWeaponCargo ["M4A1_Aim_camo",20];
_caisse addWeaponCargo ["M4A1_AIM_SD_camo",20];
_caisse addWeaponCargo ["MP5A5",20];
_caisse addWeaponCargo ["MP5SD",20];
_caisse addWeaponCargo ["Saiga12K",20];
_caisse addWeaponCargo ["VSS_vintorez",20];
_caisse addWeaponCargo ["M8_carbine",20];
_caisse addWeaponCargo ["M8_carbineGL",20];
_caisse addWeaponCargo ["M8_compact",20];
_caisse addWeaponCargo ["MG36",20];
_caisse addWeaponCargo ["Mk_48",20];
_caisse addWeaponCargo ["M240",20];
_caisse addWeaponCargo ["M249",20];
_caisse addWeaponCargo ["Pecheneg",20];
_caisse addWeaponCargo ["PK",20];
_caisse addWeaponCargo ["RPK_74",20];
_caisse addWeaponCargo ["M8_SAW",20];
_caisse addWeaponCargo ["Huntingrifle",20];
_caisse addWeaponCargo ["DMR",20];
_caisse addWeaponCargo ["KSVK",20];
_caisse addWeaponCargo ["M107",20];
_caisse addWeaponCargo ["M24",20];
_caisse addWeaponCargo ["M40A3",20];
_caisse addWeaponCargo ["M4SPR",20];
_caisse addWeaponCargo ["SVD",20];
_caisse addWeaponCargo ["SVD_CAMO",20];
_caisse addWeaponCargo ["M8_sharpshooter",20];
_caisse addWeaponCargo ["Colt1911",20];
_caisse addWeaponCargo ["M9",20];
_caisse addWeaponCargo ["M9SD",20];
_caisse addWeaponCargo ["Makarov",20];
_caisse addWeaponCargo ["MakarovSD",20];
_caisse addWeaponCargo ["Igla",20];
_caisse addWeaponCargo ["Javelin",20];
_caisse addWeaponCargo ["M136",20];
_caisse addWeaponCargo ["MetisLauncher",20];
_caisse addWeaponCargo ["RPG18",20];
_caisse addWeaponCargo ["RPG7V",20];
_caisse addWeaponCargo ["SMAW",20];
_caisse addWeaponCargo ["Stinger",20];
_caisse addWeaponCargo ["Strela",20];
_caisse addWeaponCargo ["Binocular",20];
_caisse addWeaponCargo ["NVGoggles",20];
_caisse addWeaponCargo ["Laserdesignator",10];

//BIS AMMO//

_caisse addMagazineCargo ["30Rnd_545x39_AK",100];
_caisse addMagazineCargo ["30Rnd_545x39_AKSD",100];
_caisse addMagazineCargo ["30Rnd_762x39_AK47",100];
_caisse addMagazineCargo ["64Rnd_9x19_Bizon",100];
_caisse addMagazineCargo ["64Rnd_9x19_SD_Bizon",100];
_caisse addMagazineCargo ["30Rnd_556x45_G36",100];
_caisse addMagazineCargo ["30Rnd_556x45_G36SD",100];
_caisse addMagazineCargo ["8Rnd_B_Beneli_74Slug",100];
_caisse addMagazineCargo ["30Rnd_556x45_Stanag",100];
_caisse addMagazineCargo ["30Rnd_556x45_StanagSD",100];
_caisse addMagazineCargo ["30Rnd_9x19_MP5",100];
_caisse addMagazineCargo ["30Rnd_9x19_MP5SD",100];
_caisse addMagazineCargo ["8Rnd_B_Saiga12_74Slug",100];
_caisse addMagazineCargo ["10Rnd_9x39_SP5_VSS",100];
_caisse addMagazineCargo ["20Rnd_9x39_SP5_VSS",100];
_caisse addMagazineCargo ["1Rnd_HE_GP25",100];
_caisse addMagazineCargo ["FlareWhite_GP25",100];
_caisse addMagazineCargo ["FlareGreen_GP25",100];
_caisse addMagazineCargo ["FlareRed_GP25",100];
_caisse addMagazineCargo ["FlareYellow_GP25",100];
_caisse addMagazineCargo ["1Rnd_SMOKE_GP25",100];
_caisse addMagazineCargo ["1Rnd_SMOKERED_GP25",100];
_caisse addMagazineCargo ["1Rnd_SMOKEGREEN_GP25",100];
_caisse addMagazineCargo ["1Rnd_SMOKEYELLOW_GP25",100];
_caisse addMagazineCargo ["1Rnd_HE_M203",100];
_caisse addMagazineCargo ["FlareWhite_M203",100];
_caisse addMagazineCargo ["FlareGreen_M203",100];
_caisse addMagazineCargo ["FlareRed_M203",100];
_caisse addMagazineCargo ["FlareYellow_M203",100];
_caisse addMagazineCargo ["1Rnd_Smoke_M203",100];
_caisse addMagazineCargo ["1Rnd_SmokeRed_M203",100];
_caisse addMagazineCargo ["1Rnd_SmokeGreen_M203",100];
_caisse addMagazineCargo ["1Rnd_SmokeYellow_M203",100];
_caisse addMagazineCargo ["100Rnd_556x45_BetaCMag",100];
_caisse addMagazineCargo ["100Rnd_762x51_M240",100];
_caisse addMagazineCargo ["200Rnd_556x45_M249",100];
_caisse addMagazineCargo ["100Rnd_762x54_PK",100];
_caisse addMagazineCargo ["75Rnd_545x39_RPK",100];
_caisse addMagazineCargo ["5x_22_LR_17_HMR",100];
_caisse addMagazineCargo ["20Rnd_762x51_DMR",100];
_caisse addMagazineCargo ["5Rnd_127x108_KSVK",100];
_caisse addMagazineCargo ["10Rnd_127x99_m107",100];
_caisse addMagazineCargo ["5Rnd_762x51_M24",100];
_caisse addMagazineCargo ["20Rnd_556x45_Stanag",100];
_caisse addMagazineCargo ["10Rnd_762x54_SVD",100];
_caisse addMagazineCargo ["7Rnd_45ACP_1911",100];
_caisse addMagazineCargo ["15Rnd_9x19_M9",100];
_caisse addMagazineCargo ["15Rnd_9x19_M9SD",100];
_caisse addMagazineCargo ["8Rnd_9x18_Makarov",100];
_caisse addMagazineCargo ["8Rnd_9x18_MakarovSD",100];
_caisse addMagazineCargo ["Igla",20];
_caisse addMagazineCargo ["Javelin",20];
_caisse addMagazineCargo ["M136",20];
_caisse addMagazineCargo ["AT13",20];
_caisse addMagazineCargo ["RPG18",20];
_caisse addMagazineCargo ["PG7V",20];
_caisse addMagazineCargo ["PG7VL",20];
_caisse addMagazineCargo ["PG7VR",20];
_caisse addMagazineCargo ["OG7",20];
_caisse addMagazineCargo ["SMAW_HEAA",20];
_caisse addMagazineCargo ["SMAW_HEDP",20];
_caisse addMagazineCargo ["Stinger",20];
_caisse addMagazineCargo ["Strela",20];
_caisse addMagazineCargo ["HandGrenade",50];
_caisse addMagazineCargo ["HandGrenade_West",50];
_caisse addMagazineCargo ["HandGrenade_East",50];
_caisse addMagazineCargo ["SmokeShell",50];
_caisse addMagazineCargo ["SmokeShellRed",50];
_caisse addMagazineCargo ["SmokeShellGreen",50];
_caisse addMagazineCargo ["SmokeShellYellow",50];
_caisse addMagazineCargo ["TimeBomb",50];
_caisse addMagazineCargo ["PipeBomb",50];
_caisse addMagazineCargo ["Mine",50];
_caisse addMagazineCargo ["MineE",50];
_this addMagazineCargo ["HandGrenade_Stone",50];
_this addMagazineCargo ["Laserbatteries",50];


Sleep 1800;
};


LISTE DE COUPLES ARME/MUNITION exploitable dans les scripts

[
["Bizon","64Rnd_9x19_Bizon"],
["bizon_silenced","64Rnd_9x19_SD_Bizon"],
["G36a","100Rnd_556x45_BetaCMag"],
["G36C","100Rnd_556x45_BetaCMag"],
["G36_C_SD_eotech","30Rnd_556x45_G36SD"],
["G36K","100Rnd_556x45_BetaCMag"],
["M1014 ","8Rnd_B_Beneli_74Slug"],
["MP5A5","30Rnd_9x19_MP5"],
["MP5SD","30Rnd_9x19_MP5SD"],
["Saiga12K","8Rnd_B_Saiga12_74Slug"],
["VSS_vintorez","20Rnd_9x39_SP5_VSS"],
["M8_carbine","30Rnd_556x45_G36"],
["M8_carbineGL","30Rnd_556x45_G36"],
["M8_compact","30Rnd_556x45_G36"],
["MG36","100Rnd_556x45_BetaCMag"],
["Mk_48","100Rnd_762x51_M240"],
["M240","100Rnd_762x51_M240"],
["M249","200Rnd_556x45_M249"],
["Pecheneg","100Rnd_762x54_PK"],
["PK","100Rnd_762x54_PK"],
["RPK_74","75Rnd_545x39_RPK"],
["M8_SAW","100Rnd_556x45_BetaCMag"],
["AK_107_kobra", "30Rnd_545x39_AK"],
["AK_107_GL_kobra", "30Rnd_545x39_AK"],
["AK_107_GL_pso", "30Rnd_545x39_AK"],
["AK_107_pso", "30Rnd_545x39_AK"],
["AK_74", "30Rnd_545x39_AK"],
["AK_74_GL", "30Rnd_545x39_AK"],
["AK_47_M", "30Rnd_762x39_AK47"],
["AK_47_S", "30Rnd_762x39_AK47"],
["AKS_74_kobra", "30Rnd_545x39_AK"],
["AKS_74_pso", "30Rnd_545x39_AK"],
["AKS_74_U", "30Rnd_545x39_AK"],
["AKS_74_UN_kobra", "30Rnd_545x39_AKSD"],
["Igla", "Igla"],
["Javelin", "Javelin"],
["M136", "M136"],
["MetisLauncher", "AT13"],
["RPG18", "RPG18"],
["RPG7V", "PG7V"],
["SMAW", "SMAW_HEAA"],
["Stinger", "Stinger"],
["Strela", "Strela"],
["Colt1911", "7Rnd_45ACP_1911"],
["M9", "15Rnd_9x19_M9"],
["M9SD", "15Rnd_9x19_M9SD"],
["Makarov", "8Rnd_9x18_Makarov"],
["MakarovSD", "8Rnd_9x18_MakarovSD"],
["M16A2", "30Rnd_556x45_Stanag"],
["M16A2GL", "30Rnd_556x45_Stanag"],
["M16A4", "30Rnd_556x45_Stanag"],
["M16A4_GL", "30Rnd_556x45_Stanag"],
["M16A4_ACG_GL", "30Rnd_556x45_Stanag"],
["M16A4_ACG", "30Rnd_556x45_Stanag"],
["M4A1", "30Rnd_556x45_Stanag"],
["M4A1_HWS_GL", "30Rnd_556x45_Stanag"],
["M4A1_HWS_GL_camo", "30Rnd_556x45_Stanag"],
["M4A1_HWS_GL_SD_Camo", "30Rnd_556x45_StanagSD"],
["M4A1_RCO_GL", "30Rnd_556x45_Stanag"],
["M4A1_Aim", "30Rnd_556x45_Stanag"],
["M4A1_Aim_camo", "30Rnd_556x45_Stanag"],
["M4A1_AIM_SD_camo", "30Rnd_556x45_StanagSD"],
["Huntingrifle", "5x_22_LR_17_HMR"],
["KSVK", "5Rnd_127x108_KSVK"],
["M107", "10Rnd_127x99_m107"],
["DMR", "20Rnd_762x51_DMR"],
["M24", "5Rnd_762x51_M24"],
["M40A3", "5Rnd_762x51_M24"],
["M4SPR", "20Rnd_556x45_Stanag"],
["SVD", "10Rnd_762x54_SVD"],
["SVD_CAMO", "10Rnd_762x54_SVD"],
["M8_sharpshooter", "30Rnd_556x45_G36"]
]


Fonction :

LISTE_ARMES_MUNITIONS =
{
[["Bizon","64Rnd_9x19_Bizon"],["bizon_silenced","64Rnd_9x19_SD_Bizon"],["G36a","100Rnd_556x45_BetaCMag"],["G36C","100Rnd_556x45_BetaCMag"],["G36_C_SD_eotech","30Rnd_556x45_G36SD"],["G36K","100Rnd_556x45_BetaCMag"],["M1014 ","8Rnd_B_Beneli_74Slug"],["MP5A5","30Rnd_9x19_MP5"],["MP5SD","30Rnd_9x19_MP5SD"],["Saiga12K","8Rnd_B_Saiga12_74Slug"],["VSS_vintorez","20Rnd_9x39_SP5_VSS"],["M8_carbine","30Rnd_556x45_G36"],["M8_carbineGL","30Rnd_556x45_G36"],["M8_compact","30Rnd_556x45_G36"],["MG36","100Rnd_556x45_BetaCMag"],["Mk_48","100Rnd_762x51_M240"],["M240","100Rnd_762x51_M240"],["M249","200Rnd_556x45_M249"],["Pecheneg","100Rnd_762x54_PK"],["PK","100Rnd_762x54_PK"],["RPK_74","75Rnd_545x39_RPK"],["M8_SAW","100Rnd_556x45_BetaCMag"],["AK_107_kobra", "30Rnd_545x39_AK"],["AK_107_GL_kobra", "30Rnd_545x39_AK"],["AK_107_GL_pso", "30Rnd_545x39_AK"],["AK_107_pso", "30Rnd_545x39_AK"],["AK_74", "30Rnd_545x39_AK"],["AK_74_GL", "30Rnd_545x39_AK"],["AK_47_M", "30Rnd_762x39_AK47"],["AK_47_S", "30Rnd_762x39_AK47"],["AKS_74_kobra", "30Rnd_545x39_AK"],["AKS_74_pso", "30Rnd_545x39_AK"],["AKS_74_U", "30Rnd_545x39_AK"],["AKS_74_UN_kobra", "30Rnd_545x39_AKSD"],["Igla", "Igla"],["Javelin", "Javelin"],["M136", "M136"],["MetisLauncher", "AT13"],["RPG18", "RPG18"],["RPG7V", "PG7V"],["SMAW", "SMAW_HEAA"],["Stinger", "Stinger"],["Strela", "Strela"],["Colt1911", "7Rnd_45ACP_1911"],["M9", "15Rnd_9x19_M9"],["M9SD", "15Rnd_9x19_M9SD"],["Makarov", "8Rnd_9x18_Makarov"],["MakarovSD", "8Rnd_9x18_MakarovSD"],["M16A2", "30Rnd_556x45_Stanag"],["M16A2GL", "30Rnd_556x45_Stanag"],["M16A4", "30Rnd_556x45_Stanag"],["M16A4_GL", "30Rnd_556x45_Stanag"],["M16A4_ACG_GL", "30Rnd_556x45_Stanag"],["M16A4_ACG", "30Rnd_556x45_Stanag"],["M4A1", "30Rnd_556x45_Stanag"],["M4A1_HWS_GL", "30Rnd_556x45_Stanag"],["M4A1_HWS_GL_camo", "30Rnd_556x45_Stanag"],["M4A1_HWS_GL_SD_Camo", "30Rnd_556x45_StanagSD"],["M4A1_RCO_GL", "30Rnd_556x45_Stanag"],["M4A1_Aim", "30Rnd_556x45_Stanag"],["M4A1_Aim_camo", "30Rnd_556x45_Stanag"],["M4A1_AIM_SD_camo", "30Rnd_556x45_StanagSD"],["Huntingrifle", "5x_22_LR_17_HMR"],["KSVK", "5Rnd_127x108_KSVK"],["M107", "10Rnd_127x99_m107"],["DMR", "20Rnd_762x51_DMR"],["M24", "5Rnd_762x51_M24"],["M40A3", "5Rnd_762x51_M24"],["M4SPR", "20Rnd_556x45_Stanag"],["SVD", "10Rnd_762x54_SVD"],["SVD_CAMO", "10Rnd_762x54_SVD"],["M8_sharpshooter", "30Rnd_556x45_G36"]]
};

fwouedd
05/07/2009, 22h04
Balles, Balles !

Bon, çà me perturbe l'histoire de l'addaction qui apparait chez l'acteur et chez la cible.
Alors je me demandais si en utilisant un truc du genre dans un nul= execVM nomdujoueur.sqf en ini chez nomdujoueur, l'action apparaitrait quand même chez le receveur de munitions :

nomdujoueur.sqf :

Removeallweapons u2;

This addWeapon "Binocular";
This addWeapon "NVGoggles";
This addWeapon "M16A4";
This addmagazine "20Rnd_556x45_Stanag";
This addmagazine "20Rnd_556x45_Stanag";
This addmagazine "20Rnd_556x45_Stanag";
This addMagazine "100Rnd_762x51_M240";
This addMagazine "100Rnd_762x51_M240";
This addMagazine "100Rnd_762x51_M240";

{_x moveincargo heli1} foreach units group this;

_weapon = "M240";
_listweap = weapons player;

_joueur = nearestObjects [player,["Man"], 5];
_joueur = _joueur select 1;

If ((_weapon in _listweap) and (Player distance _joueur < 6)) then
U2 addaction ["recharger le M240","rearm.sqf","", 0, false, true]];

Je suis sur qu'il y a une solution, le addaction soigner du medic n'apparait que chez le medic et pas chez le soigné.

Balles
06/07/2009, 01h08
Fwouedd, ça y est ça marche !!! Regarde l'heure on y était presque, j'ai pas mis de temps arpres que tu sois parti. Il "suffisait" de preciser qu'on etait pret du donneur et qu'on etait pas le donneur !

Si tu veux recuperer ça :
http://www.megaupload.com/?d=HXINPW0T

fwouedd
06/07/2009, 08h13
Ahah joli :)

Bon imaginons que je veuille faire le même mais allégé uniquement pour la M240. Est ce que ceci fonctionnerait ?

M240G.sqf :

If ((player distance donneur < 6) and player != donneur and local player ) then {player addmagazine mag; rearmer=false; publicvariable "rearmer240";};

rearm240.sqf :

_mag = "100Rnd_762x51_M240";
_listmag = magazines player;
_count = count (_listmag);
_count = _count - 1;
_count_mag = 0;
_i = 0;
Donneur = player;
Publicvariable "donneur";

_joueur = nearestObjects [player,["Man"], 5];
_joueur = _joueur select 1;

If ("M240" in (weapons _joueur) and (Player distance _joueur < 6)) then
{
for "_i" from 0 to _count do

{
if (mag == _listmag select _i) then {_count_mag = _count_mag + 1};
};

rearmer240=true;
publicvariable "rearmer240";
player removeMagazine mag;

_count_mag = _count_mag - 1;
if (_count_mag => 2) then {rok=true; publicvariable "rok"; joueur_rok=player; publicvariable "joueur_rok";};
if (_count_mag == 1) then {rwarning=true; publicvariable "rwarning"; joueur_rwarning=player; publicvariable "joueur_rwarning";};
if (_count_mag == 0) then {rwarning2=true; publicvariable "rwarning2"; joueur_rwarning2=player; publicvariable "joueur_rwarning2";};

Sleep 3;
}
Else
{
rnon=true; publicvariable "rnon"; joueur_rnon=player; publicvariable "joueur_rnon";
};

Init.sqf :

Rearmer240=false;
Rok=false;
Rwarning=false;
Rwarning2=false;
Rnon=false;


En parallèle, je modifie le ini de l'unité concernée avec rearm240.sqf et le déclencheur avec M240G.sqf.

En fait, je prends l'exemple du M240 mais je pense plutot à deux fois ce script pour faire deux addactions pour les deux types de missiles du SMAW (dont j'ai pas les ref sous la main). Et je veux vraiment deux actions différentes pour deux missiles différents ;)


Et j'ai trouvé un lien intéressant : http://forums.bistudio.com/showthread.php?t=74163&highlight=action

"_a1 = 0;
While{true} do
{
If(player == XO and player distance mytarget =< 5 and _a1 == 0)then
{
_action = player addaction ["AC Req","script.sqf"];
_a1 = 1;
};
If(player distance mytarget > 5 and _a1 == 1)then
{
Player removeaction _action;
_a1=0;
};
Sleep 1;
};"

Et

Try the new "condition" param of addAction.
MyVarShowAction = true;
Mytarget addAction ["AC Req", "script.sqf", [], 1, false, true, "", "(player == XO) && myVarShowAction"];
Then just set myVarShowAction to false to hide the action, assuming you don't want to remove it permanently. Your stated requirements are not very clear.


Si on ne peut pas supprimer l'action, il y a peut être moyen de ne pas l'afficher chez le gars qui se fait recharger non avec un truc du genre :

MyVarShowAction = true;
This addAction ["Recharger arme", "rearm.sqf", [], 1, false, true, "", "(player == donneur) && myVarShowAction"];


Ou un truc genre (genre hein, j'ai pas la pretention de savoir scripter ;) ) :
If player == _joueur Then
Player removeaction _action;

?

Balles
06/07/2009, 11h26
Oui tu peux faire un truc du genre pour ne recharger que la M240.
Pour le removeaction j'y avais pensé mais il n'empeche pas que l'action lorsqu'elle existe est visible de tous quand on approche. Cela ne fera que poser probleme car l'action une fois effectuee disparaitra, puis il faudra la faire reapparaitre, de nouveau visble par tous.

fwouedd
06/07/2009, 14h29
http://www.ofpec.com/forum/index.php?topic=2747.msg18998#msg18998

For the first question, the following code will add the action to a specific player and will be only available for him:

?(Player == MyGuy): MyGuy addaction["action","action.sqs"]

Je testerais ça ce soir.

fwouedd
06/07/2009, 20h38
Ah ouais mais en fait non.

C'est parfait Balles, ça marche du tonnerre et y'a plus 2 fois la commande "charger" qui apparait. Merci encore !

fwouedd
07/07/2009, 08h02
Bon, comme je le disais au dessus, tout fonctionne, mais j'essaye de limiter les receveurs de munitions et pour ce faire, j'utilise ceci dans le .sqf qui défini le matériel de u3:

MyVarShowAction = true;
U1 addAction ["recharger le M240","rearm240.sqf", [], 1, false, true, "", "(player == u3) && myVarShowAction"];

Donc être à coté d'u1 crée le addaction qui n'apparait que si je suis u3. (et pareil avec u2 vu que j'ai la même chose).


Mais si u1 se fait tuer et que u2 récupère sa M240, je l'ai dans le baba.
Quelqu'un aurait une idée pour que u1 laisse sa place a une variable qui englobe les utilisateurs de M240?

Ou alors, peut être la jouer différemment et ne faire apparaitre le addaction uniquement si la cible possède une M240.
D'enfin j'avoue que j'ai pas trop d'idée pour le déclencher.

Dans un script, est ce qu'un addaction marche comme ceci :

If ("M240" in (weapons _joueur) and (Player distance _joueur < 6)) then
{ player addaction ["recharger le M240","rearm240.sqf", [], 1, false, true, ""];
};[/I]
?

Balles
07/07/2009, 13h42
Le MyVarShowAction ne sert a rien s'il ne repasse pas a false à un moment. Le player == u3 dans la condition est util par contre et c'est bien ce qui fait qu'il n'y a pas de doublon quand on s'approche des autres donneurs.

Pour le fait de perdre la M240, ramassé par un autre, ça le fait beaucoup moins, il faudrait une boucle infinie qui verifie en permanence les armes des joueurs et ajoute l'action dans un tel cas mais ça fait beaucoup de travail pour le proc' tout le long de la mission et c'est pas vraiment conseillé.

Batto
07/07/2009, 13h46
Ya pas un système de trigger auto?
Comme ça, tu ne fais le test que quand quelqu'un ramasse une arme par exemple :o

Bon, j'ai jamais touché au scripting ArmA, hein donc je dis surement de la merde, mais bon ^_^

Balles
07/07/2009, 14h04
Tu ne dis pas de la merde Batto puisque ce que tu appelles trigger auto existe mais ça s'appelle des Event Handlers. Malheureusement il y en a peu et dans son cas il n'y a pas d'event handler quand on ramasse une arme.

Batto
07/07/2009, 14h14
:o
Et pas non plus une sorte de "inventory change" je suppose ? :p
Rah j'ai envie de m'y mettre, maintenant... Il existerait une sorte de tutorial/intro au scripting ArmA 2 ?

Balles
07/07/2009, 14h23
Des tutos y'en a plein, si tu veux t'y mettre, voici l'essentiel mais faut etre motivé !

Tuto sur la syntaxe des scripts : http://www.arma-fr.net/forum/index.php?showtopic=2014&mode=linear

Liste alphabetique des commandes a utiliser dans les scripts : http://community.bistudio.com/wiki/Category:Scripting_Commands_ArmA2

La meme liste mais classée par fonction : http://community.bistudio.com/wiki/Scripting_Commands_by_Functionality

Des sous categories utiles pour les scripts : http://community.bistudio.com/wiki/Category:Scripting_Topics

BON COURAGE !

fwouedd
07/07/2009, 14h33
Bon va falloir que je choisisse quelle solution garder :)

Pour l'assaut Team SMAW, c'est pas compliqué, c'est un groupe de deux avec deux addactions sur u2, une pour les HEAA, l'autre pour les HEDP.
Idem pour un groupe Sniper + observateur avec un seul addaction sur l'observateur (même si c'est pas dans mes objectifs à court terme).

Pour l'assaut Team M240 : un seul addaction pour les munitions mais je sais pas si je bloque l'addaction à l'u1 depuis u2 et u3 ou si je prends le script global.

Pour la FireTeam qui comporte une autre arme lourde et un assistant (donc porteur de munition) en plus d'un leader (M16 + lance grenade) et d'un autre fusilier, même soucis que pour la M240, je sais pas quoi choisir.

Moktar
07/07/2009, 17h35
Je ne sais pas où placer cette aide mais à l'époque d'ArmA I, j'avais trouvé ce guide particulièrement appréciable et didactique. De mémoire, il faut tout de même interpréter certains propos de l'auteur mais ça reste une bonne base : The Tuto en PDF (http://www.kronzky.info/docs/UberEditorTutorial.zip)

fwouedd
07/07/2009, 21h14
J'ai encore une question, je cherche mais j'arrive pas à trouver de solution :

En jeu, on peut voir dans certains modes de difficulté la classe du soldat, exemple "Spécialiste AT", comment modifier ce nom?

J'ai essayé d'ajouter dans son ini un displayname "assistant AT"; mais ça ne change rien.

fwouedd
08/07/2009, 14h16
Bon j'ai cherché, j'ai trouvé mais on ne peut visiblement le faire que par un mod qui doit être téléchargé par tous les joueurs.

C'est ballot.

(et je commence à être super blasé par certaines limitations qui me paraissent completement illogiques)

Moktar
08/07/2009, 14h48
Bon j'ai cherché, j'ai trouvé mais on ne peut visiblement le faire que par un mod qui doit être téléchargé par tous les joueurs.

C'est ballot.

(et je commence à être super blasé par certaines limitations qui me paraissent completement illogiques)


Sans vouloir faire mon trolleur, les choix de BIS sur ces aspects de scripts sont complètement à la rue et tout pourri. Ce n'est pas structuré, il n'y a pas de doc rigoureuse, ... Etc, c'est bidouille et compagnie. Pas étonnant que les missions bug vu le caca. Quand on voit la structure du scripting dans les jeux comme WoW, ça laisse rêveur.

Note: j'en ai fait la remarque à BIS sur leur fofo à l'époque de ArmA I, hein. Visiblement ils s'en foutent :(

fwouedd
08/07/2009, 15h06
Et j'en profite pour signaler qu'on ne peut pas synchroniser des waypoints si ils sont créés pendant une mission.

Bon techniquement, il y a une parade (merci le forum BIS) pour ce qui est de déclencher une extraction helico si on ne veux pas poser de waypoints (je veux éviter ce système pour les missions multi) :

- Un déclencheur BLUFOR / OPFOR présent qui déclenche un waypoint "charger" avec un "nomdel'Helicopter land "GET IN"" dans 'on act'.

- Un autre waypoint pour l'helico "se deplacer" juste à coté du "charger", il faut ajouter en condition :
((!alive unit1) OR (unit1 in helicopter)) AND ((!alive unit2) OR (unit2 in helicopter)) AND ((!alive unit3) OR (unit3 in helicopter)) AND ((!alive unit4) OR unit4 in helicopter) AND ((!alive unit5) OR (unit5 in helicopter)) AND ((!alive unit6) OR (unit6 in helicopter)) AND ((!alive unit7) OR (unit7 in helicopter)) AND ((!alive unit8) OR (unit8 in helicopter))

Faut modifier les unitx et helicopter par les noms que vous avez donné.

Et ensuite d'autres waypoints pour qu'il aille ou vous voulez avec son chargement.
Si il faut débarquer les troupes, j'utilise un "débarquer transport" avec un delai de 20sec min/moy/max par sécurité.

Je prends un hélico pour exemple mais ça marche avec n'importe quoi, faut juste penser à poser un marqueur d'insertion/extraction là ou le waypoint de l'IA arrive.

Balles
08/07/2009, 17h05
((!alive unit1) OR (unit1 in helicopter)) AND ((!alive unit2) OR (unit2 in helicopter)) AND ((!alive unit3) OR (unit3 in helicopter)) AND ((!alive unit4) OR unit4 in helicopter) AND ((!alive unit5) OR (unit5 in helicopter)) AND ((!alive unit6) OR (unit6 in helicopter)) AND ((!alive unit7) OR (unit7 in helicopter)) AND ((!alive unit8) OR (unit8 in helicopter))

Cela doit pouvoir s'ecrire :

{(!alive _x) OR (_x in helicopter)} foreach units <nom du groupe>

C'est mieux non ?! A tester tout de même.

fwouedd
08/07/2009, 17h06
Ah oui bien vu :)

( encore un truc que j'ai découvert : si on ajoute l'équipement d'un gars via un SQF autre que le INIT, ça déconne (on ne peut pas tirer, viser ou recharger avant de changer de perso ou d'appuyer sur echap ou F), alors que ça marche parfaitement par le INIT.sqf )

fwouedd
09/07/2009, 17h26
Balles, faudra qu'on teste le scripte de rearmement qui fonctionne d'après la liste en utilisant le truc de la showvarmachin en faisant un truc du genre :

Chez u2 :

MyVarShowAction = true;
U1 addAction ["recharger le M240","scripts\rearm240.sqf", [], 1, false, true, "", "(player == u2) && myVarShowAction"];
U3 addAction ["recharger le M240","scripts\rearm240.sqf", [], 1, false, true, "", "(player == u2) && myVarShowAction"];

Chez u1 :
U2 addAction ["recharger le M240","scripts\rearm240.sqf", [], 1, false, true, "", "(player == u1) && myVarShowAction"];
U3 addAction ["recharger le M240","scripts\rearm240.sqf", [], 1, false, true, "", "(player == u1) && myVarShowAction"];

Chez u3 :
U2 addAction ["recharger le M240","scripts\rearm240.sqf", [], 1, false, true, "", "(player == u3) && myVarShowAction"];
U1 addAction ["recharger le M240","scripts\rearm240.sqf", [], 1, false, true, "", "(player == u3) && myVarShowAction"];

J'ai l'impression que ça corrige bien le cumul des addactions.

Radis Noir
10/07/2009, 12h30
Est ce qu'il y aurait un moyen pour que le statut des indépendant change à un moment de la partie ? J'aurai besoin qu'il passe d'amis de tout le monde à amis de l'Ouest seulement. Y a un script qui pourrait regler ça ?

Balles
10/07/2009, 13h03
J'ai l'impression que ça corrige bien le cumul des addactions.

Oui comme dit plus haut le (player == u1) dans la condition fait que cela n'apparait que chez lui certainement par contre je ne vois pas l'utilité du myVarShowAction s'il ne repasse jamais a false, il est toujours sur true => sert a rien.


Est ce qu'il y aurait un moyen pour que le statut des indépendant change à un moment de la partie ? J'aurai besoin qu'il passe d'amis de tout le monde à amis de l'Ouest seulement. Y a un script qui pourrait regler ça ?

Je ne connais pas la reponse, mais je vais jeter un oeil et te dis si je trouve.

Edit : side1 setFriend [side2 , value] exemple dans OFP : East setFriend [Resistance, 0];

Tu pourrais donc faire :
West setFriend [independant, 1]; A tester
(je ne sais pas si independant correspond bien au nom du camp, a verifier. Pour cela tu mets un independant appelé i1 et tu fais hint format ["%1",side i1]; et le bon nom du camp va s'afficher)

Tyler Durden
10/07/2009, 19h49
Tiens vous auriez pas la solution à mon problème ? Je cherche un moyen de pouvoir respawner dans la peau des unités alliés à mes cotés pendant une mission créée.
Avec mes remerciements.

Balles
10/07/2009, 20h53
Pour activer le respawn dans une IA il faut mettre dans le description.ext :

Respawn = 4;
RespawnDelay = DelayInSeconds;

Sans IA tu deviendras un corbeau.

Plus de details ici : http://community.bistudio.com/wiki/Description.ext

Tyler Durden
10/07/2009, 20h59
Ouep je sais U et Y mais elles sont désactivés quand on créé une mission et qu'on l'exporte vers le multi.

Balles
10/07/2009, 21h06
Arf j'ai changé mon post au moment où tu postais, relis ma reponse au dessus de ton dernier post, j'ai trouvé.

Tyler Durden
10/07/2009, 21h09
Nickel;), tu m'as fait gagner beaucoup de temps, merci beaucoup !

Edit: Hm... Par contre je ne trouve pas le description.ext... Un tuyau ?

Balles
10/07/2009, 23h07
Crée le !

Tyler Durden
10/07/2009, 23h29
:|
Oui j'y ai pensé figure toi mais ça ne fonctionne pas.

Balles
11/07/2009, 02h08
Dans RespawnDelay = DelayInSeconds; tu as bien remplacé DelayInSeconds par une durée en seconde ?

Tyler Durden
11/07/2009, 13h16
Oui j'ai essayé.
J'ai essayé aussi d'autre manip pour tester et rien n'y fait ma mission ne lit pas le fichier description.ext ...

Edit: Bon j'ai tout essayé et je ne comprends pas ce qui merde... Je vais abandonner mon idée de recréer le débarquement, sans respawn dans d'autres soldats ce sera pas très fun à jouer...

fwouedd
17/07/2009, 15h10
Dites, j'aimerais qu'un waypoint créé dynamiquement lance la commande suivante (le urban patrol script) :

Nul=[this,"Alpha"] execVM "scripts\ups.sqf"

Comment je dois faire ?

Wp07 setWaypointStatements ["true","nul=[this,"Alpha"] execVM "scripts\ups.sqf""]; rien..
Wp07 setWaypointScript "scripts\ups.sqf, alpha"; rien non plus...

Au secours.

Moktar
17/07/2009, 15h32
Plusieurs pistes :



The Script has to use SQS-Syntax. selon le Wiki. Bon, est-ce vraiment la réalité ?

Wp07 setWaypointScript "scripts\ups.sqf alpha"; (pas de virgule avant alpha)

Wp07 setWaypointScript "ups.sqf alpha"; (si l'attachement va chercher systématiquement dans le répertoire script... J'en doute)

Le WP a déjà été triggué au moment où tu fais ton attachement ?



EDIT : Je suppose que Alpha est le nom du groupe. Vérifie l'ortho. Affiche le currentWaypoint pour savoir si ton WP est déjà passé (ou pas)

fwouedd
17/07/2009, 16h00
Justement non, le Alpha fait référence à la zone d'action du script. Et le waypoint est bien pris en compte (il modifie l'altitude de vol d'un hélico).

(Je vais essayer tes propositions : négatif, marche pas non plus)

Moktar
17/07/2009, 17h09
As-tu regardé dans le fichier de log pour voir s'il y avait une erreur ?
Es-tu sûr de faire l'attachement AVANT le passage par ce WP (désolé d'insister)
Essaies en remplaçant ton ups.sqf par un tout petit script "test.sqs" dans lequel tu fais juste un "hint" (pour vérifier que le soucis ne vient pas du format - SQS vs SQF)

EDIT: A mon avis c'est un pb de SQS vs SQF. Les scripts SQS doivent être démarrés par un exec alors que les SQF par un execVM (oui j'enfonce une porte ouverte). Comme la commande setWaypointScript impose un script SQS (cf doc) et non pas une commande en transparence, il va faire exec ups.sqf ... Ce qui n'est pas conforme. Ceci dit, le scripting à la mode BIS est tellement à chier que l'on peut avoir toutes les surprises du monde :ph34r:

(Tu nous fais le petit test dont j'ai parlé ? ;) )

Pymous
18/07/2009, 21h29
Hello les canards,

J'ai un problème tout bête,
J'ai un trigger que je voudrais activer si un ou plusieurs camions se trouve dans sa zone.
Alors lorsqu'il n'y a qu'un véhicule, ça peut marcher en groupant le trigger et le véhicule, mais mon problème c'est que je veux activer le trigger si CAMION1 OU CAMION2 OU CAMION3 etc... Se trouvent dans la zone du trigger. Comment faire?

Ca doit etre tout bete, mais je ne trouve pas la fonction. Y'a t'il d'ailleurs une liste des fonctions disponible quelque part?

Merci!

Radis Noir
19/07/2009, 12h51
Euh ouais c'est tout bete effectivement, je l'avais fait sur ArmA 1. Sauf que je rappelle plus comment :mouais:

J'ai dans l'idée que c'etait separé par des "or" mais je sais pas si c'est un souvenir ou une invention de mon esprit. Ouais, je te sers à rien je sais.

Pour la liste des scripts, c'est ici

http://community.bistudio.com/wiki/Category:Scripting_Commands_ArmA2

fwouedd
19/07/2009, 20h06
Activation : BLUFOR ou OPFOR (enfin le camp des camions..Ou carrément "n'importe qui" en fait)
Choisir : present et repetition
Dans condition : (Nomducamion in thislist) OR (nomducamion2 in thislist) OR (nomducamion3 in thislist) etc etc

Et ceci sans grouper le trigger, et ça marche. (par contre, ça ne marche pas si un des noms spécifiés n'existe pas dans la mission)

Pymous
19/07/2009, 21h07
Merci pour la liste Radis.
J'ai toujours pas trouvé en revanche pour mon petit problème :( (il manque plus que ça pour terminer la mission :p)

fwouedd
19/07/2009, 21h15
Y'a la solution dans mon message précédent ;)

Pymous
19/07/2009, 22h25
Excellent fwoued!!! :D
Merci beaucoup, dommage pour le fait que ça ne marche pas si les véhicules n'existent pas, j'ai du modifier un peu ma mission en conséquence mais ca marche! :D

fwouedd
19/07/2009, 23h01
Enfin si tu fais spawner les camions, tu peux alors faire spawner le trigger en même temps et ça devrait fonctionner en faisant un truc dans le genre :

Camiontrigger = createTrigger [(getMarkerPos "ct_mark") select 0,(getMarkerPos "ct_mark") select 1,0];
Camiontrigger setTriggerArea [100,100,0,False]; -> [X, Y, Angle, Form*]
Camiontrigger setTriggerActivation ["Anybody","Present", True]; -> Activation by West // Detected by East // Repeatedly
Camiontrigger setTriggerStatements [(Nomducamion in thislist) OR (nomducamion2 in thislist) OR (nomducamion3 in thislist),nul=[] execvm tonscript];

Faut créer un marqueur sans motif nommé ct_mark là ou le trigger doit apparaitre et ajouter le texte au dessus dans ton script qui fait spawn les camions.

(* : en rectangle si True)

Ah, Moktar, j'ai trouvé ce qui posait problème, l'exécuteur du script doit être le chef d'unité et non l'unité elle même. \o/

Pymous
19/07/2009, 23h16
Merci Fwouedd,

Au fait j'ai un enorme soucis, depuis que j'ai mis le Vop mod 2.1, y'a une erreur lorsque je test en ligne mes missions! Je crois avoir vu que tu avais réussi a resoudre le soucis en suppirmant une ligne quelque part?

C'est horrible, j'espere que je n'ai pas perdu tout ce temps xD

fwouedd
19/07/2009, 23h18
Ouvre le fichier mission.sqm avec un éditeur de texte et supprime la ligne vop_machin au début dans addOns[]= (enfin dans les 20 premières lignes) et ça marche.

Pymous
19/07/2009, 23h42
Merci! Ouf j'ai eu peur :)
Tout fonctionne a present!

Moktar
20/07/2009, 11h06
Ah, Moktar, j'ai trouvé ce qui posait problème, l'exécuteur du script doit être le chef d'unité et non l'unité elle même. \o/

Gniiii ? Le script est attaché au WP, je ne comprends pas ce que tu entends par là ? Peux-tu préciser stp ?
Serait-ce un pb du UPS ?
Peux-tu montrer la syntaxe utilisée, donc ?

Mirci :)

NOTE: Ca me démange de me remettre au scripting ArmA mais l'interface est tellement pourrave, bugguée, non documentée, bidouillesque que je résiste pour le moment. En fait il faudrait une bibliothèque de scripts élémentaires bien ficelés permettant de rendre des services de base. J'ai toujours eu la flemme de la pondre.

Quelqu'un peut-il me dire s'il est possible d'écrire dans le fichier de log d'ArmA ? Avec quelle instruction ? Perso, faire du debugging au jugé sans aucune trace me lourde. C'pas sérieux.

fwouedd
20/07/2009, 11h15
De tête ça donne ça :

Us1_wp1 setwaypointStatements [[us1_u1,Alpha1] execvm scripts\UPS.sqf];

Us1_u1 est l'unité 1 du groupe us1 et est leader du groupe et ça marche.
Par contre, rien ne fonctionne si j'utilise :

Us1_wp1 setwaypointStatements [[us1,Alpha1] execvm scripts\UPS.sqf];

Moktar
20/07/2009, 11h40
De tête ça donne ça :

Us1_wp1 setwaypointStatements [[us1_u1,Alpha1] execvm scripts\UPS.sqf];

Us1_u1 est l'unité 1 du groupe us1 et est leader du groupe et ça marche.
Par contre, rien ne fonctionne si j'utilise :

Us1_wp1 setwaypointStatements [[us1,Alpha1] execvm scripts\UPS.sqf];

Ah oui d'accord, c'est une contrainte de l'UPS (dommage qu'il ne contrôle pas ça ... C'est pourtant simple ...)

Par contre, ce n'est pas l'API de setwaypointStatements (http://community.bistudio.com/wiki/setWaypointStatements) :huh:

EDIT: plutôt
Us1_wp1 setWaypointScript "[us1_u1,Alpha1] execvm scripts\UPS.sqf";
Non ?

fwouedd
20/07/2009, 11h43
J'ai pas accès à mes fichiers là, ça doit être "true, nul=[us1,Alpha1] execvm scripts\UPS.sqf ".

Enfin un truc dans le genre :)

Moktar
20/07/2009, 11h50
J'ai pas accès à mes fichiers là, ça doit être "true, nul=[us1,Alpha1] execvm scripts\UPS.sqf ".

Enfin un truc dans le genre :)

Ok, je t'appellerai au secours quand je le mettrai en oeuvre ^_^
(Donc SetWaypointScript n'est pas adapté (dédié SQS alors ? )

Voodoonice
20/07/2009, 13h15
Quelle probabilité qu'un script d'Arma fonctionne sur Arma ? :ninja:

Balles
20/07/2009, 22h11
Quelle probabilité qu'un script d'Arma fonctionne sur Arma ? :ninja:

Lol 100% !

Sinon si tu voulais dire sur Arma2, ba tout dépend de ce qu'il y a dedans. C'est surtout les unités et références à des objets qui font que ton script ne fonctionnera pas. Si c'est que du code, et bien c'est la même chose (a 90% on va dire).

Voodoonice
21/07/2009, 09h41
Lol 100% !

Sinon si tu voulais dire sur Arma2, ba tout dépend de ce qu'il y a dedans. C'est surtout les unités et références à des objets qui font que ton script ne fonctionnera pas. Si c'est que du code, et bien c'est la même chose (a 90% on va dire).

^_^ j'au oublié le II :ph34r:


F_Repair =
{
_vec = (vehicle player);
_type = typeOf vehicle player;
if(getDammage _vec > 0 or fuel _vec < 0.98 and not (_vec isKindOf "Man")) then
{
_inrepairzone = ((_vec in list RZoneA) or (_vec in list RZoneB) or (_vec in list RZoneC) or (_vec in list RZoneD));
if(_inrepairzone and _vec != player and speed _vec > -2 and speed _vec < 2 and position _vec select 2 < 2.0 and (local _vec)) then
{

titleText ["Servicing", "PLAIN DOWN",0.3];
for [{_loop2=0}, {_loop2<1}, {_loop2=_loop2}] do
{
sleep 0.200;
if (getDammage _vec > 0) then {_vec setDammage ((getDammage _vec)-0.0125);};
if (Fuel _vec < 1) then {_vec setFuel ((Fuel _vec)+0.0125);};
if (getDammage _vec == 0 and Fuel _vec == 1) then {_loop2=1;};
if(_vec != vehicle player or speed _vec < -2 or speed _vec > 2 or position _vec select 2 > 2.0) then {_loop2=1;titleText [localize "EVO_015", "PLAIN DOWN",0.3];};
};
_vec setVehicleAmmo 1;
};
};
};


For [{_loop=0}, {_loop<1}, {_loop=_loop}] do
{
[] call F_Repair;
sleep 1.011;
};

Je pensais à ce genre de script :unsure:

Moktar
21/07/2009, 10h50
Ca doit continuer à fonctionner.

Pourquoi faire des boucles for qui ne tournent qu'une fois ? Ca me paraît inutile.

Les commentaires dans le code sont bien pratique pour "dire ce que l'on fait et faire ce que l'on dit" ;)

Voodoonice
21/07/2009, 11h14
Ce script n'est pas de moi ;) je cherchais ce genre de script (refuel, rearm and repair) pour qu'il fonctionne sur "H" visible avec un trigger. Problème il ne fonctionne que lorsque les dégâts sont trop important


/ This script rearms, refuels, and repairs vehicles.
// Vehicles must be less than height 2 (typically landed, if air vehicles) and must remain in the
// trigger area for 3 seconds. It then drains all fuel, repairs, rearms, and refuels.
//
// Setup a trigger area to activate this (F3 in map editor) with the following settings:
//
// Trigger REPEATEDLY, BLUFOR, PRESENT
// Name: Rearmlist
// Condition: this;
// Activation: {[_x] execVM "rearm.sqf"} foreach thislist;
//
// Warning: If this trigger area overlaps another trigger area (such as ammo-transport Scripts), sometimes
// things don't work as planned. Keep this seperate if you can.

_unit = _this select 0;

// Don't start the script until the unit is below a height of 2, and make sure they hold that
// height for at least 3 seconds.
WaitUntil{(getPos _unit select 2)<2};
Sleep 3;
If((getPos _unit select 2)>2 || not (_unit in list Rearmlist)) exitWith{};

_unit setFuel 0;
_unit VehicleChat "Repairing...";
Sleep 15;
_unit setDammage 0;
_unit VehicleChat "Rearming...";
Sleep 10;
_unit setVehicleAmmo 1;
_unit VehicleChat "Refueling...";
Sleep 5;
_unit setFuel 1;
_unit VehicleChat "Finished.";

If(true) exitWith{};
Pour que ça réarme et refasse le plein sans qu'il soit besoin de réparer il faut que je modifie unit setFuel 0, unit setVehicleAmmo 1 ? :unsure:

Moktar
21/07/2009, 11h33
Ce n'est plus le même script n'est-ce pas ? :)

Dans le premier script, l'idée était de faire le plein (la réparation) de façon progressive (d'où la boucle FOR con con ... J'ai compris en relisant)

Là, le script met tout à zéro et inhibe les "damages", réarme et refait le plein. C'est un script "tout ou rien" (comparativement au précédent) mais il n'y a pas de condition SI "pas besoin" alors je passe au suivant.

Tu ne veux pas qu'il répare ? Vire les lignes :


_unit VehicleChat "Repairing...";
Sleep 15;
_unit setDammage 0;


Mais bon, je ne suis pas sûr de comprendre vraiment ce que tu veux faire :huh:

Voodoonice
21/07/2009, 11h43
Non c'est autre script ;)
En fait j'ai l'impression que si il y a pas besoin de réparation il ne faisait ni le plein ni le réarmement. Ce que je voudrais c'est que si par exemple il n'y a pas besoin de réparation qui fasse quand même le plein d'arme et d'essence ;)

Moktar
21/07/2009, 11h56
Là il fait tout à partir du moment où le véhicule est bien en place pendant 3 secondes (pour les appareils volants).

C'est bûcheron et il n'y a pas de contrôles. Par exemple si tu viens à pied sur cette zone, eh bien le script (via le trigger) va appliquer la même chose, c'est à dire refuel, rearm, repair. Pas très propre :p

Voodoonice
21/07/2009, 16h10
Donc tu pense que le premier est plus adapté ? :unsure:

Moktar
21/07/2009, 17h03
Boooaaarf, disons que dans le premier il y a une tentative de contrôles mais il fait référence à des "objets" codés en dur (RZoneXX) : SAIMAL et c'est globalement codé avec les pieds (à mon sens) :ph34r:

Dans le second c'est un peu plus brutal sans progression sur le refuel ni le repair mais beaucoup plus simple. Manque des contrôles pour éviter de faire des refuel sur de l'infanterie par exemple.

Globalement c'est assez laid :XD:

Voodoonice
21/07/2009, 17h06
Bon à refaire alors, merci Moktar ;)

Moktar
21/07/2009, 17h16
J'ai cru lire que dans les EVO (je ne sais toujours pas ce que représentent les EVO par rapport aux Domi) des scripts de repair/refuel/rearm étaient développés. Il suffirait de déPBOiser ( :p ) et d'aller piocher dedans pour en refaire une base propre.

Lorsque j'ai scripté sur ArmA I, je me suis tellement fait ch*%@ avec le manque de scripts/services sur ArmA que j'ai eu l'intention de développer une bibliothèque de base offrant des service généraux. Ca manque cruellement mais bon la tâche est trop importante compte tenu des moyens de développement/debugging apportés par BIS... J'arrête là sinon je vais encore les maudire

Voodoonice
21/07/2009, 17h21
J'ai cru lire que dans les EVO (je ne sais toujours pas ce que représentent les EVO par rapport aux Domi) des scripts de repair/refuel/rearm étaient développés. Il suffirait de déPBOiser ( :p ) et d'aller piocher dedans pour en refaire une base propre.
J'y pense mais bon, je voulais essayer d'en faire un moi ^_^


Lorsque j'ai scripté sur ArmA I, je me suis tellement fait ch*%@ avec le manque de scripts/services sur ArmA que j'ai eu l'intention de développer une bibliothèque de base offrant des service généraux. Ca manque cruellement mais bon la tâche est trop importante compte tenu des moyens de développement/debugging apportés par BIS... J'arrête là sinon je vais encore les maudire

Domage :emo:

Xx The Ice xX
22/07/2009, 23h20
Salut a tous,
J'aimerais si possible créer une barriere animé, je m'explique:
-Lorsque un allié au camp controlant la barrière se trouve proche (de 2 à 5m environ), la barrière s'ouvre, et lorsque l'unité est passé, elle revienne à l'origine donc férmée.
Je sais qu'il faut que j'utilise this animate ["bargate",1] pour qu'elle se ferme, et this animate ["bargate",0] pour qu'elle s'ouvre, mais après je suis perdu....

Merci d'avance pour votre aide.

Voodoonice
23/07/2009, 00h51
Moi je dirais de mettre un Trigger, présence, blufor ou redfor et répétition pour déclencher le script :unsure:

Moktar
23/07/2009, 01h07
Je ne l'écris pas mais un peu comme Voodoo :
Trigger, avec presence sur le type (civil, blufor, ... Etc) :
OnActivation (Entrée dans la zone) on lève
OnDeactivation (sortie de la zone) on baisse
En répétition bien sûr Voodoo ;)

EDIT: En réfléchissant 2 secondes, je me dis que si deux gars entrent dans la zone, et qu'un seul sort, la barrière se referme. Il faut donc un truc un peu plus "sioux" mais bon easy quand même hein : vérifier sur l'événement OnDeact qu'il n'y a plus personne sur le trigger, sinon attendre le prochain événement.

Voodoonice
23/07/2009, 01h41
EDIT: En réfléchissant 2 secondes, je me dis que si deux gars entrent dans la zone, et qu'un seul sort, la barrière se referme. Il faut donc un truc un peu plus "sioux" mais bon easy quand même hein : vérifier sur l'événement OnDeact qu'il n'y a plus personne sur le trigger, sinon attendre le prochain événement.

Même si il n'y a plus qu'un gars sur la zone, le trigger le détecte et donc la barrière reste ouverte non ?

Moktar
23/07/2009, 02h16
Même si il n'y a plus qu'un gars sur la zone, le trigger le détecte et donc la barrière reste ouverte non ?
Nop, c'est événementiel. Ce sont les transitions qui sont "trigguées". L'événement n'est pas : "Je suis sur la zone" mais "J'entre dans la zone".

Une fois l'événement "Entrée dans la zone" capturé, si un autre événement "Entrée dans la zone" survient, ça ne va pas ouvrir deux fois plus grand la barrière. Le second événement ne va pas avoir d'incidence. Par contre dès la sortie du premier gars, paf, événement "Sortie de la zone" et action en conséquence (=> fermeture de la barrière). Oui mais celui qui est resté sur place ? Le trigger ne va pas inhiber cet événement de toutes façons.

Si on me montre le contraire, je m'en coupe une mfff non soyons prudent et raisonnable quand même. J'ai quand même eu beaucoup d'emmerdes avec les bugs BIS... Genre un WP inhibé !

EDIT: Voilà, je me félicite d'avoir été prudent :rolleyes: Un trigger n'est pas redéclenché tant qu'il n'est pas retombé. Sur un trigger de type "Presence", l'événement est fired lorsque le premier gars/véhicule entre dans la zone mais si un second entre, il ne se passe rien. Dans la situation où deux personnages sont dans la zone du trigger, lorsque le premier sort de cette zone, il n'y a pas d'événement "OnDeact", c'est uniquement lorsqu'il n'y a plus personne que cet événement est fired.

Voodoonice
23/07/2009, 12h24
Moktar, qu'est-ce que tu pense de celui là ?


while {(true)} do {
{
if (not (_x isKindOf "Man") and (count crew _x != 0) and (speed _x < 1) and (speed _x > -1) and (getPos _x select 2 < 1)) then {
_x setVehicleAmmo 1;

while {(count crew _x != 0) and ((damage _x > 0) or (fuel _x < 0.99)) and (speed _x < 1) and (speed _x > -1) and (getPos _x select 2 < 1)} do {
if (damage _x > 0) then {
_x setDamage ((damage _x) - 0.01);
};

if (fuel _x < 1) then {
_x setFuel ((fuel _x) + 0.01);
};

sleep 0.1;
};
};
} forEach list _this;

sleep 1;
};

Pymous
23/07/2009, 12h40
Pour ceux qui rigolaient de voir des 100 aines de parachutistes (ou plutot de parachutes vides) dans mes missions, et ben ça vient pas de moi!, c'est un bug connu apparemment:

http://forums.bistudio.com/showthread.php?t=81180

:XD:

Moktar
23/07/2009, 15h04
Moktar, qu'est-ce que tu pense de celui là ?


while {(true)} do {
{
if (not (_x isKindOf "Man") and (count crew _x != 0) and (speed _x < 1) and (speed _x > -1) and (getPos _x select 2 < 1)) then {
_x setVehicleAmmo 1;

while {(count crew _x != 0) and ((damage _x > 0) or (fuel _x < 0.99)) and (speed _x < 1) and (speed _x > -1) and (getPos _x select 2 < 1)} do {
if (damage _x > 0) then {
_x setDamage ((damage _x) - 0.01);
};

if (fuel _x < 1) then {
_x setFuel ((fuel _x) + 0.01);
};

sleep 0.1;
};
};
} forEach list _this;

sleep 1;
};


Bravo Voodoonice, on sent un soin apporté à la mise en forme (indentation) et aux contrôles.

Petites remarques générales :

- Eviter les ';' inutiles, sur les fermetures d'accolades par exemple, à moins que je dise une grosse bêtise, n'hésitez pas à me jeter des pierres.

- Ajouter des commentaires AVANT chaque ligne de code (ou bloc) afin de décrire le fonctionnement souhaité. Sur un petit script isolé, c'pas nécessaire mais dès que l'on en écrit quelque-uns il est toujours pénible de devoir se replonger dans l'algo pour corriger/ajouter une feature. Du commentaire, du commentaire, du commentaire.

- Ajouter des en-têtes aux fichiers décrivant le service rendu et la façon de s'en servir (nécessite un trigger, paramètres au script, domaine d'application, limitations ... Etc). Dans l'idéal, maintenir un historique des modifications et des versions.

Maintenant sur l'algo de ton script (fonction pour BIS mais on ne va pas chipoter) :

La boucle while la plus haute est inutile voire introduit un fonctionnement non souhaité. Comment sors-tu de cette boucle infinie ? Elle n'est pas nécessaire puisque l'idée (sauf erreur) est de traiter tous les véhicules passés en paramètre.
(Peux-tu donner un exemple d'appel d'ailleurs, stp ? ).

Pourquoi contrôler le nombre de crew ? Je n'en ressens pas le besoin. On peut imaginer que le gars arrive seul avec son véhicule sur le trigger (trigger appelant ce script), qu'il sorte du véhicule pour aller lui-même réarmer ou je-ne-sais-quoi, et lorsqu'il revient, hop son véhicule est prêt. Dans ton script tu obliges la présence d'un membre d'équipage. Pas utile je pense, non ?

Voilà mes premiers commentaires. Gogogo Voodoo ;)

EDIT: hannn oui je crois comprendre la raison de ce while { true } ... Bon, il va falloir que je teste ces algos...
A mon avis, mieux vaut ne pas faire une boucle forEach mais j'ai un doute quant à l'usage de ce script avec un trigger.

EDIT2: En considérant que ce script est utilisé avec un trigger, je me demande vraiment si deux véhicules entrent sur la zone du trigger en même temps, est-ce qu'il y a bien deux événements fired ? Si tel est le cas, il ne faut pas utiliser le forEach, dans le cas contraire, c'est plus délicat. De toutes façons, c'est délicat en fait.

Moktar
24/07/2009, 18h01
Hop, je fais un peu de suivi sur le besoin exprimé par Voodoo. Ne voyant pas de solution propre au principe de Rearm/Repair/Refuel, j'ai fouillé dans les grosses mission BIS (comme une EVO) et voici ce que j'ai trouvé. Je ne trouve pas ça du tout propre d'ailleurs. J'ai commenté les différentes lignes en bleu pour apporter une "explication" à ce que l'auteur a développé ... Vu que personne ne commente son code ... Houuu houu houuuu.

L'idée n'est pas de faire le beau parce-que-je-connais-la-syntaxe mais plutôt d'illustrer et pourquoi pas, apporter un peu de pédagogie aux méthodes de développement introduites par BIS. C'tout pourri de toutes façons :ninja:




// Nom de la fonction
BIS_EVO_Repair =
{
// _vec décrit le véhicule dans lequel le joueur se trouve
// Si le joueur arrive sans véhicule, _vec décrit le joueur lui-même
_vec = (vehicle player);

// _type est inutilisé, donc OSEF... BIS laisse traîner du code mort
_type = typeOf vehicle player;

// Si _vec est endommagé OU son réservoir non plein ET que _vec n'est PAS un fantassin alors on entre dans le bloc ci-dessous.
// NOTE: Pour plus de performance, il faudrait d'abord tester que _vec n'est PAS un fantassin.
if(getDammage _vec > 0 or fuel _vec < 0.98 and not (_vec isKindOf "Man")) then
{
// Ok, si on arrive ici c'est que _vec est bien un véhicule ET qu'il faut le réparer OU faire le plein (ou les deux)
// Du code en commentaire
//_inrepairzone = ((_vec in list AirportIn) or (_vec in list farp1) or (_vec in list farp2) or (_vec in list farp3) or (_vec in list reng1) or (_vec in list reng2) or (_vec in list reng3) or (_vec in list reng4) or (_vec in list dock1));

// Ici, une succession de tests pour savoir si _vec est dans la zone des triggers nommés (AirportIn OU farp1 OU ... Etc)
// ET des conditions sur l'immobilité et l'altitude du véhicule. En clair il faut que le véhicule soit quasiment arrêté ou bien à une altitude de 2m pour entrer dans le bloc du IF
if(((_vec in list AirportIn) or (_vec in list farp1) or (_vec in list farp2) or (_vec in list farp3) or (_vec in list reng1) or (_vec in list reng2) or (_vec in list reng3) or (_vec in list reng4) or (_vec in list dock1)) and _vec != player and speed _vec > -2 and speed _vec < 2 and position _vec select 2 < 2.0 and (local _vec)) then
{

// Ok, si nous somme ici c'est que le véhicule est arrêté ou considéré comme tel.
// On affiche au milieu de l'écran une information (?? Je ne sais pas laquelle). C'est une info qui est récupérée de la "stringtable" permettant ainsi d'avoir un message en fonction de la langue
titleText [localize "STR_M04t83", "PLAIN DOWN",0.3];

// Début d'une boucle infinie
for [{_loop2=0}, {_loop2<1}, {_loop2=_loop2}] do
{
// Attente de 0.2 secondes
sleep 0.200;

// Si _vec est toujours endommagé, alors on lui retire un peu de ces dommages (réparations progressives)
if (getDammage _vec > 0) then {_vec setDammage ((getDammage _vec)-0.0125);};

// Même principe avec le carburant
if (Fuel _vec < 1) then {_vec setFuel ((Fuel _vec)+0.0125);};

// Dès que _vec est réparé ET que le plein est fait, la variable _loop2 est fixé à 1 ce qui mettra fin à la boucle dite infinie
if (getDammage _vec == 0 and Fuel _vec == 1) then {_loop2=1;};

// Si le véhicule bouge/s'écarte, alors on affiche une information à l'écran et la boucle "infinie" va se terminer
if(_vec != vehicle player or speed _vec < -2 or speed _vec > 2 or position _vec select 2 > 2.0) then {_loop2=1;titleText [localize "STR_M04t84", "PLAIN DOWN",0.3];};

// Du code inutilisé (des restes de debugging)
_dam = (getDammage _vec)*100;
_ful = (Fuel _vec)*100;
//hint format["Damage: %1\nFuel: %2",Round _dam,Round _ful];

// Fin du bloc de la boucle "infinie", on se rebranche au début (de la boucle) sauf si la condition _loop2=1 a été placée. Dans ce cas, on va juste en dessous

};

// C'est ici que l'on se branchera à la sortie de la boucle
// On fait le plein d'armes
_vec setVehicleAmmo 1;

// Si on arrive ici, la fonction va se terminer
};
};
};



Maintenant comment est appelé cette fonction BIS_EVO_Repair ? Voir ci-dessous :




Une boucle infinie.
For [{_loop=0}, {_loop<1}, {_loop=_loop}] do
{
// Une attente de 1.011 secondes (...)
sleep 1.011;

// Oooh notre fonction est appelée (sans paramètre)(...)
[] call BIS_EVO_Repair;

// Encore une attente (...)
sleep 1.011;

// Un autre appel de fonction sur condition. OSEF ce n'est pas le sujet
if (score player != _tscore and alive player) then {[] call BIS_EVO_Rank};

// Un autre appel de fonction sur condition. OSEF ce n'est pas le sujet
if (BIS_EVO_MissionProgress > _currentprog) then {[] call BIS_EVO_CityClear};

// Encore une attente puis un appel à une autre fonction(...)
sleep 1.011;
[] call BIS_EVO_CTime;

// Encore une attente puis un appel à une autre fonction(...)
sleep 1.011;
[] call BIS_EVO_HPM;

// Fin du bloc "boucle infinie" donc hop, on repart au début de la boucle et on recommence

};


En clair "notre fonction" enfin celle qui nous intéresse, sera appelée toutes les 4.44 secondes... On appelle ça du polling : SAIMAL B)

De plus, les triggers ne sont utilisés que pour leur "surface de détection". Ils ne déclenchent rien sur le sujet. Bon pourquoi pas.

Voodoonice
24/07/2009, 22h52
Super boulot, voilà ce qui me (nous ?) manque pour réellement progresser, les commentaires des fonctions :wub:

fwouedd
26/07/2009, 20h00
Balles, aurais tu la possibilité de me faire passer ta mission ou il fallait interroger un civil?

J'essaye désespérément de comprendre comment fonctionne le système de conversation mais je ne m'en sors pas.

Pour contourner le problème, je suis passer par des addaction, mais je me retrouve avec un civil qui communique sur le globalchat ou le sidechat, hors bon, il n'a pas de radio ;)

misa
02/08/2009, 03h36
Petite requette personnelle :

J'aimerais savoir ton script pour prendre et déposer une caisse comme dans le traitre balles. J'ai tenté en vain de copier/coller ce que tu avais fait mais la caisse bug enfin bref.. Need your help ! :emo:

Sinon j'ai essayé de piqué le script de build mash et build mgnest de norrin :rolleyes: mais sans succes, quelqu'un aurait les capacités pour créer un mini script permettant à une unité donné de faire la même chose version light et simple ?

J'en demande beaucoup je sais ^_^

Balles
02/08/2009, 10h42
Balles, aurais tu la possibilité de me faire passer ta mission ou il fallait interroger un civil?

J'essaye désespérément de comprendre comment fonctionne le système de conversation mais je ne m'en sors pas.

Pour contourner le problème, je suis passer par des addaction, mais je me retrouve avec un civil qui communique sur le globalchat ou le sidechat, hors bon, il n'a pas de radio ;)

Désolé de la réponse tardive. Pour interroger le civil j'avais effectivement utilisé un addaction tout bête. Rien de special.

Dans le init du PNJ :



Nom_de_l'action = nom_du_PNJ addAction ["conversation", "fichier.sqf", nom_du_PNJ];


Puis, dans le fichier de l'action qui sera forcément en local pour celui qui a déclenché l'action tu mets le message



_nom_du_PNJ = _this select 3; //tu récupères le PNJ qui a l'action de parler
Nom_du_PNJ sidechat "blabla"; //tu le fais parler et comme on est en local il ne parlera qu'a celui qui declenche l'action


Ça fait un moment que j'ai pas mis le nez dans les scripts mais rien de compliqué ici, Je ne sais pas si ça répond bien à ta question.
Ce n'est pas vraiment une conversation, juste un message en réponse à l'action, rien de plus.
Mais tu peux faire plusieurs messages de suite comme une conversation entre les 2 en te servant de player, tu mets un sleep 1; puis le messages du player : player sidechat "blabla" en réponse et tu peux enchainer les dialogues prédéfinis. Si tu as mis des variables suivants certains événements, tu peux prédéfinir en effet plusieurs dialogues différents suivants ces événements.

Balles
02/08/2009, 11h00
Petite requette personnelle :

J'aimerais savoir ton script pour prendre et déposer une caisse comme dans le traitre balles. J'ai tenté en vain de copier/coller ce que tu avais fait mais la caisse bug enfin bref.. Need your help ! :emo:

Comment prendre et déposer un objet qu'on peut ensuite reprendre :

Si tu as ma mission Le Traitre, il te faut l'action dans le init de la caisse et les 3 fichiers sqf : mort.sqf, poser.sqf et prendre.sqf.

Détail :

Dans l'init de l'objet :



Prendre_caisse = this addAction ["Prendre la caisse", "prendre.sqf"];
// je met l'action visible pour tous dans le menu des actions



prendre.sqf :



// Local car ce fichier sera toujours executé chez celui qui déclenche l'action

_caisse = _this select 0;
//je récupère l'argument, en l'occurence l'objet caisse

_caisse attachTo [player,[0,-1,1.3]];
//j'attache l'objet au joueur

player removeAction prendre_caisse;
//j'enlève l'action de prendre l'objet du menu action
poser_caisse = player addAction ["poser la caisse","poser.sqf",_caisse];
// j'ajoute l'action de pouvoir poser l'objet

// J'ajoute un trigger qui fait appel à mort.sqf si le joueur qui est attaché à l'objet meurt :
_trg=createTrigger["EmptyDetector",getPos player];
_trg setTriggerArea[1,1,0,false];
_trg setTriggerActivation["NONE","PRESENT",true];
_trg setTriggerStatements["not alive player", "nul = [] execVM 'mort.sqf'; hint 'La caisse est tombee par terre.'", ""];


mort.sqf :



_caisse = _this select 3;
// je récupère encore mon objet qui est en argument (dans un addaction l'argument est positionné en select 3 parce qu'il y a un select 2, le nom de l'action en fait qui est invisble)

Detach _caisse;
//je détache l'objet du joueur qui est mort

Prendre_caisse = _caisse addAction ["prendre la caisse", "prendre.sqf", _caisse];
// je remet l'action prendre l'objet disponible dans le menu action


Poser.sqf :



// Local parce qu'on est toujours chez le joueur qui possède l'objet

_caisse = _this select 3;
// je récupère mon objet qui est en argument

Detach _caisse;
//je détache l'objet du joueur

Player removeAction poser_caisse;
//j'enlève l'action de poser l'objet du menu action

Prendre_caisse = player addAction ["prendre la caisse", "prendre.sqf", _caisse];
// je remet l'action prendre l'objet disponible dans le menu action

// ici je met une variable dont je ne me servirai pas, vestige d'une autre mission,
//mais qui pourais servir à déclencher un trigger qui signifie à tout le monde que l'objet a été posé
Poser = true;
Publicvariable "poser";


Voilà c'est tout, avec ça tu peux prendre et poser un objet.

N'oublie pas que tout ça se passe en local chez le joueur qui prend ou pose l'objet, si tu souhaites mettre des messages ou autre pour tous, il faut passer par des variables, les rendre publiques avec PubliVariable "ma_variable", et ajouter des triggers qui mettent des messages au moment où ces variables changent.

misa
02/08/2009, 12h21
Merci chef ;)

Llyd
02/08/2009, 12h28
Je suis en train de bosser sur un script de bombardement aérien, avec spawn des avions, passage basse altitude, "carpet bombing" et de-spawn des avions.

Ça marche pas mal, mais le spawn d'avions est bien pourri, en mode "en vol", ils sont toujours orientés au nord, c'est tout un merdier pour les orienter correctement.

Edit: ayé c'est fini ! Ça marche du feu de dieu, sauf que bon... Les avions qui popent en vol se crashent forcement donc faut les faire dépop (avec le problème d'orientation, le script les "lance" comme une grosse catapulte). Ah et par exemple, si je crée un SU34 et qu'il doit déclencher un trigger OPFOR, ca marche pas.

Quelqu'un aurait une condition pour les triggers du genre "Si bombardier_1 dans la zone, alors déclenchement" ?


Je raffine le script et je poste avec explications.
Sources: http://www.armaholic.com/page.php?id=3115 et http://www.armaholic.com/page.php?id=6554

Balles
02/08/2009, 13h49
Quelqu'un aurait une condition pour les triggers du genre "Si bombardier_1 dans la zone, alors déclenchement" ?


Bombardier_1 in thislist

Dans la condition du trigger.

misa
05/08/2009, 19h43
Pour ceux qui veulente un script pour construire un nid de mitrailleuse façon Domination :

Dans l'init de l'unité (ici appelé Builder):


Construire = This Addaction
["Construire","mgnest.sqf",[player],6,true,true,"","player == builder"];

Notre fichier mgnest.sqf



//On Crée une animation pour simuler la construction
Player playMove "AinvPknlMstpSlayWrflDnon_medic";
//la construction prendra 10 secondes
Sleep 10;
//On crée 2 m devant notre bonhomme le petit nid de mitrailleuse
_Nest = "Fort_Nest_M240" createVehicle ([(getPos player select 0),(getpos player select 1 )+2]);player moveInGunner _Nest;Player RemoveAction Construire;


Et voilà !

Radis Noir
08/08/2009, 13h04
Hem hem, là je me sens un peu con-con, mais j'ai completement oublié comment on mettait en place un declencheur qui se, bah, declenchait quand l'ennemi (Opfor ici) avait été éliminé d'une zone. Une commande que j'ai du utiliser un millier de fois depuis OFP, mais là, c'est le trou.

Je sais que je pourrai nommer les squads et faire not alive truc and not alive... Mais vu le nombre de petits groupe, ça me tue d'avance. En plus ça m'empeche de dormir ce truc tout bete. Merci les gars.

Balles
08/08/2009, 13h32
Si c'est tous les opfor de la map :

- OPFOR
- Not Present

Si c'est un groupe de opfor :

Tu synchronise le leader de ton groupe au declencheur.

- Tous les membres du groupe (ça s'appelle pas comme ça mais je sais plus) à la place de vehicule
- Not Present

Radis Noir
08/08/2009, 15h30
Ahah, j'avais pas vu l'option "Absent".
Ca marche, merci vieux.

misa
09/08/2009, 16h40
J'ai un probleme avec mon script de construction :

//On Crée une animation pour simuler la construction
Player playMove "AinvPknlMstpSlayWrflDnon_medic";
//son
PlaySound "campbuild";
// Construction 8 secondes
Sleep 8;
//On crée 2 m devant notre bonhomme le petit nid de mitrailleuse
Campbleu = ["cityBase04", 0, getpos player] execVM "Createcomposition.sqf";_facemg = getDir player;Campbleu setDir _facemg;player RemoveAction Construire;
_markerbleu = createMarker ["Respawn_west", position player ];
_markerbleu setMarkerShape "ICON";
"Respawn_west" setMarkerType "DOT";
"Respawn_west" setMarkerColor "ColorBlue";
"Respawn_west" setMarkerText "Respawn Bleu";
Hint "Base Activee";
Builder RemoveAction Respawn;

J'ai l'impression que le removeaction bug ou je sais pas.

Edit: il fallait rajouter @ScriptDone Campbleu apres le Campbleu = ["cityBase04", 0, getpos player] execVM "Createcomposition.sqf"

Radis Noir
15/08/2009, 10h58
Bon, je reviens toujours plus fort avec DEUX problèmes. Décidément la nouveauté et moi, on est pas copain.

Le premier, pour faire apparaitre de nouveaux objectifs, je regrette mon vieux "hidden". J'ai vu ça sur le wiki de l'ado


Pour avoir des objectifs qui apparaissent aux fur et à mesure dans la mission, il vous suffira de créer un autre fichier .sqf avec les objectifs que vous voulez

Ouais ok, mais sous quelle forme ? Juste un fichier avec dedans


obj3 = player createSimpleTask["Enculez le lievre"];
Obj3 setSimpleTaskDescription["Enculez le lievre ! <br/><br/>Trouvez le <marker name='m_obj3'>lievre</marker> avant qu'il ne vous trouve ! Faites lui sa fete ! Et ne vous mettez JAMAIS à genoux !", "Enculez le lievre", "Enculez le lievre"];
Obj3 setSimpleTaskDestination (getMarkerPos "m_obj3")

J'imagine qu'il faut rajouter un truc precisant que c'est caché. Et donc, comment je fais pour le relier à mon declencheur ? Et j'ecris quoi dans mon declencheur ?


Et ensuite, second probleme.
Je veux du revive, parce que c'est le bien. Sauf que j'ai aucune idée de comment ça marche. J'ai mis les deux modules en rapport avec les soins pres de mes escouades, et ils sont groupés au squad leader. Ca je l'ai fait au hasard, mais j'ai aucune idée de si c'est comme ça qu'il faut faire ou pas. Et j'ai pas trop l'impression, parce que bien sur, j'ai testé, et que mes mecs, ils crevent, mais ils se tordent pas de douleur par terre en attendant qu'on leur masse les seins, et ça, c'est pas cool.
Donc, on fait comment ?

Merci les canetons.

Balles
15/08/2009, 12h41
J'imagine qu'il faut rajouter un truc precisant que c'est caché. Et donc, comment je fais pour le relier à mon declencheur ? Et j'ecris quoi dans mon declencheur ?

Pour cacher un marqueur, 2 solutions :

- 1ère - type du marqueur:

Pour cacher ton marqueur : crée le vide (par défaut) et donne lui un nom
Ou bien pour le faire disparaitre"nom_du_marqueur" setMarkerType "empty"
Pour le faire apparaitre : "nom_du_marqueur" setMarkerType "objective" (par exemple)

- 2ème - changer l'alpha

Tu crées le marqueur comme tu voudrais qu'il appraisse
Puis tu le caches avec : "nom_du_marqueur" setMarkerAlpha 0;
Il réapparaît avec : "nom_du_marqueur" setMarkerAlpha 1;


Pour le déclencheur, sur activation, tu executes le script en question avec la commande :
nul = [] execVM "script.sqf";
Où script.sqf est le script où tu crées l'objectif comme dans l'exemple que tu as donné (rajoute un message qui s'affichera pour tout le monde dans ce fichier pour dire qu'il y a un nouvel objectif). Mais ceci te crée un objectif dans le briefing, ce n'est pas nécessaire (je trouve). Un marqueur visible sur la map + un message pour le signaler suffit à mon avis.

Moi je ferai juste :
- créer un marqueur
- le cacher (1ère ou 2ème solution peu importe)
- déclencheur, sur activation : faire apparaitre le marqueur + message (pas besoin de fichier).
Mais tu peux en plus rajouter le fichier pour que l'objectif apparaisse dans le briefing et l'éxécuter.




Et ensuite, second probleme.
Je veux du revive, parce que c'est le bien. Sauf que j'ai aucune idée de comment ça marche. J'ai mis les deux modules en rapport avec les soins pres de mes escouades, et ils sont groupés au squad leader. Ca je l'ai fait au hasard, mais j'ai aucune idée de si c'est comme ça qu'il faut faire ou pas. Et j'ai pas trop l'impression, parce que bien sur, j'ai testé, et que mes mecs, ils crevent, mais ils se tordent pas de douleur par terre en attendant qu'on leur masse les seins, et ça, c'est pas cool.
Donc, on fait comment ?

Merci les canetons.
Il faut simplement mettre les 3 modules de soins et les synchroniser (et non les grouper) au chef de groupe.

Balles
08/09/2009, 16h18
Resolution d'un bug de script :

Le bug : lorsqu'on est obligé d'appuyer sur F (changement mode de tir) après un removeallweapons ou un script de sauvegarde des armes. (il est pénible ce bug !)

Solution :

- mettre un gamelogic (objet) dans l'editeur et donnez lui un nom.

- dans le script : une fois redonné une arme et un magazine, mettez un "sleep" pour attendre que le joueur est bien son arme en main (ça met quelques secondes en général)
Puis mettez le code suivant :
Nom_du_gamelogic action ["SWITCHMAGAZINE", player, player, 5];

Le_CuLtO
16/09/2009, 16h27
Pour ceux qui rigolaient de voir des 100 aines de parachutistes (ou plutot de parachutes vides) dans mes missions, et ben ça vient pas de moi!, c'est un bug connu apparemment:

http://forums.bistudio.com/showthread.php?t=81180

:XD:

Désolé de te décevoir mais ça vient de toi.
Quand on crée des missions multijoueur et qu'on fait des scripts dedans, il faut prendre en compte la notion de localité.
Exemple:
Tu place un déclencheur disant à chaque unité d'un hélico de s'éjecter, si la condition de ce déclencheur pour s'éjecter est simplement l'arrivée de l'hélico dans sa zone, ben elle est remplie chez tout le monde (serveur + clients) ce qui implique que le nombre d'éjections est multiplié par le nombre de joueur (+1 pour le serveur). Il faut donc faire en sorte que cette condition soit remplie chez une seule machine (l'idéal étant le serveur) donc il suffit de rajouter en condition supplémentaire isServer.
Ca peut paraitre prise de tête au début mais tout jeu multi fonctionne comme ça. De même dans ArmA il y a des commandes qui sont globales (exécutées partout quand on l'exécute sur une machine) et d'autres locales (exécutées seulement sur la machine qui la lance) et heureusement car ce serait con un menu qui s'affiche chez tout le monde alors que seulement un joueur l'a demandé ou inversement un objet qui se crée uniquement chez le joueur qui l'a créé. Enfin voilà si tu veux appronfondir la chose il existe tout plein de tutos sur le net

ATP
16/09/2009, 16h39
..Enfin voilà si tu veux appronfondir la chose il existe tout plein de tutos sur le netPas mal de ressources sont déjà centralisée sur ce topic (http://forum.canardpc.com/showthread.php?t=37234).

Tyler Durden
08/07/2010, 18h51
Il y a un moyen pour que les civils soient considérés comme hostile par les autres factions ?

misa
08/07/2010, 18h59
Il y a un moyen pour que les civils soient considérés comme hostile par les autres factions ?

tu met un chef de groupe Indep,bluefor ou opfor , tu met probabilité présence 0 et voilà tes civils font partie d'une faction qui sera considéré comme ennemi par les factions de ton choix.

Tyler Durden
08/07/2010, 19h40
tu met un chef de groupe Indep,bluefor ou opfor , tu met probabilité présence 0 et voilà tes civils font partie d'une faction qui sera considéré comme ennemi par les factions de ton choix.

Nickel, c'est vraiment pas con !