Voir le sujet précédent ¤
Voir le sujet suivant
|
Auteur |
Message |
L'Erudit
Seigneur
Inscrit le: 26 Oct 2005
Messages: 167
|
Posté le : 28/01/2006 09:57:06 Sujet du message : Fonctions utiles
Le sujet du topic parle de lui même !
Pour poser vos questions, et afin de ne pas encombrer celui-ci, rendez vous sur ce sujet.
Pour commencer, voilà une fonction qui vous permet de convertir un temps de jeu (IG), en secondes réelles (IRL).
Cette fonction est utile pour les "DelayCommand", qui réclament des temps en secondes (IRL, et en float d'ailleurs ).
Si vous rencontrez des problèmes signalez les sur ce sujet ou par MP, j'editerais mon message en conséquence.
Petite précision. Il est question de Fonctions, et non de Scripts ! Pour cela il y a un autre sujet.
Vous pouvez néanmoins illustrer vos créations par un Script, mais seulement à titre d'exemple, afin de correspondre au sujet initial !
NWScript :float IGTimeToIRLSecond( int nHour, int nMinute, int nSecond= 0, int nMillisecond= 0, int nFirstRatio= 120, int nSecondRatio= 2, float nThirdRatio= 0.000002f); float IGTimeToIRLSecond( int nHour, int nMinute, int nSecond= 0, int nMillisecond= 0, int nFirstRatio= 120, int nSecondRatio= 2, float nThirdRatio= 0.000002f) { float fIRLSecond = IntToFloat( nHour* nFirstRatio) + IntToFloat( nMinute* nSecondRatio) + IntToFloat( nSecond) + IntToFloat( nMillisecond)* nThirdRatio; return fIRLSecond; } 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.
Dernière édition par L'Erudit le 05/03/2006 18:57:04; édité 5 fois
|
|
Revenir en haut |
|
|
Sith Vicious
Grand Sage du Conseil
Inscrit le: 19 Oct 2005
Messages: 693
|
Posté le : 29/01/2006 03:48:02 Sujet du message :
J'avons rien compris hihi.
Une fonction à la con, j'pense pas que ça interesse quelqu'un mais bon.
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.
Ca renvoit le nom d'un sort à partir de la constante (genre SPELL_CHARM_PERSON). J'en avais besoin pour le CNR, si vous l'utilisez ça peut vous servir (ça permet de mettre n'importe quel sort dans une recette et d'avoir le nom direct dans le dialogue et surtout y a plus rien à traduire, puisque ça chope le nom dans le tlk)
|
|
Revenir en haut |
|
|
Djezebel
Héros
Inscrit le: 29 Sep 2005
Messages: 252
|
Posté le : 30/01/2006 20:41:22 Sujet du message :
J'ajoute les miens qui sont simples peut-être pas top utiles mais bon ^^
Pour animer un levier par exemple :
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.
Pour faire un cadran solaire :
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.
Si on veut que quelque chose ne se fasse qu'une seule fois :
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.
Examiner un objet par un clique gauche :
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.
Effacer l'inventaire d'un joueur à sa connexion :
NWScript :SendMessageToPC( oPC, ""); item = GetFirstItemInInventory( oPC); while ( GetIsObjectValid( item)) { DestroyObject( item); item = GetNextItemInInventory( oPC); DestroyObject( GetItemInSlot( INVENTORY_SLOT_ARMS, oPC)); DestroyObject( GetItemInSlot( INVENTORY_SLOT_ARROWS, oPC)); DestroyObject( GetItemInSlot( INVENTORY_SLOT_BELT, oPC)); DestroyObject( GetItemInSlot( INVENTORY_SLOT_BOLTS, oPC)); DestroyObject( GetItemInSlot( INVENTORY_SLOT_BOOTS, oPC)); DestroyObject( GetItemInSlot( INVENTORY_SLOT_BULLETS, oPC)); DestroyObject( GetItemInSlot( INVENTORY_SLOT_CARMOUR, oPC)); DestroyObject( GetItemInSlot( INVENTORY_SLOT_CHEST, oPC)); DestroyObject( GetItemInSlot( INVENTORY_SLOT_CLOAK, oPC)); DestroyObject( GetItemInSlot( INVENTORY_SLOT_CWEAPON_B, oPC)); DestroyObject( GetItemInSlot( INVENTORY_SLOT_CWEAPON_L, oPC)); DestroyObject( GetItemInSlot( INVENTORY_SLOT_CWEAPON_R, oPC)); DestroyObject( GetItemInSlot( INVENTORY_SLOT_HEAD, oPC)); DestroyObject( GetItemInSlot( INVENTORY_SLOT_LEFTHAND, oPC)); DestroyObject( GetItemInSlot( INVENTORY_SLOT_LEFTRING, oPC)); DestroyObject( GetItemInSlot( INVENTORY_SLOT_NECK, oPC)); DestroyObject( GetItemInSlot( INVENTORY_SLOT_RIGHTHAND, oPC)); DestroyObject( GetItemInSlot( INVENTORY_SLOT_RIGHTRING, oPC)); CreateItemOnObject( "ResRef de l'objet a mettre dans l'inventaire", oPC); item = CreateItemOnObject( "ResRef de l'objet a equiper comme armure", oPC); ActionEquipItem( item, INVENTORY_SLOT_CHEST); GiveXPToCreature( oPC, 1); SendMessageToPC( oPC, "Bienvenue sur le module etc..."); } 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 |
|
|
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
|
Posté le : 31/01/2006 10:08:58 Sujet du message :
Pour faire des comparaisons de date et de durée et d'autres bricoles
NWScript :int _day() { int iCTY = GetCalendarYear() ; int iCTM = GetCalendarMonth() ; int iCTD = GetCalendarDay() ; int iCDay = iCTY* 12* 28 + iCTM* 28 + iCTD ; return iCDay ; } int _time() { int iTH = GetTimeHour(); int iTM = GetTimeMinute(); int iTS = GetTimeSecond(); int iCTime = FloatToInt( HoursToSeconds( iTH)) + iTM* 60 + iTS ; return iCTime ; } void _grant_rest( object oPC) { int nDelai = 540 ; SetLocalInt( oPC, "PC_LastRest", _time()- nDelai); SetLocalInt( oPC, "PC_LastDayRest", _day()); SetLocalInt( oPC, "DyingHP", - 1); SendMessageToPC( oPC, "" ) ; } void _anti_deco( object oPC) { if (! GetIsDM ( oPC)) { talent tFeat, tSpell; int nIndex, i, nTalentID; for ( nIndex= 1; nIndex< 1000; nIndex++) { tFeat = TalentFeat ( nIndex); tSpell = TalentSpell( nIndex); if ( GetIsTalentValid( tFeat)) { nTalentID = GetIdFromTalent( tFeat); for ( i= 1; i< 40; i++) { DecrementRemainingFeatUses( oPC, nTalentID); if (! GetHasFeat( nTalentID, oPC)) i = 40; } } if ( GetIsTalentValid( tSpell)) { nTalentID = GetIdFromTalent( tSpell); for ( i= 1; i< 40; i++) { DecrementRemainingSpellUses( oPC, nTalentID); if (! GetHasSpell( nTalentID, oPC)) i = 40; } } } SendMessageToPC( 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.
Pour illustration utilisation du temps dans un script de repos
NWScript : if ( GetLastRestEventType() == REST_EVENTTYPE_REST_STARTED) { int iRestDay = GetLocalInt( oPC, "PC_LastDayRest"); int iRestSecond = GetLocalInt( oPC, "PC_LastRest") ; int iRestDelay = _time() - iRestSecond + FloatToInt( HoursToSeconds(( _day() - iRestDay) * 24)); SetLocalInt( oPC, "PC_HPRest", curHP); object oProvisions = GetItemPossessedBy( oPC, "PROVISIONS"); if ( oProvisions != OBJECT_INVALID) { iRestDelay = RESTDELAY ; DestroyObject( oProvisions) ; } ; if ( iRestDelay < RESTDELAY) { AssignCommand( oPC, ClearAllActions()); if ( RESTDELAY- iRestDelay <= 60) SendMessageToPC( oPC, "Vous devez attendre moins d'une minute pour vous reposez"); else SendMessageToPC( oPC, "Vous devez attendre " + IntToString( FloatToInt( IntToFloat(( RESTDELAY- iRestDelay))/ 60)) + ""); return; } } if ( GetLastRestEventType() == REST_EVENTTYPE_REST_FINISHED) { SetLocalInt( oPC, "PC_LastRest", _time() ); SetLocalInt( oPC, "PC_LastDayRest", _day() ); } 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 |
|
|
Enki
Légende vivante
Inscrit le: 06 Déc 2005
Messages: 432
|
Posté le : 31/01/2006 13:32:18 Sujet du message :
Voici une fonction toute simple pour enlever tous les effets d'un joueur :
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.
|
|
Revenir en haut |
|
|
Enki
Légende vivante
Inscrit le: 06 Déc 2005
Messages: 432
|
Posté le : 31/01/2006 13:35:57 Sujet du message :
Une autre fonction simple pour attribuer le nombre d'XP nécessaire pour qu'un joueur soit level X :
NWScript :int GetXPRequiredForLevel( int nLevel ) { int nRequiredXP; int nCount; nRequiredXP = 0; for ( nCount = 1; nCount <= nLevel; nCount++ ) { nRequiredXP += 1000 * ( nCount - 1); } return nRequiredXP; } 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 : je la laisse pour comprendre le message d'en dessous : bravo Lylver !
Dernière édition par Enki le 31/01/2006 13:49:29; édité 1 fois
|
|
Revenir en haut |
|
|
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
|
Posté le : 31/01/2006 13:44:34 Sujet du message :
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.
|
|
Revenir en haut |
|
|
Sith Vicious
Grand Sage du Conseil
Inscrit le: 19 Oct 2005
Messages: 693
|
Posté le : 31/01/2006 13:51:05 Sujet du message :
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.
Désolé j'ai pas pu m'empécher...
|
|
Revenir en haut |
|
|
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
|
Posté le : 31/01/2006 13:57:04 Sujet du message :
*mdr*
Pour la petite histoire ; c'est une formule de math : somme de 1 à n-1 = n*(n-1)/2
Dernière édition par lylver le 31/01/2006 14:01:00; édité 1 fois
|
|
Revenir en haut |
|
|
Enki
Légende vivante
Inscrit le: 06 Déc 2005
Messages: 432
|
Posté le : 31/01/2006 13:59:47 Sujet du message :
Voici une fonction qui peut servir de pouvoir unique pour un objet (merci à Djezebel qui m'a donné l'idée). Cela fait le même effet que le pouvoir "Poussée de Force" dans KOTOR pour ceux qui connaissent :
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.
Libre à vous de rajouter des dégats !
|
|
Revenir en haut |
|
|
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
|
Posté le : 31/01/2006 14:14:01 Sujet du message :
J'en ferais bien l'implémentation en sort d'altération pour magicien/ensorceleur.
Ca me rappelle deux sorts d'ADD : Push (Poussée niv 1) et Répulsion (niveau 7, sort de zone je crois)
|
|
Revenir en haut |
|
|
Anthraxcite
Légende vivante
Inscrit le: 12 Juin 2004
Messages: 372
Localisation: Belgique |
Posté le : 31/01/2006 18:35:23 Sujet du message :
Pour ceux qui connaisse pas encore : [http]
|
|
Revenir en haut |
|
|
L'Erudit
Seigneur
Inscrit le: 26 Oct 2005
Messages: 167
|
Posté le : 01/02/2006 00:45:08 Sujet du message :
Pour toutes questions/remarques/demandes, etc... prenez la peine de poster dans le topic correspondant. Ainsi, les messages seront clairement identifiés, et plus lisibles, je vous remercie !
|
|
Revenir en haut |
|
|
Sith Vicious
Grand Sage du Conseil
Inscrit le: 19 Oct 2005
Messages: 693
|
Posté le : 04/02/2006 03:37:13 Sujet du message :
Bon je m'ennuyais alors j'ai bricolé.
Ca existe surement déjà et en mieux mais tant pis : c'est une fonction qui permet de créer du texte en rayons (en effets visuels quoi). Ca sert à rien mais c'est joli.
Ca donne des trucs comme ça : screen.
et le script c'est ça : 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 :const int VFX_BEAM_FLAME = 444; const int VFX_BEAM_DISINTEGRATE = 447; string SV_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890+-*/'<>!:="; string RESREF_INVIS = "plc_invisobj"; vector GetChangedPosition( vector vOriginal, float fDistance, float fAngle, float fHeight= 0.0) { vector vChanged; vChanged. z = vOriginal. z+ fHeight; vChanged. x = fabs( vOriginal. x + fDistance * cos( fAngle)); vChanged. y = fabs( vOriginal. y + fDistance * sin( fAngle)); return vChanged; } location GenNewLocFromLoc( location lTarget, float fDistance, float fAngle, float fOrientation, float fHeight= 0.0) { object oArea = GetAreaFromLocation( lTarget); vector vNewPos = GetChangedPosition( GetPositionFromLocation( lTarget), fDistance, fAngle, fHeight); return Location( oArea, vNewPos, fOrientation); } void Write( string sCode, location lLoc, int bVertical, float fDuree, int nBeam, float fHaut, float fLarge, float fOrient ) { location lNew; int nPos = FindSubString( sCode, "+"); string sRayon = GetStringRight( sCode, GetStringLength( sCode)- nPos- 1); int nCode = StringToInt( GetStringLeft( sCode, nPos)); object oPt1, oPt2, oPt3, oPt4, oPt5, oPt6, oPt7, oPt8, oPt9, oCible, oCurrent; effect eBeam; int i, nTarget; for ( i= 1; i<= 9; i++) { if ( nCode% 2 == 1) { switch ( i) { case 1 : lNew = GenNewLocFromLoc( lLoc, fLarge/ 2, fOrient, 0.0); oPt9 = CreateObject( OBJECT_TYPE_PLACEABLE, RESREF_INVIS, lNew); oCurrent = oPt9; break; case 2 : lNew = GenNewLocFromLoc( lLoc, fLarge, fOrient, 0.0); oPt8 = CreateObject( OBJECT_TYPE_PLACEABLE, RESREF_INVIS, lNew); oCurrent = oPt8; break; case 3 : lNew = ( bVertical) ? GenNewLocFromLoc( lLoc, fLarge, fOrient, 0.0, fHaut/ 2) : GenNewLocFromLoc( lLoc, sqrt( pow( fLarge, 2.0)+ pow( fHaut/ 2, 2.0)) , fOrient+ atan(( fHaut/ 2)/ fLarge), 0.0); oPt7 = CreateObject( OBJECT_TYPE_PLACEABLE, RESREF_INVIS, lNew); oCurrent = oPt7; break; case 4 : lNew = ( bVertical) ? GenNewLocFromLoc( lLoc, fLarge/ 2, fOrient, 0.0, fHaut/ 2) : GenNewLocFromLoc( lLoc, sqrt( pow( fLarge/ 2, 2.0)+ pow( fHaut/ 2, 2.0)) , fOrient+ atan(( fHaut/ 2)/( fLarge/ 2)), 0.0); oPt6 = CreateObject( OBJECT_TYPE_PLACEABLE, RESREF_INVIS, lNew); oCurrent = oPt6; break; case 5 : lNew = ( bVertical) ? GenNewLocFromLoc( lLoc, fLarge/ 2, fOrient, 0.0, fHaut) : GenNewLocFromLoc( lLoc, sqrt( pow( fLarge/ 2, 2.0)+ pow( fHaut, 2.0)) , fOrient+ atan( fHaut/( fLarge/ 2)), 0.0); oPt5 = CreateObject( OBJECT_TYPE_PLACEABLE, RESREF_INVIS, lNew); oCurrent = oPt5; break; case 6 : lNew = ( bVertical) ? GenNewLocFromLoc( lLoc, 0.0, fOrient, 0.0, fHaut/ 2) : GenNewLocFromLoc( lLoc, fHaut/ 2, fOrient+ 90.0, 0.0); oPt4 = CreateObject( OBJECT_TYPE_PLACEABLE, RESREF_INVIS, lNew); oCurrent = oPt4; break; case 7 : lNew = ( bVertical) ? GenNewLocFromLoc( lLoc, fLarge, fOrient, 0.0, fHaut) : GenNewLocFromLoc( lLoc, sqrt( pow( fLarge, 2.0)+ pow( fHaut, 2.0)) , fOrient+ atan( fHaut/ fLarge), 0.0); oPt3 = CreateObject( OBJECT_TYPE_PLACEABLE, RESREF_INVIS, lNew); oCurrent = oPt3; break; case 8 : oPt2 = CreateObject( OBJECT_TYPE_PLACEABLE, RESREF_INVIS, lLoc); oCurrent = oPt2; break; case 9 : lNew = ( bVertical) ? GenNewLocFromLoc( lLoc, 0.0, fOrient, 0.0, fHaut) : GenNewLocFromLoc( lLoc, fHaut, fOrient+ 90.0, 0.0); oPt1 = CreateObject( OBJECT_TYPE_PLACEABLE, RESREF_INVIS, lNew); oCurrent = oPt1; break; } if ( fDuree> 0.0) DestroyObject( oCurrent, fDuree); eBeam= EffectBeam( nBeam, oCurrent, BODY_NODE_CHEST); while ( StringToInt( GetSubString( sRayon, GetStringLength( sRayon)- 2, 1))== 10- i) { nTarget = StringToInt( GetStringRight( sRayon, 1)); switch ( nTarget) { case 2 : oCible = oPt2; break; case 3 : oCible = oPt3; break; case 4 : oCible = oPt4; break; case 5 : oCible = oPt5; break; case 6 : oCible = oPt6; break; case 7 : oCible = oPt7; break; case 8 : oCible = oPt8; break; case 9 : oCible = oPt9; break; } ApplyEffectToObject( DURATION_TYPE_PERMANENT, eBeam, oCible); sRayon = GetStringLeft( sRayon, GetStringLength( sRayon)- 2); } } nCode>>= 1; } } string Caractere( int nPos); string Caractere( int nPos) { string sResult = ""; switch ( nPos) { case 0 : return "182+254758"; case 1 : return "446+121528475678"; case 2 : return "450+121328"; case 3 : return "388+121727"; case 4 : return "490+12132846"; case 5 : return "488+121346"; case 6 : return "462+1213286778"; case 7 : return "486+123847"; case 8 : return "17+59"; case 9 : return "226+242838"; case 10 : return "482+123448"; case 11 : return "386+1228"; case 12 : return "458+12163638"; case 13 : return "450+121838"; case 14 : case 35 : return "450+12132838"; case 15 : return "484+12133747" ; case 16 : return "458+1213283868"; case 17 : return "486+1213374748"; case 18 : return "486+1314284778"; case 19 : return "337+1359"; case 20 : return "450+122838"; case 21 : return "321+1939"; case 22 : return "458+12263868"; case 23 : return "450+1823"; case 24 : return "456+1623" ; case 25 : return "450+132328"; case 26 : return "74+3638"; case 27 : return "486+1324283747"; case 28 : return "462+13283867"; case 29 : return "61+454759"; case 30 : return "441+1415294669"; case 31 : return "441+1215294669"; case 32 : return "484+132347"; case 33 : return "486+1213283847"; case 34 : return "358+13143847"; case 36 : return "53+4759"; case 37 : return "36+47"; case 38 : return "503+18234759"; case 39 : return "192+23"; case 40 : return "48+45"; case 41 : return "53+454749"; case 42 : return "53+475779"; case 43 : return "53+495979"; case 44 : return "53+455759"; case 45 : return "166+2847"; } return ""; } void SvBeamWrite( string sText, location lLoc, int bVertical= TRUE, int nBeam = VFX_BEAM_SILENT_FIRE, float fDuree= 0.0, float fHaut = 1.0, float fLarge = 0.0, float fEspace = 0.0, float fOrient = 0.0); void SvBeamWrite( string sText, location lLoc, int bVertical= TRUE, int nBeam = VFX_BEAM_SILENT_FIRE, float fDuree= 0.0, float fHaut = 1.0, float fLarge = 0.0, float fEspace = 0.0, float fOrient = 0.0) { sText = GetStringUpperCase( sText); if ( fLarge == 0.0) fLarge = fHaut* 0.75; if ( fEspace == 0.0) fEspace = fHaut * 0.25; int nLength = GetStringLength( sText); int i, nPos; string sChar, sCode; float fFacing = GetFacingFromLocation( lLoc); location lStart; for ( i= 0; i< nLength; i++) { lStart = GenNewLocFromLoc( lLoc,( fLarge+ fEspace)* i, fFacing, 0.0); sChar = GetSubString( sText, i, 1); nPos = FindSubString( SV_ALPHABET, sChar); if ( nPos!=- 1) { sCode = Caractere( nPos); Write( sCode, lStart, bVertical, fDuree, nBeam, fHaut, fLarge, fOrient+ fFacing); } } } 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 suis quand même assez fier de moi sur ce coup là.
EDIT : j'ai rajouté quelques signes : + - / * = '
plus 4 fleches avec les caractères
< flêche gauche
> flêche droite
! flêche bas
et : flêche haut
Re-EDIT : Réécrit, 115 lignes de moins ! Maintenant il est en couleur. Il fait rien de plus mais c'est plus propre.
Ajout de 2 constantes d'effets visuels bien cachés (mais disponibles, en tout cas dans la 1.66 HotU)
Encore EDIT : remplacez la 3ème ligne par ça :
string SV_ALPHABET ="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890+-*/'<>!:=";
ça déconne ça veut pas afficher les < et > correctement.
Dernière édition par Sith Vicious le 07/02/2006 18:06:49; édité 5 fois
|
|
Revenir en haut |
|
|
SexLove
Novice
Inscrit le: 15 Nov 2005
Messages: 16
Localisation: dans le cosmos |
Posté le : 04/02/2006 05:03:21 Sujet du message : Suuuper!!!
Sith Viscious....ton lien ne fonctionne pas, Moi je trouve ca génial!!! Lol ca ferait une belle demande de mariage venant de la part d'un illusionniste... _________________ Eauprofonde-Cité des slendeurs, module en création bientot en beta [http]
Cinq minutes avant sa mort, il était toujours vivant!!!
Cliquez ce lien pour moi^^merci!
|
|
Revenir en haut |
|
|
Sith Vicious
Grand Sage du Conseil
Inscrit le: 19 Oct 2005
Messages: 693
|
Posté le : 04/02/2006 13:00:26 Sujet du message :
Quel lien ? le screen ? il marche chez moi c'est bizarre. Ou le spoiler ? Suffit de cliquer dessus (on se moque pas j'ai eu du mal à comprendre comment ça marche )
|
|
Revenir en haut |
|
|
SexLove
Novice
Inscrit le: 15 Nov 2005
Messages: 16
Localisation: dans le cosmos |
Posté le : 04/02/2006 22:28:03 Sujet du message :
non désolé tout fonctionne, je crois que je vais arreter de boire lol... _________________ Eauprofonde-Cité des slendeurs, module en création bientot en beta [http]
Cinq minutes avant sa mort, il était toujours vivant!!!
Cliquez ce lien pour moi^^merci!
|
|
Revenir en haut |
|
|
Enki
Légende vivante
Inscrit le: 06 Déc 2005
Messages: 432
|
Posté le : 15/02/2006 23:33:53 Sujet du message :
Une fonction pour envoyer un message à tous les joueurs d'une zone :
A mettre sur un trigger par exemple, ou sur le OnDeath d'un PNJ.
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.
Très bonne idée ce post l'Erudit !
|
|
Revenir en haut |
|
|
edisnotdead
Grand Chevalier
Inscrit le: 19 Fév 2005
Messages: 132
|
Posté le : 16/02/2006 06:50:13 Sujet du message :
a ce lien
on a:
apparentypepluspeau(prendre une apparence en donnant une peau ..util pour sous race )
off appareansetype pluspeau(retour normal)
tlobjectpillar(effet stargate...ou comment creer une collonne par script))
appareancetypenormal ( reprendre son appaerance normal sans stoker de variable apré un setappaearance)
shootcreature(ejecter une creature en arriére)
et d autre ...
http://www.deepblack.be/forum/viewforum.php?f=13
|
|
Revenir en haut |
|
|
L'Erudit
Seigneur
Inscrit le: 26 Oct 2005
Messages: 167
|
Posté le : 05/03/2006 16:50:41 Sujet du message :
Deux nouvelles fonctions complémentaires: "HasManyItems" et "HasSomeOfManyItems".
La première vérifie si l'Objet du test possède bien tous les Items requis.
La seconde agit de même, mais se contente d'un Item ou plus, parmi les Item spécifiés.
Vous pouvez spécifier dix Items au plus pour chaque fonctions. Pourquoi dix? Parcequ'il fallait choisir une valeur finie, symbolique, et que j'ai pensé que dix possibilités suffiraient amplement.
Néanmoins, si vous voulez en spécifier plus, il faut modifier quelque peu la ou les fonction(s).
Ceci peut paraître difficile pour certains, alors s'ils le souhaitent et sur demande par MP, je peux le faire pour eux.
Je n'ai essayé ces fonctions que très rapidement, donc s'il y a un quelconque problème faites le moi savoir !
NWScript :int HasManyItems( object oObject, string sFirstItemTag, string sSecondItemTag, string sThirdItemTag= "", string sFourthItemTag= "", string sFifthItemTag= "", string sSixthItemTag= "", string sSeventhItemTag= "", string sEighthItemTag= "", string sNinthItemTag= "", string sTenthItemTag= ""); int HasManyItems( object oObject, string sFirstItemTag, string sSecondItemTag, string sThirdItemTag= "", string sFourthItemTag= "", string sFifthItemTag= "", string sSixthItemTag= "", string sSeventhItemTag= "", string sEighthItemTag= "", string sNinthItemTag= "", string sTenthItemTag= "") { object oItem = GetFirstItemInInventory( oObject); string sItemTag = GetTag( oItem); int b1I, b2I, b3I, b4I, b5I, b6I, b7I, b8I, b9I, b10I, n; if ( sFirstItemTag == "") b1I = TRUE; if ( sSecondItemTag == "") b2I = TRUE; if ( sThirdItemTag == "") b3I = TRUE; if ( sFourthItemTag == "") b4I = TRUE; if ( sFifthItemTag == "") b5I = TRUE; if ( sSixthItemTag == "") b6I = TRUE; if ( sSeventhItemTag == "") b7I = TRUE; if ( sEighthItemTag == "") b8I = TRUE; if ( sNinthItemTag == "") b9I = TRUE; if ( sTenthItemTag == "") b10I = TRUE; while ( oItem != OBJECT_INVALID) { if ( sItemTag == sFirstItemTag && b1I != TRUE) b1I = TRUE; else if ( sItemTag == sSecondItemTag && b2I != TRUE) b2I = TRUE; else if ( sItemTag == sThirdItemTag && b3I != TRUE) b3I = TRUE; else if ( sItemTag == sFourthItemTag && b4I != TRUE) b4I = TRUE; else if ( sItemTag == sFifthItemTag && b5I != TRUE) b5I = TRUE; else if ( sItemTag == sSixthItemTag && b6I != TRUE) b6I = TRUE; else if ( sItemTag == sSeventhItemTag && b7I != TRUE) b7I = TRUE; else if ( sItemTag == sEighthItemTag && b8I != TRUE) b8I = TRUE; else if ( sItemTag == sNinthItemTag && b9I != TRUE) b9I = TRUE; else if ( sItemTag == sTenthItemTag && b10I != TRUE) b10I = TRUE; n = ( b1I == TRUE && b2I == TRUE && b3I == TRUE && b4I == TRUE && b5I == TRUE && b6I == TRUE && b7I == TRUE && b8I == TRUE && b9I == TRUE && b10I == TRUE); if ( n) break; oItem = GetNextItemInInventory(); sItemTag = GetTag( oItem); } return n; } 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.
NWScript :int HasSomeOfManyItems( object oObject, string sFirstItemTag, string sSecondItemTag, string sThirdItemTag= "", string sFourthItemTag= "", string sFifthItemTag= "", string sSixthItemTag= "", string sSeventhItemTag= "", string sEighthItemTag= "", string sNinthItemTag= "", string sTenthItemTag= ""); int HasSomeOfManyItems( object oObject, string sFirstItemTag, string sSecondItemTag, string sThirdItemTag= "", string sFourthItemTag= "", string sFifthItemTag= "", string sSixthItemTag= "", string sSeventhItemTag= "", string sEighthItemTag= "", string sNinthItemTag= "", string sTenthItemTag= "") { object oItem = GetFirstItemInInventory( oObject); string sItemTag = GetTag( oItem); int b1I, b2I, b3I, b4I, b5I, b6I, b7I, b8I, b9I, b10I, n; while ( oItem != OBJECT_INVALID) { if ( sItemTag == sFirstItemTag && b1I != TRUE) b1I = TRUE; else if ( sItemTag == sSecondItemTag && b2I != TRUE) b2I = TRUE; else if ( sItemTag == sThirdItemTag && b3I != TRUE) b3I = TRUE; else if ( sItemTag == sFourthItemTag && b4I != TRUE) b4I = TRUE; else if ( sItemTag == sFifthItemTag && b5I != TRUE) b5I = TRUE; else if ( sItemTag == sSixthItemTag && b6I != TRUE) b6I = TRUE; else if ( sItemTag == sSeventhItemTag && b7I != TRUE) b7I = TRUE; else if ( sItemTag == sEighthItemTag && b8I != TRUE) b8I = TRUE; else if ( sItemTag == sNinthItemTag && b9I != TRUE) b9I = TRUE; else if ( sItemTag == sTenthItemTag && b10I != TRUE) b10I = TRUE; n = ( b1I == TRUE || b2I == TRUE || b3I == TRUE || b4I == TRUE || b5I == TRUE || b6I == TRUE || b7I == TRUE || b8I == TRUE || b9I == TRUE || b10I == TRUE); if ( n) break; oItem = GetNextItemInInventory(); sItemTag = GetTag( oItem); } return n; } 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 |
|
|
Ivellios
Légende vivante
Inscrit le: 25 Jan 2005
Messages: 447
Localisation: Poitiers |
Posté le : 06/03/2006 22:07:13 Sujet du message :
La même mais sans limites de nombres, ce qui est dommage c'est que la surcharge n'existe pas comme en prog (même si on peut toujours faire mieu ^^).
Là à la place de mettre plein de tag séparément, tu les mets tous dans un string séparés par un ;.
Exemple : "Tag1;Tag2;Tag3;"
Compilé mais pas testé...
Code :/*============================================================================*\
||************************* PROTOTYPES DES FONCTIONS *************************||
\*============================================================================*/
// Renvoie TRUE si le joueur possède un des objets avec l'un des tags spécifiés.
// - oPC : Le PJ/PNJ possèdant les objets
// - sTag : La liste des Tag(s) des objets recherchés séparé par des ";".
int HasManyItems(object oPC, string sTag);
// Renvoie TRUE si le joueur possède tous les objets avec les tags spécifiés.
// - oPC : Le PJ/PNJ possèdant les objets
// - sTag : La liste des Tag(s) des objets recherchés séparé par des ";".
int HasSomeManyItems(object oPC, string sTag);
// Renvoie un élément de string défini par une position à partir de séparateurs.
// - sString : Le string de départ.
// - sChar : Le séparateur.
// - iNum : L'emplacement (position).
// Merci Anthraxcite
string GetString(string sString, string sChar, int iNum);
// Renvoie le nombre de caractères sChar contenu dans une chaîne de caractère.
// - sString : Le string de départ.
// - sChar : Le caractère.
int NmbChar(string sString, string sChar);
Code :/*============================================================================*\
||******************************** FONCTIONS *********************************||
\*============================================================================*/
//////////////////////////////////////////////////////////////////<HasManyItems><DEB>
int HasManyItems(object oPC, string sTag)
{
int i = 0;
int k = 0;
int j = NmbChar(sTag, ";");
string sItem = "";
while(i < j)
{
i++;
sItem = GetString(sTag, ";", i);
if(GetItemPossessedBy(oPC, sItem) != OBJECT_INVALID)
{
k++;
}
}
i = 0;
if(k == j)
i=1;
return i;
}
//////////////////////////////////////////////////////////////////<HasManyItems><FIN>
//////////////////////////////////////////////////////////////<HasSomeManyItems><DEB>
int HasSomeManyItems(object oPC, string sTag)
{
int i = 0;
int k = 0;
int j = NmbChar(sTag, ";");
string sItem = "";
while(i < j)
{
i++;
sItem = GetString(sTag, ";", i);
if(GetItemPossessedBy(oPC, sItem) != OBJECT_INVALID)
{
k++;
}
}
i = 0;
if(k > 0)
i=1;
return i;
}
//////////////////////////////////////////////////////////////<HasSomeManyItems><FIN>
/////////////////////////////////////////////////////////////////////<GetString><DEB>
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Merci Anthraxcite <<<<<<<<<<<<<<<<<<<<<<<<<<<<\\
string GetString(string sString, string sChar, int iNum)
{
int iNextPos = FindSubString(sString, sChar);
string sPart = GetSubString(sString, 0, iNextPos);
sString = GetStringRight(sString, GetStringLength(sString)-iNextPos-1);
int i = 0;
string s = "";
while(iNextPos!=-1 && i < iNum)
{
i++;
if(i == iNum)
{
s = sPart;
}
iNextPos = FindSubString(sString, sChar);
sPart = GetSubString(sString, 0, iNextPos);
sString = GetStringRight(sString, GetStringLength(sString)-iNextPos-1);
}
return s;
}
/////////////////////////////////////////////////////////////////////<GetString><FIN>
///////////////////////////////////////////////////////////////////////<NmbChar><DEB>
int NmbChar(string sString, string sChar)
{
int i = 0;
int iLength = GetStringLength(sString);
int iFind = FindSubString(sString, sChar);
while(iFind != -1)
{
i++;
sString = GetSubString(sString, iFind+1, iLength-iFind-1);
iFind = FindSubString(sString, sChar);
}
return i;
}
///////////////////////////////////////////////////////////////////////<NmbChar><FIN> _________________ Scripts, systèmes, fonctions,... c'est par ici...
Pyjama pour castor, une vocation, un avenir sûr
|
|
Revenir en haut |
|
|
L'Erudit
Seigneur
Inscrit le: 26 Oct 2005
Messages: 167
|
Posté le : 07/03/2006 11:04:17 Sujet du message :
Je me demandais s'il était effectivement possible de réaliser quelquechose de ce genre, et je vois que c'est assez réussi !
Par contre, les 2 premières fonctions que tu as repris ne sont pas tout à fait optimisées. Tu testes à chaque fois tout l'inventaire pour savoir si l'Item est présent, supposes qu'il y en ai plusieurs.
Mes scripts ne sont pas si longs pour rien !
|
|
Revenir en haut |
|
|
Ivellios
Légende vivante
Inscrit le: 25 Jan 2005
Messages: 447
Localisation: Poitiers |
Posté le : 07/03/2006 16:43:11 Sujet du message :
L'Erudit a écrit :Par contre, les 2 premières fonctions que tu as repris ne sont pas tout à fait optimisées. Tu testes à chaque fois tout l'inventaire pour savoir si l'Item est présent, supposes qu'il y en ai plusieurs. Gniaiiis ?
L'Erudit a écrit :Mes scripts ne sont pas si longs pour rien ! C'était juste pour virer la limite... _________________ Scripts, systèmes, fonctions,... c'est par ici...
Pyjama pour castor, une vocation, un avenir sûr
|
|
Revenir en haut |
|
|
L'Erudit
Seigneur
Inscrit le: 26 Oct 2005
Messages: 167
|
Posté le : 09/03/2006 10:40:06 Sujet du message :
J'explique.
La fonction "GetItemPossessedBy()", sélectionne le Tag de l'Item requis, et le compare alternativement à chacun des Tags, des Items de l'inventaire, un à un.
Une démarche inverse consisterait, à sélectionner un Item de l'inventaire et son Tag, pour comparer ce dernier aux Tags des Items requis, un à un.
Pour la fonction "HasSomeOfManyItems()", cette démarche est, je crois, plus adaptée, au delà d'1 Item requis, car elle ne requiert pas plusieurs tests d'inventaire, au contraire de "GetItemPossessedBy()".
Pour la fonction "HasManyItems()", la valeur de l'une par rapport à l'autre est déjà plus discutable.
|
|
Revenir en haut |
|
|
Ivellios
Légende vivante
Inscrit le: 25 Jan 2005
Messages: 447
Localisation: Poitiers |
Posté le : 09/03/2006 18:46:22 Sujet du message :
(On pourra supprimé après car le post n'est pas fait pour ça, je réponds juste).
Je pense que bioware a fait sa fonction plus proprement qu'en nwscript direct, je pense qu'ils ont trouvé un moyen plus performant (et externe) d'avoir un retour sur les objet disponible ou non.
Après je me trompe peut être mais à ce momment là la fonction ne serait pas plus utile que toutes celle faites main par les scripteurs de l'époque (avant la sortie de la fonction). _________________ Scripts, systèmes, fonctions,... c'est par ici...
Pyjama pour castor, une vocation, un avenir sûr
|
|
Revenir en haut |
|
|
|