bon en retard mais vieux motard que jamais comme on dit !
Vous remarquerez que les cris lancés n'ont rien à voir avec la réalité (
I_WAS_DISTURBED, etc... ).. Après avoir réfléchis sur 36 façon de transmettre l'identité du voleur aux autres PNJs qui inter agissent avec l'acte criminel, j'ai décidé de le faire crier par le joueur... c'est plus simple pour le récupérer (
GetLastSpeaker() ) et je n'ai pas pris la peine de les modifier
donc voici la fonction que j'utilise pour voir si le vol est détecté
int GetDetectVol (object oVoleur, object oTargetgard)
{
int iDetect = FALSE;
int iSpot = GetSkillRank (SKILL_SPOT, oTargetgard) + GetAbilityModifier (ABILITY_WISDOM, oTargetgard); // détection + SAG
int iPickPocket = GetSkillRank (SKILL_SLEIGHT_OF_HAND, oVoleur) + GetAbilityModifier (ABILITY_DEXTERITY, oTargetgard); // escamotage + DEX
if (GetSkillRank (SKILL_BLUFF, oVoleur) >= 5) iPickPocket = iPickPocket + 2; // +2 si le voleur à un rang 5 en bluff
// modificateurs selon la distance
float fDist = GetDistanceBetween (oVoleur, oTargetgard);
if (fDist > 20.0f) iSpot = iSpot -3;
else if (fDist > 15.0f) iSpot = iSpot - 2;
else if (fDist > 10.0f) iSpot = iSpot - 1;
iint iJetVoleur = d20()+iPickPocket;
int iJetgard = d20()+iSpot;
if (iJetVoleur < iJetgard) iDetect = TRUE;
else if (iJetVoleur == iJetgard)
{
if (GetSkillRank (SKILL_SLEIGHT_OF_HAND, oVoleur) > GetSkillRank (SKILL_SPOT, oTargetgard)) iDetect = TRUE ; //si les jets sont identiques, le meilleur rang gagne
else if (GetSkillRank (SKILL_SLEIGHT_OF_HAND, oVoleur) == GetSkillRank (SKILL_SPOT, oTargetgard)) iDetect = GetStealthDetect (oVoleur, oTargetgard); // si les rangs sont identiques on refait un jet
}
return iDetect;
le code que j'ai mis dans le OnAcquire du module, je regarde la variable STEAL sur le PNJ
object oItem = GetModuleItemAcquired();
object oGive = GetModuleItemAcquiredFrom ();
if (GetLocalInt (oGive, "STEAL") == TRUE)
{
object oTake = GetModuleItemAcquiredBy ();
// si le passant détecte le vol, il réagira et criera au voleur
AssignCommand (oTake, SpeakString("SHOUT_DISTURB", TALKVOLUME_SILENT_TALK));
}
Le code mis dans le OnDisturb du PNJ qui se fait voler.
Ce code n'étant lancé que s'il détecte le vol, il n'y a pas de test effectué
AssignCommand (oTarget, SpeakString("I_WAS_DISTURBED", TALKVOLUME_SILENT_TALK));
AssignCommand (oTarget, SpeakString("I_WAS_DISTURBED"));
int irand = Random (3);
{
if (irand == 0)AssignCommand (OBJECT_SELF, SpeakString("AU VOLEUR ! AU VOLEUR !"));
else if (irand == 1)AssignCommand (OBJECT_SELF,SpeakString("Saleté de... ! AU VOLEUR !"));
else if (irand == 2)AssignCommand (OBJECT_SELF,SpeakString("mais... Hey ! vous ! AU VOLEUR !"));
irand = Random (6);
AssignCommand (OBJECT_SELF,ClearAllActions());
if (irand == 4) AssignCommand (OBJECT_SELF,ActionAttack(oTarget));
else AssignCommand (OBJECT_SELF,ActionMoveAwayFromObject(oTarget, TRUE));
}
le code que j'ai mis sur les garde, dans l'event OnDial
void main()
{
int nHeard = GetListenPatternNumber();
object oSpeaker = GetLastSpeaker();
if (nHeard == -1)
{
BeginConversation();
}
else
{
object oVoleur;
int iRand;
if(GetIsObjectValid(oSpeaker))
{
switch(nHeard)
{
// un vol détecté ou attaque
case 1:
{
if(!GetIsEnemy (oSpeaker))
{
oVoleur = GetLocalObject (oSpeaker, "voleur");
iRand = Random (4);
if (iRand == 0) SpeakString ("Au nom de Torm !");
else if (iRand == 1) SpeakString ("Tu vas voir sale bouseux!");
else if (iRand == 2) SpeakString ("Hey toi là bas !");
else if (iRand == 3) SpeakString ("Tu vas le payer !");
ClearAllActions();
ActionAttack (oVoleur);
}
break;
}
// vol non détecté
case 2:
{
oVoleur = GetLocalObject (oSpeaker, "voleur");
if ((!GetIsEnemy (oSpeaker))&&(GetDetectVol (oVoleur, OBJECT_SELF)))
{
iRand = Random (4);
if (iRand == 0) SpeakString ("Au nom de Torm ! Sale voleur !");
else if (iRand == 1) SpeakString ("Toi là bas ! Tu vas voir sale bouseux!");
else if (iRand == 2) SpeakString ("Hey toi là bas ! Arrête ! ");
else if (iRand == 3) SpeakString ("Au nom de Lomann ! Arrête toi !");
ClearAllActions();
ActionAttack (oVoleur);
}
break;
}
// une attaque
case 3:
{
if (!GetIsEnemy (oSpeaker))
{
iRand = Random (4);
if (iRand == 0) SpeakString ("Au nom de Torm !");
else if (iRand == 1) SpeakString ("Tu vas voir sale bouseux!");
else if (iRand == 2) SpeakString ("A moi la garde !");
else if (iRand == 3) SpeakString ("Tu vas le payer !");
ClearAllActions();
ActionAttack (oVoleur);
}
break;
}
}
}
}
}
et j'ai rajouté ça dans leur script de Spawn, afin qu'ils détectent les cris
SetListenPattern(OBJECT_SELF, "I_WAS_DISTURBED",1); // vol détecté
SetListenPattern(OBJECT_SELF, "SHOUT_DISTURBED",2); // vol non détecté
SetListenPattern(OBJECT_SELF, "NW_I_WAS_ATTACKED",3); // une attaque
SetListening(OBJECT_SELF,TRUE);