Bonjour !
Je fais appel a la communauté parce que je suis en train de scripter un système de catapultes/balistes qui tirent automatiquement.
Toutes les secondes, le script ci dessous va être exécuté sur le plaçable "catapulte" et va sélectionner la cible valide la plus proche de la catapulte (je vais peut être changer ça, parce que ça doit être gourmand ^^ ).
le truc c'est que j'aimerais qu'il ne recherche des cibles que dans un cône devant lui (ce qui est logique, un baliste ne tire pas en arrière...)
Dans le script j'ai volontairement mis SHAPE_SPHERE comme zone de recherche, mais c'est juste parce que je n'ai pas encore trouvé comment faire le cône...
J'en viens au problème que je rencontre :
si je met SHAPE_CONE (au lieu de SHAPE_SPHERE), la recherche se fera dans une sphère autour de la catapulte (apparemment, c'est pas certain)
Si je met SHAPE_SPELLCONE, la recherche se fera bien dans un cône, mais toujours orienté vers l'est de la zone...
C'est peut être tout simple (je ne connais pas encore tous les trucs de l'éditeur ^^)
si c'est encore une fonction buggée ou quelque chose comme ça (ça ne m'étonnerais pas...), y a t'il moyen de faire avec un calcul d'angle?
je pense à quelque chose du genre "si angle entre catapulte-oPC et heading catapulte >= 30° ==> cible invalide"
Voila une partie du script OnUserDefined :
//==========>Partie permettant de trouver une cible et de lui tirer dessus
if(!GetLocalInt(OBJECT_SELF, "nRecharge"))//Si la catapulte a rechargé
{
//On prend l'ennemu le plus proche de la catapulte
object oCible = OBJECT_INVALID;
float fPlusPetiteDistance = fPorteeMax;
oPC = GetFirstObjectInShape(SHAPE_SPHERE, fPorteeMax, GetLocation(OBJECT_SELF));
while(GetIsObjectValid(oPC))
{
float fDistance = GetDistanceToObject(oPC);
object oJournal = GetItemPossessedBy(oPC, "journalNODROP");
if( GetIsReactionTypeHostile(oPC, OBJECT_SELF) //Il faut que la cible soit hostile par rapport a la faction de la catapulte
&& !GetLocalInt(oJournal, "nAbriteCatapultes") //Il faut pas que la cible soit abritée
&& !GetIsDead(oPC) //Il faut que la cible soit vivante
&& fDistance >= fPorteeMin //Il faut que la cible soit a plus de fPorteeMin de la catapulte
&& fDistance <= fPlusPetiteDistance) //Il faut que la cible soit plus près que la dernière
{
oCible = oPC;
fPlusPetiteDistance = fDistance;
}
oPC = GetNextObjectInShape(SHAPE_SPHERE, fPorteeMax, GetLocation(OBJECT_SELF));
}
//Lancement de la pierre
if(oCible != OBJECT_INVALID) //Si une cible valide a été trouvée
{
//On tire
ActionCastSpellAtLocation(TIR_CATAPULTE, GetLocation(oCible), METAMAGIC_ANY, TRUE, 0, PROJECTILE_PATH_TYPE_DEFAULT, FALSE);
//On note l'auteur du tir
SetLocalObject(OBJECT_SELF, "oTireur", oPC);
//Rechargement de la catapulte : elle ne peut tirer que si nPareATirer == 1
SetLocalInt(OBJECT_SELF, "nRecharge", 1);
float fRdmTps = IntToFloat(Random(5));//entre 0 et 4
DelayCommand((fRechargement-2) + fRdmTps, SetLocalInt(OBJECT_SELF, "nRecharge", 0));
}
}
Merci d'avance de vos réponses

(si tout marche a merveille, ça finira peut être sur le vault, qui sait? ^^)