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

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

en deduire un seul

Par Blam le 31/1/2003 à 22:14:02 (#3144904)

Voila ce qui suit est un script permettant d'enlever un objet appelé oeil de licorne au personnage se téléportant au point demandé.
Cela marche parfaitement, sauf que quand le joueur a deux "oeil de licorne", ou plus, tout est enlevé !

Qui a une idée de la manière a en enlever qu'une ?

vala le script

//
// Enlever des objets de l’inventaire du joueur
object oItemToTake;
oItemToTake = GetItemPossessedBy(GetPCSpeaker(), "Oeildelicorne");
if(GetIsObjectValid(oItemToTake) != 0)
DestroyObject(oItemToTake);
object oPC = GetLastUsedBy(); // GetLastUsedBy défini la dernière personne qui a utilisé l'objet
if (GetIsPC(oPC)) // On vérifie que la personne est bien Le PC (personnage joueur=
{
object oTarget = GetWaypointByTag ("NW_YEUXPOINT001"); // On défini la destination de la téléportation qui est un Waypoint avec le Tag wp_destination (vous pouvez changer le nom)

AssignCommand( oPC, JumpToObject( oTarget)); // On assigne la commande au Joueur de se téléporter à la destination

}

}

Par Jaha Effect le 31/1/2003 à 23:19:02 (#3145341)

remplace

if(GetIsObjectValid(oItemToTake) != 0)

par
if(GetIsObjectValid(oItemToTake) )

Merci Jaha :)

Par Blam le 31/1/2003 à 23:36:41 (#3145490)

Impeçable, je ne savais pas a quoi ca correspondait, j'ai compris :)

merci bien.

REEDITE Non cela ne fonctionne pas, c'est pas ca

Par Jaha Effect le 31/1/2003 à 23:44:39 (#3145550)

Essaye de mettre tes scripts entre balises PHP, c'est, comme je l'ai dis sur un autre post très chiant à décrypter pour voir un truc qui vous brûle les yeux quand le texte est mis en forme :)

Jaha Effect :D

ok je vais essayer :)

Par Blam le 31/1/2003 à 23:46:27 (#3145560)

comme ca ?

Par Jaha Effect le 31/1/2003 à 23:48:54 (#3145575)

Oui comme ça mais c'est le scripte qu'il faut mettre dedans :)

Il marche pas comment ton script? il compile pas? il fait pas ce que tu veux?

Jaha Effect :D

oui

Par Blam le 31/1/2003 à 23:51:01 (#3145592)

il fonctionne bien a part

que au lieu d'enlever un objet, il enlève tous les objets avec le même tag.
je voudrais qu'il n'en enlève qu'un!

Par Jedaï le 1/2/2003 à 8:26:57 (#3146839)

Simple, ce script vérifie si tu as bien un oeil de licorne puis le détruit et t'envoie où il faut (au fait le oPC=GetLastUsedBy(); est totalement inutile mais bon....), l'ennui c'est que cet objet (oeil de licorne) est empilable et que DestroyObject() détruit tout les objets empilés !
Pour corriger ça, il suffit d'utiliser la fonction que voilà :


void DestroyStkObj(object oDestroy, int nNum, object oOwner );
void SpawnItem(string sTemplate, object oTarget, int nStack);

void main()
{
object oPC = GetPCSpeaker();
// Enlever des objets de l’inventaire du joueur
object oItemToTake = GetItemPossessedBy( oPC, "Oeildelicorne" );

if( GetIsObjectValid( oItemToTake ))
DestroyStkObj( oItemToTake, 1, oPC );

if (GetIsPC(oPC)) // On vérifie que la personne est bien Le PC
{
object oTarget = GetWaypointByTag ("NW_YEUXPOINT001"); // On défini la destination de la téléportation qui est un Waypoint avec le Tag wp_destination (vous pouvez changer le nom)

AssignCommand( oPC, JumpToObject( oTarget)); // On assigne la commande au Joueur de se téléporter à la destination
}

}

void SpawnItem(string sTemplate, object oTarget, int nStack);
{
CreateItemOnObject(sTemplate, oTarget, nStack);
}


void DestroyStkObj(object oDestroy, int nNum, object oOwner )
{
int nStk = GetNumStackedItems(oDestroy);
int nStk = nStk - nNum;
string sRef = GetResRef(oDestroy);
DestroyObject(oDestroy);
AssignCommand(GetModule(), DelayCommand(0.3, SpawnItem(sRef, oOwner, nStk)));
}


Voilà normalement ça doit marcher (aux erreurs de frappe près :D ) :cool:

je testerais lundi

Par Blam le 1/2/2003 à 8:44:49 (#3146856)

mais cela emmene une question supplémentaire

dabord, merci, ensuite:

comment rendre des objets empilables, non empilables ?
est ce possible seulement ?

Par Jedaï le 1/2/2003 à 13:21:46 (#3147900)

Visiblement, cela dépend à la fois du type d'objet (les armes, les amulettes, etc.. ne sont jamais empilable) et de ton choix puisqu'il est possible pour les types d'objet empilable, de spécifier la quantité d'objet qu'il est possible de mettre dans chaque pile, ainsi tu peux spécifier 1, pour les rendre non-empilables. ^_^

Dans le baseitems.2da, on trouve une propriété "stacking", mais j'ai essayé et la manipuler ne suffit pas à rendre un objet empilable si il ne l'était pas. A creuser, mais je pense que ça doit être codé plus profond pour éviter d'avoir des épées empilées sur son slot de main droite par exemple.:rolleyes:

Par Archamedes_Fr le 1/2/2003 à 13:45:30 (#3148070)

J'imagine 10 épées bâtardes empilées... Les dommages se cumulent ? :D

Merci du tuyau, ça peut être intéressant ça...
* J'ai jamais aimé les stacks de 99 flèches. *

compile pas

Par Blam le 4/2/2003 à 21:13:46 (#3171643)

le


void DestroyStkObj(object oDestroy, int nNum, object oOwner );
void SpawnItem(string sTemplate, object oTarget, int nStack);

void main()
{
object oPC = GetPCSpeaker();
// Enlever des objets de l’inventaire du joueur
object oItemToTake = GetItemPossessedBy( oPC, "Oeildelicorne" );

if( GetIsObjectValid( oItemToTake ))
DestroyStkObj( oItemToTake, 1, oPC );

if (GetIsPC(oPC)) // On vérifie que la personne est bien Le PC
{
object oTarget = GetWaypointByTag ("NW_YEUXPOINT001"); // On défini la destination de la téléportation qui est un Waypoint avec le Tag wp_destination (vous pouvez changer le nom)

AssignCommand( oPC, JumpToObject( oTarget)); // On assigne la commande au Joueur de se téléporter à la destination
}

}

void SpawnItem(string sTemplate, object oTarget, int nStack);
{ <-----------ICI-------------
CreateItemOnObject(sTemplate, oTarget, nStack);
}


void DestroyStkObj(object oDestroy, int nNum, object oOwner )
{
int nStk = GetNumStackedItems(oDestroy);
int nStk = nStk - nNum;
string sRef = GetResRef(oDestroy);
DestroyObject(oDestroy);
AssignCommand(GetModule(), DelayCommand(0.3, SpawnItem(sRef, oOwner, nStk)));
}

Par eMRaistlin le 4/2/2003 à 21:17:45 (#3171666)

Regle N°1 :

quand ca compile pas a la ligne N, verifie aussi la ligne N-1 ^^

Tu as mis un point-virgule derriere la declaration de ta fonction : enleve le :)

ok vu :)

Par Blam le 4/2/2003 à 21:36:16 (#3171786)

et pour le

ERROR ! VARIABLE ALREADY USED WHTHIN SCOPE
sur la ligne suivante:

int nStk = nStk - nNum;

une idée ?

Par eMRaistlin le 4/2/2003 à 22:27:51 (#3172075)

oui :

int nStk = GetNumStackedItems(oDestroy);
int nStk = nStk - nNum;

Tu defini la variable de type Entier (Int) du nom de "nStk" egale au nombre d'item stackes.

Puis tu definie un nouvelle variable Entier "nStk" egale a nStk - nNum

Tu as donc definis 2 entier differents mais identiques... Le compilateur ne comprends donc pas.

Pour corriger, c'est simple :

int nStk = GetNumStackedItems(oDestroy);
nStk = nStk - nNum;


Et la, ce sera bon :)

hé oui un int en trop

Par Blam le 4/2/2003 à 22:52:34 (#3172241)

C'est trop bête, mais il est vrai que je déchiffre plus que je ne comprends

durdur

je donne mon royaume contre le savoir scripter :)

Merci encore
:lit:

JOL Archives 1.0.1
@ JOL / JeuxOnLine