lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
|
Posté le : 30/01/2006 14:56:33 Sujet du message :
heu ... ca marche pas avec une rencontre ?
un seul monstre dans la liste et nombre mini et maxi spawné=1
Sans doute l'astuce est de mettre un point de spawn
Sinon tu peux aussi faire une recherche sur "NPC Activities", un système très complet.
Ou utilisez ceci.
Note : j'utilise en conjonction avec mon éboueur de zone : GC, ce qui explique des lignes contenant PC_HERE, ly_onenter_area ou GCKILL. Tu peux les enlever.
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 :void SpawnPNJ( string sTag, string sArea= "", int iloc= 1, int iAction= 1, string sNewTag = "") { string sResRef = GetStringLowerCase( sTag); int bNoMulti = FALSE ; if( sArea == "" ){ bNoMulti = TRUE ; if( sNewTag == "" ) sArea = sResRef ; else sArea = sNewTag ; } string sSpawnPoint = "SP_"+ sArea+ "_0"+ IntToString( iloc); object oSpawnPoint = GetObjectByTag( sSpawnPoint) ; if( bNoMulti && GetIsObjectValid( GetNearestObjectByTag( sTag, oSpawnPoint)) ) return ; location lSpawn = GetLocation( oSpawnPoint) ; object oPNJ = CreateObject( OBJECT_TYPE_CREATURE, sResRef, lSpawn, FALSE, sNewTag); SetLocalInt( oPNJ, "GCKILL", TRUE) ; switch( iAction ){ case 6: AssignCommand( oPNJ, ActionAttack( GetNearestCreature( CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC ))); break; case 5: AssignCommand( oPNJ, ActionAttack( GetNearestCreature( CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_NOT_PC, OBJECT_SELF , 1 , CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY ))); break; case 4: AssignCommand( oPNJ, ActionForceFollowObject( GetNearestCreature( CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC ), 2.0) ); break; case 3: AssignCommand( oPNJ, PlayAnimation ( ANIMATION_LOOPING_CONJURE1, 1.0, 30.0 )); break; case 2: AssignCommand( oPNJ, ActionRandomWalk()); break; case 1: break; } } 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.
exemple de script OnEnter pour une zone (origine Armada modifié)
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.
=> La zone en question est équipée de points de passage avec un tag de la forme "SP_<ResRef>_0<Type d'Action>"
Ynot avait dés 2004 inventé (?) un mini-NPC Activities
ou sur un déclencheur
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 "ly_lib_pnj"void gardiensHostiles() { string sArea = "7803" ; switch ( d4()) { case 1: ApplyEffectAtLocation( DURATION_TYPE_INSTANT, EffectVisualEffect( VFX_FNF_IMPLOSION), GetLocation( GetObjectByTag( "SP_7803_03")) ); SpawnPNJ( "SIPI_ARCHIMAGE", sArea, 3, 5); case 2: ApplyEffectAtLocation( DURATION_TYPE_INSTANT, EffectVisualEffect( VFX_FNF_IMPLOSION), GetLocation( GetObjectByTag( "SP_7803_03")) ); SpawnPNJ( "SIPI_GUERRIER", sArea, 3, 6); SpawnPNJ( "SIPI_GUERRIER", sArea, 3, 6); SpawnPNJ( "SIPI_MAGE", sArea, 3, 6); case 3: case 4: ApplyEffectAtLocation( DURATION_TYPE_INSTANT, EffectVisualEffect( VFX_FNF_IMPLOSION), GetLocation( GetObjectByTag( "SP_7803_02")) ); SpawnPNJ( "SIPI_PRETRE", sArea, 1); ApplyEffectAtLocation( DURATION_TYPE_INSTANT, EffectVisualEffect( VFX_FNF_IMPLOSION), GetLocation( GetObjectByTag( "SP_7803_01")) ); SpawnPNJ( "SIPI_PRETRE", sArea, 2); break; } } void rothesHostiles() { AssignCommand( GetNearestObjectByTag( "caster409"), ActionCastSpellAtLocation( SPELL_EARTHQUAKE, GetLocation( GetObjectByTag( "SP_7801_01")))); string sArea = "7801" ; switch ( d4()) { case 1: SpawnPNJ( "SIPI_ROTHE", sArea, 1, 6); SpawnPNJ( "SIPI_ROTHE", sArea, 1, 6); case 2: SpawnPNJ( "SIPI_ROTHE", sArea, 1, 6); SpawnPNJ( "SIPI_ROTHE", sArea, 1, 6); case 3: SpawnPNJ( "SIPI_ROTHE", sArea, 1, 6); SpawnPNJ( "SIPI_ROTHE", sArea, 1, 6); case 4: SpawnPNJ( "SIPI_ROTHE", sArea, 1, 6); SpawnPNJ( "SIPI_ROTHE", sArea, 1, 6); break; } } void main() { object oSelf = OBJECT_SELF ; if( GetLocalInt( oSelf, "RESPWAIT") ) return ; SetLocalInt( oSelf, "RESPWAIT", TRUE) ; int nDelai = GetLocalInt( oSelf, "DELAI") ; if( nDelai = 0 ) nDelai = 24 ; DelayCommand( HoursToSeconds( nDelai), DeleteLocalInt( oSelf, "RESPWAIT")); object oArea = GetArea( OBJECT_SELF); int nArea = StringToInt( GetStringRight( GetTag( oArea), 4)); int nEnc = GetLocalInt( oArea, "ATAG") ; if( nEnc != nArea ){ string sMesg = "tn_sipi_spawn : Area Tag differs from ATAG var : "+ IntToString( nEnc) ; SendMessageToAllDMs( sMesg); WriteTimestampedLogEntry( sMesg); nEnc = nArea ; } switch( nEnc ){ case 7803: gardiensHostiles(); break; case 7801: rothesHostiles(); break; } } 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.
|
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
|
Posté le : 06/02/2006 13:46:45 Sujet du message :
Système de remplacement pour les plaçables avec Heart-Beat
Voila un script à mettre sur le OnEnter d'un déclencheur,
ce déclencheur est à tracer autour des placables "ossements / NW_PL_SKELETON" et/ou "cadavres / NW_PL_ZOMBIE" habituels qui font apparaître un zombie/seigneur zombie ou un squelette/chef squelette
Bien entendu : enlever le script sur le heart-beat des plaçables ...
Avantages :
- Vous pouvez personnaliser le script et mettre ce que vous voulez comme placables et comme monstres, le nombre est choisi finement
- L'orientation des monstres dépend de celle du plaçable
- Le MD peut forcer l'apparition en sélectionnant "montrez les déclencheurs" et en envoyant un "évênement entrée"
Désavantages :
C'est plus lourd à fignoler qu'une rencontre avec un point de spawn.
NWScript :#include "ly_lib_time"void CrUndead( object oSkel, int nType) ; void main() { object oPC = GetEnteringObject() ; object oSelf = OBJECT_SELF ; if( !( GetIsPC( oPC) || GetIsDM( oPC) || GetIsDMPossessed( oPC) ) ) return ; int nDelai = GetLocalInt( oSelf, "DELAI") ; if( nDelai == 0 ) nDelai = 24 ; int iCDay = ly_day() ; int iCTime = ly_time() ; int iRespDay = GetLocalInt( oSelf, "RESPDAY"); int iRespSec = GetLocalInt( oSelf, "RESPTIME") ; int iRespDelay = iCTime - iRespSec + FloatToInt( HoursToSeconds(( iCDay - iRespDay) * 24)); if( iRespDelay >= FloatToInt( HoursToSeconds( nDelai)) ){ DeleteLocalInt( oSelf, "RESPWAIT") ; } if( GetLocalInt( oSelf, "RESPWAIT") && !( GetIsDM( oPC) || GetIsDMPossessed( oPC)) ){ return ; } else{ if( GetIsDM( oPC) || GetIsDMPossessed( oPC) ){ SendMessageToAllDMs( "DM Click on trigger"); if( GetLocalInt( oSelf, "RESPWAIT") ){ DeleteLocalInt( oSelf, "RESPWAIT") ; SendMessageToAllDMs( "Trigger Unlocked"); return ; } } SetLocalInt( oSelf, "RESPWAIT", TRUE); SetLocalInt( oSelf, "RESPDAY", iCDay); SetLocalInt( oSelf, "RESPTIME", iCTime); SendMessageToAllDMs( "Trigger Locked for "+ IntToString( nDelai)+ " Hours"); } object oSkel = GetFirstInPersistentObject( oSelf, OBJECT_TYPE_PLACEABLE) ; while( GetIsObjectValid( oSkel) ){ if( ! GetLocalInt( oSkel, "LOOPLOCK") ){ if( GetTag( oSkel) == "NW_PL_ZOMBIE" ) CrUndead( oSkel, 1) ; if( GetTag( oSkel) == "NW_PL_SKELETON" ) CrUndead( oSkel, 2) ; } oSkel = GetNextInPersistentObject( oSelf, OBJECT_TYPE_PLACEABLE) ; } oSkel = GetFirstInPersistentObject( oSelf, OBJECT_TYPE_PLACEABLE) ; while( GetIsObjectValid( oSkel) ){ DeleteLocalInt( oSkel, "LOOPLOCK"); oSkel = GetNextInPersistentObject( oSelf, OBJECT_TYPE_PLACEABLE) ; } } void CrUndead( object oUndead, int nType) { effect eMind = EffectVisualEffect( VFX_FNF_SUMMON_UNDEAD); string sCreature ; SetLocalInt( oUndead, "LOOPLOCK", TRUE) ; switch( nType ){ case 1: sCreature = "NW_ZOMBWARR01"; if( Random( 100) > 90 ){ sCreature = "NW_ZOMBIEBOSS"; } break ; case 2: default: sCreature = "sow_sque_wa2"; if( Random( 100) > 90 ){ sCreature = "NW_SKELCHIEF"; } break ; } object oMonster = CreateObject( OBJECT_TYPE_CREATURE, sCreature, GetLocation( oUndead)); DelayCommand( 0.3, ApplyEffectToObject( DURATION_TYPE_INSTANT, eMind, oMonster)); } 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.
|