Cloner un PC - methode simple

Répondre
Partager Rechercher
Tiré de SoU (mais ça marche dans nwn de base) à coller dans le onused du module (script à adapter selon vos besoin, la il est prévu pour se declencher à l'utilsation d'un objet quelquonque)

on peut l'adater pour qu'il se declenche sur n'importe quoi.. (trigger, objet...)

je le donne brut de pomme... ça fabrique un clone du PJ , le clone suit le PJ et agit comme un suivant "simple" (defend son maitre automatiquement..etc etc)
on ne peut pas gerer son inventaire, mais il suffit de prendre une arme à la main et le clone sera equipé comme l'original

il se detruit automatiquement au bout d'un certain temps...
le clone est entouré d'un cercle de flamme ... à vous de le virer si besoin... j'ai testé juste 5 clones en même temps et aucun probleme...

bref, faire un sort de mirror image avec ça doit pas être compliqué... et c'est une methode "bioware" donc je suppose qu'elle n'utilise pas "le bug exploit" que nous avions exploité dans une autre tentative de "Clonage" dans un autre thread..

Code PHP:

#include "nw_i0_generic"
void FakeHB()
{
    
effect eFlame EffectVisualEffect(VFX_IMP_FLAME_M);
    
ApplyEffectToObject(DURATION_TYPE_INSTANTeFlameOBJECT_SELF);
    
int nExplode GetLocalInt(OBJECT_SELF"X0_L_MYTIMERTOEXPLODE");
    
object oMaster GetLocalObject(OBJECT_SELF"X0_L_MYMASTER");
    if (
nExplode == 30)// NOMBRE DE SECONDES DE VIE DU CLONE.
    
{
        
ClearAllActions();
        
PlayVoiceChat(VOICE_CHAT_GOODBYE);
        
effect eFirePro EffectDamageImmunityIncrease(DAMAGE_TYPE_FIRE100);
        
ApplyEffectToObject(DURATION_TYPE_TEMPORARYeFireProoMaster3.5);
        
ActionCastSpellAtLocation(SPELL_FIREBALLGetLocation(OBJECT_SELF), METAMAGIC_ANYTRUEPROJECTILE_PATH_TYPE_DEFAULTTRUE);
        
DestroyObject(OBJECT_SELF0.5);
        
SetCommandable(FALSE);
        return;
    }
    else
    {
        
object oEnemy GetNearestCreature(CREATURE_TYPE_REPUTATIONREPUTATION_TYPE_ENEMYoMaster1CREATURE_TYPE_PERCEPTIONPERCEPTION_SEEN);
        
// * attack my master's enemy
        
if (GetIsObjectValid(oEnemy) )
        {
            
DetermineCombatRound(oEnemy);
        }
        
ActionMoveToObject(GetLocalObject(OBJECT_SELF"X0_L_MYMASTER"), TRUE);
        
SetLocalInt(OBJECT_SELF"X0_L_MYTIMERTOEXPLODE"nExplode 1);
        
DelayCommand(3.0FakeHB());
    }
}
void main()
{
    
object oPC GetItemActivator();
    
object oFireGuy CopyObject(oPCGetLocation(oPC), OBJECT_INVALIDGetName(oPC) + "CLONEFROMFISTS");
    if (
GetTag(GetItemActivated()) == "clone_fists")
    
SetLocalInt(oFireGuy"X0_L_MYTIMERTOEXPLODE",1);
    
SetLocalObject(oFireGuy"X0_L_MYMASTER"oPC);
    
ChangeToStandardFaction(oFireGuySTANDARD_FACTION_COMMONER);
    
SetPCLike(oPCoFireGuy);
    
DelayCommand(0.5SetPlotFlag(oFireGuyTRUE)); // * so items don't drop, I can destroy myself.
    
AssignCommand(oFireGuyFakeHB());
    
effect eVis EffectVisualEffect(VFX_DUR_ELEMENTAL_SHIELD);
    
ApplyEffectToObject(DURATION_TYPE_PERMANENTeVisoFireGuy);

C'est la première chose que j'ai voulu faire quand j'ai enfin eu le CopyObject : cloner les PC.
Pour accéder à l'inventaire, un OpenInventory(oFireGuy, oPC) quand on active l'item voulu, ça marcherait pas ?

Une utilisation sympa du clonage de PC, sinon, c'est l'effet de CutScene proposé sur le lexicon. Je sais pas si on en a déjà parlé dans un autre topic, je mets le script pour ceux que ça inspirerait (Lexicon, section Cutscene).

Code PHP:

//Example of a simple cutscene by Lilac Soul
//If you have a script in OnCutsceneAbort, you can simply
//ClearAllActions on the PC to make the scene stop,
//then remove the invisibility visual effect and
//SetCutsceneMode to false, and destroy the copy.

void RunCutsceneActions();
void CreateCopy(object oPC OBJECT_SELF);

void main()
{
  
object oPC=GetEnteringObject();
  if (!
GetIsPC(oPC)) return;
  
AssignCommand(oPCRunCutsceneActions());
}

//Wrapped in its own function so that oPC can be
//OBJECT_SELF so there's no need for AssignCommand
//Making heavy use of ActionDoCommand to be able to control
//that one thing must finish before another starts
void RunCutsceneActions()
{
//Fade out the PC
  
ActionDoCommand(FadeToBlack(OBJECT_SELFFADE_SPEED_FAST));
  
ActionWait(2.0);
  
ActionDoCommand(SetCutsceneMode(OBJECT_SELFTRUE));

//Create a copy so we can move the invisible PC around
//and still have him think he's standing where he was
  
ActionDoCommand(CreateCopy());

//Make PC invisible
  
effect eInv=EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY);
  
ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_PERMANENTeInvOBJECT_SELF));

//Fade PC back in
  
ActionDoCommand(FadeFromBlack(OBJECT_SELFFADE_SPEED_FAST));

//Here then, move the invisible PC around and do whatever
//It will look like the camera is just moving, and the
//player will have the impression of standing still because
//we created a copy of him
//If having others do stuff, like oNPC, you can do this trick
//To have the NPC action added to the PC's action queue
//REMEMBER: NO MORE THAN 75 ACTIONS IN AN ACTION QUEUE!
//ActionDoCommand(AssignCommand(oNPC, ActionSpeakString("Hello")));

//Eventually, we call
  
ActionDoCommand(FadeToBlack(OBJECT_SELFFADE_SPEED_FAST));
  
ActionWait(2.0);
  
ActionDoCommand(SetCutsceneMode(OBJECT_SELFFALSE));

//Destroy the copy
  
ActionDoCommand(DestroyObject(GetLocalObject(GetModule(), "pccopy")));
  
ActionDoCommand(RemoveEffect(OBJECT_SELFeInv));
  
ActionDoCommand(FadeFromBlack(OBJECT_SELFFADE_SPEED_FAST));
}

//Function for creating a copy of the PC
void CreateCopy(object oPC OBJECT_SELF)
{
  
object oCopy=CopyObject(oPCGetLocation(oPC));

//Make sure the copy likes the PC
  
SetIsTemporaryFriend(oPCoCopy);

//Store so we can destroy later!
  
SetLocalObject(GetModule(), "pccopy"oCopy);



<edit>
J'avais pas fait gaffe sur le coup, mais cette ligne est bizarre :
if (GetTag(GetItemActivated()) == "clone_fists")
à la rigueur, faudrait la mettre au début et la faire suivre de { et } autour du bloc. Là c'est euh..
Petite note: les tentatives de modification de faction sur des clones de Pjs peuvent conduire à des bugs. Ca n'est pas le bug que j'exploitais (à savoir que des scripts affectés par un effet domination deviennent permanent sur la copie) mais encore autre chose... Certaines des copies - c'est apparament aléatoire - sont simplement en dehors du système de faction. J'avais trouvé un moyen de contourner ça. Si le problème se pose à nouveau, je regarderais ce que j'avais fait (me souviens plus...) .

PS: de toute façon j'ai promis à quelqu'un de me repencher la-dessus. Ahem, j'ai vraiment pas de temps en ce moment mais j'y pense désolé...
pendant un temp je voulais faire combattre au pj sont clone a l'identique caracteristique et equipement. Ce script peut t'il aider ou le clone seras t'il obligatoirement un allie?
Tiens, je viens de tester et le flag plot empêche pas le disarm. C'est pratique pour s'équiper. (surtout que le double riposte pas )

Si tu ne veux pas qu'il soit allié, tu changes ça :
SetPCLike(oPC, oFireGuy);
par un SetIsTemporaryEnemy(oPC, oFireGuy).
Pour le désarmement, on peut faire un
if (GetIsObjectValid(GetLocalObject(GetModuleItemLostBy(), "X0_L_MYMASTER")))
DestroyObject(GetModuleItemLost());

Mais ça ne résoudra pas le problème du loot si le clone n'est pas intrigue... (vu que GetModuleItemLostBy est "invalid" en cas de drop à la mort)

(hem, c'est soirée flood aujourd'hui ^^)
J'avais posé la question il ya quelque temps sur les forums Bioware et on m'avait filé ce script que j'ai légèrement modifié:


Code PHP:

#include "NW_I0_GENERIC"

void main()
{
object oClone ;
object oPC GetLastUsedBy() ;


    
oClone CopyObject(oPCGetLocation(OBJECT_SELF));
    
AssignCommand(oCloneSetIsDestroyable(FALSEFALSE));
     
int nGold GetGold(oClone);
     
TakeGoldFromCreature(nGoldoCloneTRUE);
     
ChangeToStandardFaction(oCloneSTANDARD_FACTION_HOSTILE) ;
    
ExecuteScript("clone_hb"oClone) ;

Ca c'est clone_hb:
Code PHP:

/*
 **Mr. Nathan's Clone script**
Usage: This is the combat scheduler script that also handles death for the clone.  If you change the name make sure you change it in the Execute script both in this script and in the trigger script.  Otherwise it should be named clone_hb
*/
void main()
{
    
// Check if the copy is dead yet
    
if(GetIsDead(OBJECT_SELF))
    {
        
object oItem;
        
int nSlot;
        
//Copy is dead so clean it out. and run the death script.
        
AssignCommand(OBJECT_SELFSetIsDestroyable(TRUE));
        for(
nSlot=0nSlot<=17nSlot++)
        {
            
oItem=GetItemInSlot(nSlotOBJECT_SELF);
            if (
GetIsObjectValid(oItem)) DestroyObject(oItem0.1);
        }
        
oItem=GetFirstItemInInventory(OBJECT_SELF);
        while (
GetIsObjectValid(oItem))
        {
            
DestroyObject(oItem);
            
oItem GetNextItemInInventory(OBJECT_SELF);
        }

        
ExecuteScript("nw_c2_default7"OBJECT_SELF);
        
DestroyObject(OBJECT_SELF0.1);
    }
    else
    {
        
// copy is still alive, so do a combat round and reschedule this script
        
ExecuteScript("nw_c2_default3"OBJECT_SELF);
        
// combat rounds are 6 seconds long
        
DelayCommand(6.0ExecuteScript("clone_hb"OBJECT_SELF));
    }

Pour le butin une boucle avec SetDroppableFlag(oItem, FALSE) marcherait non?
Personnellement le coup du HB ou de l'appel récursif d'un script pour le combat ça ne me plaît pas. J'ai fais des test la dessus et ça devient très rapidement le bordel: HB et OnCombatRoundEnd ça n'est pas la même chose. L'appel récursif ne respectera pas les actions entamées précédemment.
Le problème c'est que le clone apparait sans scripts, donc c'est (c'était?) impossible de le faire attaquer sans ce truc. Mais ça a changé depuis la 1.32, notamment il apparait amical alors qu'avant il était hostile... Il faut regarder si ça a évolué pour le reste aussi ^^.
Citation :
Provient du message de drugriam
pendant un temp je voulais faire combattre au pj sont clone a l'identique çaracteristique et equipement. Ce script peut t'il aider ou le clone seras t'il obligatoirement un allie?

Je pense que le Script qu'à Fait RAT sur le Doppleganger pourrait t'être utile pour ce genre de chose. Car justement, il permet de créer un Clone Hostile du personnage qui l'attaque automatiquement.

Je vais te mettre un lien ou tu pourras DL le Script et il me semble un module test.

Ici même dans la zone téléchargement

J'espère que ca te sera utile

Par contre je sais pas si depuis la 1.30 il y a pas des modifs a faire dans le script. N'étant pas Scripteur moi même :P
Normalement non, comme je ne fais pas du tout appel à beaucoup de fonctions excepté le copyobject.


Mais sinon, il se trouve aussi sur maskado le doppelganger et le doppelganger ESP.
Citation :
Provient du message de RAT
Normalement non, comme je ne fais pas du tout appel à beaucoup de fonctions excepté le copyobject.


Mais sinon, il se trouve aussi sur maskado le doppelganger et le doppelganger ESP.
Merci je vais teste ça de suite
Répondre

Connectés sur ce fil

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