Limiter l'usage d'une arme par une vaeur de carac. Besoin d'aide

Répondre
Partager Rechercher
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 :

Code PHP:

#include "x2_inc_switches"
#include "x2_inc_intweapon"
void main()
{
    
object oItem GetPCItemLastEquipped();
    
object oPC   GetPCItemLastEquippedBy();
    
int nForce GetAbilityScoreoPCABILITY_STRENGTHFALSE);
    
// -------------------------------------------------------------------------
    // 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(oConvoPC);
        }
        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 :

Code PHP:

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 ?
Wink
Drôle de bug... je ne suis pas sûr que le GetPCItemLastEquipped() fonctionne en dehors du script onEquiped
Deux solutions

1-

Pourquoi ne mets-tu pas directement l'instruction directement dans le "if" ?

Cela donnerait:
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
{
ActionUnequipItem(oItem);
SendMessageToPC(oPC,"Vous n'avez pas assez de force pour utiliser cette arme");
}


2-
Dans ton deuxième script, tu remplaces le "oArc=GetPCLastEquipped();" par "oArc=
GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oPC);"

Là, ça devrait marcher.

Le probleme que tu rencontre avec l'arme qui est senssée etre deéquipée et qui pourtant reste en main, je l'ai deja rencontré dans un cas similaire sur lequel je bossais, sauf que c'etait pour diversifier les types de munitions suivant les armes (histoire de ne pas tirer de rocket avec un fusil d'assaut ou une arme de poing par exemple )

L'arme ou les munitions qui se deequipent avec la fonction ActionUnequipItem ont tendance à presenter le meme bug que toi.
Je n'ai malheureusement pas trouvé de solution.
Une solution serai de vérifier, à intervalles réguliers, l'inventaire des armes portées (dans le OnHeartBeat du module par exemple), et déséquiper le PJ si l'arme n'est pas conforme aux propriétés souhaitées. Même si dans la réalité, le PJ est capable de porter l'arme en question.

Une autre solution serai d'ajouter des propriétés sur l'arme en question que le PJ ne possède pas, et qui empêcherai le PJ de porter l'arme. Puis retirer les propriétés, le cas échéant, pour que le PJ puisse de nouveau porter l'arme (commandes AddItemProperty et RemoveItemProperty).
Je m'avance peut-être pour ces commandes, ce ne sont peut-être pas celles-là, mais elles semblent correspondre à cette idée.
Je viens de voir comment j'ai fait pour mettre une limitation de Classe et de niveau pour des armes sur notre mod (en gros, pour qu'une arme soit limitée à Paladin 12 ème niveau par exemple).

Pour faire déséquiper l'arme, j'ai placé l'instruction suivante dans le onEquipped:

DelayCommand(1.0,AssignCommand(oPC,ActionUnequipItem(oItem)));

Je crois me rappeler que la ruse est dans le DelayCommand. Sans cela, cela buggait (je ne me rappelle plus la nature du bug mais il est possible que cela soit celui cité plus haut). L'idée est de laisser le temps au PJ de s'équiper (une seconde suffit) et de le déséquiper dans la foulée.

Chez moi, ça marche nickel.
C'est exact, Aliken ! Je viens d'arriver à la même conclusion. En fait le codage semble fonctionner comme un grafcet, c'est à dire une seule action à la fois. Donc comme on envoi déjà un message, on doit décaler dans le temps l'action qui déséquipe l'arme, sinon bug.

Merci à tous pour votre aide
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés