script:l'ethnie vampire

Répondre
Partager Rechercher
j'ai essayer de faire un script pour que ceux qui écrive dans ethnie:Vampire ai des dégâts divin quand ils sont au soleil et qu'il ai quelques bonus comme par exemple:une petite régénération,+ 6 a leurs CA,+6 en force,+4 en dextérité,+2 en intelligences,+2 en sagesse,+4 en charisme et +4 en constitution.

J'ai essayer de le faire mais c'est vraiment trop balèze pour moi et je me suis cassé la tète pendant 2 jour ,
j'espère que vous pourrez m'aidez.
Déjà pour les bonus, je pense qu'il faut utiliser des effect de type permanent avec ApplyEffectToObject, l'object étant le joueur.

Après, pour faire des dégats, ben moi je pense à un script sur le OnHeartBeat qui vérifie à chaque heartbeat s'il fait jour.

Reste à savoir à quelle fréquence tu souhaites appliquer les dégâts : toutes les minutes ? toutes les 2 minutes ?

Il suffit à chaque hb d'incrémenter un variable locale stockée dans le joueur, et quand la variable est à 10 ou 20 par ex, d'appliquer les dégâts...

Enfin bon vu le niveau des scripteurs sur ce forum, certains risquent de bondir en lisant mon post (je sais qu'il faut éviter le heartbeat, mais bon c'est tellement pratique...) et me dire "évite de donner des conseils si t'y connais rien !!"...

Ps: en lisant ton post on ne sait pas à quel niveau tu es bloqué, essaye d'être plus précis si possible !
J’ai réussi à faire quelque chose qui peut t’intéresser, sachant que c’est pour un module solo. Pour un module multi, c’est peut-être un peu plus compliqué…

Voilà :
Dans le OnEnter de la zone de départ de ton module tu mets ce script :

Code PHP:

void main()
{
if (
GetLocalInt(GetFirstPC(),"nDefini")!=&& GetDeity(GetFirstPC())=="Vampire")
    {
    
effect eCa=EffectACIncrease(6);
    
effect eForce=EffectAbilityIncrease(ABILITY_STRENGTH,6);
    
effect eDex=EffectAbilityIncrease(ABILITY_DEXTERITY,4);
    
effect eInt=EffectAbilityIncrease(ABILITY_INTELLIGENCE,2);
    
effect eSag=EffectAbilityIncrease(ABILITY_WISDOM,2);
    
effect eChar=EffectAbilityIncrease(ABILITY_CHARISMA,4);
    
effect eCon=EffectAbilityIncrease(ABILITY_CONSTITUTION,4);
    
ApplyEffectToObject(DURATION_TYPE_PERMANENT,eCa,GetFirstPC());
    
ApplyEffectToObject(DURATION_TYPE_PERMANENT,eForce,GetFirstPC());
    
ApplyEffectToObject(DURATION_TYPE_PERMANENT,eDex,GetFirstPC());
    
ApplyEffectToObject(DURATION_TYPE_PERMANENT,eInt,GetFirstPC());
    
ApplyEffectToObject(DURATION_TYPE_PERMANENT,eSag,GetFirstPC());
    
ApplyEffectToObject(DURATION_TYPE_PERMANENT,eChar,GetFirstPC());
    
ApplyEffectToObject(DURATION_TYPE_PERMANENT,eCon,GetFirstPC());
    
SetLocalInt(GetFirstPC(),"nCompteur",0);
    
SetLocalInt(GetFirstPC(),"nDefini",1);
    }

Ce script sert à vérifier si l’ethnie est « Vampire », et dans ce cas il accorde des bonus et initialise une variable locale nCompteur.

Après, sur le HeartBeat de ton module tu mets ça :
Code PHP:

void main()
{
if (
GetIsDay() && GetDeity(GetFirstPC())=="Vampire")
    {
    
int nCount=GetLocalInt(GetFirstPC(),"nCompteur");
    if (
nCount 9)
        {
        
effect eBrule=EffectDamage(2,DAMAGE_TYPE_DIVINE);
        
ApplyEffectToObject(DURATION_TYPE_PERMANENT,eBrule,GetFirstPC());
        
SetLocalInt(GetFirstPC(),"nCompteur",0);
        }
    else 
SetLocalInt(GetFirstPC(),"nCompteur",nCount+1);
    }

Ou alors tu le mets sur le heartbeat de chaque zone extérieure, si tu veux que les vampires puissent se déplacer le jour dans les zones d’intérieur sans avoir à subir de dégâts…

Ce deuxième script incrémente la variable locale nCompteur de 1 à chaque heartbeat et vérifie si c’est supérieur à 9 : dans ce cas on inflige les dégâts et on remet le compteur à zéro. Tout ceci si le joueur est un vampire bien-sûr.

A toi maintenant d’ajuster la fréquence et la gravité de ces dégâts, dans le deuxième script.
Dans cet exemple, c’est 2 pv toutes les minutes.
Attention aussi à la différence entre « Vampire » et « vampire »…
Pour la régénération, ça ne doit pas être très compliqué, tu peux par ex donner aux vampires un objet magique utilisable une fois par jour qui permet de faire des sorts de soin…facile à faire juste avec Aurora il me semble.
Assez horrible tout cela, comme tu l'avais toi-même dit...
D'abord tous ces effets devrait être mis en ExtraordinaryEffect() pour persister même après un repos, ensuite il faudrait voir à ne pas confondre "dieu" (GetDeity()) et "Ethnie" (GetSubRace()), En plus, il faut optimiser un minimum tes scripts et mettre dans des variables les données que tu utilises plus d'une fois, ici GetFirstPC() !

Bon, je te propose donc une solution plus souple, plus sûre et adapté au multijoueur :
Code PHP:

//Ceci est à mettre dans le OnClientEnter de ton module :

//Une fonction qui vérifie la nature de oPC et lui applique
//des effets spéciaux s'il est un vampire
void Vampireobject oPC );

void Vampireobject oPC ){
    
    if ( 
GetStringLowerCaseGetSubRaceoPC ) ) == "vampire" ){
        
        
effect eCa ExtraordinaryEffectEffectACIncrease(6) );
        
effect eForce ExtraordinaryEffectEffectAbilityIncreaseABILITY_STRENGTH) );
        
effect eDex ExtraordinaryEffectEffectAbilityIncreaseABILITY_DEXTERITY) );
        
effect eInt ExtraordinaryEffectEffectAbilityIncreaseABILITY_INTELLIGENCE) );
        
effect eSag ExtraordinaryEffectEffectAbilityIncreaseABILITY_WISDOM) );
        
effect eChar ExtraordinaryEffectEffectAbilityIncreaseABILITY_CHARISMA) );
        
effect eCon ExtraordinaryEffectEffectAbilityIncreaseABILITY_CONSTITUTION) );
        
ApplyEffectToObjectDURATION_TYPE_PERMANENTeCaoPC );
        
ApplyEffectToObjectDURATION_TYPE_PERMANENTeForceoPC );
        
ApplyEffectToObjectDURATION_TYPE_PERMANENTeDexoPC );
        
ApplyEffectToObjectDURATION_TYPE_PERMANENTeIntoPC );
        
ApplyEffectToObjectDURATION_TYPE_PERMANENTeSagoPC );
        
ApplyEffectToObjectDURATION_TYPE_PERMANENTeCharoPC );
        
ApplyEffectToObjectDURATION_TYPE_PERMANENTeConoPC );
        
        
//On lance l'exécution du script qui grillera les vampires imprudents
        
ExecuteScript"ohb_vampire"oPC );
        
    }
    
}

void main(){
    
    
//On récupère le PJ qui entre dans le module
    
object oPJ GetEnteringObject();
    
    if( 
GetIsPCoPJ ) ){
        
        
//Si c'est un vampire, on lui applique les effets
        
VampireoPJ );
        
    }
    
    
//Tu peux mettre ton code "normal" ici :-)
    

Ensuite, tu crée un nouveau script que tu appelles exactement "ohb_vampire", tu ne le mets nulle part, il suffit qu'il existe dans ta palette de script :
Code PHP:

//Script "ohb_vampire"

void main(){
    
    {
        
        
object oSelf OBJECT_SELF;
        
        if( 
GetIsDay() && !GetLocalIntoSelf"bInterieur" ) ){
            
            
//Quantité de dégats
            
int nDegats d6(2);
            
            
effect eFeu EffectDamagenDegatsDAMAGE_TYPE_FIRE );
            
ApplyEffectToObjectDURATION_TYPE_INSTANTeFeuoSelf );
            
            
//Tu peux rajouter des effets spéciaux ou un avertissement si tu veux
            
        
}
        
    }
    
    
//Change ici le délai entre chaque exécution du script
    
DelayCommand20.0fExecuteScript"ohb_vampire"OBJECT_SELF );
    

Maintenant, il te suffit de mettre ces scripts dans les évènements OnEnter et OnExit d'une zone ou d'un trigger (déclencheur) pour en faire une zone d'intérieur, où le vampire ne risque rien :
Code PHP:

//OnEnter :

void main(){
    
    
object oPJ GetEnteringObject();
    
    if( 
GetIsPCoPJ ) ){
        
        
SetLocalIntoPJ"bInterieur"TRUE );
        
    }
    
    
//Tu peux mettre le reste de ton code ici
    
}

//OnExit :

void main(){
    
    
object oPJ GetExitingObject();
    
    if( 
GetIsPCoPJ ) ){
        
        
DeleteLocalIntoPJ"bInterieur" );
        
    }
    
    
//Tu peux mettre le reste de ton code ici
    

Voilà, avec ça, pas de soucis, en multijoueur comme en solo, ça marchera sans trop charger le CPU !
En parlant de vampires, serait il possible de leur rendre impossible à traverser les cours d'eau et le fait de les pousser dans l'eau leur fait perdre 1/3 pv par round.
Aussi de les empêcher de rentrer dans des lieux privés sans invitation, tant qu'une personne ne leur autorise pas.

Et pour les lycanthropes non naturels, une transformation les jours de pleine lune tous les mois.
Voui voui voui désolé pour la confusion entre Deity et SubRace...

Ton script a l'air bien, mais je ne comprend pas : dans ton script, le vampire qui se balade au soleil ne se fera griller qu'une seule fois, non ?? puisque le script ohb_vampire s'execute sur un OnEnter...
Ou alors je n'ai pas compris la subtilité de la ligne :
Code PHP:

DelayCommand20.0fExecuteScript"ohb_vampire" ); 

Oui, tu n'as pas compris la subtilité, je te fais un petit schéma :
Code PHP:

Le OnEnter déclenche le ohb_vampire =>
le ohb_vampire s'exécute et  relance le ohb_vampire après 20 secondes =>
le nouveau ohb_vampire s'
exécute et relance ohb_vampire après 20 secondes => ..... 
Il s'agit donc d'une boucle avec temporisation entre chaque itération, ou si tu préfères un OnHeartBeat avec une périodicité de 20 secondes (réglable !).

Tiens d'ailleurs le ExecuteScript() ne s'applique pas par défaut à OBJECT_SELF, je vais corriger ça, ça fait deux mois que j'ai même plus NWN installé alors....
De plus, l'avantage c'est qu'on obtient ainsi des boucles indépendantes pour chaque joueur, en effet le OnEnter lance la boucle sur le vampire entrant et la boucle continue à s'exécuter sur ce vampire sans se préoccuper ou sans interférer avec les autres boucles sur les autres joueurs.

C'est un processus très léger et efficace, vraiment très bien à utiliser, surtout si comme moi, tu optimises le script pour éviter que le DelayCommand() soit lourd, ici il doit être très léger.
âââââh, je comprend maintenant.
Je crois que le soleil me ramollit le cerveau.
En fait j'y avait jamais pensé : un script qui se réexécute lui-même, trop génial.
(Ben oui faut bien apprendre...)
En fait avec ça on a plus besoin du heartbeat...
Tu joues avec les scripts comme Satrianni avec une gratte Jedaï, ce n'est aucunement de la flaterie, tu es vraiment trés doué !

En tous cas, ce script sauve mon module, c'est exactement ce qui me manquais pour le rendre encore plus RP.

Merci encore.

Par contre, les pouvoirs permanents du vampire disparaissent encore au 1er repos même avec ExtraordinaryEffect.
J'ai corrigé le "petit" problème du GetEnteringObject() sur le OnExit, mais je ne comprend pas Miragul : Les effets disparaissent toujours après un repos ?
Si oui, essaie de remplacer "ExtraordinaryEffect" par "SupernaturalEffect" dans le premier script, si ça ne marche toujours pas, c'est assez simple à corriger, mais un peu plus lourd.
Et non, c'était une chouette idée mais les effets ne restent pas aprés le repos.

De plus, les vampires subissent également des degats la nuit. Je ne vois pas la modification que je peux apporter...

Quelqu'un aurait une idée ?
Citation :
De plus, les vampires subissent également des degats la nuit. Je ne vois pas la modification que je peux apporter...
Ca c'est impossible, ou alors trois possibilités :
- Tu n'utilises pas mon script, mais quel script utilises-tu ?
- Tu as modifié le script, mais comment ?
- La fonction GetIsDay() a un bug, surprenant que personne ne l'ait rapporté avant dans ce cas....

Pour le problème des effets c'est assez facile à corriger en modifiant le script sur le OnRest, mais j'aimerais bien comprendre cet autre problème d'abord.
Citation :
- Tu n'utilises pas mon script, mais quel script utilises-tu ?
J'utilise bien ton script, j'en ai d'autre dans le même esprit mais ils ne mélangent pas les vampires et les humains en ce qui concerne les dégats du soleil. C'est pour cela que l'idée "ethnie Vampire" convient parfaitement à mon module.


Citation :
- Tu as modifié le script, mais comment ?
Non, aucune modification, j'ai bien cherché ce qui pouvait cloché mais ce script me semble trés bien. Pourtant je met en test 2 zones, une en Nuit totale, l'autre en jour, en mettant les scripts OnEnter et OnExit, le resultat est le même sur les deux zones, le PJ vampire Grille.

Citation :
- La fonction GetIsDay() a un bug, surprenant que personne ne l'ait rapporté avant dans ce cas....
Oui, j'ai eu beaucoup de mal à faire disparaitre des PNJ de nuit avec cette fonction, on se demande si elle marche vraiment de temps à autre, mais je suis assez novice en programmation, alors...

Citation :
Pour le problème des effets c'est assez facile à corriger en modifiant le script sur le OnRest, mais j'aimerais bien comprendre cet autre problème d'abord.
Oui, si on pouvait passer par le OnRest, ce serai vraiment une solution car tous repose pratiquement là dessus pour le PJ Vampire mais il faut bien penser que juste l'Ethnie "Vampire" est concernée... Il est peut-être possible de prendre la gestion des subrace par le HCR comme exemple, je vais chercher ça.
Lightbulb
En ce qui concerne la création d'une nouvelle race par script...
Ayant moi même luté pour tenter celle des Garous, je peu te dire ceci :
Les effects c'est nul... aucune permanence. A la place il vaut mieux passer par des objets de créatures et la tu as encore un problème : la limitation liée au niveau du personnage, à cela tu a 2 solutions (enfin les 2 les plus simples):
-1- Faire une évolution de l'objet en question en fonction du niveau du personnage.
-2- Enlever la limite de niveau, mais attention je ne conseille de faire ceci que si ton module est vraiment très bien équilibré (pas d'objets +5 à tout les coins de rues)
-3- (vi je sais j'avais dit 2 solutions, la 3éme c'est tout simplement d'abandonner l'idée de scripter, de créer une nouvelle race et de ne plus utiliser ethnie) Vas falloir maitriser les Hack ! ! !
Bon, aprés maintes manipulations du script de Jedaï, j'ai réussis à avoir quelque chose de satisfaisant mais il reste néanmoins un problème majeur.

Voici le nouveau ohb_vampire

Code PHP:

void main(){

    {

        
object oSelf OBJECT_SELF;
        if (
GetIsPC(oSelf) && ((GetIsDawn() == TRUE) || (GetIsDay() == TRUE)) && (GetLocalInt(oSelf ,"bInterieur")==1))
 {
            
ApplyEffectToObject (DURATION_TYPE_INSTANT,EffectDamage1,DAMAGE_TYPE_MAGICAL,DAMAGE_POWER_NORMAL),OBJECT_SELF,1.0);
            
ApplyEffectToObject (DURATION_TYPE_INSTANT,EffectVisualEffect (VFX_FNF_SMOKE_PUFF),OBJECT_SELF,1.0);
        }

    }

    
//Change ici le délai entre chaque exécution du script
    
DelayCommand1.0fExecuteScript"ohb_vampire"OBJECT_SELF )); 
Le problème persiste dans le fait que le GetIsDay se référe au compteur de minute, c'est à dire qu'il peut faire jour au fin fond d'un donjon et bien sûr, le vampire crame dans une area night only. Pour le detail, j'ai aussi modifié l'aspect des brûlures du vampire et le rythme des pertes HP, je trouve cela plus réaliste...

Il ne me reste plus grand chose pour arriver à quelque chose de correct, si quelqu'un pouvait m'aider à faire appliquer les degâts du soleil quand le PJ est au jour et non forcement pendant les heures de journée, je serais vraiment ravis.

Merci beaucoup.
Merci beaucoup a tous et j'ai trouvé une solution pour que les effet ne disparaisse pas il suffit de les faire s'exécuter en boucle en mettant ceci:
Code PHP:

DelayCommand5.0fExecuteScript"ethnievampire"OBJECT_SELF)); 

dans le premier script en dessous de:
Code PHP:

ExecuteScript"ohb_vampire"oPC ); 

oui c'est encore moi,j'aimerai faire un peu près la même chose pour les loup garou j'ai donc tenté d'adapter le script de vampire au loup garou en le mettant a la suite du script pour vampire mais les effet ne s'applique jamais la nuit et je ne sais pas pourquoi voila le script

Code PHP:

void LoupGarouobject oPC);

void LoupGarouobject oPC){


        if( 
GetStringLowerCaseGetSubRace(oPC) ) == "Loup Garou" && GetIsNight() && !GetLocalIntoPC"night" ) ){


            
ApplyEffectToObjectDURATION_TYPE_PERMANENT,EffectPolymorph(POLYMORPH_TYPE_WEREWOLF),oPC  );
            
ApplyEffectToObjectDURATION_TYPE_PERMANENT,EffectMovementSpeedIncrease(10),oPC);
            
effect eForce ExtraordinaryEffectEffectAbilityIncreaseABILITY_STRENGTH13 ) );
            
effect eDex ExtraordinaryEffectEffectAbilityIncreaseABILITY_DEXTERITY15 ) );
            
effect eInt ExtraordinaryEffectEffectAbilityIncreaseABILITY_INTELLIGENCE10 ) );
            
effect eSag ExtraordinaryEffectEffectAbilityIncreaseABILITY_WISDOM10 ) );
            
effect eChar ExtraordinaryEffectEffectAbilityIncreaseABILITY_CHARISMA10 ) );
            
effect eCon ExtraordinaryEffectEffectAbilityIncreaseABILITY_CONSTITUTION15 ) );
            
ApplyEffectToObjectDURATION_TYPE_PERMANENTeForceoPC );
            
ApplyEffectToObjectDURATION_TYPE_PERMANENTeDexoPC );
            
ApplyEffectToObjectDURATION_TYPE_PERMANENTeIntoPC );
            
ApplyEffectToObjectDURATION_TYPE_PERMANENTeSagoPC );
            
ApplyEffectToObjectDURATION_TYPE_PERMANENTeCharoPC );
            
ApplyEffectToObjectDURATION_TYPE_PERMANENTeConoPC );

            
DelayCommand5.0fExecuteScript"ethnie"OBJECT_SELF));

    }
        if( 
GetStringLowerCaseGetSubRace(oPC) ) == "Loup Garou" && GetIsDay() && !GetLocalIntoPC"Day" ) )
        {
            
effect eForce ExtraordinaryEffectEffectAbilityIncreaseABILITY_STRENGTH13 ) );
            
effect eDex ExtraordinaryEffectEffectAbilityIncreaseABILITY_DEXTERITY15 ) );
            
effect eInt ExtraordinaryEffectEffectAbilityIncreaseABILITY_INTELLIGENCE10 ) );
            
effect eSag ExtraordinaryEffectEffectAbilityIncreaseABILITY_WISDOM10 ) );
            
effect eChar ExtraordinaryEffectEffectAbilityIncreaseABILITY_CHARISMA10 ) );
            
effect eCon ExtraordinaryEffectEffectAbilityIncreaseABILITY_CONSTITUTION15 ) );
            
RemoveEffect(oPC,eForce);
            
RemoveEffect(oPC,eDex);
            
RemoveEffect(oPC,eInt);
            
RemoveEffect(oPC,eSag);
            
RemoveEffect(oPC,eChar);
            
RemoveEffect(oPC,eCon);
            
RemoveEffect(oPC,EffectMovementSpeedIncrease(10));
            
RemoveEffect(oPC,EffectPolymorph(POLYMORPH_TYPE_WEREWOLF));

            
DelayCommand5.0fExecuteScript"ohb_loup"OBJECT_SELF));
  }


j'ai également rajouté ceci dans le script qui vérifiais que c'était un vampire et un joueur qui entrai sur le module

Code PHP:

void main(){

    
//On récupère le PJ qui entre dans le module
    
object oPJ GetEnteringObject();

    if( 
GetIsPCoPJ ) ){

        
//Si c'est un vampire, on lui applique les effets
        
Vampire(oPJ);
        
LoupGarou(oPJ);

    }
//Tu peux mettre ton code "normal" ici :-)

@ Miragul > C'est simple, il suffit que tu fasse la même chose pour les zones nuit permanente que pour les zones intérieures, c'est à dire les scripts OnEnter et OnExit, autre chose, le test GetIsPC() que tu as rajouté est inutile.
Est-ce que tu as toujours ton problème avec les effets ?
Si oui, je te ferais un script pour ton OnRest.

Mark, j'ai l'impression que tu n'as pas très bien compris le principe....
Merci de ton aide Jedaï, oui, j'ai toujours le problèmes des effets.

Je vais retoucher mon script . En revanche, j'applique les scripts OnEnter et OnExit sur toutes mes zones quelles soit Extérieur Jour/nuit ou Interieur Nuit. C'est ce que tu voulais dire ?
Répondre

Connectés sur ce fil

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