Bien voilà, je veux appliquer à certaines armes une restriction d'utilisation, liée à la force du personnage.
En effet, dans un soucis de réalisme, on imagine mal un magicien gringalet bander un arc fait en bois de fer.
Pour ce faire, j'ai d'abord ajouté un petit bout de script dans le "OnPlayerEquipItem" ça donne ça :
#include "x2_inc_switches"
#include "x2_inc_intweapon"
void main()
{
object oItem = GetPCItemLastEquipped();
object oPC = GetPCItemLastEquippedBy();
int nForce = GetAbilityScore( oPC, ABILITY_STRENGTH, FALSE);
// -------------------------------------------------------------------------
// Intelligent Weapon System
// -------------------------------------------------------------------------
if (GetTag(oItem) == "CO_ARC_004" && nForce < 14)
// si le dernier objet equipe porte le tag et si le joueur a moins de 14 en force
{
ExecuteScript("co_arc_penality", oPC);// on execute ce script
}
if (IPGetIsIntelligentWeapon(oItem))
{
IWSetIntelligentWeaponEquipped(oPC,oItem);
// prevent players from reequipping their weapon in
if (IWGetIsInIntelligentWeaponConversation(oPC))
{
object oConv = GetLocalObject(oPC,"X2_O_INTWEAPON_SPIRIT");
IWEndIntelligentWeaponConversation(oConv, oPC);
}
else
{
//------------------------------------------------------------------
// Trigger Drain Health Event
//------------------------------------------------------------------
if (GetLocalInt(oPC,"X2_L_ENSERRIC_ASKED_Q3")==1)
{
ExecuteScript ("x2_ens_dodrain",oPC);
}
else
{
IWPlayRandomEquipComment(oPC,oItem);
}
}
}
// -------------------------------------------------------------------------
// Generic Item Script Execution Code
// If MODULE_SWITCH_EXECUTE_TAGBASED_SCRIPTS is set to TRUE on the module,
// it will execute a script that has the same name as the item's tag
// inside this script you can manage scripts for all events by checking against
// GetUserDefinedItemEventNumber(). See x2_it_example.nss
// -------------------------------------------------------------------------
if (GetModuleSwitchValue(MODULE_SWITCH_ENABLE_TAGBASED_SCRIPTS) == TRUE)
{
SetUserDefinedItemEventNumber(X2_ITEM_EVENT_EQUIP);
int nRet = ExecuteScriptAndReturnInt(GetUserDefinedItemEventScriptName(oItem),OBJECT_SELF);
if (nRet == X2_EXECUTE_SCRIPT_END)
{
return;
}
}
}
Bon, jusque là, pas de problème. C'est après que ça se gâte, car il semble que la fonction "ActionUnequipItem" présente un dysfonctionnement :
void main()
{
object oPC = OBJECT_SELF; // on recupere le PC (porteur du script)
object oArc = GetPCItemLastEquipped(); // on recupere le dernier objet equipe par le perso
SendMessageToPC(oPC, "Vous n'avez pas assez de force pour utiliser cet arc."); // on envoi ce message au joueur
ActionUnequipItem(oArc); // on desequipe oArc
}
Ce qu-il se passe, c'est que l'arc est bien déséquipé dans l'inventaire, mais le perso garde l'arc en main. Pire que ça, si le perso attaque quelque chose, il va au contact et utilise l'arc pour se battre, même sans munitions !!
Le résultat est le même si on utilise en plus la fonction "AssignCommand".
Pouvez-vous m'aider ?