Voir le sujet précédent ¤
Voir le sujet suivant
|
Auteur |
Message |
Mans-maniac
Novice
Inscrit le: 02 Sep 2005
Messages: 15
|
Posté le : 06/04/2006 22:20:04 Sujet du message : script de garde modifié pti prob
voila modifié un script pour le port d arme (script de David "The Shadowlord" recuperé ici) j y ai rajouté un objet qui permet au garde pj de patrouiller la ville l arme au poing
tant qu il n y que 1 pj pres du garde ca fonctionne a merveille mais des qu ils sont plusieurs il suffit qu un seul possede l objet pour que le garde n attaque pas les autres
je mets le script si quelqu un a le temps de voir se qui cloche
les modifs concerne
NWScript :Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.
dans le OnHeartBeat
NWScript :#include "NW_I0_GENERIC"string WARNING1 = ""; string WARNING2 = ""; string WARNING3 = ""; string ATTACK_MSG = ""; string COMPLY_REPLY = "Merci messire"; float WARN_DISTANCE = 20.0; float ANGER_DUR = 120.0; void main() { object oPC; object item; oPC = GetNearestCreature( CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, OBJECT_SELF); object oRing = GetItemPossessedBy( oPC, "talorix"); if( oPC != OBJECT_INVALID && ( GetDistanceBetween( OBJECT_SELF, oPC) < WARN_DISTANCE) && GetObjectSeen( oPC) && ! GetIsEnemy( oPC) && oRing == OBJECT_INVALID ) { if(( item = GetItemInSlot( INVENTORY_SLOT_RIGHTHAND, oPC))!= OBJECT_INVALID) { if( GetLocalObject( OBJECT_SELF, "LastOffender")== oPC) { if( GetLocalInt( OBJECT_SELF, "OffenseCount")== 2) { SpeakString( ATTACK_MSG); SetIsTemporaryEnemy( oPC, OBJECT_SELF, TRUE, ANGER_DUR); DeleteLocalInt ( OBJECT_SELF, "OffenseCount"); ActionAttack( oPC); } else if( GetLocalInt( OBJECT_SELF, "OffenseCount")== 1) { ActionMoveToObject( oPC, TRUE); SetLocalInt( OBJECT_SELF, "OffenseCount", 2); SpeakString( WARNING3); } else { SetLocalInt( OBJECT_SELF, "OffenseCount", 1); SpeakString( WARNING2); } } else { SetLocalInt( OBJECT_SELF, "OffenseCount", 0); SpeakString( WARNING1); SetLocalObject( OBJECT_SELF, "LastOffender", oPC); } } else { if( GetLocalObject( OBJECT_SELF, "LastOffender")!= OBJECT_INVALID) SpeakString( COMPLY_REPLY); DeleteLocalObject( OBJECT_SELF, "LastOffender"); SetLocalInt( OBJECT_SELF, "OffenseCount", 0); } } if( GetSpawnInCondition( NW_FLAG_FAST_BUFF_ENEMY)) { if( TalentAdvancedBuff( 40.0)) { SetSpawnInCondition( NW_FLAG_FAST_BUFF_ENEMY, FALSE); return; } } if( GetSpawnInCondition( NW_FLAG_DAY_NIGHT_POSTING)) { int nDay = FALSE; if( GetIsDay() || GetIsDawn()) { nDay = TRUE; } if( GetLocalInt( OBJECT_SELF, "NW_GENERIC_DAY_NIGHT") != nDay) { if( nDay == TRUE) { SetLocalInt( OBJECT_SELF, "NW_GENERIC_DAY_NIGHT", TRUE); } else { SetLocalInt( OBJECT_SELF, "NW_GENERIC_DAY_NIGHT", FALSE); } WalkWayPoints(); } } if(! GetHasEffect( EFFECT_TYPE_SLEEP)) { if(! GetIsPostOrWalking()) { if(! GetIsObjectValid( GetAttemptedAttackTarget()) && ! GetIsObjectValid( GetAttemptedSpellTarget())) { if(! GetIsObjectValid( GetNearestCreature( CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, OBJECT_SELF, 1, CREATURE_TYPE_PERCEPTION, PERCEPTION_SEEN))) { if(! GetBehaviorState( NW_FLAG_BEHAVIOR_SPECIAL) && ! IsInConversation( OBJECT_SELF)) { if( GetSpawnInCondition( NW_FLAG_AMBIENT_ANIMATIONS) || GetSpawnInCondition( NW_FLAG_AMBIENT_ANIMATIONS_AVIAN)) { PlayMobileAmbientAnimations(); } else if( GetIsEncounterCreature() && ! GetIsObjectValid( GetNearestCreature( CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, OBJECT_SELF, 1, CREATURE_TYPE_PERCEPTION, PERCEPTION_SEEN))) { PlayMobileAmbientAnimations(); } else if( GetSpawnInCondition( NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS) && ! GetIsObjectValid( GetNearestCreature( CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, OBJECT_SELF, 1, CREATURE_TYPE_PERCEPTION, PERCEPTION_SEEN))) { PlayImmobileAmbientAnimations(); } } else { DetermineSpecialBehavior(); } } else { } } } } else { if( GetSpawnInCondition( NW_FLAG_SLEEPING_AT_NIGHT)) { effect eVis = EffectVisualEffect( VFX_IMP_SLEEP); if( d10() > 6) { ApplyEffectToObject( DURATION_TYPE_INSTANT, eVis, OBJECT_SELF); } } } if( GetSpawnInCondition( NW_FLAG_HEARTBEAT_EVENT)) { SignalEvent( OBJECT_SELF, EventUserDefined( 1001)); } } Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.
|
|
Revenir en haut |
|
|
Mans-maniac
Novice
Inscrit le: 02 Sep 2005
Messages: 15
|
Posté le : 07/04/2006 19:57:13 Sujet du message :
Personne n a une idée ? J ai essayé en rajoutant un oSeen avec un GetLastPerc mais j ai toujours le meme prob faudrait que une fois qui a testé un pj si detecte l objet "talorix" il passe tous de suite a un autre pj doit surement avoir moyen de faire ca mettez moi sur la voix
|
|
Revenir en haut |
|
|
Macadam
Grand Chevalier
Inscrit le: 07 Avr 2006
Messages: 132
|
Posté le : 07/04/2006 23:55:56 Sujet du message :
pourquoi tu mettrais pas plutot ce script dans le onperception ???
m'est d'avis que ça marcherait déjà mieux
Pour oPC par contre tu mets juste oPC = GetLastPerceived()
enfin c'est juste une idée comme ça
|
|
Revenir en haut |
|
|
Sith Vicious
Grand Sage du Conseil
Inscrit le: 19 Oct 2005
Messages: 693
|
Posté le : 08/04/2006 00:01:11 Sujet du message :
NWScript : object oPC; object item; object oOffender = GetLocalObject( OBJECT_SELF, "LastOffender"); int bOffense, bDistance = TRUE; object oRing; if ( GetIsObjectValid( oOffender) && GetObjectSeen( oOffender)) oPC = oOffender; else { int i = 1; do { oPC = GetNearestCreature( CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, OBJECT_SELF, i++); oRing = GetItemPossessedBy( oPC, "talorix"); item = GetItemInSlot( INVENTORY_SLOT_RIGHTHAND, oPC); bOffense = ( oRing == OBJECT_INVALID && item != OBJECT_INVALID); bDistance = GetDistanceBetween( OBJECT_SELF, oPC) < WARN_DISTANCE ; } while ( oPC != OBJECT_INVALID && bDistance && ! bOffense) } if( bOffense && bDistance && GetObjectSeen( oPC) ) { if( oOffender== oPC) { oRing = GetItemPossessedBy( oPC, "talorix"); item = GetItemInSlot( INVENTORY_SLOT_RIGHTHAND, oPC); if ( oRing == OBJECT_INVALID && item != OBJECT_INVALID) { if( GetLocalInt( OBJECT_SELF, "OffenseCount")== 2) { SpeakString( ATTACK_MSG); SetIsTemporaryEnemy( oPC, OBJECT_SELF, TRUE, ANGER_DUR); DeleteLocalInt ( OBJECT_SELF, "OffenseCount"); DeleteLocalObject( OBJECT_SELF, "LastOffender"); ActionAttack( oPC); } else if( GetLocalInt( OBJECT_SELF, "OffenseCount")== 1) { ActionMoveToObject( oPC, TRUE); SetLocalInt( OBJECT_SELF, "OffenseCount", 2); SpeakString( WARNING3); } else { SetLocalInt( OBJECT_SELF, "OffenseCount", 1); SpeakString( WARNING2); } } else { SpeakString( COMPLY_REPLY); DeleteLocalObject( OBJECT_SELF, "LastOffender"); SetLocalInt( OBJECT_SELF, "OffenseCount", 0); } } else { SetLocalInt( OBJECT_SELF, "OffenseCount", 0); SpeakString( WARNING1); SetLocalObject( OBJECT_SELF, "LastOffender", oPC); } } Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.
Je garantis rien, même pas que ça compile
|
|
Revenir en haut |
|
|
Mans-maniac
Novice
Inscrit le: 02 Sep 2005
Messages: 15
|
Posté le : 08/04/2006 11:18:57 Sujet du message :
Merci je vais tester ca compile manquait juste un ; ligne 37 je te tiens au courrant du resulta
|
|
Revenir en haut |
|
|
Mans-maniac
Novice
Inscrit le: 02 Sep 2005
Messages: 15
|
Posté le : 08/04/2006 15:28:25 Sujet du message :
bon ca marche pas j ai pas pu tester a plusieur mais seul le script se lance le garde dit sa premiere phrase puis plus rien ca viens peu etre du faite qu il essaye de trouver un autre pc et que comme il n y en a il retourne pas sur le 1 er pj testé
je remets ton script complet en dessous version qui compile
NWScript :#include "NW_I0_GENERIC"string WARNING1 = ""; string WARNING2 = ""; string WARNING3 = ""; string ATTACK_MSG = ""; string COMPLY_REPLY = "Merci messire"; float WARN_DISTANCE = 20.0; float ANGER_DUR = 120.0; void main() { object oPC; object item; object oOffender = GetLocalObject( OBJECT_SELF, "LastOffender"); int bOffense, bDistance = TRUE; object oRing; if ( GetIsObjectValid( oOffender) && GetObjectSeen( oOffender)) oPC = oOffender; else { int i = 1; do { oPC = GetNearestCreature( CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, OBJECT_SELF, i++); oRing = GetItemPossessedBy( oPC, "talorix"); item = GetItemInSlot( INVENTORY_SLOT_RIGHTHAND, oPC); bOffense = ( oRing == OBJECT_INVALID && item != OBJECT_INVALID); bDistance = GetDistanceBetween( OBJECT_SELF, oPC) < WARN_DISTANCE ; } while ( oPC != OBJECT_INVALID && bDistance && ! bOffense); } if( bOffense && bDistance && GetObjectSeen( oPC) ) { if( oOffender== oPC) { oRing = GetItemPossessedBy( oPC, "talorix"); item = GetItemInSlot( INVENTORY_SLOT_RIGHTHAND, oPC); if ( oRing == OBJECT_INVALID && item != OBJECT_INVALID) { if( GetLocalInt( OBJECT_SELF, "OffenseCount")== 2) { SpeakString( ATTACK_MSG); SetIsTemporaryEnemy( oPC, OBJECT_SELF, TRUE, ANGER_DUR); DeleteLocalInt ( OBJECT_SELF, "OffenseCount"); DeleteLocalObject( OBJECT_SELF, "LastOffender"); ActionAttack( oPC); } else if( GetLocalInt( OBJECT_SELF, "OffenseCount")== 1) { ActionMoveToObject( oPC, TRUE); SetLocalInt( OBJECT_SELF, "OffenseCount", 2); SpeakString( WARNING3); } else { SetLocalInt( OBJECT_SELF, "OffenseCount", 1); SpeakString( WARNING2); } } else { SpeakString( COMPLY_REPLY); DeleteLocalObject( OBJECT_SELF, "LastOffender"); SetLocalInt( OBJECT_SELF, "OffenseCount", 0); } } else { SetLocalInt( OBJECT_SELF, "OffenseCount", 0); SpeakString( WARNING1); SetLocalObject( OBJECT_SELF, "LastOffender", oPC); } } } Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.
peu t on simplement mettre dans le onheartbeat un script qui detecte si le pj a l object "talorix" s il l a on passe a un autre pj et s il ne la pas lancer le script du garde est ce qu un script peu lancer un autre script ?
|
|
Revenir en haut |
|
|
Macadam
Grand Chevalier
Inscrit le: 07 Avr 2006
Messages: 132
|
Posté le : 08/04/2006 16:33:16 Sujet du message :
ben au risque de me répéter je trouve plus simple de passer par le onperception du PNJ car il detectera le premier joueur qu'il verra tout simplement et en plus ya pas une grosse modif à faire sur ton script pour ça.
Autre avantage, le script ne se declenchera pas toutes les 6 secondes et quoi qu'il arrive mais uniquement s'il y a des PJs à proximité.
De plus plus besoin de boucler vu qu'un seul PJ sera détecté à la fois et s'il est vu et qu'il a "tailorix" alors il ne sera pas menacé et sinon oui.
Je suis quasiment certain que ça marcherait mieux en plus.
Là j'ai pas aurora mais je peux presque l'affirmer.
|
|
Revenir en haut |
|
|
Mans-maniac
Novice
Inscrit le: 02 Sep 2005
Messages: 15
|
Posté le : 08/04/2006 17:46:09 Sujet du message :
detrompe toi c est encore pire je l avais fait comme ca au depard mais avec un get perc si le 1 er percu n a pas l objet il peut attaquer meme un joueur qui le possede et surtout pour que le script fonctionne il doit se repeter plusieur fois de suite d ou l obligation de le mettre dans le onheartbeat
|
|
Revenir en haut |
|
|
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
|
Posté le : 10/04/2006 12:10:47 Sujet du message :
Voilà celui du TN Bouchon, il fonctionne mais fait effectivement partie des points d'optimisation à faire, sur la journée du 9 Avril :
lyon_somation 7334.667mS pour 7853 calls soit 1.6% du temps de tous les scripts
Il fonctionne sur le heart-beat.
Ce message est un spoiler, et risque de vous informer de choses que vous auriez dû apprendre par vous même (fin d'un jeu, film, etc). À vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.Spoiler :NWScript :#include "NW_I0_GENERIC"#include "x2_inc_itemprop"string WARNING1 = "Retirez vos armes !!"; string WARNING2 = ""; string WARNING3 = ""; string ATTACK_MSG = ""; string COMPLY_REPLY = "bien, merci."; float WARN_DISTANCE = 20.0; float ANGER_DUR = 120.0; void main() { object oPC; object oItem; int bWeapon = FALSE ; oPC = GetNearestCreature( CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, OBJECT_SELF); if( oPC != OBJECT_INVALID && ( GetDistanceBetween( OBJECT_SELF, oPC) < WARN_DISTANCE) && GetObjectSeen( oPC) && ! GetIsEnemy( oPC) ){ if( ( GetItemPossessedBy( oPC, "AmulettedesChevaliersdeLyon")!= OBJECT_INVALID) && ( GetLocalInt( OBJECT_SELF, GetFamiliarName( oPC))!= 1) ){ AssignCommand( OBJECT_SELF, ActionPlayAnimation( ANIMATION_FIREFORGET_BOW, 1.0)); if( GetItemPossessedBy( oPC, "InsignedesChevaliersdeLyon")!= OBJECT_INVALID ){ SpeakString( "Bienvenue Seigneur "+ GetFamiliarName( oPC)+ " "+ GetName( oPC)); } SetLocalInt( OBJECT_SELF, GetFamiliarName( oPC), 1); } oItem = GetItemInSlot( INVENTORY_SLOT_RIGHTHAND, oPC) ; if( GetBaseItemType( oItem) >= 300 && GetBaseItemType( oItem) <= 324 ){ bWeapon = TRUE ; if( GetBaseItemType( oItem) == 314 ) bWeapon = FALSE ; } bWeapon = ( bWeapon || IPGetIsMeleeWeapon( oItem) || IPGetIsRangedWeapon( oItem) || GetIsCreatureDisarmable( oPC) ) && ( GetBaseItemType( oItem) != BASE_ITEM_MAGICSTAFF) && ( GetItemPossessedBy( oPC, "AmulettedesChevaliersdeLyon")== OBJECT_INVALID) && ( GetItemPossessedBy( oPC, "InsignedesChevaliersdeLyon")== OBJECT_INVALID) ; if( ( GetLevelByClass( CLASS_TYPE_DRAGON_DISCIPLE, oPC) > 8) && ( d6()== 1) ){ FloatingTextStringOnCreature( "*garde un oeil sur le demi-dragon*", OBJECT_SELF, FALSE) ; } if( GetHasFeat( FEAT_DEATHLESS_MASTER_TOUCH, oPC) && ( d6()== 1) ){ FloatingTextStringOnCreature( "", OBJECT_SELF, FALSE) ; } if( bWeapon ){ if( GetLocalObject( OBJECT_SELF, "LastOffender")== oPC ){ if( GetLocalInt( OBJECT_SELF, "OffenseCount")== 2 ){ SpeakString( ATTACK_MSG); SetIsTemporaryEnemy( oPC, OBJECT_SELF, TRUE, ANGER_DUR); if( GetIsInCombat( oPC) || ( GetAppearanceType( oPC) > 6) || ( GetLevelByClass( CLASS_TYPE_DRAGON_DISCIPLE, oPC) > 8) || GetHasFeat( FEAT_DEATHLESS_MASTER_TOUCH, oPC) ){ ActionAttack( oPC); } else { AssignCommand( oPC, ActionUnequipItem( oItem)) ; FloatingTextStringOnCreature( "*range son arme*", oPC, FALSE) ; } } else if( GetLocalInt( OBJECT_SELF, "OffenseCount")== 1 ){ ActionMoveToObject( oPC, TRUE); SetLocalInt( OBJECT_SELF, "OffenseCount", 2); SpeakString( WARNING3); } else { SetLocalInt( OBJECT_SELF, "OffenseCount", 1); SpeakString( WARNING2); } } else { SetLocalInt( OBJECT_SELF, "OffenseCount", 0); SpeakString( WARNING1); SetLocalObject( OBJECT_SELF, "LastOffender", oPC); } } else { if( GetLocalObject( OBJECT_SELF, "LastOffender")!= OBJECT_INVALID ){ SpeakString( COMPLY_REPLY); DeleteLocalObject( OBJECT_SELF, "LastOffender"); SetLocalInt( OBJECT_SELF, "OffenseCount", 0); } } if( GetSpawnInCondition( NW_FLAG_FAST_BUFF_ENEMY) ){ if( TalentAdvancedBuff( 40.0) ){ SetSpawnInCondition( NW_FLAG_FAST_BUFF_ENEMY, FALSE); return; } } if( GetSpawnInCondition( NW_FLAG_DAY_NIGHT_POSTING) ){ int nDay = FALSE; if( GetIsDay() || GetIsDawn() ){ nDay = TRUE; } if( GetLocalInt( OBJECT_SELF, "NW_GENERIC_DAY_NIGHT") != nDay ){ if( nDay == TRUE ){ SetLocalInt( OBJECT_SELF, "NW_GENERIC_DAY_NIGHT", TRUE); } else { SetLocalInt( OBJECT_SELF, "NW_GENERIC_DAY_NIGHT", FALSE); } WalkWayPoints(); } } if( ! GetHasEffect( EFFECT_TYPE_SLEEP) ){ if( ! GetIsPostOrWalking() ){ if( ! GetIsObjectValid( GetAttemptedAttackTarget()) && ! GetIsObjectValid( GetAttemptedSpellTarget()) ){ if( ! GetIsObjectValid( GetNearestCreature( CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, OBJECT_SELF, 1, CREATURE_TYPE_PERCEPTION, PERCEPTION_SEEN)) ){ if( ! GetBehaviorState( NW_FLAG_BEHAVIOR_SPECIAL) && ! IsInConversation( OBJECT_SELF) ){ if( GetSpawnInCondition( NW_FLAG_AMBIENT_ANIMATIONS) || GetSpawnInCondition( NW_FLAG_AMBIENT_ANIMATIONS_AVIAN) ){ PlayMobileAmbientAnimations(); } else if( GetIsEncounterCreature() && ! GetIsObjectValid( GetNearestCreature( CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, OBJECT_SELF, 1, CREATURE_TYPE_PERCEPTION, PERCEPTION_SEEN)) ){ PlayMobileAmbientAnimations(); } else if( GetSpawnInCondition( NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS) && ! GetIsObjectValid( GetNearestCreature( CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, OBJECT_SELF, 1, CREATURE_TYPE_PERCEPTION, PERCEPTION_SEEN)) ){ PlayImmobileAmbientAnimations(); } } else { DetermineSpecialBehavior(); } } else { } } } } else { if( GetSpawnInCondition( NW_FLAG_SLEEPING_AT_NIGHT) ){ effect eVis = EffectVisualEffect( VFX_IMP_SLEEP); if( d10() > 6 ){ ApplyEffectToObject( DURATION_TYPE_INSTANT, eVis, OBJECT_SELF); } } } if( GetSpawnInCondition( NW_FLAG_HEARTBEAT_EVENT) ){ SignalEvent( OBJECT_SELF, EventUserDefined( 1001)); } } } Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.
Note :
- merci d'avoir retrouvé le concepteur initial du script : faut toujours rendre à César ... par correction au moins
- on fait soft sur le TNB : l'arme est rangée dans l'inventaire, le garde n'attaque que dans certains cas.
- prise en compte de certaines exceptions "historiques" bâtons de mage et depuis le CEP, les accessoires : ombrelles, éventails etc..
|
|
Revenir en haut |
|
|
Mans-maniac
Novice
Inscrit le: 02 Sep 2005
Messages: 15
|
Posté le : 10/04/2006 19:10:45 Sujet du message :
je le vois pas le script ?? ni aucun lien ?
|
|
Revenir en haut |
|
|
Aladar
Chevalier
Inscrit le: 15 Déc 2004
Messages: 96
Localisation: Tours |
Posté le : 10/04/2006 20:52:10 Sujet du message :
Clic sur le Citation :Ce message est un spoiler, et risque de vous informez de choses que vous auriez du apprendre par vous même (fin d'un jeu, film, etc). A vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.
|
|
Revenir en haut |
|
|
Mans-maniac
Novice
Inscrit le: 02 Sep 2005
Messages: 15
|
Posté le : 10/04/2006 21:09:17 Sujet du message :
merci
|
|
Revenir en haut |
|
|
Mans-maniac
Novice
Inscrit le: 02 Sep 2005
Messages: 15
|
Posté le : 10/04/2006 21:09:45 Sujet du message :
merci
|
|
Revenir en haut |
|
|
Mans-maniac
Novice
Inscrit le: 02 Sep 2005
Messages: 15
|
Posté le : 10/04/2006 22:11:04 Sujet du message :
le script fonctionne mais le probleme reste le meme en presence de plusieur pj armés il suffit qu un seul d entre eux possede l object pour que le garde arrete
j ai pas encore tous regardé en detail mais je crois que d autre chose ne fonctionne pas comme la detection des classes ddr par exemple
je continu de chercher et si vous avez des idées je prend
|
|
Revenir en haut |
|
|
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
|
Posté le : 11/04/2006 00:19:23 Sujet du message :
Exact, c'est du à un GetNearest Unique : c'est trop consommateur sinon.
Mais dans le cas de l'amulette, c'est voulu, le garde (forcément un PJ joueur) gère la situation : on donne la primauté au RP : ca mettrait le bordel à cause du garde qui attaque à coup sur ...
Il se met entre le garde et le contrevenant, neutralisant l'effet du au script.
D'autre part si c'est plusieurs PJ armés et offensifs : c'est une invasion par une autre faction : tant pis pour celui qui est trop prêt.
Si cela dégénère, on peut faire appel à un MD et certains peuvent aussi contrôler les gardes (passage en henchmen) mais ca c'est un autre script que je garde parce qu'il n'est pas finalisé.
Pour l'instant ca nous suffit largement contre les attaques solos en ville.
Mais clair que sur le OnPerception le job serait plus propre et mieux fait.
|
|
Revenir en haut |
|
|
Macadam
Grand Chevalier
Inscrit le: 07 Avr 2006
Messages: 132
|
Posté le : 11/04/2006 08:36:48 Sujet du message :
Lylver a écrit :Mais clair que sur le OnPerception le job serait plus propre et mieux fait. merci ça fait plaisir de voir que je révais pas
|
|
Revenir en haut |
|
|
Mans-maniac
Novice
Inscrit le: 02 Sep 2005
Messages: 15
|
Posté le : 11/04/2006 17:06:46 Sujet du message :
sur le onperception le script ne s executera qu une fois donc je vois pas comment il pourrait fonctionner puisque c est a chaque execution du script que les variables change ?
|
|
Revenir en haut |
|
|
Macadam
Grand Chevalier
Inscrit le: 07 Avr 2006
Messages: 132
|
Posté le : 11/04/2006 17:27:33 Sujet du message :
non en fait il s'execute pas qu'une fois mais à chaque fois qu'il voit une créature, qu'elle est dans sa zone de vue.
Donc dès qu'un Pj rentre dans sa zone de vue il l'analyse et le script se déclenchera.
En plus le onheartBeat lui se declenche aussi meme si la zone est vide c'est pour cela qu'en regle générale il vaut mieux eviter de passer par lui si on le peut.
ça marche très bien pour mes factions par exemple ce genre de choses et je le fait avec le onperception pourtant.
Je sais qu'on en utilisait un avant mais pour nous il est devenu innutile en fait.
Si je le retrouve je le poste ici.
tient sinon tu as celui là aussi :
[http]
Dernière édition par Macadam le 11/04/2006 17:31:02; édité 1 fois
|
|
Revenir en haut |
|
|
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
|
Posté le : 11/04/2006 17:29:11 Sujet du message :
Il faut déclencher un pseudo-heartbeat sur l'évênement OnPerception
dans le script OnSpawn du garde tu actives la condition pour l'évênement OnPerception
Dans le script de créature OnUserDefined
tu mets ton traitement et à la fin tu boucles tant que tu vois du monde autour.
test du genre
NWScript :Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.
-----------
edit (ajout)
Une chose intéressante à faire serait de maintenir une liste des PJs/Monstres perçus sous la forme d'une liste d'objets locaux sur le garde :
Code :Local Int : idx = GetLocalInt(oGarde,"IDX");
Local Object : object oPC = GetLocalObject(oGarde,"SEEN+IntToString(idx));
On parcoure la liste à chaque pHB :
- vérification de la distance
- vérification si créature toujours vue sinon compactage de la liste, et si plus personne : arrêt du pseudo-HB.
- action suivant l'état de la créature (en s'inspirant du script posé dans ce sujet).
|
|
Revenir en haut |
|
|
|