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

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

[Script] Allez directement en Prison, ne passez pas par la case départ

Par Daynos le 12/10/2002 à 17:06:34 (#2323253)

posté intialement par Shelzard

Allez directement en Prison, ne passez pas par la case départ

Voici un petit script anti-tueur de NPC
Mieux que de rendre les NPC invincible, mieux que les summons de guardes, mieux que l'instakill du PC qui attaque le NPC.

La Prison !
le but de ce script, est de téléporter le PC attaquant dans une Zone (et de préférence une prison).

Mettez le script suivant dans OnDamaged :


#include "NW_I0_GENERIC"

void main()
{
if (!GetFleeToExit())
{
if (!GetSpawnInCondition (NW_FLAG_SET_WARNINGS))
{
if (!GetIsObjectValid (GetAttemptedAttackTarget ()) && !GetIsObjectValid (GetAttemptedSpellTarget ()))
{
if (GetBehaviorState (NW_FLAG_BEHAVIOR_SPECIAL))
{
DetermineSpecialBehavior (GetLastDamager ());
}
else if (GetIsObjectValid (GetLastDamager ()))
{
DetermineCombatRound ();
if (!GetIsFighting (OBJECT_SELF))
{
object oTarget = GetLastDamager();
if (!GetObjectSeen(oTarget) && GetArea (OBJECT_SELF) == GetArea(oTarget))
{
ActionMoveToLocation (GetLocation (oTarget), TRUE);
ActionDoCommand (DetermineCombatRound ());
}
}
}
}
else if (!GetIsObjectValid (GetAttemptedSpellTarget ()))
{
object oTarget = GetAttackTarget();
object oAttacker = GetLastHostileActor();
if (GetIsObjectValid(oAttacker) && oTarget != oAttacker && GetIsEnemy(oAttacker) &&
(GetTotalDamageDealt() > (GetMaxHitPoints(OBJECT_SELF) / 4) ||
(GetHitDice(oAttacker) - 2) > GetHitDice(oTarget) ) )
{
DetermineCombatRound (oAttacker);
}
}
}
}
if (GetSpawnInCondition (NW_FLAG_DAMAGED_EVENT))
{
SignalEvent (OBJECT_SELF, EventUserDefined (1006));
}
}

object oPC = GetLastAttacker();
if (GetIsPC(oPlayer))
{
SpeakString ("Allez hop, en taule !");
object oTarget = GetWaypointByTag ("wp_taule1");
int iRandom = Random(4);
if (iRandom==1)
{
object oTarget = GetWaypointByTag ("wp_taule1");
}
else if (iRandom==2)
{
object oTarget = GetWaypointByTag ("wp_taule2");
}
else if (iRandom==3)
{
object oTarget = GetWaypointByTag ("wp_taule3");
}
else
{
object oTarget = GetWaypointByTag ("wp_taule4");
}
DelayCommand(5.0, AssignCommand( oPC, JumpToObject( oTarget)));
}
}


C'est le script par défaut de OnDamaged avec la fin mon script de téléportation en prison.
Le random sert uniquement si vous utilisez plusieurs prison (mon but étant de ne jamais savoir où on attérit, ce qui rend difficile son évasion).
Ensuite, débrouillez-vous pour faire une belle prison bien gardée où seule les autres PC pourront aider le pauvre prisonnier.

Je bosse sur une autre version, où le prisonnier se retrouve dépouiller de tout son matos en arrivant en taule. Et en changeant le 'bind' de recall à sa prison.

Shelzard

Par eMRaistlin le 19/10/2002 à 23:33:07 (#2366198)

y'a une accolade en trop... attention...



#include "NW_I0_GENERIC"

void main()
{
if (!GetFleeToExit())
{
if (!GetSpawnInCondition (NW_FLAG_SET_WARNINGS))
{
if (!GetIsObjectValid (GetAttemptedAttackTarget ()) && (!GetIsObjectValid (GetAttemptedSpellTarget ())))
{
if (GetBehaviorState (NW_FLAG_BEHAVIOR_SPECIAL))
{
DetermineSpecialBehavior (GetLastDamager ());
}
else if (GetIsObjectValid (GetLastDamager ()))
{
DetermineCombatRound ();
if (!GetIsFighting (OBJECT_SELF))
{
object oTarget = GetLastDamager();
if (!GetObjectSeen(oTarget) && GetArea (OBJECT_SELF) == GetArea(oTarget))
{
ActionMoveToLocation (GetLocation (oTarget), TRUE);
ActionDoCommand (DetermineCombatRound ());
}
}
}
}
else if (!GetIsObjectValid (GetAttemptedSpellTarget ()))
{
object oTarget = GetAttackTarget();
object oAttacker = GetLastHostileActor();
if (GetIsObjectValid(oAttacker) && oTarget != oAttacker && GetIsEnemy(oAttacker) &&(GetTotalDamageDealt() > (GetMaxHitPoints(OBJECT_SELF) / 4) ||(GetHitDice(oAttacker) - 2) > GetHitDice(oTarget) ) )
{
DetermineCombatRound (oAttacker);
}
}
}
}
if (GetSpawnInCondition (NW_FLAG_DAMAGED_EVENT))
{
SignalEvent (OBJECT_SELF, EventUserDefined (1006));
}


object oPC=GetLastAttacker(OBJECT_SELF);
if (GetIsPC(oPC))
{
SpeakString ("Allez hop, en taule !");
object oTarget = GetWaypointByTag ("wp_taule1");
int iRandom = Random(4);
if (iRandom==1)
{
object oTarget = GetWaypointByTag ("wp_taule1");
}
else if (iRandom==2)
{
object oTarget = GetWaypointByTag ("wp_taule2");
}
else if (iRandom==3)
{
object oTarget = GetWaypointByTag ("wp_taule3");
}
else
{
object oTarget = GetWaypointByTag ("wp_taule4");
}
DelayCommand(5.0, AssignCommand( oPC, JumpToObject( oTarget)));
}
}

Par Zariel le 29/10/2002 à 0:14:19 (#2428604)

Quelq'un pourrait-il m'indiquer le fonctionnement de ce script ? J'ai fabriqué ma prison et je met le script dans le OnDamaged de mes PNJ mais rien ne se passe, ils meurent tous et il n'y a aucune téléportation.

Ou dois-je mettre les "WP_taule" en question, dans la prison ? Sur le PNJ attaqué ?

:aide: J'adore ce script mais il m'a donné du fil à retordre toute la soirée. :sanglote:

Par Zariel le 29/10/2002 à 13:00:23 (#2431153)

Je remonte le post :D

Emraistlin, tu pourrais me filer un coup de main pour faire tourner ce script s'il te plait ? :rolleyes:

Par eMRaistlin le 29/10/2002 à 13:12:31 (#2431247)

Ou dois-je mettre les "WP_taule" en question, dans la prison ? Sur le PNJ attaqué ?


tu cree des waypoints dans la prison...

Pour info : si tu a copier/colle le script directement :

Attention a la casse : il a écrit GetWaypointByTag ("wp_tauleX");

donc tes Waypoints doivent s'appeler wp_tauleX


De plus, si tu ne veux pas 5 waypoint de teleportation, il te suffit de reduire le int iRandom = Random(4); (-1 pour chaque waypoint que tu utilise pas.)


Enfin, il n'estpas prevu que cela empech de tuer des NPC... juste de punir les tueurs...

Par Nylou le 29/10/2002 à 13:41:46 (#2431524)

Apparement, vu le scripte, on ne touche pas les 20 000 Po. (trop dommage ça ;))

Personnellement je préfère le summon de guardes bien costaud qui arreteront l'agresseur et qui le téléporteront en prison si celui ci ne resiste pas bien sur.
Si l'agresseur du PNJ refuse d'aller en prison, tant pis pour lui. (mort + respawn en prison)

Si le NPC meurt, un grand pretre pourrait venir ressuciter le NPC (à gérer dans le ondeath du NPC).

Par Zariel le 29/10/2002 à 14:11:38 (#2431779)

Ok merci emraistlin à bien y réfléchir, ce n'est pas le script qui me convient excatement, je vais me pencher sur le summon de gardes ;)

Par LeProctophantasmiste le 29/10/2002 à 14:25:20 (#2431908)

Juste un petit truc, à mon avis il vaut mieux remplacer le GetLastAttacker par un GetLastDamager, ça n'est pas forcément la même personne.


#include "NW_I0_GENERIC"

void main()
{
if (!GetFleeToExit())
{
if (!GetSpawnInCondition (NW_FLAG_SET_WARNINGS))
{
if (!GetIsObjectValid (GetAttemptedAttackTarget ()) && (!GetIsObjectValid (GetAttemptedSpellTarget ())))
{
if (GetBehaviorState (NW_FLAG_BEHAVIOR_SPECIAL))
{
DetermineSpecialBehavior (GetLastDamager ());
}
else if (GetIsObjectValid (GetLastDamager ()))
{
DetermineCombatRound ();
if (!GetIsFighting (OBJECT_SELF))
{
object oTarget = GetLastDamager();
if (!GetObjectSeen(oTarget) && GetArea (OBJECT_SELF) == GetArea(oTarget))
{
ActionMoveToLocation (GetLocation (oTarget), TRUE);
ActionDoCommand (DetermineCombatRound ());
}
}
}
}
else if (!GetIsObjectValid (GetAttemptedSpellTarget ()))
{
object oTarget = GetAttackTarget();
object oAttacker = GetLastHostileActor();
if (GetIsObjectValid(oAttacker) && oTarget != oAttacker && GetIsEnemy(oAttacker) &&(GetTotalDamageDealt() > (GetMaxHitPoints(OBJECT_SELF) / 4) ||(GetHitDice(oAttacker) - 2) > GetHitDice(oTarget) ) )
{
DetermineCombatRound (oAttacker);
}
}
}
}
if (GetSpawnInCondition (NW_FLAG_DAMAGED_EVENT))
{
SignalEvent (OBJECT_SELF, EventUserDefined (1006));
}


object oPC=GetLastDamager();
if (GetIsPC(oPC))
{
SpeakString ("Allez hop, en taule !");
object oTarget = GetWaypointByTag ("wp_taule1");
int iRandom = Random(4);
if (iRandom==1)
{
object oTarget = GetWaypointByTag ("wp_taule1");
}
else if (iRandom==2)
{
object oTarget = GetWaypointByTag ("wp_taule2");
}
else if (iRandom==3)
{
object oTarget = GetWaypointByTag ("wp_taule3");
}
else
{
object oTarget = GetWaypointByTag ("wp_taule4");
}
DelayCommand(5.0, AssignCommand( oPC, JumpToObject( oTarget)));
}
}

Pour être tout à fait honnête je me demande même si cela fait quoi que ce soit autrement le lexicon précise que cette fonction ne marchera ( != OBJECT_INVALID) que dans le OnPhysicalAttacked.

Par Zariel le 29/10/2002 à 15:06:48 (#2432259)

Pour conclure: On intégre le script sur le OnPhysicalAttacked du NPC attaqué ? On oublie le OnDamaged ?

Par LeProctophantasmiste le 29/10/2002 à 15:37:39 (#2432496)

Non, au contraire, tu laisses le script sur le OnDamaged (sinon ne tient plus compte des sorts...), mais avec GetLastDamager à la place de GetLastAttacker (le script que j'ai posté est une version ainsi modifiée de celui posté par eMRaistlin).

Par Zariel le 29/10/2002 à 19:59:05 (#2434981)

Arf, ton script ne se compile pas :(

Je ne le ferais plus, promis

Par LeProctophantasmiste le 29/10/2002 à 20:38:14 (#2435299)

Je suis confus, GetLastDamager() ne prend pas de paramètre . Je viens d'éditer "mon" script.

Par Zariel le 30/10/2002 à 7:47:43 (#2437667)

Super, ca marche comme sur des roulettes, seul petit problème, le script réagit assez lentement selon certaines situations, je m'explique, si je frappe une fillette qui a 3 HP avec une épée longue, elle à pas le temps de réagir et crève sur le coup avant meme de dire "Allez hop en taule", c'est pour ca que j'essaie de trouver un moyen de linker les gardes si le script passe à la trappe ;)

Merci bcp.

Par Etienne le 30/10/2002 à 8:49:30 (#2437817)

Provient du message de Zariel
c'est pour ca que j'essaie de trouver un moyen de linker les gardes si le script passe à la trappe ;)


A mon avis il te suffira de trouver la position du personnage par la fonction setlocation et ensuite de créer des gardes sur cette même location (dison un garde par nivau du personnage, ça devrait le faire.

Mais je suis au boulot pour l'instant je ne pourrais pas essayer.

Par coolstar le 30/10/2002 à 12:35:23 (#2439459)

Tout à fait pertinent Nylou... ;)

Par Zariel le 26/12/2002 à 11:14:25 (#2880599)

Encore un petit soucis avec ce script que j'affectionne tout particulierement (effet Sarkosy vous croyez ? :D). Bon serieusement:

J'utilise les HCR pour les règles sur la mort, pour ceux qui ne connaissent pas, le personnage est téléporté dans une zone dés qu'il meurt et ça jusqu'a la résurrection (si il y a) et si mon joueur essaie de se reconnecter et bien il revient automatiquement dans cette zone (normal, il est mort).

J'aimerai la même chose pour la prison, il est logique qu'un personnage qui s'est mal conduit ne puissent pas ressortir comme un charme de la taule sans caution ou quelque chose. Je ne sais pas par quoi passer pour effectuer cette manoeuvre.

Quelqu'un pourrait m'aider dans cette heureuse période de Noël ou tout le monde s'entraide ? :rolleyes:

allez hop en prison !

Par Jaha Effect le 28/1/2003 à 19:24:07 (#3120626)

Je vous ai mis le mien parceque je le trouve joli à placer dans le OnDeath de votre pnj

void main()
{
SetIsDestroyable(FALSE);
object oPC=GetLastKiller();
location lLocation = GetLocation (OBJECT_SELF);
SpeakString ("A LA GARDE !!!");
CreateObject(OBJECT_TYPE_CREATURE, "mage", lLocation , FALSE);
AssignCommand(GetObjectByTag ("Mage"), ActionCastFakeSpellAtObject(SPELL_DOMINATE_PERSON, oPC));
AssignCommand(GetObjectByTag ("Mage"), ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_FNF_SUMMON_GATE), oPC, 2.0));
AssignCommand(GetObjectByTag ("Mage"), ActionSpeakString ("Vous irez moisire en prison pour ce meurtre"));
int iRandom = d4(1);
DelayCommand (7.0, AssignCommand( oPC, JumpToObject(GetWaypointByTag ("WP_taule"+IntToString(iRandom)))));
DelayCommand (15.0, DestroyObject(GetNearestObjectByTag("Mage")));
DelayCommand (15.0, DestroyObject(OBJECT_SELF));
}


Comme vous pouvez le remarquer ce scripte demande un magos avec pour Tag "Mage" et blueprint "mage" (mais vous pouvez adapter a vos tag et blueprint)
Et 4 waypoint avec les tag suivant
- WP_taule1
- WP_taule2
- WP_taule3
- WP_taule4

Jaha Effect :D

Mon truc a moi (+IntToString ("nananèère..));

Par PesteLaMenace le 29/1/2003 à 14:05:31 (#3125622)

Bien entendu chacun vois midi a sa porte en fonction de ses objectifs de module, pour ma part (si ca peut donner des idées a quelqu'un) j'opte pour un système de pts de crimes stokés sur le pj assassin (le meurtre ou autre action qui pourrait justifier l'incrémentation du compteur).

Cela simule le fait que quoi qu'on fasse il y aura toujours ou presque des gens pour aller se plaindre, une petite vieille a la fenètre, des gens pour entendre le raffut etc...

A partir d'un certain nombre de pts de crimes les autorités royales (gardes et assimilés) remarqueront le pj et lui demanderont de les suivre a la caserne. Si il vient tant mieux ce sera jugement rp sinon c'est la rixe et finissage en case prison (si il reste un garde debout). Il y a quelques (aura ils ne sont pas encore fait ceux la) chasseurs de tetes qui arpenteront le module a la recherche des gros persos a pts de crimes qui seront donc connu.

La difficultée de ce système est de trouver l'équilibre au niveau des pts de crimes. Par exemple tuer un garde si il y a un autre garde pas loin c'est evidemment prendre suffisemment de pts de crimes pour etre recherché par tous les gardes et les chasseurs de tetes.
Tuer un Noble meme tarif, tuer un cerf ou un vaux-rien dans le bas quartier n'inquietera personne, surtout pas l'autorité royale.....etc..etc...

Je n'ai pas encore testé ce système vu que le module que je prépare est....en préparation mais ce système devrait coller avec des objectifs rp.

Quand aux gardes d'un niveau hallucinant ou des pnjs contre lesquels il est impossible de faire quoi que ce soit je n'aime pas du tout, mais bien sur ca reste mon opinion en accord avec la facon dont je vois les choses, aucunement la bonne ou mauvaise facon de jouer.

Peste.

chitt question?

Par Eltannus le 2/2/2003 à 14:48:04 (#3154511)

salut

quand le PJ est téléporter un prison, il faut l'empêcher d'utiliser sa pierre de rappel dans son inventaire.

Coment avez vous résolu ce pb?

Amicalement

Eltannus...in jail

Par Jaha Effect le 2/2/2003 à 22:05:12 (#3157288)

J'ai mis un trigger dans la prison avec ce scripte dans le OnEnter

void main()
{
object oPC = GetEnteringObject ();
object oPierreadetruire = GetItemPossessedBy (oPC, "NW_IT_RECALL");
if (oPierreadetruire != OBJECT_INVALID)
{
DestroyObject (oPierreadetruire);
}
}


Jaha Effect :D

JOL Archives 1.0.1
@ JOL / JeuxOnLine