Créer un pouvoir unique d'item

Répondre
Partager Rechercher
C'est le genre de question qui reviennent régulièrement, donc je prend le parti de créer un Tutoriel afin que les personnes qui cherchent puissent se référencer à cela directement.
Ce tutoriel part du principe que vous connaissez un petit peu les scripts, et que vous savez par exemple que oPC ou oMedor ne signifient rien per eux même, et que ce qui compte c'est ce qui se situe après le signe =.

Etape 1 : Crée l'Item
Avant toute chose il faut créer l'item qui lancera le pouvoir. Cet item aura donc un tag, disons pour notre exemple it_mon_item un ResRef irr_mon_item et un nom Mon item.

Dans l'onglet des propriétés, on va dans le type de propriétés "Lancer un sort" dans la liste de sort, on lui attribue un "pouvoir unique" ou "un pouvoir unique sur soi"

On sauvegarde l'item, et on garde son Tag en mémoire ou on le note.

Etape 2 : Créer le script d'effet
Selon le pouvoir que l'on veux déclencher, on crée un script d'effet, pour plus de simplicité, on sauvegardera le script sous le même nom que le tag de l'objet. Donc notre script pour notre objet se nommera it_mon_item.
On a donc notre script :
Code PHP:

//////////////////////////////////////
//:: Nom : it_mon_item
/////////////////////////////////////
void main()
{
//Designe le dernier joueur qui a activé un objet
object oPC GetItemActivator();
//designe le dernier item qui a été activé
object oItem GetItemActivated();
//Designe la cible de l'effet
object oTarget GetItemActivatedTarget();
//Designe l'endroit d'activation (si c'est un point et non une créature ou un objet)
location lLoc GetItemActivatedTargetLocation()

//Effet
...
//Fin d'Effet

Note : évidemment si c'est un pouvoir unique sur soi, pas besoin de definir oTarget.

Pour l'exemple on va dire que notre effet provoque une effet visuel de convocation 3 (genre de pentacle de teleportation) sur la cible ET sur l'utilisateur tout en leur donnant des spasmes.
Code PHP:

//////////////////////////////////////
//:: Nom : it_mon_item
/////////////////////////////////////
void main()
{
object oPC GetItemActivator();
object oItem GetItemActivated();
object oTarget GetItemActivatedTarget();
// location lLoc = GetItemActivatedTargetLocation()

effect eVis EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_3);
ApplyEffectToObject(DURATION_TYPE_INSTANTeVisoPC);
ApplyEffectToObject(DURATION_TYPE_INSTANTeVisoTarget);

int nAnim ANIMATION_FIREFORGET_SPASM;
AssignCommand(oPC,ActionPlayAnimation (nAnim));
AssignCommand(oTarget,ActionPlayAnimation (nAnim));

Note : J'ai ajouté l'animation pour bien expliciter que l'effet d'un pouvoir unique n'est pas necessairement une fonction "effect". Dans ce script on pourrais se contenter de la simple animation, sans aucun effet visuel. On pourrais aussi évidemment faire l'effet visuel uniquement sur la cible (oTarget) et les spasmes uniquement sur l'utilisateur de l'objet (oPC).

Etape 3 : Modifier le OnActivateItem du module
Dans Editer/propriétés du module, onglet Evènements, on ouvre le script de la fenêtre OnActivateItem.
De base on a un truc qui ressemble à ca :
Code PHP:

//:://////////////////////////////////////////////
//:: Created By: Georg Zoeller
//:: Created On: 2003-07-16
//:://////////////////////////////////////////////

#include "x2_inc_switches"
void main()
{
     
object oItem GetItemActivated();

     
// * 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_ACTIVATE);
        
int nRet =   ExecuteScriptAndReturnInt(GetUserDefinedItemEventScriptName(oItem),OBJECT_SELF);
        if (
nRet == X2_EXECUTE_SCRIPT_END)
        {
           return;
        }
     }

C'est le scripte de base pour le système de TagBase. Si vous l'utilisez, alors pas besoin de modifier le script, puisque lorsque l'objet sera activé, il déclencherai le script ayant pour nom le Tag de l'objet activé.

Vous pouvez aussi faire la même chose sans le TagBase en ayant un scripte de ce genre :
Code PHP:

void main()
{
object oPC GetItemActivator();
object oItem GetItemActivated()
//Tag de l'objet activé
string sTag GetTag(oItem);
//Execute le scripte d'effet pré-définit
ExecuteScript(sTagoPC);

Mais cela ne fonctionnera pas pour les autres évènements, à moins de les modifier aussi.

Si vous avez nom de script différent du tag de l'objet, vous devrez avoir un script de ce genre :
Code PHP:

void main()
{
object oPC GetItemActivator();
object oItem GetItemActivated()
string sTag GetTag(oItem);
if(
sTag == "it_mon_item")
    {
    
ExecuteScript("Nom_du_script"oPC);
    }
if(
sTag == "Un_autre_item")
    {
    
ExecuteScript("un_autre_script"oPC);
    }
//etc.

Voilà, si vous avez besoin de precisions, vous demandez.
Moi au depart dans Onactivateitm j'ai ceci

Citation :
// activate_items - Script reecrit par astre - 18/5/03


// FastFrench 13/1/03
// renvoie TRUE si pas un DM (et detruit l'objet), FALSE c'est un DM qui utilise l'objet
int DestroyIfNotDM(object oItem, object oActivator)
{
if (GetIsDM(oActivator)) return FALSE;

// Check to make sure that the Activator is a NPC played by a DM
object oTest = GetFirstPC();
string sTestName = GetPCPlayerName(oActivator);
while (GetIsObjectValid(oTest))
{
if (GetPCPlayerName(oTest) == sTestName)
{
DestroyObject(oItem);
SendMessageToPC(oActivator, "Cet objet appartient aux Dieux et n'est pas fait pour les mains d'un simple mortel !");
return TRUE;
}
oTest=GetNextPC();
}
return FALSE;
}

void main()
{
object oItem = GetItemActivated(); // get the item activated
string sItemTag = GetTag(oItem); // and its tag
string sItemName = GetName(oItem); // and its name
object oActivator = GetItemActivator(); // get the wand's activator
object oTarget = GetItemActivatedTarget(); // get the target
string sTargetTag = GetTag(GetItemActivatedTarget()); // and its tag
location lTargetLoc = GetItemActivatedTargetLocation(); // Get the Location


if(sItemTag=="levelwandNODROP") // pour filler le bon automatiquement
{
int olevel = GetHitDice (oTarget);
if (olevel < 5 )
if (!GetIsObjectValid(GetItemPossessedBy(oTarget, "passniv5NODROP")) )
CreateItemOnObject("passniv5",oTarget,1);
if (GetIsDM(oActivator))
{
if (olevel < 10 && olevel >= 5 )
if (!GetIsObjectValid(GetItemPossessedBy(oTarget, "passniv10NODROP")) )
CreateItemOnObject("passniv10",oTarget,1);

if (olevel < 15 && olevel >= 10 )
if (!GetIsObjectValid(GetItemPossessedBy(oTarget, "passniv10NODROP")) )
CreateItemOnObject("passniv15",oTarget,1);
if (olevel == 15 )
if (!GetIsObjectValid(GetItemPossessedBy(oTarget, "passniv10NODROP")) )
CreateItemOnObject("passniv16",oTarget,1);
if (olevel == 16 )
if (!GetIsObjectValid(GetItemPossessedBy(oTarget, "passniv10NODROP")) )
CreateItemOnObject("passniv17",oTarget,1);
if (olevel == 17 )
if (!GetIsObjectValid(GetItemPossessedBy(oTarget, "passniv10NODROP")) )
CreateItemOnObject("passniv18",oTarget,1);
if (olevel == 18 )
if (!GetIsObjectValid(GetItemPossessedBy(oTarget, "passniv10NODROP")) )
CreateItemOnObject("passniv19",oTarget,1);
if (olevel == 19 )
if (!GetIsObjectValid(GetItemPossessedBy(oTarget, "passniv10NODROP")) )
CreateItemOnObject("passniv20",oTarget,1);
}
}

if(sItemTag=="DMsHelper") // DM Helper
if (!DestroyIfNotDM(oItem, oActivator))
{
SetLocalObject(oActivator, "dmwandtarget", oTarget); // Put target info into local vars on activator
SetLocalLocation(oActivator, "dmwandloc", lTargetLoc);
AssignCommand(oActivator, ActionStartConversation(oActivator, "dmwand", TRUE)); // Start the conversation with itself
return;
}



if(sItemTag=="AutoFollow")
{
if(GetIsObjectValid(oTarget))
AssignCommand (oActivator,ActionForceFollowObject(oTarget,3.0));
return;
}



if(sItemTag=="WandOfFX")
if (!DestroyIfNotDM(oItem, oActivator))
{
SetLocalObject(oActivator, "FXWandTarget", oTarget); // Put target info into local vars on activator
SetLocalLocation(oActivator, "FXWandLoc", lTargetLoc);
AssignCommand(oActivator, ActionStartConversation(oActivator, "fxwand", TRUE)); // Start the conversation with itself
return;
}

if(sItemTag=="EmoteWand")
{
AssignCommand(oActivator, ActionStartConversation(oActivator, "emotewand", TRUE));
return;
}

if(sItemTag=="SMGAmuletdepouvoir")
{
effect eDeath = EffectDeath(FALSE, FALSE);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oActivator);
DestroyObject(oItem);
return;
}

if(sItemTag=="setdemenottes")
{
if (GetIsPC (oTarget))
{
if ( GetItemPossessedBy(oTarget , "menoNODROP") == OBJECT_INVALID)
{
CreateItemOnObject("menonodrop", oTarget, 1);
SendMessageToPC(oActivator, "vous venez de verrouiller des menottes");
}
else
{
DestroyObject ( GetItemPossessedBy(oTarget, "menoNODROP"));
SendMessageToPC(oActivator, "vous venez de retirer des menottes");
}
}
return;
}




if(GetTag(oItem)=="DMRodofAffliction")
if (!DestroyIfNotDM(oItem, oActivator))
{
SetLocalObject(oActivator, "RoATarget", oTarget); // Store the Target Info on the Activator
SetLocalLocation(oActivator, "RoALoc", lTargetLoc); // Store location for possible Future Use

// Check to be sure the target is a PC, if so, Start the Conversation
if (GetIsPC(oTarget) == TRUE)
// Start the Conversation
AssignCommand(oActivator, ActionStartConversation(oActivator, "cv_roa", TRUE));
else
// Send a message to the DM that the target is not a PC
SendMessageToPC(oActivator, "Invalid Target");
return;
}


if(GetTag(oItem)=="OeufdeDmon")
{
location lWhere = GetLocation (oActivator);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_1),lWhere,1.0);
CreateObject(OBJECT_TYPE_CREATURE,"dmonticule",lWhere, TRUE);
return;
}

//botte de vitesse dont le tag doit etre : bottesdevitesX X etant le nombre de round ou la botte fonctionne
if (GetStringLeft(sItemTag,13) == "bottesdevites")
{
int iPow = StringToInt(GetSubString(sItemTag, 13, GetStringLength(sItemTag)-13));
int iPower = iPow * 2;
object objetpied = GetItemInSlot(INVENTORY_SLOT_BOOTS, oActivator) ;
if (objetpied == oItem)
{
SignalEvent(oActivator, EventSpellCastAt(oActivator, SPELL_HASTE, FALSE));
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectHaste(), oActivator, RoundsToSeconds(iPower));
DelayCommand(12.0, ExecuteScript("test_botte", oActivator));
SetLocalInt(oActivator,"tempbotte",iPow);
}
else
{
SignalEvent(oActivator, EventSpellCastAt(oActivator, SPELL_SLOW, FALSE));
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSlow(), oActivator, RoundsToSeconds(iPower/2));
}
}

//Items de transformation en machin-garous...
if (sItemTag == "chatNODROP")
{ ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_POLYMORPH),oActivator);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectPolymorph(POLYMORPH_TYPE_WERECAT),oActivator);
return;
}
if (sItemTag == "ratNODROP")
{ ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_POLYMORPH),oActivator);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectPolymorph(POLYMORPH_TYPE_WERERAT),oActivator);
return;
}
if (sItemTag == "loupNODROP")
{ ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_POLYMORPH),oActivator);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectPolymorph(POLYMORPH_TYPE_WEREWOLF),oActivator);
return;
}
if (sItemTag == "sucuNODROP")
{ ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_POLYMORPH),oActivator);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectPolymorph(POLYMORPH_TYPE_SUCCUBUS),oActivator);
return;
}
if (sItemTag == "pingNODROP")
{ ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_POLYMORPH),oActivator);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectPolymorph(POLYMORPH_TYPE_PENGUIN),oActivator);
return;
}
if (sItemTag == "baloNODROP")
{ ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_POLYMORPH),oActivator);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectPolymorph(POLYMORPH_TYPE_BALOR),oActivator);
return;
}

// Pierres de rappel
int bHasGoodStone = GetItemPossessedBy(oActivator, "pierre_sacree2") != OBJECT_INVALID;
int bHasEvilStone = GetItemPossessedBy(oActivator, "pierre_mal") != OBJECT_INVALID;
int bHasNeutralStone = GetItemPossessedBy(oActivator, "pierre_univ") != OBJECT_INVALID;
int bhasMenotte = GetItemPossessedBy(oActivator, "menoNODROP") != OBJECT_INVALID;
int bUseGoodStone = sItemTag == "pierre_sacree2";
int bUseEvilStone = sItemTag == "pierre_mal";
int bUseNeutralStone = sItemTag == "pierre_univ";

if (bUseGoodStone || bUseEvilStone || bUseNeutralStone) // Une pierre de rappel a ete utilisee
{
string tArea = GetTag(GetArea(oActivator));
int iArea = StringToInt(GetSubString(tArea, 5, GetStringLength(tArea)-5));
if (bHasGoodStone + bHasEvilStone + bHasNeutralStone + bhasMenotte == 1) // Il n'en possede bien qu'une
if ((iArea>=140 && iArea<=179) || (iArea>=190 && iArea<=199))
{SendMessageToPC(oActivator,"Les puissantes protections magiques de cet endroit empechent votre pierre de fonctionner"); return;}
else
{
location LastRecallUsed; // Set the location variable
LastRecallUsed = GetLocation(oActivator); // Get the location, fill up the variable
SetLocalLocation(oActivator,"LastRecallUsed",LastRecallUsed); // Set where the portal jump the player to
SetLocalInt(oActivator,"HasRecalled",1); // To make the recall poretal tells the player if he want to go back
ActionCastFakeSpellAtObject ( SPELL_DISMISSAL , oActivator);
int bFighting = 0;
int nHD = GetHitDice(oActivator);

if (GetIsInCombat(oActivator)) bFighting = 1;
//{SendMessageToPC(oActivator,"Vous n'arrivez pas a vous concentrer suffisamment pendant le combat pour utiliser cette pierre de rappel"); return;}
int nXP = GetXP(oActivator);
int nPenalty = 0;
int nGoldPenalty = nHD * nHD * nHD;
if (bFighting) nPenalty = nHD*nHD;
if (bFighting) nGoldPenalty *= 4;
// * You can not lose a level with this respawning
int nMin = ((nHD * (nHD - 1)) / 2) * 1000;
if (GetGold(oActivator)<nGoldPenalty)
nGoldPenalty = GetGold(oActivator);

int nNewXP = nXP - nPenalty;
if (nNewXP < nMin)
nNewXP = nMin;
SetXP(oActivator, nNewXP);
TakeGoldFromCreature(nGoldPenalty, oActivator, TRUE);

if (bUseGoodStone) AssignCommand(oActivator,JumpToLocation(GetLocation(GetObjectByTag("catdrale_tele")))); // Get the player to the temple
if (bUseEvilStone) AssignCommand(oActivator,JumpToLocation(GetLocation(GetObjectByTag("maison")))); // Get the player to the temple
if (bUseNeutralStone) AssignCommand(oActivator,JumpToLocation(GetLocation(GetObjectByTag("temple_venus")))); // Get the player to the temple
}
return;
}

// LES BOUCHOMONS

if (sItemTag == "Bouchoballe")
{
string sBouchomon= GetStringRight(sTargetTag,5);
if (sBouchomon == "_bmon")
{
if (GetMaster(oTarget) == oActivator || GetMaster(oTarget) == OBJECT_INVALID)
{
string sNewball = sTargetTag+"_ball";
ApplyEffectToObject (DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_IMP_GLOBE_USE),oTarget);
DestroyObject (oTarget);
DestroyObject(oItem);
CopyObject (oItem,lTargetLoc,oActivator,sNewball);
FloatingTextStringOnCreature ("vous avez attrape "+GetName(oTarget), oActivator);
}
}
return;
}


if (GetStringRight(sItemTag,5) == "_ball")
{
/*RemoveSummonedAssociate(oActivator,GetAssociate(ASSOCIATE_TYPE_HENCHMAN,oActivator)); //au cas ou...
ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_1), lTargetLoc);
object oBouchomon = CreateObject(OBJECT_TYPE_CREATURE, GetStringLeft(sItemTag,10), lTargetLoc, TRUE);
DestroyObject(oItem);
CreateItemOnObject("bouchoballe",oActivator,1);
AddHenchman(oActivator,oBouchomon);
FloatingTextStringOnCreature ("vous avez relache "+GetName(oBouchomon), oActivator);
*/
FloatingTextStringOnCreature ("periode de test, vous ne pouvez pas relacher de Bouchomon", oActivator);
return;
}



WriteTimestampedLogEntry("[ACTIVATE] object inconnu utilise par "+GetName(oActivator)+": "+sItemName+" (tag:"+sItemTag+")");
}
Apres les modif j'obtiens ceci

Citation :
// activate_items - Script reecrit par astre - 18/5/03


// FastFrench 13/1/03
// renvoie TRUE si pas un DM (et detruit l'objet), FALSE c'est un DM qui utilise l'objet
int DestroyIfNotDM(object oItem, object oActivator)
{
if (GetIsDM(oActivator)) return FALSE;

// Check to make sure that the Activator is a NPC played by a DM
object oTest = GetFirstPC();
string sTestName = GetPCPlayerName(oActivator);
while (GetIsObjectValid(oTest))
{
if (GetPCPlayerName(oTest) == sTestName)
{
DestroyObject(oItem);
SendMessageToPC(oActivator, "Cet objet appartient aux Dieux et n'est pas fait pour les mains d'un simple mortel !");
return TRUE;
}
oTest=GetNextPC();
}
return FALSE;
}

void main()
{
object oItem = GetItemActivated(); // get the item activated
string sItemTag = GetTag(oItem); // and its tag
string sItemName = GetName(oItem); // and its name
object oActivator = GetItemActivator(); // get the wand's activator
object oTarget = GetItemActivatedTarget(); // get the target
string sTargetTag = GetTag(GetItemActivatedTarget()); // and its tag
location lTargetLoc = GetItemActivatedTargetLocation(); // Get the Location


if(sItemTag=="levelwandNODROP") // pour filler le bon automatiquement
{
int olevel = GetHitDice (oTarget);
if (olevel < 5 )
if (!GetIsObjectValid(GetItemPossessedBy(oTarget, "passniv5NODROP")) )
CreateItemOnObject("passniv5",oTarget,1);
if (GetIsDM(oActivator))
{
if (olevel < 10 && olevel >= 5 )
if (!GetIsObjectValid(GetItemPossessedBy(oTarget, "passniv10NODROP")) )
CreateItemOnObject("passniv10",oTarget,1);

if (olevel < 15 && olevel >= 10 )
if (!GetIsObjectValid(GetItemPossessedBy(oTarget, "passniv10NODROP")) )
CreateItemOnObject("passniv15",oTarget,1);
if (olevel == 15 )
if (!GetIsObjectValid(GetItemPossessedBy(oTarget, "passniv10NODROP")) )
CreateItemOnObject("passniv16",oTarget,1);
if (olevel == 16 )
if (!GetIsObjectValid(GetItemPossessedBy(oTarget, "passniv10NODROP")) )
CreateItemOnObject("passniv17",oTarget,1);
if (olevel == 17 )
if (!GetIsObjectValid(GetItemPossessedBy(oTarget, "passniv10NODROP")) )
CreateItemOnObject("passniv18",oTarget,1);
if (olevel == 18 )
if (!GetIsObjectValid(GetItemPossessedBy(oTarget, "passniv10NODROP")) )
CreateItemOnObject("passniv19",oTarget,1);
if (olevel == 19 )
if (!GetIsObjectValid(GetItemPossessedBy(oTarget, "passniv10NODROP")) )
CreateItemOnObject("passniv20",oTarget,1);
}
}

if(sItemTag=="DMsHelper") // DM Helper
if (!DestroyIfNotDM(oItem, oActivator))
{
SetLocalObject(oActivator, "dmwandtarget", oTarget); // Put target info into local vars on activator
SetLocalLocation(oActivator, "dmwandloc", lTargetLoc);
AssignCommand(oActivator, ActionStartConversation(oActivator, "dmwand", TRUE)); // Start the conversation with itself
return;
}



if(sItemTag=="AutoFollow")
{
if(GetIsObjectValid(oTarget))
AssignCommand (oActivator,ActionForceFollowObject(oTarget,3.0));
return;
}



if(sItemTag=="WandOfFX")
if (!DestroyIfNotDM(oItem, oActivator))
{
SetLocalObject(oActivator, "FXWandTarget", oTarget); // Put target info into local vars on activator
SetLocalLocation(oActivator, "FXWandLoc", lTargetLoc);
AssignCommand(oActivator, ActionStartConversation(oActivator, "fxwand", TRUE)); // Start the conversation with itself
return;
}

if(sItemTag=="EmoteWand")
{
AssignCommand(oActivator, ActionStartConversation(oActivator, "emotewand", TRUE));
return;
}

if(sItemTag=="SMGAmuletdepouvoir")
{
effect eDeath = EffectDeath(FALSE, FALSE);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oActivator);
DestroyObject(oItem);
return;
}

if(sItemTag=="setdemenottes")
{
if (GetIsPC (oTarget))
{
if ( GetItemPossessedBy(oTarget , "menoNODROP") == OBJECT_INVALID)
{
CreateItemOnObject("menonodrop", oTarget, 1);
SendMessageToPC(oActivator, "vous venez de verrouiller des menottes");
}
else
{
DestroyObject ( GetItemPossessedBy(oTarget, "menoNODROP"));
SendMessageToPC(oActivator, "vous venez de retirer des menottes");
}
}
return;
}




if(GetTag(oItem)=="DMRodofAffliction")
if (!DestroyIfNotDM(oItem, oActivator))
{
SetLocalObject(oActivator, "RoATarget", oTarget); // Store the Target Info on the Activator
SetLocalLocation(oActivator, "RoALoc", lTargetLoc); // Store location for possible Future Use

// Check to be sure the target is a PC, if so, Start the Conversation
if (GetIsPC(oTarget) == TRUE)
// Start the Conversation
AssignCommand(oActivator, ActionStartConversation(oActivator, "cv_roa", TRUE));
else
// Send a message to the DM that the target is not a PC
SendMessageToPC(oActivator, "Invalid Target");
return;
}


if(GetTag(oItem)=="OeufdeDmon")
{
location lWhere = GetLocation (oActivator);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_1),lWhere,1.0);
CreateObject(OBJECT_TYPE_CREATURE,"dmonticule",lWhere, TRUE);
return;
}

//botte de vitesse dont le tag doit etre : bottesdevitesX X etant le nombre de round ou la botte fonctionne
if (GetStringLeft(sItemTag,13) == "bottesdevites")
{
int iPow = StringToInt(GetSubString(sItemTag, 13, GetStringLength(sItemTag)-13));
int iPower = iPow * 2;
object objetpied = GetItemInSlot(INVENTORY_SLOT_BOOTS, oActivator) ;
if (objetpied == oItem)
{
SignalEvent(oActivator, EventSpellCastAt(oActivator, SPELL_HASTE, FALSE));
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectHaste(), oActivator, RoundsToSeconds(iPower));
DelayCommand(12.0, ExecuteScript("test_botte", oActivator));
SetLocalInt(oActivator,"tempbotte",iPow);
}
else
{
SignalEvent(oActivator, EventSpellCastAt(oActivator, SPELL_SLOW, FALSE));
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSlow(), oActivator, RoundsToSeconds(iPower/2));
}
}

//Items de transformation en machin-garous...
if (sItemTag == "chatNODROP")
{ ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_POLYMORPH),oActivator);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectPolymorph(POLYMORPH_TYPE_WERECAT),oActivator);
return;
}
if (sItemTag == "ratNODROP")
{ ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_POLYMORPH),oActivator);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectPolymorph(POLYMORPH_TYPE_WERERAT),oActivator);
return;
}
if (sItemTag == "loupNODROP")
{ ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_POLYMORPH),oActivator);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectPolymorph(POLYMORPH_TYPE_WEREWOLF),oActivator);
return;
}
if (sItemTag == "sucuNODROP")
{ ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_POLYMORPH),oActivator);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectPolymorph(POLYMORPH_TYPE_SUCCUBUS),oActivator);
return;
}
if (sItemTag == "pingNODROP")
{ ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_POLYMORPH),oActivator);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectPolymorph(POLYMORPH_TYPE_PENGUIN),oActivator);
return;
}
if (sItemTag == "baloNODROP")
{ ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_POLYMORPH),oActivator);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectPolymorph(POLYMORPH_TYPE_BALOR),oActivator);
return;
}

// Pierres de rappel
int bHasGoodStone = GetItemPossessedBy(oActivator, "pierre_sacree2") != OBJECT_INVALID;
int bHasEvilStone = GetItemPossessedBy(oActivator, "pierre_mal") != OBJECT_INVALID;
int bHasNeutralStone = GetItemPossessedBy(oActivator, "pierre_univ") != OBJECT_INVALID;
int bhasMenotte = GetItemPossessedBy(oActivator, "menoNODROP") != OBJECT_INVALID;
int bUseGoodStone = sItemTag == "pierre_sacree2";
int bUseEvilStone = sItemTag == "pierre_mal";
int bUseNeutralStone = sItemTag == "pierre_univ";

if (bUseGoodStone || bUseEvilStone || bUseNeutralStone) // Une pierre de rappel a ete utilisee
{
string tArea = GetTag(GetArea(oActivator));
int iArea = StringToInt(GetSubString(tArea, 5, GetStringLength(tArea)-5));
if (bHasGoodStone + bHasEvilStone + bHasNeutralStone + bhasMenotte == 1) // Il n'en possede bien qu'une
if ((iArea>=140 && iArea<=179) || (iArea>=190 && iArea<=199))
{SendMessageToPC(oActivator,"Les puissantes protections magiques de cet endroit empechent votre pierre de fonctionner"); return;}
else
{
location LastRecallUsed; // Set the location variable
LastRecallUsed = GetLocation(oActivator); // Get the location, fill up the variable
SetLocalLocation(oActivator,"LastRecallUsed",LastRecallUsed); // Set where the portal jump the player to
SetLocalInt(oActivator,"HasRecalled",1); // To make the recall poretal tells the player if he want to go back
ActionCastFakeSpellAtObject ( SPELL_DISMISSAL , oActivator);
int bFighting = 0;
int nHD = GetHitDice(oActivator);

if (GetIsInCombat(oActivator)) bFighting = 1;
//{SendMessageToPC(oActivator,"Vous n'arrivez pas a vous concentrer suffisamment pendant le combat pour utiliser cette pierre de rappel"); return;}
int nXP = GetXP(oActivator);
int nPenalty = 0;
int nGoldPenalty = nHD * nHD * nHD;
if (bFighting) nPenalty = nHD*nHD;
if (bFighting) nGoldPenalty *= 4;
// * You can not lose a level with this respawning
int nMin = ((nHD * (nHD - 1)) / 2) * 1000;
if (GetGold(oActivator)<nGoldPenalty)
nGoldPenalty = GetGold(oActivator);

int nNewXP = nXP - nPenalty;
if (nNewXP < nMin)
nNewXP = nMin;
SetXP(oActivator, nNewXP);
TakeGoldFromCreature(nGoldPenalty, oActivator, TRUE);

if (bUseGoodStone) AssignCommand(oActivator,JumpToLocation(GetLocation(GetObjectByTag("catdrale_tele")))); // Get the player to the temple
if (bUseEvilStone) AssignCommand(oActivator,JumpToLocation(GetLocation(GetObjectByTag("maison")))); // Get the player to the temple
if (bUseNeutralStone) AssignCommand(oActivator,JumpToLocation(GetLocation(GetObjectByTag("temple_venus")))); // Get the player to the temple
}
return;
}

// LES BOUCHOMONS

if (sItemTag == "Bouchoballe")
{
string sBouchomon= GetStringRight(sTargetTag,5);
if (sBouchomon == "_bmon")
{
if (GetMaster(oTarget) == oActivator || GetMaster(oTarget) == OBJECT_INVALID)
{
string sNewball = sTargetTag+"_ball";
ApplyEffectToObject (DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_IMP_GLOBE_USE),oTarget);
DestroyObject (oTarget);
DestroyObject(oItem);
CopyObject (oItem,lTargetLoc,oActivator,sNewball);
FloatingTextStringOnCreature ("vous avez attrape "+GetName(oTarget), oActivator);
}
}
return;
}


if (GetStringRight(sItemTag,5) == "_ball")
{
/*RemoveSummonedAssociate(oActivator,GetAssociate(ASSOCIATE_TYPE_HENCHMAN,oActivator)); //au cas ou...
ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_1), lTargetLoc);
object oBouchomon = CreateObject(OBJECT_TYPE_CREATURE, GetStringLeft(sItemTag,10), lTargetLoc, TRUE);
DestroyObject(oItem);
CreateItemOnObject("bouchoballe",oActivator,1);
AddHenchman(oActivator,oBouchomon);
FloatingTextStringOnCreature ("vous avez relache "+GetName(oBouchomon), oActivator);
*/
FloatingTextStringOnCreature ("periode de test, vous ne pouvez pas relacher de Bouchomon", oActivator);
return;
}


WriteTimestampedLogEntry("[ACTIVATE] object inconnu utilise par "+GetName(oActivator)+": "+sItemName+" (tag:"+sItemTag+")");
}

void main()
{
object oPC = GetItemActivator();
object oItem = GetItemActivated()
string sTag = GetTag(oItem);
if(sTag == "Batondureboot")
{
ExecuteScript("batondureboot", oPC);
}
}
et en au moment ou j'enregistre j'ai ceci

Citation :
16/08/2005 19:51:54 : Erreur. 'activate_items' n’est pas compilé.
activate_items.nss: ERREUR : DUPLICATE FUNCTION IMPLEMENTATION (main)
la fin de ton script :
Code PHP:

 void main()
{
object oPC GetItemActivator();
object oItem GetItemActivated()
string sTag GetTag(oItem);
if(
sTag == "Batondureboot")
{
ExecuteScript("batondureboot"oPC);
}

tu déclare un deuxieme void main et on ne peut déclarer qu'un void main par scrpit !
de plus en début de script du a déja déclaré ca :
object oItem = GetItemActivated(); // get the item activated
string sItemTag = GetTag(oItem); // and its tag
object oActivator = GetItemActivator();

donc a la fin de ton script tu devrait simplement mettre ca :
Code PHP:

 if(sItemTag == "Batondureboot")
{
ExecuteScript("batondureboot"oActivator);
}
}
// parenthése fermant le void main du début 
Je changais j'obtiens ceci

Citation :
17/08/2005 00:15:13 : Erreur. 'activate_items' n’est pas compilé.
activate_items.nss(303): ERREUR : INVALID DECLARATION TYPE
il surligne en noir cette phrase

Citation :
if(sItemTag == "batondureboot")
normale je pensais que tu aller y pensais tous seul mais dans ton ancien script tu ferme la parenthese de ton void ici :

Code PHP:

WriteTimestampedLogEntry("[ACTIVATE] object inconnu utilise par "+GetName(oActivator)+": "+sItemName+" (tag:"+sItemTag+")");

  } 
// <----- Là

//void main()
//{
//object oPC = GetItemActivator();
//object oItem = GetItemActivated()
//string sTag = GetTag(oItem);
if(sTag == "Batondureboot"
tu doit l'enlever pour que la paranthèse fermante du void main se retrouve tout a la FIN du script.
en fait le compilateur sarrete de compiler a la fin de l'accolade fermante de ton void et vu que ton IF se trouve après il déclare que le type de ta déclaration est invalide.
en dehord des void main on peut déclare :
des fonction toujours commencant par un TYPE (int, string ou mem void (vide))
des variables toujours déclarer avec un type...

ce qu'on appelle les boucle ou condition ou plus généralement les structure de controle ne sont déclarable qu'a l'intérieur du
Void main()
{
ICI
}
ton if étant LA

ca foire
Je n'arrive pas à mettre un pouvoir sur un objet, voici mon script:

Code PHP:

  void main()
  {
  
object oPC;
  
  if (!
GetIsPC(GetItemActivatedTarget())
  ){
  
  
SendMessageToPC(GetItemActivator(), "Improper use of item!");
  return;}
  
  
oPC GetItemActivator();
  
  
ActionStartConversation(oPC"gunsen");
  
  } 
Le tag de l'objet, la conversation, et le script se nomment GUNSEN.

Lorsque j'utilise l'objet, la conversation ne se lance pas.
Pouvez vous me dire où se trouve l'erreure ?
Code PHP:

AssignCommand(oPC,ActionStartConversation(oPC,"gunsen")); 

[Edit]
Et puis ton script est un peu à l'envers ^^ :
Code PHP:

void main()
{
    
object oPC GetItemActivator();
  
    if(!
GetIsPC(GetItemActivatedTarget()))
    {
        
SendMessageToPC(oPC,"Improper use of item!");
        return;
    }
    
AssignCommand(oPC,ActionStartConversation(oPC,"gunsen"));

[/Edit]
Bonjour.

Apres quelques recherches je suis tombé sur ces exemples de scripts donnant des pouvoirs à des objets via script.

Les effets obtenus sont appliqués une fois l'objet activé.

Pour ma part je recherche une fonction qui ferait que les effets obtenus une fois l'objet activé soit perdus si on lâche l'objet.

En résumé le personnage s'équipe de l'objet, utilise le pouvoir unique sur lui, acquiert les effets scriptés de l'objet (plusieurs sort sur lui par exemple) mais il vient à se déséquiper de l'objet, il perds tout les avantages obtenus.

Merci de m'aider s'il vous plaît.
Salut,

Il faut, pour cela, que tu ailles dans
- les propriétés du module
- Onglet "Evênements"

Tu places tes scripts dans

- OnPlayerEquipItem (pour appliquer les effets que tu souhaites)
- OnPlayerUnEquipItem (pour retirer les effets)

Il ne se passera rien si l'objet est dans l'inventaire ou au sol. Les effets ne seront appliqués que si le PJ s'équipe de l'objet, et retirés s'il le replace dans son sac (inventaire).

Une variante serait d'appliquer des effets lorsque le PJ place un objet dans son inventaire (peu importe s'il s'en équipe ou non). Mettre, pour cela, des script dans "OnAcquireItem" et/ou "OnUnacquireItem"

Une autre variante serait d'appliquer des effets lorsque le PJ met un objet dans son inventaire, et d'ajouter des effets supplémentaires lorsqu'il s'en équipe.
Répondre

Connectés sur ce fil

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