Savoir si le PJ possède une arme

Répondre
Partager Rechercher
Hello !

Je cherche le moyen de savoir si le joueur possède une arme, équipée ou non.

Voilà mon script qui, naturellement ne fonctionne pas.

Code PHP:


int StartingConditional
()
{
object armed=GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,GetFirstPC());
object armeg=GetItemInSlot(INVENTORY_SLOT_LEFTHAND,GetFirstPC());
if (
armed == OBJECT_INVALID && armeg == OBJECT_INVALID)
    {
    
ActionEquipMostDamagingMelee(OBJECT_INVALID,FALSE);
    
object armesup=GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,GetFirstPC());
    
ActionUnequipItem(armesup);
    if (
armesup == OBJECT_INVALID)
        {
        return 
FALSE;
        }
    else return 
TRUE;
    }
else return 
TRUE;

Voilà, c'est une condition d'exécution dans un dialogue: si le pj possède une arme, la phrase s'affiche.

C'est où que ça merde ?? Siou plaîîîît...
Code PHP:

int StartingConditionnal()
{
object oRight=GetItemInSlot(INVENTORY_SLOT_RIGHTHANDGetPCSpeaker());
object oLeft=GetItemInSlot(INVENTORY_SLOT_LEFTHANDGetPCSPeaker());

if (
GetIsObjectValid(oRight) || GetIsObjectValid (oLeft)) return FALSE;

object oItem=GetFirstItemInInventory(GetPCSpeaker());

while (
GetIsObjectValid(oItem)
{
    
int nType=GetBaseItemType(oItem)
    switch (
nType)
    {
        case 
0: return FALSE;
        case 
1: return FALSE;
        case 
2: return FALSE;
        
//on continue comme ca en verifiant si pour chaque type c'est une arme ou pas    
    
}
    
oItem=GetNextObjectInInventory(GetPCSpeaker());
}

C'est du bidouillage, si ca se trouve y a un truc beaucoup plus rapide que j'ai pas vu
D'accord, j'ai compris.

Enfin je suppose qu'il faut remplacer case 0 par BASE_ITEM_BASTARDSWORD par ex et ainsi de suite...

Mais est-ce que les baseItemTypes correspondront si je fais le test sur des objets personnalisés qui se trouvent être des armes ??

En tous cas merci je vais essayer ça ce soir et j'aurai ma réponse je pense.

Ps : Pour toi c'est du bidouillage vite fait en 2 minutes mais pour moi c'est le fruit (verreux) d'une longue journée de vaine réflexion...
Par bidouillage j'entends un truc pas spécialement optimisé ou propre

Sinon non c'est pas la peine de remplacer, si tu fous BASE_ITEM_BLALABLA il va aller regarder a quoi ca correspond, donc autant lui mettre le chiffre direct

D'ailleurs c'est dommage que toutes les armes se suivent pas dans la liste, sinon on aurait pu s'en sortir avec juste un if nType < xx
Un objet personalisable qui n'a pas comme base item un des base_item_* des armes ne pourra pas être équipé comme une arme, non ?
Et est ce que tu considères comme arme les batons, les sceptres et autres outils du magiciens, de l'ensorceleur, ... ?
Si j'ai bien compris :
nType 0 = BASE_ITEM_AMULET
nType 1 = BASE_ITEM_ARMOR
nType 2 = BASE_ITEM_ARROW
etc...dans l'ordre alphabétique des BASE_ITEM, c'est bien ça ?

En tous cas hier soir j'ai fait des essais, et en fait il est inutile de faire le test sur la main gauche car:
- si le joueur possède une arme c'est dans la main droite
- si le joueur possède une arme à 2 mains, c'est dans la main droite aussi
- si le joueur possède 2 armes, il en a forcément une dans la main droite
- il est impossible que le joueur ait une arme dans la main gauche et aucune dans la main droite

De plus, si on fait le test avec la main gauche, le script considère que le joueur est armé même si celui-ci n'a qu'une torche.

Par contre je ne me souviens plus si le joueur peut à la création de son perso dire qu'il est gaucher...auquel cas ça complique les choses...

Finalement j'ai abouti à ce script, qui n'est sûrement pas optimisé car je suis un débutant :

Code PHP:

void main()
{
object oRight=GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,GetPCSpeaker());
if (
GetIsObjectValid(oRight))
    {
    
SetLocalInt(GetFirstPC(),"possede_arme",1);
    }
object oItem=GetFirstItemInInventory(GetPCSpeaker());
while (
GetIsObjectValid(oItem))
{
    
int nType=GetBaseItemType(oItem);
    switch (
nType)
    {
        case 
BASE_ITEM_BASTARDSWORDSetLocalInt(GetFirstPC(),"possede_arme",1);
        case 
BASE_ITEM_BATTLEAXESetLocalInt(GetFirstPC(),"possede_arme",1);
        case 
BASE_ITEM_DAGGERSetLocalInt(GetFirstPC(),"possede_arme",1);
        case 
BASE_ITEM_SHORTSWORDSetLocalInt(GetFirstPC(),"possede_arme",1);
        case 
BASE_ITEM_DARTSetLocalInt(GetFirstPC(),"possede_arme",1);
        case 
BASE_ITEM_DIREMACESetLocalInt(GetFirstPC(),"possede_arme",1);
        case 
BASE_ITEM_DOUBLEAXESetLocalInt(GetFirstPC(),"possede_arme",1);
        case 
BASE_ITEM_GREATAXESetLocalInt(GetFirstPC(),"possede_arme",1);
        case 
BASE_ITEM_GREATSWORDSetLocalInt(GetFirstPC(),"possede_arme",1);
        case 
BASE_ITEM_HALBERDSetLocalInt(GetFirstPC(),"possede_arme",1);
        case 
BASE_ITEM_HANDAXESetLocalInt(GetFirstPC(),"possede_arme",1);
        case 
BASE_ITEM_HEAVYCROSSBOWSetLocalInt(GetFirstPC(),"possede_arme",1);
        case 
BASE_ITEM_HEAVYFLAILSetLocalInt(GetFirstPC(),"possede_arme",1);
        case 
BASE_ITEM_KATANASetLocalInt(GetFirstPC(),"possede_arme",1);
        case 
BASE_ITEM_LIGHTCROSSBOWSetLocalInt(GetFirstPC(),"possede_arme",1);
        case 
BASE_ITEM_LIGHTFLAILSetLocalInt(GetFirstPC(),"possede_arme",1);
        case 
BASE_ITEM_LIGHTHAMMERSetLocalInt(GetFirstPC(),"possede_arme",1);
        case 
BASE_ITEM_LIGHTMACESetLocalInt(GetFirstPC(),"possede_arme",1);
        case 
BASE_ITEM_LONGBOWSetLocalInt(GetFirstPC(),"possede_arme",1);
        case 
BASE_ITEM_LONGSWORDSetLocalInt(GetFirstPC(),"possede_arme",1);
        case 
BASE_ITEM_MAGICRODSetLocalInt(GetFirstPC(),"possede_arme",1);
        case 
BASE_ITEM_MORNINGSTARSetLocalInt(GetFirstPC(),"possede_arme",1);
        case 
BASE_ITEM_SCIMITARSetLocalInt(GetFirstPC(),"possede_arme",1);
        case 
BASE_ITEM_SHORTBOWSetLocalInt(GetFirstPC(),"possede_arme",1);
        case 
BASE_ITEM_SHORTSPEARSetLocalInt(GetFirstPC(),"possede_arme",1);
        case 
BASE_ITEM_SHURIKENSetLocalInt(GetFirstPC(),"possede_arme",1);
        case 
BASE_ITEM_THROWINGAXESetLocalInt(GetFirstPC(),"possede_arme",1);
        case 
BASE_ITEM_TWOBLADEDSWORDSetLocalInt(GetFirstPC(),"possede_arme",1);
        case 
BASE_ITEM_WARHAMMERSetLocalInt(GetFirstPC(),"possede_arme",1);


    }
    
oItem=GetNextItemInInventory(GetPCSpeaker());
}

J'ai laissé tomber le StartingConditionnal(), je ne m'en sortais pas...donc en fait on lance se script en action conséquente sur la phrase d'avant et après on vérifie juste si GetLocalInt(GetFirstPC(),"possede_arme") == 1
Si oui alors le gardien dit "Dépose tes armes avant d'entrer" sinon il dit "C'est bon, tu peux entrer"...
Répondre

Connectés sur ce fil

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