Bienvenue sur JeuxOnLine - MMO, MMORPG et MOBA !
Les sites de JeuxOnLine...
 

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

Script marchand défend ses coffres

Par judgeju le 3/7/2002 à 11:28:33 (#1749654)

J'ai récupéré ce script qui fait que normalement si un PJ est vu en train de piquer un truc dans un coffre, le marchand à côté l'attaque.
Deux choses:
1. Mon marchand attaque pas??? Bah pquoi? Faut lui mettre une arme? Il a une dague en inventaire, mais rien en main.
2. Je voudrais que la première fois, le marchand prévienne les PJs. Style, si je vous revois faire çà, çà va barder. Et la seconde qu'il attaque. Comment faire aussi pour qu'après le marchand ne veuille plus rien vendre à ce PJ? Est ce que la réputation joue?
Merci d'avance.

void main()
{
// Initialize Objects
object oChest = OBJECT_SELF;
object oPlayer = GetLastDisturbed();
object oMerchant = GetNearestObjectByTag("MERCHANT");
// Get the skill checks to see if the Merchant spotted the theft.
int iPPSkillCheck = d20(1) + 1 + GetSkillRank(SKILL_PICK_POCKET, oPlayer);
// The Merchant has a +2 circumstance bonus to spot.
int iSpotCheck = d20(1) + 3 + GetSkillRank(SKILL_SPOT, oMerchant);
// Make a text string to display to the Player.
string sSkillCheck = "Pick Pocket " + IntToString(iPPSkillCheck) + " vs Spot " + IntToString(iSpotCheck);
if (iPPSkillCheck > iSpotCheck)
{
// Theft not spotted.
FloatingTextStringOnCreature(sSkillCheck + " - Success!", oPlayer);
// Slightly worsen the rep with Merchants
AdjustReputation(oPlayer, oChest, -5);
return;
}
else
{
// Theft was spotted.
FloatingTextStringOnCreature(sSkillCheck + " - Failed!", oPlayer);
// Give the Player a bad rep with Merchants
// and instruct the Merchant to attack the player.
AdjustReputation(oPlayer, oChest, -20);
AssignCommand(oMerchant, ActionAttack(oPlayer));
}
}

Par ZeDuckMaster le 3/7/2002 à 12:46:25 (#1750070)

en ce qui concerne deja le fait que ca marche pas :
- est-ce que le marchand a le bon tag ?
- est-ce que t'as un success ou un failed quand tu crochete le coffre ? pasque si t'as un success c'est normal qu'il t'attaque pas

Par judgeju le 3/7/2002 à 13:23:32 (#1750292)

c'était effectivement un pb de tag.
Par contre, maintenant, il s'enfuit dès qu'il prend des dommages??? On peut pas lui dire de continuer à se battre?

Par ZeDuckMaster le 3/7/2002 à 13:31:37 (#1750347)

ah bin la, ca devient un poil plus compliqué :

le fait qu'il s'enfuit doit etre directement defini dans son comportement de marchand (bin vi, un marchand c'est pas un warrior, donc quand il se prend des coups, il se casse ;) ) donc dans les scripts par defaut du marchand.

donc la faut aller bidouiller dans les scripts par defaut du marchand et donc eviter qu'il s'enfuit. Ca doit se trouver dans le script de l'evenement OnAttacked (ou un truc du genre), mais pas sur (je l'ai pas sous les yeux, la ....).

Par judgeju le 3/7/2002 à 14:01:49 (#1750535)

Pfu, c'est dur... Bon, j'ai revu le script et ajouté quelques options:
Je veux utiliser une variable pour faire changer la réaction du marchand. Pb, ben il rentre pas dans ma boucle if avec come test Reac_Marchand == 0. J'ai mal déclaré?
En plus, je subodore que çà marchera pas vu que ma variable sera réinitialisée à 0 à chaque fois. Donc comment la déclarer englobal, et même mieux, l'affecter à un PJ donné?

void main()
{
// Initialize Objects
int Reac_Marchand = 0;
object oChest = OBJECT_SELF;
object oPlayer = GetLastDisturbed();
object oMerchant = GetNearestObjectByTag("MERCHANT");
// Get the skill checks to see if the Merchant spotted the theft.
int iPPSkillCheck = d20(1) + 1 + GetSkillRank(SKILL_PICK_POCKET, oPlayer);
// The Merchant has a +2 circumstance bonus to spot.
int iSpotCheck = d20(1) + 3 + GetSkillRank(SKILL_SPOT, oMerchant);
// Make a text string to display to the Player.
string sSkillCheck = "Pick Pocket " + IntToString(iPPSkillCheck) + " vs Spot " + IntToString(iSpotCheck);
if (iPPSkillCheck > iSpotCheck)
{
// Theft not spotted.
FloatingTextStringOnCreature(sSkillCheck + " - Succes!", oPlayer);
// Slightly worsen the rep with Merchants
AdjustReputation(oPlayer, oChest, -5);
return;
}
else
{
// Theft was spotted.
FloatingTextStringOnCreature(sSkillCheck + " - Echec!", oPlayer);
// Give the Player a bad rep with Merchants
// and instruct the Merchant to attack the player.
AdjustReputation(oPlayer, oChest, -20);
//Premire fois avertissement, deuxime attaque
if (Reac_Marchand == 0)
{
AssignCommand(oMerchant,ActionSpeakString("He la! Que je ne vous y reprenne pas!"));
Reac_Marchand=Reac_Marchand+1;
return;
}
else
{
AssignCommand(oMerchant,ActionEquipMostDamagingMelee());
AssignCommand(oMerchant, ActionAttack(oPlayer));
}
}
}

Par ZeDuckMaster le 3/7/2002 à 14:34:54 (#1750720)

tu fais un ptit SetLocalInt(OBJECT_SELF,"REACTION",0); sur l'evenement OnSpawn du pnj (histoire de lui assigner une ptite variable qu'il va transporter avec lui ;) ), et apres tu fais un ptit GetLocalInt dans ta fonction pour recuperer la valeur et eventuellement la modifier suivant les cas.

sinon tu fais directement ton getlocalint en test dans ta fonction (par defaut si la variable n'existe pas ca te renvoit 0) et pis tu la crée apres au cas ou elle existe pas, mais elle n'existera pas tant que tu n'auras pas lancer ton script au moins une fois.

Par judgeju le 3/7/2002 à 15:03:23 (#1750890)

Besoin d'éclaircissement:
Je met mon oMerchant en variable du GetLocalInt?
GetLocalInt me renvoie la valeur de la variable. Comment la modifier?

Par ZeDuckMaster le 3/7/2002 à 15:12:51 (#1750959)

bon on va faire simple, on va directement creer cette variable local au pnj dans ta fonction :


.........
//Premire fois avertissement, deuxime attaque
if(GetLocalInt(OBJECT_SELF,"Reac_Marchand") == 0)
{
AssignCommand(oMerchant,ActionSpeakString("He la! Que je ne vous y reprenne pas!"));
SetLocalInt(OBJECT_SELF,"Reac_Marchand",1);
return; //<- le return ne sert a rien la ....
}
else
{
AssignCommand(oMerchant,ActionEquipMostDamagingMelee());
AssignCommand(oMerchant, ActionAttack(oPlayer));
}
........


voila :) normalement ca devrait marcher (sauf si j'ai fait une faute :D )

Par judgeju le 3/7/2002 à 15:44:21 (#1751148)

Super, çà marche nickel chrome.
Merci monsieur! :ange:
Bon, j'améliore un peu tout çà et je le posterai en script qui marche. En fait, c'est sympa, on peut l'affecter à toutes les armoires, coffres... pour que leur proprio réagisse quand on les fouillent. Cool.

JOL Archives 1.0.1
@ JOL / JeuxOnLine