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

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

Faire un vrai dodo

Par Skanzo Sylan le 6/2/2003 à 2:42:03 (#3180775)

Alors oui, c'est encore moua :D


J'ai un ch'tit truc marrant sur lequel réflechir et ma foi, ben ça serait sympô de voir ça dans un module (pour ainsi dire tous).

P'tet que ça a été déjà fait mais je vous dit la chose quand même.

C'est en bidouillant un lit à baldaquin pour Kaïba que j'ai essayé de faire un vrai Rest mais couché, d'ailleurs je me demande comment les gens font pour se reposer efficacement en position assis m'enfin bon.. :rolleyes:

J'ai déjà fait ça:

void main() {
object oPlayer = GetLastUsedBy();
effect eSnore = EffectVisualEffect(VFX_IMP_SLEEP);
float fFacing = GetFacing(OBJECT_SELF);
location lDodo = GetLocation(OBJECT_SELF);
int i;

for(i = 0 ; i <= NUM_INVENTORY_SLOTS ; i++){
object oItem = GetItemInSlot(i, oPlayer);
if(oItem != OBJECT_INVALID){
AssignCommand( oPlayer, ActionUnequipItem( oItem));
}
}

AssignCommand( oPlayer, JumpToLocation( lDodo));
AssignCommand( oPlayer, SetFacing( fFacing));

AssignCommand( oPlayer, ActionPlayAnimation( ANIMATION_LOOPING_DEAD_FRONT, 1.0, 5.0 ) );
ApplyEffectToObject( DURATION_TYPE_TEMPORARY, eSnore, oPlayer, 1.0 );
DelayCommand( 5.0, AssignCommand( oPlayer, ActionRest()));
}


Comme d'habitude c'est du sauvage :hardos:

Ça fonctionne sur un objet invisible.

- le perso s'approche
- vire ses fringues (merci la biblio persistante)
- se positionne sur l'objet invisible
- s'oriente dans la bonne direction
- se couche (brusquement mais ya que ça..)
- Les ZZzzzZZZ qui apparaissent (juste une fois, c'est juste pour le style)
- Une fois que le temps est ecoulé (suivant le niveau du PJ que je dois rajouter), le perso fait un bref Rest (1/10 de seconde en modifiant le restduration.2DA).

Tout ça marche bien :)
Ainsi on a quelque chose qui ressemble plus à un repos, surtout si on a un bon lit :p


Maintenant le problème est que si le joueur fait une autre action pendant les quelques secondes où il est au repos, c'est à dire pendant la phase où il est couché sur le ventre, l'ActionRest aura quand même lieu.

Il faudrait donc un moyen de faire un clearallactions si cela arrive.


Personnellement, ça donnerait vraiment plus liberté pour le repos. Rien que de pouvoir faire varier le temps de repos selon les conditions (en exterieur, suivant le type de chambre...), ce serait vraiment sympô :)

http://membres.lycos.fr/skanzo/images/dodo.jpg

Par Daidoji le 6/2/2003 à 4:35:02 (#3181063)

EXCELLENT !!
Je prends pour EoW, Aerthya et Rokugan :amour:

Par RAT le 6/2/2003 à 10:26:52 (#3181962)

Super!!

Cela m'interresse aussi :) :merci:

Par Iridian le 6/2/2003 à 10:42:06 (#3182049)

Excelent, j'adopte !

Par Delphinea le 6/2/2003 à 12:49:32 (#3182829)

Avec un Blind Effect en plus et c'est parfait.

La fin de ton script est prise du HakPak de BROlanda sur NWNVault je pense.

Voici celui que j'utilise (à mettre dans le OnUsed d'un objet invisible juste devant le lit, en créant auparavant un WP_lit sur le lit):

void ApplySleepEffects(object oPC)
{
effect eSnore = EffectVisualEffect(VFX_IMP_SLEEP);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSnore, oPC, 7.0);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSnore, oPC, 7.0);
effect eBad = GetFirstEffect(oPC);
int nBlindMe=1;
while(GetIsEffectValid(eBad))
{
int nEtype=GetEffectType(eBad);
if(nEtype==EFFECT_TYPE_TRUESEEING)
nBlindMe=0;
eBad=GetNextEffect(oPC);
}
if(nBlindMe)
{
effect eBlind = SupernaturalEffect(EffectBlindness());
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBlind, oPC, 29.0);
}
DelayCommand(7.0, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSnore, oPC, 7.0));
}

void RemoveSleepBlindness(object oPC)
{
effect eBad = GetFirstEffect(oPC);
while(GetIsEffectValid(eBad))
{
int nEtype=GetEffectType(eBad);
if (nEtype == EFFECT_TYPE_BLINDNESS)
{
RemoveEffect(oPC, eBad);
}
eBad = GetNextEffect(oPC);
}
}

void main()
{
object oPC = GetLastUsedBy();
object oLit = GetNearestObjectByTag("WP_Lit");
int nLastRestType=GetLastRestEventType();
int is;

for(is = 0 ; is <= NUM_INVENTORY_SLOTS ; is++)
{
object oObjetequip = GetItemInSlot(is, oPC);
if(oObjetequip != OBJECT_INVALID)
{
AssignCommand(oPC, ActionUnequipItem(oObjetequip));
}
}

AssignCommand(oPC, JumpToLocation(GetLocation(oLit)));
AssignCommand(oPC, ActionDoCommand(SetFacing(GetFacing(oLit))));
AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_DEAD_FRONT, 1.0f, 10.0f));
ApplySleepEffects(oPC);
if (nLastRestType == REST_EVENTTYPE_REST_FINISHED ||
nLastRestType == REST_EVENTTYPE_REST_CANCELLED)
{
RemoveSleepBlindness(oPC);
}
}

Par Skanzo Sylan le 6/2/2003 à 23:04:10 (#3186535)

Merci Delphinea :merci:

Je vais d'abord purifier le script, le réduire au plus simple pour inclure le Rest et ensuite ajouter ton script ;)

(Oui, il provient bien du hak-pack de Brolanda)

Par Azrael07 le 7/2/2003 à 0:16:07 (#3186940)

:) alors la félicitation. Je prend :)

Par JerrySevere le 7/2/2003 à 15:11:55 (#3190494)

euh... moi j'arrive pas a etre sur le lit.. je m'endort à chaque fois au pied du lit , j'ai essayé avec plusieurs lit : le baldaquin , ou alors un custom placeable lit ...

c'est grave docteur ??

j'en profite pour passer un tit coucou à skanzo et à RAT

Par Jedaï le 7/2/2003 à 18:25:15 (#3192028)

Il y a un autre post là-dessus, les lits Bioware ne sont pas "dormable"...:(

Par JerrySevere le 7/2/2003 à 20:19:30 (#3192892)

ben en voyant le screen de skanzo , me suis dit qu'il avait reussi le tour de force :p

et pis sinon a koi il servirait le WP_lit ?? et le jumptolocation a celui-ci.. ?

Par RAT le 8/2/2003 à 2:36:48 (#3194766)


j'en profite pour passer un tit coucou à skanzo et à RAT

Coucou à toi Jerry, tiens d'ailleurs faudrait que je te parle, tu pourrais m'envoyer ton icq si tu as ou msn ou mail lol??

Sinon pour les lits , par rapport au lit en fait normalement il y a un hak à récupérer si je me trompe pas, c'était sur vault???

Je me trompe peut être mais si je me souviens bien , il faut quand même prendre un hak, et là cela marche avec le waypoint.

Sinon votre système est tout simplement super!!!!

Par Delphinea le 8/2/2003 à 11:21:20 (#3195616)

Oui, il faut utiliser le Hak de BROlanda sur NWNVault. (Je n'ai pas été très clair dans mon post à ce sujet, je suis plus doué pour coder que pour présenter :D )

Pourquoi la nécessité d'un WP ? Parce que, même si tu mettais le script dans le OnUsed (comme pour une chaise par exemple), il ne se coucherait pas au bon endroit sur le lit. Avec le WP au moins c'est sur ;)

PS: Je tiens à dire que tout le code n'est pas de moi, j'ai emprunté les 2 pré-fonctions à Archaegeo et son équipe, et j'ai remanié le tout, purifiant le code de pas mal de choses et ajoutant quelques lignes par-ci par-là, voilà :blabla:

Par Skanzo Sylan le 8/2/2003 à 17:09:19 (#3197245)

Salut Jerry ;)

Je confirme:
On peut grimper sur le lit :hardos:

Ya quelques bugs de collision avec l'objet plaçable mais ça va s'arranger. Je posterai le hak-pack en même temps que le script.

Par contre, y'aura beaucoup beaucoup de choses qui ne sera pô possible de faire comme le lit ne devra pô chevaucher deux tiles à la fois ou obligation d'avoir une tuile parfaitement plane.

On pourra même faire des escabeau, des estrades pour musiciens dans une auberge, un podium pour les vainqueurs d'un tournoi, etc.


M'enfin c'était pô le but de ce sujet.

Pour l'instant, mon perso se deshabille, se couche, garde l'animation pendant dix secondes environs puis fais un ActionRest.

Je voudrais que l'ActionRest ne soit plus valide si le perso se rélève avant la fin de l'animation.

Une idée? :merci:

Par Ormus le 8/2/2003 à 17:24:02 (#3197312)

Hmm je pense que le mieux serait d'enlever l'animation associée au ActionRest...c'est possible ?

Par Azrael07 le 8/2/2003 à 18:18:16 (#3197573)

alors attend voir, j'avais deja rencontré un problème de ce type dans ma biblio sur les chaines d'actions....... je regarde....

bon je vais peut etre dire une connerie, mais il me semble que si tu remplace ton


DelayCommand( 5.0, AssignCommand( oPlayer, ActionRest()));

par


AssignCommand(oPlayer, ActionWait(5.0f));
AssignCommand(oPlayer, ActionRest());


tu devrais arriver à quelque chose qui marche non ?

Par Delphinea le 8/2/2003 à 18:43:51 (#3197688)

Tu peux simplement mettre que l'ActionRest ne s'effectue qu'à la fin de l'animation.

Par Skanzo Sylan le 8/2/2003 à 20:16:44 (#3198256)

J'ai commencé avec deux petits scripts de base :

// Sur le OnUsed de l'object invisible
void main() {
object oPC = GetLastUsedBy();

// Le PC fait l'animation de se coucher ventre contre terre.
// Notez que la duree de l'animation dependra du lvl et des conditions de repos.
AssignCommand( oPC, ActionPlayAnimation( ANIMATION_LOOPING_DEAD_FRONT, 1.0f, 10.0f));

// Cette variable permettra au PC de faire l'ActionRest.
DelayCommand( 10.0f, SetLocalInt( oPC, "REST_AVAILABLE", TRUE));

// L'ActionRest est bref, un dizieme de seconde (grace a restduration.2DA), et
// cela peu importe le niveau du personnage.
DelayCommand( 10.0f, AssignCommand( oPC, ActionRest()));
}

// Dans le OnRest du module
void main() {
object oPC = GetLastPCRested();
int bRest = GetLocalInt( oPC, "REST_AVAILABLE");
int nRestEvent = GetLastRestEventType();

// Si la variable est TRUE (utilisation de l'objet invisible) et si le repos
// commence (REST_EVENTTYPE_REST_*), on laisse faire le Rest. On remet la variable local en FALSE
// pour que le PC ne puisse pas dormir ailleurs.
if ( bRest && nRestEvent == REST_EVENTTYPE_REST_STARTED) {
SetLocalInt( oPC, "REST_AVAILABLE", FALSE);
}

// Si la variable est FALSE (repos autrement qu'avec le lit) et si le repos commence,
// un message previent que l'endroit n'est pas propice au repos. Le ClearAllActions
// annule l'ActionRest.
if ( !bRest && nRestEvent == REST_EVENTTYPE_REST_STARTED) {
FloatingTextStringOnCreature( "Vous ne pouvez pas dormir ici", oPC);
AssignCommand( oPC, ClearAllActions());
}
}


Ça fonctionne impec et on peut rajouter une tonne de truc.

Mais dans un cas particuliers, le système n'est pas très crédible.

Imaginons que pour une raison ou une autre, le personnage soit obligé d'ecourter son repos (pendant le DEAD_FRONT). Dans ce cas le perso n'a pas fait un sommeil complet.
Ceci a pour effet que les sorts qu'il a préparé ne doivent pas être utilisable. Il doit refaire un sommeil complet pour les avoir.

Le problème avec mes deux petits scripts est que l'ActionRest est commandé pour 10 secondes après le début de l'animation DEAD_FRONT.
Si le personnage stoppe le DEAD_FRONT 4 secondes avant l'ActionRest, alors ce dernier aura quand même lieu une fois le temps terminé.

Voilà où j'en suis :)

Par Azrael07 le 8/2/2003 à 21:36:26 (#3198584)

Provient de mon message a moi :D
alors attend voir, j'avais deja rencontré un problème de ce type dans ma biblio sur les chaines d'actions....... je regarde....

bon je vais peut etre dire une connerie, mais il me semble que si tu remplace ton


DelayCommand( 5.0, AssignCommand( oPlayer, ActionRest()));

par


AssignCommand(oPlayer, ActionWait(5.0f));
AssignCommand(oPlayer, ActionRest());


tu devrais arriver à quelque chose qui marche non ?


alors c'est que
1) t'as pas vu le message pasqu'il est en fin de page
2) Ca marche pas mais t'as oublié de le préciser
3) J'ai rien compris au truc et t'as pas pris la peine de me rembaler (le pov' n'azra fô pas le frustrer :bouffon: )
-> d'autres trucs ?

Non plus serieusement je pense que faire comme ca suffit a ne pas effectuer l'ActionRest si ton pj se met à faire autre chose

Par Skanzo Sylan le 9/2/2003 à 13:00:33 (#3201148)

Ben heu...

J'avais pô essayé mais j'avais déjà testé un truc dans ce genre et ce n'était pô fameux je crois :ange:

Donc là j'ai fais le test et non, marche pô :(

L'ActionRest se fait aussitôt, peu importe les actions programmées avant. Comme si l'ActionRest procédait à un ClearAllActions juste avant de s'enclencher.

Au lieu de l'ActionRest, j'ai essayé avec ActionSit, il se met bien tout en bas de la pile.

Dit y'en a beaucoup des actions prioritaires comme ça? Paske c'est vraiment pô pratique :monstre:

Comment t'as résolu le problème dans ta biblio? Avec ActionWait, sûr? :confus:

Par Skanzo Sylan le 9/2/2003 à 13:12:53 (#3201228)

Mouarf, j'ai trouvé la feinte :mdr:

Tu avais raison l'ActionWait est tout bon :)

AssignCommand( oPC, ActionWait( 5.0f));
AssignCommand( oPC, ActionDoCommand( ActionRest()));


Excellent :maboule:

Par Azrael07 le 9/2/2003 à 13:54:26 (#3201448)

Sur ma biblio j'avais le gros problème que la fonction ActionRest marchais pas du tout comme les autres, mais avec ca c parfaiiiiiiiiiiiiiiiiit
Mettre un DoCommand avant...... c merveilleux merci la tu me corigge le principal bug du ma lib :)

(je t'avais mis ces lignes en oubliant que le ActionRest merdais a ce point)

Enfin bon j'aimerais savoir prq bioware nous a mis un Action devant le Rest si elle marche pas comme les autres action :confus: :confus: :confus:

je suppose qu'il fo pas chercher..........

ben en tout cas encore merci, et bravo pour les lits c fabuleux :amour: :amour: :amour: :amour:

Par Skanzo Sylan le 9/2/2003 à 14:52:32 (#3201786)

Enfin bon j'aimerais savoir prq bioware nous a mis un Action devant le Rest si elle marche pas comme les autres action


Va comprendre Charles :rolleyes:

D'ailleurs pourquoi on peut pô faire de skinmesh sur une armure. Et pis pourquoi ya pô moyen de récupérer l'heure et date du serveur avec une fonction toute bête. Et pis comment ça se fait qu'on soit obligé de faire des walkmeshs de 10 mètres de côté pour faire un plaçable walkable. De plus c'est la misère pour partager une voûte entre plusieurs serveurs. gnagnagni gnagnagna........ :enerve:

J'adore ce jeu! :amour:

Par RAT le 10/2/2003 à 2:17:14 (#3205075)

on voit vraiment que cela vient du coeur lol :D:mdr:

JOL Archives 1.0.1
@ JOL / JeuxOnLine